Skip to main content

Python docstring-based documentation generator for lazy perfectionists.

Project description

🙌 Handsdown - Python documentation generator

PyPI - Handsdown PyPI - Python Version PyPI - Downloads Build Status Code Coverage Docs

Python docstring-based documentation generator for lazy perfectionists.

Features

  • Material design support!
  • PEP 257, Google, Sphinx and reStructuredText docstrings support. All of them are converted to a valid Markdown.
  • Works with Django and Flask apps
  • Can be used locally, or right on GitHub or even deployed on GitHub Pages and Read the Docs!
  • Signatures for every class, function, property and method.
  • Support for type annotations. Even for the ones from the __future__!
  • Nice list of all modules in Index
  • Gather all scattered README.md in submodules to one place
  • Find related source code from every doc section.
  • Make links by just adding module.import.String to docs.
  • Do you use type annotations? Well, you get auto-discovery of related modules for free!

Do you need handsdown?

You definitely do if you:

  • prefer to automate documentation builds
  • work with a team and plan to simplify knowledge sharing
  • want to show your project without navigating through a source code
  • build Django or Flask applications
  • are proud of your project and not afraid to show it
  • love Open Source

And probably do not if you:

  • not very into docstrings and type annotations
  • like to abstract a documentation away from the way things really are
  • use Pandas docstrings as they are not supported yet

Examples

Usage

💻 From command line

Just go to your favorite project that has lots of docstrings but missing auto-generated docs and let handsdown do the thing.

cd ~/my/project

# build documentation *.md* files in docs/* directory
handsdown

# or provide custom output directory: output_dir/*
handsdown -o output_dir

# generate docs only for my_module, but exclude migrations
handsdown my_module --exclude my_module/migrations

# generate documentation for deployment
handsdown --external `git config --get remote.origin.url` -n ProjectName --branch main --create-configs

Navigate to docs/README.md to check your new documentation!

🚀 Use a new Material design

  • Add mkdocs and mkdocs-material to your dev dependencies or just install them
# generate MarkDown documentation in docsmd folder
handsdown --external `git config --get remote.origin.url` -o docsmd -n <project_name> --theme=material --create-configs

# generate html files to docs folder
python -m mkdocs build

📦 As a Docker image

  • Install Docker
  • Pull latest handsdown version and tag it
docker pull docker.pkg.github.com/vemel/handsdown/handsdown:latest
docker tag docker.pkg.github.com/vemel/handsdown/handsdown:latest handsdown
  • Generate docs for ProjectName in current directory
# for Python 3 project
docker run -v `pwd`:/app handsdown -n ProjectName

# for Python 2 project
PYTHON_VER=2 docker run -v `pwd`:/app handsdown -n ProjectName

# generate documentation for deployment
docker run -v `pwd`:/app handsdown --external `git config --get remote.origin.url` -n ProjectName --create-configs

📝 As a GitHub Pages manager

With --external CLI flag, handsdown generates all required configuration for GitHub Pages, so you just need to setup your GitHub repository.

# Generate documentation that points to main branch
# do not use custom output location, as `GitHub Pages`
# works only with `docs` directory
handsdown --external `git config --get remote.origin.url` --create-configs

# or specify GitHub url directly
handsdown --external https://github.com/<user>/<project> --create-configs
  • Generate documentation with --external flag as shown above, do not use --output flag, only docs folder is supported by GitHub Pages
  • Commit and push all changes a to main branch.
  • Set your GitHub project Settings > GitHub Pages > Source to main branch /docs folder

All set! You can change docs/_config.yml to add your own touch.

With --external flag links to your source are absolute and point to your GitHub repo. If you still want to have relative links to source, e.g. for using docs locally, generate docs to another folder

# `docs_local` folder will be created in your project root
# you probably want to add it to .gitignore
handsdown -o docs_local

🐏 Deploy on Read the Docs

With --external CLI flag, handsdown generates all required configuration for Read the Docs, so you just need to to add your GitHub repository to Read the Docs.

# Generate documentation that points to main branch
# do not use custom output location, as `GitHub Pages`
# works only with `docs` directory
handsdown --external `git config --get remote.origin.url` --create-configs

# or specify GitHub url directly
handsdown --external https://github.com/<user>/<project>/ --create-configs
  • Generate documentation with --external flag as shown above, do not use --output flag, only docs folder is supported by Read the Docs
  • Commit and push all changes a to main branch.
  • Add your repository on Read the Docs

All set! You can change .readthedocs.yml and mkdocs.yml to add your own touch.

📋 Build static HTML

# Generate documentation that points to main branch
# with source links pointing to your repository
# this command also creates `mkdocs.yml`
handsdown --external `git config --get remote.origin.url` --create-configs

# Run mkdocs to build HTML
python -m mkdocs build

🧩 As a module

from handsdown.generator import Generator
from handsdown.utils.path_finder import PathFinder

# this is our project root directory
repo_path = Path.cwd()

# this little tool works like `pathlib.Path.glob` with some extra magic
# but in this case `repo_path.glob("**/*.py")` would do as well
path_finder = PathFinder(repo_path, "**/*.py")

# no docs for tests and build
path_finder.exclude("tests/*", "build/*")

# initialize generator
handsdown = Generator(
    input_path=repo_path,
    output_path=repo_path / 'output',
    source_paths=path_finder.glob("**/*.py")
)

# generate all docs at once
handsdown.generate_docs()

# or generate just for one doc
handsdown.generate_doc(repo_path / 'my_module' / 'source.py')

# generate index.md file
handsdown.generate_index()

# and generate GitHub Pages and Read the Docs config files
handsdown.generate_configs()

# navigate to `output` dir and check results

⌨️ CLI arguments

handsdown [-h] [--exclude [EXCLUDE ...]] [-i INPUT_PATH] [-f [FILES ...]]
  [-o OUTPUT_PATH] [--external REPO_URL] [--source-code-path REPO_PATH]
  [--branch BRANCH] [--toc-depth TOC_DEPTH] [--cleanup] [-n PROJECT_NAME]
  [-e ENCODING] [--panic] [-d] [-q] [-V]
  [include ...]
Argument Description Default
include Path expressions to include source files
--exclude Path expressions to exclude source files
-i / --input-path Path to project root folder
-f / --files List of source files to use for generation. If empty - all are used.
-o / --output-path Path to output folder <cwd>/docs
--external Build docs and config for external hosting, GitHub Pages or Read the Docs. Provide the project GitHub .../blob/main/ URL here.
--source-code-path Path to source code in the project. Overrides --branch CLI argument
--branch Main branch name main
--toc-depth Maximum depth of child modules ToC 3
--cleanup Remove orphaned auto-generated docs
-n / --name Project name <cwd>
-e / --encoding Input and output file encoding utf-8
--panic Panic and die on import error
--debug Show debug messages
--quiet Hide log output
--create-configs Create config files for deployment to RtD and GitHub Pages
-t / --theme Output mkdocs theme readthedocs
-h Show help

Installation

Install using pip from PyPI

pip install handsdown

or directly from GitHub if you cannot wait to test new features

pip install git+https://github.com/vemel/handsdown.git

Development

  • Install poetry
  • Run poetry install
  • Use black formatter in your IDE

Changelog

Changelog can be found in Releases

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

handsdown-2.0.1.tar.gz (50.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

handsdown-2.0.1-py3-none-any.whl (71.8 kB view details)

Uploaded Python 3

File details

Details for the file handsdown-2.0.1.tar.gz.

File metadata

  • Download URL: handsdown-2.0.1.tar.gz
  • Upload date:
  • Size: 50.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.9

File hashes

Hashes for handsdown-2.0.1.tar.gz
Algorithm Hash digest
SHA256 7f9d8bd50406febb9ef889f53fbe35f0891b8900687f2d97ea171f8d69d7bbd2
MD5 ebb13606f9bb3c009c765aba316674fc
BLAKE2b-256 10b2ce58a08084f39cb78a3b544b8f598d90943a0d6d2b438f21690962e11192

See more details on using hashes here.

File details

Details for the file handsdown-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: handsdown-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 71.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.9

File hashes

Hashes for handsdown-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 70fe076d4b2c89e0186bfb11135d4ad2ec32a3661aee7615810a1e5de22d688e
MD5 af9787aef4ec30762c273094729b7df9
BLAKE2b-256 5195831adf2de1b43af81e8f6a410e6801b611ef2a9de2c43f8329c4aed2fb8e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page