| 1 | =================================== | 
|---|
| 2 | Notes for contributing to testtools | 
|---|
| 3 | =================================== | 
|---|
| 4 |  | 
|---|
| 5 | Coding style | 
|---|
| 6 | ------------ | 
|---|
| 7 |  | 
|---|
| 8 | In general, follow PEP 8 <http://www.python.org/dev/peps/pep-0008/>. | 
|---|
| 9 |  | 
|---|
| 10 | For consistency with the standard library's ``unittest`` module, method names | 
|---|
| 11 | are generally ``camelCase``. | 
|---|
| 12 |  | 
|---|
| 13 | testtools supports Python 2.4 and later, so avoid any 2.5-only features like | 
|---|
| 14 | the ``with`` statement. | 
|---|
| 15 |  | 
|---|
| 16 |  | 
|---|
| 17 | Copyright assignment | 
|---|
| 18 | -------------------- | 
|---|
| 19 |  | 
|---|
| 20 | Part of testtools raison d'etre is to provide Python with improvements to the | 
|---|
| 21 | testing code it ships. For that reason we require all contributions (that are | 
|---|
| 22 | non-trivial) to meet one of the following rules: | 
|---|
| 23 |  | 
|---|
| 24 | - be inapplicable for inclusion in Python. | 
|---|
| 25 | - be able to be included in Python without further contact with the | 
|---|
| 26 | contributor. | 
|---|
| 27 | - be copyright assigned to Jonathan M. Lange. | 
|---|
| 28 |  | 
|---|
| 29 | Please pick one of these and specify it when contributing code to testtools. | 
|---|
| 30 |  | 
|---|
| 31 |  | 
|---|
| 32 | Licensing | 
|---|
| 33 | --------- | 
|---|
| 34 |  | 
|---|
| 35 | All code that is not copyright assigned to Jonathan M. Lange (see Copyright | 
|---|
| 36 | Assignment above) needs to be licensed under the MIT license that testtools | 
|---|
| 37 | uses, so that testtools can ship it. | 
|---|
| 38 |  | 
|---|
| 39 |  | 
|---|
| 40 | Testing | 
|---|
| 41 | ------- | 
|---|
| 42 |  | 
|---|
| 43 | Please write tests for every feature.  This project ought to be a model | 
|---|
| 44 | example of well-tested Python code! | 
|---|
| 45 |  | 
|---|
| 46 | Take particular care to make sure the *intent* of each test is clear. | 
|---|
| 47 |  | 
|---|
| 48 | You can run tests with ``make check``, or by running ``./run-tests`` directly. | 
|---|
| 49 |  | 
|---|
| 50 |  | 
|---|
| 51 | Source layout | 
|---|
| 52 | ------------- | 
|---|
| 53 |  | 
|---|
| 54 | The top-level directory contains the ``testtools/`` package directory, and | 
|---|
| 55 | miscellaneous files like README and setup.py. | 
|---|
| 56 |  | 
|---|
| 57 | The ``testtools/`` directory is the Python package itself.  It is separated | 
|---|
| 58 | into submodules for internal clarity, but all public APIs should be âpromotedâ | 
|---|
| 59 | into the top-level package by importing them in ``testtools/__init__.py``. | 
|---|
| 60 | Users of testtools should never import a submodule, they are just | 
|---|
| 61 | implementation details. | 
|---|
| 62 |  | 
|---|
| 63 | Tests belong in ``testtools/tests/``. | 
|---|
| 64 |  | 
|---|
| 65 |  | 
|---|
| 66 | Commiting to trunk | 
|---|
| 67 | ------------------ | 
|---|
| 68 |  | 
|---|
| 69 | Testtools is maintained using bzr, with its trunk at lp:testtools. This gives | 
|---|
| 70 | every contributor the ability to commit their work to their own branches. | 
|---|
| 71 | However permission must be granted to allow contributors to commit to the trunk | 
|---|
| 72 | branch. | 
|---|
| 73 |  | 
|---|
| 74 | Commit access to trunk is obtained by joining the testtools-devs Launchpad | 
|---|
| 75 | team. Membership in this team is contingent on obeying the testtools | 
|---|
| 76 | contribution policy, including assigning copyright of all the work one creates | 
|---|
| 77 | and places in trunk to Jonathan Lange. | 
|---|
| 78 |  | 
|---|
| 79 |  | 
|---|
| 80 | Code Review | 
|---|
| 81 | ----------- | 
|---|
| 82 |  | 
|---|
| 83 | All code must be reviewed before landing on trunk. The process is to create a | 
|---|
| 84 | branch in launchpad, and submit it for merging to lp:testtools. It will then | 
|---|
| 85 | be reviewed before it can be merged to trunk. It will be reviewed by someone: | 
|---|
| 86 |  | 
|---|
| 87 | * not the author | 
|---|
| 88 | * a committer (member of the testtools-devs team) | 
|---|
| 89 |  | 
|---|
| 90 | As a special exception, while the testtools committers team is small and prone | 
|---|
| 91 | to blocking, a merge request from a committer that has not been reviewed after | 
|---|
| 92 | 24 hours may be merged by that committer. When the team is larger this policy | 
|---|
| 93 | will be revisited. | 
|---|
| 94 |  | 
|---|
| 95 | Code reviewers should look for the quality of what is being submitted, | 
|---|
| 96 | including conformance with this HACKING file. | 
|---|
| 97 |  | 
|---|
| 98 | Changes which all users should be made aware of should be documented in NEWS. | 
|---|
| 99 |  | 
|---|
| 100 |  | 
|---|
| 101 | NEWS management | 
|---|
| 102 | --------------- | 
|---|
| 103 |  | 
|---|
| 104 | The file NEWS is structured as a sorted list of releases. Each release can have | 
|---|
| 105 | a free form description and more or more sections with bullet point items. | 
|---|
| 106 | Sections in use today are 'Improvements' and 'Changes'. To ease merging between | 
|---|
| 107 | branches, the bullet points are kept alphabetically sorted. The release NEXT is | 
|---|
| 108 | permanently present at the top of the list. | 
|---|
| 109 |  | 
|---|
| 110 |  | 
|---|
| 111 | Release tasks | 
|---|
| 112 | ------------- | 
|---|
| 113 |  | 
|---|
| 114 | 1. Choose a version number, say X.Y.Z | 
|---|
| 115 | 1. Branch from trunk to testtools-X.Y.Z | 
|---|
| 116 | 1. In testtools-X.Y.Z, ensure __init__ has version X.Y.Z. | 
|---|
| 117 | 1. Replace NEXT in NEWS with the version number X.Y.Z, adjusting the reST. | 
|---|
| 118 | 1. Possibly write a blurb into NEWS. | 
|---|
| 119 | 1. Replace any additional references to NEXT with the version being | 
|---|
| 120 | released. (should be none). | 
|---|
| 121 | 1. Commit the changes. | 
|---|
| 122 | 1. Tag the release, bzr tag testtools-X.Y.Z | 
|---|
| 123 | 1. Create a source distribution and upload to pypi ('make release'). | 
|---|
| 124 | 1. Make sure all "Fix committed" bugs are in the 'next' milestone on | 
|---|
| 125 | Launchpad | 
|---|
| 126 | 1. Rename the 'next' milestone on Launchpad to 'X.Y.Z' | 
|---|
| 127 | 1. Create a release on the newly-renamed 'X.Y.Z' milestone | 
|---|
| 128 | 1. Upload the tarball and asc file to Launchpad | 
|---|
| 129 | 1. Merge the release branch testtools-X.Y.Z into trunk. Before the commit, | 
|---|
| 130 | add a NEXT heading to the top of NEWS and bump the version in __init__.py. | 
|---|
| 131 | Push trunk to Launchpad | 
|---|
| 132 | 1. If a new series has been created (e.g. 0.10.0), make the series on Launchpad. | 
|---|
| 133 | 1. Make a new milestone for the *next release*. | 
|---|
| 134 | 1. During release we rename NEXT to $version. | 
|---|
| 135 | 1. We call new milestones NEXT. | 
|---|