170 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Markdown
		
	
	
# 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.
 | 
						|
 | 
						|
-   **black**
 | 
						|
 | 
						|
    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:
 | 
						|
 | 
						|
        pip install --upgrade black
 | 
						|
 | 
						|
    Have `black` auto-format your code (it shouldn't change any
 | 
						|
    functionality) with:
 | 
						|
 | 
						|
        black . --exclude="\.tox|build|env"
 | 
						|
 | 
						|
-   **flake8**
 | 
						|
 | 
						|
    `flake8` is a code checking tool. We require code to pass `flake8`
 | 
						|
    before being merged into the codebase.
 | 
						|
 | 
						|
    Install `flake8` with:
 | 
						|
 | 
						|
        pip install --upgrade flake8
 | 
						|
 | 
						|
    Check all application and test code with:
 | 
						|
 | 
						|
        flake8 synapse tests
 | 
						|
 | 
						|
-   **isort**
 | 
						|
 | 
						|
    `isort` ensures imports are nicely formatted, and can suggest and
 | 
						|
    auto-fix issues such as double-importing.
 | 
						|
 | 
						|
    Install `isort` with:
 | 
						|
 | 
						|
        pip install --upgrade isort
 | 
						|
 | 
						|
    Auto-fix imports with:
 | 
						|
 | 
						|
        isort -rc synapse tests
 | 
						|
 | 
						|
    `-rc` means to recursively search the given directories.
 | 
						|
 | 
						|
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
 | 
						|
development workflow. It is not, however, recommended to run `flake8` on
 | 
						|
save as it takes a while and is very resource intensive.
 | 
						|
 | 
						|
## General rules
 | 
						|
 | 
						|
-   **Naming**:
 | 
						|
    -   Use camel case for class and type names
 | 
						|
    -   Use underscores for functions and variables.
 | 
						|
-   **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](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:
 | 
						|
 | 
						|
            from synapse.types import UserID
 | 
						|
            ...
 | 
						|
            user_id = UserID(local, server)
 | 
						|
 | 
						|
        is preferred over:
 | 
						|
 | 
						|
            from synapse import types
 | 
						|
            ...
 | 
						|
            user_id = types.UserID(local, server)
 | 
						|
 | 
						|
        (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`).
 | 
						|
 | 
						|
## Configuration file format
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
Some guidelines follow:
 | 
						|
 | 
						|
-   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.
 | 
						|
-   Each option should be listed in the file with the following format:
 | 
						|
    -   A comment describing the setting. Each line of this comment
 | 
						|
        should be prefixed with a hash (`#`) and a space.
 | 
						|
 | 
						|
        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!
 |