validator/ holds mewslint (lint, css, fetch, DTD/CSS data); directory/ holds the mews.page service (app, db, check, pages, cli) and depends on validator/; quickstart/ holds mews-quickstart and md2mews.py for third parties who want to create Mews content without cloning the repo; spec/ consolidates doc/ and dtd/ with the canonical mews-0.1.css; site/ becomes a Pelican project with the forward-facing pages as Markdown, the check form kept as a raw HTML snippet. Root pyproject.toml is now a virtual uv workspace over validator, directory and quickstart, with cross-cutting tests that span more than one of them staying at the repo root. Makefile and flake.nix updated to match.
44 lines
1.7 KiB
Python
44 lines
1.7 KiB
Python
"""The packaged copies of the stylesheet and the DTD, against their originals.
|
|
|
|
The validator has to find both when it is installed as a wheel with nothing but
|
|
the package on disk, so validator/mews/data holds copies. They must not drift.
|
|
"""
|
|
|
|
from importlib import resources
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
|
|
COPIES = {
|
|
"mews-0.1.css": ROOT / "spec" / "mews-0.1.css",
|
|
"mews-0.1.dtd": ROOT / "spec" / "mews-0.1.dtd",
|
|
}
|
|
|
|
# The Pelican plugin is a separate distributable package, so it carries its own
|
|
# copy of the DTD rather than importing one. It shipped a hand-written
|
|
# placeholder for a while, which silently stripped tables, ordered lists, forms
|
|
# and the body variant class out of every page it produced.
|
|
PLUGIN_DTD = ROOT / "pelican-mews" / "pelican" / "plugins" / "mews" / "dtd" / "mews.dtd"
|
|
|
|
|
|
def test_packaged_copies_match_the_originals():
|
|
for name, original in COPIES.items():
|
|
packaged = resources.files("mews.data").joinpath(name).read_bytes()
|
|
assert packaged == original.read_bytes(), (
|
|
f"validator/mews/data/{name} differs from {original}. "
|
|
"Copy the original over it."
|
|
)
|
|
|
|
|
|
def test_the_spec_quotes_the_same_stylesheet():
|
|
"""SPEC.md 5.1 prints the stylesheet in full; it has to be the same file."""
|
|
spec = (ROOT / "spec" / "SPEC.md").read_text()
|
|
quoted = spec.split("```css\n", 1)[1].split("```", 1)[0]
|
|
assert quoted.strip() == (ROOT / "spec" / "mews-0.1.css").read_text().strip()
|
|
|
|
|
|
def test_the_pelican_plugin_bundles_the_real_dtd():
|
|
canonical = (ROOT / "spec" / "mews-0.1.dtd").read_bytes()
|
|
assert PLUGIN_DTD.read_bytes() == canonical, (
|
|
f"{PLUGIN_DTD} differs from spec/mews-0.1.dtd. Copy the original over it."
|
|
)
|