blob: 6a76c70583920d0944ef4abccdaa43e9efdc00b4 [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
120- 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
Richard Wall40cde822013-10-01 20:20:15 +0100125Development Environment
126-----------------------
Richard Wall0d9bb142013-10-01 16:17:24 +0100127
128Working on ``cryptography`` requires the installation of a small number of
Alex Gaynor166cbd32013-10-01 13:30:29 -0700129development dependencies. These are listed in ``dev-requirements.txt`` and they
130can be installed in a `virtualenv`_ using `pip`_. Once you've installed the
131dependencies, install ``cryptography`` in ``editable`` mode. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100132
Alex Gaynorae5c9072013-10-06 11:04:08 -0700133.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100134
Alex Gaynor7587ded2013-10-06 12:14:05 -0700135 $ # Create a virtualenv and activate it
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100136 $ pip install --requirement dev-requirements.txt
137 $ pip install --editable .
Richard Wall0d9bb142013-10-01 16:17:24 +0100138
139You are now ready to run the tests and build the documentation.
Richard Wall0d9bb142013-10-01 16:17:24 +0100140
Richard Wall40cde822013-10-01 20:20:15 +0100141Running Tests
142-------------
Richard Wall0d9bb142013-10-01 16:17:24 +0100143
Alex Gaynor166cbd32013-10-01 13:30:29 -0700144``cryptography`` unit tests are found in the ``tests/`` directory and are
145designed to be run using `pytest`_. `pytest`_ will discover the tests
146automatically, so all you have to do is:
Richard Wall0d9bb142013-10-01 16:17:24 +0100147
Alex Gaynorae5c9072013-10-06 11:04:08 -0700148.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100149
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100150 $ py.test
Richard Wall0d9bb142013-10-01 16:17:24 +0100151 ...
152 4294 passed in 15.24 seconds
153
154This runs the tests with the default Python interpreter.
155
156You can also verify that the tests pass on other supported Python interpreters.
Richard Wallc3d1eb52013-10-01 16:29:07 +0100157For this we use `tox`_, which will automatically create a `virtualenv`_ for
Richard Wall40cde822013-10-01 20:20:15 +0100158each supported Python version and run the tests. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100159
Alex Gaynorae5c9072013-10-06 11:04:08 -0700160.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100161
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100162 $ tox
Richard Wall0d9bb142013-10-01 16:17:24 +0100163 ...
Richard Wall40cde822013-10-01 20:20:15 +0100164 ERROR: py26: InterpreterNotFound: python2.6
165 py27: commands succeeded
166 ERROR: pypy: InterpreterNotFound: pypy
167 ERROR: py32: InterpreterNotFound: python3.2
168 py33: commands succeeded
169 docs: commands succeeded
170 pep8: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100171
Alex Gaynor166cbd32013-10-01 13:30:29 -0700172You may not have all the required Python versions installed, in which case you
173will see one or more ``InterpreterNotFound`` errors.
Richard Wall0d9bb142013-10-01 16:17:24 +0100174
175Building Documentation
176----------------------
177
Alex Gaynor166cbd32013-10-01 13:30:29 -0700178``cryptography`` documentation is stored in the ``docs/`` directory. It is
179written in `reStructured Text`_ and rendered using `Sphinx`_.
Richard Wall0d9bb142013-10-01 16:17:24 +0100180
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100181Use `tox`_ to build the documentation. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100182
Alex Gaynorae5c9072013-10-06 11:04:08 -0700183.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100184
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100185 $ tox -e docs
Richard Wall0d9bb142013-10-01 16:17:24 +0100186 ...
Richard Wallc3d1eb52013-10-01 16:29:07 +0100187 docs: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100188 congratulations :)
189
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100190The HTML documentation index can now be found at ``docs/_build/html/index.html``
Richard Wall40cde822013-10-01 20:20:15 +0100191
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700192
Donald Stufft85707942013-10-04 23:55:27 -0400193.. _`GitHub`: https://github.com/pyca/cryptography
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700194.. _`our mailing list`: https://mail.python.org/mailman/listinfo/cryptography-dev
195.. _`PEP 8`: http://www.peps.io/8/
196.. _`syntax`: http://sphinx-doc.org/domains.html#info-field-lists
Richard Wallc3d1eb52013-10-01 16:29:07 +0100197.. _`pytest`: https://pypi.python.org/pypi/pytest
198.. _`tox`: https://pypi.python.org/pypi/tox
199.. _`virtualenv`: https://pypi.python.org/pypi/virtualenv
200.. _`pip`: https://pypi.python.org/pypi/pip
201.. _`sphinx`: https://pypi.python.org/pypi/sphinx
Alex Gaynor166cbd32013-10-01 13:30:29 -0700202.. _`reStructured Text`: http://docutils.sourceforge.net/rst.html