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.
Files changed (182) hide show
  1. linkml_reference_validator-0.2.1rc1/.github/workflows/claude-code-review.yml +61 -0
  2. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/claude-ontology-review.yml +13 -27
  3. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/claude.yml +12 -40
  4. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/dragon-ai.yml +1 -1
  5. linkml_reference_validator-0.2.0/README.md → linkml_reference_validator-0.2.1rc1/PKG-INFO +39 -0
  6. linkml_reference_validator-0.2.0/PKG-INFO → linkml_reference_validator-0.2.1rc1/README.md +18 -20
  7. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/concepts/editorial-conventions.md +28 -0
  8. linkml_reference_validator-0.2.1rc1/docs/how-to/fetch-full-text-and-pdfs.md +139 -0
  9. linkml_reference_validator-0.2.1rc1/docs/superpowers/plans/2026-06-12-modular-pdf-fulltext-fetching.md +2969 -0
  10. linkml_reference_validator-0.2.1rc1/docs/superpowers/specs/2026-06-12-modular-pdf-fulltext-fetching-design.md +260 -0
  11. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/mkdocs.yml +1 -0
  12. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/pyproject.toml +1 -0
  13. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/shared.py +8 -0
  14. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/validate.py +66 -33
  15. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/acquire.py +134 -0
  16. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/extract/__init__.py +16 -0
  17. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/extract/base.py +64 -0
  18. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/extract/html.py +46 -0
  19. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/extract/pdf.py +67 -0
  20. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/extract/xml.py +46 -0
  21. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/__init__.py +19 -0
  22. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/base.py +70 -0
  23. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/json_api.py +135 -0
  24. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/loader.py +94 -0
  25. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/openalex.py +70 -0
  26. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/pmc.py +124 -0
  27. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/fulltext/unpaywall.py +69 -0
  28. linkml_reference_validator-0.2.1rc1/src/linkml_reference_validator/etl/identifiers.py +58 -0
  29. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/reference_fetcher.py +208 -0
  30. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/pmid.py +2 -6
  31. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/url.py +43 -12
  32. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/field_detection.py +43 -2
  33. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/models.py +138 -0
  34. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/plugins/reference_validation_plugin.py +6 -1
  35. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/validation/supporting_text_validator.py +24 -4
  36. linkml_reference_validator-0.2.1rc1/tests/data/test_data_deep_nesting_invalid.yaml +17 -0
  37. linkml_reference_validator-0.2.1rc1/tests/data/test_data_deep_nesting_valid.yaml +23 -0
  38. linkml_reference_validator-0.2.1rc1/tests/data/test_schema_deep_nesting.yaml +74 -0
  39. linkml_reference_validator-0.2.1rc1/tests/test_acquire.py +116 -0
  40. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_cli.py +266 -0
  41. linkml_reference_validator-0.2.1rc1/tests/test_deep_nesting.py +401 -0
  42. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_e2e_integration.py +58 -0
  43. linkml_reference_validator-0.2.1rc1/tests/test_extractors.py +104 -0
  44. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_field_detection.py +47 -0
  45. linkml_reference_validator-0.2.1rc1/tests/test_fulltext_loader.py +97 -0
  46. linkml_reference_validator-0.2.1rc1/tests/test_fulltext_providers.py +175 -0
  47. linkml_reference_validator-0.2.1rc1/tests/test_identifiers.py +31 -0
  48. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_models.py +41 -0
  49. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_optional_linkml_dependency.py +31 -3
  50. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_reference_fetcher.py +291 -32
  51. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_sources.py +42 -28
  52. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_supporting_text_validator.py +65 -0
  53. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_title_validation.py +2 -0
  54. linkml_reference_validator-0.2.1rc1/tests/test_unknown_slot_traversal.py +131 -0
  55. linkml_reference_validator-0.2.1rc1/tests/test_validation_config.py +72 -0
  56. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/uv.lock +14 -0
  57. linkml_reference_validator-0.2.0/.github/workflows/claude-code-review.yml +0 -78
  58. linkml_reference_validator-0.2.0/tests/test_validation_config.py +0 -38
  59. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.claude/.mcp.json +0 -0
  60. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.claude/settings.json +0 -0
  61. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.copier-answers.yml +0 -0
  62. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.devcontainer/devcontainer.json +0 -0
  63. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.devcontainer/post_create.sh +0 -0
  64. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.editorconfig +0 -0
  65. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/actions/claude-code-action/action.yml +0 -0
  66. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/actions/claude-issue-summarize-action/action.yml +0 -0
  67. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/actions/claude-issue-triage-action/action.yml +0 -0
  68. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/ai-controllers.json +0 -0
  69. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/copilot-instructions.md +0 -0
  70. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/copilot-setup-steps.yml +0 -0
  71. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/dependabot.yml +0 -0
  72. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/claude-issue-summarize.yml +0 -0
  73. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/claude-issue-triage.yml +0 -0
  74. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/deploy-docs.yaml +0 -0
  75. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/main.yaml +0 -0
  76. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.github/workflows/pypi-publish.yaml +0 -0
  77. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.gitignore +0 -0
  78. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.goosehints +0 -0
  79. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.pre-commit-config.yaml +0 -0
  80. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/.yamllint.yaml +0 -0
  81. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/AGENTS.md +0 -0
  82. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/BUG_GEO_ACCESSION_TO_UID.md +0 -0
  83. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/BUG_ZENODO_DOI_AND_URL_HANDLING.md +0 -0
  84. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/CLAUDE.md +0 -0
  85. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/CLI-ISSUES.md +0 -0
  86. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/CODE_OF_CONDUCT.md +0 -0
  87. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/CONTRIBUTING.md +0 -0
  88. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/FEATURE_REQUEST_REPAIR.md +0 -0
  89. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/LICENSE +0 -0
  90. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/REVIEW2.md +0 -0
  91. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/REVIEW3.md +0 -0
  92. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/ai.just +0 -0
  93. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/copilot-instructions.md +0 -0
  94. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/about.md +0 -0
  95. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/concepts/content-types.md +0 -0
  96. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/concepts/how-it-works.md +0 -0
  97. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/elements/.gitkeep +0 -0
  98. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/add-reference-source.md +0 -0
  99. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/repair-validation-errors.md +0 -0
  100. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/skip-unsupported-references.md +0 -0
  101. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/use-local-files-and-urls.md +0 -0
  102. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-clinical-trials.md +0 -0
  103. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-dois.md +0 -0
  104. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-entrez.md +0 -0
  105. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-obo-files.md +0 -0
  106. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-titles.md +0 -0
  107. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/how-to/validate-urls.md +0 -0
  108. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/index.md +0 -0
  109. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/notebooks/01_getting_started.ipynb +0 -0
  110. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/notebooks/02_advanced_usage.ipynb +0 -0
  111. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/notebooks/03_python_api.ipynb +0 -0
  112. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/notebooks/04_obo_validation.ipynb +0 -0
  113. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/notebooks/05_geo_validation.ipynb +0 -0
  114. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/quickstart.md +0 -0
  115. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/reference/cli.md +0 -0
  116. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/setup-guide.md +0 -0
  117. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/templates-linkml/README.md +0 -0
  118. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/todo.md +0 -0
  119. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/troubleshooting.md +0 -0
  120. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/docs/tutorials/complete-workflow.md +0 -0
  121. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/examples/README.md +0 -0
  122. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/justfile +0 -0
  123. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/mypy.ini +0 -0
  124. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/notebooks/01_getting_started.ipynb +0 -0
  125. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/notebooks/02_advanced_usage.ipynb +0 -0
  126. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/notebooks/03_python_api.ipynb +0 -0
  127. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/notebooks/README.md +0 -0
  128. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/project/README.md +0 -0
  129. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/project.justfile +0 -0
  130. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/pytest.ini +0 -0
  131. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/__init__.py +0 -0
  132. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/_version.py +0 -0
  133. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/__init__.py +0 -0
  134. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/cache.py +0 -0
  135. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/lookup.py +0 -0
  136. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/cli/repair.py +0 -0
  137. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/__init__.py +0 -0
  138. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/__init__.py +0 -0
  139. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/base.py +0 -0
  140. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/clinicaltrials.py +0 -0
  141. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/doi.py +0 -0
  142. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/entrez.py +0 -0
  143. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/file.py +0 -0
  144. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/json_api.py +0 -0
  145. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/loader.py +0 -0
  146. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/sources/utils.py +0 -0
  147. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/etl/text_extractor.py +0 -0
  148. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/plugins/REVIEW.md +0 -0
  149. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/plugins/__init__.py +0 -0
  150. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/validation/__init__.py +0 -0
  151. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/validation/fuzzy_text_utils.py +0 -0
  152. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/src/linkml_reference_validator/validation/repairer.py +0 -0
  153. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/__init__.py +0 -0
  154. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/conftest.py +0 -0
  155. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/data/test_data_invalid.yaml +0 -0
  156. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/data/test_data_valid.yaml +0 -0
  157. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/data/test_schema.yaml +0 -0
  158. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/CLINICALTRIALS_NCT00000001.md +0 -0
  159. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/GEO_GSE12345.md +0 -0
  160. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMC_TEST001.md +0 -0
  161. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMC_TEST001.txt +0 -0
  162. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMC_TEST002.md +0 -0
  163. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMC_TEST002.txt +0 -0
  164. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST001.md +0 -0
  165. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST001.txt +0 -0
  166. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST002.md +0 -0
  167. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST002.txt +0 -0
  168. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST003.md +0 -0
  169. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/PMID_TEST003.txt +0 -0
  170. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/fixtures/sample.obo +0 -0
  171. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_cli_lookup.py +0 -0
  172. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_cli_repair.py +0 -0
  173. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_clinicaltrials_integration.py +0 -0
  174. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_fuzzy_suggestions.py +0 -0
  175. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_geo_integration.py +0 -0
  176. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_json_api_source.py +0 -0
  177. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_plugin_integration.py +0 -0
  178. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_pmc_fulltext.py +0 -0
  179. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_real_validation.py +0 -0
  180. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_repair.py +0 -0
  181. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1rc1}/tests/test_source_utils.py +0 -0
  182. {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@beta
38
+ uses: anthropics/claude-code-action@v1
39
39
  with:
40
40
  claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
41
41
 
42
- # Optional: Specify model (commenting defaults to Claude Sonnet 4)
43
- model: "claude-opus-4-1-20250805"
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
- # Direct prompt for automated review (no @claude mention needed)
46
- direct_prompt: |
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@beta
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
- # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4.1)
70
- # model: "claude-opus-4-1-20250805"
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
 
@@ -29,7 +29,7 @@ jobs:
29
29
 
30
30
  - name: Check for qualifying mention
31
31
  id: check
32
- uses: actions/github-script@v8
32
+ uses: actions/github-script@v9
33
33
  with:
34
34
  github-token: ${{ secrets.PAT_FOR_PR }} # Use PAT instead of default token
35
35
  script: |
@@ -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
  [![Tests](https://img.shields.io/badge/tests-91%20passing-brightgreen)]()
@@ -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
  [![Tests](https://img.shields.io/badge/tests-91%20passing-brightgreen)]()
@@ -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