Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Update the coding style doc #5719

Merged
merged 4 commits into from
Jul 19, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/5719.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Update the coding style document.
124 changes: 94 additions & 30 deletions docs/code_style.rst
Original file line number Diff line number Diff line change
@@ -1,25 +1,29 @@
# Code Style
Code Style
==========

Formatting tools
----------------

The Synapse codebase uses a number of code formatting tools in order to
quickly and automatically check for formatting (and sometimes logical) errors
in code.

The necessary tools are detailed below.

## Formatting tools
- **black**

The Synapse codebase uses [black](https://pypi.org/project/black/) as an
opinionated code formatter, ensuring all comitted code is properly
formatted.
The Synapse codebase uses `black <https://pypi.org/project/black/>`_ as an
opinionated code formatter, ensuring all comitted code is properly
formatted.

First install ``black`` with::
First install ``black`` with::

pip install --upgrade black
pip install --upgrade black

Have ``black`` auto-format your code (it shouldn't change any
functionality) with::
Have ``black`` auto-format your code (it shouldn't change any functionality)
with::

black . --exclude="\.tox|build|env"
black . --exclude="\.tox|build|env"

- **flake8**

Expand Down Expand Up @@ -54,17 +58,16 @@ functionality is supported in your editor for a more convenient development
workflow. It is not, however, recommended to run ``flake8`` on save as it
takes a while and is very resource intensive.

## General rules
General rules
-------------

- **Naming**:

- Use camel case for class and type names
- Use underscores for functions and variables.

- Use double quotes ``"foo"`` rather than single quotes ``'foo'``.

- **Comments**: should follow the `google code style
<http://google.github.io/styleguide/pyguide.html?showone=Comments#Comments>`_.
- **Docstrings**: should follow the `google code style
<https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings>`_.
This is so that we can generate documentation with `sphinx
<http://sphinxcontrib-napoleon.readthedocs.org/en/latest/>`_. See the
`examples
Expand All @@ -73,6 +76,8 @@ takes a while and is very resource intensive.

- **Imports**:

- Imports should be sorted by ``isort`` as described above.

- Prefer to import classes and functions rather than packages or modules.

Example::
Expand All @@ -92,25 +97,84 @@ takes a while and is very resource intensive.
This goes against the advice in the Google style guide, but it means that
errors in the name are caught early (at import time).

- Multiple imports from the same package can be combined onto one line::
- Avoid wildcard imports (``from synapse.types import *``) and relative
imports (``from .types import UserID``).

from synapse.types import GroupID, RoomID, UserID
Configuration file format
-------------------------

An effort should be made to keep the individual imports in alphabetical
order.
The `sample configuration file <./sample_config.yaml>`_ acts as a reference to
Synapse's configuration options for server administrators. Remember that many
readers will be unfamiliar with YAML and server administration in general, so
that it is important that the file be as easy to understand as possible, which
includes following a consistent format.

If the list becomes long, wrap it with parentheses and split it over
multiple lines.
Some guidelines follow:

- As per `PEP-8 <https://www.python.org/dev/peps/pep-0008/#imports>`_,
imports should be grouped in the following order, with a blank line between
each group:
* Sections should be separated with a heading consisting of a single line
prefixed and suffixed with ``##``. There should be **two** blank lines
before the section header, and **one** after.

1. standard library imports
2. related third party imports
3. local application/library specific imports
* Each option should be listed in the file with the following format:

- Imports within each group should be sorted alphabetically by module name.
* A comment describing the setting. Each line of this comment should be
prefixed with a hash (``#``) and a space.

- Avoid wildcard imports (``from synapse.types import *``) and relative
imports (``from .types import UserID``).
The comment should describe the default behaviour (ie, what happens if
the setting is omitted), as well as what the effect will be if the
setting is changed.

Often, the comment end with something like "uncomment the
following to \<do action>".

* A line consisting of only ``#``.

* A commented-out example setting, prefixed with only ``#``.

For boolean (on/off) options, convention is that this example should be
the *opposite* to the default (so the comment will end with "Uncomment
the following to enable [or disable] \<feature\>." For other options,
the example should give some non-default value which is likely to be
useful to the reader.

* There should be a blank line between each option.

* Where several settings are grouped into a single dict, *avoid* the
convention where the whole block is commented out, resulting in comment
lines starting ``# #``, as this is hard to read and confusing to
edit. Instead, leave the top-level config option uncommented, and follow
the conventions above for sub-options. Ensure that your code correctly
handles the top-level option being set to ``None`` (as it will be if no
sub-options are enabled).

* Lines should be wrapped at 80 characters.

Example::

## Frobnication ##

# The frobnicator will ensure that all requests are fully frobnicated.
# To enable it, uncomment the following.
#
#frobnicator_enabled: true

# By default, the frobnicator will frobnicate with the default frobber.
# The following will make it use an alternative frobber.
#
#frobincator_frobber: special_frobber

# Settings for the frobber
#
frobber:
# frobbing speed. Defaults to 1.
#
#speed: 10

# frobbing distance. Defaults to 1000.
#
#distance: 100

Note that the sample configuration is generated from the synapse code and is
maintained by a script, ``scripts-dev/generate_sample_config``. Making sure
that the output from this script matches the desired format is left as an
exercise for the reader!