echr-py 0.2.0__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {echr_py-0.2.0 → echr_py-0.2.2}/CITATION.cff +5 -1
- {echr_py-0.2.0/echr_py.egg-info → echr_py-0.2.2}/PKG-INFO +46 -47
- {echr_py-0.2.0 → echr_py-0.2.2}/README.md +45 -46
- {echr_py-0.2.0 → echr_py-0.2.2/echr_py.egg-info}/PKG-INFO +46 -47
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/__init__.py +1 -1
- {echr_py-0.2.0 → echr_py-0.2.2}/pyproject.toml +1 -1
- {echr_py-0.2.0 → echr_py-0.2.2}/LICENSE +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/MANIFEST.in +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/RIGHTS.md +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/SECURITY.md +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/echr_py.egg-info/SOURCES.txt +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/echr_py.egg-info/dependency_links.txt +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/echr_py.egg-info/entry_points.txt +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/echr_py.egg-info/requires.txt +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/echr_py.egg-info/top_level.txt +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/_aio.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/_sync.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/bundle.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/corpus.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/ecli.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/reconcile.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/rescue.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/cache/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/cache/store.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/artifacts.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/authority.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/benchmarks.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/catalog.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/extractor.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/graph.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/metrics.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/models.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/occurrences.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/paragraphs.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/reporter.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/resolver.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/cli.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/config.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/citation_authority.csv +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/citation_authority.json +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/citation_authority_eng.csv +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/citation_authority_eng.json +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/citation_authority_supplements.json +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/historical_citation_catalog.json +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/kpthesaurus_eng.json +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/_sync.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/aio.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/bridge.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/client.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/collections.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/downloader.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/imports.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/queries.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/raw_download.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/related_scraper.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/textract.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/extractors/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/extractors/base.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/adapters.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/assets/LICENSE-D3.txt +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/assets/d3.v7.min.js +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/export.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/models.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/template.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/gui/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/gui/app.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/llm/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/llm/base.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/llm/batch.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/llm/client.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/llm/providers.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/browse.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/codebook.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/export.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/paragraphs.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/registry.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/search.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/client.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/downloader.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/dsl.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/queries.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/url.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/mcp/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/mcp/__main__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/mcp/install.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/mcp/server.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/case.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/citation.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/common.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/document.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/exec_case.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/exec_document.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/version.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/pipeline/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/pipeline/runner.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/pipeline/validation.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/retrieval/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/retrieval/benchmark.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/retrieval/embeddings.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/retrieval/hybrid.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/retrieval/providers.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/batch.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/hooks.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/jobs.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/models.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/runner.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/schemas/citation-use-minimal.json +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/schemas/citation-use-multiaxial.json +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/spec.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/taxonomies.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/composition.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/conversion.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/dispositive.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/judges.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/opinions.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/segmentation.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/spine.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/thesaurus.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/utils/__init__.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/utils/downloads.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/utils/jsonl.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/utils/retry.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/utils/runlog.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/versions.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/release-requirements.txt +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/scripts/check_sdist.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/scripts/check_wheel.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/scripts/public_package_files.txt +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/scripts/public_payload_hashes.json +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/scripts/verify_release.py +0 -0
- {echr_py-0.2.0 → echr_py-0.2.2}/setup.cfg +0 -0
|
@@ -5,7 +5,7 @@ type: software
|
|
|
5
5
|
authors:
|
|
6
6
|
- family-names: Ridi
|
|
7
7
|
given-names: Niccolo
|
|
8
|
-
version: 0.2.
|
|
8
|
+
version: 0.2.2
|
|
9
9
|
date-released: 2026-08-21
|
|
10
10
|
license: MIT
|
|
11
11
|
repository-code: "https://github.com/niccoloridi/echr-py"
|
|
@@ -29,3 +29,7 @@ references:
|
|
|
29
29
|
- type: other
|
|
30
30
|
value: "803981"
|
|
31
31
|
description: "European Research Council grant agreement"
|
|
32
|
+
- type: grant
|
|
33
|
+
title: "King's Digital Futures Institute Fellowship"
|
|
34
|
+
authors:
|
|
35
|
+
- name: "King's College London"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: echr-py
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Pythonic acquisition of HUDOC and HUDOC-EXEC metadata and source documents for ECtHR research.
|
|
5
5
|
Author-email: Niccolo Ridi <niccoloridi@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -102,7 +102,7 @@ Dynamic: license-file
|
|
|
102
102
|
<a href="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml"><img src="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
103
103
|
<img src="https://img.shields.io/badge/python-3.11%E2%80%933.14-3776AB.svg" alt="Python 3.11–3.14">
|
|
104
104
|
<a href="https://github.com/niccoloridi/echr-py/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="MIT license"></a>
|
|
105
|
-
<img src="https://img.shields.io/badge/version-0.2.
|
|
105
|
+
<img src="https://img.shields.io/badge/version-0.2.2-blue.svg" alt="Version 0.2.2">
|
|
106
106
|
</p>
|
|
107
107
|
|
|
108
108
|
`echr-py` is a research engineering toolkit for the case law of the European
|
|
@@ -128,12 +128,24 @@ run it hydrated nine documents and wrote 478,151 characters of source-ordered
|
|
|
128
128
|
text in about 1.1 seconds at concurrency twelve, with the exact query,
|
|
129
129
|
settings, item IDs, hashes, and elapsed time recorded alongside the figure.
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
One inspectable chain runs from a HUDOC record to a verified paragraph edge.
|
|
132
|
+
Each stage keeps its own identity, so a later stage never overwrites an earlier
|
|
133
|
+
one:
|
|
132
134
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
135
|
+
| Stage | Identity retained at that stage |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| HUDOC record | item ID, ECLI, language, source checksum |
|
|
138
|
+
| Legal spine | canonical sections, stable block IDs, paragraph addresses, typography |
|
|
139
|
+
| Source identity | majority, individual opinion, footnote, invoking paragraph |
|
|
140
|
+
| Citation occurrence | exact printed span, supporting evidence, pinpoint ownership |
|
|
141
|
+
| Exact target | cited document, cited application, or an explicit unresolved scope |
|
|
142
|
+
| Target paragraph | printed pinpoint mapped to a verified block in the cited document |
|
|
143
|
+
|
|
144
|
+
That is the central idea: retain enough structure and provenance to move from a
|
|
145
|
+
public HUDOC record to a multilingual paragraph, a printed citation occurrence,
|
|
146
|
+
an exact target document, and, when the source supplies a pinpoint, a verified
|
|
147
|
+
target paragraph. Deterministic identity and graph layers stay separate from
|
|
148
|
+
optional, evidence-verified labels.
|
|
137
149
|
|
|
138
150
|
## Start here
|
|
139
151
|
|
|
@@ -483,7 +495,7 @@ without cloning the repository:
|
|
|
483
495
|
|
|
484
496
|
```bash
|
|
485
497
|
claude mcp add --scope user --transport stdio echr-py -- \
|
|
486
|
-
"$(command -v uvx)" --from 'echr-py[mcp]==0.2.
|
|
498
|
+
"$(command -v uvx)" --from 'echr-py[mcp]==0.2.2' echr-py mcp
|
|
487
499
|
claude mcp get echr-py
|
|
488
500
|
```
|
|
489
501
|
|
|
@@ -566,48 +578,33 @@ and graphs without mutating external state. Study jobs require an explicit
|
|
|
566
578
|
`--enable-jobs` launch configuration with permitted roots, provider and hook
|
|
567
579
|
allowlists, pricing, and per-job budgets.
|
|
568
580
|
|
|
569
|
-
##
|
|
581
|
+
## See also
|
|
570
582
|
|
|
571
|
-
|
|
572
|
-
projects:
|
|
583
|
+
Other projects working on ECtHR material:
|
|
573
584
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
they are not an exhaustive citation inventory or a target-paragraph graph. The
|
|
590
|
-
annotation frame deliberately omits submissions, general-principles material,
|
|
591
|
-
facts, procedure, operative text, appendices, individual opinions, and
|
|
592
|
-
footnotes. A full `echr-py` run can therefore return citation occurrences from
|
|
593
|
-
sections and components outside that annotation frame.
|
|
594
|
-
|
|
595
|
-
In the frozen 115-document comparison, `echr-py` aligned 5,319 of 5,425
|
|
596
|
-
selected ECHR annotations one-to-one (98.0%): 5,316 by strict source-span
|
|
597
|
-
overlap and three by uniquely normalized context, with 86 ambiguous and 20
|
|
598
|
-
unmatched annotations. These figures measure recovery of the selected
|
|
585
|
+
- [HUDOC Researcher](https://doi.org/10.5281/zenodo.21319704)
|
|
586
|
+
- [`echr-extractor`](https://pypi.org/project/echr-extractor/)
|
|
587
|
+
- [ECHR Open Data](https://echr-opendata.eu/)
|
|
588
|
+
- [Mumford et al.](https://doi.org/10.3233/FAIA251584)
|
|
589
|
+
- [ECtHR-PCR](https://github.com/TUMLegalTech/ECHR-PCR)
|
|
590
|
+
|
|
591
|
+
## Benchmark
|
|
592
|
+
|
|
593
|
+
`echr-py` is compared against the curated Mumford annotation set. Those
|
|
594
|
+
annotations are useful for studying selected citation treatments; they are not
|
|
595
|
+
an exhaustive citation inventory or a target-paragraph graph. The annotation
|
|
596
|
+
frame deliberately omits submissions, general-principles material, facts,
|
|
597
|
+
procedure, operative text, appendices, individual opinions, and footnotes, so a
|
|
598
|
+
full `echr-py` run can return citation occurrences from sections and components
|
|
599
|
+
outside that frame. Any recovery figure measures recovery of those selected
|
|
599
600
|
annotations, not detector precision or completeness over the judgments.
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
importer and methodological comparison remain available for researchers who
|
|
608
|
-
need them, but benchmark mechanics belong in the
|
|
609
|
-
[methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md), not on the project
|
|
610
|
-
homepage.
|
|
601
|
+
|
|
602
|
+
The importer and the methodological comparison remain available for researchers
|
|
603
|
+
who need them, and the measured figures, denominators, hashes and reproduction
|
|
604
|
+
records are kept in the
|
|
605
|
+
[methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md)
|
|
606
|
+
and the frozen [benchmark manifest](https://github.com/niccoloridi/echr-py/blob/main/docs/benchmarks/mumford-full-inclusive-audit.json),
|
|
607
|
+
where they can carry their conditions, rather than on the project homepage.
|
|
611
608
|
|
|
612
609
|
The evidence and dates behind external comparisons are maintained in the
|
|
613
610
|
[claim audit](https://github.com/niccoloridi/echr-py/blob/main/docs/claim-audit.md).
|
|
@@ -678,6 +675,8 @@ This research forms part of the Human Rights Nudge project that has received
|
|
|
678
675
|
funding from the European Research Council (ERC) under the European Union’s
|
|
679
676
|
Horizon 2020 research and innovation programme (Grant agreement No. 803981).
|
|
680
677
|
|
|
678
|
+
This work was also supported by a King’s Digital Futures Institute Fellowship.
|
|
679
|
+
|
|
681
680
|
## Data responsibility
|
|
682
681
|
|
|
683
682
|
HUDOC and HUDOC-EXEC are evolving public systems. Preserve item IDs, ECLIs,
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
<a href="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml"><img src="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
15
15
|
<img src="https://img.shields.io/badge/python-3.11%E2%80%933.14-3776AB.svg" alt="Python 3.11–3.14">
|
|
16
16
|
<a href="https://github.com/niccoloridi/echr-py/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="MIT license"></a>
|
|
17
|
-
<img src="https://img.shields.io/badge/version-0.2.
|
|
17
|
+
<img src="https://img.shields.io/badge/version-0.2.2-blue.svg" alt="Version 0.2.2">
|
|
18
18
|
</p>
|
|
19
19
|
|
|
20
20
|
`echr-py` is a research engineering toolkit for the case law of the European
|
|
@@ -40,12 +40,24 @@ run it hydrated nine documents and wrote 478,151 characters of source-ordered
|
|
|
40
40
|
text in about 1.1 seconds at concurrency twelve, with the exact query,
|
|
41
41
|
settings, item IDs, hashes, and elapsed time recorded alongside the figure.
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
One inspectable chain runs from a HUDOC record to a verified paragraph edge.
|
|
44
|
+
Each stage keeps its own identity, so a later stage never overwrites an earlier
|
|
45
|
+
one:
|
|
44
46
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
| Stage | Identity retained at that stage |
|
|
48
|
+
| --- | --- |
|
|
49
|
+
| HUDOC record | item ID, ECLI, language, source checksum |
|
|
50
|
+
| Legal spine | canonical sections, stable block IDs, paragraph addresses, typography |
|
|
51
|
+
| Source identity | majority, individual opinion, footnote, invoking paragraph |
|
|
52
|
+
| Citation occurrence | exact printed span, supporting evidence, pinpoint ownership |
|
|
53
|
+
| Exact target | cited document, cited application, or an explicit unresolved scope |
|
|
54
|
+
| Target paragraph | printed pinpoint mapped to a verified block in the cited document |
|
|
55
|
+
|
|
56
|
+
That is the central idea: retain enough structure and provenance to move from a
|
|
57
|
+
public HUDOC record to a multilingual paragraph, a printed citation occurrence,
|
|
58
|
+
an exact target document, and, when the source supplies a pinpoint, a verified
|
|
59
|
+
target paragraph. Deterministic identity and graph layers stay separate from
|
|
60
|
+
optional, evidence-verified labels.
|
|
49
61
|
|
|
50
62
|
## Start here
|
|
51
63
|
|
|
@@ -395,7 +407,7 @@ without cloning the repository:
|
|
|
395
407
|
|
|
396
408
|
```bash
|
|
397
409
|
claude mcp add --scope user --transport stdio echr-py -- \
|
|
398
|
-
"$(command -v uvx)" --from 'echr-py[mcp]==0.2.
|
|
410
|
+
"$(command -v uvx)" --from 'echr-py[mcp]==0.2.2' echr-py mcp
|
|
399
411
|
claude mcp get echr-py
|
|
400
412
|
```
|
|
401
413
|
|
|
@@ -478,48 +490,33 @@ and graphs without mutating external state. Study jobs require an explicit
|
|
|
478
490
|
`--enable-jobs` launch configuration with permitted roots, provider and hook
|
|
479
491
|
allowlists, pricing, and per-job budgets.
|
|
480
492
|
|
|
481
|
-
##
|
|
493
|
+
## See also
|
|
482
494
|
|
|
483
|
-
|
|
484
|
-
projects:
|
|
495
|
+
Other projects working on ECtHR material:
|
|
485
496
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
they are not an exhaustive citation inventory or a target-paragraph graph. The
|
|
502
|
-
annotation frame deliberately omits submissions, general-principles material,
|
|
503
|
-
facts, procedure, operative text, appendices, individual opinions, and
|
|
504
|
-
footnotes. A full `echr-py` run can therefore return citation occurrences from
|
|
505
|
-
sections and components outside that annotation frame.
|
|
506
|
-
|
|
507
|
-
In the frozen 115-document comparison, `echr-py` aligned 5,319 of 5,425
|
|
508
|
-
selected ECHR annotations one-to-one (98.0%): 5,316 by strict source-span
|
|
509
|
-
overlap and three by uniquely normalized context, with 86 ambiguous and 20
|
|
510
|
-
unmatched annotations. These figures measure recovery of the selected
|
|
497
|
+
- [HUDOC Researcher](https://doi.org/10.5281/zenodo.21319704)
|
|
498
|
+
- [`echr-extractor`](https://pypi.org/project/echr-extractor/)
|
|
499
|
+
- [ECHR Open Data](https://echr-opendata.eu/)
|
|
500
|
+
- [Mumford et al.](https://doi.org/10.3233/FAIA251584)
|
|
501
|
+
- [ECtHR-PCR](https://github.com/TUMLegalTech/ECHR-PCR)
|
|
502
|
+
|
|
503
|
+
## Benchmark
|
|
504
|
+
|
|
505
|
+
`echr-py` is compared against the curated Mumford annotation set. Those
|
|
506
|
+
annotations are useful for studying selected citation treatments; they are not
|
|
507
|
+
an exhaustive citation inventory or a target-paragraph graph. The annotation
|
|
508
|
+
frame deliberately omits submissions, general-principles material, facts,
|
|
509
|
+
procedure, operative text, appendices, individual opinions, and footnotes, so a
|
|
510
|
+
full `echr-py` run can return citation occurrences from sections and components
|
|
511
|
+
outside that frame. Any recovery figure measures recovery of those selected
|
|
511
512
|
annotations, not detector precision or completeness over the judgments.
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
importer and methodological comparison remain available for researchers who
|
|
520
|
-
need them, but benchmark mechanics belong in the
|
|
521
|
-
[methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md), not on the project
|
|
522
|
-
homepage.
|
|
513
|
+
|
|
514
|
+
The importer and the methodological comparison remain available for researchers
|
|
515
|
+
who need them, and the measured figures, denominators, hashes and reproduction
|
|
516
|
+
records are kept in the
|
|
517
|
+
[methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md)
|
|
518
|
+
and the frozen [benchmark manifest](https://github.com/niccoloridi/echr-py/blob/main/docs/benchmarks/mumford-full-inclusive-audit.json),
|
|
519
|
+
where they can carry their conditions, rather than on the project homepage.
|
|
523
520
|
|
|
524
521
|
The evidence and dates behind external comparisons are maintained in the
|
|
525
522
|
[claim audit](https://github.com/niccoloridi/echr-py/blob/main/docs/claim-audit.md).
|
|
@@ -590,6 +587,8 @@ This research forms part of the Human Rights Nudge project that has received
|
|
|
590
587
|
funding from the European Research Council (ERC) under the European Union’s
|
|
591
588
|
Horizon 2020 research and innovation programme (Grant agreement No. 803981).
|
|
592
589
|
|
|
590
|
+
This work was also supported by a King’s Digital Futures Institute Fellowship.
|
|
591
|
+
|
|
593
592
|
## Data responsibility
|
|
594
593
|
|
|
595
594
|
HUDOC and HUDOC-EXEC are evolving public systems. Preserve item IDs, ECLIs,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: echr-py
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Pythonic acquisition of HUDOC and HUDOC-EXEC metadata and source documents for ECtHR research.
|
|
5
5
|
Author-email: Niccolo Ridi <niccoloridi@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -102,7 +102,7 @@ Dynamic: license-file
|
|
|
102
102
|
<a href="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml"><img src="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
103
103
|
<img src="https://img.shields.io/badge/python-3.11%E2%80%933.14-3776AB.svg" alt="Python 3.11–3.14">
|
|
104
104
|
<a href="https://github.com/niccoloridi/echr-py/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="MIT license"></a>
|
|
105
|
-
<img src="https://img.shields.io/badge/version-0.2.
|
|
105
|
+
<img src="https://img.shields.io/badge/version-0.2.2-blue.svg" alt="Version 0.2.2">
|
|
106
106
|
</p>
|
|
107
107
|
|
|
108
108
|
`echr-py` is a research engineering toolkit for the case law of the European
|
|
@@ -128,12 +128,24 @@ run it hydrated nine documents and wrote 478,151 characters of source-ordered
|
|
|
128
128
|
text in about 1.1 seconds at concurrency twelve, with the exact query,
|
|
129
129
|
settings, item IDs, hashes, and elapsed time recorded alongside the figure.
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
One inspectable chain runs from a HUDOC record to a verified paragraph edge.
|
|
132
|
+
Each stage keeps its own identity, so a later stage never overwrites an earlier
|
|
133
|
+
one:
|
|
132
134
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
135
|
+
| Stage | Identity retained at that stage |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| HUDOC record | item ID, ECLI, language, source checksum |
|
|
138
|
+
| Legal spine | canonical sections, stable block IDs, paragraph addresses, typography |
|
|
139
|
+
| Source identity | majority, individual opinion, footnote, invoking paragraph |
|
|
140
|
+
| Citation occurrence | exact printed span, supporting evidence, pinpoint ownership |
|
|
141
|
+
| Exact target | cited document, cited application, or an explicit unresolved scope |
|
|
142
|
+
| Target paragraph | printed pinpoint mapped to a verified block in the cited document |
|
|
143
|
+
|
|
144
|
+
That is the central idea: retain enough structure and provenance to move from a
|
|
145
|
+
public HUDOC record to a multilingual paragraph, a printed citation occurrence,
|
|
146
|
+
an exact target document, and, when the source supplies a pinpoint, a verified
|
|
147
|
+
target paragraph. Deterministic identity and graph layers stay separate from
|
|
148
|
+
optional, evidence-verified labels.
|
|
137
149
|
|
|
138
150
|
## Start here
|
|
139
151
|
|
|
@@ -483,7 +495,7 @@ without cloning the repository:
|
|
|
483
495
|
|
|
484
496
|
```bash
|
|
485
497
|
claude mcp add --scope user --transport stdio echr-py -- \
|
|
486
|
-
"$(command -v uvx)" --from 'echr-py[mcp]==0.2.
|
|
498
|
+
"$(command -v uvx)" --from 'echr-py[mcp]==0.2.2' echr-py mcp
|
|
487
499
|
claude mcp get echr-py
|
|
488
500
|
```
|
|
489
501
|
|
|
@@ -566,48 +578,33 @@ and graphs without mutating external state. Study jobs require an explicit
|
|
|
566
578
|
`--enable-jobs` launch configuration with permitted roots, provider and hook
|
|
567
579
|
allowlists, pricing, and per-job budgets.
|
|
568
580
|
|
|
569
|
-
##
|
|
581
|
+
## See also
|
|
570
582
|
|
|
571
|
-
|
|
572
|
-
projects:
|
|
583
|
+
Other projects working on ECtHR material:
|
|
573
584
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
they are not an exhaustive citation inventory or a target-paragraph graph. The
|
|
590
|
-
annotation frame deliberately omits submissions, general-principles material,
|
|
591
|
-
facts, procedure, operative text, appendices, individual opinions, and
|
|
592
|
-
footnotes. A full `echr-py` run can therefore return citation occurrences from
|
|
593
|
-
sections and components outside that annotation frame.
|
|
594
|
-
|
|
595
|
-
In the frozen 115-document comparison, `echr-py` aligned 5,319 of 5,425
|
|
596
|
-
selected ECHR annotations one-to-one (98.0%): 5,316 by strict source-span
|
|
597
|
-
overlap and three by uniquely normalized context, with 86 ambiguous and 20
|
|
598
|
-
unmatched annotations. These figures measure recovery of the selected
|
|
585
|
+
- [HUDOC Researcher](https://doi.org/10.5281/zenodo.21319704)
|
|
586
|
+
- [`echr-extractor`](https://pypi.org/project/echr-extractor/)
|
|
587
|
+
- [ECHR Open Data](https://echr-opendata.eu/)
|
|
588
|
+
- [Mumford et al.](https://doi.org/10.3233/FAIA251584)
|
|
589
|
+
- [ECtHR-PCR](https://github.com/TUMLegalTech/ECHR-PCR)
|
|
590
|
+
|
|
591
|
+
## Benchmark
|
|
592
|
+
|
|
593
|
+
`echr-py` is compared against the curated Mumford annotation set. Those
|
|
594
|
+
annotations are useful for studying selected citation treatments; they are not
|
|
595
|
+
an exhaustive citation inventory or a target-paragraph graph. The annotation
|
|
596
|
+
frame deliberately omits submissions, general-principles material, facts,
|
|
597
|
+
procedure, operative text, appendices, individual opinions, and footnotes, so a
|
|
598
|
+
full `echr-py` run can return citation occurrences from sections and components
|
|
599
|
+
outside that frame. Any recovery figure measures recovery of those selected
|
|
599
600
|
annotations, not detector precision or completeness over the judgments.
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
importer and methodological comparison remain available for researchers who
|
|
608
|
-
need them, but benchmark mechanics belong in the
|
|
609
|
-
[methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md), not on the project
|
|
610
|
-
homepage.
|
|
601
|
+
|
|
602
|
+
The importer and the methodological comparison remain available for researchers
|
|
603
|
+
who need them, and the measured figures, denominators, hashes and reproduction
|
|
604
|
+
records are kept in the
|
|
605
|
+
[methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md)
|
|
606
|
+
and the frozen [benchmark manifest](https://github.com/niccoloridi/echr-py/blob/main/docs/benchmarks/mumford-full-inclusive-audit.json),
|
|
607
|
+
where they can carry their conditions, rather than on the project homepage.
|
|
611
608
|
|
|
612
609
|
The evidence and dates behind external comparisons are maintained in the
|
|
613
610
|
[claim audit](https://github.com/niccoloridi/echr-py/blob/main/docs/claim-audit.md).
|
|
@@ -678,6 +675,8 @@ This research forms part of the Human Rights Nudge project that has received
|
|
|
678
675
|
funding from the European Research Council (ERC) under the European Union’s
|
|
679
676
|
Horizon 2020 research and innovation programme (Grant agreement No. 803981).
|
|
680
677
|
|
|
678
|
+
This work was also supported by a King’s Digital Futures Institute Fellowship.
|
|
679
|
+
|
|
681
680
|
## Data responsibility
|
|
682
681
|
|
|
683
682
|
HUDOC and HUDOC-EXEC are evolving public systems. Preserve item IDs, ECLIs,
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "echr-py"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.2"
|
|
8
8
|
description = "Pythonic acquisition of HUDOC and HUDOC-EXEC metadata and source documents for ECtHR research."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|