Skip to main content

MkForge

Programmatic Markdown report generation for Python.

MkForge is a small Python toolkit for building structured, reproducible Markdown reports from code.

It provides composable report primitives such as sections, paragraphs, tables, figures, metadata, checksums, and renderers so automation scripts can produce readable Markdown artifacts without hand-written string assembly.

Use Cases

  • Quality gate reports
  • CI and release summaries
  • Code metrics reports
  • Dependency audit reports
  • Generated technical appendices
  • Reproducible Markdown artifacts for documentation pipelines

Scope

MkForge focuses on generating Markdown documents from structured Python data.

It is not:

  • a Markdown project compiler;
  • a static site generator;
  • a CI runner;
  • a replacement for documentation tools such as MkDocs.

Those tools can use MkForge as their reporting layer.

Installation

uv sync

Development

make check

make check runs formatting, Ruff, Flake8, docstring checks, Mypy, code metrics, security checks, tests, and 100% coverage validation.

For CI-style non-mutating checks:

make ci

For package validation before publishing:

make check-dist

Temporary quality reports are written under work/reports/. Packaging checks build distributions under work/dist/. The work/ directory is kept in the repository with work/.gitkeep.

Example

from mkforge import Chapter, Paragraph, Report, Section, Table

report = Report(
    title="Quality Report",
    metadata={"title": "Quality Report", "tags": ["quality", "ci"]},
    toc=True,
).add(
    Chapter("Summary").add(
        Section("Checks").add(
            Paragraph("All checks passed."),
            Table.from_columns(
                {
                    "Check": ("format", "lint", "tests"),
                    "Status": ("pass", "pass", "pass"),
                },
            ),
        ),
    ),
)

markdown = report.render()

Markdown Verification

from mkforge import verify_markdown

report = verify_markdown("# Title\n\n| A | B |\n| --- | --- |\n")

Verification covers pure Markdown and GitHub Flavored Markdown conformance in a single pass. Custom rule callables can be appended for one verification call without mutating the built-in policy.

Markdown Validation

from mkforge import (
    validate_markdown_chapters,
    validate_markdown_headings,
    validate_markdown_images,
    validate_markdown_yaml,
)

ok = (
    validate_markdown_yaml(markdown, {"draft": False})
    and validate_markdown_chapters(markdown, ("Summary", "Details"))
    and validate_markdown_headings(markdown, ((2, "Summary"), (3, "Checks")))
    and validate_markdown_images(markdown, base_path="docs/report.md")
)

Validation answers project-specific boolean questions: expected YAML frontmatter, required H2 chapters in order, heading level/title sequences, and local or HTTP(S) image existence. Use strict=True for exact YAML keys or exact heading and chapter sequences.

Runnable demos:

uv run python demo_report.py
uv run python demo_verif.py
uv run python demo_validation.py

Heading Slugification

from mkforge import slugify_heading

slugify_heading("Analyse des Risques")  # "analyse-des-risques"
slugify_heading("`code` inline")        # "code-inline"

slugify_heading converts a raw heading title into a GitHub-style anchor slug: lowercase, inline Markdown markers removed, non-alphanumeric runs collapsed to a single hyphen, leading/trailing hyphens trimmed. Unicode letters are preserved (case-folded, not transliterated), which keeps slugs consistent with the anchors GitHub generates for the same heading.

Heading Numbering

from mkforge import renumber_markdown_headings, strip_markdown_heading_numbering

markdown = "# 9. Document\n## 4. Titre 1\n### 8. Tritre niveau 2\n"

strip_markdown_heading_numbering(markdown)
# "# Document\n## Titre 1\n### Tritre niveau 2\n"

renumber_markdown_headings(markdown, start_level=2)
# "# Document\n## 1. Titre 1\n### 1.1. Tritre niveau 2\n"

strip_markdown_heading_numbering and renumber_markdown_headings are pure Markdown helpers for doc-as-code pipelines. They modify only ATX headings outside fenced code blocks, preserve heading levels, and can start numbering at a chosen level with start_level. Use first_number to start a fragment at a later number, and separator to control the text between number and title.

Relationship With Scribpy

MkForge is intended to be independent from Scribpy.

  • mkforge generates Markdown reports from Python data.
  • scribpy assembles and builds Markdown documentation projects.
  • yggtools initializes and runs quality gates for Python packages using uv.

Scribpy and yggtools may depend on MkForge for generated reports, but MkForge should not depend on either of them.

Download files

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

Source Distribution

mkforge-0.5.0.tar.gz (209.9 kB view details)

Uploaded Source

Built Distribution

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

mkforge-0.5.0-py3-none-any.whl (83.4 kB view details)

Uploaded Python 3

File details

Details for the file mkforge-0.5.0.tar.gz.

File metadata

  • Download URL: mkforge-0.5.0.tar.gz
  • Upload date:
  • Size: 209.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mkforge-0.5.0.tar.gz
Algorithm Hash digest
SHA256 61d56208a847cf05403e57f78fcedd164b531c1f088e29744b2455e440b350a8
MD5 ae217414cb18e980f1c0a328d073d297
BLAKE2b-256 129731d8d85391e0e94098e2aa37788e0e9f5b1f45affa4266b31804c61dd5a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for mkforge-0.5.0.tar.gz:

Publisher: publish.yml on antoinebarre/mkforge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mkforge-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: mkforge-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 83.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mkforge-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3daa9ae74281b3f5cd0bfcf3a64db658d701fc1bff2d2197c3f572ffe743ca80
MD5 7e819117b274fb9cf88ea94e98aa54ce
BLAKE2b-256 59362f507466a4a22d367a22e3891b0d23939864359a65e58318eeaf7f164a15

See more details on using hashes here.

Provenance

The following attestation bundles were made for mkforge-0.5.0-py3-none-any.whl:

Publisher: publish.yml on antoinebarre/mkforge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page