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 three ways a rule finds the regions of a file that it owns: 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:

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.0.1.tar.gz (559.8 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.0.1-py3-none-any.whl (66.4 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for snipwise-1.0.1.tar.gz
Algorithm Hash digest
SHA256 22b45f852ef0e88f62b2227250d3389bb19bcce97026723995bc147ac997c465
MD5 b10efbbcfeb88093b86f485ca1363a94
BLAKE2b-256 2cab233e68880e94dea70ccea92121e86335b632f3b72715664910627b2d1d74

See more details on using hashes here.

Provenance

The following attestation bundles were made for snipwise-1.0.1.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.0.1-py3-none-any.whl.

File metadata

  • Download URL: snipwise-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 66.4 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.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1430234a42daf825e264ff1e54628b536bebc389c789fcbdb457a95d89f194ef
MD5 f725e6d9cdab1167e9734a445e34853a
BLAKE2b-256 b05286b4760f568b229a6f5ad4c9aa3f692e73a43583b57883bdf41647e6b905

See more details on using hashes here.

Provenance

The following attestation bundles were made for snipwise-1.0.1-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

1.1.0

2 files

This release

1.0.1 This release

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