.. Describes how to do code .. _how_to_code: How To Code =========== Before you start contributing in this project please read and accept our :ref:`C4`. Before you start coding always remember the `Zen of Python `_ by Tim Peters. If you don't know it just type :code:`import this` in an interactive Python interpreter. We strongly encourage you to use any Linux environment to code. WSL on Windows is also possible. The project was never tested on a native Windows system. Package Management ------------------ Use `Poetry `_ for package management. Code Style ---------- - We try to follow the `Google Python Style Guide `_. Exceptions to this guideline are documented below. - Use a formatter (we suggest `Black `_) to comply with our styling guidelines. - Use a linter (we suggest `pylint `_) for static code analysis. These styles are enforced by a tox pipeline running pylint and black that also runs on every pull request on GitHub. **Line length** Maximum line length is 100 characters. **Docstrings** Use docstrings for every module, function or method. We refer to `PEP 257 `_ with following additions: - The tripple quotes (""") are always on a separate line. Even for one-line docstrings. - Docstrings must contain full sentences ending with a period. - There is always a blank line after a docstring. - Doctrings are allowed to span over the full line lenght of 100 characters. **Good Example** .. code-block:: python def good() -> str: """ This is a good example of a docstring. This function simply returns a word and does nothing else. It is just here for demonstation purposes and has no productive effect. Just ignore it. """ return "Good" **Bad Example** .. code-block:: python def bad() -> str: """bad example This function simply returns a word and does nothing else. It is just here for demonstation purposes and has no productive effect. ignore it""" return "Bad" Type checking ------------- Use `Mypy `_ for static type checking. Always annotate your types. Mypy will remind you if you accidentally forget it. Because we annotate our types we do not add the types again in any docstrings. **Good Example** .. code-block:: python from typing import Any def good(a: int, b: int, c: dict[str, Any]) -> str: """ This is a good example. Args: a: A number b: Another number c: A dictionary containing stuff of different types Returns: The sum of the two numbers a and b as string """ # do something some_weird_object = WeirdClass(c) # type: ignore # do more things return str(a + b) **Bad Example** .. code-block:: python def bad(a, b): """ This is a bad example. Args: a (int): A number b (int): Another number Returns: (str) The sum of the two numbers """ return str(a + b) If it gets too complicated you're allowed to use ``# type: ignore`` or type ``Any`` but use it rarely and with caution. Testing ------- Use `Pytest `_ for code testing and test coverage measurement. We seek a coverage of at least 90%. You'll find more detailed information about writing tests in our :ref:`how_to_test` documentation. Test Automation --------------- Use `Tox `_ for test automation. Whenever you did some changes you wish to publish run :code:`tox` before any merge request. Every merge request which does not pass all tests will be rejected. Release ------- Periodically the maintainers decide to create a new release. If you did some breaking changes which are worth a new release just ask one of them. The process is documented in our :ref:`how_to_release` documentation.