-
Notifications
You must be signed in to change notification settings - Fork 1
/
devguide.html
444 lines (418 loc) · 24.5 KB
/
devguide.html
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
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Developer’s Guide — fixie documentation</title>
<link rel="stylesheet" href="_static/numpy_friendly.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Noticia+Text|Open+Sans|Droid+Sans+Mono" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/jquery.cookie.js"></script>
<script type="text/javascript" src="_static/cloud.base.js"></script>
<script type="text/javascript" src="_static/cloud.js"></script>
<link rel="shortcut icon" href="_static/fixie-logo.ico"/>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="prev" title="Data Request Handlers (fixie_data.handlers)" href="api/fixie_data-handlers.html" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="canonical" href="http://xon.sh/devguide.html"/>
</head>
<body>
<div class="relbar-top">
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> </li>
<li class="right" >
<a href="api/fixie_data-handlers.html" title="Data Request Handlers (fixie_data.handlers)"
accesskey="P">previous</a> </li>
<li><a href="index.html">fixie documentation</a> »</li>
</ul>
</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="developer-s-guide">
<span id="devguide"></span><h1>Developer’s Guide<a class="headerlink" href="#developer-s-guide" title="Permalink to this headline">¶</a></h1>
<p>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.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">All code changes must go through the pull request review procedure.</p>
</div>
<div class="section" id="changelog">
<h2>Changelog<a class="headerlink" href="#changelog" title="Permalink to this headline">¶</a></h2>
<p>Pull requests will often have CHANGELOG entries associated with. However,
to avoid excessive merge conflicts, please follow the following procedure:</p>
<ol class="arabic">
<li><p class="first">Go into the <code class="docutils literal"><span class="pre">news/</span></code> directory,</p>
</li>
<li><p class="first">Copy the <code class="docutils literal"><span class="pre">TEMPLATE.rst</span></code> file to another file in the <code class="docutils literal"><span class="pre">news/</span></code> directory.
We suggest using the branchname:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ cp TEMPLATE.rst branch.rst
</pre></div>
</div>
</li>
<li><p class="first">Add your entries as a bullet pointed lists in your <code class="docutils literal"><span class="pre">branch.rst</span></code> file in
the appropriate category. It is OK to leave the <code class="docutils literal"><span class="pre">None</span></code> entries for later
use.</p>
</li>
<li><p class="first">Commit your <code class="docutils literal"><span class="pre">branch.rst</span></code>.</p>
</li>
</ol>
<p>Feel free to update this file whenever you want! Please don’t use someone
else’s file name. All of the files in this <code class="docutils literal"><span class="pre">news/</span></code> directory will be merged
automatically at release time. The <code class="docutils literal"><span class="pre">None</span></code> entries will be automatically
filtered out too!</p>
</div>
<div class="section" id="style-guide">
<h2>Style Guide<a class="headerlink" href="#style-guide" title="Permalink to this headline">¶</a></h2>
<p>fixie is a pure Python project, and so we use PEP8 (with some additions) to
ensure consistency throughout the code base.</p>
<div class="section" id="rules-to-write-by">
<h3>Rules to Write By<a class="headerlink" href="#rules-to-write-by" title="Permalink to this headline">¶</a></h3>
<p>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.</p>
<div class="section" id="interfaces">
<h4>Interfaces<a class="headerlink" href="#interfaces" title="Permalink to this headline">¶</a></h4>
<ul class="simple">
<li>User-facing APIs should be as generic and robust as possible.</li>
<li>Tests belong in the top-level <code class="docutils literal"><span class="pre">tests</span></code> directory.</li>
<li>Documentation belongs in the top-level <code class="docutils literal"><span class="pre">docs</span></code> directory.</li>
</ul>
</div>
<div class="section" id="expectations">
<h4>Expectations<a class="headerlink" href="#expectations" title="Permalink to this headline">¶</a></h4>
<ul class="simple">
<li>Code must have associated tests and adequate documentation.</li>
<li>User-interaction code (such as the Shell class) is hard to test.
Mechanism to test such constructs should be developed over time.</li>
<li>Have <em>extreme</em> empathy for your users.</li>
<li>Be selfish. Since you will be writing tests you will be your first user.</li>
</ul>
</div>
</div>
<div class="section" id="python-style-guide">
<h3>Python Style Guide<a class="headerlink" href="#python-style-guide" title="Permalink to this headline">¶</a></h3>
<p>fixie uses <a class="reference external" href="https://www.python.org/dev/peps/pep-0008/">PEP8</a> for all Python code. The following rules apply where <a class="reference external" href="https://www.python.org/dev/peps/pep-0008/">PEP8</a>
is open to interpretation.</p>
<ul class="simple">
<li>Use absolute imports (<code class="docutils literal"><span class="pre">import</span> <span class="pre">fixie.tools</span></code>) rather than explicit
relative imports (<code class="docutils literal"><span class="pre">import</span> <span class="pre">.tools</span></code>). Implicit relative imports
(<code class="docutils literal"><span class="pre">import</span> <span class="pre">tools</span></code>) are never allowed.</li>
<li>Use <code class="docutils literal"><span class="pre">'single</span> <span class="pre">quotes'</span></code> for string literals, and
<code class="docutils literal"><span class="pre">"""triple</span> <span class="pre">double</span> <span class="pre">quotes"""</span></code> for docstrings. Double quotes are allowed to
prevent single quote escaping, e.g. <code class="docutils literal"><span class="pre">"Y'all</span> <span class="pre">c'mon</span> <span class="pre">o'er</span> <span class="pre">here!"</span></code></li>
<li>We use sphinx with the numpydoc extension to autogenerate API documentation. Follow
the <a class="reference external" href="https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt">numpydoc</a> standard for docstrings.</li>
<li>Simple functions should have simple docstrings.</li>
<li>Lines should be at most 80 characters long. The 72 and 79 character
recommendations from PEP8 are not required here.</li>
<li>All Python code should be compliant with Python 3.4+. At some
unforeseen date in the future, Python 2.7 support <em>may</em> be supported.</li>
<li>Tests should be written with pytest using a procedural style. Do not use
unittest directly or write tests in an object-oriented style.</li>
<li>Test generators make more dots and the dots must flow!</li>
</ul>
<p>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:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ pylint $(git status -s | awk '/\.py$$/ { print $$2 }' | sort)
</pre></div>
</div>
<p>If you want to lint the entire code base run:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ pylint $(find tests fixie -name \*.py | sort)
</pre></div>
</div>
</div>
</div>
<div class="section" id="how-to-test">
<h2>How to Test<a class="headerlink" href="#how-to-test" title="Permalink to this headline">¶</a></h2>
<div class="section" id="dependencies">
<h3>Dependencies<a class="headerlink" href="#dependencies" title="Permalink to this headline">¶</a></h3>
<p>Prep your environment for running the tests:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ pip install -r requirements-tests.txt
</pre></div>
</div>
</div>
<div class="section" id="running-the-tests-basic">
<h3>Running the Tests - Basic<a class="headerlink" href="#running-the-tests-basic" title="Permalink to this headline">¶</a></h3>
<p>Run all the tests using pytest:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ py.test -q
</pre></div>
</div>
<p>Use “-q” to keep pytest from outputting a bunch of info for every test.</p>
</div>
<div class="section" id="running-the-tests-advanced">
<h3>Running the Tests - Advanced<a class="headerlink" href="#running-the-tests-advanced" title="Permalink to this headline">¶</a></h3>
<p>To perform all unit tests:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ py.test
</pre></div>
</div>
<p>If you want to run specific tests you can specify the test names to
execute. For example to run test_aliases:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ py.test test_aliases.py
</pre></div>
</div>
<p>Note that you can pass multiple test names in the above examples:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ py.test test_aliases.py test_environ.py
</pre></div>
</div>
</div>
<div class="section" id="writing-the-tests-advanced">
<h3>Writing the Tests - Advanced<a class="headerlink" href="#writing-the-tests-advanced" title="Permalink to this headline">¶</a></h3>
<p>(refer to pytest documentation)</p>
<p>With the Pytest framework you can use bare <cite>assert</cite> statements on
anything you’re trying to test, note that the name of the test function
has to be prefixed with <cite>test_</cite>:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">test_whatever</span><span class="p">():</span>
<span class="k">assert</span> <span class="n">is_true_or_false</span>
</pre></div>
</div>
<p>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:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ py.test --fixtures
</pre></div>
</div>
<p>when writing tests it’s best to use pytest features i.e parametrization:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="nd">@pytest</span><span class="o">.</span><span class="n">mark</span><span class="o">.</span><span class="n">parametrize</span><span class="p">(</span><span class="s1">'env'</span><span class="p">,</span> <span class="p">[</span><span class="n">test_env1</span><span class="p">,</span> <span class="n">test_env2</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">test_one</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">fixie_builtins</span><span class="p">):</span>
<span class="n">fixie_builtins</span><span class="o">.</span><span class="n">__fixie_env__</span> <span class="o">=</span> <span class="n">env</span>
<span class="o">...</span>
</pre></div>
</div>
<p>this will run the test two times each time with the respective <cite>test_env</cite>.
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.</p>
<p>With that in mind, each test should have the least <cite>assert</cite> statements,
preferably one.</p>
<p>At the moment, fixie doesn’t support any pytest plugins.</p>
<p>Happy Testing!</p>
</div>
</div>
<div class="section" id="how-to-document">
<h2>How to Document<a class="headerlink" href="#how-to-document" title="Permalink to this headline">¶</a></h2>
<p>Documentation takes many forms. This will guide you through the steps of
successful documentation.</p>
<div class="section" id="docstrings">
<h3>Docstrings<a class="headerlink" href="#docstrings" title="Permalink to this headline">¶</a></h3>
<p>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 <a class="reference external" href="https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt">numpydoc</a> format.</p>
</div>
<div class="section" id="auto-documentation-hooks">
<h3>Auto-Documentation Hooks<a class="headerlink" href="#auto-documentation-hooks" title="Permalink to this headline">¶</a></h3>
<p>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 <code class="docutils literal"><span class="pre">docs</span></code> directory.
We uses the sphinx tool to manage and generate the documentation, which
you can learn about from <a class="reference external" href="http://sphinx-doc.org/">the sphinx website</a>.
If you want to generate the documentation, first fixie itself must be installed
and then you may run the following command from the <code class="docutils literal"><span class="pre">docs</span></code> dir:</p>
<div class="highlight-console"><div class="highlight"><pre><span></span><span class="go">~/fixie/docs $ make html</span>
</pre></div>
</div>
<p>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 <code class="docutils literal"><span class="pre">mymod</span></code>. The following explains how to add hooks.</p>
</div>
<div class="section" id="python-hooks">
<h3>Python Hooks<a class="headerlink" href="#python-hooks" title="Permalink to this headline">¶</a></h3>
<p>Python documentation lives in the <code class="docutils literal"><span class="pre">docs/api</span></code> directory.
First, create a file in this directory that represents the new module called
<code class="docutils literal"><span class="pre">mymod.rst</span></code>.
The <code class="docutils literal"><span class="pre">docs/api</span></code> directory matches the structure of the <code class="docutils literal"><span class="pre">fixie/</span></code> directory.
So if your module is in a sub-package, you’ll need to go into the sub-package’s
directory before creating <code class="docutils literal"><span class="pre">mymod.rst</span></code>.
The contents of this file should be as follows:</p>
<p><strong>mymod.rst:</strong></p>
<div class="highlight-rst"><div class="highlight"><pre><span></span><span class="p">..</span> <span class="nt">_fixie_mymod:</span>
<span class="gh">=======================================</span>
<span class="gh">My Awesome Module -- :mod:`fixie.mymod`</span>
<span class="gh">=======================================</span>
<span class="p">..</span> <span class="ow">currentmodule</span><span class="p">::</span> fixie.mymod
<span class="p">..</span> <span class="ow">automodule</span><span class="p">::</span> fixie.mymod
<span class="nc">:members:</span>
</pre></div>
</div>
<p>This will discover all of the docstrings in <code class="docutils literal"><span class="pre">mymod</span></code> and create the
appropriate webpage. Now, you need to hook this page up to the rest of the
website.</p>
<p>Go into the <code class="docutils literal"><span class="pre">index.rst</span></code> file in <code class="docutils literal"><span class="pre">docs/fixie</span></code> or other subdirectory and add
<code class="docutils literal"><span class="pre">mymod</span></code> to the appropriate <code class="docutils literal"><span class="pre">toctree</span></code> (which stands for table-of-contents
tree). Note that every sub-package has its own <code class="docutils literal"><span class="pre">index.rst</span></code> file.</p>
</div>
</div>
<div class="section" id="building-the-website">
<h2>Building the Website<a class="headerlink" href="#building-the-website" title="Permalink to this headline">¶</a></h2>
<p>Building the website/documentation requires the following dependencies:</p>
<ol class="arabic simple">
<li><a class="reference external" href="http://sphinx-doc.org/">Sphinx</a></li>
<li><a class="reference external" href="https://pythonhosted.org/cloud_sptheme/cloud_theme.html">Cloud Sphinx Theme</a></li>
</ol>
<div class="section" id="procedure-for-modifying-the-website">
<h3>Procedure for modifying the website<a class="headerlink" href="#procedure-for-modifying-the-website" title="Permalink to this headline">¶</a></h3>
<p>The fixie website source files are located in the <code class="docutils literal"><span class="pre">docs</span></code> directory.
A developer first makes necessary changes, then rebuilds the website locally
by executing the command:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ make html
</pre></div>
</div>
<p>This will generate html files for the website in the <code class="docutils literal"><span class="pre">_build/html/</span></code> folder.
The developer may view the local changes by opening these files with their
favorite browser, e.g.:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ google-chrome _build/html/index.html
</pre></div>
</div>
<p>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:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ make push-root
</pre></div>
</div>
</div>
</div>
<div class="section" id="branches-and-releases">
<h2>Branches and Releases<a class="headerlink" href="#branches-and-releases" title="Permalink to this headline">¶</a></h2>
<p>Mainline fixie development occurs on the <code class="docutils literal"><span class="pre">master</span></code> branch. Other branches
may be used for feature development (topical branches) or to represent
past and upcoming releases.</p>
</div>
<div class="section" id="document-history">
<h2>Document History<a class="headerlink" href="#document-history" title="Permalink to this headline">¶</a></h2>
<p>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.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="index.html" title="index">
<img class="logo" src="_static/fixie-logo.png" alt="Logo"/>
</a></p><div class="sphinx-toc sphinxlocaltoc">
<h3><a href="index.html">Page contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Developer’s Guide</a><ul>
<li><a class="reference internal" href="#changelog">Changelog</a></li>
<li><a class="reference internal" href="#style-guide">Style Guide</a><ul>
<li><a class="reference internal" href="#rules-to-write-by">Rules to Write By</a><ul>
<li><a class="reference internal" href="#interfaces">Interfaces</a></li>
<li><a class="reference internal" href="#expectations">Expectations</a></li>
</ul>
</li>
<li><a class="reference internal" href="#python-style-guide">Python Style Guide</a></li>
</ul>
</li>
<li><a class="reference internal" href="#how-to-test">How to Test</a><ul>
<li><a class="reference internal" href="#dependencies">Dependencies</a></li>
<li><a class="reference internal" href="#running-the-tests-basic">Running the Tests - Basic</a></li>
<li><a class="reference internal" href="#running-the-tests-advanced">Running the Tests - Advanced</a></li>
<li><a class="reference internal" href="#writing-the-tests-advanced">Writing the Tests - Advanced</a></li>
</ul>
</li>
<li><a class="reference internal" href="#how-to-document">How to Document</a><ul>
<li><a class="reference internal" href="#docstrings">Docstrings</a></li>
<li><a class="reference internal" href="#auto-documentation-hooks">Auto-Documentation Hooks</a></li>
<li><a class="reference internal" href="#python-hooks">Python Hooks</a></li>
</ul>
</li>
<li><a class="reference internal" href="#building-the-website">Building the Website</a><ul>
<li><a class="reference internal" href="#procedure-for-modifying-the-website">Procedure for modifying the website</a></li>
</ul>
</li>
<li><a class="reference internal" href="#branches-and-releases">Branches and Releases</a></li>
<li><a class="reference internal" href="#document-history">Document History</a></li>
</ul>
</li>
</ul>
</div>
<div class="sphinxprev">
<h4>Previous page</h4>
<p class="topless"><a href="api/fixie_data-handlers.html"
title="Previous page">← Data Request Handlers (<code class="docutils literal"><span class="pre">fixie_data.handlers</span></code>)</a></p>
</div>
<div role="note" aria-label="source link">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/devguide.rst.txt"
rel="nofollow">Show Source</a></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<div><input type="text" name="q" /></div>
<div><input type="submit" value="Go" /></div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="sidebar-toggle-group no-js">
<button class="sidebar-toggle" id="sidebar-hide" title="Hide the sidebar menu">
«
<span class="show-for-small">hide menu</span>
</button>
<button class="sidebar-toggle" id="sidebar-show" title="Show the sidebar menu">
<span class="show-for-small">menu</span>
<span class="hide-for-small">sidebar</span>
»
</button>
</div>
<div class="clearer"></div>
</div>
<div class="relbar-bottom">
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> </li>
<li class="right" >
<a href="api/fixie_data-handlers.html" title="Data Request Handlers (fixie_data.handlers)"
>previous</a> </li>
<li><a href="index.html">fixie documentation</a> »</li>
</ul>
</div>
</div>
<div class="footer" role="contentinfo">
© Copyright 2018, Anthony Scopatz.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6.
</div>
<!-- cloud_sptheme 1.4 -->
</body>
</html>