linkml-reference-validator 0.2.1rc1__tar.gz → 0.2.1rc3__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 → linkml_reference_validator-0.2.1rc3}/PKG-INFO +30 -4
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/README.md +29 -3
- linkml_reference_validator-0.2.1rc3/docs/assets/zotero-find-full-text.png +0 -0
- linkml_reference_validator-0.2.1rc3/docs/how-to/export-cache-to-zotero.md +114 -0
- linkml_reference_validator-0.2.1rc3/docs/how-to/fetch-full-text-and-pdfs.md +287 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/reference/cli.md +63 -0
- linkml_reference_validator-0.2.1rc3/docs/superpowers/plans/2026-08-05-private-library-full-text.md +190 -0
- linkml_reference_validator-0.2.1rc3/docs/superpowers/specs/2026-08-05-private-library-full-text-design.md +309 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/mkdocs.yml +1 -0
- linkml_reference_validator-0.2.1rc3/src/linkml_reference_validator/cli/cache.py +373 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/cli/lookup.py +3 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/acquire.py +80 -1
- linkml_reference_validator-0.2.1rc3/src/linkml_reference_validator/etl/csl_export.py +73 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/fulltext/__init__.py +4 -0
- linkml_reference_validator-0.2.1rc3/src/linkml_reference_validator/etl/fulltext/epmc_preprint.py +142 -0
- linkml_reference_validator-0.2.1rc3/src/linkml_reference_validator/etl/fulltext/zotero.py +252 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/identifiers.py +24 -1
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/reference_fetcher.py +200 -46
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/sources/__init__.py +2 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/sources/doi.py +34 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/sources/pmid.py +109 -27
- linkml_reference_validator-0.2.1rc3/src/linkml_reference_validator/etl/sources/ppr.py +159 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/models.py +73 -3
- linkml_reference_validator-0.2.1rc3/tests/test_acquire.py +224 -0
- linkml_reference_validator-0.2.1rc3/tests/test_cli_cache_enrich.py +227 -0
- linkml_reference_validator-0.2.1rc3/tests/test_cli_cache_export.py +246 -0
- linkml_reference_validator-0.2.1rc3/tests/test_doi_preprint.py +103 -0
- linkml_reference_validator-0.2.1rc3/tests/test_epmc_preprint_provider.py +196 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_identifiers.py +25 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_models.py +13 -0
- linkml_reference_validator-0.2.1rc3/tests/test_ppr_source.py +125 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_reference_fetcher.py +252 -1
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_sources.py +149 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_validation_config.py +1 -1
- linkml_reference_validator-0.2.1rc3/tests/test_zotero_provider.py +277 -0
- linkml_reference_validator-0.2.1rc1/docs/how-to/fetch-full-text-and-pdfs.md +0 -139
- linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/cli/cache.py +0 -143
- linkml_reference_validator-0.2.1rc1/tests/test_acquire.py +0 -116
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.claude/.mcp.json +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.claude/settings.json +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.copier-answers.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.devcontainer/devcontainer.json +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.devcontainer/post_create.sh +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.editorconfig +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/actions/claude-code-action/action.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/actions/claude-issue-summarize-action/action.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/actions/claude-issue-triage-action/action.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/ai-controllers.json +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/copilot-instructions.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/copilot-setup-steps.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/dependabot.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/workflows/claude-code-review.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/workflows/claude-issue-summarize.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/workflows/claude-issue-triage.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/workflows/claude-ontology-review.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/workflows/claude.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/workflows/deploy-docs.yaml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/workflows/dragon-ai.yml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/workflows/main.yaml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.github/workflows/pypi-publish.yaml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.gitignore +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.goosehints +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.pre-commit-config.yaml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/.yamllint.yaml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/AGENTS.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/BUG_GEO_ACCESSION_TO_UID.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/BUG_ZENODO_DOI_AND_URL_HANDLING.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/CLAUDE.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/CLI-ISSUES.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/CODE_OF_CONDUCT.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/CONTRIBUTING.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/FEATURE_REQUEST_REPAIR.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/LICENSE +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/REVIEW2.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/REVIEW3.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/ai.just +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/copilot-instructions.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/about.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/concepts/content-types.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/concepts/editorial-conventions.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/concepts/how-it-works.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/elements/.gitkeep +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/how-to/add-reference-source.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/how-to/repair-validation-errors.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/how-to/skip-unsupported-references.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/how-to/use-local-files-and-urls.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/how-to/validate-clinical-trials.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/how-to/validate-dois.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/how-to/validate-entrez.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/how-to/validate-obo-files.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/how-to/validate-titles.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/how-to/validate-urls.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/index.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/notebooks/01_getting_started.ipynb +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/notebooks/02_advanced_usage.ipynb +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/notebooks/03_python_api.ipynb +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/notebooks/04_obo_validation.ipynb +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/notebooks/05_geo_validation.ipynb +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/quickstart.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/setup-guide.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/superpowers/plans/2026-06-12-modular-pdf-fulltext-fetching.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/superpowers/specs/2026-06-12-modular-pdf-fulltext-fetching-design.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/templates-linkml/README.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/todo.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/troubleshooting.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/tutorials/complete-workflow.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/examples/README.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/justfile +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/mypy.ini +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/notebooks/01_getting_started.ipynb +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/notebooks/02_advanced_usage.ipynb +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/notebooks/03_python_api.ipynb +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/notebooks/README.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/project/README.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/project.justfile +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/pyproject.toml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/pytest.ini +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/__init__.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/_version.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/cli/__init__.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/cli/repair.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/cli/shared.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/cli/validate.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/__init__.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/extract/__init__.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/extract/base.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/extract/html.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/extract/pdf.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/extract/xml.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/fulltext/base.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/fulltext/json_api.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/fulltext/loader.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/fulltext/openalex.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/fulltext/pmc.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/fulltext/unpaywall.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/sources/base.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/sources/clinicaltrials.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/sources/entrez.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/sources/file.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/sources/json_api.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/sources/loader.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/sources/url.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/sources/utils.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/etl/text_extractor.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/field_detection.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/plugins/REVIEW.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/plugins/__init__.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/plugins/reference_validation_plugin.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/validation/__init__.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/validation/fuzzy_text_utils.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/validation/repairer.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/src/linkml_reference_validator/validation/supporting_text_validator.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/__init__.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/conftest.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/data/test_data_deep_nesting_invalid.yaml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/data/test_data_deep_nesting_valid.yaml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/data/test_data_invalid.yaml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/data/test_data_valid.yaml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/data/test_schema.yaml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/data/test_schema_deep_nesting.yaml +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/CLINICALTRIALS_NCT00000001.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/GEO_GSE12345.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/PMC_TEST001.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/PMC_TEST001.txt +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/PMC_TEST002.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/PMC_TEST002.txt +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/PMID_TEST001.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/PMID_TEST001.txt +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/PMID_TEST002.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/PMID_TEST002.txt +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/PMID_TEST003.md +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/PMID_TEST003.txt +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/fixtures/sample.obo +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_cli.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_cli_lookup.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_cli_repair.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_clinicaltrials_integration.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_deep_nesting.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_e2e_integration.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_extractors.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_field_detection.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_fulltext_loader.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_fulltext_providers.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_fuzzy_suggestions.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_geo_integration.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_json_api_source.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_optional_linkml_dependency.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_plugin_integration.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_pmc_fulltext.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_real_validation.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_repair.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_source_utils.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_supporting_text_validator.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_text_extractor.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_title_validation.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/tests/test_unknown_slot_traversal.py +0 -0
- {linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: linkml_reference_validator
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1rc3
|
|
4
4
|
Summary: Validation of supporting text from references and publications
|
|
5
5
|
Author-email: Chris Mungall <cjmungall@lbl.gov>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -395,10 +395,36 @@ reference:
|
|
|
395
395
|
- `PMID:12345678`
|
|
396
396
|
- `12345678` (assumes PMID)
|
|
397
397
|
|
|
398
|
-
|
|
398
|
+
#### Preprints
|
|
399
399
|
|
|
400
|
-
|
|
401
|
-
|
|
400
|
+
Preprints are supported as first-class references:
|
|
401
|
+
|
|
402
|
+
```yaml
|
|
403
|
+
reference:
|
|
404
|
+
id: DOI:10.1101/2024.01.01.573333 # by DOI
|
|
405
|
+
supporting_text: "the kinase phosphorylates the substrate in vitro"
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
```yaml
|
|
409
|
+
reference:
|
|
410
|
+
id: PPR:PPR123456 # by Europe PMC preprint id
|
|
411
|
+
supporting_text: "the kinase phosphorylates the substrate in vitro"
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
**Fetches:**
|
|
415
|
+
- Abstract and metadata (title, authors, server, year, DOI)
|
|
416
|
+
- Full-text body via the Europe PMC `fulltextRepo` PDF route (`epmc_preprint`
|
|
417
|
+
provider), for the Europe-PMC-ingested subset
|
|
418
|
+
- `is_preprint` / `peer_review_status` flags, so downstream KBs can apply
|
|
419
|
+
"not sole support" policies
|
|
420
|
+
|
|
421
|
+
**ID Formats:**
|
|
422
|
+
- `DOI:10.1101/...` (Crossref `posted-content` is detected as a preprint)
|
|
423
|
+
- `PPR:PPR123456` (Europe PMC `SRC:PPR` id)
|
|
424
|
+
- NIH Preprint Pilot preprints carry real PMIDs and resolve via the `PMID:` path
|
|
425
|
+
|
|
426
|
+
See the [full-text guide](docs/how-to/fetch-full-text-and-pdfs.md#preprints) for
|
|
427
|
+
details and coverage caveats.
|
|
402
428
|
|
|
403
429
|
---
|
|
404
430
|
|
|
@@ -374,10 +374,36 @@ reference:
|
|
|
374
374
|
- `PMID:12345678`
|
|
375
375
|
- `12345678` (assumes PMID)
|
|
376
376
|
|
|
377
|
-
|
|
377
|
+
#### Preprints
|
|
378
378
|
|
|
379
|
-
|
|
380
|
-
|
|
379
|
+
Preprints are supported as first-class references:
|
|
380
|
+
|
|
381
|
+
```yaml
|
|
382
|
+
reference:
|
|
383
|
+
id: DOI:10.1101/2024.01.01.573333 # by DOI
|
|
384
|
+
supporting_text: "the kinase phosphorylates the substrate in vitro"
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
```yaml
|
|
388
|
+
reference:
|
|
389
|
+
id: PPR:PPR123456 # by Europe PMC preprint id
|
|
390
|
+
supporting_text: "the kinase phosphorylates the substrate in vitro"
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
**Fetches:**
|
|
394
|
+
- Abstract and metadata (title, authors, server, year, DOI)
|
|
395
|
+
- Full-text body via the Europe PMC `fulltextRepo` PDF route (`epmc_preprint`
|
|
396
|
+
provider), for the Europe-PMC-ingested subset
|
|
397
|
+
- `is_preprint` / `peer_review_status` flags, so downstream KBs can apply
|
|
398
|
+
"not sole support" policies
|
|
399
|
+
|
|
400
|
+
**ID Formats:**
|
|
401
|
+
- `DOI:10.1101/...` (Crossref `posted-content` is detected as a preprint)
|
|
402
|
+
- `PPR:PPR123456` (Europe PMC `SRC:PPR` id)
|
|
403
|
+
- NIH Preprint Pilot preprints carry real PMIDs and resolve via the `PMID:` path
|
|
404
|
+
|
|
405
|
+
See the [full-text guide](docs/how-to/fetch-full-text-and-pdfs.md#preprints) for
|
|
406
|
+
details and coverage caveats.
|
|
381
407
|
|
|
382
408
|
---
|
|
383
409
|
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Export a Reference Cache to Zotero
|
|
2
|
+
|
|
3
|
+
This workflow turns a checked-in public reference cache into a Zotero collection,
|
|
4
|
+
asks Zotero to find available PDFs, and then inventories the resulting attachments
|
|
5
|
+
without putting closed manuscripts into the project repository.
|
|
6
|
+
|
|
7
|
+
The three stores remain separate:
|
|
8
|
+
|
|
9
|
+
| Store | Purpose | Safe to commit? |
|
|
10
|
+
|---|---|---:|
|
|
11
|
+
| Project `references_cache` | Reproducible public validation evidence | Yes |
|
|
12
|
+
| Zotero library | User-managed references and PDF attachments | No |
|
|
13
|
+
| Private research cache | Extracted user-library text for agent context | No |
|
|
14
|
+
|
|
15
|
+
Normal validation reads only the first store.
|
|
16
|
+
|
|
17
|
+
## 1. Export metadata from the public cache
|
|
18
|
+
|
|
19
|
+
Run the exporter from the `linkml-reference-validator` checkout. For dismech:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
uv run linkml-reference-validator cache export \
|
|
23
|
+
--cache-dir /Users/cjm/repos/dismech/references_cache \
|
|
24
|
+
--needs-full-text \
|
|
25
|
+
--output /Users/cjm/Downloads/dismech-zotero.json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`--needs-full-text` is the default. It excludes cache entries that already have
|
|
29
|
+
full text, excludes non-publication identifiers, and deduplicates by normalized
|
|
30
|
+
DOI and then PMID. The CSL JSON output uses an explicit metadata allowlist:
|
|
31
|
+
|
|
32
|
+
- title and authors;
|
|
33
|
+
- journal and year;
|
|
34
|
+
- DOI; or
|
|
35
|
+
- PMID and its public PubMed URL.
|
|
36
|
+
|
|
37
|
+
It never contains cached article text, excerpts, provenance, PDFs, local paths,
|
|
38
|
+
or private-cache data. The command refuses to replace an existing output file;
|
|
39
|
+
use `--force` only after checking the destination. Use `--all` if you explicitly
|
|
40
|
+
want eligible references that already contain full text.
|
|
41
|
+
|
|
42
|
+
## 2. Import the file into Zotero
|
|
43
|
+
|
|
44
|
+
In Zotero:
|
|
45
|
+
|
|
46
|
+
1. Choose **File → Import**.
|
|
47
|
+
2. Choose **A file**.
|
|
48
|
+
3. Select `dismech-zotero.json`.
|
|
49
|
+
4. Keep the imported records in a project-specific collection such as
|
|
50
|
+
**dismech**.
|
|
51
|
+
|
|
52
|
+
CSL JSON is a standard format supported by Zotero. Importing the file adds only
|
|
53
|
+
bibliographic records; it does not copy anything from the validator's caches.
|
|
54
|
+
|
|
55
|
+
## 3. Ask Zotero to find PDFs
|
|
56
|
+
|
|
57
|
+
Select one or more top-level journal articles in the center item list,
|
|
58
|
+
right-click the selection, and choose **Find Full Text**. It is a built-in Zotero
|
|
59
|
+
command, not a plugin.
|
|
60
|
+
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
The command appears for an eligible parent item that has a DOI and does not
|
|
64
|
+
already have a file attachment. It may also be unavailable in a group library
|
|
65
|
+
where files cannot be added. If it is absent, first test a single article in
|
|
66
|
+
your personal library and confirm that its DOI field is populated.
|
|
67
|
+
|
|
68
|
+
For a large import, start with a modest batch rather than all records at once.
|
|
69
|
+
Publishers can temporarily rate-limit repeated requests, and a later retry may
|
|
70
|
+
find additional files. Zotero reports **Full Text PDF** or **No file found** for
|
|
71
|
+
each attempted item.
|
|
72
|
+
|
|
73
|
+
## 4. Inventory the enriched Zotero library
|
|
74
|
+
|
|
75
|
+
Once Zotero finishes, scan the project cache again:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
uv run linkml-reference-validator cache enrich \
|
|
79
|
+
--provider zotero \
|
|
80
|
+
--cache-dir /Users/cjm/repos/dismech/references_cache \
|
|
81
|
+
--dry-run
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
This read-only scan matches exact DOI, PMID, or PMCID identifiers and reports
|
|
85
|
+
which cached references now have usable Zotero text or PDF attachments. It does
|
|
86
|
+
not invoke **Find Full Text** and does not modify Zotero.
|
|
87
|
+
|
|
88
|
+
After reviewing the matches, materialize them into the separate private research
|
|
89
|
+
cache:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
uv run linkml-reference-validator cache enrich \
|
|
93
|
+
--provider zotero \
|
|
94
|
+
--cache-dir /Users/cjm/repos/dismech/references_cache \
|
|
95
|
+
--apply
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Apply mode leaves `references_cache` unchanged. Private content goes to
|
|
99
|
+
`~/.cache/linkml-reference-validator/private` by default with owner-only
|
|
100
|
+
permissions. Agents may inspect it for context, but validation cannot use it as
|
|
101
|
+
evidence.
|
|
102
|
+
|
|
103
|
+
## 5. Validate reproducibly
|
|
104
|
+
|
|
105
|
+
Run validation normally. Results remain reproducible because the validator
|
|
106
|
+
reads the public project cache and accepts only public full-text provider results.
|
|
107
|
+
Neither the contents of Zotero nor the machine-specific private cache affect
|
|
108
|
+
validation.
|
|
109
|
+
|
|
110
|
+
## See also
|
|
111
|
+
|
|
112
|
+
- [Fetching Full Text and PDFs](fetch-full-text-and-pdfs.md)
|
|
113
|
+
- [Zotero: importing standardized formats](https://www.zotero.org/support/kb/importing_standardized_formats)
|
|
114
|
+
- [Zotero: adding files to a library](https://www.zotero.org/support/attaching_files)
|
|
@@ -0,0 +1,287 @@
|
|
|
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 → epmc_preprint → unpaywall → openalex
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- **`pmc`** — PubMed Central open-access subset (XML/HTML full text for many
|
|
28
|
+
biomedical articles).
|
|
29
|
+
- **`epmc_preprint`** — Europe PMC preprint body text via the `fulltextRepo`
|
|
30
|
+
PDF route (see [Preprints](#preprints) below).
|
|
31
|
+
- **`unpaywall`** — Unpaywall open-access lookup by DOI (often a publisher or
|
|
32
|
+
repository PDF).
|
|
33
|
+
- **`openalex`** — OpenAlex open-access location (PDF/HTML).
|
|
34
|
+
|
|
35
|
+
Providers are skipped silently if they have nothing for a given reference, so
|
|
36
|
+
the chain degrades gracefully: a miss in `pmc` simply moves on to `unpaywall`,
|
|
37
|
+
and so on. If no provider yields full text, the reference keeps whatever
|
|
38
|
+
metadata-only content it already had.
|
|
39
|
+
|
|
40
|
+
## Configuration
|
|
41
|
+
|
|
42
|
+
Full-text fetching is controlled by the following configuration keys (set in
|
|
43
|
+
your config YAML or on the `ReferenceValidationConfig` object):
|
|
44
|
+
|
|
45
|
+
| Key | Default | Description |
|
|
46
|
+
|-----|---------|-------------|
|
|
47
|
+
| `fetch_full_text` | `true` | Attempt to obtain full text via the provider chain when a metadata source does not already return full text. |
|
|
48
|
+
| `full_text_providers` | `[pmc, epmc_preprint, unpaywall, openalex]` | Ordered list of provider names to try until one yields usable full text. |
|
|
49
|
+
| `private_cache_dir` | `~/.cache/linkml-reference-validator/private` | Separate research cache for closed/user-library full text; never read by validation. |
|
|
50
|
+
| `pdf_backend` | `pypdf` | Name of the PDF text-extraction backend. |
|
|
51
|
+
| `download_pdfs` | `true` | If true, persist downloaded PDFs to the files cache directory. |
|
|
52
|
+
| `full_text_providers_file` | `null` | Optional path to a YAML file defining custom full-text providers. |
|
|
53
|
+
| `zotero_base_url` | `http://localhost:23119/api/users/0` | Read-only Zotero local API library used by the opt-in `zotero` provider. |
|
|
54
|
+
|
|
55
|
+
Two existing keys are also reused by the full-text machinery:
|
|
56
|
+
|
|
57
|
+
| Key | Description |
|
|
58
|
+
|-----|-------------|
|
|
59
|
+
| `email` | Used for "polite pool" access to providers such as Unpaywall and OpenAlex (and for Crossref/Entrez). Set this for more reliable access. |
|
|
60
|
+
| `max_supplementary_file_size` | Upper bound (in bytes) on individual file downloads; a downloaded full-text PDF larger than this limit is not persisted. |
|
|
61
|
+
|
|
62
|
+
Example config YAML:
|
|
63
|
+
|
|
64
|
+
```yaml
|
|
65
|
+
email: you@example.org
|
|
66
|
+
fetch_full_text: true
|
|
67
|
+
full_text_providers:
|
|
68
|
+
- pmc
|
|
69
|
+
- epmc_preprint
|
|
70
|
+
- unpaywall
|
|
71
|
+
- openalex
|
|
72
|
+
pdf_backend: pypdf
|
|
73
|
+
download_pdfs: true
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Private manuscripts in Zotero
|
|
77
|
+
|
|
78
|
+
The opt-in **`zotero`** provider can find non-open manuscripts that are already
|
|
79
|
+
in your personal Zotero library. It matches exact DOI, PMID, or PMCID identifiers;
|
|
80
|
+
it does not automatically accept fuzzy title matches.
|
|
81
|
+
|
|
82
|
+
Zotero must be running, and its local API must be enabled in Zotero's advanced
|
|
83
|
+
settings. Inventory the reference cache before changing it:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
linkml-reference-validator cache enrich \
|
|
87
|
+
--provider zotero \
|
|
88
|
+
--cache-dir references_cache \
|
|
89
|
+
--dry-run
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
The report distinguishes `found`, `not_found`, `already_full_text`, and `error`.
|
|
93
|
+
Dry-run is the default and never changes cache files. After reviewing exact
|
|
94
|
+
matches, apply usable text with:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
linkml-reference-validator cache enrich \
|
|
98
|
+
--provider zotero \
|
|
99
|
+
--cache-dir references_cache \
|
|
100
|
+
--apply
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Apply mode does **not** modify `references_cache`. It writes the enriched entry
|
|
104
|
+
to a separate research cache at `~/.cache/linkml-reference-validator/private`
|
|
105
|
+
by default. Agents may inspect that cache for background context, but ordinary
|
|
106
|
+
validation never reads it and never cites it as evidence. Validation therefore
|
|
107
|
+
has the same inputs locally, in CI, and on another contributor's machine.
|
|
108
|
+
|
|
109
|
+
To keep the research cache in a private repository or another secured location:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
linkml-reference-validator cache enrich \
|
|
113
|
+
--provider zotero \
|
|
114
|
+
--cache-dir references_cache \
|
|
115
|
+
--private-cache-dir /path/to/private-reference-cache \
|
|
116
|
+
--apply
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
The same location can be configured for all commands:
|
|
120
|
+
|
|
121
|
+
```yaml
|
|
122
|
+
cache_dir: references_cache
|
|
123
|
+
private_cache_dir: /path/to/private-reference-cache
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Zotero-indexed text is preferred. If Zotero has not indexed an attachment, the
|
|
127
|
+
provider downloads it from Zotero's local PDF endpoint and sends it through the
|
|
128
|
+
normal PDF extractor. The source attachment key and `user_library` access type
|
|
129
|
+
are persisted, but the ephemeral localhost URL is not.
|
|
130
|
+
|
|
131
|
+
!!! warning "Keep research caches private"
|
|
132
|
+
|
|
133
|
+
Private cache entries contain extracted manuscript text and may contain a
|
|
134
|
+
copied PDF. Do not place this cache in a public repository or share it
|
|
135
|
+
unless you have permission to redistribute that content.
|
|
136
|
+
|
|
137
|
+
Do not add `zotero` to `full_text_providers`. Even if it is configured there,
|
|
138
|
+
ordinary validation rejects its `user_library` result and continues to public
|
|
139
|
+
providers. Use `cache enrich` when you want to search Zotero.
|
|
140
|
+
|
|
141
|
+
Support for reproducible validation backed by private manuscripts is a future,
|
|
142
|
+
separate feature. The proposed design is a trusted offline job that emits a
|
|
143
|
+
minimal signed excerpt attestation into the public cache. The validator would
|
|
144
|
+
verify the signature using a checked-in public key; neither agents nor CI would
|
|
145
|
+
have the signing key or permission to generate those files directly.
|
|
146
|
+
|
|
147
|
+
## Export a cache to a Zotero collection
|
|
148
|
+
|
|
149
|
+
Export references that still need full text as metadata-only CSL JSON:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
linkml-reference-validator cache export \
|
|
153
|
+
--cache-dir references_cache \
|
|
154
|
+
--format csl-json \
|
|
155
|
+
--needs-full-text \
|
|
156
|
+
--output project-zotero.json
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
The default `--needs-full-text` mode excludes cache entries that already contain
|
|
160
|
+
full text. It also excludes non-publication identifiers, deduplicates by
|
|
161
|
+
normalized DOI and then PMID, and exports only an explicit metadata allowlist:
|
|
162
|
+
title, authors, journal, year, DOI, PMID, and PubMed URL. Cached article text,
|
|
163
|
+
excerpts, provenance, PDFs, and local paths are never exported. Use `--all` only
|
|
164
|
+
when you deliberately want eligible records that already have full text.
|
|
165
|
+
|
|
166
|
+
The exporter refuses to replace an existing output file unless `--force` is
|
|
167
|
+
given. Review the reported counts, then in Zotero choose **File → Import → A
|
|
168
|
+
file**, select the JSON file, and place the imported items in a project-specific
|
|
169
|
+
collection. Zotero supports CSL JSON as a standard import format. After import,
|
|
170
|
+
select the collection and run **Find Full Text**, then rerun `cache enrich`.
|
|
171
|
+
|
|
172
|
+
See [Zotero's standardized-format import instructions](https://www.zotero.org/support/kb/importing_standardized_formats).
|
|
173
|
+
For the complete workflow with screenshots, see
|
|
174
|
+
[Export a Reference Cache to Zotero](export-cache-to-zotero.md).
|
|
175
|
+
|
|
176
|
+
## Preprints
|
|
177
|
+
|
|
178
|
+
Preprints are first-class references. They are increasingly cited for early
|
|
179
|
+
mechanistic findings, but they sit in two distinct universes that need
|
|
180
|
+
different handling:
|
|
181
|
+
|
|
182
|
+
- **NIH Preprint Pilot** — a subset of preprints carry real PMIDs, so they
|
|
183
|
+
resolve through the normal `PMID:` path with no special handling.
|
|
184
|
+
- **Europe PMC `SRC:PPR`** — the much larger preprint firehose is DOI-only
|
|
185
|
+
(no PMIDs). These resolve by DOI through Crossref, or directly by their
|
|
186
|
+
Europe PMC preprint id using the `PPR:` prefix (e.g. `PPR:PPR123456`).
|
|
187
|
+
|
|
188
|
+
### Full-text retrieval
|
|
189
|
+
|
|
190
|
+
Preprint bodies are **not** served by the PMC `fullTextXML` endpoint — even the
|
|
191
|
+
~7% with a PMCID expose only abstract/title/supplementary in PMC, and direct
|
|
192
|
+
`biorxiv.org/...full.pdf` links sit behind a bot challenge. The route that
|
|
193
|
+
works for automated clients is the Europe PMC `fulltextRepo` PDF, used by the
|
|
194
|
+
`epmc_preprint` provider: it resolves a preprint by DOI (or `SRC:PPR` id),
|
|
195
|
+
finds the open `fulltextRepo` PDF URL, and downloads it. The PDF's `%PDF-`
|
|
196
|
+
magic bytes are validated before extraction, so a stale-filename error blob is
|
|
197
|
+
rejected rather than fed to the PDF parser, and the chain falls through
|
|
198
|
+
gracefully.
|
|
199
|
+
|
|
200
|
+
Coverage note: the `epmc_preprint` route covers the Europe-PMC-ingested
|
|
201
|
+
preprint subset. The newest openRxiv DOIs (prefix `10.64898`) are not yet in
|
|
202
|
+
Europe PMC, so very recent preprints may resolve to metadata only until they
|
|
203
|
+
are ingested.
|
|
204
|
+
|
|
205
|
+
### Preprint / peer-review status
|
|
206
|
+
|
|
207
|
+
When a reference is detected as a preprint — via the Crossref `posted-content`
|
|
208
|
+
type or a Europe PMC `SRC:PPR` record — the cached reference records it:
|
|
209
|
+
|
|
210
|
+
| Field | Description |
|
|
211
|
+
|-------|-------------|
|
|
212
|
+
| `is_preprint` | `true` for a preprint, `false` when the source authoritatively classifies it as not a preprint (e.g. a Crossref `journal-article`), and unset when the type is unknown. |
|
|
213
|
+
| `peer_review_status` | `preprint` for preprints; left unset otherwise. |
|
|
214
|
+
|
|
215
|
+
Downstream knowledge bases can use these fields to apply policies such as "a
|
|
216
|
+
preprint may not be the sole support for a claim". A non-preprint is not
|
|
217
|
+
positively asserted as `peer_reviewed`; `peer_review_status` stays unset.
|
|
218
|
+
|
|
219
|
+
## CLI flag
|
|
220
|
+
|
|
221
|
+
Every `validate` subcommand accepts a `--full-text/--no-full-text` flag that
|
|
222
|
+
toggles `fetch_full_text` for that run (default: on):
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# Default: full-text chain is tried
|
|
226
|
+
linkml-reference-validator validate data data.yaml \
|
|
227
|
+
--schema schema.yaml --target-class Statement
|
|
228
|
+
|
|
229
|
+
# Disable full-text fetching (metadata only)
|
|
230
|
+
linkml-reference-validator validate data data.yaml \
|
|
231
|
+
--schema schema.yaml --target-class Statement --no-full-text
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Custom providers
|
|
235
|
+
|
|
236
|
+
You can declare your own JSON-API-backed provider in a YAML file and point
|
|
237
|
+
`full_text_providers_file` at it. Each entry under `full_text_providers` is
|
|
238
|
+
keyed by the provider name and must supply a `url_template`. The template may
|
|
239
|
+
reference `{doi}`, `{pmid}`, or `{pmcid}`. `location_field` is a JSONPath into
|
|
240
|
+
the response that holds the URL of the full-text resource; `format_hint` tells
|
|
241
|
+
the validator how to treat it; and `headers` are sent with the request, with
|
|
242
|
+
`${ENV_VAR}` placeholders interpolated from the environment.
|
|
243
|
+
|
|
244
|
+
```yaml
|
|
245
|
+
full_text_providers:
|
|
246
|
+
myrepo:
|
|
247
|
+
url_template: https://api.example.org/fulltext/{doi}
|
|
248
|
+
location_field: $.links.pdf
|
|
249
|
+
format_hint: pdf
|
|
250
|
+
headers:
|
|
251
|
+
Authorization: Bearer ${MYREPO_TOKEN}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
To actually use a custom provider, add its name to the `full_text_providers`
|
|
255
|
+
chain (it is not enabled merely by being defined), for example:
|
|
256
|
+
|
|
257
|
+
```yaml
|
|
258
|
+
full_text_providers_file: providers.yaml
|
|
259
|
+
full_text_providers:
|
|
260
|
+
- myrepo
|
|
261
|
+
- pmc
|
|
262
|
+
- unpaywall
|
|
263
|
+
- openalex
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## Provenance fields
|
|
267
|
+
|
|
268
|
+
When a reference is enriched with full text, the cached reference records where
|
|
269
|
+
the text came from. These provenance fields are written alongside the content:
|
|
270
|
+
|
|
271
|
+
| Field | Description |
|
|
272
|
+
|-------|-------------|
|
|
273
|
+
| `full_text_provider` | Name of the provider that supplied the full text (e.g. `pmc`, `epmc_preprint`, `unpaywall`, or a custom name). |
|
|
274
|
+
| `oa_status` | Open-access status reported by the provider (e.g. `gold`, `green`, `bronze`). |
|
|
275
|
+
| `license` | License of the open-access copy, when known. |
|
|
276
|
+
| `local_pdf_path` | Path (relative to the cache directory) to the downloaded PDF, when one was persisted. |
|
|
277
|
+
|
|
278
|
+
When full text from a PDF is obtained, the reference's `content_type` becomes
|
|
279
|
+
`full_text_pdf` and the extracted text replaces the abstract-only content. The
|
|
280
|
+
downloaded PDF lives under the cache directory and can be located at
|
|
281
|
+
`cache_dir / local_pdf_path`.
|
|
282
|
+
|
|
283
|
+
## See Also
|
|
284
|
+
|
|
285
|
+
- [Validating DOIs](validate-dois.md) — DOI metadata sources and supplementary files
|
|
286
|
+
- [Validating Entrez Accessions](validate-entrez.md) — PubMed/PMC references
|
|
287
|
+
- [CLI Reference](../reference/cli.md) — complete command documentation
|
{linkml_reference_validator-0.2.1rc1 → linkml_reference_validator-0.2.1rc3}/docs/reference/cli.md
RENAMED
|
@@ -761,6 +761,69 @@ linkml-reference-validator cache lookup PMID:16888623 --content
|
|
|
761
761
|
linkml-reference-validator cache lookup PMID:16888623 --no-cache
|
|
762
762
|
```
|
|
763
763
|
|
|
764
|
+
## cache export
|
|
765
|
+
|
|
766
|
+
Export public bibliographic metadata to CSL JSON for Zotero import.
|
|
767
|
+
|
|
768
|
+
```bash
|
|
769
|
+
linkml-reference-validator cache export --output project-zotero.json [OPTIONS]
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
**Options:**
|
|
773
|
+
|
|
774
|
+
- `--output PATH, -o PATH` - Required destination file
|
|
775
|
+
- `--format TEXT` - Export format (default and currently supported: `csl-json`)
|
|
776
|
+
- `--needs-full-text` - Export only publication records needing full text (default)
|
|
777
|
+
- `--all` - Include eligible records that already contain full text
|
|
778
|
+
- `--cache-dir PATH, -c PATH` - Public reference cache directory
|
|
779
|
+
- `--force, -f` - Replace an existing output file
|
|
780
|
+
- `--config PATH` - Validation configuration file
|
|
781
|
+
- `--verbose, -v` - Enable detailed logging
|
|
782
|
+
|
|
783
|
+
```bash
|
|
784
|
+
linkml-reference-validator cache export \
|
|
785
|
+
--cache-dir references_cache \
|
|
786
|
+
--needs-full-text \
|
|
787
|
+
--output project-zotero.json
|
|
788
|
+
```
|
|
789
|
+
|
|
790
|
+
The output is a DOI/PMID-deduplicated metadata allowlist. It never includes
|
|
791
|
+
cached article content, excerpts, PDFs, local paths, or private-cache data.
|
|
792
|
+
|
|
793
|
+
---
|
|
794
|
+
|
|
795
|
+
## cache enrich
|
|
796
|
+
|
|
797
|
+
Inventory or enrich existing abstract-only cache entries through one full-text
|
|
798
|
+
provider. This is primarily intended for opt-in private-library providers such
|
|
799
|
+
as Zotero.
|
|
800
|
+
|
|
801
|
+
```bash
|
|
802
|
+
linkml-reference-validator cache enrich [OPTIONS]
|
|
803
|
+
```
|
|
804
|
+
|
|
805
|
+
**Options:**
|
|
806
|
+
|
|
807
|
+
- `--provider TEXT` - Registered provider name (default: `zotero`)
|
|
808
|
+
- `--cache-dir PATH, -c PATH` - Reference cache directory
|
|
809
|
+
- `--private-cache-dir PATH` - Separate private research-cache destination (default: `~/.cache/linkml-reference-validator/private`)
|
|
810
|
+
- `--dry-run` - Report matches without changing files (default)
|
|
811
|
+
- `--apply` - Materialize usable matches into the private research cache
|
|
812
|
+
- `--config PATH` - Validation configuration file
|
|
813
|
+
- `--verbose, -v` - Enable detailed logging
|
|
814
|
+
|
|
815
|
+
```bash
|
|
816
|
+
# Safe inventory
|
|
817
|
+
linkml-reference-validator cache enrich --provider zotero --dry-run
|
|
818
|
+
|
|
819
|
+
# Apply reviewed exact matches
|
|
820
|
+
linkml-reference-validator cache enrich --provider zotero --apply
|
|
821
|
+
```
|
|
822
|
+
|
|
823
|
+
The public source cache is never modified by this command, and validation never
|
|
824
|
+
reads the private destination. Private-library content may be copyrighted; keep
|
|
825
|
+
the research cache private.
|
|
826
|
+
|
|
764
827
|
---
|
|
765
828
|
|
|
766
829
|
## Reference ID Formats
|