Skip to main content

Python parser for scry-spec v1.1 markers

Project description

scry-parse

Python parser for the scry-spec marker format. Conformant with scry-spec v1.1.0 (FR4.B Extras Field).

Install

uv pip install scry-parse
# or:
pip install scry-parse

Usage

from scry_parse import (
    parse_markers,
    validate_marker,
    check_cycles,
    mint_id,
    BASELINE_KINDS,
    BASELINE_STATUSES,
    EXTRAS_SIZE_CAP_BYTES,  # FR4.B (v1.1.0)
)

# Parse markers from file content
with open("my_file.md") as f:
    content = f.read()

result = parse_markers(content)

# Access by type
for entry in result.entries:
    print(entry.id, entry.kind, entry.summary)

for anchor in result.anchors:
    print(anchor.name, anchor.description)

for binding in result.bindings:
    print(binding.local_id, binding.ref)

# Or iterate all markers together
for marker in result.markers:
    print(type(marker).__name__, marker)

# Validate a parsed marker
vr = validate_marker(result.entries[0])
if not vr.valid:
    print(vr.errors)
if vr.warnings:
    print(vr.warnings)

# Detect cycles in depends_on relationships (FR12)
cycle_errors = check_cycles(result.entries)
if cycle_errors:
    for err in cycle_errors:
        print(err)  # "cycle detected: design.a~... → design.b~... → design.a~..."

# Generate a new marker ID
entry_id = mint_id("design", "auth-flow")           # random hash
entry_id = mint_id("design", "auth-flow", content)  # deterministic hash from content

Supported comment styles

Comment-prefix detection is automatic via YAML-key inference — no language hint required.

Line comments

Style Example
HTML/Markdown <!-- @scry.entry ... @scry.entry.end -->
Python/Shell # @scry.entry ... # @scry.entry.end
TypeScript/JS // @scry.entry ... // @scry.entry.end
SQL -- @scry.entry ... -- @scry.entry.end
Lisp ;; @scry.entry ... ;; @scry.entry.end

Block comments (v1.0.1+)

Style Example
JSDoc / Java /** @scry.entry ... * @scry.entry.end */ with * continuation
C / C++ /* @scry.entry ... @scry.entry.end */
OCaml (* @scry.entry ... @scry.entry.end *)
Haskell {- @scry.entry ... @scry.entry.end -}
PowerShell <# @scry.entry ... @scry.entry.end #>

Example JSDoc marker:

/**
 * @scry.entry
 * id: design.auth-flow~a1b2c3d4
 * kind: design
 * summary: JWT auth middleware
 * status: active
 * @scry.entry.end
 */

Public API

Symbol Description
parse_markers(content, language=None, file="") Parse all scry markers from text. Returns ParseResult.
validate_marker(marker) Validate a marker against spec rules. Returns ValidationResult.
check_cycles(markers) Detect cycles in depends_on graph. Returns list[str] of error messages.
mint_id(kind, name, content=None) Generate a spec-conformant marker ID.
BASELINE_KINDS Tuple of standard kind values from scry-spec v1.0.
BASELINE_STATUSES Tuple of standard status values (draft, active, deprecated).
EXTRAS_SIZE_CAP_BYTES FR4.B v1.1.0 size cap (4096) for serialized extras payload.

Dataclasses

  • ParseResultentries: list[EntryMarker], anchors: list[AnchorMarker], bindings: list[BindingMarker], markers property (all three combined)
  • EntryMarkerid, kind, summary, status, weight, tags, rationale, applies, seeded_questions, depends_on, implements, supersedes, file, span, extras (FR4.B v1.1.0; dict[str, Any] | None, preserved structurally)
  • AnchorMarkername, description, seeded_questions, file, span
  • BindingMarkerlocal_id, ref, comment, file, offset, span
  • ValidationResultvalid, errors, warnings (FR4.B SHOULD-diagnostics for extras: empty map, nested/list value, oversize)

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

scry_parse-1.1.0.tar.gz (40.1 kB view details)

Uploaded Source

Built Distribution

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

scry_parse-1.1.0-py3-none-any.whl (16.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: scry_parse-1.1.0.tar.gz
  • Upload date:
  • Size: 40.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.10","id":"oracular","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for scry_parse-1.1.0.tar.gz
Algorithm Hash digest
SHA256 481c3f764dc09e1e330bb5c1ebafd4de0355a1b28c51104c51004fb162e7e15e
MD5 9d6a40d0907e2679866645f2b7157d06
BLAKE2b-256 54a87c9cb355e88062d0e473e89d7b7e6270bcf31d3119ce26a9da453df3afbf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: scry_parse-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 16.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.10","id":"oracular","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for scry_parse-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d979c30c773026c1041ba8cce872a1e74400ed8f69061f128afcde47775af519
MD5 7c65b4f04aceaa65ecf33a12ba5efecc
BLAKE2b-256 15b4658bb5e343c93f94b436980a092ceaff75c6a4d484dec5f196831144203c

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