# Developer’s Overview

## Contributing

Contribute to source code, documentation, examples and report issues: https://github.com/hardbyte/python-can

## Creating a Release

- Release from the `master` branch.
- Update the library version in `__init__.py` using semantic versioning.
- Run all tests and examples against available hardware.
- Update CONTRIBUTORS.txt with any new contributors.
- Sanity check that documentation has stayed inline with code. For large changes update `doc/history.rst`
- Create a temporary virtual environment. Run `python setup.py install` and `python setup.py test`
- Create and upload the distribution: `python setup.py sdist bdist_wheel`
- Sign the packages with gpg `gpg --detach-sign -a dist/python_can-X.Y.Z-py3-none-any.whl`
- Upload with twine `twine upload dist/python-can-X.Y.Z*`
- In a new virtual env check that the package can be installed with pip: `pip install python-can==X.Y.Z`
- Create a new tag in the repository.
- Check the release on PyPi and github.

## Code Structure

The modules in `python-can` are:

Module | Description
--- | ---
interfaces | Contains interface dependent code.
bus | Contains the interface independent Bus object.
CAN | Contains modules to emulate a CAN system, such as a time stamps, read/write streams and listeners.
message | Contains the interface independent Message object.
notifier | An object which can be used to notify listeners.
broadcastmanager | Contains interface independent broadcast manager code.