blob: b1702df8cdcfdc4dfffffa12b773237ae4617616 [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.
Alex Gaynorf3f00182013-12-13 19:22:33 -080031* All merged patches must have 100% test coverage.
Alex Gaynorc72e63f2013-09-09 21:44:26 -070032
33The purpose of these policies is to minimize the chances we merge a change
34which jeopardizes our users' security.
35
Alex Gaynor99b69d92013-10-19 17:52:58 -070036If you believe you've identified a security issue in ``cryptography``, please
37follow the directions on the :doc:`security page </security>`.
Alex Gaynorc72e63f2013-09-09 21:44:26 -070038
39Code
40----
41
42When in doubt, refer to `PEP 8`_ for Python code.
43
44Every code file must start with the boilerplate notice of the Apache License.
45Additionally, every Python code file must contain
46
47.. code-block:: python
48
49 from __future__ import absolute_import, division, print_function
50
Alex Gaynore21b0b22013-12-12 12:39:05 -080051API Considerations
52~~~~~~~~~~~~~~~~~~
53
54Most projects' APIs are designed with a philosophy of "make easy things easy,
55and make hard things possible". One of the perils of writing cryptographic code
Alex Gaynor95243f52013-12-21 19:37:24 -080056is that secure code looks just like insecure code, and its results are almost
Alex Gaynor15cf6b92013-12-21 19:22:39 -080057always indistinguishable. As a result ``cryptography`` has, as a design
58philosophy: "make it hard to do insecure things". Here are a few strategies for
59API design which should be both followed, and should inspire other API choices:
Alex Gaynore21b0b22013-12-12 12:39:05 -080060
61If it is incorrect to ignore the result of a method, it should raise an
62exception, and not return a boolean ``True``/``False`` flag. For example, a
63method to verify a signature should raise ``InvalidSignature``, and not return
64whether the signature was valid.
65
66.. code-block:: python
67
68 # This is bad.
69 def verify(sig):
70 # ...
71 return is_valid
72
73 # Good!
74 def verify(sig):
75 # ...
76 if not is_valid:
77 raise InvalidSignature
78
79APIs at the :doc:`/hazmat/primitives/index` layer should always take an
80explicit backend, APIs at the recipes layer should automatically use the
Alex Gaynorf8796b12013-12-13 20:28:55 -080081:func:`~cryptography.hazmat.backends.default_backend`, but optionally allow
Alex Gaynor2a5b4a82013-12-12 17:53:08 -080082specifying a different backend.
Alex Gaynore21b0b22013-12-12 12:39:05 -080083
Alex Gaynore6466a52013-10-18 14:53:04 -070084C bindings
Alex Gaynor5246e2d2013-12-12 12:23:18 -080085~~~~~~~~~~
Alex Gaynore6466a52013-10-18 14:53:04 -070086
87When binding C code with ``cffi`` we have our own style guide, it's pretty
88simple.
89
90Don't name parameters:
91
92.. code-block:: c
93
94 // Good
95 long f(long);
96 // Bad
97 long f(long x);
98
Paul Kehrer3ed80ba2013-10-19 20:00:26 -050099...unless they're inside a struct:
100
101.. code-block:: c
102
103 struct my_struct {
104 char *name;
105 int number;
106 ...;
107 };
108
Alex Gaynore6466a52013-10-18 14:53:04 -0700109Don't include stray ``void`` parameters:
110
111.. code-block:: c
112
113 // Good
114 long f();
115 // Bad
116 long f(void);
117
118Wrap lines at 80 characters like so:
119
120.. code-block:: c
121
122 // Pretend this went to 80 characters
123 long f(long, long,
124 int *)
125
Alex Gaynor1e8744a2013-10-18 14:57:18 -0700126Include a space after commas between parameters:
127
128.. code-block:: c
129
130 // Good
131 long f(int, char *)
132 // Bad
133 long f(int,char *)
134
Alex Gaynore6466a52013-10-18 14:53:04 -0700135
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700136Documentation
137-------------
138
139All features should be documented with prose.
140
141Docstrings should be written like this:
142
143.. code-block:: python
144
145 def some_function(some_arg):
146 """
147 Does some things.
148
149 :param some_arg: Some argument.
150 """
151
152So, specifically:
153
Alex Gaynor05a190e2013-10-29 17:11:25 -0700154* Always use three double quotes.
155* Put the three double quotes on their own line.
156* No blank line at the end.
157* Use Sphinx parameter/attribute documentation `syntax`_.
158
Alex Gaynora6596882013-11-13 12:54:03 -0800159Because of the inherent challenges in implementing correct cryptographic
Alex Gaynore9d64d72013-11-13 10:28:01 -0800160systems, we want to make our documentation point people in the right directions
161as much as possible. To that end:
162
163* When documenting a generic interface, use a strong algorithm in examples.
164 (e.g. when showing a hashing example, don't use
Alex Gaynor15cf6b92013-12-21 19:22:39 -0800165 :class:`~cryptography.hazmat.primitives.hashes.MD5`)
Alex Gaynor5cbab0c2013-11-13 11:55:57 -0800166* When giving prescriptive advice, always provide references and supporting
Alex Gaynore9d64d72013-11-13 10:28:01 -0800167 material.
Alex Gaynord118c912013-11-13 11:56:49 -0800168* When there is real disagreement between cryptographic experts, represent both
Alex Gaynor54e04002013-11-15 16:44:41 -0800169 sides of the argument and describe the trade-offs clearly.
Alex Gaynore9d64d72013-11-13 10:28:01 -0800170
Alex Gaynor05a190e2013-10-29 17:11:25 -0700171When documenting a new module in the ``hazmat`` package, its documentation
172should begin with the "Hazardous Materials" warning:
173
174.. code-block:: rest
175
176 .. hazmat::
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700177
Alex Gaynor953ebf82013-12-08 10:28:30 -0800178When referring to a hypothetical individual (such as "a person receiving an
179encrypted message") use gender neutral pronouns (they/them/their).
180
Richard Wall40cde822013-10-01 20:20:15 +0100181Development Environment
182-----------------------
Richard Wall0d9bb142013-10-01 16:17:24 +0100183
184Working on ``cryptography`` requires the installation of a small number of
Alex Gaynor166cbd32013-10-01 13:30:29 -0700185development dependencies. These are listed in ``dev-requirements.txt`` and they
186can be installed in a `virtualenv`_ using `pip`_. Once you've installed the
187dependencies, install ``cryptography`` in ``editable`` mode. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100188
Alex Gaynorae5c9072013-10-06 11:04:08 -0700189.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100190
Alex Gaynor7587ded2013-10-06 12:14:05 -0700191 $ # Create a virtualenv and activate it
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100192 $ pip install --requirement dev-requirements.txt
193 $ pip install --editable .
Richard Wall0d9bb142013-10-01 16:17:24 +0100194
195You are now ready to run the tests and build the documentation.
Richard Wall0d9bb142013-10-01 16:17:24 +0100196
Richard Wall40cde822013-10-01 20:20:15 +0100197Running Tests
Alex Gaynor5246e2d2013-12-12 12:23:18 -0800198~~~~~~~~~~~~~
Richard Wall0d9bb142013-10-01 16:17:24 +0100199
Alex Gaynor166cbd32013-10-01 13:30:29 -0700200``cryptography`` unit tests are found in the ``tests/`` directory and are
201designed to be run using `pytest`_. `pytest`_ will discover the tests
202automatically, so all you have to do is:
Richard Wall0d9bb142013-10-01 16:17:24 +0100203
Alex Gaynorae5c9072013-10-06 11:04:08 -0700204.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100205
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100206 $ py.test
Richard Wall0d9bb142013-10-01 16:17:24 +0100207 ...
Alex Gaynor15cf6b92013-12-21 19:22:39 -0800208 62746 passed in 220.43 seconds
Richard Wall0d9bb142013-10-01 16:17:24 +0100209
210This runs the tests with the default Python interpreter.
211
212You can also verify that the tests pass on other supported Python interpreters.
Richard Wallc3d1eb52013-10-01 16:29:07 +0100213For this we use `tox`_, which will automatically create a `virtualenv`_ for
Richard Wall40cde822013-10-01 20:20:15 +0100214each supported Python version and run the tests. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100215
Alex Gaynorae5c9072013-10-06 11:04:08 -0700216.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100217
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100218 $ tox
Richard Wall0d9bb142013-10-01 16:17:24 +0100219 ...
Richard Wall40cde822013-10-01 20:20:15 +0100220 ERROR: py26: InterpreterNotFound: python2.6
221 py27: commands succeeded
222 ERROR: pypy: InterpreterNotFound: pypy
223 ERROR: py32: InterpreterNotFound: python3.2
224 py33: commands succeeded
225 docs: commands succeeded
226 pep8: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100227
Alex Gaynor166cbd32013-10-01 13:30:29 -0700228You may not have all the required Python versions installed, in which case you
229will see one or more ``InterpreterNotFound`` errors.
Richard Wall0d9bb142013-10-01 16:17:24 +0100230
231Building Documentation
Alex Gaynor5246e2d2013-12-12 12:23:18 -0800232~~~~~~~~~~~~~~~~~~~~~~
Richard Wall0d9bb142013-10-01 16:17:24 +0100233
Alex Gaynor166cbd32013-10-01 13:30:29 -0700234``cryptography`` documentation is stored in the ``docs/`` directory. It is
235written in `reStructured Text`_ and rendered using `Sphinx`_.
Richard Wall0d9bb142013-10-01 16:17:24 +0100236
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100237Use `tox`_ to build the documentation. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100238
Alex Gaynorae5c9072013-10-06 11:04:08 -0700239.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100240
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100241 $ tox -e docs
Richard Wall0d9bb142013-10-01 16:17:24 +0100242 ...
Richard Wallc3d1eb52013-10-01 16:29:07 +0100243 docs: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100244 congratulations :)
245
Alex Gaynor15cf6b92013-12-21 19:22:39 -0800246The HTML documentation index can now be found at
247``docs/_build/html/index.html``.
Richard Wall40cde822013-10-01 20:20:15 +0100248
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700249
Donald Stufft85707942013-10-04 23:55:27 -0400250.. _`GitHub`: https://github.com/pyca/cryptography
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700251.. _`our mailing list`: https://mail.python.org/mailman/listinfo/cryptography-dev
252.. _`PEP 8`: http://www.peps.io/8/
253.. _`syntax`: http://sphinx-doc.org/domains.html#info-field-lists
Richard Wallc3d1eb52013-10-01 16:29:07 +0100254.. _`pytest`: https://pypi.python.org/pypi/pytest
255.. _`tox`: https://pypi.python.org/pypi/tox
256.. _`virtualenv`: https://pypi.python.org/pypi/virtualenv
257.. _`pip`: https://pypi.python.org/pypi/pip
258.. _`sphinx`: https://pypi.python.org/pypi/sphinx
Alex Gaynora05358d2013-11-06 11:01:22 -0800259.. _`reStructured Text`: http://sphinx-doc.org/rest.html