linkml-reference-validator 0.2.0__tar.gz → 0.2.1rc1__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.
- linkml_reference_validator-0.2.1rc1/.github/workflows/claude-code-review.yml +61 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/claude-ontology-review.yml +13 -27
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/claude.yml +12 -40
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/dragon-ai.yml +1 -1
- linkml_reference_validator-0.2.0/README.md → linkml_reference_validator-0.2.1rc1/PKG-INFO +39 -0
- linkml_reference_validator-0.2.0/PKG-INFO → linkml_reference_validator-0.2.1rc1/README.md +18 -20
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/concepts/editorial-conventions.md +28 -0
- linkml_reference_validator-0.2.1rc1/docs/how-to/fetch-full-text-and-pdfs.md +139 -0
- linkml_reference_validator-0.2.1rc1/docs/superpowers/plans/2026-06-12-modular-pdf-fulltext-fetching.md +2969 -0
- linkml_reference_validator-0.2.1rc1/docs/superpowers/specs/2026-06-12-modular-pdf-fulltext-fetching-design.md +260 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/mkdocs.yml +1 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/pyproject.toml +1 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/shared.py +8 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/validate.py +66 -33
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/acquire.py +134 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/extract/__init__.py +16 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/extract/base.py +64 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/extract/html.py +46 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/extract/pdf.py +67 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/extract/xml.py +46 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/__init__.py +19 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/base.py +70 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/json_api.py +135 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/loader.py +94 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/openalex.py +70 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/pmc.py +124 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/unpaywall.py +69 -0
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/identifiers.py +58 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/reference_fetcher.py +208 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/pmid.py +2 -6
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/url.py +43 -12
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/field_detection.py +43 -2
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/models.py +138 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/plugins/reference_validation_plugin.py +6 -1
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/validation/supporting_text_validator.py +24 -4
- linkml_reference_validator-0.2.1rc1/tests/data/test_data_deep_nesting_invalid.yaml +17 -0
- linkml_reference_validator-0.2.1rc1/tests/data/test_data_deep_nesting_valid.yaml +23 -0
- linkml_reference_validator-0.2.1rc1/tests/data/test_schema_deep_nesting.yaml +74 -0
- linkml_reference_validator-0.2.1rc1/tests/test_acquire.py +116 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_cli.py +266 -0
- linkml_reference_validator-0.2.1rc1/tests/test_deep_nesting.py +401 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_e2e_integration.py +58 -0
- linkml_reference_validator-0.2.1rc1/tests/test_extractors.py +104 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_field_detection.py +47 -0
- linkml_reference_validator-0.2.1rc1/tests/test_fulltext_loader.py +97 -0
- linkml_reference_validator-0.2.1rc1/tests/test_fulltext_providers.py +175 -0
- linkml_reference_validator-0.2.1rc1/tests/test_identifiers.py +31 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_models.py +41 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_optional_linkml_dependency.py +31 -3
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_reference_fetcher.py +291 -32
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_sources.py +42 -28
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_supporting_text_validator.py +65 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_title_validation.py +2 -0
- linkml_reference_validator-0.2.1rc1/tests/test_unknown_slot_traversal.py +131 -0
- linkml_reference_validator-0.2.1rc1/tests/test_validation_config.py +72 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/uv.lock +14 -0
- linkml_reference_validator-0.2.0/.github/workflows/claude-code-review.yml +0 -78
- linkml_reference_validator-0.2.0/tests/test_validation_config.py +0 -38
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.claude/.mcp.json +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.claude/settings.json +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.copier-answers.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.devcontainer/devcontainer.json +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.devcontainer/post_create.sh +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.editorconfig +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/actions/claude-code-action/action.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/actions/claude-issue-summarize-action/action.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/actions/claude-issue-triage-action/action.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/ai-controllers.json +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/copilot-instructions.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/copilot-setup-steps.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/dependabot.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/claude-issue-summarize.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/claude-issue-triage.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/deploy-docs.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/main.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/pypi-publish.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.gitignore +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.goosehints +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.pre-commit-config.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.yamllint.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/AGENTS.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/BUG_GEO_ACCESSION_TO_UID.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/BUG_ZENODO_DOI_AND_URL_HANDLING.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/CLAUDE.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/CLI-ISSUES.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/CODE_OF_CONDUCT.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/CONTRIBUTING.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/FEATURE_REQUEST_REPAIR.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/LICENSE +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/REVIEW2.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/REVIEW3.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/ai.just +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/copilot-instructions.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/about.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/concepts/content-types.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/concepts/how-it-works.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/elements/.gitkeep +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/add-reference-source.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/repair-validation-errors.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/skip-unsupported-references.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/use-local-files-and-urls.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-clinical-trials.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-dois.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-entrez.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-obo-files.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-titles.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-urls.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/index.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/notebooks/01_getting_started.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/notebooks/02_advanced_usage.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/notebooks/03_python_api.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/notebooks/04_obo_validation.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/notebooks/05_geo_validation.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/quickstart.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/reference/cli.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/setup-guide.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/templates-linkml/README.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/todo.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/troubleshooting.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/tutorials/complete-workflow.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/examples/README.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/justfile +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/mypy.ini +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/notebooks/01_getting_started.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/notebooks/02_advanced_usage.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/notebooks/03_python_api.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/notebooks/README.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/project/README.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/project.justfile +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/pytest.ini +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/_version.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/cache.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/lookup.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/repair.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/base.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/clinicaltrials.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/doi.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/entrez.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/file.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/json_api.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/loader.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/utils.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/text_extractor.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/plugins/REVIEW.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/plugins/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/validation/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/validation/fuzzy_text_utils.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/validation/repairer.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/conftest.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/data/test_data_invalid.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/data/test_data_valid.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/data/test_schema.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/CLINICALTRIALS_NCT00000001.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/GEO_GSE12345.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMC_TEST001.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMC_TEST001.txt +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMC_TEST002.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMC_TEST002.txt +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST001.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST001.txt +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST002.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST002.txt +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST003.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST003.txt +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/sample.obo +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_cli_lookup.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_cli_repair.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_clinicaltrials_integration.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_fuzzy_suggestions.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_geo_integration.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_json_api_source.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_plugin_integration.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_pmc_fulltext.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_real_validation.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_repair.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_source_utils.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_text_extractor.py +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: Claude Code Review
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, synchronize]
|
|
6
|
+
# Optional: Only run on specific file changes
|
|
7
|
+
# paths:
|
|
8
|
+
# - "src/**/*.ts"
|
|
9
|
+
# - "src/**/*.tsx"
|
|
10
|
+
# - "src/**/*.js"
|
|
11
|
+
# - "src/**/*.jsx"
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
claude-review:
|
|
15
|
+
# Optional: Filter by PR author
|
|
16
|
+
# if: |
|
|
17
|
+
# github.event.pull_request.user.login == 'external-contributor' ||
|
|
18
|
+
# github.event.pull_request.user.login == 'new-developer' ||
|
|
19
|
+
# github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
|
|
20
|
+
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
pull-requests: read
|
|
25
|
+
issues: read
|
|
26
|
+
id-token: write
|
|
27
|
+
|
|
28
|
+
steps:
|
|
29
|
+
- name: Checkout repository
|
|
30
|
+
uses: actions/checkout@v6
|
|
31
|
+
with:
|
|
32
|
+
fetch-depth: 1
|
|
33
|
+
|
|
34
|
+
- name: Run Claude Code Review
|
|
35
|
+
id: claude-review
|
|
36
|
+
uses: anthropics/claude-code-action@v1
|
|
37
|
+
with:
|
|
38
|
+
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
39
|
+
|
|
40
|
+
# In v1, providing a `prompt` runs in automation mode, which does NOT
|
|
41
|
+
# post a comment by default. track_progress restores the v0.x
|
|
42
|
+
# "post the review as a PR comment" behavior and auto-injects PR context.
|
|
43
|
+
track_progress: true
|
|
44
|
+
|
|
45
|
+
# Prompt for the automated review (no @claude mention needed).
|
|
46
|
+
prompt: |
|
|
47
|
+
Please review this pull request and provide feedback on:
|
|
48
|
+
- Code quality and best practices
|
|
49
|
+
- Potential bugs or issues
|
|
50
|
+
- Performance considerations
|
|
51
|
+
- Security concerns
|
|
52
|
+
- Test coverage
|
|
53
|
+
|
|
54
|
+
Be constructive and helpful in your feedback.
|
|
55
|
+
|
|
56
|
+
# Args passed through to the Claude CLI. Use the `opus` alias rather
|
|
57
|
+
# than a dated model id so the workflow tracks the current Opus and
|
|
58
|
+
# won't 404 when a specific version is retired.
|
|
59
|
+
claude_args: |
|
|
60
|
+
--model opus
|
|
61
|
+
|
|
@@ -35,15 +35,23 @@ jobs:
|
|
|
35
35
|
|
|
36
36
|
- name: Run Claude Code Ontology Review
|
|
37
37
|
id: claude-review
|
|
38
|
-
uses: anthropics/claude-code-action@
|
|
38
|
+
uses: anthropics/claude-code-action@v1
|
|
39
39
|
with:
|
|
40
40
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
41
41
|
|
|
42
|
-
#
|
|
43
|
-
|
|
42
|
+
# In v1, providing a `prompt` runs in automation mode, which does NOT
|
|
43
|
+
# post a comment by default. track_progress restores the v0.x
|
|
44
|
+
# "post the review as a PR comment" behavior and auto-injects PR context.
|
|
45
|
+
track_progress: true
|
|
44
46
|
|
|
45
|
-
#
|
|
46
|
-
|
|
47
|
+
# Model is passed through to the Claude CLI via claude_args. Use the
|
|
48
|
+
# `opus` alias so the workflow tracks the current Opus and won't 404
|
|
49
|
+
# when a specific dated model id is retired.
|
|
50
|
+
claude_args: |
|
|
51
|
+
--model opus
|
|
52
|
+
|
|
53
|
+
# Prompt for the automated review (no @claude mention needed)
|
|
54
|
+
prompt: |
|
|
47
55
|
REPO: ${{ github.repository }}
|
|
48
56
|
PR NUMBER: ${{ github.event.pull_request.number }}
|
|
49
57
|
|
|
@@ -90,26 +98,4 @@ jobs:
|
|
|
90
98
|
|
|
91
99
|
# Optional: Use sticky comments to make Claude reuse the same comment on subsequent pushes to the same PR
|
|
92
100
|
use_sticky_comment: true
|
|
93
|
-
|
|
94
|
-
# Optional: Customize review based on file types
|
|
95
|
-
# direct_prompt: |
|
|
96
|
-
# Review this PR focusing on:
|
|
97
|
-
# - For TypeScript files: Type safety and proper interface usage
|
|
98
|
-
# - For API endpoints: Security, input validation, and error handling
|
|
99
|
-
# - For React components: Performance, accessibility, and best practices
|
|
100
|
-
# - For tests: Coverage, edge cases, and test quality
|
|
101
|
-
|
|
102
|
-
# Optional: Different prompts for different authors
|
|
103
|
-
# direct_prompt: |
|
|
104
|
-
# ${{ github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' &&
|
|
105
|
-
# 'Welcome! Please review this PR from a first-time contributor. Be encouraging and provide detailed explanations for any suggestions.' ||
|
|
106
|
-
# 'Please provide a thorough code review focusing on our coding standards and best practices.' }}
|
|
107
|
-
|
|
108
|
-
# Optional: Add specific tools for running tests or linting
|
|
109
|
-
# allowed_tools: "Bash(npm run test),Bash(npm run lint),Bash(npm run typecheck)"
|
|
110
|
-
|
|
111
|
-
# Optional: Skip review for certain conditions
|
|
112
|
-
# if: |
|
|
113
|
-
# !contains(github.event.pull_request.title, '[skip-review]') &&
|
|
114
|
-
# !contains(github.event.pull_request.title, '[WIP]')
|
|
115
101
|
|
|
@@ -39,52 +39,24 @@ jobs:
|
|
|
39
39
|
|
|
40
40
|
- name: Run Claude Code
|
|
41
41
|
id: claude
|
|
42
|
-
uses: anthropics/claude-code-action@
|
|
43
|
-
|
|
42
|
+
uses: anthropics/claude-code-action@v1
|
|
43
|
+
|
|
44
44
|
with:
|
|
45
45
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
46
|
-
mcp_config: |
|
|
47
|
-
{
|
|
48
|
-
"mcpServers": {
|
|
49
|
-
"ols": {
|
|
50
|
-
"command": "uvx",
|
|
51
|
-
"args": [
|
|
52
|
-
"ols-mcp"
|
|
53
|
-
]
|
|
54
|
-
},
|
|
55
|
-
"sequential-thinking": {
|
|
56
|
-
"command": "npx",
|
|
57
|
-
"args": [
|
|
58
|
-
"-y",
|
|
59
|
-
"@modelcontextprotocol/server-sequential-thinking"
|
|
60
|
-
]
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
46
|
|
|
65
47
|
# This is an optional setting that allows Claude to read CI results on PRs
|
|
66
48
|
additional_permissions: |
|
|
67
49
|
actions: read
|
|
68
|
-
|
|
69
|
-
#
|
|
70
|
-
# model
|
|
71
|
-
|
|
50
|
+
|
|
51
|
+
# In v1 the model, MCP servers, and allowed tools are passed through to
|
|
52
|
+
# the Claude CLI via claude_args (the v0.x model / mcp_config /
|
|
53
|
+
# allowed_tools inputs were removed). The `opus` alias tracks the
|
|
54
|
+
# current Opus so this won't 404 when a dated model id is retired.
|
|
55
|
+
claude_args: |
|
|
56
|
+
--model opus
|
|
57
|
+
--mcp-config '{"mcpServers":{"ols":{"command":"uvx","args":["ols-mcp"]},"sequential-thinking":{"command":"npx","args":["-y","@modelcontextprotocol/server-sequential-thinking"]}}}'
|
|
58
|
+
--allowedTools "Bash(*),FileEdit,Edit,MultiEdit,WebSearch,WebFetch,mcp__ols_mcp__search_all_ontologies,mcp__ols_mcp__get_terms_from_ontology"
|
|
59
|
+
|
|
72
60
|
# Optional: Customize the trigger phrase (default: @claude)
|
|
73
61
|
# trigger_phrase: "/claude"
|
|
74
|
-
|
|
75
|
-
# Optional: Trigger when specific user is assigned to an issue
|
|
76
|
-
# assignee_trigger: "claude-bot"
|
|
77
|
-
|
|
78
|
-
# Optional: Allow Claude to run specific commands
|
|
79
|
-
allowed_tools: "Bash(*),FileEdit,Edit,MultiEdit,WebSearch,WebFetch,mcp__ols_mcp__search_all_ontologies,mcp__ols_mcp__get_terms_from_ontology"
|
|
80
|
-
|
|
81
|
-
# Optional: Add custom instructions for Claude to customize its behavior for your project
|
|
82
|
-
# custom_instructions: |
|
|
83
|
-
# Follow our coding standards
|
|
84
|
-
# Ensure all new code has tests
|
|
85
|
-
# Use TypeScript for new files
|
|
86
|
-
|
|
87
|
-
# Optional: Custom environment variables for Claude
|
|
88
|
-
# claude_env: |
|
|
89
|
-
# NODE_ENV: test
|
|
90
62
|
|
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: linkml_reference_validator
|
|
3
|
+
Version: 0.2.1rc1
|
|
4
|
+
Summary: Validation of supporting text from references and publications
|
|
5
|
+
Author-email: Chris Mungall <cjmungall@lbl.gov>
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Python: <4.0,>=3.10
|
|
9
|
+
Requires-Dist: beautifulsoup4>=4.9.0
|
|
10
|
+
Requires-Dist: biopython>=1.80
|
|
11
|
+
Requires-Dist: jsonpath-ng>=1.6.0
|
|
12
|
+
Requires-Dist: linkml-runtime>=1.9.4
|
|
13
|
+
Requires-Dist: lxml>=4.9.0
|
|
14
|
+
Requires-Dist: pydantic>=2.0.0
|
|
15
|
+
Requires-Dist: pypdf>=4.0.0
|
|
16
|
+
Requires-Dist: rapidfuzz>=3.14.3
|
|
17
|
+
Requires-Dist: requests>=2.28.0
|
|
18
|
+
Requires-Dist: ruamel-yaml>=0.18.0
|
|
19
|
+
Requires-Dist: typer>=0.9.0
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
|
|
1
22
|
# linkml-reference-validator
|
|
2
23
|
|
|
3
24
|
[]()
|
|
@@ -496,6 +517,24 @@ supporting_text: "protein [X] functions in cell cycle regulation"
|
|
|
496
517
|
- `[gene name]` - Clarifications
|
|
497
518
|
- `[...]` - Omitted content markers
|
|
498
519
|
|
|
520
|
+
If your corpus uses square brackets as literal source text, configure patterns
|
|
521
|
+
that should be preserved instead of stripped:
|
|
522
|
+
|
|
523
|
+
```yaml
|
|
524
|
+
validation:
|
|
525
|
+
literal_bracket_patterns:
|
|
526
|
+
- "\\d" # keep [2Fe-2S], [+21], [30S], [Ca2+]
|
|
527
|
+
- "[()+]" # keep notation with parens/charges, e.g. [poly(A)+]
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
Patterns are matched against the content inside `[...]`. If any pattern matches,
|
|
531
|
+
that bracketed text is preserved (not stripped) before normalization and validation.
|
|
532
|
+
|
|
533
|
+
Keep patterns **specific** to your notation. A pattern broad enough to also match
|
|
534
|
+
ordinary editorial notes will preserve those too — for example `^\S` matches any
|
|
535
|
+
note that doesn't start with a space, so it would keep `[important]` as well as
|
|
536
|
+
`[poly(A)+]`.
|
|
537
|
+
|
|
499
538
|
### Omitted Text `...`
|
|
500
539
|
|
|
501
540
|
Use ellipsis for gaps in quoted text:
|
|
@@ -1,23 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: linkml_reference_validator
|
|
3
|
-
Version: 0.2.0
|
|
4
|
-
Summary: Validation of supporting text from references and publications
|
|
5
|
-
Author-email: Chris Mungall <cjmungall@lbl.gov>
|
|
6
|
-
License-Expression: Apache-2.0
|
|
7
|
-
License-File: LICENSE
|
|
8
|
-
Requires-Python: <4.0,>=3.10
|
|
9
|
-
Requires-Dist: beautifulsoup4>=4.9.0
|
|
10
|
-
Requires-Dist: biopython>=1.80
|
|
11
|
-
Requires-Dist: jsonpath-ng>=1.6.0
|
|
12
|
-
Requires-Dist: linkml-runtime>=1.9.4
|
|
13
|
-
Requires-Dist: lxml>=4.9.0
|
|
14
|
-
Requires-Dist: pydantic>=2.0.0
|
|
15
|
-
Requires-Dist: rapidfuzz>=3.14.3
|
|
16
|
-
Requires-Dist: requests>=2.28.0
|
|
17
|
-
Requires-Dist: ruamel-yaml>=0.18.0
|
|
18
|
-
Requires-Dist: typer>=0.9.0
|
|
19
|
-
Description-Content-Type: text/markdown
|
|
20
|
-
|
|
21
1
|
# linkml-reference-validator
|
|
22
2
|
|
|
23
3
|
[]()
|
|
@@ -516,6 +496,24 @@ supporting_text: "protein [X] functions in cell cycle regulation"
|
|
|
516
496
|
- `[gene name]` - Clarifications
|
|
517
497
|
- `[...]` - Omitted content markers
|
|
518
498
|
|
|
499
|
+
If your corpus uses square brackets as literal source text, configure patterns
|
|
500
|
+
that should be preserved instead of stripped:
|
|
501
|
+
|
|
502
|
+
```yaml
|
|
503
|
+
validation:
|
|
504
|
+
literal_bracket_patterns:
|
|
505
|
+
- "\\d" # keep [2Fe-2S], [+21], [30S], [Ca2+]
|
|
506
|
+
- "[()+]" # keep notation with parens/charges, e.g. [poly(A)+]
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
Patterns are matched against the content inside `[...]`. If any pattern matches,
|
|
510
|
+
that bracketed text is preserved (not stripped) before normalization and validation.
|
|
511
|
+
|
|
512
|
+
Keep patterns **specific** to your notation. A pattern broad enough to also match
|
|
513
|
+
ordinary editorial notes will preserve those too — for example `^\S` matches any
|
|
514
|
+
note that doesn't start with a space, so it would keep `[important]` as well as
|
|
515
|
+
`[poly(A)+]`.
|
|
516
|
+
|
|
519
517
|
### Omitted Text `...`
|
|
520
518
|
|
|
521
519
|
Use ellipsis for gaps in quoted text:
|
|
@@ -70,6 +70,34 @@ Nested brackets are not recommended and may not work as expected:
|
|
|
70
70
|
✅ "MUC1 [mucin 1, a membrane protein] blocks targeting"
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
+
### Literal Brackets in Source Text
|
|
74
|
+
|
|
75
|
+
Some corpora use square brackets as part of the quoted source text itself:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
Reference: "polyadenylated [poly(A)+] RNA export"
|
|
79
|
+
Quote: "polyadenylated [poly(A)+] RNA export"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
By default, linkml-reference-validator strips all bracketed text for backward
|
|
83
|
+
compatibility. To preserve literal brackets, configure
|
|
84
|
+
`literal_bracket_patterns` in your validation config:
|
|
85
|
+
|
|
86
|
+
```yaml
|
|
87
|
+
validation:
|
|
88
|
+
literal_bracket_patterns:
|
|
89
|
+
- "\\d" # keep [2Fe-2S], [+21], [30S], [Ca2+]
|
|
90
|
+
- "[()+]" # keep notation with parens/charges, e.g. [poly(A)+]
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Each pattern is matched against the content inside `[...]`. If any pattern
|
|
94
|
+
matches, that bracketed text is kept during validation. If none match, the
|
|
95
|
+
content is treated as an editorial insertion and stripped.
|
|
96
|
+
|
|
97
|
+
Keep patterns specific to your notation. A pattern broad enough to also match
|
|
98
|
+
ordinary editorial notes will preserve those too — for example `^\S` (any note
|
|
99
|
+
not starting with a space) would keep `[important]` as well as `[poly(A)+]`.
|
|
100
|
+
|
|
73
101
|
## Ellipsis `...`
|
|
74
102
|
|
|
75
103
|
Use ellipsis (three dots) to indicate **omitted text** between parts of a quote.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Fetching Full Text and PDFs
|
|
2
|
+
|
|
3
|
+
This guide explains how the validator obtains the **full text** of a reference
|
|
4
|
+
(not just its abstract or metadata) by trying a chain of full-text providers,
|
|
5
|
+
optionally downloading and extracting text from PDFs.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
When a metadata source (Crossref, PubMed, DataCite, etc.) returns only an
|
|
10
|
+
abstract or title, the validator can fall through to a **full-text provider
|
|
11
|
+
chain**. Each provider attempts to *locate* an open-access copy of the
|
|
12
|
+
reference. The first provider that yields usable full text wins; the located
|
|
13
|
+
resource is downloaded and, if it is a PDF, the text is extracted and cached
|
|
14
|
+
alongside the reference.
|
|
15
|
+
|
|
16
|
+
This behaviour is **on by default**.
|
|
17
|
+
|
|
18
|
+
## The provider chain
|
|
19
|
+
|
|
20
|
+
The validator tries providers in order until one returns usable full text.
|
|
21
|
+
The default order is:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
pmc → unpaywall → openalex
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- **`pmc`** — PubMed Central open-access subset (XML/HTML full text for many
|
|
28
|
+
biomedical articles).
|
|
29
|
+
- **`unpaywall`** — Unpaywall open-access lookup by DOI (often a publisher or
|
|
30
|
+
repository PDF).
|
|
31
|
+
- **`openalex`** — OpenAlex open-access location (PDF/HTML).
|
|
32
|
+
|
|
33
|
+
Providers are skipped silently if they have nothing for a given reference, so
|
|
34
|
+
the chain degrades gracefully: a miss in `pmc` simply moves on to `unpaywall`,
|
|
35
|
+
and so on. If no provider yields full text, the reference keeps whatever
|
|
36
|
+
metadata-only content it already had.
|
|
37
|
+
|
|
38
|
+
## Configuration
|
|
39
|
+
|
|
40
|
+
Full-text fetching is controlled by the following configuration keys (set in
|
|
41
|
+
your config YAML or on the `ReferenceValidationConfig` object):
|
|
42
|
+
|
|
43
|
+
| Key | Default | Description |
|
|
44
|
+
|-----|---------|-------------|
|
|
45
|
+
| `fetch_full_text` | `true` | Attempt to obtain full text via the provider chain when a metadata source does not already return full text. |
|
|
46
|
+
| `full_text_providers` | `[pmc, unpaywall, openalex]` | Ordered list of provider names to try until one yields usable full text. |
|
|
47
|
+
| `pdf_backend` | `pypdf` | Name of the PDF text-extraction backend. |
|
|
48
|
+
| `download_pdfs` | `true` | If true, persist downloaded PDFs to the files cache directory. |
|
|
49
|
+
| `full_text_providers_file` | `null` | Optional path to a YAML file defining custom full-text providers. |
|
|
50
|
+
|
|
51
|
+
Two existing keys are also reused by the full-text machinery:
|
|
52
|
+
|
|
53
|
+
| Key | Description |
|
|
54
|
+
|-----|-------------|
|
|
55
|
+
| `email` | Used for "polite pool" access to providers such as Unpaywall and OpenAlex (and for Crossref/Entrez). Set this for more reliable access. |
|
|
56
|
+
| `max_supplementary_file_size` | Upper bound (in bytes) on individual file downloads; a downloaded full-text PDF larger than this limit is not persisted. |
|
|
57
|
+
|
|
58
|
+
Example config YAML:
|
|
59
|
+
|
|
60
|
+
```yaml
|
|
61
|
+
email: you@example.org
|
|
62
|
+
fetch_full_text: true
|
|
63
|
+
full_text_providers:
|
|
64
|
+
- pmc
|
|
65
|
+
- unpaywall
|
|
66
|
+
- openalex
|
|
67
|
+
pdf_backend: pypdf
|
|
68
|
+
download_pdfs: true
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## CLI flag
|
|
72
|
+
|
|
73
|
+
Every `validate` subcommand accepts a `--full-text/--no-full-text` flag that
|
|
74
|
+
toggles `fetch_full_text` for that run (default: on):
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Default: full-text chain is tried
|
|
78
|
+
linkml-reference-validator validate data data.yaml \
|
|
79
|
+
--schema schema.yaml --target-class Statement
|
|
80
|
+
|
|
81
|
+
# Disable full-text fetching (metadata only)
|
|
82
|
+
linkml-reference-validator validate data data.yaml \
|
|
83
|
+
--schema schema.yaml --target-class Statement --no-full-text
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Custom providers
|
|
87
|
+
|
|
88
|
+
You can declare your own JSON-API-backed provider in a YAML file and point
|
|
89
|
+
`full_text_providers_file` at it. Each entry under `full_text_providers` is
|
|
90
|
+
keyed by the provider name and must supply a `url_template`. The template may
|
|
91
|
+
reference `{doi}`, `{pmid}`, or `{pmcid}`. `location_field` is a JSONPath into
|
|
92
|
+
the response that holds the URL of the full-text resource; `format_hint` tells
|
|
93
|
+
the validator how to treat it; and `headers` are sent with the request, with
|
|
94
|
+
`${ENV_VAR}` placeholders interpolated from the environment.
|
|
95
|
+
|
|
96
|
+
```yaml
|
|
97
|
+
full_text_providers:
|
|
98
|
+
myrepo:
|
|
99
|
+
url_template: https://api.example.org/fulltext/{doi}
|
|
100
|
+
location_field: $.links.pdf
|
|
101
|
+
format_hint: pdf
|
|
102
|
+
headers:
|
|
103
|
+
Authorization: Bearer ${MYREPO_TOKEN}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
To actually use a custom provider, add its name to the `full_text_providers`
|
|
107
|
+
chain (it is not enabled merely by being defined), for example:
|
|
108
|
+
|
|
109
|
+
```yaml
|
|
110
|
+
full_text_providers_file: providers.yaml
|
|
111
|
+
full_text_providers:
|
|
112
|
+
- myrepo
|
|
113
|
+
- pmc
|
|
114
|
+
- unpaywall
|
|
115
|
+
- openalex
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Provenance fields
|
|
119
|
+
|
|
120
|
+
When a reference is enriched with full text, the cached reference records where
|
|
121
|
+
the text came from. These provenance fields are written alongside the content:
|
|
122
|
+
|
|
123
|
+
| Field | Description |
|
|
124
|
+
|-------|-------------|
|
|
125
|
+
| `full_text_provider` | Name of the provider that supplied the full text (e.g. `pmc`, `unpaywall`, or a custom name). |
|
|
126
|
+
| `oa_status` | Open-access status reported by the provider (e.g. `gold`, `green`, `bronze`). |
|
|
127
|
+
| `license` | License of the open-access copy, when known. |
|
|
128
|
+
| `local_pdf_path` | Path (relative to the cache directory) to the downloaded PDF, when one was persisted. |
|
|
129
|
+
|
|
130
|
+
When full text from a PDF is obtained, the reference's `content_type` becomes
|
|
131
|
+
`full_text_pdf` and the extracted text replaces the abstract-only content. The
|
|
132
|
+
downloaded PDF lives under the cache directory and can be located at
|
|
133
|
+
`cache_dir / local_pdf_path`.
|
|
134
|
+
|
|
135
|
+
## See Also
|
|
136
|
+
|
|
137
|
+
- [Validating DOIs](validate-dois.md) — DOI metadata sources and supplementary files
|
|
138
|
+
- [Validating Entrez Accessions](validate-entrez.md) — PubMed/PMC references
|
|
139
|
+
- [CLI Reference](../reference/cli.md) — complete command documentation
|