Code Guidelines =============== Unit Tests ---------- We use pytest although some of the older tests are in Python `unittest` format. Avoid making any calls to internet services in your unit tests. If your feature connects to a live service, make sure that your unit tests mock the sample responses expected. We use httpx for all our http requests - you can use `respx `__ to mock http responses (search for "@respx" in our tests to see examples of how this works). Ensure your contribution has the highest possible of test coverage. You should aim for a least 80% coverage and ideally reach 100%. If you can't reach 80% for what ever reason let us know when you raise a PR and we can work with you on this. You can map your test coverage using the following command: .. code:: bash pytest --cov=msticpy --cov-report=html This will create a folder called htmlcov in your current directory. Open the index.html file in this folder to see the coverage report. You can also execute a subset of tests and check the coverage for the areas of code that you are interesting in testing. .. code:: bash pytest --cov=msticpy.data.drivers --cov-report=html tests/data/drivers/test_xyz_driver.py Type hints ---------- Use type annotations for parameters and return values in public methods, properties and functions. .. code:: python from typing import Any, Dict, Optional, Union ... def build_process_tree( procs: pd.DataFrame, schema: Union[ProcSchema, Dict[str, Any]] = None, show_summary: bool = False, debug: bool = False, **kwargs, ) -> pd.DataFrame: """ Build process trees from the process events. `Python Type Hints documentation `__ Docstrings ---------- Our documentation is automatically built for Readthedocs using Sphinx. All public modules, functions, classes and methods should be documented using the numpy documenation standard. .. code:: python def build_process_tree( procs: pd.DataFrame, schema: Union[ProcSchema, Dict[str, Any]] = None, show_summary: bool = False, debug: bool = False, **kwargs, ) -> pd.DataFrame: """ Build process trees from the process events. Parameters ---------- procs : pd.DataFrame Process events (Windows 4688 or Linux Auditd) schema : Union[ProcSchema, Dict[str, Any]], optional The column schema to use, by default None. If supplied as a dict it must include definitions for the required fields in the ProcSchema class If None, then the schema is inferred show_summary : bool Shows summary of the built tree, default is False. debug : bool If True produces extra debugging output, by default False Returns ------- pd.DataFrame Process tree dataframe. See Also -------- ProcSchema """ `numpy docstring guide `__ Code Formatting --------------- We use black everywhere and enforce this in the build. `Black - The Uncompromising Code Formatter `__ Linters/Code Checkers --------------------- We use the following code checkers: - pylint: ``pylint msticpy`` - mypy: ``mypy msticpy`` - bandit: ``bandit -r -lll -s B303,B404,B603,B607 msticpy`` - flake8: ``flake8 --max-line-length=90 --ignore=E501,W503 --exclude tests`` - pydocstyle: ``pydocstyle --convention=numpy msticpy`` - isort: ``isort --profile black msticpy`` Pre-Commit ---------- We have a pre-commit configuration in the msticpy repo. This runs the checks above (apart from mypy) when you commit. See `Pre-Commit Script `__ for more details. VSCode support -------------- See this page for task definitions to run `linters/checkers in VSCode `__ Create a branch --------------- Before you submit a PR, create working branch in your fork and put your changes in that. It's going to make it easier for you to re-sync the main branch if this gets updated while you are working on your changes. See also -------- - `Good coding guidelines `__ - `VS Code build tasks `__ - `Using Pre-commit `__ A musical guide --------------- `The PEP8 Song `__ Brilliantly written and performed by [@lemonsaurus_rex](https://twitter.com/lemonsaurus_rex)