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

Commit

Permalink
Update the coding style doc (#5719)
Browse files Browse the repository at this point in the history
A few fixes and removal of duplicated stuff, but mostly a bunch of the words on the config file.
  • Loading branch information
richvdh committed Jul 19, 2019
1 parent 356ed04 commit b73ce4b
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 30 deletions.
1 change: 1 addition & 0 deletions changelog.d/5719.misc
@@ -0,0 +1 @@
Update the coding style document.
124 changes: 94 additions & 30 deletions docs/code_style.rst
@@ -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!

0 comments on commit b73ce4b

Please sign in to comment.