~bzr-pqm/bzr/bzr.dev

5225.2.9 by Martin Pool
Split out code style guide from HACKING
1
***********************
2
Bazaar Code Style Guide
3
***********************
4
5
Code layout
6
===========
7
8
Please write PEP-8__ compliant code.
9
10
__ http://www.python.org/peps/pep-0008.html
11
12
One often-missed requirement is that the first line of docstrings
13
should be a self-contained one-sentence summary.
14
15
We use 4 space indents for blocks, and never use tab characters.  (In vim,
16
``set expandtab``.)
17
18
Trailing white space should be avoided, but is allowed.
19
You should however not make lots of unrelated white space changes.
20
21
Unix style newlines (LF) are used.
22
23
Each file must have a newline at the end of it.
24
25
Lines should be no more than 79 characters if at all possible.
26
Lines that continue a long statement may be indented in either of
27
two ways:
28
29
within the parenthesis or other character that opens the block, e.g.::
30
31
    my_long_method(arg1,
32
                   arg2,
33
                   arg3)
34
35
or indented by four spaces::
36
37
    my_long_method(arg1,
38
        arg2,
39
        arg3)
40
41
The first is considered clearer by some people; however it can be a bit
42
harder to maintain (e.g. when the method name changes), and it does not
43
work well if the relevant parenthesis is already far to the right.  Avoid
44
this::
45
46
     self.legbone.kneebone.shinbone.toebone.shake_it(one,
47
                                                     two,
48
                                                     three)
49
50
but rather ::
51
52
     self.legbone.kneebone.shinbone.toebone.shake_it(one,
53
         two,
54
         three)
55
56
or ::
57
58
     self.legbone.kneebone.shinbone.toebone.shake_it(
59
         one, two, three)
60
61
For long lists, we like to add a trailing comma and put the closing
62
character on the following line.  This makes it easier to add new items in
63
future::
64
65
    from bzrlib.goo import (
66
        jam,
67
        jelly,
68
        marmalade,
69
        )
70
71
There should be spaces between function parameters, but not between the
72
keyword name and the value::
73
74
    call(1, 3, cheese=quark)
75
5225.2.10 by Martin Pool
More code style guidelines cleanups
76
5225.2.11 by Martin Pool
Style guide point about python versions
77
Python versions
78
===============
79
80
Bazaar supports Python from 2.4 through 2.6, and in the future we want to
5430.4.3 by Vincent Ladeuil
Tweak code-review and code-style a bit (NOT controversial :)
81
support Python 2.7 and 3.0.  Avoid using language features added in 2.5,
82
2.6 or 2.7, or features deprecated in Python 3.0.  (You can check v3
83
compatibility using the ``-3`` option of Python2.6.)
5225.2.11 by Martin Pool
Style guide point about python versions
84
85
Specifically:
86
5274.3.1 by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets.
87
* Don't use the ``with`` statement.
88
89
* Don't ``from . import``.
90
91
* Don't use ``try/except/finally``, which is not supported in Python2.4,
92
  use separate nested ``try/except`` and ``try/finally`` blocks.
5225.2.11 by Martin Pool
Style guide point about python versions
93
94
5225.2.10 by Martin Pool
More code style guidelines cleanups
95
hasattr and getattr
96
===================
97
98
``hasattr`` should not be used because it swallows exceptions including
99
``KeyboardInterrupt``.  Instead, say something like ::
100
101
  if getattr(thing, 'name', None) is None
5225.2.9 by Martin Pool
Split out code style guide from HACKING
102
103
5418.2.1 by Martin Pool
Text about kwargs from spiv
104
kwargs
105
======
106
107
``**kwargs`` in the prototype of a function should be used sparingly.
108
It can be good on higher-order functions that decorate other functions,
5418.2.5 by Martin Pool
Cleanup style of developer advice about kwargs
109
such as ``addCleanup`` or ``assertRaises``, or on functions that take only
110
(or almost only) kwargs, where any kwargs can be passed.  
5418.2.1 by Martin Pool
Text about kwargs from spiv
111
5418.2.5 by Martin Pool
Cleanup style of developer advice about kwargs
112
Otherwise, be careful: if the parameters to a function are a bit complex
113
and might vary over time (e.g.  the ``commit`` API) then we prefer to pass an
114
object rather than a bag of positional and/or keyword args.  If you have
115
an arbitrary set of keys and values that are different with each use (e.g.
116
string interpolation inputs) then again that should not be mixed in with
117
the regular positional/keyword args, it seems like a different category of
118
thing.
5418.2.1 by Martin Pool
Text about kwargs from spiv
119
120
5418.2.3 by Martin Pool
Code guideline about imitating standard objects
121
Imitating standard objects
122
==========================
123
124
Don't provide methods that imitate built-in classes (eg ``__in__``,
125
``__call__``, ``__int__``, ``__getitem__``) unless the class you're
126
implementing really does act like the builtin class, in semantics and
127
performance.
128
129
For example, old code lets you say ``file_id in inv`` but we no longer
130
consider this good style.  Instead, say more explicitly
131
``inv.has_id(file_id)``.
132
133
``__repr__``, ``__cmp__``, ``__str__`` are usually fine.
134
135
5225.2.9 by Martin Pool
Split out code style guide from HACKING
136
Module Imports
137
==============
138
139
* Imports should be done at the top-level of the file, unless there is
140
  a strong reason to have them lazily loaded when a particular
141
  function runs.  Import statements have a cost, so try to make sure
142
  they don't run inside hot functions.
143
144
* Module names should always be given fully-qualified,
145
  i.e. ``bzrlib.hashcache`` not just ``hashcache``.
146
147
148
Naming
149
======
150
151
Functions, methods or members that are relatively private are given
152
a leading underscore prefix.  Names without a leading underscore are
153
public not just across modules but to programmers using bzrlib as an
154
API.
155
156
We prefer class names to be concatenated capital words (``TestCase``)
157
and variables, methods and functions to be lowercase words joined by
158
underscores (``revision_id``, ``get_revision``).
159
160
For the purposes of naming some names are treated as single compound
161
words: "filename", "revno".
162
163
Consider naming classes as nouns and functions/methods as verbs.
164
165
Try to avoid using abbreviations in names, because there can be
166
inconsistency if other people use the full name.
167
168
169
Standard Names
170
==============
171
172
``revision_id`` not ``rev_id`` or ``revid``
173
174
Functions that transform one thing to another should be named ``x_to_y``
175
(not ``x2y`` as occurs in some old code.)
176
177
178
Destructors
179
===========
180
181
Python destructors (``__del__``) work differently to those of other
182
languages.  In particular, bear in mind that destructors may be called
183
immediately when the object apparently becomes unreferenced, or at some
184
later time, or possibly never at all.  Therefore we have restrictions on
185
what can be done inside them.
186
5274.3.1 by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets.
187
0. If you think you need to use a ``__del__`` method ask another
188
   developer for alternatives.  If you do need to use one, explain
189
   why in a comment.
190
191
1. Never rely on a ``__del__`` method running.  If there is code that
5967.8.3 by Martin Pool
Document deprecation of __del__
192
   must run, instead have a ``finally`` block or an ``addCleanup`` call an
193
   explicit ``close`` method.
5274.3.1 by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets.
194
195
2. Never ``import`` from inside a ``__del__`` method, or you may crash the
196
   interpreter!!
197
5967.8.3 by Martin Pool
Document deprecation of __del__
198
3. Prior to bzr 2.4, we sometimes used to raise warnings from del methods
199
   that the object was not cleaned up or closed.  We no longer do this:
200
   failure to close the object doesn't cause a test failure; the warning
201
   appears an arbitrary long time after the problem occurred (the object
202
   being leaked); merely having a del method inhibits Python gc; the
203
   warnings appear to users and upset them; they can also break tests that
204
   are checking what appears on stderr.
205
   
206
In short, just don't use ``__del__``.
5225.2.9 by Martin Pool
Split out code style guide from HACKING
207
208
Cleanup methods
209
===============
210
5274.3.1 by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets.
211
Often when something has failed later code will fail too, including
212
cleanups invoked from ``finally`` blocks.  These secondary failures are
213
generally uninteresting compared to the original exception.  ``bzrlib``
214
has some facilities you can use to mitigate this.
215
216
* In ``Command`` subclasses, prefer the ``add_cleanup`` method to using
217
  ``try``/``finally`` blocks.  E.g. to acquire a lock and ensure it will
218
  always be released when the command is done::
219
220
    self.add_cleanup(branch.lock_read().unlock)
221
222
  This also avoids heavily indented code. It also makes it easier to notice
223
  mismatched lock/unlock pairs (and other kinds of resource
224
  acquire/release) because there isn't a large block of code separating
225
  them.
226
227
* Use the ``only_raises`` decorator (from ``bzrlib.decorators``) when
228
  defining methods that are typically called in ``finally`` blocks, such
229
  as ``unlock`` methods.  For example, ``@only_raises(LockNotHeld,
230
  LockBroken)``.  All errors that are unlikely to be a knock-on failure
231
  from a previous failure should be allowed.
232
233
* Consider using the ``OperationWithCleanups`` helper from
234
  ``bzrlib.cleanup`` anywhere else you have a ``finally`` block that
235
  might fail.
5225.2.9 by Martin Pool
Split out code style guide from HACKING
236
237
238
Factories
239
=========
240
241
In some places we have variables which point to callables that construct
242
new instances.  That is to say, they can be used a lot like class objects,
5225.2.10 by Martin Pool
More code style guidelines cleanups
243
but they shouldn't be *named* like classes.  Things called ``FooBar`` should
244
create an instance of ``FooBar``.  A factory method that might create a
245
``FooBar`` or might make something else should be called ``foo_factory``.
5225.2.9 by Martin Pool
Split out code style guide from HACKING
246
247
248
Registries
249
==========
250
251
Several places in Bazaar use (or will use) a registry, which is a
252
mapping from names to objects or classes.  The registry allows for
253
loading in registered code only when it's needed, and keeping
254
associated information such as a help string or description.
255
256
257
InterObject and multiple dispatch
258
=================================
259
260
The ``InterObject`` provides for two-way `multiple dispatch`__: matching
261
up for example a source and destination repository to find the right way
262
to transfer data between them.
263
264
.. __: http://en.wikipedia.org/wiki/Multiple_dispatch
265
266
There is a subclass ``InterObject`` classes for each type of object that is
267
dispatched this way, e.g. ``InterRepository``.  Calling ``.get()`` on this
268
class will return an ``InterObject`` instance providing the best match for
269
those parameters, and this instance then has methods for operations
270
between the objects.
271
272
::
273
274
  inter = InterRepository.get(source_repo, target_repo)
275
  inter.fetch(revision_id)
276
277
``InterRepository`` also acts as a registry-like object for its
278
subclasses, and they can be added through ``.register_optimizer``.  The
279
right one to run is selected by asking each class, in reverse order of
280
registration, whether it ``.is_compatible`` with the relevant objects.
281
282
Lazy Imports
283
============
284
285
To make startup time faster, we use the ``bzrlib.lazy_import`` module to
286
delay importing modules until they are actually used. ``lazy_import`` uses
287
the same syntax as regular python imports. So to import a few modules in a
288
lazy fashion do::
289
290
  from bzrlib.lazy_import import lazy_import
291
  lazy_import(globals(), """
292
  import os
293
  import subprocess
294
  import sys
295
  import time
296
297
  from bzrlib import (
298
     errors,
299
     transport,
300
     revision as _mod_revision,
301
     )
302
  import bzrlib.transport
303
  import bzrlib.xml5
304
  """)
305
306
At this point, all of these exist as a ``ImportReplacer`` object, ready to
307
be imported once a member is accessed. Also, when importing a module into
308
the local namespace, which is likely to clash with variable names, it is
309
recommended to prefix it as ``_mod_<module>``. This makes it clearer that
310
the variable is a module, and these object should be hidden anyway, since
311
they shouldn't be imported into other namespaces.
312
313
While it is possible for ``lazy_import()`` to import members of a module
314
when using the ``from module import member`` syntax, it is recommended to
315
only use that syntax to load sub modules ``from module import submodule``.
316
This is because variables and classes can frequently be used without
317
needing a sub-member for example::
318
319
  lazy_import(globals(), """
320
  from module import MyClass
321
  """)
322
323
  def test(x):
324
      return isinstance(x, MyClass)
325
326
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer``
327
object, rather than the real class.
328
329
It also is incorrect to assign ``ImportReplacer`` objects to other variables.
330
Because the replacer only knows about the original name, it is unable to
331
replace other variables. The ``ImportReplacer`` class will raise an
332
``IllegalUseOfScopeReplacer`` exception if it can figure out that this
333
happened. But it requires accessing a member more than once from the new
334
variable, so some bugs are not detected right away.
335
336
337
The Null revision
338
=================
339
340
The null revision is the ancestor of all revisions.  Its revno is 0, its
341
revision-id is ``null:``, and its tree is the empty tree.  When referring
342
to the null revision, please use ``bzrlib.revision.NULL_REVISION``.  Old
343
code sometimes uses ``None`` for the null revision, but this practice is
344
being phased out.
345
346
347
Object string representations
348
=============================
349
350
Python prints objects using their ``__repr__`` method when they are
351
written to logs, exception tracebacks, or the debugger.  We want
352
objects to have useful representations to help in determining what went
353
wrong.
354
355
If you add a new class you should generally add a ``__repr__`` method
356
unless there is an adequate method in a parent class.  There should be a
357
test for the repr.
358
359
Representations should typically look like Python constructor syntax, but
360
they don't need to include every value in the object and they don't need
361
to be able to actually execute.  They're to be read by humans, not
362
machines.  Don't hardcode the classname in the format, so that we get the
363
correct value if the method is inherited by a subclass.  If you're
364
printing attributes of the object, including strings, you should normally
365
use ``%r`` syntax (to call their repr in turn).
366
367
Try to avoid the representation becoming more than one or two lines long.
368
(But balance this against including useful information, and simplicity of
369
implementation.)
370
371
Because repr methods are often called when something has already gone
372
wrong, they should be written somewhat more defensively than most code.
5566.2.1 by Martin Pool
Code guidelines re exception objects
373
They shouldn't have side effects like doing network or disk
374
IO.
5225.2.9 by Martin Pool
Split out code style guide from HACKING
375
The object may be half-initialized or in some other way in an illegal
376
state.  The repr method shouldn't raise an exception, or it may hide the
377
(probably more useful) underlying exception.
378
379
Example::
380
381
    def __repr__(self):
382
        return '%s(%r)' % (self.__class__.__name__,
383
                           self._transport)
384
385
386
Exception handling
387
==================
388
389
A bare ``except`` statement will catch all exceptions, including ones that
390
really should terminate the program such as ``MemoryError`` and
391
``KeyboardInterrupt``.  They should rarely be used unless the exception is
392
later re-raised.  Even then, think about whether catching just
393
``Exception`` (which excludes system errors in Python2.5 and later) would
394
be better.
395
5566.2.1 by Martin Pool
Code guidelines re exception objects
396
The ``__str__`` method on exceptions should be small and have no side
397
effects, following the rules given for `Object string representations`_.
398
In particular it should not do any network IO, or complicated
399
introspection of other objects.  All the state needed to present the
400
exception to the user should be gathered before the error is raised.
401
In other words, exceptions should basically be value objects.
402
5225.2.9 by Martin Pool
Split out code style guide from HACKING
403
404
Test coverage
405
=============
406
407
All code should be exercised by the test suite.  See the `Bazaar Testing
5261.2.1 by Parth Malwankar
added 'Portability Tip' on explicitly closing file to code-style.
408
Guide <http://doc.bazaar.canonical.com/developers/testing.html>`_ for detailed
5225.2.9 by Martin Pool
Split out code style guide from HACKING
409
information about writing tests.
410
5225.2.10 by Martin Pool
More code style guidelines cleanups
411
412
Assertions
413
==========
414
415
Do not use the Python ``assert`` statement, either in tests or elsewhere.
416
A source test checks that it is not used.  It is ok to explicitly raise
417
AssertionError.
418
419
Rationale:
420
5274.3.1 by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets.
421
* It makes the behaviour vary depending on whether bzr is run with -O
422
  or not, therefore giving a chance for bugs that occur in one case or
423
  the other, several of which have already occurred: assertions with
424
  side effects, code which can't continue unless the assertion passes,
425
  cases where we should give the user a proper message rather than an
426
  assertion failure.
427
* It's not that much shorter than an explicit if/raise.
428
* It tends to lead to fuzzy thinking about whether the check is
429
  actually needed or not, and whether it's an internal error or not
430
* It tends to cause look-before-you-leap patterns.
431
* It's unsafe if the check is needed to protect the integrity of the
432
  user's data.
433
* It tends to give poor messages since the developer can get by with
434
  no explanatory text at all.
435
* We can't rely on people always running with -O in normal use, so we
436
  can't use it for tests that are actually expensive.
437
* Expensive checks that help developers are better turned on from the
438
  test suite or a -D flag.
439
* If used instead of ``self.assert*()`` in tests it makes them falsely
440
  pass with -O.
5225.2.10 by Martin Pool
More code style guidelines cleanups
441
442
emacs setup
443
===========
444
445
In emacs::
446
447
    ;(defface my-invalid-face
448
    ;  '((t (:background "Red" :underline t)))
449
    ;  "Face used to highlight invalid constructs or other uglyties"
450
    ;  )
451
452
    (defun my-python-mode-hook ()
453
     ;; setup preferred indentation style.
454
     (setq fill-column 79)
455
     (setq indent-tabs-mode nil) ; no tabs, never, I will not repeat
456
    ;  (font-lock-add-keywords 'python-mode
457
    ;                         '(("^\\s *\t" . 'my-invalid-face) ; Leading tabs
458
    ;                            ("[ \t]+$" . 'my-invalid-face)  ; Trailing spaces
459
    ;                            ("^[ \t]+$" . 'my-invalid-face)); Spaces only
460
    ;                          )
461
     )
462
463
    (add-hook 'python-mode-hook 'my-python-mode-hook)
464
465
The lines beginning with ';' are comments. They can be activated
466
if one want to have a strong notice of some tab/space usage
467
violations.
5225.2.13 by Martin Pool
More reorganization of the developer documentation
468
469
Portability Tips
470
================
471
472
The ``bzrlib.osutils`` module has many useful helper functions, including
473
some more portable variants of functions in the standard library.
474
475
In particular, don't use ``shutil.rmtree`` unless it's acceptable for it
476
to fail on Windows if some files are readonly or still open elsewhere.
477
Use ``bzrlib.osutils.rmtree`` instead.
478
5261.2.1 by Parth Malwankar
added 'Portability Tip' on explicitly closing file to code-style.
479
Using the ``open(..).read(..)`` or ``open(..).write(..)`` style chaining
480
of methods for reading or writing file content relies on garbage collection
481
to close the file which may keep the file open for an undefined period of
482
time. This may break some follow up operations like rename on Windows.
483
Use ``try/finally`` to explictly close the file. E.g.::
5225.2.13 by Martin Pool
More reorganization of the developer documentation
484
5261.2.1 by Parth Malwankar
added 'Portability Tip' on explicitly closing file to code-style.
485
    f = open('foo.txt', 'w')
486
    try:
487
        f.write(s)
488
    finally:
489
        f.close()
5225.2.13 by Martin Pool
More reorganization of the developer documentation
490
5278.1.1 by Martin Pool
Call out a couple of GNU policy points about naming (gnu/linux etc)
491
492
Terminology
493
===========
494
495
Bazaar is a GNU project and uses standard GNU terminology, especially:
496
497
 * Use the word "Linux" to refer to the Linux kernel, not as a synechoche
498
   for the entire operating system.  (See `bug 528253
499
   <https://bugs.launchpad.net/bzr/+bug/528253>`_).
500
501
 * Don't say "open source" when you mean "free software".
502
5436.2.4 by Andrew Bennetts
Add section to code-style.txt recommending get_named_object.
503
504
Dynamic imports
505
===============
506
507
If you need to import a module (or attribute of a module) named in a
508
variable:
509
510
 * If importing a module, not an attribute, and the module is a top-level
511
   module (i.e. has no dots in the name), then it's ok to use the builtin
512
   ``__import__``, e.g. ``__import__(module_name)``.
513
 * In all other cases, prefer ``bzrlib.pyutils.get_named_object`` to the
514
   built-in ``__import__``.  ``__import__`` has some subtleties and
515
   unintuitive behaviours that make it hard to use correctly.
516
5225.2.13 by Martin Pool
More reorganization of the developer documentation
517
..
518
   vim: ft=rst tw=74 ai