Beginner - Python Library
Beginner - Python Library#
In this section, you will create your own Python library following the Duckietown template.
Step 1: Get the Duckietown library template#
A boilerplate is provided by the library template repository.
The repository contains a lot of files, but do not worry, we will analyze them one by one. Click on the button that reads “Use this template” and then choose “Create a new repository” from the dropdown menu.
This will take you to a page that looks like the following:
Pick a name for your repository (say
my-library) and press the button Create repository from template.
You can replace
my-library with the name of the repository that you prefer.
This will create a new repository and copy everything from the repository
template-library to your new repository. You can now open a terminal and clone your newly created repository.
git clone https://github.com/YOUR_USERNAME/my-library
YOUR_USERNAME in the link above with your GitHub username.
Features of the library template#
We have the following features in our new library:
Unit-tests using Nose.
Building/testing in Docker environment locally.
Integration with CircleCI for automated testing.
Integration with CodeCov for displaying coverage result.
Integration with Sphinx to build code docs. (So far, only built locally.)
Jupyter notebooks, which are run also in CircleCI as tests.
Version bump using Bumpversion.
Code formatting using Black.
Command-line program for using the library.
Anatomy of the library template#
This repository describes a library called “
duckietown_pondcleaner” and there is one command-line tool called
.gitignore: Files ignore by Git.
.dtproject: Enables the project to be built and used by
.bumpversion.cfg: Configuration for bumpversion
Makefile: Build tools configuration with Make
requirements.txt: Contains the pinned versions of your requirement that are used to run tests.
MANIFEST.in: Deselects the tests to be included in the egg.
setup.py: Contains meta information, definition of the scripts, and the dependencies information.
src/- This is the path that you should set as “sources root” in your tool
src/duckietown_pondcleaner: Contains the code.
src/duckietown_pondcleaner/__init__.py: Contains the
src/duckietown_pondcleaner_tests: Contains the tests - not included in the egg.
These are files to build and run a testing container.
.dockerignore: Describes what files go in the docker container.
Dockerfile: The build configuration for the software image
src/conf.py: Sphinx settings
src/index.rst: Sphinx main file
src/duckietown_pondcleaner/index.rst: Documentation for the package
.coveragerc: Options for code coverage.
notebooks: Notebooks that are run also as a test.
notebooks-extra: Other notebooks (not run as test)
notebooks/*.ipynb: The notebooks themselves.
Step 2: Creating your Library#
Using the repo you have already created:
Clone the newly created repository;
Place your Python packages inside
List the python dependencies in the file
Update the appropriate section in the file
Make sure that there are no other remains:
grep -r . pondcleaner
Update the branch names in
Other set up (for admins)#
The following are necessary steps for admins to do:
Activate on CircleCI. Make one build successful.
Activate on CodeCov. Get the
CODECOV_TOKEN. Put this token in CircleCI environment.
Step 3: Using the library template utilities#
Test the code#
Test the code using Docker by:
This runs the test using a Docker container built from scratch
with the pinned dependencies in
This is equivalent to what is run on CircleCI.
To run the tests natively on your pc, use:
To run the tests you will need to have installed the libraries listed in the file
requirements.txt on your computer.
For that we assume you have already set up a Python virtual environment.
To use a Python virtual environment you will need to
pip install virtualenv then
virtualenv duckietown then
source duckietown/bin/activate. In order to install the requirements to run the test do
pip install -r requirements.txt.
In the same virtual environment as above run:
python setup.py develop
This will install the library in an editable way (rather than copying the sources somewhere else).
If you don’t want to install the deps, do:
python setup.py develop --no-deps
For example, this is done in the Dockerfile so that
we know we are only using the dependencies in
requirements.txt with the
exact pinned version.
To add another tests, add files with the name
test_*py in the
duckietown_podcleaner_tests. The name is important.
Make sure that the tests are actually run by looking at the coverage results.
Using the notebooks#
Always clean the notebooks before committing them:
make -C notebooks cleanup
If you don’t think you can be diligent about this, then add the notebooks using Git LFS.
Step 4: Releasing a new version of your library#
Updating the version#
The first step is to change the version and tag the repo.
DO NOT change the version manually; use the CLI tool
The tool can be called by:
make bump # bump the version, tag the tree
If you need to include the version in a new file, list it inside the file
.bumpversion.cfg using the
[bumpversion:file: <FILE_PATH >].