##// END OF EJS Templates
docs: add code guidelines on template helpers and the SQLAlchemy session
Søren Løvborg -
r6278:2d5fecba default
parent child Browse files
Show More
@@ -1,191 +1,227 b''
1 1 .. _contributing:
2 2
3 3 =========================
4 4 Contributing to Kallithea
5 5 =========================
6 6
7 7 Kallithea is developed and maintained by its users. Please join us and scratch
8 8 your own itch.
9 9
10 10
11 11 Infrastructure
12 12 --------------
13 13
14 14 The main repository is hosted on Our Own Kallithea (aka OOK) at
15 15 https://kallithea-scm.org/repos/kallithea/, our self-hosted instance
16 16 of Kallithea.
17 17
18 18 For now, we use Bitbucket_ for `pull requests`_ and `issue tracking`_. The
19 19 issue tracker is for tracking bugs, not for support, discussion, or ideas --
20 20 please use the `mailing list`_ or :ref:`IRC <readme>` to reach the community.
21 21
22 22 We use Weblate_ to translate the user interface messages into languages other
23 23 than English. Join our project on `Hosted Weblate`_ to help us.
24 24 To register, you can use your Bitbucket or GitHub account. See :ref:`translations`
25 25 for more details.
26 26
27 27
28 28 Getting started
29 29 ---------------
30 30
31 31 To get started with development::
32 32
33 33 hg clone https://kallithea-scm.org/repos/kallithea
34 34 cd kallithea
35 35 virtualenv ../kallithea-venv
36 36 source ../kallithea-venv/bin/activate
37 37 pip install --upgrade pip setuptools
38 38 pip install -e .
39 39 paster make-config Kallithea my.ini
40 40 paster setup-db my.ini --user=user --email=user@example.com --password=password --repos=/tmp
41 41 paster serve my.ini --reload &
42 42 firefox http://127.0.0.1:5000/
43 43
44 44 You can also start out by forking https://bitbucket.org/conservancy/kallithea
45 45 on Bitbucket_ and create a local clone of your own fork.
46 46
47 47
48 48 Running tests
49 49 -------------
50 50
51 51 After finishing your changes make sure all tests pass cleanly. Install the test
52 52 dependencies, then run the testsuite by invoking ``py.test`` from the
53 53 project root::
54 54
55 55 pip install -r dev_requirements.txt
56 56 py.test
57 57
58 58 Note that testing on Python 2.6 also requires ``unittest2``.
59 59
60 60 You can also use ``tox`` to run the tests with all supported Python versions
61 61 (currently Python 2.6--2.7).
62 62
63 63 When running tests, Kallithea uses `kallithea/tests/test.ini` and populates the
64 64 SQLite database specified there.
65 65
66 66 It is possible to avoid recreating the full test database on each invocation of
67 67 the tests, thus eliminating the initial delay. To achieve this, run the tests as::
68 68
69 69 paster serve kallithea/tests/test.ini --pid-file=test.pid --daemon
70 70 KALLITHEA_WHOOSH_TEST_DISABLE=1 KALLITHEA_NO_TMP_PATH=1 py.test
71 71 kill -9 $(cat test.pid)
72 72
73 73 In these commands, the following variables are used::
74 74
75 75 KALLITHEA_WHOOSH_TEST_DISABLE=1 - skip whoosh index building and tests
76 76 KALLITHEA_NO_TMP_PATH=1 - disable new temp path for tests, used mostly for testing_vcs_operations
77 77
78 78 You can run individual tests by specifying their path as argument to py.test.
79 79 py.test also has many more options, see `py.test -h`. Some useful options
80 80 are::
81 81
82 82 -k EXPRESSION only run tests which match the given substring
83 83 expression. An expression is a python evaluable
84 84 expression where all names are substring-matched
85 85 against test names and their parent classes. Example:
86 86 -x, --exitfirst exit instantly on first error or failed test.
87 87 --lf rerun only the tests that failed at the last run (or
88 88 all if none failed)
89 89 --ff run all tests but run the last failures first. This
90 90 may re-order tests and thus lead to repeated fixture
91 91 setup/teardown
92 92 --pdb start the interactive Python debugger on errors.
93 93 -s, --capture=no don't capture stdout (any stdout output will be
94 94 printed immediately)
95 95
96 96
97 97 Contribution guidelines
98 98 -----------------------
99 99
100 100 Kallithea is GPLv3 and we assume all contributions are made by the
101 101 committer/contributor and under GPLv3 unless explicitly stated. We do care a
102 102 lot about preservation of copyright and license information for existing code
103 103 that is brought into the project.
104 104
105 105 Contributions will be accepted in most formats -- such as pull requests on
106 106 Bitbucket, something hosted on your own Kallithea instance, or patches sent by
107 107 email to the `kallithea-general`_ mailing list.
108 108
109 109 When contributing via Bitbucket, please make your fork of
110 110 https://bitbucket.org/conservancy/kallithea/ `non-publishing`_ -- it is one of
111 111 the settings on "Repository details" page. This ensures your commits are in
112 112 "draft" phase and makes it easier for you to address feedback and for project
113 113 maintainers to integrate your changes.
114 114
115 115 .. _non-publishing: https://www.mercurial-scm.org/wiki/Phases#Publishing_Repository
116 116
117 117 Make sure to test your changes both manually and with the automatic tests
118 118 before posting.
119 119
120 120 We care about quality and review and keeping a clean repository history. We
121 121 might give feedback that requests polishing contributions until they are
122 122 "perfect". We might also rebase and collapse and make minor adjustments to your
123 123 changes when we apply them.
124 124
125 125 We try to make sure we have consensus on the direction the project is taking.
126 126 Everything non-sensitive should be discussed in public -- preferably on the
127 127 mailing list. We aim at having all non-trivial changes reviewed by at least
128 128 one other core developer before pushing. Obvious non-controversial changes will
129 129 be handled more casually.
130 130
131 131 For now we just have one official branch ("default") and will keep it so stable
132 132 that it can be (and is) used in production. Experimental changes should live
133 133 elsewhere (for example in a pull request) until they are ready.
134 134
135 135
136 136 Coding guidelines
137 137 -----------------
138 138
139 139 We don't have a formal coding/formatting standard. We are currently using a mix
140 140 of Mercurial (http://mercurial.selenic.com/wiki/CodingStyle), pep8, and
141 141 consistency with existing code. Run ``scripts/run-all-cleanup`` before
142 142 committing to ensure some basic code formatting consistency.
143 143
144 144 We support both Python 2.6.x and 2.7.x and nothing else. For now we don't care
145 145 about Python 3 compatibility.
146 146
147 147 We try to support the most common modern web browsers. IE9 is still supported
148 148 to the extent it is feasible, IE8 is not.
149 149
150 150 We primarily support Linux and OS X on the server side but Windows should also work.
151 151
152 152 HTML templates should use 2 spaces for indentation ... but be pragmatic. We
153 153 should use templates cleverly and avoid duplication. We should use reasonable
154 154 semantic markup with element classes and IDs that can be used for styling and testing.
155 155 We should only use inline styles in places where it really is semantic (such as
156 156 ``display: none``).
157 157
158 158 JavaScript must use ``;`` between/after statements. Indentation 4 spaces. Inline
159 159 multiline functions should be indented two levels -- one for the ``()`` and one for
160 160 ``{}``.
161 161 Variables holding jQuery objects should be named with a leading ``$``.
162 162
163 163 Commit messages should have a leading short line summarizing the changes. For
164 164 bug fixes, put ``(Issue #123)`` at the end of this line.
165 165
166 166 Use American English grammar and spelling overall. Use `English title case`_ for
167 167 page titles, button labels, headers, and 'labels' for fields in forms.
168 168
169 169 .. _English title case: https://en.wikipedia.org/wiki/Capitalization#Title_case
170 170
171 Template helpers (that is, everything in ``kallithea.lib.helpers``)
172 should only be referenced from templates. If you need to call a
173 helper from the Python code, consider moving the function somewhere
174 else (e.g. to the model).
175
176 Notes on the SQLAlchemy session
177 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
178
179 Each HTTP request runs inside an independent SQLAlchemy session (as well
180 as in an independent database transaction). Database model objects
181 (almost) always belong to a particular SQLAlchemy session, which means
182 that SQLAlchemy will ensure that they're kept in sync with the database
183 (but also means that they cannot be shared across requests).
184
185 Objects can be added to the session using ``Session().add``, but this is
186 rarely needed:
187
188 * When creating a database object by calling the constructor directly,
189 it must explicitly be added to the session.
190
191 * When creating an object using a factory function (like
192 ``create_repo``), the returned object has already (by convention)
193 been added to the session, and should not be added again.
194
195 * When getting an object from the session (via ``Session().query`` or
196 any of the utility functions that look up objects in the database),
197 it's already part of the session, and should not be added again.
198 SQLAlchemy monitors attribute modifications automatically for all
199 objects it knows about and syncs them to the database.
200
201 SQLAlchemy also flushes changes to the database automatically; manually
202 calling ``Session().flush`` is usually only necessary when the Python
203 code needs the database to assign an "auto-increment" primary key ID to
204 a freshly created model object (before flushing, the ID attribute will
205 be ``None``).
206
171 207
172 208 "Roadmap"
173 209 ---------
174 210
175 211 We do not have a road map but are waiting for your contributions. Refer to the
176 212 wiki_ for some ideas of places we might want to go -- contributions in these
177 213 areas are very welcome.
178 214
179 215
180 216 Thank you for your contribution!
181 217 --------------------------------
182 218
183 219
184 220 .. _Weblate: http://weblate.org/
185 221 .. _issue tracking: https://bitbucket.org/conservancy/kallithea/issues?status=new&status=open
186 222 .. _pull requests: https://bitbucket.org/conservancy/kallithea/pull-requests
187 223 .. _bitbucket: http://bitbucket.org/
188 224 .. _mailing list: http://lists.sfconservancy.org/mailman/listinfo/kallithea-general
189 225 .. _kallithea-general: http://lists.sfconservancy.org/mailman/listinfo/kallithea-general
190 226 .. _Hosted Weblate: https://hosted.weblate.org/projects/kallithea/kallithea/
191 227 .. _wiki: https://bitbucket.org/conservancy/kallithea/wiki/Home
General Comments 0
You need to be logged in to leave comments. Login now