Skip to main content

Spintax engine for Python — enumerations, permutations, variables, conditionals, plural agreement, includes. Zero dependencies.

Project description

spintax-core (Python)

A framework-agnostic Spintax engine for Python — parse, render, validate, extract, analyze, and neutralize spintax templates. MIT, zero runtime dependencies, Python 3.10+.

This is the third engine in the Spintax family, and an independent implementation — not a transcription of the others. It is held to the same behavior contract by a shared golden corpus of language-neutral fixtures, which already gates the TypeScript engine and the PHP one. All 168 of them pass here, none skipped, none expected to fail.

Install

pip install spintax-core

Use

from spintax_core import render, validate, parse

render("{Hello|Hi} there!")                        # "Hello there!" or "Hi there!"
render("{Hello|Hi} there!", seed=42)               # same seed, same output, every time
render("Hi %name%!", context={"name": "Sam"})      # "Hi Sam!"

# Reuse a template: parse once, render many.
ast = parse('[<sep=", ">fast|cheap|good]')
[render(ast) for _ in range(3)]
# ['Cheap, fast, good', 'Good, cheap, fast', 'Cheap, good, fast']

# Check a template before you ship it.
[d.code for d in validate("{a|b")]                 # -> ['bracket.unclosed']

Rendering is lenient: malformed markup degrades rather than raising, so a template a non-programmer wrote cannot take a page down.

Syntax — enumerations {a|b}, permutations [a|b], variables %name%, conditionals {?VAR?yes|no}, plural agreement {plural 3: one|few|many}, #set / #def / #include — is documented at spintax.net/docs.

Why

The existing PyPI spintax package is GPLv3 and has not shipped since 2018. GPL blocks commercial adoption; this one is MIT and maintained.

License

MIT. The WordPress plugin remains GPL; MIT/Expat is GPL-compatible.


Part of the 301.st toolset. Product home: spintax.net.

Development

The test suite is the shared golden corpus — the same JSON fixtures the TypeScript and PHP engines are tested against, read from a checkout rather than vendored here. A copy would drift, and a drifting contract is not a contract.

git clone https://github.com/investblog/spintax-js ../spintax-js   # once
python -m venv .venv && .venv/bin/pip install -e . pytest
SPINTAX_FIXTURES=../spintax-js/packages/conformance/fixtures pytest

Without the fixtures the suite fails rather than passing an empty run — a green suite that tested nothing is the most expensive kind of green. The shape of the output is:

N passed, M xfailed, 0 skipped

The two numbers are the milestone tracker: passed grows as the engine does, xfailed is what the corpus still expects and the engine cannot yet do. A skip should never appear — it would mean a case is being neither asserted nor counted.

The xfails are the whole cross-engine contract, waiting on P1–P3. As milestones land, cases turn into real passes with no change to the runner.

If you mutate a source file to check that a test catches it, delete __pycache__ first. Python invalidates bytecode on (mtime, size). A mutation that preserves both — swapping .*? for .+?, say — leaves the stale .pyc in place, so the next run still imports the mutated module after you have restored the file. That produced a failure pointing at correct code, and the obvious response to it would have been to break the code for real.

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

spintax_core-0.1.1.tar.gz (129.6 kB view details)

Uploaded Source

Built Distribution

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

spintax_core-0.1.1-py3-none-any.whl (62.3 kB view details)

Uploaded Python 3

File details

Details for the file spintax_core-0.1.1.tar.gz.

File metadata

  • Download URL: spintax_core-0.1.1.tar.gz
  • Upload date:
  • Size: 129.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for spintax_core-0.1.1.tar.gz
Algorithm Hash digest
SHA256 4c3e8ccb74ad56e90cddaa31ccad0f1d14ad6c61f78e73fa36a1e22e8067bba7
MD5 460e3c92f2ca22357f860d8eeed4b45d
BLAKE2b-256 ed2a4fab82fe219fa07c527bab5ca29503bb7a046fbe72c6a9ccf1fa05a4e243

See more details on using hashes here.

File details

Details for the file spintax_core-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: spintax_core-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 62.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for spintax_core-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1f5919da53345bd2ba52e6a1ae6352f630a47987b07780f7652936d7855e358f
MD5 31b802090e249e2b73f79f1c63e4e108
BLAKE2b-256 df8a6eb9b90e0a2340c4433d32fce6f96cc8377ae3676cbb12888d2f44209622

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