blob: 100f13f51fa9196d1106e89073b3d95d6127cb67 [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 Gaynore21b0b22013-12-12 12:39:05 -080050API Considerations
51~~~~~~~~~~~~~~~~~~
52
53Most projects' APIs are designed with a philosophy of "make easy things easy,
54and make hard things possible". One of the perils of writing cryptographic code
55is that code that is secure looks just like code that isn't, and produces
56results that are also difficult to distinguish. As a result ``cryptography``
57has, as a design philosophy: "make it hard to do insecure things". Here are a
58few strategies for API design which should be both followed, and should inspire
59other API choices:
60
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
81:func:`~cryptography.hazmat.bindings.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
165 :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 ...
208 4294 passed in 15.24 seconds
209
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
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100246The HTML documentation index can now be found at ``docs/_build/html/index.html``
Richard Wall40cde822013-10-01 20:20:15 +0100247
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700248
Donald Stufft85707942013-10-04 23:55:27 -0400249.. _`GitHub`: https://github.com/pyca/cryptography
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700250.. _`our mailing list`: https://mail.python.org/mailman/listinfo/cryptography-dev
251.. _`PEP 8`: http://www.peps.io/8/
252.. _`syntax`: http://sphinx-doc.org/domains.html#info-field-lists
Richard Wallc3d1eb52013-10-01 16:29:07 +0100253.. _`pytest`: https://pypi.python.org/pypi/pytest
254.. _`tox`: https://pypi.python.org/pypi/tox
255.. _`virtualenv`: https://pypi.python.org/pypi/virtualenv
256.. _`pip`: https://pypi.python.org/pypi/pip
257.. _`sphinx`: https://pypi.python.org/pypi/sphinx
Alex Gaynora05358d2013-11-06 11:01:22 -0800258.. _`reStructured Text`: http://sphinx-doc.org/rest.html