pymetadata 0.6.2__tar.gz → 0.6.3__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 (216) hide show
  1. {pymetadata-0.6.2 → pymetadata-0.6.3}/.bumpversion.toml +1 -1
  2. {pymetadata-0.6.2 → pymetadata-0.6.3}/.github/workflows/ci-cd.yml +5 -1
  3. {pymetadata-0.6.2 → pymetadata-0.6.3}/CITATION.cff +1 -1
  4. {pymetadata-0.6.2 → pymetadata-0.6.3}/CLAUDE.md +1 -1
  5. {pymetadata-0.6.2 → pymetadata-0.6.3}/PKG-INFO +3 -2
  6. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/development.md +4 -4
  7. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/installation.md +1 -1
  8. {pymetadata-0.6.2 → pymetadata-0.6.3}/pyproject.toml +2 -1
  9. pymetadata-0.6.3/release-notes/0.6.3.md +16 -0
  10. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/__init__.py +1 -1
  11. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/webservices/unichem.py +59 -32
  12. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/test_unichem.py +42 -0
  13. {pymetadata-0.6.2 → pymetadata-0.6.3}/tox.ini +1 -1
  14. {pymetadata-0.6.2 → pymetadata-0.6.3}/.github/CODEOWNERS +0 -0
  15. {pymetadata-0.6.2 → pymetadata-0.6.3}/.github/dependabot.yml +0 -0
  16. {pymetadata-0.6.2 → pymetadata-0.6.3}/.github/pull_request_template.md +0 -0
  17. {pymetadata-0.6.2 → pymetadata-0.6.3}/.github/rulesets/apply.sh +0 -0
  18. {pymetadata-0.6.2 → pymetadata-0.6.3}/.github/rulesets/develop.json +0 -0
  19. {pymetadata-0.6.2 → pymetadata-0.6.3}/.github/rulesets/main.json +0 -0
  20. {pymetadata-0.6.2 → pymetadata-0.6.3}/.github/rulesets/tags.json +0 -0
  21. {pymetadata-0.6.2 → pymetadata-0.6.3}/.github/workflows/docs.yml +0 -0
  22. {pymetadata-0.6.2 → pymetadata-0.6.3}/.github/workflows/ruff.yml +0 -0
  23. {pymetadata-0.6.2 → pymetadata-0.6.3}/.github/workflows/ty.yml +0 -0
  24. {pymetadata-0.6.2 → pymetadata-0.6.3}/.gitignore +0 -0
  25. {pymetadata-0.6.2 → pymetadata-0.6.3}/.pre-commit-config.yaml +0 -0
  26. {pymetadata-0.6.2 → pymetadata-0.6.3}/.python-version +0 -0
  27. {pymetadata-0.6.2 → pymetadata-0.6.3}/.ruff.toml +0 -0
  28. {pymetadata-0.6.2 → pymetadata-0.6.3}/.zenodo.json +0 -0
  29. {pymetadata-0.6.2 → pymetadata-0.6.3}/LICENSE +0 -0
  30. {pymetadata-0.6.2 → pymetadata-0.6.3}/README.md +0 -0
  31. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/README.md +0 -0
  32. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/annotations.md +0 -0
  33. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/cache.md +0 -0
  34. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/console.md +0 -0
  35. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/core.annotation.md +0 -0
  36. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/core.creator.md +0 -0
  37. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/core.miriam.md +0 -0
  38. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/core.xref.md +0 -0
  39. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/index.md +0 -0
  40. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/log.md +0 -0
  41. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/omex.md +0 -0
  42. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/ontologies.term.md +0 -0
  43. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/webservices.chebi.md +0 -0
  44. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/webservices.ols.md +0 -0
  45. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/webservices.registry.md +0 -0
  46. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/webservices.unichem.md +0 -0
  47. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/api/webservices.webservice.md +0 -0
  48. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/images/HARMONY2026_slides.png +0 -0
  49. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/images/favicon/about.txt +0 -0
  50. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/images/favicon/android-chrome-192x192.png +0 -0
  51. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/images/favicon/android-chrome-512x512.png +0 -0
  52. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/images/favicon/apple-touch-icon.png +0 -0
  53. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/images/favicon/favicon-16x16.png +0 -0
  54. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/images/favicon/favicon-32x32.png +0 -0
  55. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/images/favicon/favicon.ico +0 -0
  56. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/images/favicon/favicon_io.zip +0 -0
  57. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/images/favicon/pymetadata-100x100-300dpi.png +0 -0
  58. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/images/favicon/site.webmanifest +0 -0
  59. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/index.md +0 -0
  60. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/omex.md +0 -0
  61. {pymetadata-0.6.2 → pymetadata-0.6.3}/docs/robots.txt +0 -0
  62. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/annotation.py +0 -0
  63. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/cache_path.py +0 -0
  64. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/MODEL2402290004.4_pymetadata.omex +0 -0
  65. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/create_omex.py +0 -0
  66. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/BioModelsMetadata_MODEL2402290004.csv +0 -0
  67. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/EndoAcuteBZ1.m +0 -0
  68. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/EndoAcuteBZ2.m +0 -0
  69. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/EndoAcuteBZ3.m +0 -0
  70. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/EndoChronicBZ.m +0 -0
  71. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/EndoChronicRZ1.m +0 -0
  72. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/EndoChronicRZ2.m +0 -0
  73. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/EndoNZ.m +0 -0
  74. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/POM253.mat +0 -0
  75. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/PlotAPCaTTaAcuteAndChronic.m +0 -0
  76. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/Zhou2024_Updated-model.m +0 -0
  77. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/getCurrentsStructureCaMKSKJrelpKinetics.m +0 -0
  78. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/getStartingState.m +0 -0
  79. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/main.m +0 -0
  80. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/manifest.xml +0 -0
  81. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/metadata.rdf +0 -0
  82. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/modelRunnerCaMKSKJrelpKinetics1ms.m +0 -0
  83. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/biomodels_omex/files/model_ToRORd_LandCaMKSKJrelpKinetics.m +0 -0
  84. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/omex.py +0 -0
  85. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/omex_from_url.py +0 -0
  86. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/omex/test.omex +0 -0
  87. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/pbpko.py +0 -0
  88. {pymetadata-0.6.2 → pymetadata-0.6.3}/examples/sbo.py +0 -0
  89. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/.gitignore +0 -0
  90. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/README.md +0 -0
  91. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/_extensions/grantmcdermott/clean/_extension.yml +0 -0
  92. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/_extensions/grantmcdermott/clean/clean.scss +0 -0
  93. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/_extensions/grantmcdermott/clean/mathjax-config.js +0 -0
  94. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/custom.scss +0 -0
  95. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/images/annotation_example.png +0 -0
  96. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/images/annotation_resolved.png +0 -0
  97. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/images/annotation_resolved_small.png +0 -0
  98. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/images/github_screenshot.png +0 -0
  99. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/images/headshot.png +0 -0
  100. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/images/omex_logo.png +0 -0
  101. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/images/omex_overview.png +0 -0
  102. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/images/pymetadata.png +0 -0
  103. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/images/pymetadata_large.png +0 -0
  104. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/images/qr_livermetabolism.png +0 -0
  105. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/mathjax-config.js +0 -0
  106. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/pymetadata.bib +0 -0
  107. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/pymetadata.qmd +0 -0
  108. {pymetadata-0.6.2 → pymetadata-0.6.3}/presentations/HARMONY2026/styles.css +0 -0
  109. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.10.md +0 -0
  110. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.11.md +0 -0
  111. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.12.md +0 -0
  112. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.13.md +0 -0
  113. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.14.md +0 -0
  114. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.15.md +0 -0
  115. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.16.md +0 -0
  116. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.17.md +0 -0
  117. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.18.md +0 -0
  118. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.19.md +0 -0
  119. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.2.md +0 -0
  120. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.20.md +0 -0
  121. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.21.md +0 -0
  122. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.22.md +0 -0
  123. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.3.md +0 -0
  124. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.4.md +0 -0
  125. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.5.md +0 -0
  126. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.6.md +0 -0
  127. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.7.md +0 -0
  128. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.8.md +0 -0
  129. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.0.9.md +0 -0
  130. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.1.0.md +0 -0
  131. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.2.1.md +0 -0
  132. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.2.10.md +0 -0
  133. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.2.2.md +0 -0
  134. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.2.3.md +0 -0
  135. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.2.4.md +0 -0
  136. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.2.5.md +0 -0
  137. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.2.6.md +0 -0
  138. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.2.7.md +0 -0
  139. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.2.8.md +0 -0
  140. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.2.9.md +0 -0
  141. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.0.md +0 -0
  142. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.1.md +0 -0
  143. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.10.md +0 -0
  144. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.11.md +0 -0
  145. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.2.md +0 -0
  146. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.3.md +0 -0
  147. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.4.md +0 -0
  148. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.5.md +0 -0
  149. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.6.md +0 -0
  150. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.7.md +0 -0
  151. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.8.md +0 -0
  152. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.3.9.md +0 -0
  153. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.4.0.md +0 -0
  154. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.4.1.md +0 -0
  155. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.4.2.md +0 -0
  156. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.4.3.md +0 -0
  157. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.4.4.md +0 -0
  158. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.0.md +0 -0
  159. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.1.md +0 -0
  160. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.10.md +0 -0
  161. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.11.md +0 -0
  162. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.12.md +0 -0
  163. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.2.md +0 -0
  164. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.3.md +0 -0
  165. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.4.md +0 -0
  166. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.5.md +0 -0
  167. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.6.md +0 -0
  168. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.7.md +0 -0
  169. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.8.md +0 -0
  170. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.5.9.md +0 -0
  171. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.6.0.md +0 -0
  172. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.6.1.md +0 -0
  173. {pymetadata-0.6.2 → pymetadata-0.6.3}/release-notes/0.6.2.md +0 -0
  174. {pymetadata-0.6.2 → pymetadata-0.6.3}/scripts/llms_txt.py +0 -0
  175. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/cache.py +0 -0
  176. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/console.py +0 -0
  177. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/core/__init__.py +0 -0
  178. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/core/annotation.py +0 -0
  179. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/core/creator.py +0 -0
  180. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/core/miriam.py +0 -0
  181. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/core/synonym.py +0 -0
  182. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/core/xref.py +0 -0
  183. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/log.py +0 -0
  184. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/omex.py +0 -0
  185. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/ontologies/__init__.py +0 -0
  186. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/ontologies/_ontology_builder.py +0 -0
  187. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/ontologies/kisao.py +0 -0
  188. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/ontologies/pbpko.py +0 -0
  189. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/ontologies/sbo.py +0 -0
  190. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/ontologies/term.py +0 -0
  191. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/py.typed +0 -0
  192. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/resources/ontologies/README.md +0 -0
  193. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/webservices/__init__.py +0 -0
  194. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/webservices/chebi.py +0 -0
  195. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/webservices/ols.py +0 -0
  196. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/webservices/registry.py +0 -0
  197. {pymetadata-0.6.2 → pymetadata-0.6.3}/src/pymetadata/webservices/webservice.py +0 -0
  198. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/core/test_annotation.py +0 -0
  199. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/core/test_creator.py +0 -0
  200. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/data/omex/BIOMD0000000001.omex +0 -0
  201. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/data/omex/CombineArchiveShowCase.omex +0 -0
  202. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/data/omex/CombineArchiveShowCase_manifest.xml +0 -0
  203. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/data/omex/CompModels.omex +0 -0
  204. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/data/omex/CompModels_manifest.xml +0 -0
  205. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/data/omex/iCGB21FR.omex +0 -0
  206. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/test_cache.py +0 -0
  207. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/test_chebi.py +0 -0
  208. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/test_log.py +0 -0
  209. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/test_offline.py +0 -0
  210. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/test_ols.py +0 -0
  211. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/test_omex.py +0 -0
  212. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/test_ontology.py +0 -0
  213. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/test_registry.py +0 -0
  214. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/test_sbo_kisao.py +0 -0
  215. {pymetadata-0.6.2 → pymetadata-0.6.3}/tests/test_webservice.py +0 -0
  216. {pymetadata-0.6.2 → pymetadata-0.6.3}/zensical.toml +0 -0
@@ -1,5 +1,5 @@
1
1
  [tool.bumpversion]
2
- current_version = "0.6.2"
2
+ current_version = "0.6.3"
3
3
  commit = true
4
4
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
5
5
  serialize = ["{major}.{minor}.{patch}"]
@@ -26,7 +26,7 @@ jobs:
26
26
  fail-fast: false
27
27
  matrix:
28
28
  os: [ubuntu-latest, windows-latest, macos-latest]
29
- python-version: ["3.11", "3.12", "3.13", "3.14"]
29
+ python-version: ["3.11", "3.12", "3.13", "3.14", "3.15"]
30
30
  # linux covers the full range, windows and macos only the newest version
31
31
  exclude:
32
32
  - os: windows-latest
@@ -35,12 +35,16 @@ jobs:
35
35
  python-version: "3.12"
36
36
  - os: windows-latest
37
37
  python-version: "3.13"
38
+ - os: windows-latest
39
+ python-version: "3.14"
38
40
  - os: macos-latest
39
41
  python-version: "3.11"
40
42
  - os: macos-latest
41
43
  python-version: "3.12"
42
44
  - os: macos-latest
43
45
  python-version: "3.13"
46
+ - os: macos-latest
47
+ python-version: "3.14"
44
48
 
45
49
  steps:
46
50
  - uses: actions/checkout@v7
@@ -8,7 +8,7 @@ authors:
8
8
  given-names: "Matthias"
9
9
  orcid: "https://orcid.org/0000-0003-1725-179X"
10
10
  affiliation: "Humboldt-University Berlin, Faculty of Life Science, Institute for Biology, Biology, Berlin; University Lübeck; University Hospital Schleswig-Holstein, Campus Lübeck, First Department of Medicine, Germany"
11
- version: "0.6.2"
11
+ version: "0.6.3"
12
12
  date-released: "2026-09-07"
13
13
  doi: "10.5281/zenodo.5308801"
14
14
  license: MIT
@@ -22,7 +22,7 @@ uv run pre-commit install
22
22
  pytest # all tests
23
23
  pytest tests/test_omex.py # single file
24
24
  pytest tests/test_omex.py::test_entry_from_dict # single test
25
- tox r -e py3.14 # single tox env (py3.11-3.14 available)
25
+ tox r -e py3.15 # single tox env (py3.11-3.15 available)
26
26
  tox run-parallel # full matrix + ty
27
27
 
28
28
  # lint / format / types
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pymetadata
3
- Version: 0.6.2
3
+ Version: 0.6.3
4
4
  Summary: pymetadata are python utilities for working with metadata.
5
5
  Project-URL: Homepage, https://matthiaskoenig.github.io/pymetadata
6
6
  Project-URL: Documentation, https://matthiaskoenig.github.io/pymetadata
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Classifier: Programming Language :: Python :: 3.14
23
+ Classifier: Programming Language :: Python :: 3.15
23
24
  Classifier: Programming Language :: Python :: Implementation :: CPython
24
25
  Classifier: Topic :: Scientific/Engineering
25
26
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
@@ -37,7 +38,7 @@ Requires-Dist: pytest>=9.1.1; extra == 'dev'
37
38
  Requires-Dist: ruff>=0.16.6; extra == 'dev'
38
39
  Requires-Dist: tox>=4.61.2; extra == 'dev'
39
40
  Requires-Dist: ty>=0.0.78; extra == 'dev'
40
- Requires-Dist: zensical>=0.0.59; extra == 'dev'
41
+ Requires-Dist: zensical>=0.0.60; extra == 'dev'
41
42
  Provides-Extra: ontology
42
43
  Requires-Dist: pronto>=2.7.3; extra == 'ontology'
43
44
  Description-Content-Type: text/markdown
@@ -27,7 +27,7 @@ A pull request can only be merged once the four required checks are green:
27
27
 
28
28
  | check | workflow | content |
29
29
  | ------- | ------------- | -------------------------------------------------------------------- |
30
- | `tests` | `ci-cd.yml` | the test matrix, linux, macos and windows with python 3.11 to 3.14 |
30
+ | `tests` | `ci-cd.yml` | the test matrix, linux, macos and windows with python 3.11 to 3.15 |
31
31
  | `ruff` | `ruff.yml` | `ruff check` and `ruff format --check` |
32
32
  | `ty` | `ty.yml` | `tox r -e ty` |
33
33
  | `docs` | `docs.yml` | the zensical build including the api reference and the agent files |
@@ -118,16 +118,16 @@ From now on every commit is checked with ruff (lint and format) and ty, i.e., th
118
118
 
119
119
  The tests are written with pytest, tox runs them against every supported python version.
120
120
 
121
- The tox environments are named after the interpreter (`py3.11` to `py3.14`, see `envlist` in `tox.ini`), a single one is run with
121
+ The tox environments are named after the interpreter (`py3.11` to `py3.15`, see `envlist` in `tox.ini`), a single one is run with
122
122
  ```bash
123
- tox r -e py3.14
123
+ tox r -e py3.15
124
124
  ```
125
125
  and the complete matrix, including the `ty` environment, in parallel with
126
126
  ```bash
127
127
  tox run-parallel
128
128
  ```
129
129
 
130
- This needs the interpreters to be available, which uv installs with `uv python install 3.11 3.12 3.13 3.14`. Continuous integration runs the same environments as `uvx --with tox-uv tox -e py3.14`.
130
+ This needs the interpreters to be available, which uv installs with `uv python install 3.11 3.12 3.13 3.14 3.15`. Continuous integration runs the same environments as `uvx --with tox-uv tox -e py3.15`.
131
131
 
132
132
  To run the tests directly against the development environment use
133
133
 
@@ -1,6 +1,6 @@
1
1
  # Installation
2
2
 
3
- `pymetadata` requires python >= 3.11 and is available from [pypi](https://pypi.python.org/pypi/pymetadata). It is pure python without compiled dependencies, so the installation is the same on Linux, macOS and Windows.
3
+ `pymetadata` requires python >= 3.11 and is available from [pypi](https://pypi.python.org/pypi/pymetadata). It is pure python and tested with python 3.11 to 3.15 on Linux, macOS and Windows. The only compiled dependency is `pydantic-core`, which comes with [pydantic](https://docs.pydantic.dev/) and is installed from a wheel; for python 3.15 these wheels are part of pydantic 2.14, with an older pydantic it is built from source, which requires a Rust toolchain.
4
4
 
5
5
  ## With uv
6
6
 
@@ -24,6 +24,7 @@ classifiers = [
24
24
  "Programming Language :: Python :: 3.12",
25
25
  "Programming Language :: Python :: 3.13",
26
26
  "Programming Language :: Python :: 3.14",
27
+ "Programming Language :: Python :: 3.15",
27
28
  "Programming Language :: Python :: Implementation :: CPython",
28
29
  "Topic :: Scientific/Engineering",
29
30
  "Topic :: Scientific/Engineering :: Bio-Informatics",
@@ -57,7 +58,7 @@ dev = [
57
58
  "tox>=4.61.2",
58
59
  "pytest>=9.1.1",
59
60
  "pytest-cov>=7.1.0",
60
- "zensical>=0.0.59",
61
+ "zensical>=0.0.60",
61
62
  "mkdocstrings-python>=2.0.8",
62
63
  ]
63
64
 
@@ -0,0 +1,16 @@
1
+ # Release notes for pymetadata 0.6.3
2
+ ![pymetadata](./docs/images/favicon/pymetadata-100x100-300dpi.png)
3
+
4
+ We are pleased to release the next version of pymetadata including the
5
+ following changes:
6
+
7
+ ## Features
8
+ - support for python 3.15, which is part of the test matrix and the tox environments
9
+
10
+ ## Fixes
11
+ - `UnichemQuery` works with the current UniChem web service again, which changed the fields of a source (`lastChecked` and `srcLastUpdated` are new, `lastUpdated`, `srcReleaseDate` and `srcReleaseNumber` were removed). Only `sourceID` and `name` of a `UnichemSource` are required now and `UnichemSource.from_dict` ignores unknown fields, so such a change, or a cache written by an older version, no longer breaks the queries
12
+
13
+ ## Development
14
+ - the development environment requires zensical 0.0.60, the version the documentation is built with
15
+
16
+ Your pymetadata team
@@ -7,7 +7,7 @@ from pathlib import Path
7
7
  logging.getLogger(__name__).addHandler(logging.NullHandler())
8
8
 
9
9
  __author__ = "Matthias Koenig"
10
- __version__ = "0.6.2"
10
+ __version__ = "0.6.3"
11
11
 
12
12
 
13
13
  program_name: str = "pymetadata"
@@ -17,9 +17,9 @@ See <https://www.ebi.ac.uk/unichem/info/webservices>.
17
17
  import contextlib
18
18
  import logging
19
19
  import urllib.parse
20
- from dataclasses import dataclass, field
20
+ from dataclasses import dataclass, field, fields
21
21
  from pathlib import Path
22
- from typing import ClassVar
22
+ from typing import Any, ClassVar
23
23
 
24
24
  import pymetadata
25
25
  from pymetadata.cache import (
@@ -37,34 +37,62 @@ logger = logging.getLogger(__name__)
37
37
 
38
38
  @dataclass
39
39
  class UnichemSource:
40
- """Unichem source.
41
-
42
- src_id (the src_id for this source),
43
- src_url (the main home page of the source),
44
- name (the unique name for the source in UniChem, always lower case),
45
- name_long (the full name of the source, as defined by the source),
46
- name_label (A name for the source suitable for use as a 'label' for the source within a web-page. Correct case setting for source, and always less than 30 characters),
47
- description (a description of the content of the source),
48
- base_id_url_available (an flag indicating whether this source provides a valid base_id_url for creating cpd-specific links [1=yes, 0=no]).
49
- base_id_url (the base url for constructing hyperlinks to this source [append an identifier from this source to the end of this url to create a valid url to a specific page for this cpd], unless aux_for_url=1),
50
- aux_for_url (A flag to indicate whether the aux_src field should be used to create hyperlinks instead of the src_compound_id [1=yes, 0=no]
40
+ """Database known to UniChem, see the `sources` endpoint of the web service.
41
+
42
+ Only `sourceID` and `name` are required. UniChem adds and removes the
43
+ descriptive fields without notice, so they are optional, and
44
+ `UnichemSource.from_dict` ignores fields which are not declared here.
45
+
46
+ Attributes:
47
+ sourceID: id of the source in UniChem
48
+ name: unique name of the source in UniChem, always lower case
49
+ nameLabel: name suitable as label of the source, in the case used by
50
+ the source
51
+ nameLong: full name of the source, as defined by the source
52
+ srcUrl: home page of the source
53
+ baseIdUrl: base url for links to a compound in the source; the
54
+ identifier of the compound is appended or replaces `{$id}`
55
+ description: description of the content of the source
56
+ UCICount: number of UniChem compound identifiers in the source
57
+ created: date the source was added to UniChem
58
+ lastChecked: date UniChem checked the source for an update
59
+ srcLastUpdated: date of the last update of the source
60
+ srcDetails: details on the source
61
+ updateComments: comments on the update of the source
62
+ private: the source is not public
51
63
  """
52
64
 
53
65
  sourceID: int
54
- srcUrl: str
55
66
  name: str
56
- nameLabel: str = field(repr=False)
57
- nameLong: str = field(repr=False)
58
- UCICount: int = field(repr=False)
59
- baseIdUrl: str = field(repr=False)
60
- description: str = field(repr=False)
61
- created: str = field(repr=False)
62
- lastUpdated: str = field(repr=False)
63
- srcDetails: str = field(repr=False)
64
- srcReleaseDate: str = field(repr=False)
65
- srcReleaseNumber: int = field(repr=False)
66
- updateComments: str = field(repr=False)
67
- private: bool = field(repr=False)
67
+ nameLabel: str | None = field(default=None, repr=False)
68
+ nameLong: str | None = field(default=None, repr=False)
69
+ srcUrl: str | None = None
70
+ baseIdUrl: str | None = field(default=None, repr=False)
71
+ description: str | None = field(default=None, repr=False)
72
+ UCICount: int | None = field(default=None, repr=False)
73
+ created: str | None = field(default=None, repr=False)
74
+ lastChecked: str | None = field(default=None, repr=False)
75
+ srcLastUpdated: str | None = field(default=None, repr=False)
76
+ srcDetails: str | None = field(default=None, repr=False)
77
+ updateComments: str | None = field(default=None, repr=False)
78
+ private: bool | None = field(default=None, repr=False)
79
+
80
+ @classmethod
81
+ def from_dict(cls, data: dict[str, Any]) -> "UnichemSource":
82
+ """Create a source from a source of the web service or of the cache.
83
+
84
+ Args:
85
+ data: fields of the source, fields unknown to `UnichemSource` are
86
+ ignored
87
+
88
+ Returns:
89
+ The source.
90
+ """
91
+ names = {f.name for f in fields(cls)}
92
+ unknown = sorted(set(data) - names)
93
+ if unknown:
94
+ logger.debug("Ignored fields of UniChem source: %s", unknown)
95
+ return cls(**{k: v for k, v in data.items() if k in names})
68
96
 
69
97
 
70
98
  class UnichemQuery:
@@ -117,7 +145,7 @@ class UnichemQuery:
117
145
  data = read_json_cache(
118
146
  unichem_sources_path, max_age=CACHE_DURATION_ONTOLOGY
119
147
  )
120
- return {int(k): UnichemSource(**v) for k, v in data.items()}
148
+ return {int(k): UnichemSource.from_dict(v) for k, v in data.items()}
121
149
 
122
150
  url = "https://www.ebi.ac.uk/unichem/api/v1/sources/"
123
151
  try:
@@ -131,11 +159,13 @@ class UnichemQuery:
131
159
  unichem_sources_path, reason=str(err)
132
160
  )
133
161
  if fallback is not None:
134
- return {int(k): UnichemSource(**v) for k, v in fallback.items()}
162
+ return {
163
+ int(k): UnichemSource.from_dict(v) for k, v in fallback.items()
164
+ }
135
165
  raise
136
166
 
137
167
  sources_list: list[UnichemSource] = [
138
- UnichemSource(**v) for v in data["sources"]
168
+ UnichemSource.from_dict(v) for v in data["sources"]
139
169
  ]
140
170
  sources = {source.sourceID: source for source in sources_list}
141
171
 
@@ -219,9 +249,6 @@ class UnichemQuery:
219
249
  accession = item["src_compound_id"]
220
250
  if source.baseIdUrl:
221
251
  # create and clean url
222
- if not source.baseIdUrl:
223
- continue
224
-
225
252
  url = f"{source.baseIdUrl}{accession}"
226
253
 
227
254
  url_accession = urllib.parse.quote(accession)
@@ -8,6 +8,48 @@ import requests
8
8
  from pymetadata.webservices.unichem import UnichemQuery, UnichemSource
9
9
 
10
10
 
11
+ def test_source_from_dict_current_fields() -> None:
12
+ """Test creating a source from the fields UniChem answers with."""
13
+ source = UnichemSource.from_dict(
14
+ {
15
+ "UCICount": 29916004,
16
+ "baseIdUrl": "https://www.surechembl.org/chemical/",
17
+ "created": None,
18
+ "description": "SureChEMBL extracts chemistry from patents.",
19
+ "lastChecked": "2026-09-15",
20
+ "name": "surechembl",
21
+ "nameLabel": "SureChEMBL",
22
+ "nameLong": "SureChEMBL",
23
+ "private": False,
24
+ "sourceID": 15,
25
+ "srcDetails": None,
26
+ "srcLastUpdated": "2026-09-12 00:49:52",
27
+ "srcUrl": "https://www.surechembl.org/",
28
+ "updateComments": None,
29
+ }
30
+ )
31
+ assert source.sourceID == 15
32
+ assert source.name == "surechembl"
33
+ assert source.baseIdUrl == "https://www.surechembl.org/chemical/"
34
+ assert source.lastChecked == "2026-09-15"
35
+ assert source.srcLastUpdated == "2026-09-12 00:49:52"
36
+
37
+
38
+ def test_source_from_dict_schema_changes() -> None:
39
+ """Test that added and removed fields of UniChem do not break a source.
40
+
41
+ UniChem changed the fields of a source without notice, e.g., `lastChecked`
42
+ appeared and `srcReleaseNumber` disappeared.
43
+ """
44
+ source = UnichemSource.from_dict(
45
+ {"sourceID": 1, "name": "chembl", "srcReleaseNumber": 1, "newField": "x"}
46
+ )
47
+ assert source.sourceID == 1
48
+ assert source.name == "chembl"
49
+ assert source.baseIdUrl is None
50
+ assert not hasattr(source, "newField")
51
+
52
+
11
53
  def test_get_sources(tmp_path: Path) -> None:
12
54
  """Test retrieving sources."""
13
55
  cache_path: Path = tmp_path
@@ -1,5 +1,5 @@
1
1
  [tox]
2
- envlist = ty, py3.{11,12,13,14}
2
+ envlist = ty, py3.{11,12,13,14,15}
3
3
 
4
4
  [testenv]
5
5
  package = wheel
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes