Skip to content

Developer Guide

Mohammed Zahid Wadiwale edited this page Dec 12, 2025 · 1 revision

👨‍💻 Developer Guide — Contributing & Local Development

This page explains how to set up a development environment, run ExifPlus locally from source, test, and create pull requests.


1) Clone the repository

git clone https://github.com/ZahidServers/ExifPlus.git
cd ExifPlus

2) Create a virtual environment and install development deps

python3 -m venv .venv
source .venv/bin/activate        # Windows: .venv\Scripts\activate
pip install --upgrade pip
pip install -r requirements.txt  # if exists
pip install -e .

Notes:

  • If requirements.txt is not present, install main deps:

    pip install pyexiv2 hachoir ttkbootstrap exifread Pillow

3) Run the app from source

python -m exifplus
# or
python app.py

This runs the GUI directly using your editable install.


4) Code style & tests

  • Follow PEP8 for Python code.
  • Use flake8 linting (we recommend adding a pre-commit hook).
  • Tests (if any) use pytest. Run:
pytest

5) Packaging & PyPI

  • pyproject.toml or setup.py should contain metadata.
  • Build distributions:
python -m build
  • Upload with twine (make sure version is bumped):
twine upload dist/*

Important: PyPI may reject invalid classifiers or license metadata. Use license = "BSD-3-Clause" and avoid invalid trove classifiers.


6) Documentation

  • Docs live in docs/ (Sphinx). Use pinned Sphinx + theme versions in docs/requirements-docs.txt.
  • To build docs locally:
pip install -r docs/requirements-docs.txt
pip install -e .
sphinx-build -b html docs/ docs/_build/html
  • On ReadTheDocs, mock native libs in docs/conf.py:

    autodoc_mock_imports = ["pyexiv2"]

7) Releasing

  1. Bump package version in exifplus/__init__.py (or pyproject.toml).
  2. Tag git: git tag vX.Y.Z && git push --tags
  3. Build & upload to PyPI.
  4. Create a GitHub release (title: vX.Y.Z) and attach release notes.

8) How to contribute

  • Fork repo → create a feature branch → push → open PR.
  • Include clear description of changes and why.
  • Add tests if the change modifies logic.
  • Keep PR titles and commit messages descriptive.

9) Local debugging tips

  • If GUI crashes on import, move heavy GUI imports into if __name__ == "__main__": or lazily import inside functions to allow module import for tests/docs.
  • Use logging for debug output; avoid print() in library code.

Clone this wiki locally