Skip to main content

Style checker for manuscripts submitted to the Journal of Statistical Software (JSS).

Project description

jss-style-checker

precision recall F1

Style checker for manuscripts submitted to the Journal of Statistical Software (JSS).

Try it in your browser — no install, nothing uploaded. Pick a folder and it checks the .tex/.ltx/.bib/.Rnw/.Rmd files on the spot, entirely client-side via WebAssembly.

The badges above are refreshed by CI on every push to main: shields.io endpoint JSON derived from the spec-002 precision-history DB and the spec-017 hand-annotated recall corpus.

The package ships:

The same engine also ships as a Rust port, compiled five ways: a standalone binary (jsslint-cli on crates.io), a browser/npm WASM package (jsslint-wasm — the in-browser checker above, source at web/), a native Python extension (jsslint on PyPI), an R package (jsslintr), and a zero-install VS Code extension that runs the WASM in-process (vscode-extension/) — see rust/README.md for how to use each (including how to build and run the web app locally). Both engines produce byte-identical output; that parity is CI-enforced (Constitution §XIII).

Install (development)

python3 -m venv .venv
.venv/bin/pip install -e '.[dev]'
.venv/bin/pip install -e tests/fixtures/stub_journal   # registers the second-journal test fixture

Quick start

Run the linter against a LaTeX (or Sweave .Rnw / R Markdown .Rmd) manuscript and its bibliography. Linting a root file automatically follows \input/\include/\subfile/\bibliography references and lints the whole reachable project (--no-resolve restricts to the named files):

jss-lint paper.tex refs.bib              # author mode, terminal output
jss-lint --mode reviewer paper.tex       # per-category PASS/FAIL/SKIPPED table
jss-lint --output json paper.tex > r.json  # byte-deterministic JSON
jss-lint --output html --mode reviewer paper.tex > r.html
jss-lint --ignore-rules JSS-SRC-001 paper.tex   # suppress a rule
jss-lint --fail-on error paper.tex       # warnings/advisories don't flip CI red
jss-lint --min-confidence medium paper.tex  # skip low-precision heuristic rules
jss-lint --crossref refs.bib             # online: verify missing DOIs
jss-lint --crossref --fix refs.bib       # online: populate missing DOIs

Online DOI lookup (--crossref)

By default the linter is fully offline, so JSS-REFS-003 can only advise that a citeable entry declares a doi field — it can't know whether one exists. Pass --crossref to verify online: each doi-less @article / @book / @inproceedings is looked up on Crossref (matched by title + first-author surname + year), and each CRAN-package @manual gets its registered 10.32614/CRAN.package.* DOI. JSS-REFS-003 then reports the exact DOI to add and suppresses the advisory when no DOI exists. Combine with --fix to write the DOIs straight into the .bib. Add --crossref-mailto you@example.org to use Crossref's faster polite pool. Needs network access; wrong-match-safe (a mismatched year or author is never written).

Every rule carries a measured-precision confidence tier (high / medium / low), sourced from the eval corpus precision history. Medium/low findings are marked in the terminal table and in the JSON confidence field; --min-confidence skips rules below the floor, and --fail-on sets the severity that flips the exit code (default warning: info-severity advisories are reported but don't fail the run). Both are also settable in .jss-lint.toml (min_confidence, fail_on).

To silence a single false positive in place (instead of disabling the whole rule project-wide), add an inline comment on the offending line — or on its own line directly above it:

The sandwich estimator is robust.  % jss-lint: ignore JSS-MARKUP-002
% jss-lint: ignore JSS-CAP-002
\section{Changes from Version 1.2 to 1.3}

A bare % jss-lint: ignore suppresses every rule on the target line; free text after the rule ids is treated as rationale. Parse errors (JSS-PARSE-000) are never suppressed.

Exit codes: 0 clean · 1 violations found · 2 tool could not complete (unknown journal, missing file, parse error, unsupported extension).

For the full invocation contract see specs/001-linter-foundation/contracts/cli.md; for the JSON shape see specs/001-linter-foundation/contracts/json-output.md; for a developer walkthrough see specs/001-linter-foundation/quickstart.md.

Journals

jss-lint discovers journals via the texlint.journals entry-point group. The jss journal ships with the package; third-party packages can register additional journals with zero edits to this repo (Constitution §IV).

The jss journal ships 62 rules across 16 categories — full catalogue with descriptions, severity, JSS-guide §, example violations, and example fixes:

specs/003-jss-rule-catalogue/catalogue.md

The catalogue is generated from catalogue.yaml; edit the YAML and re-render with python -m tools.render_catalogue. From the CLI, jss-lint explain lists every rule one-line at a time; jss-lint explain <RULE-ID> shows the full explanation for one rule.

The eval-jss precision harness (spec 002) is shipped — it enforces Constitution §VI empirically against the pinned corpus under examples/ and the manifest at eval/corpus-manifest.csv. Precision trends land in eval/report.csv as an append-only history; diff it with git log -p eval/report.csv.

Development

Helper scripts activate the project .venv and forward their arguments:

  • scripts/vpy.sh — run Python.
  • scripts/vlint.sh — run ruff (default: ruff check .).
  • scripts/vtest.sh — run pytest. Supports --tail=N and --grep=PATTERN to replace | tail / | grep idioms.

Pre-commit hook.githooks/pre-commit runs ruff check ., the pytest suite (SKIP_PYTEST=1 to opt out per commit), and — when Rust files are staged — cargo fmt --all --check, so the CI gates never see a dirty commit. Activate it once per clone:

git config core.hooksPath .githooks

The hook is lenient when a tool isn't on PATH (skips with a warning) so it doesn't block users who haven't yet run pip install -e .[dev]. See CONTRIBUTING.md for the full gate list.

Mandatory gate (Constitution §IX — 100% branch coverage on every rule module):

.venv/bin/python -m pytest tests/unit/journals/jss/ \
  --cov=src/texlint/journals/jss/rules --cov-branch --cov-fail-under=100

License

MIT — see LICENSE.

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

jss_style_checker-1.1.0.tar.gz (1.6 MB view details)

Uploaded Source

Built Distribution

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

jss_style_checker-1.1.0-py3-none-any.whl (1.3 MB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: jss_style_checker-1.1.0.tar.gz
  • Upload date:
  • Size: 1.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for jss_style_checker-1.1.0.tar.gz
Algorithm Hash digest
SHA256 d64e637db9b9d74294c4b6a7abbcb2be6714eecd7a847e0194b74195967df3dd
MD5 822c26c393d569bb452a176e5984a224
BLAKE2b-256 1e514529161a5dde997fa2b005b3aa2945724c97ff7c37d7b9dd91bcf0877478

See more details on using hashes here.

Provenance

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

Publisher: release-pypkg.yml on kollerma/jss-style-checker

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

File details

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

File metadata

File hashes

Hashes for jss_style_checker-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4ced6ec8797386f56162d004d698eafc209f9c0b6694cab494f28260640cd572
MD5 9000246b0d8d9798c69717651c4a86b8
BLAKE2b-256 f81608709e05764e9622b89db14514a0de79e10cc106012d4ba1a7058f4f1084

See more details on using hashes here.

Provenance

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

Publisher: release-pypkg.yml on kollerma/jss-style-checker

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

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