1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
.. _contributing:
===========================
Contributing to coverage.py
===========================
:history: 20121112T154100, brand new docs.
.. highlight:: console
I welcome contributions to coverage.py. Over the years, dozens of people have
provided patches of various sizes to add features or fix bugs. This page
should have all the information you need to make a contribution.
One source of history or ideas are the `bug reports`_ against coverage.py.
There you can find ideas for requested features, or the remains of rejected
ideas.
.. _bug reports: https://bitbucket.org/ned/coveragepy/issues?status=new&status=open
Before you begin
----------------
If you have an idea for coverage.py, run it by me before you begin writing
code. This way, I can get you going in the right direction, or point you to
previous work in the area. Things are not always as straightforward as they
seem, and having the benefit of lessons learned by those before you can save
you frustration.
Getting the code
----------------
The coverage.py code is hosted on a `Mercurial`_ repository at
https://bitbucket.org/ned/coveragepy. To get a working environment, follow
these steps:
#. (Optional, but recommended) Create a virtualenv to work in, and activate
it.
#. Clone the repo::
$ hg clone https://bitbucket.org/ned/coveragepy
#. Install the requirements::
$ pip install -r requirements.txt
#. Install a number of versions of Python. Coverage.py supports a wide range
of Python versions. The more you can test with, the more easily your code
can be used as-is. If you only have one version, that's OK too, but may
mean more work integrating your contribution.
Running the tests
-----------------
The tests are written as standard unittest-style tests, and are run with
`tox`_::
$ tox
GLOB sdist-make: /home/ned/coverage/setup.py
py25 sdist-reinst: /home/ned/coverage/tox/dist/coverage-3.6b1.zip
py25 runtests: commands[0]
py25 runtests: commands[1]
py25 runtests: commands[2]
py25 runtests: commands[3]
py25 runtests: commands[4]
=== Python 2.5.5 with Python tracer (/home/ned/coverage/tox/py25/bin/python) ===
...........................................................................................(etc)
----------------------------------------------------------------------
Ran 360 tests in 10.836s
OK
py25 runtests: commands[5]
py25 runtests: commands[6]
=== Python 2.5.5 with C tracer (/home/ned/coverage/tox/py25/bin/python) ===
...........................................................................................(etc)
----------------------------------------------------------------------
Ran 360 tests in 10.044s
OK
py26 sdist-reinst: /home/ned/coverage/trunk/.tox/dist/coverage-3.6b1.zip
py26 runtests: commands[0]
py26 runtests: commands[1]
py26 runtests: commands[2]
py26 runtests: commands[3]
py26 runtests: commands[4]
=== CPython 2.6.6 with Python tracer (/home/ned/coverage/tox/py26/bin/python) ===
...........................................................................................(etc)
----------------------------------------------------------------------
Ran 364 tests in 12.572s
OK
py26 runtests: commands[5]
py26 runtests: commands[6]
=== CPython 2.6.6 with C tracer (/home/ned/coverage/tox/py26/bin/python) ===
...........................................................................................(etc)
----------------------------------------------------------------------
Ran 364 tests in 11.458s
OK
(and so on...)
Tox runs the complete test suite twice for each version of Python you have
installed. The first run uses the Python implementation of the trace function,
the second uses the C implementation.
To limit tox to just a few versions of Python, use the ``-e`` switch::
$ tox -e py27,py33
To run just a few tests, you can use nose test selector syntax::
$ tox tests.test_misc:SetupPyTest.test_metadata
This looks in `tests/test_misc.py` to find the `SetupPyTest` class, and runs
the `test_metadata` test method.
Of course, run all the tests on every version of Python you have, before
submitting a change.
Lint, etc
---------
I try to keep the coverage.py as clean as possible. I use pylint to alert me
to possible problems::
$ make lint
pylint --rcfile=.pylintrc coverage setup.py tests
python -m tabnanny coverage setup.py tests
python igor.py check_eol
The source is pylint-clean, even if it's because there are pragmas quieting
some warnings. Please try to keep it that way, but don't let pylint warnings
keep you from sending patches. I can clean them up.
Coverage testing coverage.py
----------------------------
Coverage.py can measure itself, but it's complicated. The process has been
packaged up to make it easier::
$ COVERAGE_COVERAGE=yes tox
$ python igor.py combine_html
Then look at htmlcov/index.html. Note that due to the recursive nature of
coverage.py measuring itself, there are some parts of the code that will never
appear as covered, even though they are executed.
Contributing
------------
When you are ready to contribute a change, any way you can get it to me is
probably fine. A pull request on Bitbucket is great, but a simple diff or
patch is great too.
.. _Mercurial: http://mercurial.selenic.com/
.. _tox: http://tox.testrun.org/
|