Skip to content

Commit ae9e242

Browse files
adamtheturtleclaude
andcommitted
Lint reStructuredText prose with Vale
Ban em dashes in reStructuredText using the pinned ClearProse Vale style package. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 7ed28d4 commit ae9e242

4 files changed

Lines changed: 44 additions & 0 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,6 @@ secrets.tar
112112
src/*/_setuptools_scm_version.txt
113113

114114
uv.lock
115+
116+
# Vale styles downloaded by ``vale sync``
117+
styles/

.pre-commit-config.yaml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,33 @@ repos:
288288
- *uv_version
289289
stages: [pre-commit]
290290

291+
# Vale enforces prose style rules, such as banning em dashes, in
292+
# reStructuredText files.
293+
# The rules come from the ``ClearProse`` package pinned in ``.vale.ini``,
294+
# which ``vale sync`` downloads into the (gitignored) ``styles``
295+
# directory.
296+
# Vale needs ``rst2html`` from Docutils on the ``PATH`` to parse
297+
# reStructuredText.
298+
- id: vale-sync
299+
name: vale sync
300+
entry: uv run --extra=dev vale sync
301+
language: python
302+
pass_filenames: false
303+
types_or: [rst]
304+
additional_dependencies:
305+
- *uv_version
306+
stages: [pre-commit]
307+
308+
- id: vale
309+
name: vale
310+
entry: uv run --extra=dev vale
311+
language: python
312+
types_or: [rst]
313+
require_serial: true
314+
additional_dependencies:
315+
- *uv_version
316+
stages: [pre-commit]
317+
291318
- id: interrogate
292319
name: interrogate
293320
entry: uv run --extra=dev -m interrogate

.vale.ini

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
StylesPath = styles
2+
MinAlertLevel = error
3+
4+
Packages = https://github.com/adamtheturtle/vale-style-clear-prose/releases/download/v1.0.1/ClearProse.zip
5+
6+
[*.rst]
7+
BasedOnStyles = ClearProse
8+
9+
# Docutils does not know Sphinx roles such as `:ref:`, and renders their
10+
# argument as ordinary prose. Ignoring role syntax keeps target names, which
11+
# are not prose, out of the linter.
12+
TokenIgnores = (:\w+:`[^`]*`)

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ optional-dependencies.dev = [
8484
"towncrier==25.8.0",
8585
"ty==0.0.65",
8686
"types-requests==2.33.0.20260712",
87+
"vale==3.13.0.0",
8788
"vulture==2.16",
8889
"vws-python-mock==2026.8.4.2",
8990
"vws-test-fixtures==2023.3.5",
@@ -286,6 +287,7 @@ ignore = [
286287
".git_archival.txt",
287288
".pre-commit-config.yaml",
288289
".prettierrc",
290+
".vale.ini",
289291
".yamlfmt",
290292
"CHANGELOG.rst",
291293
"ci",

0 commit comments

Comments
 (0)