pyobo 0.10.6__tar.gz → 0.10.7__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 (260) hide show
  1. {pyobo-0.10.6/src/pyobo.egg-info → pyobo-0.10.7}/PKG-INFO +1 -1
  2. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/conf.py +1 -1
  3. {pyobo-0.10.6 → pyobo-0.10.7}/setup.cfg +1 -1
  4. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/identifier_utils.py +1 -1
  5. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/obographs.py +12 -4
  6. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/reader.py +17 -14
  7. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/complexportal.py +11 -0
  8. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/geonames.py +15 -5
  9. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/npass.py +3 -1
  10. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/uniprot/uniprot.py +5 -5
  11. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/struct/reference.py +7 -3
  12. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/struct/struct.py +4 -4
  13. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/struct/typedef.py +9 -1
  14. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/version.py +1 -1
  15. {pyobo-0.10.6 → pyobo-0.10.7/src/pyobo.egg-info}/PKG-INFO +1 -1
  16. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_get.py +18 -0
  17. {pyobo-0.10.6 → pyobo-0.10.7}/.readthedocs.yml +0 -0
  18. {pyobo-0.10.6 → pyobo-0.10.7}/LICENSE +0 -0
  19. {pyobo-0.10.6 → pyobo-0.10.7}/MANIFEST.in +0 -0
  20. {pyobo-0.10.6 → pyobo-0.10.7}/README.rst +0 -0
  21. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.Canonicalizer.rst +0 -0
  22. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.Obo.rst +0 -0
  23. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.OboNormalizer.rst +0 -0
  24. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.Reference.rst +0 -0
  25. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.Synonym.rst +0 -0
  26. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.SynonymTypeDef.rst +0 -0
  27. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.Term.rst +0 -0
  28. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.TypeDef.rst +0 -0
  29. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.ensure_path.rst +0 -0
  30. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.from_obo_path.rst +0 -0
  31. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.from_obonet.rst +0 -0
  32. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_alts_to_id.rst +0 -0
  33. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_ancestors.rst +0 -0
  34. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_children.rst +0 -0
  35. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_definition.rst +0 -0
  36. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_descendants.rst +0 -0
  37. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_equivalent.rst +0 -0
  38. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_filtered_properties_df.rst +0 -0
  39. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_filtered_properties_mapping.rst +0 -0
  40. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_filtered_properties_multimapping.rst +0 -0
  41. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_filtered_relations_df.rst +0 -0
  42. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_filtered_xrefs.rst +0 -0
  43. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_graph.rst +0 -0
  44. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_hierarchy.rst +0 -0
  45. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_id_definition_mapping.rst +0 -0
  46. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_id_multirelations_mapping.rst +0 -0
  47. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_id_name_mapping.rst +0 -0
  48. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_id_species_mapping.rst +0 -0
  49. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_id_synonyms_mapping.rst +0 -0
  50. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_id_to_alts.rst +0 -0
  51. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_ids.rst +0 -0
  52. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_name.rst +0 -0
  53. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_name_by_curie.rst +0 -0
  54. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_name_id_mapping.rst +0 -0
  55. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_ontology.rst +0 -0
  56. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_primary_curie.rst +0 -0
  57. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_primary_identifier.rst +0 -0
  58. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_priority_curie.rst +0 -0
  59. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_properties.rst +0 -0
  60. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_properties_df.rst +0 -0
  61. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_property.rst +0 -0
  62. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_relation.rst +0 -0
  63. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_relation_mapping.rst +0 -0
  64. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_relations_df.rst +0 -0
  65. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_species.rst +0 -0
  66. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_sssom_df.rst +0 -0
  67. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_subhierarchy.rst +0 -0
  68. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_synonyms.rst +0 -0
  69. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_typedef_df.rst +0 -0
  70. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_version.rst +0 -0
  71. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_xref.rst +0 -0
  72. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_xrefs.rst +0 -0
  73. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.get_xrefs_df.rst +0 -0
  74. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.ground.rst +0 -0
  75. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.has_ancestor.rst +0 -0
  76. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.has_nomenclature_plugin.rst +0 -0
  77. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.has_xref_plugin.rst +0 -0
  78. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.is_descendent.rst +0 -0
  79. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.iter_nomenclature_plugins.rst +0 -0
  80. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.iter_xref_plugins.rst +0 -0
  81. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.normalize_curie.rst +0 -0
  82. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.parse_results_from_obo.rst +0 -0
  83. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.run_nomenclature_plugin.rst +0 -0
  84. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/api/pyobo.run_xref_plugin.rst +0 -0
  85. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/index.rst +0 -0
  86. {pyobo-0.10.6 → pyobo-0.10.7}/docs/source/logo.png +0 -0
  87. {pyobo-0.10.6 → pyobo-0.10.7}/pyproject.toml +0 -0
  88. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/__init__.py +0 -0
  89. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/__main__.py +0 -0
  90. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/api/__init__.py +0 -0
  91. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/api/alts.py +0 -0
  92. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/api/hierarchy.py +0 -0
  93. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/api/metadata.py +0 -0
  94. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/api/names.py +0 -0
  95. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/api/properties.py +0 -0
  96. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/api/relations.py +0 -0
  97. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/api/species.py +0 -0
  98. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/api/typedefs.py +0 -0
  99. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/api/utils.py +0 -0
  100. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/api/xrefs.py +0 -0
  101. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/__init__.py +0 -0
  102. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/cli.py +0 -0
  103. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/gilda/__init__.py +0 -0
  104. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/gilda/__main__.py +0 -0
  105. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/gilda/app.py +0 -0
  106. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/gilda/cli.py +0 -0
  107. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/gilda/templates/base.html +0 -0
  108. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/gilda/templates/home.html +0 -0
  109. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/gilda/templates/matches.html +0 -0
  110. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/mapper/__init__.py +0 -0
  111. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/mapper/__main__.py +0 -0
  112. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/mapper/cli.py +0 -0
  113. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/mapper/mapper.py +0 -0
  114. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/mapper/templates/base.html +0 -0
  115. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/apps/mapper/templates/mapper_home.html +0 -0
  116. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/aws.py +0 -0
  117. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/cli/__init__.py +0 -0
  118. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/cli/aws.py +0 -0
  119. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/cli/cli.py +0 -0
  120. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/cli/database.py +0 -0
  121. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/cli/lookup.py +0 -0
  122. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/cli/utils.py +0 -0
  123. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/constants.py +0 -0
  124. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/getters.py +0 -0
  125. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/gilda_utils.py +0 -0
  126. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/mocks.py +0 -0
  127. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/normalizer.py +0 -0
  128. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/plugins.py +0 -0
  129. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/registries/__init__.py +0 -0
  130. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/registries/metaregistry.json +0 -0
  131. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/registries/metaregistry.py +0 -0
  132. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/resource_utils.py +0 -0
  133. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/resources/__init__.py +0 -0
  134. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/resources/ncbitaxon.py +0 -0
  135. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/resources/ncbitaxon.tsv.gz +0 -0
  136. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/resources/ro.py +0 -0
  137. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/resources/ro.tsv +0 -0
  138. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/__init__.py +0 -0
  139. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/agrovoc.py +0 -0
  140. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/antibodyregistry.py +0 -0
  141. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/biogrid.py +0 -0
  142. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/ccle.py +0 -0
  143. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/cgnc.py +0 -0
  144. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/chebi.py +0 -0
  145. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/chembl.py +0 -0
  146. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/conso.py +0 -0
  147. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/cpt.py +0 -0
  148. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/cvx.py +0 -0
  149. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/depmap.py +0 -0
  150. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/dictybase_gene.py +0 -0
  151. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/drugbank.py +0 -0
  152. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/drugbank_salt.py +0 -0
  153. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/drugcentral.py +0 -0
  154. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/expasy.py +0 -0
  155. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/famplex.py +0 -0
  156. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/flybase.py +0 -0
  157. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/gmt_utils.py +0 -0
  158. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/go.py +0 -0
  159. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/gwascentral_phenotype.py +0 -0
  160. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/gwascentral_study.py +0 -0
  161. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/hgnc.py +0 -0
  162. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/hgncgenefamily.py +0 -0
  163. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/icd10.py +0 -0
  164. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/icd11.py +0 -0
  165. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/icd_utils.py +0 -0
  166. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/interpro.py +0 -0
  167. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/itis.py +0 -0
  168. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/kegg/__init__.py +0 -0
  169. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/kegg/api.py +0 -0
  170. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/kegg/genes.py +0 -0
  171. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/kegg/genome.py +0 -0
  172. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/kegg/pathway.py +0 -0
  173. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/mesh.py +0 -0
  174. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/mgi.py +0 -0
  175. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/mirbase.py +0 -0
  176. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/mirbase_constants.py +0 -0
  177. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/mirbase_family.py +0 -0
  178. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/mirbase_mature.py +0 -0
  179. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/msigdb.py +0 -0
  180. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/ncbigene.py +0 -0
  181. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/pathbank.py +0 -0
  182. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/pfam.py +0 -0
  183. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/pfam_clan.py +0 -0
  184. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/pid.py +0 -0
  185. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/pombase.py +0 -0
  186. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/pubchem.py +0 -0
  187. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/reactome.py +0 -0
  188. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/rgd.py +0 -0
  189. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/rhea.py +0 -0
  190. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/ror.py +0 -0
  191. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/selventa/__init__.py +0 -0
  192. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/selventa/schem.py +0 -0
  193. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/selventa/scomp.py +0 -0
  194. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/selventa/sdis.py +0 -0
  195. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/selventa/sfam.py +0 -0
  196. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/sgd.py +0 -0
  197. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/slm.py +0 -0
  198. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/umls/__init__.py +0 -0
  199. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/umls/__main__.py +0 -0
  200. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/umls/get_synonym_types.py +0 -0
  201. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/umls/synonym_types.tsv +0 -0
  202. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/umls/umls.py +0 -0
  203. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/uniprot/__init__.py +0 -0
  204. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/uniprot/uniprot_ptm.py +0 -0
  205. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/utils.py +0 -0
  206. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/wikipathways.py +0 -0
  207. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/sources/zfin.py +0 -0
  208. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/ssg/__init__.py +0 -0
  209. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/ssg/base.html +0 -0
  210. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/ssg/index.html +0 -0
  211. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/ssg/term.html +0 -0
  212. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/ssg/typedef.html +0 -0
  213. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/struct/__init__.py +0 -0
  214. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/struct/utils.py +0 -0
  215. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/utils/__init__.py +0 -0
  216. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/utils/cache.py +0 -0
  217. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/utils/io.py +0 -0
  218. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/utils/iter.py +0 -0
  219. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/utils/misc.py +0 -0
  220. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/utils/ndex_utils.py +0 -0
  221. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/utils/path.py +0 -0
  222. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/__init__.py +0 -0
  223. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/canonicalizer.py +0 -0
  224. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/priority.py +0 -0
  225. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/sources/__init__.py +0 -0
  226. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/sources/biomappings.py +0 -0
  227. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/sources/cbms2019.py +0 -0
  228. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/sources/chembl.py +0 -0
  229. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/sources/compath.py +0 -0
  230. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/sources/famplex.py +0 -0
  231. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/sources/gilda.py +0 -0
  232. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/sources/intact.py +0 -0
  233. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/sources/ncit.py +0 -0
  234. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/sources/pubchem.py +0 -0
  235. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/sources/wikidata.py +0 -0
  236. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo/xrefdb/xrefs_pipeline.py +0 -0
  237. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo.egg-info/SOURCES.txt +0 -0
  238. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo.egg-info/dependency_links.txt +0 -0
  239. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo.egg-info/entry_points.txt +0 -0
  240. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo.egg-info/not-zip-safe +0 -0
  241. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo.egg-info/requires.txt +0 -0
  242. {pyobo-0.10.6 → pyobo-0.10.7}/src/pyobo.egg-info/top_level.txt +0 -0
  243. {pyobo-0.10.6 → pyobo-0.10.7}/tests/__init__.py +0 -0
  244. {pyobo-0.10.6 → pyobo-0.10.7}/tests/constants.py +0 -0
  245. {pyobo-0.10.6 → pyobo-0.10.7}/tests/resources/citations.txt +0 -0
  246. {pyobo-0.10.6 → pyobo-0.10.7}/tests/resources/test_chebi.obo +0 -0
  247. {pyobo-0.10.6 → pyobo-0.10.7}/tests/resources/test_msigdb.gmt +0 -0
  248. {pyobo-0.10.6 → pyobo-0.10.7}/tests/resources/test_wikipathways.gmt +0 -0
  249. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_alt_ids.py +0 -0
  250. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_caches.py +0 -0
  251. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_extract.py +0 -0
  252. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_get_miriam_url.py +0 -0
  253. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_gmt.py +0 -0
  254. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_ground.py +0 -0
  255. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_mapper.py +0 -0
  256. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_sources/__init__.py +0 -0
  257. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_sources/test_famplex.py +0 -0
  258. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_struct.py +0 -0
  259. {pyobo-0.10.6 → pyobo-0.10.7}/tests/test_utils.py +0 -0
  260. {pyobo-0.10.6 → pyobo-0.10.7}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyobo
3
- Version: 0.10.6
3
+ Version: 0.10.7
4
4
  Summary: Handling and writing OBO
5
5
  Home-page: https://github.com/pyobo/pyobo
6
6
  Download-URL: https://github.com/pyobo/pyobo/releases
@@ -58,7 +58,7 @@ author = "Charles Tapley Hoyt"
58
58
  #
59
59
 
60
60
  # The full version, including alpha/beta/rc tags.
61
- release = "0.10.6"
61
+ release = "0.10.7"
62
62
 
63
63
  # The short X.Y version.
64
64
  parsed_version = re.match(
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = pyobo
3
- version = 0.10.6
3
+ version = 0.10.7
4
4
  description = Handling and writing OBO
5
5
  long_description = file: README.rst
6
6
  url = https://github.com/pyobo/pyobo
@@ -119,7 +119,7 @@ def wrap_norm_prefix(f):
119
119
 
120
120
  def standardize_ec(ec: str) -> str:
121
121
  """Standardize an EC code identifier by removing all trailing dashes and dots."""
122
- ec = ec.strip()
122
+ ec = ec.strip().replace(" ", "")
123
123
  for _ in range(4):
124
124
  ec = ec.rstrip("-").rstrip(".")
125
125
  return ec
@@ -19,7 +19,7 @@ from bioontologies.obograph import (
19
19
  from bioontologies.robot import ParseResults
20
20
 
21
21
  from pyobo.struct import Obo, Reference, Term
22
- from pyobo.struct.typedef import is_a
22
+ from pyobo.struct.typedef import definition_source, is_a
23
23
 
24
24
  __all__ = [
25
25
  "graph_from_obo",
@@ -61,12 +61,12 @@ def _rewire(r: Reference) -> curies.Reference:
61
61
 
62
62
 
63
63
  def _get_class_node(term: Term) -> Node:
64
- if not term.definition:
65
- definition = None
66
- else:
64
+ if term.definition or term.provenance:
67
65
  definition = Definition.from_parsed(
68
66
  value=term.definition, references=[_rewire(p) for p in term.provenance]
69
67
  )
68
+ else:
69
+ definition = None
70
70
 
71
71
  if term.xrefs:
72
72
  if not term.xref_types:
@@ -126,3 +126,11 @@ def _iter_edges(term: Term) -> Iterable[Edge]:
126
126
  _rewire(typedef.reference),
127
127
  _rewire(target),
128
128
  )
129
+
130
+ for provenance_reference in term.provenance:
131
+ yield Edge.from_parsed(
132
+ _rewire(term.reference),
133
+ _rewire(definition_source.reference),
134
+ _rewire(provenance_reference),
135
+ )
136
+ # TODO also look through xrefs and seealso to get provenance xrefs?
@@ -444,20 +444,23 @@ def _extract_synonym(
444
444
  break
445
445
 
446
446
  stype: Optional[SynonymTypeDef] = None
447
- if specificity is not None: # go fishing for a synonym type definition
448
- for _stype in synonym_typedefs.values():
449
- # Since there aren't a lot of carefully defined synonym definitions, it
450
- # can appear as a string or curie. Therefore, we might see temporary prefixes
451
- # get added, so we should check against full curies as well as local unique
452
- # identifiers
453
- if rest.startswith(_stype.curie):
454
- rest = rest[len(_stype.curie) :].strip()
455
- stype = _stype
456
- break
457
- elif rest.startswith(_stype.identifier):
458
- rest = rest[len(_stype.identifier) :].strip()
459
- stype = _stype
460
- break
447
+ for _stype in synonym_typedefs.values():
448
+ # Since there aren't a lot of carefully defined synonym definitions, it
449
+ # can appear as a string or curie. Therefore, we might see temporary prefixes
450
+ # get added, so we should check against full curies as well as local unique
451
+ # identifiers
452
+ if rest.startswith(_stype.curie):
453
+ rest = rest[len(_stype.curie) :].strip()
454
+ stype = _stype
455
+ break
456
+ elif rest.startswith(_stype.preferred_curie):
457
+ rest = rest[len(_stype.preferred_curie) :].strip()
458
+ stype = _stype
459
+ break
460
+ elif rest.startswith(_stype.identifier):
461
+ rest = rest[len(_stype.identifier) :].strip()
462
+ stype = _stype
463
+ break
461
464
 
462
465
  if not rest.startswith("[") or not rest.endswith("]"):
463
466
  logger.warning("[%s:%s] problem with synonym: %s", prefix, identifier, s)
@@ -82,6 +82,17 @@ def _parse_xrefs(s) -> List[Tuple[Reference, str]]:
82
82
  logger.warning("xref missing (: %s", xref)
83
83
  continue
84
84
  note = note.rstrip(")")
85
+ note.replace("rhea:rhea ", "rhea:")
86
+ note.replace("rhea:Rhea ", "rhea:")
87
+ note.replace("eccode::", "eccode:")
88
+ note.replace("eccode:EC:", "eccode:")
89
+ note.replace("eccode:RHEA:", "rhea:")
90
+ if note.lower().startswith("rhea "):
91
+ note = note[len("Rhea ") :]
92
+ if note.lower().startswith("rhea:rhea "):
93
+ note = note[len("rhea:rhea ") :]
94
+ if note.lower().startswith("EC:"):
95
+ note = note[len("EC:") :]
85
96
  try:
86
97
  reference = Reference.from_curie(xref_curie)
87
98
  except ValueError:
@@ -38,7 +38,9 @@ def get_terms(*, force: bool = False) -> Collection[Term]:
38
38
  """Get terms."""
39
39
  code_to_country = get_code_to_country(force=force)
40
40
  code_to_admin1 = get_code_to_admin1(code_to_country, force=force)
41
- code_to_admin2 = get_code_to_admin2(code_to_admin1, force=force)
41
+ code_to_admin2 = get_code_to_admin2(
42
+ code_to_country=code_to_country, code_to_admin1=code_to_admin1, force=force
43
+ )
42
44
  id_to_term = get_cities(
43
45
  code_to_country=code_to_country,
44
46
  code_to_admin1=code_to_admin1,
@@ -113,7 +115,7 @@ def get_code_to_admin1(
113
115
 
114
116
 
115
117
  def get_code_to_admin2(
116
- code_to_admin1: Mapping[str, Term], *, force: bool = False
118
+ *, code_to_country: Mapping[str, Term], code_to_admin1: Mapping[str, Term], force: bool = False
117
119
  ) -> Mapping[str, Term]:
118
120
  """Get a mapping from admin2 code to term."""
119
121
  admin2_df = ensure_df(
@@ -134,8 +136,13 @@ def get_code_to_admin2(
134
136
  term.append_property("code", code)
135
137
  code_to_admin2[code] = term
136
138
  admin1_code = code.rsplit(".", 1)[0]
137
- admin1_term = code_to_admin1[admin1_code]
138
- term.append_relationship(part_of, admin1_term)
139
+ admin1_term = code_to_admin1.get(admin1_code)
140
+ if admin1_term:
141
+ term.append_relationship(part_of, admin1_term)
142
+ else:
143
+ country_code = admin1_code.split(".", 1)[0]
144
+ country_term = code_to_country[country_code]
145
+ term.append_relationship(part_of, country_term)
139
146
  return code_to_admin2
140
147
 
141
148
 
@@ -197,7 +204,10 @@ def get_cities(
197
204
  term.append_synonym(synonym)
198
205
 
199
206
  if pd.isna(admin1):
200
- tqdm.write(f"[geonames:{identifier}] missing admin 1 code for {name} ({country})")
207
+ # TODO try to annotate these directly onto countries
208
+ tqdm.write(
209
+ f"[geonames:{identifier}] {name}, a city in {country}, is missing admin 1 code"
210
+ )
201
211
  continue
202
212
 
203
213
  admin1_full = f"{country}.{admin1}"
@@ -72,7 +72,9 @@ def iter_terms(version: str, force: bool = False) -> Iterable[Term]:
72
72
 
73
73
  # TODO check that the first is always the parent compound?
74
74
  if pd.notna(pubchem_compound_ids):
75
- pubchem_compound_ids = pubchem_compound_ids.split(";")
75
+ pubchem_compound_ids = [
76
+ yy.strip() for xx in pubchem_compound_ids.split(";") for yy in xx.strip().split(",")
77
+ ]
76
78
  if len(pubchem_compound_ids) > 1:
77
79
  logger.debug("multiple cids for %s: %s", identifier, pubchem_compound_ids)
78
80
  for pubchem_compound_id in pubchem_compound_ids:
@@ -30,7 +30,7 @@ class UniProtGetter(Obo):
30
30
 
31
31
  def iter_terms(self, force: bool = False) -> Iterable[Term]:
32
32
  """Iterate over terms in the ontology."""
33
- yield from iter_terms(force=force, version=self._version_or_raise)
33
+ yield from iter_terms(version=self._version_or_raise)
34
34
 
35
35
 
36
36
  def get_obo(force: bool = False) -> Obo:
@@ -38,9 +38,9 @@ def get_obo(force: bool = False) -> Obo:
38
38
  return UniProtGetter(force=force)
39
39
 
40
40
 
41
- def iter_terms(version: Optional[str] = None, force: bool = False) -> Iterable[Term]:
41
+ def iter_terms(version: Optional[str] = None) -> Iterable[Term]:
42
42
  """Iterate over UniProt Terms."""
43
- with open_reader(ensure(version=version, force=force)) as reader:
43
+ with open_reader(ensure(version=version)) as reader:
44
44
  _ = next(reader) # header
45
45
  for uniprot_id, name, taxonomy_id, _synonyms, ecs, pubmeds, pdbs in tqdm(
46
46
  reader, desc="Mapping UniProt", unit_scale=True
@@ -63,11 +63,11 @@ def iter_terms(version: Optional[str] = None, force: bool = False) -> Iterable[T
63
63
  yield term
64
64
 
65
65
 
66
- def ensure(version: Optional[str] = None, force: bool = False) -> Path:
66
+ def ensure(version: Optional[str] = None) -> Path:
67
67
  """Ensure the reviewed uniprot names are available."""
68
68
  if version is None:
69
69
  version = bioversions.get_version("uniprot")
70
- return RAW_MODULE.ensure(PREFIX, version, name="reviewed.tsv.gz", url=REVIEWED_URL, force=force)
70
+ return RAW_MODULE.ensure(PREFIX, version, name="reviewed.tsv.gz", url=REVIEWED_URL)
71
71
 
72
72
 
73
73
  if __name__ == "__main__":
@@ -31,11 +31,15 @@ class Reference(curies.Reference):
31
31
  raise ExpansionError(f"Unknown prefix: {v}")
32
32
  return norm_prefix
33
33
 
34
+ @property
35
+ def preferred_prefix(self) -> str:
36
+ """Get the preferred curie for this reference."""
37
+ return bioregistry.get_preferred_prefix(self.prefix) or self.prefix
38
+
34
39
  @property
35
40
  def preferred_curie(self) -> str:
36
41
  """Get the preferred curie for this reference."""
37
- pp = bioregistry.get_preferred_prefix(self.prefix) or self.prefix
38
- return f"{pp}:{self.identifier}"
42
+ return f"{self.preferred_prefix}:{self.identifier}"
39
43
 
40
44
  @root_validator(pre=True)
41
45
  def validate_identifier(cls, values): # noqa
@@ -125,7 +129,7 @@ class Reference(curies.Reference):
125
129
  if identifier_lower.startswith(f"{self.prefix.lower()}:"):
126
130
  rv = identifier_lower
127
131
  else:
128
- rv = f"{self.prefix}:{self._escaped_identifier}"
132
+ rv = f"{self.preferred_prefix}:{self._escaped_identifier}"
129
133
  if self.name:
130
134
  rv = f"{rv} ! {self.name}"
131
135
  return rv
@@ -384,9 +384,9 @@ class Term(Referenced):
384
384
  ) -> None:
385
385
  """Append a property."""
386
386
  if isinstance(prop, (Reference, Referenced)):
387
- prop = prop.curie
387
+ prop = prop.preferred_curie
388
388
  if isinstance(value, (Reference, Referenced)):
389
- value = value.curie
389
+ value = value.preferred_curie
390
390
  self.properties[prop].append(value)
391
391
 
392
392
  def _definition_fp(self) -> str:
@@ -423,11 +423,11 @@ class Term(Referenced):
423
423
  yield f"def: {self._definition_fp()}"
424
424
 
425
425
  for xref in sorted(self.xrefs, key=attrgetter("prefix", "identifier")):
426
- yield f"xref: {xref.preferred_curie}"
426
+ yield f"xref: {xref}" # __str__ bakes in the ! name
427
427
 
428
428
  parent_tag = "is_a" if self.type == "Term" else "instance_of"
429
429
  for parent in sorted(self.parents, key=attrgetter("prefix", "identifier")):
430
- yield f"{parent_tag}: {parent.preferred_curie}"
430
+ yield f"{parent_tag}: {parent}" # __str__ bakes in the ! name
431
431
 
432
432
  for typedef, references in sorted(self.relationships.items(), key=_sort_relations):
433
433
  if (not typedefs or typedef not in typedefs) and (
@@ -50,7 +50,10 @@ __all__ = [
50
50
 
51
51
  @dataclass
52
52
  class TypeDef(Referenced):
53
- """A type definition in OBO."""
53
+ """A type definition in OBO.
54
+
55
+ See the subsection of https://owlcollab.github.io/oboformat/doc/GO.format.obo-1_4.html#S.2.2.
56
+ """
54
57
 
55
58
  reference: Reference
56
59
  comment: Optional[str] = None
@@ -108,6 +111,8 @@ class TypeDef(Referenced):
108
111
  _chain = " ".join(link.preferred_curie for link in self.holds_over_chain)
109
112
  _names = " / ".join(link.name or "_" for link in self.holds_over_chain)
110
113
  yield f"holds_over_chain: {_chain} ! {_names}"
114
+ if self.inverse:
115
+ yield f"inverse_of: {self.inverse}"
111
116
 
112
117
  @classmethod
113
118
  def from_triple(cls, prefix: str, identifier: str, name: Optional[str] = None) -> "TypeDef":
@@ -276,6 +281,9 @@ alternative_term = TypeDef.from_triple(
276
281
  has_ontology_root_term = TypeDef.from_triple(
277
282
  prefix=IAO_PREFIX, identifier="0000700", name="has ontology root term"
278
283
  )
284
+ definition_source = TypeDef.from_triple(
285
+ prefix=IAO_PREFIX, identifier="0000119", name="definition source"
286
+ )
279
287
  has_dbxref = TypeDef.from_curie("oboInOwl:hasDbXref", name="has database cross-reference")
280
288
 
281
289
  editor_note = TypeDef.from_triple(prefix=IAO_PREFIX, identifier="0000116", name="editor note")
@@ -14,7 +14,7 @@ __all__ = [
14
14
  "get_git_hash",
15
15
  ]
16
16
 
17
- VERSION = "0.10.6"
17
+ VERSION = "0.10.7"
18
18
 
19
19
 
20
20
  def get_git_hash() -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyobo
3
- Version: 0.10.6
3
+ Version: 0.10.7
4
4
  Summary: Handling and writing OBO
5
5
  Home-page: https://github.com/pyobo/pyobo
6
6
  Download-URL: https://github.com/pyobo/pyobo/releases
@@ -19,6 +19,7 @@ from pyobo.reader import (
19
19
  iterate_node_synonyms,
20
20
  iterate_node_xrefs,
21
21
  )
22
+ from pyobo.struct.struct import acronym
22
23
  from tests.constants import TEST_CHEBI_OBO_PATH, chebi_patch
23
24
 
24
25
 
@@ -105,6 +106,7 @@ class TestParseObonet(unittest.TestCase):
105
106
  iupac_name = SynonymTypeDef.from_text("IUPAC NAME", lower=False)
106
107
  synoynym_typedefs = {
107
108
  "IUPAC_NAME": iupac_name,
109
+ acronym.curie: acronym,
108
110
  }
109
111
 
110
112
  for expected_synonym, text in [
@@ -137,6 +139,22 @@ class TestParseObonet(unittest.TestCase):
137
139
  Synonym(name="LTEC I", specificity="EXACT"),
138
140
  '"LTEC I" []',
139
141
  ),
142
+ (
143
+ Synonym(name="HAdV-A", specificity="BROAD", type=acronym),
144
+ '"HAdV-A" BROAD OMO:0003012 []',
145
+ ),
146
+ (
147
+ Synonym(name="HAdV-A", specificity="BROAD", type=acronym),
148
+ '"HAdV-A" BROAD omo:0003012 []',
149
+ ),
150
+ (
151
+ Synonym(name="HAdV-A", specificity="EXACT", type=acronym),
152
+ '"HAdV-A" OMO:0003012 []',
153
+ ),
154
+ (
155
+ Synonym(name="HAdV-A", specificity="EXACT", type=acronym),
156
+ '"HAdV-A" omo:0003012 []',
157
+ ),
140
158
  ]:
141
159
  with self.subTest(s=text):
142
160
  actual_synonym = _extract_synonym(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes