1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
[]
= ["maturin>=1.0,<2.0"]
= "maturin"
[]
= "mrrc"
# The version comes from [workspace.package] in the root Cargo.toml:
# maturin reads src-python/Cargo.toml (manifest-path below), which
# inherits the workspace version.
= ["version"]
= "MRRC: A fast MARC library written in Rust with Python bindings"
= "README.md"
# PEP 639 license expression; the license classifier is omitted per PEP 639.
= "MIT"
= [
{ = "Daniel Chudnov"}
]
= ">=3.10"
= ["marc", "bibliographic", "data", "rust"]
= [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Topic :: Software Development :: Libraries",
"Typing :: Typed",
]
[]
= "https://dchud.github.io/mrrc/"
= "https://dchud.github.io/mrrc/"
= "https://github.com/dchud/mrrc"
= "https://github.com/dchud/mrrc/blob/main/CHANGELOG.md"
= "https://github.com/dchud/mrrc/issues"
[]
# Runtime test dependencies — used by the wheel-test CI workflows via
# `mrrc[test]` so the dep list has a single source of truth and any future
# test dep added here is automatically picked up by CI.
= [
"pytest>=7.0",
"pytest-benchmark>=4.0",
"syrupy>=4.0",
# tomllib is stdlib on 3.11+; tomli is the upstream backport for 3.10.
# The error-coverage harness reads tests/error_coverage.toml at import
# time and falls back to tomli when running under Python 3.10.
"tomli>=2.0; python_version < '3.11'",
]
# Developer tooling (linters, type checkers) on top of the test deps.
# Self-references `mrrc[test]` so the test deps stay listed in exactly one
# place above; pip and uv both resolve self-referential extras correctly.
= [
"mrrc[test]",
"maturin>=1.0,<2.0",
"mypy>=1.0",
"pyright>=1.1",
"ruff>=0.1",
]
= [
"pytest>=7.0",
"pytest-benchmark>=4.0",
"tomli>=2.0; python_version < '3.11'",
]
= [
"mkdocs-material>=9.0",
"mkdocstrings[python]>=0.24",
"pymdown-extensions>=10.0",
]
# pymarc is the oracle the parity tests compare against. Managed as an
# extra so the version is locked in uv.lock and Dependabot bumps it on
# the normal cadence: a pymarc release that changes behavior fails the
# oracle on the bump PR, where the divergence gets adjudicated (adopt
# the new behavior or document the deliberate divergence) instead of
# being discovered by users.
= [
"pymarc>=5.3",
]
[]
= ["mrrc"]
= "mrrc._mrrc"
= "src-python/Cargo.toml"
# Keep repo-operational files (issue tracker, CI config, docs site,
# scratch space) out of the sdist; they are not needed to build or test
# the package from source.
= [
{ = ".beads/**", = "sdist" },
{ = ".github/**", = "sdist" },
{ = ".githooks/**", = "sdist" },
{ = "docs/**", = "sdist" },
{ = "site/**", = "sdist" },
{ = "tmp/**", = "sdist" },
]
[]
= "py310"
# PEP 8's 79-column limit for Python. `ruff format` reflows code to fit;
# CHANGELOG.md keeps its own separate 100-column Markdown lint.
= 79
[]
# Defaults cover only E4/E7/E9 + F; select the broader set so the
# linter actually exercises the code. Both lint.yml and check.sh run
# bare `ruff check`, which picks this configuration up automatically.
= [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # pyflakes
"I", # isort import ordering
"UP", # pyupgrade
"B", # flake8-bugbear
"SIM", # flake8-simplify
"RUF", # ruff-specific rules
]
# Line length is owned by the formatter, not the linter. `ruff format`
# reflows code to the 79-column limit; the only lines it leaves long are
# docstrings, comments, and atomic string literals it won't break.
# Enforcing E501 on top would just nag about those with no autofix, so the
# formatter is the single source of line-length truth.
= ["E501"]
# Characters that look like ASCII but are legitimate content in a
# bibliographic library: en dash and multiplication sign in prose, and
# the ALA-LC romanization modifier letter (ʻ) in MARC test data.
= ["–", "×", "ʻ"]
[]
= ["tests/python"]
= ["test_*.py"]
= ["Test*"]
= ["test_*"]
= [
"benchmark: mark test as a benchmark (deselect with '-m \"not benchmark\"')",
"slow: mark test as slow running (deselect with '-m \"not slow\"')",
]
# Note: benchmark addopts moved to explicit --benchmark-* flags when running benchmarks
# Default runs skip benchmarks for fast feedback
[]
= "3.10"
= true
= true
= false
= false
[]
= "3.10"
= "basic"