Contributor’s Guide#
Here are some useful notes about DNIKit development.
Development Installation#
Development Branch#
The current development branch is develop. Direct pushes to this branch are not allowed. For all contributions, branch from and send pull requests to this branch.
Clone the Code#
Clone the code from the main repository:
git clone git@github.com:apple/dnikit.git
Install DNIKit from Local Code#
Install python version 3.9 (recommended). To run TensorFlow1, install Python 3.7.
MacOS: The Python installer package can be downloaded from the Python.org website. During installation, deselecting GUI applications, UNIX command-line tools, and Python documentation will reduce the size of what is installed.
Ubuntu:
sudo apt install -y python3.9-dev python3.9-venv python3.9-tk
sudo apt-get install -y libsm6 libxext6 libxrender-dev libgl1-mesa-glx
Create and activate a python 3.9 virtual environment, then update pip and wheel:
python3.9 -m venv .venv39 source .venv39/bin/activate pip install --upgrade pip wheel
Checkout the branch to install from (like our development branch,
develop
).Install DNIKit and other requirements for development:
make install
This will install dnikit[notebook,test,doc,tensorflow,dataset-report,image,dimreduction,duplicates]
.
To install TF1-compatible code, try:
make install-tf1
Or for TF1 GPU:
make install-tf1-gpu
Start using DNIKit! For example:
# import DNIKit Components like this: from dnikit.introspectors import PFA
To uninstall:
make uninstall
(Optional) Install Git Large File Storage (LFS)#
To track large files and binaries, DNIKit uses Git LFS, which replaces the actual file and history with a text pointer, and stores the file contents on GitHub.
Follow the installation instructions (download binary, or install via Homebrew), and then set up with:
git lfs install
Currently, tracked via .gitattributes, the DNIKit LFS files are:
.png
.jpg
.jpeg
.gif
These files are used in the docs (e.g., this page!), as well as the notebook examples. To add another large file (e.g. .mp4, small model), please track them with git lfs via:
# all files with extension
git lfs track "*.<extension>"
Or:
# One specific file
git lfs track "<specific_file>"
And make sure to commit any changes to the .gitattributes
.
Writing Code#
Updating & Building the Docs#
The DNIKit docs are built with Sphinx.
Update dev environment#
1. If DNIKit was installed with make install
, the developer’s installation, all
Sphinx dependencies for building the docs will
already be installed. If DNIKit was installed via pypi & pip, install documentation requirements via:
pip install "dnikit[doc]"
Install pandoc.
Doc Structure#
All code for docs is stored in the docs/
folder:
api/
: all API docsdev/
contributing: Developer’s guide for installing and contributing back to DNIKit
general/
: intro / start pagesinstallation: full DNIKit installation
support: how to get support on DNIKit
example_notebooks: quick links to all example notebooks
how_to/
: guides on some the fundamental DNIKit conceptsconnect_data: how to connect data into DNIKit
connect_model: how to load model into a DNIKit pipeline
introspect: understand DNIKit “introspect”
img/
: graphics (.png, .gif, .jpg, .jpeg currently tracked with git lfs)introspectors/
: algorithm pages for the various DNIKit introspectorsreference/
:changelog: link to CHANGELOG.md
how_to_cite: information for citing DNIKit + its various algorithms
utils/
: API reference for certain DNIKit componentsdata_producers: all built-in producers
pipeline_stages: useful pipeline stages (including processors)
conf.py
: Sphinx configuration file, with Sphinx extensions used (like Napoleon)index.rst
: main landing pageMakefile
: Sphinx build docs
Editing the Docs#
All docs use .rst
format. A nice cheat sheet can be found
here.
Messing with the table of contents and side bar can be tricky, beware. When making modifications for the sidebar,
use a clean build and remove the _build
directory first. Warning: a clean build will also re-run all
the notebooks from scratch, which can be quite time consuming.
Build docs locally#
From the base dnikit
directory run:
make doc
Open docs/_build/html/index.html
.
Alternatively, inside the docs folder, the following can be run directly:
make html
Tests#
Writing Tests#
Follow the existing examples in the codebase to add new tests. For help with pytest, check out this tutorial.
Running Tests#
This project uses pytest and pytest extensions as follows:
Tool |
Purpose |
Configuration File |
---|---|---|
Unit testing. |
||
mypy (via pytest-mypy) |
Typed static code analysis. |
|
flake8 (via pytest-flake8) |
PEP8 compliance testing. |
part of pytest.ini |
coverage (via pytest-cov) |
Code coverage report generation. |
Run all tests:
make test
Run tests on wheels:
make test-wheel
Run static type check on notebooks:
make test-notebooks
Remove all generated files:
make clean
Submitting a Pull Request#
A new pull request requires checking off the following list:
I’ve searched through existing Pull Requests and can confirm my PR has not been previously submitted.
I’ve written new tests for my core changes, as applicable.
I’ve tested all tests (including my new additions) with
make test
.I’ve updated documentation as necessary and verified that the docs build and look nice.
My PR is of reasonable size for someone to review. (You may be asked to break it up into smaller pieces if it is not.)