Packaging your code for ChatterBot¶
There are cases where developers may want to contribute code to ChatterBot but for various reasons it doesn’t make sense or isn’t possible to add the code to the main ChatterBot repository on GitHub.
Common reasons that code can’t be contributed include:
- Licencing: It may not be possible to contribute code to ChatterBot due to a licencing restriction or a copyright.
- Demand: There needs to be a general demand from the open source community for a particular feature so that there are developers who will want to fix and improve the feature if it requires maintenance.
In addition, all code should be well documented and thoroughly tested.
Package directory structure¶
Suppose we want to create a new logic adapter for ChatterBot and add it the Python Package Index (PyPI) so that other developers can install it and use it. We would begin doing this by setting up a directory file the following structure.
IronyAdapter/ |-- README |-- setup.py |-- irony_adapter | |-- __init__.py | |-- logic.py |-- tests |-- |-- __init__.py |-- |-- test_logic.py
More information on creating Python packages can be found here: https://packaging.python.org/tutorials/distributing-packages/
Register on PyPI¶
Create an account: https://pypi.python.org/pypi?%3Aaction=register_form
.pypirc configuration file.
[distutils] index-servers = pypi [pypi] username=my_username password=my_password
python setup.py sdist bdist_wheel
The official tool for uploading Python packages is called twine. You can install twine with pip if you don’t already have it installed.
pip install twine
twine upload dist/*
Install your package locally¶
cd IronyAdapter pip install . --upgrade
Using your package¶
If you are creating a module that ChatterBot imports from a dotted module path then you can set the following in your chat bot.
chatbot = ChatBot( "My ChatBot", logic_adapters=[ "irony_adapter.logic.IronyAdapter" ] )
Testing your code¶
from unittest import TestCase class IronyAdapterTestCase(TestCase): """ Test that the irony adapter allows the chat bot to understand irony. """ def test_irony(self): # TODO: Implement test logic self.assertTrue(response.irony)