2019-09-17 13:55:29 +02:00
|
|
|
# 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.
|
|
|
|
|
2022-04-14 12:33:06 +02:00
|
|
|
The necessary tools are:
|
2019-09-17 13:55:29 +02:00
|
|
|
|
2022-04-14 12:33:06 +02:00
|
|
|
- [black](https://black.readthedocs.io/en/stable/), a source code formatter;
|
|
|
|
- [isort](https://pycqa.github.io/isort/), which organises each file's imports;
|
|
|
|
- [flake8](https://flake8.pycqa.org/en/latest/), which can spot common errors; and
|
|
|
|
- [mypy](https://mypy.readthedocs.io/en/stable/), a type checker.
|
|
|
|
|
|
|
|
Install them with:
|
2021-02-16 23:32:34 +01:00
|
|
|
|
2021-11-01 12:35:55 +01:00
|
|
|
```sh
|
|
|
|
pip install -e ".[lint,mypy]"
|
|
|
|
```
|
2021-02-16 23:32:34 +01:00
|
|
|
|
2022-04-14 12:33:06 +02:00
|
|
|
The easiest way to run the lints is to invoke the linter script as follows.
|
2019-09-17 13:55:29 +02:00
|
|
|
|
2022-04-14 12:33:06 +02:00
|
|
|
```sh
|
|
|
|
scripts-dev/lint.sh
|
|
|
|
```
|
2019-09-17 13:55:29 +02:00
|
|
|
|
|
|
|
It's worth noting that modern IDEs and text editors can run these tools
|
|
|
|
automatically on save. It may be worth looking into whether this
|
|
|
|
functionality is supported in your editor for a more convenient
|
2022-04-14 12:33:06 +02:00
|
|
|
development workflow. It is not, however, recommended to run `flake8` or `mypy`
|
|
|
|
on save as they take a while and can be very resource intensive.
|
2019-09-17 13:55:29 +02:00
|
|
|
|
|
|
|
## General rules
|
|
|
|
|
|
|
|
- **Naming**:
|
2022-04-14 12:33:06 +02:00
|
|
|
- Use `CamelCase` for class and type names
|
|
|
|
- Use underscores for `function_names` and `variable_names`.
|
2019-09-17 13:55:29 +02:00
|
|
|
- **Docstrings**: should follow the [google code
|
|
|
|
style](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings).
|
|
|
|
See the
|
|
|
|
[examples](http://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html)
|
|
|
|
in the sphinx documentation.
|
|
|
|
- **Imports**:
|
|
|
|
- Imports should be sorted by `isort` as described above.
|
|
|
|
- Prefer to import classes and functions rather than packages or
|
|
|
|
modules.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2021-11-01 12:35:55 +01:00
|
|
|
```python
|
|
|
|
from synapse.types import UserID
|
|
|
|
...
|
|
|
|
user_id = UserID(local, server)
|
|
|
|
```
|
2019-09-17 13:55:29 +02:00
|
|
|
|
|
|
|
is preferred over:
|
|
|
|
|
2021-11-01 12:35:55 +01:00
|
|
|
```python
|
|
|
|
from synapse import types
|
|
|
|
...
|
|
|
|
user_id = types.UserID(local, server)
|
|
|
|
```
|
2019-09-17 13:55:29 +02:00
|
|
|
|
|
|
|
(or any other variant).
|
|
|
|
|
|
|
|
This goes against the advice in the Google style guide, but it
|
|
|
|
means that errors in the name are caught early (at import time).
|
|
|
|
|
|
|
|
- Avoid wildcard imports (`from synapse.types import *`) and
|
|
|
|
relative imports (`from .types import UserID`).
|
|
|
|
|
2022-06-30 18:21:39 +02:00
|
|
|
## Configuration code and documentation format
|
2019-09-17 13:55:29 +02:00
|
|
|
|
2022-06-30 18:21:39 +02:00
|
|
|
When adding a configuration option to the code, if several settings are grouped into a single dict, ensure that your code
|
|
|
|
correctly handles the top-level option being set to `None` (as it will be if no sub-options are enabled).
|
|
|
|
|
|
|
|
The [configuration manual](usage/configuration/config_documentation.md) acts as a
|
2019-09-17 13:55:29 +02:00
|
|
|
reference to Synapse's configuration options for server administrators.
|
|
|
|
Remember that many readers will be unfamiliar with YAML and server
|
2022-06-30 18:21:39 +02:00
|
|
|
administration in general, so it is important that when you add
|
|
|
|
a configuration option the documentation be as easy to understand as possible, which
|
|
|
|
includes following a consistent format.
|
2019-09-17 13:55:29 +02:00
|
|
|
|
|
|
|
Some guidelines follow:
|
|
|
|
|
2022-06-30 18:21:39 +02:00
|
|
|
- Each option should be listed in the config manual with the following format:
|
|
|
|
|
|
|
|
- The name of the option, prefixed by `###`.
|
2019-09-17 13:55:29 +02:00
|
|
|
|
2022-06-30 18:21:39 +02:00
|
|
|
- A comment which describes the default behaviour (i.e. what
|
2019-09-17 13:55:29 +02:00
|
|
|
happens if the setting is omitted), as well as what the effect
|
|
|
|
will be if the setting is changed.
|
2022-06-30 18:21:39 +02:00
|
|
|
- An example setting, using backticks to define the code block
|
2019-09-17 13:55:29 +02:00
|
|
|
|
|
|
|
For boolean (on/off) options, convention is that this example
|
2022-06-30 18:21:39 +02:00
|
|
|
should be the *opposite* to the default. For other options, the example should give
|
|
|
|
some non-default value which is likely to be useful to the reader.
|
|
|
|
|
|
|
|
- There should be a horizontal rule between each option, which can be achieved by adding `---` before and
|
|
|
|
after the option.
|
|
|
|
- `true` and `false` are spelt thus (as opposed to `True`, etc.)
|
2019-09-17 13:55:29 +02:00
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2022-06-30 18:21:39 +02:00
|
|
|
---
|
|
|
|
### `modules`
|
|
|
|
|
|
|
|
Use the `module` sub-option to add a module under `modules` to extend functionality.
|
|
|
|
The `module` setting then has a sub-option, `config`, which can be used to define some configuration
|
|
|
|
for the `module`.
|
|
|
|
|
|
|
|
Defaults to none.
|
|
|
|
|
|
|
|
Example configuration:
|
2021-11-01 12:35:55 +01:00
|
|
|
```yaml
|
2022-06-30 18:21:39 +02:00
|
|
|
modules:
|
|
|
|
- module: my_super_module.MySuperClass
|
|
|
|
config:
|
|
|
|
do_thing: true
|
|
|
|
- module: my_other_super_module.SomeClass
|
|
|
|
config: {}
|
2021-11-01 12:35:55 +01:00
|
|
|
```
|
2022-06-30 18:21:39 +02:00
|
|
|
---
|
2019-09-17 13:55:29 +02:00
|
|
|
|
|
|
|
Note that the sample configuration is generated from the synapse code
|
2022-03-02 19:00:26 +01:00
|
|
|
and is maintained by a script, `scripts-dev/generate_sample_config.sh`.
|
2019-09-17 13:55:29 +02:00
|
|
|
Making sure that the output from this script matches the desired format
|
|
|
|
is left as an exercise for the reader!
|
2022-06-30 18:21:39 +02:00
|
|
|
|