blob: 4647818a28b4c410eff5fc261fc5facc0a0f64ff [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
Alex Gaynora6596882013-11-13 12:54:03 -0800125Because of the inherent challenges in implementing correct cryptographic
Alex Gaynore9d64d72013-11-13 10:28:01 -0800126systems, we want to make our documentation point people in the right directions
127as much as possible. To that end:
128
129* When documenting a generic interface, use a strong algorithm in examples.
130 (e.g. when showing a hashing example, don't use
131 :class:`cryptography.hazmat.primitives.hashes.MD5`)
Alex Gaynor5cbab0c2013-11-13 11:55:57 -0800132* When giving prescriptive advice, always provide references and supporting
Alex Gaynore9d64d72013-11-13 10:28:01 -0800133 material.
Alex Gaynord118c912013-11-13 11:56:49 -0800134* When there is real disagreement between cryptographic experts, represent both
Alex Gaynor54e04002013-11-15 16:44:41 -0800135 sides of the argument and describe the trade-offs clearly.
Alex Gaynore9d64d72013-11-13 10:28:01 -0800136
Alex Gaynor05a190e2013-10-29 17:11:25 -0700137When documenting a new module in the ``hazmat`` package, its documentation
138should begin with the "Hazardous Materials" warning:
139
140.. code-block:: rest
141
142 .. hazmat::
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700143
Alex Gaynor953ebf82013-12-08 10:28:30 -0800144When referring to a hypothetical individual (such as "a person receiving an
145encrypted message") use gender neutral pronouns (they/them/their).
146
Richard Wall40cde822013-10-01 20:20:15 +0100147Development Environment
148-----------------------
Richard Wall0d9bb142013-10-01 16:17:24 +0100149
150Working on ``cryptography`` requires the installation of a small number of
Alex Gaynor166cbd32013-10-01 13:30:29 -0700151development dependencies. These are listed in ``dev-requirements.txt`` and they
152can be installed in a `virtualenv`_ using `pip`_. Once you've installed the
153dependencies, install ``cryptography`` in ``editable`` mode. For example:
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
Alex Gaynor7587ded2013-10-06 12:14:05 -0700157 $ # Create a virtualenv and activate it
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100158 $ pip install --requirement dev-requirements.txt
159 $ pip install --editable .
Richard Wall0d9bb142013-10-01 16:17:24 +0100160
161You are now ready to run the tests and build the documentation.
Richard Wall0d9bb142013-10-01 16:17:24 +0100162
Richard Wall40cde822013-10-01 20:20:15 +0100163Running Tests
164-------------
Richard Wall0d9bb142013-10-01 16:17:24 +0100165
Alex Gaynor166cbd32013-10-01 13:30:29 -0700166``cryptography`` unit tests are found in the ``tests/`` directory and are
167designed to be run using `pytest`_. `pytest`_ will discover the tests
168automatically, so all you have to do is:
Richard Wall0d9bb142013-10-01 16:17:24 +0100169
Alex Gaynorae5c9072013-10-06 11:04:08 -0700170.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100171
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100172 $ py.test
Richard Wall0d9bb142013-10-01 16:17:24 +0100173 ...
174 4294 passed in 15.24 seconds
175
176This runs the tests with the default Python interpreter.
177
178You can also verify that the tests pass on other supported Python interpreters.
Richard Wallc3d1eb52013-10-01 16:29:07 +0100179For this we use `tox`_, which will automatically create a `virtualenv`_ for
Richard Wall40cde822013-10-01 20:20:15 +0100180each supported Python version and run the tests. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100181
Alex Gaynorae5c9072013-10-06 11:04:08 -0700182.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100183
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100184 $ tox
Richard Wall0d9bb142013-10-01 16:17:24 +0100185 ...
Richard Wall40cde822013-10-01 20:20:15 +0100186 ERROR: py26: InterpreterNotFound: python2.6
187 py27: commands succeeded
188 ERROR: pypy: InterpreterNotFound: pypy
189 ERROR: py32: InterpreterNotFound: python3.2
190 py33: commands succeeded
191 docs: commands succeeded
192 pep8: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100193
Alex Gaynor166cbd32013-10-01 13:30:29 -0700194You may not have all the required Python versions installed, in which case you
195will see one or more ``InterpreterNotFound`` errors.
Richard Wall0d9bb142013-10-01 16:17:24 +0100196
197Building Documentation
198----------------------
199
Alex Gaynor166cbd32013-10-01 13:30:29 -0700200``cryptography`` documentation is stored in the ``docs/`` directory. It is
201written in `reStructured Text`_ and rendered using `Sphinx`_.
Richard Wall0d9bb142013-10-01 16:17:24 +0100202
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100203Use `tox`_ to build the documentation. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100204
Alex Gaynorae5c9072013-10-06 11:04:08 -0700205.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100206
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100207 $ tox -e docs
Richard Wall0d9bb142013-10-01 16:17:24 +0100208 ...
Richard Wallc3d1eb52013-10-01 16:29:07 +0100209 docs: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100210 congratulations :)
211
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100212The HTML documentation index can now be found at ``docs/_build/html/index.html``
Richard Wall40cde822013-10-01 20:20:15 +0100213
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700214
Donald Stufft85707942013-10-04 23:55:27 -0400215.. _`GitHub`: https://github.com/pyca/cryptography
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700216.. _`our mailing list`: https://mail.python.org/mailman/listinfo/cryptography-dev
217.. _`PEP 8`: http://www.peps.io/8/
218.. _`syntax`: http://sphinx-doc.org/domains.html#info-field-lists
Richard Wallc3d1eb52013-10-01 16:29:07 +0100219.. _`pytest`: https://pypi.python.org/pypi/pytest
220.. _`tox`: https://pypi.python.org/pypi/tox
221.. _`virtualenv`: https://pypi.python.org/pypi/virtualenv
222.. _`pip`: https://pypi.python.org/pypi/pip
223.. _`sphinx`: https://pypi.python.org/pypi/sphinx
Alex Gaynora05358d2013-11-06 11:01:22 -0800224.. _`reStructured Text`: http://sphinx-doc.org/rest.html