-
Notifications
You must be signed in to change notification settings - Fork 1
/
CONTRIBUTING
286 lines (208 loc) · 9.6 KB
/
CONTRIBUTING
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
.. _devguide:
=================
Developer's Guide
=================
Welcome to the fixie developer's guide! This is a place for developers to
place information that does not belong in the user's guide or the library
reference but is useful or necessary for the next people that come along to
develop fixie.
.. note:: All code changes must go through the pull request review procedure.
Changelog
=========
Pull requests will often have CHANGELOG entries associated with. However,
to avoid excessive merge conflicts, please follow the following procedure:
1. Go into the ``news/`` directory,
2. Copy the ``TEMPLATE.rst`` file to another file in the ``news/`` directory.
We suggest using the branchname::
$ cp TEMPLATE.rst branch.rst
3. Add your entries as a bullet pointed lists in your ``branch.rst`` file in
the appropriate category. It is OK to leave the ``None`` entries for later
use.
4. Commit your ``branch.rst``.
Feel free to update this file whenever you want! Please don't use someone
else's file name. All of the files in this ``news/`` directory will be merged
automatically at release time. The ``None`` entries will be automatically
filtered out too!
Style Guide
===========
fixie is a pure Python project, and so we use PEP8 (with some additions) to
ensure consistency throughout the code base.
----------------------------------
Rules to Write By
----------------------------------
It is important to refer to things and concepts by their most specific name.
When writing fixie code or documentation please use technical terms
appropriately. The following rules help provide needed clarity.
**********
Interfaces
**********
* User-facing APIs should be as generic and robust as possible.
* Tests belong in the top-level ``tests`` directory.
* Documentation belongs in the top-level ``docs`` directory.
************
Expectations
************
* Code must have associated tests and adequate documentation.
* User-interaction code (such as the Shell class) is hard to test.
Mechanism to test such constructs should be developed over time.
* Have *extreme* empathy for your users.
* Be selfish. Since you will be writing tests you will be your first user.
-------------------
Python Style Guide
-------------------
fixie uses `PEP8`_ for all Python code. The following rules apply where `PEP8`_
is open to interpretation.
* Use absolute imports (``import fixie.tools``) rather than explicit
relative imports (``import .tools``). Implicit relative imports
(``import tools``) are never allowed.
* Use ``'single quotes'`` for string literals, and
``"""triple double quotes"""`` for docstrings. Double quotes are allowed to
prevent single quote escaping, e.g. ``"Y'all c'mon o'er here!"``
* We use sphinx with the numpydoc extension to autogenerate API documentation. Follow
the `numpydoc`_ standard for docstrings.
* Simple functions should have simple docstrings.
* Lines should be at most 80 characters long. The 72 and 79 character
recommendations from PEP8 are not required here.
* All Python code should be compliant with Python 3.4+. At some
unforeseen date in the future, Python 2.7 support *may* be supported.
* Tests should be written with pytest using a procedural style. Do not use
unittest directly or write tests in an object-oriented style.
* Test generators make more dots and the dots must flow!
You can easily check for style issues, including some outright bugs such
as mispelled variable names, using pylint. If you're using Anaconda you'll
need to run "conda install pylint" once. You can easily run pylint on
the edited files in your uncommited git change::
$ pylint $(git status -s | awk '/\.py$$/ { print $$2 }' | sort)
If you want to lint the entire code base run::
$ pylint $(find tests fixie -name \*.py | sort)
How to Test
================
----------------------------------
Dependencies
----------------------------------
Prep your environment for running the tests::
$ pip install -r requirements-tests.txt
----------------------------------
Running the Tests - Basic
----------------------------------
Run all the tests using pytest::
$ py.test -q
Use "-q" to keep pytest from outputting a bunch of info for every test.
----------------------------------
Running the Tests - Advanced
----------------------------------
To perform all unit tests::
$ py.test
If you want to run specific tests you can specify the test names to
execute. For example to run test_aliases::
$ py.test test_aliases.py
Note that you can pass multiple test names in the above examples::
$ py.test test_aliases.py test_environ.py
----------------------------------
Writing the Tests - Advanced
----------------------------------
(refer to pytest documentation)
With the Pytest framework you can use bare `assert` statements on
anything you're trying to test, note that the name of the test function
has to be prefixed with `test_`::
def test_whatever():
assert is_true_or_false
The conftest.py in tests directory defines fixtures for mocking various
parts of fixie for more test isolation. For a list of the various fixtures::
$ py.test --fixtures
when writing tests it's best to use pytest features i.e parametrization::
@pytest.mark.parametrize('env', [test_env1, test_env2])
def test_one(env, fixie_builtins):
fixie_builtins.__fixie_env__ = env
...
this will run the test two times each time with the respective `test_env`.
This can be done with a for loop too but the test will run
only once for the different test cases and you get less isolation.
With that in mind, each test should have the least `assert` statements,
preferably one.
At the moment, fixie doesn't support any pytest plugins.
Happy Testing!
How to Document
====================
Documentation takes many forms. This will guide you through the steps of
successful documentation.
----------
Docstrings
----------
No matter what language you are writing in, you should always have
documentation strings along with you code. This is so important that it is
part of the style guide. When writing in Python, your docstrings should be
in reStructured Text using the `numpydoc`_ format.
------------------------
Auto-Documentation Hooks
------------------------
The docstrings that you have written will automatically be connected to the
website, once the appropriate hooks have been setup. At this stage, all
documentation lives within fixie's top-level ``docs`` directory.
We uses the sphinx tool to manage and generate the documentation, which
you can learn about from `the sphinx website <http://sphinx-doc.org/>`_.
If you want to generate the documentation, first fixie itself must be installed
and then you may run the following command from the ``docs`` dir:
.. code-block:: console
~/fixie/docs $ make html
For each new
module, you will have to supply the appropriate hooks. This should be done the
first time that the module appears in a pull request. From here, call the
new module ``mymod``. The following explains how to add hooks.
------------------------
Python Hooks
------------------------
Python documentation lives in the ``docs/api`` directory.
First, create a file in this directory that represents the new module called
``mymod.rst``.
The ``docs/api`` directory matches the structure of the ``fixie/`` directory.
So if your module is in a sub-package, you'll need to go into the sub-package's
directory before creating ``mymod.rst``.
The contents of this file should be as follows:
**mymod.rst:**
.. code-block:: rst
.. _fixie_mymod:
=======================================
My Awesome Module -- :mod:`fixie.mymod`
=======================================
.. currentmodule:: fixie.mymod
.. automodule:: fixie.mymod
:members:
This will discover all of the docstrings in ``mymod`` and create the
appropriate webpage. Now, you need to hook this page up to the rest of the
website.
Go into the ``index.rst`` file in ``docs/fixie`` or other subdirectory and add
``mymod`` to the appropriate ``toctree`` (which stands for table-of-contents
tree). Note that every sub-package has its own ``index.rst`` file.
Building the Website
===========================
Building the website/documentation requires the following dependencies:
#. `Sphinx <http://sphinx-doc.org/>`_
#. `Cloud Sphinx Theme <https://pythonhosted.org/cloud_sptheme/cloud_theme.html>`_
-----------------------------------
Procedure for modifying the website
-----------------------------------
The fixie website source files are located in the ``docs`` directory.
A developer first makes necessary changes, then rebuilds the website locally
by executing the command::
$ make html
This will generate html files for the website in the ``_build/html/`` folder.
The developer may view the local changes by opening these files with their
favorite browser, e.g.::
$ google-chrome _build/html/index.html
Once the developer is satisfied with the changes, the changes should be
committed and pull-requested per usual. Once the pull request is accepted, the
developer can push their local changes directly to the website by::
$ make push-root
Branches and Releases
=============================
Mainline fixie development occurs on the ``master`` branch. Other branches
may be used for feature development (topical branches) or to represent
past and upcoming releases.
Document History
===================
Portions of this page have been forked from the PyNE and Xonsh documentation,
Copyright 2015-2016, the xonsh developers. All rights reserved.
Copyright 2011-2015, the PyNE Development Team. All rights reserved.
.. _PEP8: https://www.python.org/dev/peps/pep-0008/
.. _numpydoc: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt