blob: 3b301842bc190562f3aad732f0923ed1f67852f8 [file] [log] [blame]
Alex Gaynorc72e63f2013-09-09 21:44:26 -07001Contributing
2============
3
4Process
5-------
6
7As an open source project, ``cryptography`` welcomes contributions of all
8forms. These can include:
9
10* Bug reports and feature requests
11* Pull requests for both code and documentation
12* Patch reviews
13
Alex Gaynor2c67c822013-09-09 23:44:13 -070014You can file bugs and submit pull requests on `GitHub`_. To discuss larger
Alex Gaynorc72e63f2013-09-09 21:44:26 -070015changes you can start a conversation on `our mailing list`_.
16
17Because cryptography is so complex, and the implications of getting it wrong so
18devastating, ``cryptography`` has a strict code review policy:
19
20* Patches must *never* be pushed directly to ``master``, all changes (even the
21 most trivial typo fixes!) must be submitted as a pull request.
22* A committer may *never* merge their own pull request, a second party must
Alex Gaynore6466a52013-10-18 14:53:04 -070023 merge their changes. If multiple people work on a pull request, it must be
24 merged by someone who did not work on it.
Alex Gaynorc72e63f2013-09-09 21:44:26 -070025* A patch which breaks tests, or introduces regressions by changing or removing
26 existing tests should not be merged. Tests must always be passing on
27 ``master``.
28* If somehow the tests get into a failing state on ``master`` (such as by a
29 backwards incompatible release of a dependency) no pull requests may be
30 merged until this is rectified.
31
32The purpose of these policies is to minimize the chances we merge a change
33which jeopardizes our users' security.
34
Alex Gaynor99b69d92013-10-19 17:52:58 -070035If you believe you've identified a security issue in ``cryptography``, please
36follow the directions on the :doc:`security page </security>`.
Alex Gaynorc72e63f2013-09-09 21:44:26 -070037
38Code
39----
40
41When in doubt, refer to `PEP 8`_ for Python code.
42
43Every code file must start with the boilerplate notice of the Apache License.
44Additionally, every Python code file must contain
45
46.. code-block:: python
47
48 from __future__ import absolute_import, division, print_function
49
Alex Gaynore6466a52013-10-18 14:53:04 -070050C bindings
51----------
52
53When binding C code with ``cffi`` we have our own style guide, it's pretty
54simple.
55
56Don't name parameters:
57
58.. code-block:: c
59
60 // Good
61 long f(long);
62 // Bad
63 long f(long x);
64
Paul Kehrer3ed80ba2013-10-19 20:00:26 -050065...unless they're inside a struct:
66
67.. code-block:: c
68
69 struct my_struct {
70 char *name;
71 int number;
72 ...;
73 };
74
Alex Gaynore6466a52013-10-18 14:53:04 -070075Don't include stray ``void`` parameters:
76
77.. code-block:: c
78
79 // Good
80 long f();
81 // Bad
82 long f(void);
83
84Wrap lines at 80 characters like so:
85
86.. code-block:: c
87
88 // Pretend this went to 80 characters
89 long f(long, long,
90 int *)
91
Alex Gaynor1e8744a2013-10-18 14:57:18 -070092Include a space after commas between parameters:
93
94.. code-block:: c
95
96 // Good
97 long f(int, char *)
98 // Bad
99 long f(int,char *)
100
Alex Gaynore6466a52013-10-18 14:53:04 -0700101
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700102Documentation
103-------------
104
105All features should be documented with prose.
106
107Docstrings should be written like this:
108
109.. code-block:: python
110
111 def some_function(some_arg):
112 """
113 Does some things.
114
115 :param some_arg: Some argument.
116 """
117
118So, specifically:
119
Alex Gaynor05a190e2013-10-29 17:11:25 -0700120* Always use three double quotes.
121* Put the three double quotes on their own line.
122* No blank line at the end.
123* Use Sphinx parameter/attribute documentation `syntax`_.
124
125When documenting a new module in the ``hazmat`` package, its documentation
126should begin with the "Hazardous Materials" warning:
127
128.. code-block:: rest
129
130 .. hazmat::
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700131
Richard Wall40cde822013-10-01 20:20:15 +0100132Development Environment
133-----------------------
Richard Wall0d9bb142013-10-01 16:17:24 +0100134
135Working on ``cryptography`` requires the installation of a small number of
Alex Gaynor166cbd32013-10-01 13:30:29 -0700136development dependencies. These are listed in ``dev-requirements.txt`` and they
137can be installed in a `virtualenv`_ using `pip`_. Once you've installed the
138dependencies, install ``cryptography`` in ``editable`` mode. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100139
Alex Gaynorae5c9072013-10-06 11:04:08 -0700140.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100141
Alex Gaynor7587ded2013-10-06 12:14:05 -0700142 $ # Create a virtualenv and activate it
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100143 $ pip install --requirement dev-requirements.txt
144 $ pip install --editable .
Richard Wall0d9bb142013-10-01 16:17:24 +0100145
146You are now ready to run the tests and build the documentation.
Richard Wall0d9bb142013-10-01 16:17:24 +0100147
Richard Wall40cde822013-10-01 20:20:15 +0100148Running Tests
149-------------
Richard Wall0d9bb142013-10-01 16:17:24 +0100150
Alex Gaynor166cbd32013-10-01 13:30:29 -0700151``cryptography`` unit tests are found in the ``tests/`` directory and are
152designed to be run using `pytest`_. `pytest`_ will discover the tests
153automatically, so all you have to do is:
Richard Wall0d9bb142013-10-01 16:17:24 +0100154
Alex Gaynorae5c9072013-10-06 11:04:08 -0700155.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100156
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100157 $ py.test
Richard Wall0d9bb142013-10-01 16:17:24 +0100158 ...
159 4294 passed in 15.24 seconds
160
161This runs the tests with the default Python interpreter.
162
163You can also verify that the tests pass on other supported Python interpreters.
Richard Wallc3d1eb52013-10-01 16:29:07 +0100164For this we use `tox`_, which will automatically create a `virtualenv`_ for
Richard Wall40cde822013-10-01 20:20:15 +0100165each supported Python version and run the tests. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100166
Alex Gaynorae5c9072013-10-06 11:04:08 -0700167.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100168
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100169 $ tox
Richard Wall0d9bb142013-10-01 16:17:24 +0100170 ...
Richard Wall40cde822013-10-01 20:20:15 +0100171 ERROR: py26: InterpreterNotFound: python2.6
172 py27: commands succeeded
173 ERROR: pypy: InterpreterNotFound: pypy
174 ERROR: py32: InterpreterNotFound: python3.2
175 py33: commands succeeded
176 docs: commands succeeded
177 pep8: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100178
Alex Gaynor166cbd32013-10-01 13:30:29 -0700179You may not have all the required Python versions installed, in which case you
180will see one or more ``InterpreterNotFound`` errors.
Richard Wall0d9bb142013-10-01 16:17:24 +0100181
182Building Documentation
183----------------------
184
Alex Gaynor166cbd32013-10-01 13:30:29 -0700185``cryptography`` documentation is stored in the ``docs/`` directory. It is
186written in `reStructured Text`_ and rendered using `Sphinx`_.
Richard Wall0d9bb142013-10-01 16:17:24 +0100187
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100188Use `tox`_ to build the documentation. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100189
Alex Gaynorae5c9072013-10-06 11:04:08 -0700190.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100191
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100192 $ tox -e docs
Richard Wall0d9bb142013-10-01 16:17:24 +0100193 ...
Richard Wallc3d1eb52013-10-01 16:29:07 +0100194 docs: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100195 congratulations :)
196
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100197The HTML documentation index can now be found at ``docs/_build/html/index.html``
Richard Wall40cde822013-10-01 20:20:15 +0100198
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700199
Donald Stufft85707942013-10-04 23:55:27 -0400200.. _`GitHub`: https://github.com/pyca/cryptography
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700201.. _`our mailing list`: https://mail.python.org/mailman/listinfo/cryptography-dev
202.. _`PEP 8`: http://www.peps.io/8/
203.. _`syntax`: http://sphinx-doc.org/domains.html#info-field-lists
Richard Wallc3d1eb52013-10-01 16:29:07 +0100204.. _`pytest`: https://pypi.python.org/pypi/pytest
205.. _`tox`: https://pypi.python.org/pypi/tox
206.. _`virtualenv`: https://pypi.python.org/pypi/virtualenv
207.. _`pip`: https://pypi.python.org/pypi/pip
208.. _`sphinx`: https://pypi.python.org/pypi/sphinx
Alex Gaynora05358d2013-11-06 11:01:22 -0800209.. _`reStructured Text`: http://sphinx-doc.org/rest.html