Skip to main content

✂️ Snipwise

release pytest zensical PyPI Version PyPI - Python Version LGPL-3 License

Snipwise keeps text snippets in sync across files in a project. Provide a single source of truth for a fragment, and Snipwise will copy it into every README, documentation page or configuration file that repeats it, so that no copy has to be updated manually.

It is generally preferable to avoid redundant information, but sometimes it is unavoidable. The same paragraph on supported Python versions may belong in the README and in the documentation, and the same project summary may be required by several metadata formats. Snipwise works with any text format, because you write the markers yourself in the comment syntax of the file at hand. As a pre-commit hook, it keeps every commit consistent instead of leaving stale copies adrift until somebody notices.

Simple Example

Snipwise is configured by a snipwise.md file in the root of your project. This example shows how to define a snippet in snipwise.md and copy it into the README.md and docs/installation.md files.

# Snipwise Configuration

```toml
[[targets]]
patterns = ["README.md", "docs/*.md"]
```

## `python-versions`

```text
Snipwise requires Python 3.11 or later.
It is tested on Python 3.11, 3.12, 3.13 and 3.14.
```

Both README.md and docs/installation.md then contain a pair of markers:

<!-- snipwise.md BEGIN python-versions -->
<!-- snipwise.md END python-versions -->

Running snipwise fix writes the snippet between each pair of markers:

<!-- snipwise.md BEGIN python-versions -->
Snipwise requires Python 3.11 or later.
It is tested on Python 3.11, 3.12, 3.13 and 3.14.
<!-- snipwise.md END python-versions -->

From then on, snipwise reports any file that has drifted away from snipwise.md, and snipwise fix brings it back in line. The snippet is stored in three places, but only the copy in snipwise.md is meant to be edited. The others are verified (and fixed) mechanically.

The basic idea is simple, but Snipwise also packs a number of convenient features for when this simple approach falls short:

  • A snippet may be transformed on its way into a file, so that it can serve different file formats, such as Markdown, LaTeX, plain text or source code.
  • A file that cannot carry a comment can be reached with a regular expression or with a JSON pointer instead of a marker.
  • If a snippet is naturally defined by a specific file, there is no need to copy it into snipwise.md.

Installation

pip install snipwise

Documentation

The documentation lives at https://reproducible-reporting.github.io/snipwise/.

Start with these pages, the first three of which together are the reference for what Snipwise does:

  • The snipwise.md Configuration File defines snippets and says which files receive them, in what shape, and which copy is the original.
  • Snippet Scanners covers the four ways a rule finds the regions of a file that it owns: the whole file, markers, a regular expression, or a JSON pointer.
  • Command-Line Interface covers the subcommands, the options, the exit codes and the pre-commit hook.
  • Snipwise in Practice discusses good practices, starting with which text is worth turning into a snippet.

For the development of Snipwise itself:

Example Repositories

The following repositories use Snipwise to keep various snippets in sync:

  • Snipwise itself uses snipwise.md to synchronize the list of dependencies and several sections shared by the README and the documentation home page.
  • StepUp Core uses snipwise.md to synchronize a tagline, abstract and keywords across several files.

Related Tools

Snipwise only copies text that you maintain by hand, and it never generates anything. That is a deliberate limit, so here is where to look when that limitation gets in the way.

  • To embed the output of a program, Cog runs a piece of Python and writes what it prints back into the file that holds it. embedme pulls the content of a source file into a fenced code block of a Markdown document.
  • To instantiate a project from a template, and to keep it in step with that template later, there are Cookiecutter and Copier. Snipwise has nothing to say about a file until that file carries markers of its own.
  • To include a fragment while a documentation site is built, there are the snippets extension of PyMdown Extensions for MkDocs, and the include and literalinclude directives of Sphinx. What differs is where the text ends up. Those mechanisms resolve during a build, so the text exists only in the generated site, while Snipwise writes it into the file itself, where GitHub, PyPI and a plain text editor all show it.

License

Snipwise is distributed under the terms of the LGPL-3.0-or-later license. Logo based on Google Noto Emoji, licensed under SIL OFL 1.1

Download files

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

Source Distribution

snipwise-1.1.0.tar.gz (565.3 kB view details)

Uploaded Source

Built Distribution

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

snipwise-1.1.0-py3-none-any.whl (67.8 kB view details)

Uploaded Python 3

File details

Details for the file snipwise-1.1.0.tar.gz.

File metadata

  • Download URL: snipwise-1.1.0.tar.gz
  • Upload date:
  • Size: 565.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for snipwise-1.1.0.tar.gz
Algorithm Hash digest
SHA256 71141a514c410ef1bd6372c832aefc0b95eee52edeb61a749a406777777b6e0f
MD5 bbf63da063dd42e9b8e9839d5f6e1ace
BLAKE2b-256 254225c5b596de8b67fe1136978dba56fa469328f634ffd13f2a0efff43803d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for snipwise-1.1.0.tar.gz:

Publisher: release.yaml on reproducible-reporting/snipwise

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

File details

Details for the file snipwise-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: snipwise-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 67.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for snipwise-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6cca2594d5d6add1cae279a87fc6e1cc1f0aff78e7b36902d617dd4eb5191c35
MD5 2673f2ef89d0fd7112336a4acfd63118
BLAKE2b-256 e9693321f20df04a53c0ff0181de297814908be885dcf8bc67b3aae45f029451

See more details on using hashes here.

Provenance

The following attestation bundles were made for snipwise-1.1.0-py3-none-any.whl:

Publisher: release.yaml on reproducible-reporting/snipwise

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

1.1.0 This release

2 files

1.0.1

2 files

1.0.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