orthonym 1.0.0__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 (1759) hide show
  1. orthonym-1.0.0/.github/workflows/ci.yml +85 -0
  2. orthonym-1.0.0/.github/workflows/docs.yml +73 -0
  3. orthonym-1.0.0/.github/workflows/pypi-release.yml +287 -0
  4. orthonym-1.0.0/.github/workflows/release-please.yml +85 -0
  5. orthonym-1.0.0/.gitignore +165 -0
  6. orthonym-1.0.0/.release-please-manifest.json +3 -0
  7. orthonym-1.0.0/CHANGELOG.md +155 -0
  8. orthonym-1.0.0/CITATION.cff +33 -0
  9. orthonym-1.0.0/CODE_OF_CONDUCT.md +57 -0
  10. orthonym-1.0.0/CONTRIBUTING.md +89 -0
  11. orthonym-1.0.0/LICENSE +21 -0
  12. orthonym-1.0.0/NOTICE +118 -0
  13. orthonym-1.0.0/PKG-INFO +275 -0
  14. orthonym-1.0.0/README.md +231 -0
  15. orthonym-1.0.0/SECURITY.md +33 -0
  16. orthonym-1.0.0/assets/orthonym-logo-dark.png +0 -0
  17. orthonym-1.0.0/assets/orthonym-logo.png +0 -0
  18. orthonym-1.0.0/assets/readme-banner-narrow.svg +56 -0
  19. orthonym-1.0.0/assets/readme-banner.svg +56 -0
  20. orthonym-1.0.0/assets/readme-beilstein.svg +1 -0
  21. orthonym-1.0.0/assets/readme-brush-x.svg +1 -0
  22. orthonym-1.0.0/assets/readme-collab-line-dark.svg +6 -0
  23. orthonym-1.0.0/assets/readme-collab-line-narrow-dark.svg +6 -0
  24. orthonym-1.0.0/assets/readme-collab-line-narrow.svg +6 -0
  25. orthonym-1.0.0/assets/readme-collab-line.svg +6 -0
  26. orthonym-1.0.0/assets/readme-cup.svg +1 -0
  27. orthonym-1.0.0/assets/readme-roundtrip-narrow.svg +331 -0
  28. orthonym-1.0.0/assets/readme-roundtrip.svg +339 -0
  29. orthonym-1.0.0/assets/readme-specimen-narrow.svg +45 -0
  30. orthonym-1.0.0/assets/readme-specimen.svg +45 -0
  31. orthonym-1.0.0/assets/readme-start.svg +6 -0
  32. orthonym-1.0.0/assets/readme-steinbeck.svg +1 -0
  33. orthonym-1.0.0/assets/readme-try.svg +6 -0
  34. orthonym-1.0.0/guide/.impeccable/design.json +697 -0
  35. orthonym-1.0.0/guide/DESIGN.md +310 -0
  36. orthonym-1.0.0/guide/_data/accuracy.json +12 -0
  37. orthonym-1.0.0/guide/_ext/orthonym_cli_docs.py +31 -0
  38. orthonym-1.0.0/guide/_ext/orthonym_site.py +401 -0
  39. orthonym-1.0.0/guide/_static/beilstein-dark.svg +50 -0
  40. orthonym-1.0.0/guide/_static/beilstein.svg +50 -0
  41. orthonym-1.0.0/guide/_static/favicon.svg +6 -0
  42. orthonym-1.0.0/guide/_static/fonts/jetbrains-mono-6.woff2 +0 -0
  43. orthonym-1.0.0/guide/_static/fonts/public-sans-3.woff2 +0 -0
  44. orthonym-1.0.0/guide/_static/fonts/public-sans-b3.woff2 +0 -0
  45. orthonym-1.0.0/guide/_static/fonts/public-sans-i3.woff2 +0 -0
  46. orthonym-1.0.0/guide/_static/fonts/saira-condensed-3.woff2 +0 -0
  47. orthonym-1.0.0/guide/_static/orthonym-mark.svg +6 -0
  48. orthonym-1.0.0/guide/_static/orthonym.css +411 -0
  49. orthonym-1.0.0/guide/_templates/base.html +12 -0
  50. orthonym-1.0.0/guide/_templates/components/foot-copyright.html +15 -0
  51. orthonym-1.0.0/guide/_templates/partials/site-head.html +33 -0
  52. orthonym-1.0.0/guide/_templates/partials/webfonts.html +0 -0
  53. orthonym-1.0.0/guide/accuracy.md +32 -0
  54. orthonym-1.0.0/guide/checking.md +48 -0
  55. orthonym-1.0.0/guide/conf.py +115 -0
  56. orthonym-1.0.0/guide/declines.md +61 -0
  57. orthonym-1.0.0/guide/how-it-works.md +37 -0
  58. orthonym-1.0.0/guide/index.md +164 -0
  59. orthonym-1.0.0/guide/project/changelog.md +1 -0
  60. orthonym-1.0.0/guide/project/cite.md +17 -0
  61. orthonym-1.0.0/guide/project/contributing.md +1 -0
  62. orthonym-1.0.0/guide/project/licence.md +7 -0
  63. orthonym-1.0.0/guide/project/llms.md +12 -0
  64. orthonym-1.0.0/guide/reference/command-line.md +10 -0
  65. orthonym-1.0.0/guide/reference/internals/index.md +24 -0
  66. orthonym-1.0.0/guide/reference/python-api.md +58 -0
  67. orthonym-1.0.0/guide/start/first-name.md +87 -0
  68. orthonym-1.0.0/guide/start/install.md +65 -0
  69. orthonym-1.0.0/guide/tiers.md +65 -0
  70. orthonym-1.0.0/guide/use/batch.md +45 -0
  71. orthonym-1.0.0/guide/use/browser.md +30 -0
  72. orthonym-1.0.0/guide/use/command-line.md +82 -0
  73. orthonym-1.0.0/guide/use/provenance.md +61 -0
  74. orthonym-1.0.0/guide/use/python.md +95 -0
  75. orthonym-1.0.0/hatch_build.py +35 -0
  76. orthonym-1.0.0/pyproject.toml +130 -0
  77. orthonym-1.0.0/release-please-config.json +20 -0
  78. orthonym-1.0.0/src/orthonym/__init__.py +43 -0
  79. orthonym-1.0.0/src/orthonym/__main__.py +98 -0
  80. orthonym-1.0.0/src/orthonym/assembly/__init__.py +13 -0
  81. orthonym-1.0.0/src/orthonym/assembly/candidate_pool.py +1344 -0
  82. orthonym-1.0.0/src/orthonym/assembly/composer.py +12059 -0
  83. orthonym-1.0.0/src/orthonym/assembly/composition_primitives.py +692 -0
  84. orthonym-1.0.0/src/orthonym/assembly/composition_tier.py +101 -0
  85. orthonym-1.0.0/src/orthonym/assembly/coverage_audit.py +126 -0
  86. orthonym-1.0.0/src/orthonym/assembly/coverage_scoring.py +804 -0
  87. orthonym-1.0.0/src/orthonym/assembly/coverage_utils.py +48 -0
  88. orthonym-1.0.0/src/orthonym/assembly/fragment_naming.py +821 -0
  89. orthonym-1.0.0/src/orthonym/assembly/general_engine.py +2826 -0
  90. orthonym-1.0.0/src/orthonym/assembly/general_fusion.py +194 -0
  91. orthonym-1.0.0/src/orthonym/assembly/group_splitting.py +325 -0
  92. orthonym-1.0.0/src/orthonym/assembly/handlers/__init__.py +134 -0
  93. orthonym-1.0.0/src/orthonym/assembly/handlers/_enrichment.py +133 -0
  94. orthonym-1.0.0/src/orthonym/assembly/handlers/_handler_shared.py +3039 -0
  95. orthonym-1.0.0/src/orthonym/assembly/handlers/acid_halide.py +81 -0
  96. orthonym-1.0.0/src/orthonym/assembly/handlers/amide.py +168 -0
  97. orthonym-1.0.0/src/orthonym/assembly/handlers/amine.py +111 -0
  98. orthonym-1.0.0/src/orthonym/assembly/handlers/anhydride.py +60 -0
  99. orthonym-1.0.0/src/orthonym/assembly/handlers/azine.py +183 -0
  100. orthonym-1.0.0/src/orthonym/assembly/handlers/boronic_acid.py +70 -0
  101. orthonym-1.0.0/src/orthonym/assembly/handlers/carbamate.py +57 -0
  102. orthonym-1.0.0/src/orthonym/assembly/handlers/carbamic_acid.py +59 -0
  103. orthonym-1.0.0/src/orthonym/assembly/handlers/chalcogen_ester.py +263 -0
  104. orthonym-1.0.0/src/orthonym/assembly/handlers/chalcogen_oxide.py +118 -0
  105. orthonym-1.0.0/src/orthonym/assembly/handlers/cyanamide.py +65 -0
  106. orthonym-1.0.0/src/orthonym/assembly/handlers/diamide.py +128 -0
  107. orthonym-1.0.0/src/orthonym/assembly/handlers/ester_family.py +395 -0
  108. orthonym-1.0.0/src/orthonym/assembly/handlers/general_acyclic.py +332 -0
  109. orthonym-1.0.0/src/orthonym/assembly/handlers/guanidine.py +58 -0
  110. orthonym-1.0.0/src/orthonym/assembly/handlers/hydrazone.py +97 -0
  111. orthonym-1.0.0/src/orthonym/assembly/handlers/hydroxamic_acid.py +70 -0
  112. orthonym-1.0.0/src/orthonym/assembly/handlers/hydroximic_acid.py +115 -0
  113. orthonym-1.0.0/src/orthonym/assembly/handlers/hydroxylamine.py +600 -0
  114. orthonym-1.0.0/src/orthonym/assembly/handlers/imidate.py +456 -0
  115. orthonym-1.0.0/src/orthonym/assembly/handlers/imidoyl_thioyl_halide.py +59 -0
  116. orthonym-1.0.0/src/orthonym/assembly/handlers/imine.py +80 -0
  117. orthonym-1.0.0/src/orthonym/assembly/handlers/ion_dispatch.py +72 -0
  118. orthonym-1.0.0/src/orthonym/assembly/handlers/isocyanate.py +95 -0
  119. orthonym-1.0.0/src/orthonym/assembly/handlers/isothiocyanate.py +72 -0
  120. orthonym-1.0.0/src/orthonym/assembly/handlers/lactam.py +76 -0
  121. orthonym-1.0.0/src/orthonym/assembly/handlers/lactone.py +152 -0
  122. orthonym-1.0.0/src/orthonym/assembly/handlers/n_oxide.py +120 -0
  123. orthonym-1.0.0/src/orthonym/assembly/handlers/n_substituted_sulfonamide.py +76 -0
  124. orthonym-1.0.0/src/orthonym/assembly/handlers/nitrile_oxide.py +167 -0
  125. orthonym-1.0.0/src/orthonym/assembly/handlers/nitrite_ester.py +105 -0
  126. orthonym-1.0.0/src/orthonym/assembly/handlers/noncarbon_ester.py +62 -0
  127. orthonym-1.0.0/src/orthonym/assembly/handlers/organometallic.py +133 -0
  128. orthonym-1.0.0/src/orthonym/assembly/handlers/oxime.py +270 -0
  129. orthonym-1.0.0/src/orthonym/assembly/handlers/partial_sat.py +148 -0
  130. orthonym-1.0.0/src/orthonym/assembly/handlers/phosphate_ester.py +77 -0
  131. orthonym-1.0.0/src/orthonym/assembly/handlers/phosphine.py +110 -0
  132. orthonym-1.0.0/src/orthonym/assembly/handlers/phosphine_oxide.py +62 -0
  133. orthonym-1.0.0/src/orthonym/assembly/handlers/phosphinic_acid.py +62 -0
  134. orthonym-1.0.0/src/orthonym/assembly/handlers/phosphonic_acid.py +56 -0
  135. orthonym-1.0.0/src/orthonym/assembly/handlers/pnictogen_inate_ester.py +83 -0
  136. orthonym-1.0.0/src/orthonym/assembly/handlers/pnictogen_oxoacid.py +120 -0
  137. orthonym-1.0.0/src/orthonym/assembly/handlers/polycyclic.py +96 -0
  138. orthonym-1.0.0/src/orthonym/assembly/handlers/ring_assembly.py +72 -0
  139. orthonym-1.0.0/src/orthonym/assembly/handlers/ring_ester.py +184 -0
  140. orthonym-1.0.0/src/orthonym/assembly/handlers/ring_nitrile.py +85 -0
  141. orthonym-1.0.0/src/orthonym/assembly/handlers/simple_molecule.py +65 -0
  142. orthonym-1.0.0/src/orthonym/assembly/handlers/sulfate_ester.py +66 -0
  143. orthonym-1.0.0/src/orthonym/assembly/handlers/sulfone.py +83 -0
  144. orthonym-1.0.0/src/orthonym/assembly/handlers/sulfonimidic_n_hydroxy.py +133 -0
  145. orthonym-1.0.0/src/orthonym/assembly/handlers/sulfonyl_halide.py +60 -0
  146. orthonym-1.0.0/src/orthonym/assembly/handlers/sulfoxide.py +90 -0
  147. orthonym-1.0.0/src/orthonym/assembly/handlers/thiocyanate.py +129 -0
  148. orthonym-1.0.0/src/orthonym/assembly/handlers/thioether.py +105 -0
  149. orthonym-1.0.0/src/orthonym/assembly/handlers/thiourea.py +90 -0
  150. orthonym-1.0.0/src/orthonym/assembly/handlers/tier_a_ring.py +646 -0
  151. orthonym-1.0.0/src/orthonym/assembly/handlers/urea.py +78 -0
  152. orthonym-1.0.0/src/orthonym/assembly/inner_dispatch.py +1598 -0
  153. orthonym-1.0.0/src/orthonym/assembly/locant_omission.py +1036 -0
  154. orthonym-1.0.0/src/orthonym/assembly/memo.py +285 -0
  155. orthonym-1.0.0/src/orthonym/assembly/name_comparison.py +213 -0
  156. orthonym-1.0.0/src/orthonym/assembly/name_tree.py +212 -0
  157. orthonym-1.0.0/src/orthonym/assembly/name_tree_builder.py +169 -0
  158. orthonym-1.0.0/src/orthonym/assembly/name_tree_to_string.py +374 -0
  159. orthonym-1.0.0/src/orthonym/assembly/naming_utils.py +4051 -0
  160. orthonym-1.0.0/src/orthonym/assembly/nested_memo.py +138 -0
  161. orthonym-1.0.0/src/orthonym/assembly/offer_pool.py +120 -0
  162. orthonym-1.0.0/src/orthonym/assembly/per_substring_scoring.py +258 -0
  163. orthonym-1.0.0/src/orthonym/assembly/resolvers.py +606 -0
  164. orthonym-1.0.0/src/orthonym/assembly/retained_substitution.py +753 -0
  165. orthonym-1.0.0/src/orthonym/assembly/substituent_enumerator.py +6403 -0
  166. orthonym-1.0.0/src/orthonym/assembly/substituent_naming.py +8873 -0
  167. orthonym-1.0.0/src/orthonym/assembly/substituent_prefix_forms.py +2280 -0
  168. orthonym-1.0.0/src/orthonym/assembly/t4_coverage.py +665 -0
  169. orthonym-1.0.0/src/orthonym/assembly/universal_substituent.py +3334 -0
  170. orthonym-1.0.0/src/orthonym/cli.py +639 -0
  171. orthonym-1.0.0/src/orthonym/data/__init__.py +490 -0
  172. orthonym-1.0.0/src/orthonym/data/amino_acids.py +725 -0
  173. orthonym-1.0.0/src/orthonym/data/bicyclo_systems.py +172 -0
  174. orthonym-1.0.0/src/orthonym/data/bluebook_not_names.py +750 -0
  175. orthonym-1.0.0/src/orthonym/data/cation_words.py +62 -0
  176. orthonym-1.0.0/src/orthonym/data/chain_names.py +337 -0
  177. orthonym-1.0.0/src/orthonym/data/coordination_retained.py +127 -0
  178. orthonym-1.0.0/src/orthonym/data/fused_heterocycles.py +3258 -0
  179. orthonym-1.0.0/src/orthonym/data/fusion_components.py +400 -0
  180. orthonym-1.0.0/src/orthonym/data/group_split_rules.json +46 -0
  181. orthonym-1.0.0/src/orthonym/data/group_split_rules.py +194 -0
  182. orthonym-1.0.0/src/orthonym/data/hw_heteroatoms.py +260 -0
  183. orthonym-1.0.0/src/orthonym/data/hw_stems.py +307 -0
  184. orthonym-1.0.0/src/orthonym/data/ion_retained_names.py +541 -0
  185. orthonym-1.0.0/src/orthonym/data/iupac_2013_pin_list.json +274 -0
  186. orthonym-1.0.0/src/orthonym/data/natural_products.py +762 -0
  187. orthonym-1.0.0/src/orthonym/data/opsin_imports/__init__.py +128 -0
  188. orthonym-1.0.0/src/orthonym/data/opsin_imports/_phase150_validation.json +1477 -0
  189. orthonym-1.0.0/src/orthonym/data/opsin_imports/_roundtrip_report.json +25 -0
  190. orthonym-1.0.0/src/orthonym/data/opsin_imports/_validation_report.json +1114 -0
  191. orthonym-1.0.0/src/orthonym/data/opsin_imports/amino_acids_opsin.py +4884 -0
  192. orthonym-1.0.0/src/orthonym/data/opsin_imports/aryl_groups.py +7782 -0
  193. orthonym-1.0.0/src/orthonym/data/opsin_imports/carbohydrates_opsin.py +2505 -0
  194. orthonym-1.0.0/src/orthonym/data/opsin_imports/carboxylic_acids_opsin.py +5346 -0
  195. orthonym-1.0.0/src/orthonym/data/opsin_imports/cyclic_groups.py +3435 -0
  196. orthonym-1.0.0/src/orthonym/data/opsin_imports/functional_terms.py +761 -0
  197. orthonym-1.0.0/src/orthonym/data/opsin_imports/fusion_components_opsin.py +2784 -0
  198. orthonym-1.0.0/src/orthonym/data/opsin_imports/natural_products_opsin.py +2427 -0
  199. orthonym-1.0.0/src/orthonym/data/opsin_imports/regex_tokens_xml.json +5 -0
  200. orthonym-1.0.0/src/orthonym/data/opsin_imports/simple_groups.py +8895 -0
  201. orthonym-1.0.0/src/orthonym/data/opsin_imports/substituent_names_opsin.py +8496 -0
  202. orthonym-1.0.0/src/orthonym/data/opsin_imports/suffix_rules.py +431 -0
  203. orthonym-1.0.0/src/orthonym/data/opsin_imports/word_rules.py +71 -0
  204. orthonym-1.0.0/src/orthonym/data/organometallics.py +261 -0
  205. orthonym-1.0.0/src/orthonym/data/partial_saturation_refs.py +449 -0
  206. orthonym-1.0.0/src/orthonym/data/pin_policy.py +73 -0
  207. orthonym-1.0.0/src/orthonym/data/polycyclic_data.py +1095 -0
  208. orthonym-1.0.0/src/orthonym/data/resonance_templates.py +214 -0
  209. orthonym-1.0.0/src/orthonym/data/retained_names.py +955 -0
  210. orthonym-1.0.0/src/orthonym/data/sugar_names.py +4635 -0
  211. orthonym-1.0.0/src/orthonym/data/trivial_acids.py +169 -0
  212. orthonym-1.0.0/src/orthonym/data/triviality_controller_seed.json +752 -0
  213. orthonym-1.0.0/src/orthonym/data/triviality_controller_seed.py +250 -0
  214. orthonym-1.0.0/src/orthonym/data/xanthine_derivatives.py +289 -0
  215. orthonym-1.0.0/src/orthonym/decomposition/__init__.py +21 -0
  216. orthonym-1.0.0/src/orthonym/decomposition/bond_cleavage.py +734 -0
  217. orthonym-1.0.0/src/orthonym/decomposition/engine.py +2304 -0
  218. orthonym-1.0.0/src/orthonym/decomposition/fragment_assembly.py +2604 -0
  219. orthonym-1.0.0/src/orthonym/decomposition/fragment_capping.py +193 -0
  220. orthonym-1.0.0/src/orthonym/decomposition/fragment_ranker.py +139 -0
  221. orthonym-1.0.0/src/orthonym/decomposition/weave.py +663 -0
  222. orthonym-1.0.0/src/orthonym/diagnostics.py +46 -0
  223. orthonym-1.0.0/src/orthonym/errors.py +418 -0
  224. orthonym-1.0.0/src/orthonym/jars.py +276 -0
  225. orthonym-1.0.0/src/orthonym/jvm_bridge.py +480 -0
  226. orthonym-1.0.0/src/orthonym/jvm_budget.py +327 -0
  227. orthonym-1.0.0/src/orthonym/jvm_flags.py +152 -0
  228. orthonym-1.0.0/src/orthonym/metrics/__init__.py +6 -0
  229. orthonym-1.0.0/src/orthonym/metrics/abstention.py +162 -0
  230. orthonym-1.0.0/src/orthonym/metrics/breadth.py +768 -0
  231. orthonym-1.0.0/src/orthonym/metrics/candidate_ledger.py +186 -0
  232. orthonym-1.0.0/src/orthonym/metrics/coverage_metrics.py +262 -0
  233. orthonym-1.0.0/src/orthonym/metrics/provenance.py +532 -0
  234. orthonym-1.0.0/src/orthonym/namer.py +10184 -0
  235. orthonym-1.0.0/src/orthonym/perception/centres_bridge.py +420 -0
  236. orthonym-1.0.0/src/orthonym/perception/chains.py +1385 -0
  237. orthonym-1.0.0/src/orthonym/perception/functional_groups.py +1667 -0
  238. orthonym-1.0.0/src/orthonym/perception/ions.py +711 -0
  239. orthonym-1.0.0/src/orthonym/perception/lambda_hydride.py +52 -0
  240. orthonym-1.0.0/src/orthonym/perception/lipids.py +398 -0
  241. orthonym-1.0.0/src/orthonym/perception/metals.py +856 -0
  242. orthonym-1.0.0/src/orthonym/perception/molcache.py +163 -0
  243. orthonym-1.0.0/src/orthonym/perception/natural_products.py +443 -0
  244. orthonym-1.0.0/src/orthonym/perception/rings.py +465 -0
  245. orthonym-1.0.0/src/orthonym/perception/smarts_cache.py +18 -0
  246. orthonym-1.0.0/src/orthonym/perception/stereo.py +652 -0
  247. orthonym-1.0.0/src/orthonym/perception/structure_conservation.py +525 -0
  248. orthonym-1.0.0/src/orthonym/routing/__init__.py +43 -0
  249. orthonym-1.0.0/src/orthonym/routing/dispatch_table.py +2810 -0
  250. orthonym-1.0.0/src/orthonym/routing/dispatcher.py +228 -0
  251. orthonym-1.0.0/src/orthonym/rules/__init__.py +15 -0
  252. orthonym-1.0.0/src/orthonym/rules/acid_ester_anion.py +273 -0
  253. orthonym-1.0.0/src/orthonym/rules/acid_halides.py +1082 -0
  254. orthonym-1.0.0/src/orthonym/rules/added_carbon_parent.py +435 -0
  255. orthonym-1.0.0/src/orthonym/rules/adducts.py +516 -0
  256. orthonym-1.0.0/src/orthonym/rules/amides.py +965 -0
  257. orthonym-1.0.0/src/orthonym/rules/amino_acids.py +587 -0
  258. orthonym-1.0.0/src/orthonym/rules/anhydrides.py +1321 -0
  259. orthonym-1.0.0/src/orthonym/rules/benzene.py +5794 -0
  260. orthonym-1.0.0/src/orthonym/rules/bicyclo.py +1155 -0
  261. orthonym-1.0.0/src/orthonym/rules/bridged_fused.py +1937 -0
  262. orthonym-1.0.0/src/orthonym/rules/catenated_hydrides.py +516 -0
  263. orthonym-1.0.0/src/orthonym/rules/charged_router.py +3177 -0
  264. orthonym-1.0.0/src/orthonym/rules/conjugate_controller.py +298 -0
  265. orthonym-1.0.0/src/orthonym/rules/cycloalkanes.py +901 -0
  266. orthonym-1.0.0/src/orthonym/rules/esters.py +4064 -0
  267. orthonym-1.0.0/src/orthonym/rules/functional_replacement.py +375 -0
  268. orthonym-1.0.0/src/orthonym/rules/fused_ring_selection.py +329 -0
  269. orthonym-1.0.0/src/orthonym/rules/fused_rings.py +4804 -0
  270. orthonym-1.0.0/src/orthonym/rules/fusion_descriptors.py +1617 -0
  271. orthonym-1.0.0/src/orthonym/rules/fusion_numbering.py +580 -0
  272. orthonym-1.0.0/src/orthonym/rules/fusion_orientation.py +843 -0
  273. orthonym-1.0.0/src/orthonym/rules/greek_stereo_descriptors.py +21 -0
  274. orthonym-1.0.0/src/orthonym/rules/heterocycles.py +5199 -0
  275. orthonym-1.0.0/src/orthonym/rules/inorganic_acids.py +2251 -0
  276. orthonym-1.0.0/src/orthonym/rules/inositols.py +161 -0
  277. orthonym-1.0.0/src/orthonym/rules/ions.py +6991 -0
  278. orthonym-1.0.0/src/orthonym/rules/isotopes.py +3145 -0
  279. orthonym-1.0.0/src/orthonym/rules/ketenes.py +162 -0
  280. orthonym-1.0.0/src/orthonym/rules/lactams.py +589 -0
  281. orthonym-1.0.0/src/orthonym/rules/lactones.py +892 -0
  282. orthonym-1.0.0/src/orthonym/rules/lambda_convention.py +100 -0
  283. orthonym-1.0.0/src/orthonym/rules/lipids.py +705 -0
  284. orthonym-1.0.0/src/orthonym/rules/locant_validation.py +251 -0
  285. orthonym-1.0.0/src/orthonym/rules/locants.py +937 -0
  286. orthonym-1.0.0/src/orthonym/rules/mononuclear_hydrides.py +1521 -0
  287. orthonym-1.0.0/src/orthonym/rules/multiplicative.py +5015 -0
  288. orthonym-1.0.0/src/orthonym/rules/natural_products.py +2509 -0
  289. orthonym-1.0.0/src/orthonym/rules/nitramide.py +229 -0
  290. orthonym-1.0.0/src/orthonym/rules/nitriles.py +200 -0
  291. orthonym-1.0.0/src/orthonym/rules/nucleosides.py +497 -0
  292. orthonym-1.0.0/src/orthonym/rules/oligosaccharides.py +1696 -0
  293. orthonym-1.0.0/src/orthonym/rules/organometallics.py +1530 -0
  294. orthonym-1.0.0/src/orthonym/rules/ortho_fused.py +673 -0
  295. orthonym-1.0.0/src/orthonym/rules/p44_scorer.py +606 -0
  296. orthonym-1.0.0/src/orthonym/rules/parent_correctness.py +287 -0
  297. orthonym-1.0.0/src/orthonym/rules/parent_ranking.py +384 -0
  298. orthonym-1.0.0/src/orthonym/rules/parent_selection.py +1013 -0
  299. orthonym-1.0.0/src/orthonym/rules/partial_saturation.py +2982 -0
  300. orthonym-1.0.0/src/orthonym/rules/peptides.py +1728 -0
  301. orthonym-1.0.0/src/orthonym/rules/phane.py +1423 -0
  302. orthonym-1.0.0/src/orthonym/rules/phosphorus.py +2024 -0
  303. orthonym-1.0.0/src/orthonym/rules/pin_vocabulary.py +817 -0
  304. orthonym-1.0.0/src/orthonym/rules/polyazane.py +801 -0
  305. orthonym-1.0.0/src/orthonym/rules/polychalcogen.py +679 -0
  306. orthonym-1.0.0/src/orthonym/rules/polycyclic.py +4341 -0
  307. orthonym-1.0.0/src/orthonym/rules/polycyclic_bridged.py +565 -0
  308. orthonym-1.0.0/src/orthonym/rules/polycyclic_von_baeyer.py +286 -0
  309. orthonym-1.0.0/src/orthonym/rules/polycyclics.py +2444 -0
  310. orthonym-1.0.0/src/orthonym/rules/polyfunctional.py +4197 -0
  311. orthonym-1.0.0/src/orthonym/rules/polyol_polyester.py +323 -0
  312. orthonym-1.0.0/src/orthonym/rules/pseudoketones.py +541 -0
  313. orthonym-1.0.0/src/orthonym/rules/purine.py +572 -0
  314. orthonym-1.0.0/src/orthonym/rules/purine_oxo.py +210 -0
  315. orthonym-1.0.0/src/orthonym/rules/radicals.py +2044 -0
  316. orthonym-1.0.0/src/orthonym/rules/ring_assemblies.py +3552 -0
  317. orthonym-1.0.0/src/orthonym/rules/ring_chalcogen_oxide.py +313 -0
  318. orthonym-1.0.0/src/orthonym/rules/ring_replacement.py +361 -0
  319. orthonym-1.0.0/src/orthonym/rules/ring_selection.py +985 -0
  320. orthonym-1.0.0/src/orthonym/rules/ring_substituents.py +4830 -0
  321. orthonym-1.0.0/src/orthonym/rules/ring_unsaturation.py +141 -0
  322. orthonym-1.0.0/src/orthonym/rules/salts.py +1399 -0
  323. orthonym-1.0.0/src/orthonym/rules/seniority.py +1248 -0
  324. orthonym-1.0.0/src/orthonym/rules/skeletal_replacement.py +1809 -0
  325. orthonym-1.0.0/src/orthonym/rules/spiro.py +6304 -0
  326. orthonym-1.0.0/src/orthonym/rules/stereochemistry.py +1616 -0
  327. orthonym-1.0.0/src/orthonym/rules/steroid_stereo.py +321 -0
  328. orthonym-1.0.0/src/orthonym/rules/substituent_purity.py +289 -0
  329. orthonym-1.0.0/src/orthonym/rules/sulfonamides.py +449 -0
  330. orthonym-1.0.0/src/orthonym/rules/sulfur.py +794 -0
  331. orthonym-1.0.0/src/orthonym/rules/sulfur_oxoacid.py +283 -0
  332. orthonym-1.0.0/src/orthonym/rules/terminal_fragment.py +770 -0
  333. orthonym-1.0.0/src/orthonym/rules/terminal_ring.py +709 -0
  334. orthonym-1.0.0/src/orthonym/rules/thioimides.py +199 -0
  335. orthonym-1.0.0/src/orthonym/rules/tricyclo.py +862 -0
  336. orthonym-1.0.0/src/orthonym/rules/vonbaeyer_universal.py +918 -0
  337. orthonym-1.0.0/src/orthonym/runtime_tuning.py +70 -0
  338. orthonym-1.0.0/src/orthonym/validation/__init__.py +38 -0
  339. orthonym-1.0.0/src/orthonym/validation/atom_coverage.py +396 -0
  340. orthonym-1.0.0/src/orthonym/validation/binding_spine.py +1976 -0
  341. orthonym-1.0.0/src/orthonym/validation/coverage_gate.py +204 -0
  342. orthonym-1.0.0/src/orthonym/validation/dual_validator.py +298 -0
  343. orthonym-1.0.0/src/orthonym/validation/e1_certificate.py +240 -0
  344. orthonym-1.0.0/src/orthonym/validation/format_validator.py +367 -0
  345. orthonym-1.0.0/src/orthonym/validation/name_morphemes.py +1632 -0
  346. orthonym-1.0.0/src/orthonym/validation/opsin_grammar.py +752 -0
  347. orthonym-1.0.0/src/orthonym/validation/opsin_roundtrip.py +343 -0
  348. orthonym-1.0.0/src/orthonym/validation/opsin_server.py +153 -0
  349. orthonym-1.0.0/src/orthonym/validation/proof_ledger.py +149 -0
  350. orthonym-1.0.0/src/orthonym/validation/protonation_identity.py +63 -0
  351. orthonym-1.0.0/src/orthonym/validation/pubchem_validator.py +156 -0
  352. orthonym-1.0.0/src/orthonym/validation/radical_identity.py +116 -0
  353. orthonym-1.0.0/src/orthonym/validation/reconstruct.py +271 -0
  354. orthonym-1.0.0/tests/benchmarks/__init__.py +0 -0
  355. orthonym-1.0.0/tests/benchmarks/test_cfr_dispatch_performance.py +114 -0
  356. orthonym-1.0.0/tests/benchmarks/test_decomp_performance.py +136 -0
  357. orthonym-1.0.0/tests/canary/canary_diaryl_methyl.csv +8 -0
  358. orthonym-1.0.0/tests/canary/canary_functional_replacement.csv +37 -0
  359. orthonym-1.0.0/tests/canary/canary_ml_rule_based_success.csv +101 -0
  360. orthonym-1.0.0/tests/canary/canary_organometallics.csv +54 -0
  361. orthonym-1.0.0/tests/canary/canary_post_160.1.csv +1283 -0
  362. orthonym-1.0.0/tests/canary/canary_post_160.2.csv +1283 -0
  363. orthonym-1.0.0/tests/canary/canary_post_168.csv +1283 -0
  364. orthonym-1.0.0/tests/canary/canary_post_169.5.csv +1283 -0
  365. orthonym-1.0.0/tests/canary/canary_post_169.7_start.csv +1283 -0
  366. orthonym-1.0.0/tests/canary/canary_post_169.csv +1283 -0
  367. orthonym-1.0.0/tests/canary/canary_post_171_start.csv +1283 -0
  368. orthonym-1.0.0/tests/canary/canary_post_blockers_fix_160.1.csv +1283 -0
  369. orthonym-1.0.0/tests/canary/canary_post_cfr_158.csv +1283 -0
  370. orthonym-1.0.0/tests/canary/canary_post_decomp_160.csv +1283 -0
  371. orthonym-1.0.0/tests/canary/canary_post_subenum_fix_160.1.csv +1283 -0
  372. orthonym-1.0.0/tests/canary/canary_pre_168.csv +1283 -0
  373. orthonym-1.0.0/tests/canary/canary_pre_cfr_158.csv +1283 -0
  374. orthonym-1.0.0/tests/canary/canary_pre_decomp_160.csv +1283 -0
  375. orthonym-1.0.0/tests/canary/canary_triviality_controller.csv +88 -0
  376. orthonym-1.0.0/tests/conftest.py +600 -0
  377. orthonym-1.0.0/tests/data/cip_validation/compounds.smi +300 -0
  378. orthonym-1.0.0/tests/data/cip_validation/rdkit_cip_results.txt +237 -0
  379. orthonym-1.0.0/tests/data/stereo_handlers/benzene/cases.json +47 -0
  380. orthonym-1.0.0/tests/data/stereo_handlers/complex_ring/cases.json +107 -0
  381. orthonym-1.0.0/tests/data/stereo_handlers/cycloalkane/cases.json +50 -0
  382. orthonym-1.0.0/tests/data/stereo_handlers/cycloalkene/cases.json +37 -0
  383. orthonym-1.0.0/tests/data/stereo_handlers/cycloalkene_8plus/cases.json +62 -0
  384. orthonym-1.0.0/tests/data/stereo_handlers/heterocycle/cases.json +63 -0
  385. orthonym-1.0.0/tests/e2e/test_phase12_ring_chain.py +387 -0
  386. orthonym-1.0.0/tests/e2e/test_phase13_ions_radicals.py +632 -0
  387. orthonym-1.0.0/tests/fixtures/benzo_fusion/audit_c_results.json +227 -0
  388. orthonym-1.0.0/tests/fixtures/benzo_fusion/corpus_mined.json +182 -0
  389. orthonym-1.0.0/tests/fixtures/chain_freeze_1_500.json +502 -0
  390. orthonym-1.0.0/tests/fixtures/cyclophane/blue_book_examples.json +117 -0
  391. orthonym-1.0.0/tests/fixtures/cyclophane/corpus_mined.json +104 -0
  392. orthonym-1.0.0/tests/fixtures/ester_freeze.json +55 -0
  393. orthonym-1.0.0/tests/fixtures/handler_tree_probes.json +44 -0
  394. orthonym-1.0.0/tests/fixtures/indicated_h/audit_b_results.json +1388 -0
  395. orthonym-1.0.0/tests/fixtures/indicated_h/corpus_mined.json +272 -0
  396. orthonym-1.0.0/tests/fixtures/multiplicative/blue_book_examples.json +452 -0
  397. orthonym-1.0.0/tests/fixtures/multiplicative/corpus_mined.json +9557 -0
  398. orthonym-1.0.0/tests/fixtures/multiplicative/opsin_bridge_inventory.json +758 -0
  399. orthonym-1.0.0/tests/fixtures/phase_145/chebi_fixture.csv +6 -0
  400. orthonym-1.0.0/tests/fixtures/phase_145/chebi_sample_5.tsv +5 -0
  401. orthonym-1.0.0/tests/fixtures/phase_145/opsin_selftest_fixture.csv +6 -0
  402. orthonym-1.0.0/tests/fixtures/phase_145/pubchem_cid_iupac_sample.tsv +10 -0
  403. orthonym-1.0.0/tests/fixtures/phase_145/pubchem_cid_smiles_sample.tsv +11 -0
  404. orthonym-1.0.0/tests/fixtures/phase_145/pubchem_fixture.csv +6 -0
  405. orthonym-1.0.0/tests/fixtures/ring_systems/assemblies/blue_book_examples.json +146 -0
  406. orthonym-1.0.0/tests/fixtures/ring_systems/assemblies/corpus_mined.json +16 -0
  407. orthonym-1.0.0/tests/fixtures/ring_systems/assemblies/literature_validated.json +146 -0
  408. orthonym-1.0.0/tests/fixtures/ring_systems/spiro/anti_canary.json +132 -0
  409. orthonym-1.0.0/tests/fixtures/ring_systems/spiro/blue_book_examples.json +262 -0
  410. orthonym-1.0.0/tests/fixtures/ring_systems/spiro/corpus_mined.json +353 -0
  411. orthonym-1.0.0/tests/fixtures/ring_systems/vb/blue_book_examples.json +158 -0
  412. orthonym-1.0.0/tests/fixtures/ring_systems/vb/corpus_mined.json +475 -0
  413. orthonym-1.0.0/tests/fixtures/serializer_flip_snapshot.csv +19 -0
  414. orthonym-1.0.0/tests/fixtures/skeletal_replacement/blue_book_examples.json +134 -0
  415. orthonym-1.0.0/tests/fixtures/skeletal_replacement/corpus_mined.json +11330 -0
  416. orthonym-1.0.0/tests/integration/__init__.py +1 -0
  417. orthonym-1.0.0/tests/integration/test_160_1_regression_fixtures.py +298 -0
  418. orthonym-1.0.0/tests/integration/test_accuracy_fixes_e2e.py +309 -0
  419. orthonym-1.0.0/tests/integration/test_algorithmic_fusion.py +464 -0
  420. orthonym-1.0.0/tests/integration/test_amide_n_substitution.py +143 -0
  421. orthonym-1.0.0/tests/integration/test_amide_ring_subs.py +96 -0
  422. orthonym-1.0.0/tests/integration/test_amino_acid_format.py +166 -0
  423. orthonym-1.0.0/tests/integration/test_aspect_routing.py +285 -0
  424. orthonym-1.0.0/tests/integration/test_assembly_hardening.py +357 -0
  425. orthonym-1.0.0/tests/integration/test_assembly_prefix_suffix.py +67 -0
  426. orthonym-1.0.0/tests/integration/test_assembly_vs_multiplicative_dispatch.py +174 -0
  427. orthonym-1.0.0/tests/integration/test_bare_oxy_fixes.py +174 -0
  428. orthonym-1.0.0/tests/integration/test_behavioral_freeze.py +43 -0
  429. orthonym-1.0.0/tests/integration/test_benchmark_multi_corpus.py +157 -0
  430. orthonym-1.0.0/tests/integration/test_benzo_fusion_corpus.py +196 -0
  431. orthonym-1.0.0/tests/integration/test_branch_review_fixes.py +875 -0
  432. orthonym-1.0.0/tests/integration/test_breadth_job1.py +341 -0
  433. orthonym-1.0.0/tests/integration/test_breadth_zinc_loss.py +133 -0
  434. orthonym-1.0.0/tests/integration/test_byte_identical_145_1.py +113 -0
  435. orthonym-1.0.0/tests/integration/test_caffeine_naming.py +222 -0
  436. orthonym-1.0.0/tests/integration/test_calibrated_gate.py +339 -0
  437. orthonym-1.0.0/tests/integration/test_canary_connectivity.py +66 -0
  438. orthonym-1.0.0/tests/integration/test_canary_functional_replacement.py +208 -0
  439. orthonym-1.0.0/tests/integration/test_canary_name_stability.py +3041 -0
  440. orthonym-1.0.0/tests/integration/test_canary_organometallics.py +195 -0
  441. orthonym-1.0.0/tests/integration/test_canary_rt75.py +3302 -0
  442. orthonym-1.0.0/tests/integration/test_centres_bridge.py +275 -0
  443. orthonym-1.0.0/tests/integration/test_cfr_dispatch_consistency.py +293 -0
  444. orthonym-1.0.0/tests/integration/test_cfr_dispatch_recursion.py +226 -0
  445. orthonym-1.0.0/tests/integration/test_chain_substituent_completeness.py +217 -0
  446. orthonym-1.0.0/tests/integration/test_chain_universal_pipeline.py +107 -0
  447. orthonym-1.0.0/tests/integration/test_charge_ion_rt.py +454 -0
  448. orthonym-1.0.0/tests/integration/test_ci_benchmark.py +558 -0
  449. orthonym-1.0.0/tests/integration/test_cip_validation.py +571 -0
  450. orthonym-1.0.0/tests/integration/test_claims_code_a.py +227 -0
  451. orthonym-1.0.0/tests/integration/test_claims_conformance_exit_check.py +218 -0
  452. orthonym-1.0.0/tests/integration/test_claims_conformance_shown_names.py +148 -0
  453. orthonym-1.0.0/tests/integration/test_complex_ring_subs_phase119.py +145 -0
  454. orthonym-1.0.0/tests/integration/test_complex_rings_integration.py +338 -0
  455. orthonym-1.0.0/tests/integration/test_confidence_api.py +185 -0
  456. orthonym-1.0.0/tests/integration/test_coverage_gate_refactor.py +181 -0
  457. orthonym-1.0.0/tests/integration/test_cq_fallthrough.py +201 -0
  458. orthonym-1.0.0/tests/integration/test_cq_fallthrough2.py +236 -0
  459. orthonym-1.0.0/tests/integration/test_cq_tier_superset.py +70 -0
  460. orthonym-1.0.0/tests/integration/test_cq_total_recursion.py +126 -0
  461. orthonym-1.0.0/tests/integration/test_cyclophane_corpus.py +197 -0
  462. orthonym-1.0.0/tests/integration/test_decomp_dump_tree_cli.py +174 -0
  463. orthonym-1.0.0/tests/integration/test_decomp_handler_consistency.py +144 -0
  464. orthonym-1.0.0/tests/integration/test_decomp_module_level_export.py +40 -0
  465. orthonym-1.0.0/tests/integration/test_decomp_name_with_tree.py +213 -0
  466. orthonym-1.0.0/tests/integration/test_decomposition_e2e.py +395 -0
  467. orthonym-1.0.0/tests/integration/test_decomposition_ether.py +139 -0
  468. orthonym-1.0.0/tests/integration/test_decomposition_fragment_fallback.py +206 -0
  469. orthonym-1.0.0/tests/integration/test_decomposition_iterative.py +250 -0
  470. orthonym-1.0.0/tests/integration/test_decomposition_new_bonds.py +617 -0
  471. orthonym-1.0.0/tests/integration/test_decomposition_regression.py +257 -0
  472. orthonym-1.0.0/tests/integration/test_decomposition_seniority.py +203 -0
  473. orthonym-1.0.0/tests/integration/test_decomposition_seniority_swap.py +242 -0
  474. orthonym-1.0.0/tests/integration/test_determinism_np_aromatic_locants.py +243 -0
  475. orthonym-1.0.0/tests/integration/test_deterministic_output.py +327 -0
  476. orthonym-1.0.0/tests/integration/test_discover_substituents_integration.py +457 -0
  477. orthonym-1.0.0/tests/integration/test_dot_disconnected.py +111 -0
  478. orthonym-1.0.0/tests/integration/test_drop07_drop17_canary.py +67 -0
  479. orthonym-1.0.0/tests/integration/test_ester_behavioral_freeze.py +44 -0
  480. orthonym-1.0.0/tests/integration/test_ester_family_d16_unwrap.py +172 -0
  481. orthonym-1.0.0/tests/integration/test_ester_lipid_format.py +371 -0
  482. orthonym-1.0.0/tests/integration/test_fatty_acid_phospholipid.py +203 -0
  483. orthonym-1.0.0/tests/integration/test_fg_drop_audit.py +224 -0
  484. orthonym-1.0.0/tests/integration/test_format_decomposition_fixes.py +204 -0
  485. orthonym-1.0.0/tests/integration/test_foundation_e2e.py +312 -0
  486. orthonym-1.0.0/tests/integration/test_fragment_e2e.py +267 -0
  487. orthonym-1.0.0/tests/integration/test_frn_byte_identical_v18_canary.py +158 -0
  488. orthonym-1.0.0/tests/integration/test_fused_het_compound_prefix.py +204 -0
  489. orthonym-1.0.0/tests/integration/test_fused_het_inner_subs_expanded.py +257 -0
  490. orthonym-1.0.0/tests/integration/test_fused_het_prefix_opsin_rt.py +147 -0
  491. orthonym-1.0.0/tests/integration/test_fused_het_retained_names.py +45 -0
  492. orthonym-1.0.0/tests/integration/test_fused_het_wiring.py +91 -0
  493. orthonym-1.0.0/tests/integration/test_fused_heterocycle_locant_verification.py +326 -0
  494. orthonym-1.0.0/tests/integration/test_fused_heterocycle_routing.py +214 -0
  495. orthonym-1.0.0/tests/integration/test_fused_heterocycles_e2e.py +439 -0
  496. orthonym-1.0.0/tests/integration/test_glycoside_naming.py +407 -0
  497. orthonym-1.0.0/tests/integration/test_handler_retrofit.py +829 -0
  498. orthonym-1.0.0/tests/integration/test_handler_stereo_roundtrip.py +398 -0
  499. orthonym-1.0.0/tests/integration/test_handler_tree_contract.py +192 -0
  500. orthonym-1.0.0/tests/integration/test_heterocycles_e2e.py +343 -0
  501. orthonym-1.0.0/tests/integration/test_indicated_h_corpus.py +185 -0
  502. orthonym-1.0.0/tests/integration/test_ion_naming.py +259 -0
  503. orthonym-1.0.0/tests/integration/test_ion_zwitterion_macrocyclic.py +228 -0
  504. orthonym-1.0.0/tests/integration/test_lipid_roundtrip.py +93 -0
  505. orthonym-1.0.0/tests/integration/test_long_alkane_names.py +59 -0
  506. orthonym-1.0.0/tests/integration/test_low_heavy_atom_rescue.py +132 -0
  507. orthonym-1.0.0/tests/integration/test_macrocyclic_format.py +230 -0
  508. orthonym-1.0.0/tests/integration/test_malformed_suffixes.py +81 -0
  509. orthonym-1.0.0/tests/integration/test_medium_parent_fixes.py +534 -0
  510. orthonym-1.0.0/tests/integration/test_medium_parent_fixes.py.tmp.1647.1772545967863 +411 -0
  511. orthonym-1.0.0/tests/integration/test_medium_stereo_charge.py +240 -0
  512. orthonym-1.0.0/tests/integration/test_misc_format_fixes.py +62 -0
  513. orthonym-1.0.0/tests/integration/test_missing_compound_classes.py +459 -0
  514. orthonym-1.0.0/tests/integration/test_mixed_spiro_fused_dispatch.py +145 -0
  515. orthonym-1.0.0/tests/integration/test_multi_bond_e2e.py +252 -0
  516. orthonym-1.0.0/tests/integration/test_multi_ester.py +175 -0
  517. orthonym-1.0.0/tests/integration/test_multi_ester_complex.py +134 -0
  518. orthonym-1.0.0/tests/integration/test_multi_ring_roundtrip.py +265 -0
  519. orthonym-1.0.0/tests/integration/test_multiplicative_corpus.py +232 -0
  520. orthonym-1.0.0/tests/integration/test_n_prefix_grouping.py +86 -0
  521. orthonym-1.0.0/tests/integration/test_name_substituent_integration.py +281 -0
  522. orthonym-1.0.0/tests/integration/test_natural_products_e2e.py +631 -0
  523. orthonym-1.0.0/tests/integration/test_near_tie_selection.py +132 -0
  524. orthonym-1.0.0/tests/integration/test_np_backbone_regression.py +349 -0
  525. orthonym-1.0.0/tests/integration/test_opsin_format_acyl.py +319 -0
  526. orthonym-1.0.0/tests/integration/test_opsin_format_compliance.py +513 -0
  527. orthonym-1.0.0/tests/integration/test_opsin_format_heterocycles.py +188 -0
  528. orthonym-1.0.0/tests/integration/test_opsin_format_stereo.py +667 -0
  529. orthonym-1.0.0/tests/integration/test_opsin_format_validation.py +448 -0
  530. orthonym-1.0.0/tests/integration/test_opsin_format_vb.py +148 -0
  531. orthonym-1.0.0/tests/integration/test_opsin_grammar_integration.py +526 -0
  532. orthonym-1.0.0/tests/integration/test_opsin_phase17_validation.py +333 -0
  533. orthonym-1.0.0/tests/integration/test_opsin_retained_roundtrip.py +274 -0
  534. orthonym-1.0.0/tests/integration/test_opsin_roundtrip_validation.py +120 -0
  535. orthonym-1.0.0/tests/integration/test_organometallics.py +131 -0
  536. orthonym-1.0.0/tests/integration/test_orgm_byte_identical_v18_canary.py +135 -0
  537. orthonym-1.0.0/tests/integration/test_oversimplified_naming.py +281 -0
  538. orthonym-1.0.0/tests/integration/test_p2_labels_public_claims.py +102 -0
  539. orthonym-1.0.0/tests/integration/test_parent_mismatch_benchmark.py +551 -0
  540. orthonym-1.0.0/tests/integration/test_parenthesization_fixes.py +285 -0
  541. orthonym-1.0.0/tests/integration/test_peptide_ester_regression.py +273 -0
  542. orthonym-1.0.0/tests/integration/test_phane_vs_ring_assembly_dispatch.py +188 -0
  543. orthonym-1.0.0/tests/integration/test_phase105_canary.py +61 -0
  544. orthonym-1.0.0/tests/integration/test_phase147_cascade_activation.py +437 -0
  545. orthonym-1.0.0/tests/integration/test_phase149_cascade_activation.py +353 -0
  546. orthonym-1.0.0/tests/integration/test_phase14_6_e2e.py +244 -0
  547. orthonym-1.0.0/tests/integration/test_phase14_7_e2e.py +270 -0
  548. orthonym-1.0.0/tests/integration/test_phase23_e2e.py +453 -0
  549. orthonym-1.0.0/tests/integration/test_phase6_e2e.py +759 -0
  550. orthonym-1.0.0/tests/integration/test_phase8_e2e.py +433 -0
  551. orthonym-1.0.0/tests/integration/test_phenyl_hexanoic_acid.py +100 -0
  552. orthonym-1.0.0/tests/integration/test_phosphorus_e2e.py +273 -0
  553. orthonym-1.0.0/tests/integration/test_polycyclic_e2e.py +581 -0
  554. orthonym-1.0.0/tests/integration/test_polyfunctional_e2e.py +332 -0
  555. orthonym-1.0.0/tests/integration/test_polyfunctional_prefixes.py +483 -0
  556. orthonym-1.0.0/tests/integration/test_polyfunctional_split.py +321 -0
  557. orthonym-1.0.0/tests/integration/test_pool_state_isolation.py +318 -0
  558. orthonym-1.0.0/tests/integration/test_prefix_emission_e2e.py +61 -0
  559. orthonym-1.0.0/tests/integration/test_principal_chain_selection.py +431 -0
  560. orthonym-1.0.0/tests/integration/test_qw_near_match.py +312 -0
  561. orthonym-1.0.0/tests/integration/test_qw_stereo.py +172 -0
  562. orthonym-1.0.0/tests/integration/test_readme_claims.py +117 -0
  563. orthonym-1.0.0/tests/integration/test_recursive_substituents.py +337 -0
  564. orthonym-1.0.0/tests/integration/test_recursive_substituents_secondary.py +355 -0
  565. orthonym-1.0.0/tests/integration/test_regression_v5.py +477 -0
  566. orthonym-1.0.0/tests/integration/test_ring_alcohol_stereo.py +109 -0
  567. orthonym-1.0.0/tests/integration/test_ring_as_substituent.py +395 -0
  568. orthonym-1.0.0/tests/integration/test_ring_assembly_3plus.py +134 -0
  569. orthonym-1.0.0/tests/integration/test_ring_boundary_benchmark.py +128 -0
  570. orthonym-1.0.0/tests/integration/test_ring_boundary_integration.py +120 -0
  571. orthonym-1.0.0/tests/integration/test_ring_chain_naming.py +291 -0
  572. orthonym-1.0.0/tests/integration/test_ring_expansion.py +232 -0
  573. orthonym-1.0.0/tests/integration/test_ring_foundation_e2e.py +325 -0
  574. orthonym-1.0.0/tests/integration/test_ring_selection_e2e.py +238 -0
  575. orthonym-1.0.0/tests/integration/test_ring_substituent_completeness.py +207 -0
  576. orthonym-1.0.0/tests/integration/test_ring_substituent_regression.py +325 -0
  577. orthonym-1.0.0/tests/integration/test_roundtrip_regression.py +1217 -0
  578. orthonym-1.0.0/tests/integration/test_score_based_mode.py +281 -0
  579. orthonym-1.0.0/tests/integration/test_skeletal_replacement_corpus.py +226 -0
  580. orthonym-1.0.0/tests/integration/test_small_mol_rt.py +630 -0
  581. orthonym-1.0.0/tests/integration/test_spiro_heteroatom.py +242 -0
  582. orthonym-1.0.0/tests/integration/test_stereo_benchmark.py +518 -0
  583. orthonym-1.0.0/tests/integration/test_stereo_free_steroids.py +66 -0
  584. orthonym-1.0.0/tests/integration/test_stereo_handler_retrofit.py +378 -0
  585. orthonym-1.0.0/tests/integration/test_stereochemistry_e2e.py +401 -0
  586. orthonym-1.0.0/tests/integration/test_steroid_format.py +287 -0
  587. orthonym-1.0.0/tests/integration/test_steroid_format_fixes.py +470 -0
  588. orthonym-1.0.0/tests/integration/test_steroid_roundtrip.py +100 -0
  589. orthonym-1.0.0/tests/integration/test_substituent_completeness_phase48.py +401 -0
  590. orthonym-1.0.0/tests/integration/test_substituent_prefix_form_integration.py +146 -0
  591. orthonym-1.0.0/tests/integration/test_sulfur_e2e.py +176 -0
  592. orthonym-1.0.0/tests/integration/test_terphenyl_substituted_roundtrip.py +112 -0
  593. orthonym-1.0.0/tests/integration/test_texts_labels_spelling.py +149 -0
  594. orthonym-1.0.0/tests/integration/test_tier_b_recovery.py +220 -0
  595. orthonym-1.0.0/tests/integration/test_tier_labels_paper_semantics.py +200 -0
  596. orthonym-1.0.0/tests/integration/test_triviality_controller.py +545 -0
  597. orthonym-1.0.0/tests/integration/test_triviality_controller_denylist.py +232 -0
  598. orthonym-1.0.0/tests/integration/test_triviality_controller_e2e.py +107 -0
  599. orthonym-1.0.0/tests/integration/test_triviality_controller_rt.py +124 -0
  600. orthonym-1.0.0/tests/integration/test_v29_p3reg_gate_target_oracle.py +100 -0
  601. orthonym-1.0.0/tests/integration/test_vb_opsin_format.py +240 -0
  602. orthonym-1.0.0/tests/ledger/__init__.py +0 -0
  603. orthonym-1.0.0/tests/ledger/test_build_ledger.py +116 -0
  604. orthonym-1.0.0/tests/ledger/test_fill_examples.py +128 -0
  605. orthonym-1.0.0/tests/ledger/test_fill_examples_2b.py +252 -0
  606. orthonym-1.0.0/tests/ledger/test_reaudit_w8.py +163 -0
  607. orthonym-1.0.0/tests/ledger/test_regrade.py +188 -0
  608. orthonym-1.0.0/tests/support/issue108.py +92 -0
  609. orthonym-1.0.0/tests/support/jars.py +56 -0
  610. orthonym-1.0.0/tests/support/local_only.py +34 -0
  611. orthonym-1.0.0/tests/support/rt_assert.py +163 -0
  612. orthonym-1.0.0/tests/support/v34_charged_probe.py +257 -0
  613. orthonym-1.0.0/tests/unit/__init__.py +0 -0
  614. orthonym-1.0.0/tests/unit/assembly/__init__.py +0 -0
  615. orthonym-1.0.0/tests/unit/assembly/_m2_witnesses.py +124 -0
  616. orthonym-1.0.0/tests/unit/assembly/handlers/__init__.py +0 -0
  617. orthonym-1.0.0/tests/unit/assembly/handlers/test_acid_halide.py +112 -0
  618. orthonym-1.0.0/tests/unit/assembly/handlers/test_amide.py +174 -0
  619. orthonym-1.0.0/tests/unit/assembly/handlers/test_amine.py +112 -0
  620. orthonym-1.0.0/tests/unit/assembly/handlers/test_anhydride.py +112 -0
  621. orthonym-1.0.0/tests/unit/assembly/handlers/test_benzene.py +51 -0
  622. orthonym-1.0.0/tests/unit/assembly/handlers/test_boronic_acid.py +112 -0
  623. orthonym-1.0.0/tests/unit/assembly/handlers/test_carbamate.py +112 -0
  624. orthonym-1.0.0/tests/unit/assembly/handlers/test_carbamic_acid.py +112 -0
  625. orthonym-1.0.0/tests/unit/assembly/handlers/test_chain.py +51 -0
  626. orthonym-1.0.0/tests/unit/assembly/handlers/test_complex_ring.py +51 -0
  627. orthonym-1.0.0/tests/unit/assembly/handlers/test_diamide.py +104 -0
  628. orthonym-1.0.0/tests/unit/assembly/handlers/test_ester.py +51 -0
  629. orthonym-1.0.0/tests/unit/assembly/handlers/test_ester_family.py +221 -0
  630. orthonym-1.0.0/tests/unit/assembly/handlers/test_general_acyclic.py +51 -0
  631. orthonym-1.0.0/tests/unit/assembly/handlers/test_guanidine.py +112 -0
  632. orthonym-1.0.0/tests/unit/assembly/handlers/test_heterocycle.py +51 -0
  633. orthonym-1.0.0/tests/unit/assembly/handlers/test_hydrazone.py +112 -0
  634. orthonym-1.0.0/tests/unit/assembly/handlers/test_imidate_handler.py +396 -0
  635. orthonym-1.0.0/tests/unit/assembly/handlers/test_ion_dispatch.py +112 -0
  636. orthonym-1.0.0/tests/unit/assembly/handlers/test_isocyanate.py +112 -0
  637. orthonym-1.0.0/tests/unit/assembly/handlers/test_isothiocyanate.py +112 -0
  638. orthonym-1.0.0/tests/unit/assembly/handlers/test_lactam.py +112 -0
  639. orthonym-1.0.0/tests/unit/assembly/handlers/test_lactone.py +112 -0
  640. orthonym-1.0.0/tests/unit/assembly/handlers/test_multi_ester.py +51 -0
  641. orthonym-1.0.0/tests/unit/assembly/handlers/test_n_oxide.py +200 -0
  642. orthonym-1.0.0/tests/unit/assembly/handlers/test_organometallic_handler.py +327 -0
  643. orthonym-1.0.0/tests/unit/assembly/handlers/test_oxime.py +112 -0
  644. orthonym-1.0.0/tests/unit/assembly/handlers/test_partial_sat.py +112 -0
  645. orthonym-1.0.0/tests/unit/assembly/handlers/test_partial_sat_predicate_purity.py +84 -0
  646. orthonym-1.0.0/tests/unit/assembly/handlers/test_phosphate_ester.py +112 -0
  647. orthonym-1.0.0/tests/unit/assembly/handlers/test_phosphine.py +204 -0
  648. orthonym-1.0.0/tests/unit/assembly/handlers/test_phosphine_oxide.py +112 -0
  649. orthonym-1.0.0/tests/unit/assembly/handlers/test_phosphinic_acid.py +112 -0
  650. orthonym-1.0.0/tests/unit/assembly/handlers/test_polycyclic.py +112 -0
  651. orthonym-1.0.0/tests/unit/assembly/handlers/test_polyfunctional.py +51 -0
  652. orthonym-1.0.0/tests/unit/assembly/handlers/test_ring_assembly.py +112 -0
  653. orthonym-1.0.0/tests/unit/assembly/handlers/test_ring_ester.py +112 -0
  654. orthonym-1.0.0/tests/unit/assembly/handlers/test_ring_nitrile.py +178 -0
  655. orthonym-1.0.0/tests/unit/assembly/handlers/test_simple_molecule.py +112 -0
  656. orthonym-1.0.0/tests/unit/assembly/handlers/test_sulfone.py +112 -0
  657. orthonym-1.0.0/tests/unit/assembly/handlers/test_sulfoxide.py +112 -0
  658. orthonym-1.0.0/tests/unit/assembly/handlers/test_thioether.py +112 -0
  659. orthonym-1.0.0/tests/unit/assembly/handlers/test_tier_a_ring.py +109 -0
  660. orthonym-1.0.0/tests/unit/assembly/handlers/test_urea.py +169 -0
  661. orthonym-1.0.0/tests/unit/assembly/test_acyl_amido_prefix.py +186 -0
  662. orthonym-1.0.0/tests/unit/assembly/test_acyl_coa_giant.py +79 -0
  663. orthonym-1.0.0/tests/unit/assembly/test_acyl_coa_names.py +60 -0
  664. orthonym-1.0.0/tests/unit/assembly/test_acyloxy_substituent_prefix.py +138 -0
  665. orthonym-1.0.0/tests/unit/assembly/test_alkoxy_overcontraction.py +129 -0
  666. orthonym-1.0.0/tests/unit/assembly/test_alkoxycarbonyl_amino_prefix.py +344 -0
  667. orthonym-1.0.0/tests/unit/assembly/test_amide_amine_prefix_duplication.py +104 -0
  668. orthonym-1.0.0/tests/unit/assembly/test_amino_prefix_enclosing_marks.py +141 -0
  669. orthonym-1.0.0/tests/unit/assembly/test_backstop_inject.py +88 -0
  670. orthonym-1.0.0/tests/unit/assembly/test_besteffort_stereo_abstain.py +79 -0
  671. orthonym-1.0.0/tests/unit/assembly/test_bis_catenation_ambiguous.py +92 -0
  672. orthonym-1.0.0/tests/unit/assembly/test_branch_stereo_v35.py +64 -0
  673. orthonym-1.0.0/tests/unit/assembly/test_c_branch_fallback_declines.py +41 -0
  674. orthonym-1.0.0/tests/unit/assembly/test_candidate_name_ring_info.py +154 -0
  675. orthonym-1.0.0/tests/unit/assembly/test_candidate_name_tree.py +80 -0
  676. orthonym-1.0.0/tests/unit/assembly/test_candidate_pool.py +517 -0
  677. orthonym-1.0.0/tests/unit/assembly/test_carbon_ylidene_prefix.py +252 -0
  678. orthonym-1.0.0/tests/unit/assembly/test_carboxy_acyl_orientation.py +38 -0
  679. orthonym-1.0.0/tests/unit/assembly/test_carboxy_substituent_prefix.py +135 -0
  680. orthonym-1.0.0/tests/unit/assembly/test_carrier_sulfinyl_substituent.py +20 -0
  681. orthonym-1.0.0/tests/unit/assembly/test_cascade_step6_gate.py +153 -0
  682. orthonym-1.0.0/tests/unit/assembly/test_cationic_substituent.py +160 -0
  683. orthonym-1.0.0/tests/unit/assembly/test_chalcogen_bridge_prefixes.py +444 -0
  684. orthonym-1.0.0/tests/unit/assembly/test_charged_aromatic_zwitterion.py +81 -0
  685. orthonym-1.0.0/tests/unit/assembly/test_cistrans_ring_completeness.py +198 -0
  686. orthonym-1.0.0/tests/unit/assembly/test_composed_prefix_organyl_constitution.py +232 -0
  687. orthonym-1.0.0/tests/unit/assembly/test_composition_completeness.py +40 -0
  688. orthonym-1.0.0/tests/unit/assembly/test_composition_tier.py +101 -0
  689. orthonym-1.0.0/tests/unit/assembly/test_coverage_audit.py +115 -0
  690. orthonym-1.0.0/tests/unit/assembly/test_coverage_guards.py +67 -0
  691. orthonym-1.0.0/tests/unit/assembly/test_diaryl_methyl_substituent.py +234 -0
  692. orthonym-1.0.0/tests/unit/assembly/test_drop_fixes.py +139 -0
  693. orthonym-1.0.0/tests/unit/assembly/test_enclosing_marks_conformance.py +126 -0
  694. orthonym-1.0.0/tests/unit/assembly/test_enrichment_tier_vocabulary.py +209 -0
  695. orthonym-1.0.0/tests/unit/assembly/test_feature_flag.py +218 -0
  696. orthonym-1.0.0/tests/unit/assembly/test_filter_lowest_locants.py +158 -0
  697. orthonym-1.0.0/tests/unit/assembly/test_floor_ring_stereo_completion.py +82 -0
  698. orthonym-1.0.0/tests/unit/assembly/test_formatting_cleanup.py +196 -0
  699. orthonym-1.0.0/tests/unit/assembly/test_fragment_cache_pin_names.py +55 -0
  700. orthonym-1.0.0/tests/unit/assembly/test_free_valence_locant_invariant.py +196 -0
  701. orthonym-1.0.0/tests/unit/assembly/test_fusion_lambda_guard.py +48 -0
  702. orthonym-1.0.0/tests/unit/assembly/test_gem_disubstituted_ring_and_thiourea_enrichment.py +480 -0
  703. orthonym-1.0.0/tests/unit/assembly/test_general_acyclic.py +173 -0
  704. orthonym-1.0.0/tests/unit/assembly/test_general_engine.py +159 -0
  705. orthonym-1.0.0/tests/unit/assembly/test_general_engine_zwitterion.py +493 -0
  706. orthonym-1.0.0/tests/unit/assembly/test_general_monocycle_pg_anchor.py +197 -0
  707. orthonym-1.0.0/tests/unit/assembly/test_giant_molecule_hang_fix.py +168 -0
  708. orthonym-1.0.0/tests/unit/assembly/test_handler_shared.py +202 -0
  709. orthonym-1.0.0/tests/unit/assembly/test_inner_dispatch.py +1236 -0
  710. orthonym-1.0.0/tests/unit/assembly/test_isolated_naming_session.py +58 -0
  711. orthonym-1.0.0/tests/unit/assembly/test_lactone_furanone.py +68 -0
  712. orthonym-1.0.0/tests/unit/assembly/test_lambda_citation_order_regression.py +106 -0
  713. orthonym-1.0.0/tests/unit/assembly/test_locant_omission.py +583 -0
  714. orthonym-1.0.0/tests/unit/assembly/test_locant_sort_key_letter_aware.py +41 -0
  715. orthonym-1.0.0/tests/unit/assembly/test_located_fg_chain_stereo.py +68 -0
  716. orthonym-1.0.0/tests/unit/assembly/test_m1_missing_enclosure.py +120 -0
  717. orthonym-1.0.0/tests/unit/assembly/test_m2_cistrans_substituent.py +100 -0
  718. orthonym-1.0.0/tests/unit/assembly/test_m2_substituent_routing.py +401 -0
  719. orthonym-1.0.0/tests/unit/assembly/test_m3_atom_coverage_close.py +548 -0
  720. orthonym-1.0.0/tests/unit/assembly/test_memo.py +248 -0
  721. orthonym-1.0.0/tests/unit/assembly/test_multiring_competing_fg.py +21 -0
  722. orthonym-1.0.0/tests/unit/assembly/test_n_branch_fallback_excludes_nitrogen.py +68 -0
  723. orthonym-1.0.0/tests/unit/assembly/test_n_substituted_amido_prefix.py +195 -0
  724. orthonym-1.0.0/tests/unit/assembly/test_name_comparison.py +133 -0
  725. orthonym-1.0.0/tests/unit/assembly/test_name_heteroatom_substituent_split.py +469 -0
  726. orthonym-1.0.0/tests/unit/assembly/test_name_tree.py +322 -0
  727. orthonym-1.0.0/tests/unit/assembly/test_name_tree_builder.py +146 -0
  728. orthonym-1.0.0/tests/unit/assembly/test_name_tree_serializer.py +135 -0
  729. orthonym-1.0.0/tests/unit/assembly/test_name_tree_to_string.py +331 -0
  730. orthonym-1.0.0/tests/unit/assembly/test_naming_session_leak_self_heals.py +166 -0
  731. orthonym-1.0.0/tests/unit/assembly/test_naming_utils.py +682 -0
  732. orthonym-1.0.0/tests/unit/assembly/test_needs_parens_consolidation.py +42 -0
  733. orthonym-1.0.0/tests/unit/assembly/test_nested_memo.py +137 -0
  734. orthonym-1.0.0/tests/unit/assembly/test_nitrogen_ylidene.py +65 -0
  735. orthonym-1.0.0/tests/unit/assembly/test_nitroso_substituent.py +65 -0
  736. orthonym-1.0.0/tests/unit/assembly/test_no_abstain_b34_wiring.py +188 -0
  737. orthonym-1.0.0/tests/unit/assembly/test_no_abstain_cd_checkpoint.py +81 -0
  738. orthonym-1.0.0/tests/unit/assembly/test_offer_pool.py +80 -0
  739. orthonym-1.0.0/tests/unit/assembly/test_oracle_jar_resolution.py +53 -0
  740. orthonym-1.0.0/tests/unit/assembly/test_p14_5_alphanumerical_order.py +188 -0
  741. orthonym-1.0.0/tests/unit/assembly/test_p14_5_letters_first.py +148 -0
  742. orthonym-1.0.0/tests/unit/assembly/test_p68_4_1_chalcogen_chain_substituent.py +57 -0
  743. orthonym-1.0.0/tests/unit/assembly/test_pcg_counting.py +259 -0
  744. orthonym-1.0.0/tests/unit/assembly/test_per_substring_scoring.py +177 -0
  745. orthonym-1.0.0/tests/unit/assembly/test_pg_ring_hint_wiring.py +73 -0
  746. orthonym-1.0.0/tests/unit/assembly/test_polyfunctional_substituent.py +243 -0
  747. orthonym-1.0.0/tests/unit/assembly/test_pool_best_tier1.py +554 -0
  748. orthonym-1.0.0/tests/unit/assembly/test_prefix_citation_order.py +59 -0
  749. orthonym-1.0.0/tests/unit/assembly/test_prewrapped_prefix_nesting.py +61 -0
  750. orthonym-1.0.0/tests/unit/assembly/test_primed_letter_locant_sort.py +53 -0
  751. orthonym-1.0.0/tests/unit/assembly/test_ps2_ring_parent_stereo.py +104 -0
  752. orthonym-1.0.0/tests/unit/assembly/test_ps3_ring_substituent_stereo.py +77 -0
  753. orthonym-1.0.0/tests/unit/assembly/test_ps4_substituent_ez.py +91 -0
  754. orthonym-1.0.0/tests/unit/assembly/test_ps5_ring_ez.py +60 -0
  755. orthonym-1.0.0/tests/unit/assembly/test_pure_alkyl_flatten_guard.py +22 -0
  756. orthonym-1.0.0/tests/unit/assembly/test_purine_substituent.py +77 -0
  757. orthonym-1.0.0/tests/unit/assembly/test_q1q2_spelling_v43.py +57 -0
  758. orthonym-1.0.0/tests/unit/assembly/test_rerooted_fg_substituent.py +134 -0
  759. orthonym-1.0.0/tests/unit/assembly/test_resolvers.py +401 -0
  760. orthonym-1.0.0/tests/unit/assembly/test_retained_substitution.py +342 -0
  761. orthonym-1.0.0/tests/unit/assembly/test_ring_free_valence_class.py +300 -0
  762. orthonym-1.0.0/tests/unit/assembly/test_ring_n_carbamic_acid.py +27 -0
  763. orthonym-1.0.0/tests/unit/assembly/test_ring_parent_whole_ring_system.py +123 -0
  764. orthonym-1.0.0/tests/unit/assembly/test_ringsubst_decorated_heteroarene.py +52 -0
  765. orthonym-1.0.0/tests/unit/assembly/test_ringsubst_saturated_heterocycle.py +44 -0
  766. orthonym-1.0.0/tests/unit/assembly/test_select_best_alphanumeric.py +35 -0
  767. orthonym-1.0.0/tests/unit/assembly/test_serializer_flip_tripwire.py +127 -0
  768. orthonym-1.0.0/tests/unit/assembly/test_silyloxy.py +38 -0
  769. orthonym-1.0.0/tests/unit/assembly/test_spiro_principal_suffix.py +34 -0
  770. orthonym-1.0.0/tests/unit/assembly/test_stereo_detection.py +86 -0
  771. orthonym-1.0.0/tests/unit/assembly/test_substituent_attach_locant.py +240 -0
  772. orthonym-1.0.0/tests/unit/assembly/test_substituent_chain_stereo.py +215 -0
  773. orthonym-1.0.0/tests/unit/assembly/test_substituent_enumerator_tier_05.py +275 -0
  774. orthonym-1.0.0/tests/unit/assembly/test_substituent_memo_key.py +89 -0
  775. orthonym-1.0.0/tests/unit/assembly/test_substituent_memo_key_equal.py +131 -0
  776. orthonym-1.0.0/tests/unit/assembly/test_substituent_naming_polyene.py +26 -0
  777. orthonym-1.0.0/tests/unit/assembly/test_substituent_order.py +80 -0
  778. orthonym-1.0.0/tests/unit/assembly/test_substituent_prefix_forms.py +1025 -0
  779. orthonym-1.0.0/tests/unit/assembly/test_substituent_stereo.py +148 -0
  780. orthonym-1.0.0/tests/unit/assembly/test_sulfonyl_acyl_substituent.py +68 -0
  781. orthonym-1.0.0/tests/unit/assembly/test_t4_coverage.py +657 -0
  782. orthonym-1.0.0/tests/unit/assembly/test_t4_pin_isolation.py +50 -0
  783. orthonym-1.0.0/tests/unit/assembly/test_thiourea_bridging_and_parent.py +408 -0
  784. orthonym-1.0.0/tests/unit/assembly/test_universal_halogen_leaf.py +106 -0
  785. orthonym-1.0.0/tests/unit/assembly/test_universal_skeleton_allowlist.py +218 -0
  786. orthonym-1.0.0/tests/unit/assembly/test_universal_spiro_fused_leaf.py +279 -0
  787. orthonym-1.0.0/tests/unit/assembly/test_universal_spiro_leaf.py +146 -0
  788. orthonym-1.0.0/tests/unit/assembly/test_universal_substituent.py +1091 -0
  789. orthonym-1.0.0/tests/unit/assembly/test_universal_substituent_hetero_ring.py +149 -0
  790. orthonym-1.0.0/tests/unit/assembly/test_unsaturation_infix.py +162 -0
  791. orthonym-1.0.0/tests/unit/assembly/test_v26_bp3_c2_chalcogen_arm_recursion.py +108 -0
  792. orthonym-1.0.0/tests/unit/assembly/test_v26_p1_monocycle_engine.py +323 -0
  793. orthonym-1.0.0/tests/unit/assembly/test_v26_p4_multifragment.py +366 -0
  794. orthonym-1.0.0/tests/unit/assembly/test_v26_p5_charged_general.py +371 -0
  795. orthonym-1.0.0/tests/unit/assembly/test_v26_p6_retained_preference.py +441 -0
  796. orthonym-1.0.0/tests/unit/assembly/test_v26_p7_stereo_failclosed.py +265 -0
  797. orthonym-1.0.0/tests/unit/assembly/test_v27_p5_fusion.py +75 -0
  798. orthonym-1.0.0/tests/unit/assembly/test_v27_ring_linker_suffix.py +213 -0
  799. orthonym-1.0.0/tests/unit/assembly/test_v29_p3close_substituted_multiplier.py +650 -0
  800. orthonym-1.0.0/tests/unit/assembly/test_v29_p3final_multiplied_arity.py +97 -0
  801. orthonym-1.0.0/tests/unit/assembly/test_v29_p3fix_multiplied_italic_prefix.py +139 -0
  802. orthonym-1.0.0/tests/unit/assembly/test_v29_p3fix_stem_initial_numeral.py +118 -0
  803. orthonym-1.0.0/tests/unit/assembly/test_v29_p7_inline_suffix_locant.py +127 -0
  804. orthonym-1.0.0/tests/unit/assembly/test_v29_t3_carbamate_enclosing_marks.py +82 -0
  805. orthonym-1.0.0/tests/unit/assembly/test_v29_t3_r_group_caller_refusals.py +248 -0
  806. orthonym-1.0.0/tests/unit/assembly/test_verify_or_none_best_effort_wiring.py +157 -0
  807. orthonym-1.0.0/tests/unit/assembly/test_w2e_p1fc_bis_disambiguation.py +61 -0
  808. orthonym-1.0.0/tests/unit/assembly/test_w2e_p1fc_complex_substitution.py +19 -0
  809. orthonym-1.0.0/tests/unit/assembly/test_w2e_p1fc_concatenated_complex.py +22 -0
  810. orthonym-1.0.0/tests/unit/assembly/test_w2e_p1fc_concatenation.py +20 -0
  811. orthonym-1.0.0/tests/unit/assembly/test_w2e_p1fc_mixed_prefixes.py +29 -0
  812. orthonym-1.0.0/tests/unit/assembly/test_w2f_p1_amino_branch.py +262 -0
  813. orthonym-1.0.0/tests/unit/assembly/test_w2f_p3_branched_substituent.py +82 -0
  814. orthonym-1.0.0/tests/unit/assembly/test_w2f_p4_nitrile_oxide.py +109 -0
  815. orthonym-1.0.0/tests/unit/assembly/test_w2f_p6_carbamimidate.py +53 -0
  816. orthonym-1.0.0/tests/unit/assembly/test_w2f_p6_urea_prefix.py +45 -0
  817. orthonym-1.0.0/tests/unit/assembly/test_ylidene_consumers.py +101 -0
  818. orthonym-1.0.0/tests/unit/conformance/__init__.py +0 -0
  819. orthonym-1.0.0/tests/unit/conformance/test_v52_phase01_spelling.py +276 -0
  820. orthonym-1.0.0/tests/unit/data/__init__.py +0 -0
  821. orthonym-1.0.0/tests/unit/data/_post_148_2_baseline.json +156 -0
  822. orthonym-1.0.0/tests/unit/data/fused_heterocycle_expected_canon.json +162 -0
  823. orthonym-1.0.0/tests/unit/data/smiles_name_inchikey_sweep.py +244 -0
  824. orthonym-1.0.0/tests/unit/data/test_catalog_byte_identical.py +267 -0
  825. orthonym-1.0.0/tests/unit/data/test_chain_names.py +479 -0
  826. orthonym-1.0.0/tests/unit/data/test_chalcone_retained_pin.py +182 -0
  827. orthonym-1.0.0/tests/unit/data/test_consistency.py +116 -0
  828. orthonym-1.0.0/tests/unit/data/test_data_table_phase94.py +417 -0
  829. orthonym-1.0.0/tests/unit/data/test_fused_core_memo.py +133 -0
  830. orthonym-1.0.0/tests/unit/data/test_fused_het_data_integrity.py +83 -0
  831. orthonym-1.0.0/tests/unit/data/test_fused_het_prefix_stems.py +280 -0
  832. orthonym-1.0.0/tests/unit/data/test_fused_heterocycles.py +1456 -0
  833. orthonym-1.0.0/tests/unit/data/test_fused_heterocycles_indicated_h.py +116 -0
  834. orthonym-1.0.0/tests/unit/data/test_fusion_components_p25.py +99 -0
  835. orthonym-1.0.0/tests/unit/data/test_geometry_asserting_retained_names.py +145 -0
  836. orthonym-1.0.0/tests/unit/data/test_hw_six_ring_least_senior_stem.py +124 -0
  837. orthonym-1.0.0/tests/unit/data/test_hyg01_ring_bucket_equivalence.py +198 -0
  838. orthonym-1.0.0/tests/unit/data/test_ion_retained_names.py +249 -0
  839. orthonym-1.0.0/tests/unit/data/test_natural_products_data.py +213 -0
  840. orthonym-1.0.0/tests/unit/data/test_np_keying_invariant.py +63 -0
  841. orthonym-1.0.0/tests/unit/data/test_opsin_import_pin_evidence.py +78 -0
  842. orthonym-1.0.0/tests/unit/data/test_opsin_imports.py +460 -0
  843. orthonym-1.0.0/tests/unit/data/test_opsin_merge_layer.py +173 -0
  844. orthonym-1.0.0/tests/unit/data/test_pin_deny_amino_and_trivial.py +391 -0
  845. orthonym-1.0.0/tests/unit/data/test_pin_deny_caprolactam.py +122 -0
  846. orthonym-1.0.0/tests/unit/data/test_polycyclic_data.py +514 -0
  847. orthonym-1.0.0/tests/unit/data/test_retained_name_classifier.py +399 -0
  848. orthonym-1.0.0/tests/unit/data/test_retained_names.py +228 -0
  849. orthonym-1.0.0/tests/unit/data/test_retained_names_pin_cleanup.py +297 -0
  850. orthonym-1.0.0/tests/unit/data/test_retained_names_size_gate.py +45 -0
  851. orthonym-1.0.0/tests/unit/data/test_ring_expansion_entries.py +319 -0
  852. orthonym-1.0.0/tests/unit/data/test_smiles_dict_canonical_lint.py +189 -0
  853. orthonym-1.0.0/tests/unit/data/test_smiles_name_consistency.py +235 -0
  854. orthonym-1.0.0/tests/unit/data/test_sugar_c_sub_memo.py +24 -0
  855. orthonym-1.0.0/tests/unit/data/test_sugar_skeleton.py +350 -0
  856. orthonym-1.0.0/tests/unit/data/test_triviality_controller_seed.py +158 -0
  857. orthonym-1.0.0/tests/unit/data/test_v29_p3reg_amino_acid_L_descriptor.py +205 -0
  858. orthonym-1.0.0/tests/unit/data/test_v42_p11a_retained_pins.py +121 -0
  859. orthonym-1.0.0/tests/unit/data/test_v42_p11b2_fusdata.py +114 -0
  860. orthonym-1.0.0/tests/unit/data/test_v42_p9_fusdata.py +169 -0
  861. orthonym-1.0.0/tests/unit/data/test_xanthine_derivatives.py +263 -0
  862. orthonym-1.0.0/tests/unit/decomposition/__init__.py +0 -0
  863. orthonym-1.0.0/tests/unit/decomposition/test_amide_glue_grammar.py +66 -0
  864. orthonym-1.0.0/tests/unit/decomposition/test_coverage_oracle_rescue.py +222 -0
  865. orthonym-1.0.0/tests/unit/decomposition/test_floating_nacyl_ambiguity.py +58 -0
  866. orthonym-1.0.0/tests/unit/decomposition/test_multi_bond.py +1409 -0
  867. orthonym-1.0.0/tests/unit/decomposition/test_no_partial_assembly.py +400 -0
  868. orthonym-1.0.0/tests/unit/decomposition/test_quality_gate.py +755 -0
  869. orthonym-1.0.0/tests/unit/decomposition/test_quality_gate_shadowing.py +149 -0
  870. orthonym-1.0.0/tests/unit/decomposition/test_weaver_composition.py +118 -0
  871. orthonym-1.0.0/tests/unit/diagnostics/test_crash_traceback.py +34 -0
  872. orthonym-1.0.0/tests/unit/diagnostics/test_strict_mode.py +43 -0
  873. orthonym-1.0.0/tests/unit/eval/test_audit_atom_drop_precision.py +170 -0
  874. orthonym-1.0.0/tests/unit/eval/test_check_goals.py +77 -0
  875. orthonym-1.0.0/tests/unit/metrics/__init__.py +0 -0
  876. orthonym-1.0.0/tests/unit/metrics/test_abstention_codes.py +253 -0
  877. orthonym-1.0.0/tests/unit/metrics/test_breadth.py +864 -0
  878. orthonym-1.0.0/tests/unit/metrics/test_candidate_ledger.py +262 -0
  879. orthonym-1.0.0/tests/unit/metrics/test_coverage_metrics.py +200 -0
  880. orthonym-1.0.0/tests/unit/metrics/test_parse_suppressed_candidates.py +96 -0
  881. orthonym-1.0.0/tests/unit/metrics/test_provenance.py +59 -0
  882. orthonym-1.0.0/tests/unit/namer/__init__.py +0 -0
  883. orthonym-1.0.0/tests/unit/namer/test_build_ring_info_dispatch.py +286 -0
  884. orthonym-1.0.0/tests/unit/namer/test_bypass_deleted.py +25 -0
  885. orthonym-1.0.0/tests/unit/namer/test_classify_cyclic_refactor.py +92 -0
  886. orthonym-1.0.0/tests/unit/namer/test_fused_parent_selection.py +278 -0
  887. orthonym-1.0.0/tests/unit/namer/test_gate_stereo_carveout_self01.py +372 -0
  888. orthonym-1.0.0/tests/unit/namer/test_lone_pair_configuration.py +213 -0
  889. orthonym-1.0.0/tests/unit/namer/test_lone_pair_first_written.py +182 -0
  890. orthonym-1.0.0/tests/unit/namer/test_name_ctx_isolation.py +101 -0
  891. orthonym-1.0.0/tests/unit/namer/test_reduced_mode_labels.py +76 -0
  892. orthonym-1.0.0/tests/unit/namer/test_self_consistency_gate.py +224 -0
  893. orthonym-1.0.0/tests/unit/namer/test_trivial_fallback_is_live.py +132 -0
  894. orthonym-1.0.0/tests/unit/namer/test_v29_p3close_stereo_backstop_falsepos.py +374 -0
  895. orthonym-1.0.0/tests/unit/perception/__init__.py +0 -0
  896. orthonym-1.0.0/tests/unit/perception/test_acid_carbon_constraint.py +39 -0
  897. orthonym-1.0.0/tests/unit/perception/test_alcohol_detection.py +65 -0
  898. orthonym-1.0.0/tests/unit/perception/test_amine_detection.py +49 -0
  899. orthonym-1.0.0/tests/unit/perception/test_axial_pin_descriptor.py +123 -0
  900. orthonym-1.0.0/tests/unit/perception/test_bridgehead_amine_n_stereo.py +68 -0
  901. orthonym-1.0.0/tests/unit/perception/test_chain_scoring.py +479 -0
  902. orthonym-1.0.0/tests/unit/perception/test_exocyclic_ylidene_stereo.py +60 -0
  903. orthonym-1.0.0/tests/unit/perception/test_fg_prefilter.py +53 -0
  904. orthonym-1.0.0/tests/unit/perception/test_fg_structure_cache.py +56 -0
  905. orthonym-1.0.0/tests/unit/perception/test_functional_groups_charged.py +63 -0
  906. orthonym-1.0.0/tests/unit/perception/test_functional_groups_frn.py +293 -0
  907. orthonym-1.0.0/tests/unit/perception/test_functional_groups_missing_classes.py +100 -0
  908. orthonym-1.0.0/tests/unit/perception/test_input_stereo_undefined.py +44 -0
  909. orthonym-1.0.0/tests/unit/perception/test_ions.py +300 -0
  910. orthonym-1.0.0/tests/unit/perception/test_lipid_detect.py +71 -0
  911. orthonym-1.0.0/tests/unit/perception/test_maximal_carbon_chains.py +78 -0
  912. orthonym-1.0.0/tests/unit/perception/test_metals.py +401 -0
  913. orthonym-1.0.0/tests/unit/perception/test_molcache.py +104 -0
  914. orthonym-1.0.0/tests/unit/perception/test_molcache_keys.py +51 -0
  915. orthonym-1.0.0/tests/unit/perception/test_natural_products.py +381 -0
  916. orthonym-1.0.0/tests/unit/perception/test_nitrite_disambiguation.py +31 -0
  917. orthonym-1.0.0/tests/unit/perception/test_np_scaffold_match_determinism.py +95 -0
  918. orthonym-1.0.0/tests/unit/perception/test_perception_gold_targets.py +64 -0
  919. orthonym-1.0.0/tests/unit/perception/test_ring_boundary.py +137 -0
  920. orthonym-1.0.0/tests/unit/perception/test_ring_classification.py +121 -0
  921. orthonym-1.0.0/tests/unit/perception/test_ring_merge_determinism.py +44 -0
  922. orthonym-1.0.0/tests/unit/perception/test_ring_substituent_detection.py +320 -0
  923. orthonym-1.0.0/tests/unit/perception/test_semipolar_internal_charge.py +230 -0
  924. orthonym-1.0.0/tests/unit/perception/test_smarts_cache.py +10 -0
  925. orthonym-1.0.0/tests/unit/perception/test_steroid_stereo_parity.py +96 -0
  926. orthonym-1.0.0/tests/unit/perception/test_structure_conservation.py +296 -0
  927. orthonym-1.0.0/tests/unit/perception/test_v29_r1_ketone_chain_pcg.py +188 -0
  928. orthonym-1.0.0/tests/unit/perception/test_v38_p2_chain_score_memo.py +150 -0
  929. orthonym-1.0.0/tests/unit/perception/test_w2f_p6_carbamimidate_perception.py +34 -0
  930. orthonym-1.0.0/tests/unit/perception/test_w2f_p7_lambda_perception.py +51 -0
  931. orthonym-1.0.0/tests/unit/routing/__init__.py +0 -0
  932. orthonym-1.0.0/tests/unit/routing/test_dispatch_table.py +378 -0
  933. orthonym-1.0.0/tests/unit/routing/test_dispatcher.py +343 -0
  934. orthonym-1.0.0/tests/unit/routing/test_orgm_dispatch.py +214 -0
  935. orthonym-1.0.0/tests/unit/rules/__init__.py +0 -0
  936. orthonym-1.0.0/tests/unit/rules/_macrocycle_smiles.json +7 -0
  937. orthonym-1.0.0/tests/unit/rules/fusion_engine_helpers.py +55 -0
  938. orthonym-1.0.0/tests/unit/rules/test_a2_stereo_primed_locant_v36.py +176 -0
  939. orthonym-1.0.0/tests/unit/rules/test_a4_multiplicative_v50.py +119 -0
  940. orthonym-1.0.0/tests/unit/rules/test_acetaldehyde_substitutable_parent.py +58 -0
  941. orthonym-1.0.0/tests/unit/rules/test_acid_ester_anion.py +170 -0
  942. orthonym-1.0.0/tests/unit/rules/test_acyclic_last_resort_fragments.py +137 -0
  943. orthonym-1.0.0/tests/unit/rules/test_acyl_taurine.py +104 -0
  944. orthonym-1.0.0/tests/unit/rules/test_acylamino_substituent.py +73 -0
  945. orthonym-1.0.0/tests/unit/rules/test_acylhydrazone.py +79 -0
  946. orthonym-1.0.0/tests/unit/rules/test_added_carbon_substituent.py +169 -0
  947. orthonym-1.0.0/tests/unit/rules/test_adducts.py +292 -0
  948. orthonym-1.0.0/tests/unit/rules/test_adducts_single_atom_v43.py +71 -0
  949. orthonym-1.0.0/tests/unit/rules/test_adducts_t4_tier.py +27 -0
  950. orthonym-1.0.0/tests/unit/rules/test_alkaloid_decoration.py +187 -0
  951. orthonym-1.0.0/tests/unit/rules/test_alkenyl_ol_substituent.py +220 -0
  952. orthonym-1.0.0/tests/unit/rules/test_alkenyl_prefix.py +169 -0
  953. orthonym-1.0.0/tests/unit/rules/test_alkoxy_substituent_general.py +48 -0
  954. orthonym-1.0.0/tests/unit/rules/test_alkoxycarbonyl_prefix.py +133 -0
  955. orthonym-1.0.0/tests/unit/rules/test_allene_cip_priority.py +260 -0
  956. orthonym-1.0.0/tests/unit/rules/test_amide_amino_prefix_marks.py +30 -0
  957. orthonym-1.0.0/tests/unit/rules/test_amide_merged_prefix_p16_3_3.py +164 -0
  958. orthonym-1.0.0/tests/unit/rules/test_amide_prefix_forms.py +316 -0
  959. orthonym-1.0.0/tests/unit/rules/test_amidine_c2.py +98 -0
  960. orthonym-1.0.0/tests/unit/rules/test_amine_prefix_merge_p14_5.py +84 -0
  961. orthonym-1.0.0/tests/unit/rules/test_amine_smarts_fix.py +55 -0
  962. orthonym-1.0.0/tests/unit/rules/test_aminium_polyacid.py +228 -0
  963. orthonym-1.0.0/tests/unit/rules/test_amino_acid_backbone_invariant.py +120 -0
  964. orthonym-1.0.0/tests/unit/rules/test_amino_acid_derivatives.py +170 -0
  965. orthonym-1.0.0/tests/unit/rules/test_amino_acid_diacid.py +77 -0
  966. orthonym-1.0.0/tests/unit/rules/test_amino_acid_stereo.py +128 -0
  967. orthonym-1.0.0/tests/unit/rules/test_amino_acids_stereo_honesty.py +23 -0
  968. orthonym-1.0.0/tests/unit/rules/test_among_rings_gold.py +119 -0
  969. orthonym-1.0.0/tests/unit/rules/test_anhydride_substituents.py +34 -0
  970. orthonym-1.0.0/tests/unit/rules/test_anilino_preferred_prefix.py +570 -0
  971. orthonym-1.0.0/tests/unit/rules/test_anion_ide_uide_v52.py +165 -0
  972. orthonym-1.0.0/tests/unit/rules/test_aromatic_not_mancude.py +233 -0
  973. orthonym-1.0.0/tests/unit/rules/test_aromatic_sulfonyl_pin.py +39 -0
  974. orthonym-1.0.0/tests/unit/rules/test_axial_chirality.py +505 -0
  975. orthonym-1.0.0/tests/unit/rules/test_bare_oxy_comprehensive.py +179 -0
  976. orthonym-1.0.0/tests/unit/rules/test_bb_loss_thiodicarbonate.py +93 -0
  977. orthonym-1.0.0/tests/unit/rules/test_benzene_functionalized_chain.py +286 -0
  978. orthonym-1.0.0/tests/unit/rules/test_benzene_handler_accuracy.py +96 -0
  979. orthonym-1.0.0/tests/unit/rules/test_benzene_suffix_fg.py +196 -0
  980. orthonym-1.0.0/tests/unit/rules/test_benzene_suffix_forms.py +142 -0
  981. orthonym-1.0.0/tests/unit/rules/test_benzo_annulene.py +82 -0
  982. orthonym-1.0.0/tests/unit/rules/test_bicyclo.py +657 -0
  983. orthonym-1.0.0/tests/unit/rules/test_bicyclo_complete.py +481 -0
  984. orthonym-1.0.0/tests/unit/rules/test_bicyclo_complex_substituent.py +199 -0
  985. orthonym-1.0.0/tests/unit/rules/test_bicyclo_fused_routing.py +279 -0
  986. orthonym-1.0.0/tests/unit/rules/test_bicyclo_pendant_ring.py +160 -0
  987. orthonym-1.0.0/tests/unit/rules/test_bis_linker_multiplication_8d.py +160 -0
  988. orthonym-1.0.0/tests/unit/rules/test_bis_quaternary_aminium_pin.py +67 -0
  989. orthonym-1.0.0/tests/unit/rules/test_bis_suffix_multiplication_8c.py +101 -0
  990. orthonym-1.0.0/tests/unit/rules/test_bond_cleavage.py +377 -0
  991. orthonym-1.0.0/tests/unit/rules/test_boron_fused_heterocycles.py +131 -0
  992. orthonym-1.0.0/tests/unit/rules/test_breadth_restore_acyloxy_floor.py +198 -0
  993. orthonym-1.0.0/tests/unit/rules/test_bridged_fused.py +302 -0
  994. orthonym-1.0.0/tests/unit/rules/test_bugb_guard.py +224 -0
  995. orthonym-1.0.0/tests/unit/rules/test_build_ring_pos_homogeneity.py +162 -0
  996. orthonym-1.0.0/tests/unit/rules/test_c1c2c6_ring_topology_v36.py +287 -0
  997. orthonym-1.0.0/tests/unit/rules/test_c3_substituent_assembly_v36.py +322 -0
  998. orthonym-1.0.0/tests/unit/rules/test_c4_aromatic_amines.py +167 -0
  999. orthonym-1.0.0/tests/unit/rules/test_c4_ring_assembly_v36.py +193 -0
  1000. orthonym-1.0.0/tests/unit/rules/test_c5_wave_a_v36.py +202 -0
  1001. orthonym-1.0.0/tests/unit/rules/test_c6_spiro_ketals_v36.py +100 -0
  1002. orthonym-1.0.0/tests/unit/rules/test_c_waveB_v36.py +250 -0
  1003. orthonym-1.0.0/tests/unit/rules/test_c_waveC_v36.py +220 -0
  1004. orthonym-1.0.0/tests/unit/rules/test_c_waveE_v36.py +226 -0
  1005. orthonym-1.0.0/tests/unit/rules/test_c_waveF_v36.py +167 -0
  1006. orthonym-1.0.0/tests/unit/rules/test_carbamic_acids.py +89 -0
  1007. orthonym-1.0.0/tests/unit/rules/test_carbanion_ide.py +147 -0
  1008. orthonym-1.0.0/tests/unit/rules/test_carbohydrate_tail.py +92 -0
  1009. orthonym-1.0.0/tests/unit/rules/test_carotene_parents.py +75 -0
  1010. orthonym-1.0.0/tests/unit/rules/test_catalog_fr23_agreement.py +193 -0
  1011. orthonym-1.0.0/tests/unit/rules/test_catenated_cations_v52.py +222 -0
  1012. orthonym-1.0.0/tests/unit/rules/test_cation_charge_preservation.py +24 -0
  1013. orthonym-1.0.0/tests/unit/rules/test_cephem_vonbaeyer.py +146 -0
  1014. orthonym-1.0.0/tests/unit/rules/test_chain_ring_bugs.py +154 -0
  1015. orthonym-1.0.0/tests/unit/rules/test_chain_tiebreakers.py +161 -0
  1016. orthonym-1.0.0/tests/unit/rules/test_chalcogen_acids.py +69 -0
  1017. orthonym-1.0.0/tests/unit/rules/test_charge_first_pcg.py +114 -0
  1018. orthonym-1.0.0/tests/unit/rules/test_charge_form_names.py +68 -0
  1019. orthonym-1.0.0/tests/unit/rules/test_charge_producer_fixes.py +260 -0
  1020. orthonym-1.0.0/tests/unit/rules/test_charged_carboxylate_breadth.py +46 -0
  1021. orthonym-1.0.0/tests/unit/rules/test_charged_completion.py +332 -0
  1022. orthonym-1.0.0/tests/unit/rules/test_charged_ester_anion_slice_a.py +121 -0
  1023. orthonym-1.0.0/tests/unit/rules/test_charged_fg_v36.py +174 -0
  1024. orthonym-1.0.0/tests/unit/rules/test_charged_multicentre.py +261 -0
  1025. orthonym-1.0.0/tests/unit/rules/test_charged_router.py +248 -0
  1026. orthonym-1.0.0/tests/unit/rules/test_charged_species_breadth.py +83 -0
  1027. orthonym-1.0.0/tests/unit/rules/test_charged_species_v52.py +117 -0
  1028. orthonym-1.0.0/tests/unit/rules/test_charged_spiro.py +171 -0
  1029. orthonym-1.0.0/tests/unit/rules/test_charged_suffixes_ft6.py +277 -0
  1030. orthonym-1.0.0/tests/unit/rules/test_chebi_losses.py +665 -0
  1031. orthonym-1.0.0/tests/unit/rules/test_cip_limitations.py +231 -0
  1032. orthonym-1.0.0/tests/unit/rules/test_cluster_d_pin_backlog.py +93 -0
  1033. orthonym-1.0.0/tests/unit/rules/test_collision_audit.py +336 -0
  1034. orthonym-1.0.0/tests/unit/rules/test_compare_locant_sets_tuple.py +222 -0
  1035. orthonym-1.0.0/tests/unit/rules/test_complex_fusion_descriptors.py +412 -0
  1036. orthonym-1.0.0/tests/unit/rules/test_complex_ring_handler_accuracy.py +246 -0
  1037. orthonym-1.0.0/tests/unit/rules/test_component_identification.py +340 -0
  1038. orthonym-1.0.0/tests/unit/rules/test_composer2_chain_rooted_decorated_ring.py +65 -0
  1039. orthonym-1.0.0/tests/unit/rules/test_composer_dispatch_invariants.py +112 -0
  1040. orthonym-1.0.0/tests/unit/rules/test_composite_acyl_enclosure.py +61 -0
  1041. orthonym-1.0.0/tests/unit/rules/test_composite_oxy_enclosure.py +62 -0
  1042. orthonym-1.0.0/tests/unit/rules/test_compound_class_routing.py +234 -0
  1043. orthonym-1.0.0/tests/unit/rules/test_compound_prefix_generators.py +257 -0
  1044. orthonym-1.0.0/tests/unit/rules/test_conjugate_controller.py +257 -0
  1045. orthonym-1.0.0/tests/unit/rules/test_core_namer_substituent_v36.py +245 -0
  1046. orthonym-1.0.0/tests/unit/rules/test_coverage_gating_expansion.py +221 -0
  1047. orthonym-1.0.0/tests/unit/rules/test_coverage_scoring.py +415 -0
  1048. orthonym-1.0.0/tests/unit/rules/test_ct2_hw_partial_saturation.py +101 -0
  1049. orthonym-1.0.0/tests/unit/rules/test_ct4_ncomponent_fusion.py +127 -0
  1050. orthonym-1.0.0/tests/unit/rules/test_cyclic_imides.py +198 -0
  1051. orthonym-1.0.0/tests/unit/rules/test_cycloalkane_cip_tiebreak.py +26 -0
  1052. orthonym-1.0.0/tests/unit/rules/test_cycloalkane_suffix_locant.py +119 -0
  1053. orthonym-1.0.0/tests/unit/rules/test_cycloalkene_locant.py +36 -0
  1054. orthonym-1.0.0/tests/unit/rules/test_d1_coordination_v36.py +374 -0
  1055. orthonym-1.0.0/tests/unit/rules/test_decision_a_n_substituted_amino_acids.py +461 -0
  1056. orthonym-1.0.0/tests/unit/rules/test_decomposition_engine.py +857 -0
  1057. orthonym-1.0.0/tests/unit/rules/test_decorated_ring_substituent.py +158 -0
  1058. orthonym-1.0.0/tests/unit/rules/test_diacylamide_seniority.py +54 -0
  1059. orthonym-1.0.0/tests/unit/rules/test_dibenzo_hydro.py +126 -0
  1060. orthonym-1.0.0/tests/unit/rules/test_dihydro_heterocycle_suffix.py +163 -0
  1061. orthonym-1.0.0/tests/unit/rules/test_disaccharide.py +560 -0
  1062. orthonym-1.0.0/tests/unit/rules/test_dispiro_return_arc_numbering.py +109 -0
  1063. orthonym-1.0.0/tests/unit/rules/test_disulfide_attachment.py +127 -0
  1064. orthonym-1.0.0/tests/unit/rules/test_dithioic_acid_enclosure.py +56 -0
  1065. orthonym-1.0.0/tests/unit/rules/test_dl_suppression.py +89 -0
  1066. orthonym-1.0.0/tests/unit/rules/test_edta.py +95 -0
  1067. orthonym-1.0.0/tests/unit/rules/test_errata_assembly.py +162 -0
  1068. orthonym-1.0.0/tests/unit/rules/test_errata_data_logic.py +373 -0
  1069. orthonym-1.0.0/tests/unit/rules/test_ester_alkyl_stereo.py +160 -0
  1070. orthonym-1.0.0/tests/unit/rules/test_ester_anion_zwitterion.py +57 -0
  1071. orthonym-1.0.0/tests/unit/rules/test_ester_orientation.py +87 -0
  1072. orthonym-1.0.0/tests/unit/rules/test_ester_ring_acid_substituents.py +78 -0
  1073. orthonym-1.0.0/tests/unit/rules/test_ether_format.py +109 -0
  1074. orthonym-1.0.0/tests/unit/rules/test_fb_arenesulfonamide_merge.py +212 -0
  1075. orthonym-1.0.0/tests/unit/rules/test_ff_locant_fix.py +120 -0
  1076. orthonym-1.0.0/tests/unit/rules/test_fg_perception_new.py +202 -0
  1077. orthonym-1.0.0/tests/unit/rules/test_fg_prefix_forms.py +149 -0
  1078. orthonym-1.0.0/tests/unit/rules/test_format_validator.py +218 -0
  1079. orthonym-1.0.0/tests/unit/rules/test_fragment_assembly.py +816 -0
  1080. orthonym-1.0.0/tests/unit/rules/test_fragment_capping.py +270 -0
  1081. orthonym-1.0.0/tests/unit/rules/test_fragment_depth_cache.py +515 -0
  1082. orthonym-1.0.0/tests/unit/rules/test_fragment_ranker.py +155 -0
  1083. orthonym-1.0.0/tests/unit/rules/test_fused_acyl_ester_substituent.py +96 -0
  1084. orthonym-1.0.0/tests/unit/rules/test_fused_heterocycle_expansion.py +256 -0
  1085. orthonym-1.0.0/tests/unit/rules/test_fused_heterocycle_locants.py +472 -0
  1086. orthonym-1.0.0/tests/unit/rules/test_fused_hydroxy_seniority.py +85 -0
  1087. orthonym-1.0.0/tests/unit/rules/test_fused_parent_component_seniority.py +123 -0
  1088. orthonym-1.0.0/tests/unit/rules/test_fused_ring_selection.py +1057 -0
  1089. orthonym-1.0.0/tests/unit/rules/test_fused_ring_substituent_routing.py +141 -0
  1090. orthonym-1.0.0/tests/unit/rules/test_fused_rings.py +1150 -0
  1091. orthonym-1.0.0/tests/unit/rules/test_fused_substituent_completeness.py +44 -0
  1092. orthonym-1.0.0/tests/unit/rules/test_fusion_abstain_recovery.py +31 -0
  1093. orthonym-1.0.0/tests/unit/rules/test_fusion_descriptor_determinism.py +29 -0
  1094. orthonym-1.0.0/tests/unit/rules/test_fusion_descriptor_hyphen.py +29 -0
  1095. orthonym-1.0.0/tests/unit/rules/test_fusion_descriptors.py +833 -0
  1096. orthonym-1.0.0/tests/unit/rules/test_fusion_iupac_numbering.py +188 -0
  1097. orthonym-1.0.0/tests/unit/rules/test_fusion_mancude_indicated_h.py +76 -0
  1098. orthonym-1.0.0/tests/unit/rules/test_fusion_numbering.py +301 -0
  1099. orthonym-1.0.0/tests/unit/rules/test_fusion_orientation.py +171 -0
  1100. orthonym-1.0.0/tests/unit/rules/test_generic_glycosyloxy.py +79 -0
  1101. orthonym-1.0.0/tests/unit/rules/test_glucosinolate_osulfate.py +127 -0
  1102. orthonym-1.0.0/tests/unit/rules/test_glycoside_parent_preference.py +81 -0
  1103. orthonym-1.0.0/tests/unit/rules/test_group12_organometallic_ligands.py +82 -0
  1104. orthonym-1.0.0/tests/unit/rules/test_group13_no_pin_status.py +31 -0
  1105. orthonym-1.0.0/tests/unit/rules/test_group_splitting.py +150 -0
  1106. orthonym-1.0.0/tests/unit/rules/test_guard2_stereo_aware.py +49 -0
  1107. orthonym-1.0.0/tests/unit/rules/test_handler_coverage.py +78 -0
  1108. orthonym-1.0.0/tests/unit/rules/test_handler_enrichment.py +207 -0
  1109. orthonym-1.0.0/tests/unit/rules/test_handler_stereo_injection.py +937 -0
  1110. orthonym-1.0.0/tests/unit/rules/test_heptacene.py +152 -0
  1111. orthonym-1.0.0/tests/unit/rules/test_heteroaromatic_compound_substituent.py +52 -0
  1112. orthonym-1.0.0/tests/unit/rules/test_heteroaryl_sulfinyl_substituent.py +58 -0
  1113. orthonym-1.0.0/tests/unit/rules/test_heteroatom_substituent_prefix.py +41 -0
  1114. orthonym-1.0.0/tests/unit/rules/test_heterocycle_handler_accuracy.py +148 -0
  1115. orthonym-1.0.0/tests/unit/rules/test_heterocycle_multiplied_prefix_collapse.py +229 -0
  1116. orthonym-1.0.0/tests/unit/rules/test_heterocycle_substituents.py +85 -0
  1117. orthonym-1.0.0/tests/unit/rules/test_heterol_suffix.py +71 -0
  1118. orthonym-1.0.0/tests/unit/rules/test_hw_locant_citation_order.py +104 -0
  1119. orthonym-1.0.0/tests/unit/rules/test_hw_vs_replacement_boundary.py +184 -0
  1120. orthonym-1.0.0/tests/unit/rules/test_hydrazide.py +112 -0
  1121. orthonym-1.0.0/tests/unit/rules/test_hydro_fused_substituent_locants.py +269 -0
  1122. orthonym-1.0.0/tests/unit/rules/test_hydro_indicated_h_locant_disjoint.py +180 -0
  1123. orthonym-1.0.0/tests/unit/rules/test_hydro_mancude_indicated_h.py +295 -0
  1124. orthonym-1.0.0/tests/unit/rules/test_hypervalent_iodine.py +96 -0
  1125. orthonym-1.0.0/tests/unit/rules/test_identify_parent_and_child.py +88 -0
  1126. orthonym-1.0.0/tests/unit/rules/test_indicated_hydrogen.py +286 -0
  1127. orthonym-1.0.0/tests/unit/rules/test_inorganic_anion_salts.py +61 -0
  1128. orthonym-1.0.0/tests/unit/rules/test_ions.py +827 -0
  1129. orthonym-1.0.0/tests/unit/rules/test_is_cyclic_removal.py +140 -0
  1130. orthonym-1.0.0/tests/unit/rules/test_isotope_distinct_multi_locant.py +70 -0
  1131. orthonym-1.0.0/tests/unit/rules/test_isotope_reclaim.py +106 -0
  1132. orthonym-1.0.0/tests/unit/rules/test_isotopes.py +576 -0
  1133. orthonym-1.0.0/tests/unit/rules/test_isotopes_p82_v52.py +841 -0
  1134. orthonym-1.0.0/tests/unit/rules/test_isotopes_v36.py +137 -0
  1135. orthonym-1.0.0/tests/unit/rules/test_iupac_errata_157.py +900 -0
  1136. orthonym-1.0.0/tests/unit/rules/test_j12_verify_fixes.py +305 -0
  1137. orthonym-1.0.0/tests/unit/rules/test_j5_pin_labels_b.py +102 -0
  1138. orthonym-1.0.0/tests/unit/rules/test_j6_breadth.py +319 -0
  1139. orthonym-1.0.0/tests/unit/rules/test_j7_defects_misc.py +302 -0
  1140. orthonym-1.0.0/tests/unit/rules/test_lactam_n_locant.py +190 -0
  1141. orthonym-1.0.0/tests/unit/rules/test_lactams.py +224 -0
  1142. orthonym-1.0.0/tests/unit/rules/test_lactones.py +390 -0
  1143. orthonym-1.0.0/tests/unit/rules/test_lambda5_heterone_family.py +406 -0
  1144. orthonym-1.0.0/tests/unit/rules/test_lambda_azanyl_prefix.py +81 -0
  1145. orthonym-1.0.0/tests/unit/rules/test_lambda_convention.py +123 -0
  1146. orthonym-1.0.0/tests/unit/rules/test_lambda_fused.py +42 -0
  1147. orthonym-1.0.0/tests/unit/rules/test_lambda_heteromonocycles.py +59 -0
  1148. orthonym-1.0.0/tests/unit/rules/test_lambda_hydro_heteromonocycles.py +225 -0
  1149. orthonym-1.0.0/tests/unit/rules/test_lipids.py +126 -0
  1150. orthonym-1.0.0/tests/unit/rules/test_locant_alphabetical.py +238 -0
  1151. orthonym-1.0.0/tests/unit/rules/test_locant_assignment.py +95 -0
  1152. orthonym-1.0.0/tests/unit/rules/test_locant_one_elision.py +322 -0
  1153. orthonym-1.0.0/tests/unit/rules/test_locant_str_coercion_and_perf_rescue.py +106 -0
  1154. orthonym-1.0.0/tests/unit/rules/test_locant_validation.py +324 -0
  1155. orthonym-1.0.0/tests/unit/rules/test_locants.py +505 -0
  1156. orthonym-1.0.0/tests/unit/rules/test_locants_stereo_tiebreak.py +131 -0
  1157. orthonym-1.0.0/tests/unit/rules/test_m25_workbudget.py +155 -0
  1158. orthonym-1.0.0/tests/unit/rules/test_m41_vonbaeyer_gold_stable.py +127 -0
  1159. orthonym-1.0.0/tests/unit/rules/test_m6_fused_catalog.py +205 -0
  1160. orthonym-1.0.0/tests/unit/rules/test_macrocycle_naming.py +141 -0
  1161. orthonym-1.0.0/tests/unit/rules/test_main_ring_memo.py +52 -0
  1162. orthonym-1.0.0/tests/unit/rules/test_mancude_tautomer_assembly.py +163 -0
  1163. orthonym-1.0.0/tests/unit/rules/test_masked_spiro.py +121 -0
  1164. orthonym-1.0.0/tests/unit/rules/test_metal_adducts_best_effort.py +159 -0
  1165. orthonym-1.0.0/tests/unit/rules/test_methylidene_guard.py +156 -0
  1166. orthonym-1.0.0/tests/unit/rules/test_mixed_spiro_fused.py +679 -0
  1167. orthonym-1.0.0/tests/unit/rules/test_mononuclear_hydrides.py +173 -0
  1168. orthonym-1.0.0/tests/unit/rules/test_multi_anion.py +215 -0
  1169. orthonym-1.0.0/tests/unit/rules/test_multi_ring_sub.py +274 -0
  1170. orthonym-1.0.0/tests/unit/rules/test_multifragment_component_recovery.py +152 -0
  1171. orthonym-1.0.0/tests/unit/rules/test_multifragment_reclaim.py +170 -0
  1172. orthonym-1.0.0/tests/unit/rules/test_multiplicative.py +717 -0
  1173. orthonym-1.0.0/tests/unit/rules/test_n_acyl_branch_coverage.py +73 -0
  1174. orthonym-1.0.0/tests/unit/rules/test_n_aryl_amide_ring_fg.py +98 -0
  1175. orthonym-1.0.0/tests/unit/rules/test_n_cation_non_pin_labels.py +173 -0
  1176. orthonym-1.0.0/tests/unit/rules/test_n_locant_formatting.py +53 -0
  1177. orthonym-1.0.0/tests/unit/rules/test_n_oxide_locant.py +167 -0
  1178. orthonym-1.0.0/tests/unit/rules/test_n_oxyl_radicals.py +100 -0
  1179. orthonym-1.0.0/tests/unit/rules/test_n_prefix_dedup.py +165 -0
  1180. orthonym-1.0.0/tests/unit/rules/test_n_rooted_ring_amino_substituent.py +124 -0
  1181. orthonym-1.0.0/tests/unit/rules/test_n_rooted_substituent_general.py +52 -0
  1182. orthonym-1.0.0/tests/unit/rules/test_naming_cascade_quality.py +167 -0
  1183. orthonym-1.0.0/tests/unit/rules/test_natural_products_aromatic_locants.py +188 -0
  1184. orthonym-1.0.0/tests/unit/rules/test_natural_products_gap.py +230 -0
  1185. orthonym-1.0.0/tests/unit/rules/test_natural_products_naming.py +570 -0
  1186. orthonym-1.0.0/tests/unit/rules/test_natural_products_stereo_honesty.py +40 -0
  1187. orthonym-1.0.0/tests/unit/rules/test_new_fg_classes.py +214 -0
  1188. orthonym-1.0.0/tests/unit/rules/test_nitrile_oxide_prefix.py +85 -0
  1189. orthonym-1.0.0/tests/unit/rules/test_non_pin_class_labels.py +217 -0
  1190. orthonym-1.0.0/tests/unit/rules/test_nonreducing_oligo.py +237 -0
  1191. orthonym-1.0.0/tests/unit/rules/test_np_aromatic_detection.py +97 -0
  1192. orthonym-1.0.0/tests/unit/rules/test_np_decoration_completeness.py +61 -0
  1193. orthonym-1.0.0/tests/unit/rules/test_np_decorations.py +231 -0
  1194. orthonym-1.0.0/tests/unit/rules/test_np_modifications.py +396 -0
  1195. orthonym-1.0.0/tests/unit/rules/test_np_saturated_stereo.py +104 -0
  1196. orthonym-1.0.0/tests/unit/rules/test_np_stereoparents.py +157 -0
  1197. orthonym-1.0.0/tests/unit/rules/test_np_vonbaeyer_fallback.py +139 -0
  1198. orthonym-1.0.0/tests/unit/rules/test_nsubst_amidine_d1.py +141 -0
  1199. orthonym-1.0.0/tests/unit/rules/test_numbering_feature_ladder.py +39 -0
  1200. orthonym-1.0.0/tests/unit/rules/test_oligosaccharides_be_rt_gate.py +126 -0
  1201. orthonym-1.0.0/tests/unit/rules/test_onium_hydride_parent_v52.py +97 -0
  1202. orthonym-1.0.0/tests/unit/rules/test_opsin_acyloxy_format.py +175 -0
  1203. orthonym-1.0.0/tests/unit/rules/test_opsin_format_compliance.py +994 -0
  1204. orthonym-1.0.0/tests/unit/rules/test_organometallic_extension.py +112 -0
  1205. orthonym-1.0.0/tests/unit/rules/test_organometallics.py +364 -0
  1206. orthonym-1.0.0/tests/unit/rules/test_organometallics_p69_w8.py +429 -0
  1207. orthonym-1.0.0/tests/unit/rules/test_oxo_prefix_senior_suffix.py +221 -0
  1208. orthonym-1.0.0/tests/unit/rules/test_oxo_purine.py +143 -0
  1209. orthonym-1.0.0/tests/unit/rules/test_oxoacid_anion_salts.py +64 -0
  1210. orthonym-1.0.0/tests/unit/rules/test_p102_6_1_2_glycosyloxy.py +299 -0
  1211. orthonym-1.0.0/tests/unit/rules/test_p11_needs_example_sweep.py +99 -0
  1212. orthonym-1.0.0/tests/unit/rules/test_p14_3_4_3_monosubstituted_locant.py +467 -0
  1213. orthonym-1.0.0/tests/unit/rules/test_p14_3_4_4_no_isomer_by_relocation.py +397 -0
  1214. orthonym-1.0.0/tests/unit/rules/test_p14_3_4_5_benzene_uniform.py +400 -0
  1215. orthonym-1.0.0/tests/unit/rules/test_p14_3_4_5_parent_scope.py +767 -0
  1216. orthonym-1.0.0/tests/unit/rules/test_p14_3_4_5_substituent_scope.py +601 -0
  1217. orthonym-1.0.0/tests/unit/rules/test_p14_3_4_peroxy_acid_locant.py +202 -0
  1218. orthonym-1.0.0/tests/unit/rules/test_p14_3_4_ring_suffix_locant.py +228 -0
  1219. orthonym-1.0.0/tests/unit/rules/test_p14_3_4_task3b_baked_locants.py +467 -0
  1220. orthonym-1.0.0/tests/unit/rules/test_p14_3_4_urea_letter_locants.py +92 -0
  1221. orthonym-1.0.0/tests/unit/rules/test_p14_4_g_total_order.py +713 -0
  1222. orthonym-1.0.0/tests/unit/rules/test_p14_4_j_numbering_determinism.py +444 -0
  1223. orthonym-1.0.0/tests/unit/rules/test_p14_4_pcg_lowest_locant.py +520 -0
  1224. orthonym-1.0.0/tests/unit/rules/test_p16_3_5_heterocycle_bis_multiplier.py +86 -0
  1225. orthonym-1.0.0/tests/unit/rules/test_p1_branch_losses.py +380 -0
  1226. orthonym-1.0.0/tests/unit/rules/test_p22_2_1_locant_bearing_retained_pins.py +258 -0
  1227. orthonym-1.0.0/tests/unit/rules/test_p22_2_1_pyran_indicated_hydrogen.py +116 -0
  1228. orthonym-1.0.0/tests/unit/rules/test_p41_fused_heteroaryl_ol_suffix.py +90 -0
  1229. orthonym-1.0.0/tests/unit/rules/test_p41_fused_n_substituted_amine.py +96 -0
  1230. orthonym-1.0.0/tests/unit/rules/test_p44_scorer.py +282 -0
  1231. orthonym-1.0.0/tests/unit/rules/test_p4_oxoacid_anhydride.py +208 -0
  1232. orthonym-1.0.0/tests/unit/rules/test_p68_element_guard_refutation.py +97 -0
  1233. orthonym-1.0.0/tests/unit/rules/test_p6_cluster_e_bis_stereo_veto.py +50 -0
  1234. orthonym-1.0.0/tests/unit/rules/test_p74_1_2_ring_zwitterion.py +278 -0
  1235. orthonym-1.0.0/tests/unit/rules/test_p74_anion_locants.py +152 -0
  1236. orthonym-1.0.0/tests/unit/rules/test_p7_inline_suffix_attachment.py +183 -0
  1237. orthonym-1.0.0/tests/unit/rules/test_parent_correctness.py +274 -0
  1238. orthonym-1.0.0/tests/unit/rules/test_parent_locant_parity.py +621 -0
  1239. orthonym-1.0.0/tests/unit/rules/test_parent_selection.py +2012 -0
  1240. orthonym-1.0.0/tests/unit/rules/test_partial_sat_amine_suffix.py +50 -0
  1241. orthonym-1.0.0/tests/unit/rules/test_partial_saturation.py +470 -0
  1242. orthonym-1.0.0/tests/unit/rules/test_partial_saturation_carbocycles.py +347 -0
  1243. orthonym-1.0.0/tests/unit/rules/test_partial_saturation_nitrogen.py +65 -0
  1244. orthonym-1.0.0/tests/unit/rules/test_peptide_backbone_substitutive.py +191 -0
  1245. orthonym-1.0.0/tests/unit/rules/test_peptide_breadth.py +266 -0
  1246. orthonym-1.0.0/tests/unit/rules/test_peptide_capped_termini.py +289 -0
  1247. orthonym-1.0.0/tests/unit/rules/test_peptide_dispatch_proline_cterm.py +183 -0
  1248. orthonym-1.0.0/tests/unit/rules/test_phane.py +215 -0
  1249. orthonym-1.0.0/tests/unit/rules/test_phane_boundary.py +52 -0
  1250. orthonym-1.0.0/tests/unit/rules/test_phane_pin.py +427 -0
  1251. orthonym-1.0.0/tests/unit/rules/test_phase10_organometallic_core.py +112 -0
  1252. orthonym-1.0.0/tests/unit/rules/test_phase11_carbohydrate.py +106 -0
  1253. orthonym-1.0.0/tests/unit/rules/test_phase12_amino_acid.py +90 -0
  1254. orthonym-1.0.0/tests/unit/rules/test_phase12_deferred.py +217 -0
  1255. orthonym-1.0.0/tests/unit/rules/test_phase13b_a_s1.py +112 -0
  1256. orthonym-1.0.0/tests/unit/rules/test_phase143_regressions.py +134 -0
  1257. orthonym-1.0.0/tests/unit/rules/test_phase14_nucleosides.py +165 -0
  1258. orthonym-1.0.0/tests/unit/rules/test_phase6_acyloxymethyl_ring.py +54 -0
  1259. orthonym-1.0.0/tests/unit/rules/test_phase6_aryloxymethyl.py +90 -0
  1260. orthonym-1.0.0/tests/unit/rules/test_phase6_bicyclo_branched_alkyl.py +60 -0
  1261. orthonym-1.0.0/tests/unit/rules/test_phase6_bicyclo_substituent_dropguard.py +34 -0
  1262. orthonym-1.0.0/tests/unit/rules/test_phase6_bridgehead_scope.py +41 -0
  1263. orthonym-1.0.0/tests/unit/rules/test_phase6_diacylglycerol.py +131 -0
  1264. orthonym-1.0.0/tests/unit/rules/test_phase6_e2_capability.py +352 -0
  1265. orthonym-1.0.0/tests/unit/rules/test_phase6_e3_assembly.py +230 -0
  1266. orthonym-1.0.0/tests/unit/rules/test_phase6_enclosing_marks.py +67 -0
  1267. orthonym-1.0.0/tests/unit/rules/test_phase6_ester_ringacid.py +127 -0
  1268. orthonym-1.0.0/tests/unit/rules/test_phase6_heteroacid_principal_chain.py +38 -0
  1269. orthonym-1.0.0/tests/unit/rules/test_phase6_macrolactone.py +46 -0
  1270. orthonym-1.0.0/tests/unit/rules/test_phase6_wave2_brace_escalation.py +27 -0
  1271. orthonym-1.0.0/tests/unit/rules/test_phase6_wave2_heteroacid_extra_elements.py +43 -0
  1272. orthonym-1.0.0/tests/unit/rules/test_phase6_wave2_independent_ester.py +95 -0
  1273. orthonym-1.0.0/tests/unit/rules/test_phase6_wave2_nitro_locant.py +47 -0
  1274. orthonym-1.0.0/tests/unit/rules/test_phase_h_stereo.py +175 -0
  1275. orthonym-1.0.0/tests/unit/rules/test_phosphoanhydride_substituent.py +150 -0
  1276. orthonym-1.0.0/tests/unit/rules/test_phospholipids_p107.py +59 -0
  1277. orthonym-1.0.0/tests/unit/rules/test_phosphorus.py +681 -0
  1278. orthonym-1.0.0/tests/unit/rules/test_phosphorus_smarts.py +208 -0
  1279. orthonym-1.0.0/tests/unit/rules/test_phosphorus_substituent_structure_proof.py +140 -0
  1280. orthonym-1.0.0/tests/unit/rules/test_pin_heteroaryl_substituent.py +134 -0
  1281. orthonym-1.0.0/tests/unit/rules/test_pin_vocabulary.py +261 -0
  1282. orthonym-1.0.0/tests/unit/rules/test_pnictogen_oxoacids.py +514 -0
  1283. orthonym-1.0.0/tests/unit/rules/test_polyazane.py +170 -0
  1284. orthonym-1.0.0/tests/unit/rules/test_polycation.py +144 -0
  1285. orthonym-1.0.0/tests/unit/rules/test_polychalcogen.py +66 -0
  1286. orthonym-1.0.0/tests/unit/rules/test_polycyclic_bridged.py +468 -0
  1287. orthonym-1.0.0/tests/unit/rules/test_polycyclic_exocyclic_ylidene.py +136 -0
  1288. orthonym-1.0.0/tests/unit/rules/test_polycyclic_features.py +392 -0
  1289. orthonym-1.0.0/tests/unit/rules/test_polycyclic_hetero.py +553 -0
  1290. orthonym-1.0.0/tests/unit/rules/test_polycyclic_iupac_locants.py +203 -0
  1291. orthonym-1.0.0/tests/unit/rules/test_polycyclic_simple_paths.py +92 -0
  1292. orthonym-1.0.0/tests/unit/rules/test_polycyclic_vb.py +791 -0
  1293. orthonym-1.0.0/tests/unit/rules/test_polycyclic_von_baeyer.py +520 -0
  1294. orthonym-1.0.0/tests/unit/rules/test_polyfunctional_detection.py +52 -0
  1295. orthonym-1.0.0/tests/unit/rules/test_polyol_polyester.py +59 -0
  1296. orthonym-1.0.0/tests/unit/rules/test_polyspiro_fused_component_coverage.py +109 -0
  1297. orthonym-1.0.0/tests/unit/rules/test_polyvalent_radicals.py +125 -0
  1298. orthonym-1.0.0/tests/unit/rules/test_preexisting_pin_spelling.py +303 -0
  1299. orthonym-1.0.0/tests/unit/rules/test_prefix_emission.py +122 -0
  1300. orthonym-1.0.0/tests/unit/rules/test_prefix_order_fallback.py +245 -0
  1301. orthonym-1.0.0/tests/unit/rules/test_principal_group_parent_membership.py +85 -0
  1302. orthonym-1.0.0/tests/unit/rules/test_ps1_stereo_completeness.py +73 -0
  1303. orthonym-1.0.0/tests/unit/rules/test_pseudoasymmetric_verification.py +131 -0
  1304. orthonym-1.0.0/tests/unit/rules/test_pseudoketone_not_hydro.py +162 -0
  1305. orthonym-1.0.0/tests/unit/rules/test_pubchem_losses.py +198 -0
  1306. orthonym-1.0.0/tests/unit/rules/test_purine_best_effort_substituent.py +199 -0
  1307. orthonym-1.0.0/tests/unit/rules/test_purine_oxo.py +84 -0
  1308. orthonym-1.0.0/tests/unit/rules/test_quaternary_aminium.py +88 -0
  1309. orthonym-1.0.0/tests/unit/rules/test_quaternary_aminium_locant.py +144 -0
  1310. orthonym-1.0.0/tests/unit/rules/test_r1fix_cyclic_urea_and_symmetric_locant.py +109 -0
  1311. orthonym-1.0.0/tests/unit/rules/test_r_group_naming.py +47 -0
  1312. orthonym-1.0.0/tests/unit/rules/test_radical_184.py +84 -0
  1313. orthonym-1.0.0/tests/unit/rules/test_radical_producers_strict_rt.py +117 -0
  1314. orthonym-1.0.0/tests/unit/rules/test_radicals.py +533 -0
  1315. orthonym-1.0.0/tests/unit/rules/test_radicals_b11_radical_ions.py +85 -0
  1316. orthonym-1.0.0/tests/unit/rules/test_radicals_b3_b4.py +69 -0
  1317. orthonym-1.0.0/tests/unit/rules/test_radicals_b5_carbon.py +47 -0
  1318. orthonym-1.0.0/tests/unit/rules/test_radicals_b6_multicentre.py +47 -0
  1319. orthonym-1.0.0/tests/unit/rules/test_radicals_b7_routing.py +46 -0
  1320. orthonym-1.0.0/tests/unit/rules/test_radicals_b8_spelling.py +58 -0
  1321. orthonym-1.0.0/tests/unit/rules/test_radicals_b9_nitrene.py +47 -0
  1322. orthonym-1.0.0/tests/unit/rules/test_radicals_methane_and_chains.py +35 -0
  1323. orthonym-1.0.0/tests/unit/rules/test_radicals_v36.py +160 -0
  1324. orthonym-1.0.0/tests/unit/rules/test_reclaim_p2_a1_iodane_suffix.py +153 -0
  1325. orthonym-1.0.0/tests/unit/rules/test_reclaim_p2_b1_hydro_prefix.py +238 -0
  1326. orthonym-1.0.0/tests/unit/rules/test_reclaim_p2_b2_spiro_numbering.py +188 -0
  1327. orthonym-1.0.0/tests/unit/rules/test_reclaim_stereo.py +351 -0
  1328. orthonym-1.0.0/tests/unit/rules/test_recursive_substituent_downgrade.py +150 -0
  1329. orthonym-1.0.0/tests/unit/rules/test_resonance_twins.py +175 -0
  1330. orthonym-1.0.0/tests/unit/rules/test_retained_name_pin_status.py +377 -0
  1331. orthonym-1.0.0/tests/unit/rules/test_retained_names_expansion.py +284 -0
  1332. orthonym-1.0.0/tests/unit/rules/test_retained_ring_indicated_h_substitution.py +281 -0
  1333. orthonym-1.0.0/tests/unit/rules/test_ring_acid_ester_words.py +43 -0
  1334. orthonym-1.0.0/tests/unit/rules/test_ring_assemblies.py +642 -0
  1335. orthonym-1.0.0/tests/unit/rules/test_ring_assemblies_3plus.py +596 -0
  1336. orthonym-1.0.0/tests/unit/rules/test_ring_assembly_substituent.py +156 -0
  1337. orthonym-1.0.0/tests/unit/rules/test_ring_cation_locant_v52.py +138 -0
  1338. orthonym-1.0.0/tests/unit/rules/test_ring_ester_parent_monocycle.py +43 -0
  1339. orthonym-1.0.0/tests/unit/rules/test_ring_fg_substituents.py +142 -0
  1340. orthonym-1.0.0/tests/unit/rules/test_ring_heteroatom_variety.py +206 -0
  1341. orthonym-1.0.0/tests/unit/rules/test_ring_hydrazide_nn.py +178 -0
  1342. orthonym-1.0.0/tests/unit/rules/test_ring_junction_stereo.py +391 -0
  1343. orthonym-1.0.0/tests/unit/rules/test_ring_locant_numbering.py +94 -0
  1344. orthonym-1.0.0/tests/unit/rules/test_ring_n_carboxy_suffix.py +98 -0
  1345. orthonym-1.0.0/tests/unit/rules/test_ring_n_sulfinate_anion.py +86 -0
  1346. orthonym-1.0.0/tests/unit/rules/test_ring_parent_p4521_tiebreak.py +72 -0
  1347. orthonym-1.0.0/tests/unit/rules/test_ring_replacement.py +460 -0
  1348. orthonym-1.0.0/tests/unit/rules/test_ring_score_memo.py +26 -0
  1349. orthonym-1.0.0/tests/unit/rules/test_ring_selection.py +317 -0
  1350. orthonym-1.0.0/tests/unit/rules/test_ring_senior_to_chain_p44_1_2_2.py +107 -0
  1351. orthonym-1.0.0/tests/unit/rules/test_ring_sub_naming.py +127 -0
  1352. orthonym-1.0.0/tests/unit/rules/test_ring_substituent_names.py +103 -0
  1353. orthonym-1.0.0/tests/unit/rules/test_ring_substituent_relative.py +82 -0
  1354. orthonym-1.0.0/tests/unit/rules/test_ring_substituents.py +283 -0
  1355. orthonym-1.0.0/tests/unit/rules/test_ring_sulfonic_sulfinic_suffix.py +124 -0
  1356. orthonym-1.0.0/tests/unit/rules/test_ring_tier_order_p52.py +207 -0
  1357. orthonym-1.0.0/tests/unit/rules/test_ring_unsaturation.py +352 -0
  1358. orthonym-1.0.0/tests/unit/rules/test_ring_unsaturation_tier.py +65 -0
  1359. orthonym-1.0.0/tests/unit/rules/test_ringsubst_azole_stems.py +74 -0
  1360. orthonym-1.0.0/tests/unit/rules/test_s_rooted_ring_sulfanyl_substituent.py +159 -0
  1361. orthonym-1.0.0/tests/unit/rules/test_salt_cations_v36.py +251 -0
  1362. orthonym-1.0.0/tests/unit/rules/test_salt_neutral_coformer.py +101 -0
  1363. orthonym-1.0.0/tests/unit/rules/test_salt_stoichiometry_v36.py +207 -0
  1364. orthonym-1.0.0/tests/unit/rules/test_salts.py +249 -0
  1365. orthonym-1.0.0/tests/unit/rules/test_second_substituent_enclosure.py +60 -0
  1366. orthonym-1.0.0/tests/unit/rules/test_seniority_completeness.py +239 -0
  1367. orthonym-1.0.0/tests/unit/rules/test_seniority_equalization.py +61 -0
  1368. orthonym-1.0.0/tests/unit/rules/test_seniority_frn.py +216 -0
  1369. orthonym-1.0.0/tests/unit/rules/test_seniority_multiplicative_v52.py +116 -0
  1370. orthonym-1.0.0/tests/unit/rules/test_seniority_swap.py +416 -0
  1371. orthonym-1.0.0/tests/unit/rules/test_seniority_thiol_hydroperoxide.py +67 -0
  1372. orthonym-1.0.0/tests/unit/rules/test_silacycle_ring.py +31 -0
  1373. orthonym-1.0.0/tests/unit/rules/test_skeletal_replacement.py +740 -0
  1374. orthonym-1.0.0/tests/unit/rules/test_spaced_prefix_backstop.py +34 -0
  1375. orthonym-1.0.0/tests/unit/rules/test_spiro.py +500 -0
  1376. orthonym-1.0.0/tests/unit/rules/test_spiro_fused_component_numbering.py +81 -0
  1377. orthonym-1.0.0/tests/unit/rules/test_spiro_g4.py +356 -0
  1378. orthonym-1.0.0/tests/unit/rules/test_spiro_multi.py +305 -0
  1379. orthonym-1.0.0/tests/unit/rules/test_spiro_named_components_fusion.py +139 -0
  1380. orthonym-1.0.0/tests/unit/rules/test_spiro_numbering.py +199 -0
  1381. orthonym-1.0.0/tests/unit/rules/test_spiro_quinone_alkaloid.py +71 -0
  1382. orthonym-1.0.0/tests/unit/rules/test_spiro_side_ring_numbering.py +121 -0
  1383. orthonym-1.0.0/tests/unit/rules/test_spirobi_hydro_hoisting.py +405 -0
  1384. orthonym-1.0.0/tests/unit/rules/test_stereo_backstop.py +256 -0
  1385. orthonym-1.0.0/tests/unit/rules/test_stereo_benzene_ester.py +268 -0
  1386. orthonym-1.0.0/tests/unit/rules/test_stereo_fabrication_controls.py +39 -0
  1387. orthonym-1.0.0/tests/unit/rules/test_stereo_mismatch_fixes.py +257 -0
  1388. orthonym-1.0.0/tests/unit/rules/test_stereo_omission_reclaim.py +148 -0
  1389. orthonym-1.0.0/tests/unit/rules/test_stereo_path_addition.py +262 -0
  1390. orthonym-1.0.0/tests/unit/rules/test_stereochemistry.py +811 -0
  1391. orthonym-1.0.0/tests/unit/rules/test_steroid_alpha_beta.py +133 -0
  1392. orthonym-1.0.0/tests/unit/rules/test_steroid_conjugate.py +164 -0
  1393. orthonym-1.0.0/tests/unit/rules/test_substituent_naming.py +357 -0
  1394. orthonym-1.0.0/tests/unit/rules/test_substituted_purine.py +91 -0
  1395. orthonym-1.0.0/tests/unit/rules/test_substituted_ring_cation.py +118 -0
  1396. orthonym-1.0.0/tests/unit/rules/test_suffix_context.py +107 -0
  1397. orthonym-1.0.0/tests/unit/rules/test_sugar_names.py +282 -0
  1398. orthonym-1.0.0/tests/unit/rules/test_sulfate_ester.py +102 -0
  1399. orthonym-1.0.0/tests/unit/rules/test_sulfinamides_class.py +186 -0
  1400. orthonym-1.0.0/tests/unit/rules/test_sulfonamides_n_substituted.py +229 -0
  1401. orthonym-1.0.0/tests/unit/rules/test_sulfonamido_substituent_general.py +225 -0
  1402. orthonym-1.0.0/tests/unit/rules/test_sulfur.py +249 -0
  1403. orthonym-1.0.0/tests/unit/rules/test_systematic_carbohydrate.py +752 -0
  1404. orthonym-1.0.0/tests/unit/rules/test_task9_point_fixes.py +297 -0
  1405. orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_chain.py +419 -0
  1406. orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_chain_to_ring.py +86 -0
  1407. orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_chiral.py +49 -0
  1408. orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_composite.py +168 -0
  1409. orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_oxo_branch.py +139 -0
  1410. orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_unsaturated_stereo.py +82 -0
  1411. orthonym-1.0.0/tests/unit/rules/test_terminal_n_prefixes.py +161 -0
  1412. orthonym-1.0.0/tests/unit/rules/test_terphenyl_middle_locant_determinism.py +38 -0
  1413. orthonym-1.0.0/tests/unit/rules/test_thiocarboxylic_acids.py +202 -0
  1414. orthonym-1.0.0/tests/unit/rules/test_tier2a_imine_oxime.py +117 -0
  1415. orthonym-1.0.0/tests/unit/rules/test_tier2c_ring_ketone_locant.py +77 -0
  1416. orthonym-1.0.0/tests/unit/rules/test_tier2d_data_flips.py +131 -0
  1417. orthonym-1.0.0/tests/unit/rules/test_tier3a_skeletal_parent.py +288 -0
  1418. orthonym-1.0.0/tests/unit/rules/test_tier3b_sulfoxide_substitutive.py +287 -0
  1419. orthonym-1.0.0/tests/unit/rules/test_tier3cd_styryl_sulfonimidamide.py +97 -0
  1420. orthonym-1.0.0/tests/unit/rules/test_tier3d_composite_n.py +109 -0
  1421. orthonym-1.0.0/tests/unit/rules/test_tier4_fused_catalog.py +137 -0
  1422. orthonym-1.0.0/tests/unit/rules/test_tier5a_multiplicative.py +209 -0
  1423. orthonym-1.0.0/tests/unit/rules/test_tier5b_located_substituted_alkyl.py +122 -0
  1424. orthonym-1.0.0/tests/unit/rules/test_tier5c_acyl_prefix_on_senior.py +84 -0
  1425. orthonym-1.0.0/tests/unit/rules/test_tier5d_het_carboxamide_n.py +56 -0
  1426. orthonym-1.0.0/tests/unit/rules/test_tier6_exotics.py +347 -0
  1427. orthonym-1.0.0/tests/unit/rules/test_try_algorithmic_fusion_name.py +58 -0
  1428. orthonym-1.0.0/tests/unit/rules/test_uronium.py +62 -0
  1429. orthonym-1.0.0/tests/unit/rules/test_v26_bp1_nucleobase_heterone.py +68 -0
  1430. orthonym-1.0.0/tests/unit/rules/test_v26_bp2_rc2b_polyacid_monoester.py +62 -0
  1431. orthonym-1.0.0/tests/unit/rules/test_v26_bp2_rc3_unsaturated_oxo_substituent.py +77 -0
  1432. orthonym-1.0.0/tests/unit/rules/test_v26_bp2_rc5_urea_enclosure.py +54 -0
  1433. orthonym-1.0.0/tests/unit/rules/test_v26_bp2_substituent_strings.py +83 -0
  1434. orthonym-1.0.0/tests/unit/rules/test_v26_bp3_c1_chalcogen_aminoacid.py +27 -0
  1435. orthonym-1.0.0/tests/unit/rules/test_v26_bp4_fused_substituent.py +305 -0
  1436. orthonym-1.0.0/tests/unit/rules/test_v26_bp4p4_flavone_dehead.py +55 -0
  1437. orthonym-1.0.0/tests/unit/rules/test_v26_bp5_amide_ring_absorb.py +38 -0
  1438. orthonym-1.0.0/tests/unit/rules/test_v26_heteroaryl_ether_substituent.py +44 -0
  1439. orthonym-1.0.0/tests/unit/rules/test_v26_p2_aromatic_vonbaeyer.py +401 -0
  1440. orthonym-1.0.0/tests/unit/rules/test_v26_p3_failclosed_routing.py +308 -0
  1441. orthonym-1.0.0/tests/unit/rules/test_v26_triazine_ring_polyamine.py +38 -0
  1442. orthonym-1.0.0/tests/unit/rules/test_v27_cage_substituent.py +203 -0
  1443. orthonym-1.0.0/tests/unit/rules/test_v27_p3_spiro_engine.py +240 -0
  1444. orthonym-1.0.0/tests/unit/rules/test_v27_p4_thione.py +77 -0
  1445. orthonym-1.0.0/tests/unit/rules/test_v28_composer1.py +460 -0
  1446. orthonym-1.0.0/tests/unit/rules/test_v29_p2_vb_ring_count.py +354 -0
  1447. orthonym-1.0.0/tests/unit/rules/test_v29_p3_organyl_routing.py +1630 -0
  1448. orthonym-1.0.0/tests/unit/rules/test_v29_p3b_italicized_prefix.py +584 -0
  1449. orthonym-1.0.0/tests/unit/rules/test_v29_p3b_refusal_sentinels.py +156 -0
  1450. orthonym-1.0.0/tests/unit/rules/test_v29_p3cleanup_enclosure.py +202 -0
  1451. orthonym-1.0.0/tests/unit/rules/test_v29_p3fix_determinism_total_order.py +207 -0
  1452. orthonym-1.0.0/tests/unit/rules/test_v29_p3fix_formazan_prefixes.py +85 -0
  1453. orthonym-1.0.0/tests/unit/rules/test_v29_p3fix_stereo_expression.py +431 -0
  1454. orthonym-1.0.0/tests/unit/rules/test_v29_p3reg_fg_prefix_enclosure.py +176 -0
  1455. orthonym-1.0.0/tests/unit/rules/test_v29_p8_bridging_amine_determinism.py +135 -0
  1456. orthonym-1.0.0/tests/unit/rules/test_v29_phase5_ester_organyl_primitive.py +150 -0
  1457. orthonym-1.0.0/tests/unit/rules/test_v29_phase6_decorated_phenyl_substituent.py +222 -0
  1458. orthonym-1.0.0/tests/unit/rules/test_v29_phase7_locant_hyphen.py +202 -0
  1459. orthonym-1.0.0/tests/unit/rules/test_v29_phase7_prefix_vocabulary.py +240 -0
  1460. orthonym-1.0.0/tests/unit/rules/test_v29_phase7_stereo_locant_resolution.py +707 -0
  1461. orthonym-1.0.0/tests/unit/rules/test_v29_replacement_prefix_totality.py +817 -0
  1462. orthonym-1.0.0/tests/unit/rules/test_v29_t2_count_based_naming.py +306 -0
  1463. orthonym-1.0.0/tests/unit/rules/test_v29_table_1_5_completion.py +660 -0
  1464. orthonym-1.0.0/tests/unit/rules/test_v29_taskS2_polycyclic_legality_wiring.py +193 -0
  1465. orthonym-1.0.0/tests/unit/rules/test_v29_taskS_vb_descriptor_legality.py +214 -0
  1466. orthonym-1.0.0/tests/unit/rules/test_v30_piece2_decorated_fused_substituent.py +125 -0
  1467. orthonym-1.0.0/tests/unit/rules/test_v30_primed_locant_stereo_sort.py +46 -0
  1468. orthonym-1.0.0/tests/unit/rules/test_v30_sliceC_acetic_amido.py +86 -0
  1469. orthonym-1.0.0/tests/unit/rules/test_v30_sliceC_ring_acyl_amido.py +91 -0
  1470. orthonym-1.0.0/tests/unit/rules/test_v30_t4_phosphane_ring_subs.py +62 -0
  1471. orthonym-1.0.0/tests/unit/rules/test_v30_terminal_ring.py +441 -0
  1472. orthonym-1.0.0/tests/unit/rules/test_v31_aroyl_anilide_seniority.py +80 -0
  1473. orthonym-1.0.0/tests/unit/rules/test_v31_compound_alkyl_enclosure.py +61 -0
  1474. orthonym-1.0.0/tests/unit/rules/test_v31_deeper_amide.py +77 -0
  1475. orthonym-1.0.0/tests/unit/rules/test_v31_ester_ring_alcohol_component.py +42 -0
  1476. orthonym-1.0.0/tests/unit/rules/test_v31_substituent_stereo_locant.py +36 -0
  1477. orthonym-1.0.0/tests/unit/rules/test_v34_composed_charge.py +972 -0
  1478. orthonym-1.0.0/tests/unit/rules/test_v37_acyloxy_general.py +149 -0
  1479. orthonym-1.0.0/tests/unit/rules/test_v37_corestereo.py +190 -0
  1480. orthonym-1.0.0/tests/unit/rules/test_v37_ct5_threeway.py +95 -0
  1481. orthonym-1.0.0/tests/unit/rules/test_v37_sp1_areplacement_spelling.py +96 -0
  1482. orthonym-1.0.0/tests/unit/rules/test_v37_sp1_compound_substituent.py +101 -0
  1483. orthonym-1.0.0/tests/unit/rules/test_v37_sp1_parent_offer.py +125 -0
  1484. orthonym-1.0.0/tests/unit/rules/test_v37_sp1_recursive_fragment.py +173 -0
  1485. orthonym-1.0.0/tests/unit/rules/test_v37_sp1_vonbaeyer_seniority.py +66 -0
  1486. orthonym-1.0.0/tests/unit/rules/test_v37_sp2_bicyclic_seniority.py +54 -0
  1487. orthonym-1.0.0/tests/unit/rules/test_v37_sp2_deep_numbering.py +81 -0
  1488. orthonym-1.0.0/tests/unit/rules/test_v37_sp2_spiro_substituent.py +99 -0
  1489. orthonym-1.0.0/tests/unit/rules/test_v37_sp2_spiro_vb_spelling.py +50 -0
  1490. orthonym-1.0.0/tests/unit/rules/test_v37_sp5_flag_isolation.py +67 -0
  1491. orthonym-1.0.0/tests/unit/rules/test_v37_spiro_hoist.py +109 -0
  1492. orthonym-1.0.0/tests/unit/rules/test_v37_stereo_completion.py +297 -0
  1493. orthonym-1.0.0/tests/unit/rules/test_v37_tierpolicy.py +243 -0
  1494. orthonym-1.0.0/tests/unit/rules/test_v38_cp2_fused_locants.py +217 -0
  1495. orthonym-1.0.0/tests/unit/rules/test_v38_cp2b_catalog_fused_locants.py +138 -0
  1496. orthonym-1.0.0/tests/unit/rules/test_v38_drop12_phospho.py +197 -0
  1497. orthonym-1.0.0/tests/unit/rules/test_v38_drop23_phosphodiester.py +171 -0
  1498. orthonym-1.0.0/tests/unit/rules/test_v38_incr1a_glycoside_aglycone.py +193 -0
  1499. orthonym-1.0.0/tests/unit/rules/test_v38_peptide_substitutive.py +212 -0
  1500. orthonym-1.0.0/tests/unit/rules/test_v38_salt.py +212 -0
  1501. orthonym-1.0.0/tests/unit/rules/test_v42_11b1_sulfur_oxoacid_prefix.py +203 -0
  1502. orthonym-1.0.0/tests/unit/rules/test_v42_11c1_locant_hyphen_pins.py +93 -0
  1503. orthonym-1.0.0/tests/unit/rules/test_v42_11c2_selection_pins.py +156 -0
  1504. orthonym-1.0.0/tests/unit/rules/test_v42_11c3_pin_spelling.py +235 -0
  1505. orthonym-1.0.0/tests/unit/rules/test_v42_7c2_hydrazinyl_prefix.py +103 -0
  1506. orthonym-1.0.0/tests/unit/rules/test_v42_fablefix_pnictogen.py +107 -0
  1507. orthonym-1.0.0/tests/unit/rules/test_v42_p11_ene_before_yne_tiebreak.py +142 -0
  1508. orthonym-1.0.0/tests/unit/rules/test_v42_p3c_acyl_prefix_substituent.py +93 -0
  1509. orthonym-1.0.0/tests/unit/rules/test_v42_p6f_ring_thiolactam_suffix.py +93 -0
  1510. orthonym-1.0.0/tests/unit/rules/test_v42_p9_fusion_numbering_tiebreak.py +121 -0
  1511. orthonym-1.0.0/tests/unit/rules/test_v52_acid_deriv.py +264 -0
  1512. orthonym-1.0.0/tests/unit/rules/test_v52_p04_fusion_select.py +121 -0
  1513. orthonym-1.0.0/tests/unit/rules/test_v52_phase02_noncarbon.py +172 -0
  1514. orthonym-1.0.0/tests/unit/rules/test_von_baeyer_locant_orientation.py +148 -0
  1515. orthonym-1.0.0/tests/unit/rules/test_von_baeyer_vowel_elision.py +140 -0
  1516. orthonym-1.0.0/tests/unit/rules/test_vonbaeyer_parent_fallback.py +481 -0
  1517. orthonym-1.0.0/tests/unit/rules/test_vonbaeyer_spiro.py +200 -0
  1518. orthonym-1.0.0/tests/unit/rules/test_vonbaeyer_universal.py +98 -0
  1519. orthonym-1.0.0/tests/unit/rules/test_w2e_p1_amide.py +290 -0
  1520. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_benzyl.py +34 -0
  1521. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_chain_vs_ring_pg.py +49 -0
  1522. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_free_valence.py +34 -0
  1523. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_heterochain_acid.py +28 -0
  1524. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_multiring_pg.py +62 -0
  1525. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_substituted_benzyl.py +20 -0
  1526. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_verified_head.py +32 -0
  1527. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_am2_amide.py +32 -0
  1528. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_am3_failclosed.py +35 -0
  1529. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_carbamimidate.py +20 -0
  1530. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_carbamoylamino_nsub.py +30 -0
  1531. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_cyclic_carbonate.py +32 -0
  1532. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_heteroimine.py +26 -0
  1533. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_imido_prefix.py +74 -0
  1534. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_ketene_completion.py +38 -0
  1535. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_oxamoylimino.py +34 -0
  1536. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_ring_imino.py +35 -0
  1537. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_ring_peroxol.py +29 -0
  1538. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_semicarbazone.py +33 -0
  1539. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_sulfonimidamide.py +30 -0
  1540. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_thioacyl_amide.py +55 -0
  1541. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_thioamide_chain.py +24 -0
  1542. orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_verified_head.py +55 -0
  1543. orthonym-1.0.0/tests/unit/rules/test_w2f_p10_fusion.py +78 -0
  1544. orthonym-1.0.0/tests/unit/rules/test_w2f_p1_alpha_benzyl.py +185 -0
  1545. orthonym-1.0.0/tests/unit/rules/test_w2f_p1_oxybis_methylene.py +173 -0
  1546. orthonym-1.0.0/tests/unit/rules/test_w2f_p3_polyfunctional_branch.py +79 -0
  1547. orthonym-1.0.0/tests/unit/rules/test_w2f_p4_dihydro_hw.py +43 -0
  1548. orthonym-1.0.0/tests/unit/rules/test_w2f_p4_ring_imine.py +76 -0
  1549. orthonym-1.0.0/tests/unit/rules/test_w2f_p6_urea_acyclic.py +19 -0
  1550. orthonym-1.0.0/tests/unit/rules/test_w2f_p6_urea_naphthalene.py +23 -0
  1551. orthonym-1.0.0/tests/unit/rules/test_w2f_p7_evidence.py +14 -0
  1552. orthonym-1.0.0/tests/unit/rules/test_w2f_p7_lambda_naming.py +22 -0
  1553. orthonym-1.0.0/tests/unit/rules/test_w2f_p7_numbering.py +13 -0
  1554. orthonym-1.0.0/tests/unit/rules/test_w2f_p7_phosphanyl.py +29 -0
  1555. orthonym-1.0.0/tests/unit/rules/test_w2f_p8_aryl_substituent.py +67 -0
  1556. orthonym-1.0.0/tests/unit/rules/test_w2f_p8_diarylamine_build.py +35 -0
  1557. orthonym-1.0.0/tests/unit/rules/test_w2f_p8_diarylamine_evidence.py +34 -0
  1558. orthonym-1.0.0/tests/unit/rules/test_w2f_p8_ether_evidence.py +37 -0
  1559. orthonym-1.0.0/tests/unit/rules/test_w2f_p8_fail_closed.py +52 -0
  1560. orthonym-1.0.0/tests/unit/rules/test_w2f_p8_multiplicative_declines.py +22 -0
  1561. orthonym-1.0.0/tests/unit/rules/test_w2f_p8_phenoxy.py +33 -0
  1562. orthonym-1.0.0/tests/unit/rules/test_w8p2_aryloxy_substituent.py +58 -0
  1563. orthonym-1.0.0/tests/unit/rules/test_w8p2_ring_assembly_pcg.py +208 -0
  1564. orthonym-1.0.0/tests/unit/rules/test_wave0_safety_leaks.py +71 -0
  1565. orthonym-1.0.0/tests/unit/rules/test_wave1_roots.py +193 -0
  1566. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_b1_skeletal.py +178 -0
  1567. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_b2_multiplicative.py +132 -0
  1568. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_b3_bridged_fused.py +112 -0
  1569. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_b4_misc.py +206 -0
  1570. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_c.py +142 -0
  1571. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_c2.py +192 -0
  1572. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_d.py +179 -0
  1573. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_t1.py +182 -0
  1574. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_t2_amide_n.py +40 -0
  1575. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_t2_data_catalog.py +95 -0
  1576. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_t2_mult_bridges.py +33 -0
  1577. orthonym-1.0.0/tests/unit/rules/test_wave2_completion_t2_ring_fg.py +48 -0
  1578. orthonym-1.0.0/tests/unit/rules/test_wave2_p1_chains_a.py +262 -0
  1579. orthonym-1.0.0/tests/unit/rules/test_wave2_p1_chains_b.py +195 -0
  1580. orthonym-1.0.0/tests/unit/rules/test_wave2_p3_ring_selection.py +196 -0
  1581. orthonym-1.0.0/tests/unit/rules/test_wave2_p3_spiro.py +202 -0
  1582. orthonym-1.0.0/tests/unit/rules/test_wave2_p5_bridged.py +244 -0
  1583. orthonym-1.0.0/tests/unit/rules/test_wave2_p5_fused.py +263 -0
  1584. orthonym-1.0.0/tests/unit/rules/test_wave2_p9_spiro_named_components.py +64 -0
  1585. orthonym-1.0.0/tests/unit/rules/test_wave8_p1_roots.py +95 -0
  1586. orthonym-1.0.0/tests/unit/rules/test_word_rules.py +97 -0
  1587. orthonym-1.0.0/tests/unit/rules/test_zwitterion_betaine_unsat.py +70 -0
  1588. orthonym-1.0.0/tests/unit/scripts/__init__.py +0 -0
  1589. orthonym-1.0.0/tests/unit/scripts/test_calibrate_phase_148_1.py +274 -0
  1590. orthonym-1.0.0/tests/unit/scripts/test_extract_chebi_expanded.py +179 -0
  1591. orthonym-1.0.0/tests/unit/scripts/test_extract_pubchem.py +96 -0
  1592. orthonym-1.0.0/tests/unit/scripts/test_gate_row_flips.py +248 -0
  1593. orthonym-1.0.0/tests/unit/scripts/test_generate_calibration_splits.py +140 -0
  1594. orthonym-1.0.0/tests/unit/scripts/test_generate_calibration_splits_148_1.py +193 -0
  1595. orthonym-1.0.0/tests/unit/scripts/test_issue108_tools.py +1047 -0
  1596. orthonym-1.0.0/tests/unit/scripts/test_phase146_factor_distributions.py +195 -0
  1597. orthonym-1.0.0/tests/unit/scripts/test_phase146_ship_gate.py +562 -0
  1598. orthonym-1.0.0/tests/unit/test_acid_halides.py +262 -0
  1599. orthonym-1.0.0/tests/unit/test_acylamino_ring_fix.py +64 -0
  1600. orthonym-1.0.0/tests/unit/test_alkanes.py +264 -0
  1601. orthonym-1.0.0/tests/unit/test_amide_ez_stereo.py +112 -0
  1602. orthonym-1.0.0/tests/unit/test_amides.py +352 -0
  1603. orthonym-1.0.0/tests/unit/test_amino_acid_fg_bailout.py +88 -0
  1604. orthonym-1.0.0/tests/unit/test_amino_acids.py +654 -0
  1605. orthonym-1.0.0/tests/unit/test_anhydrides.py +161 -0
  1606. orthonym-1.0.0/tests/unit/test_atom_coverage.py +173 -0
  1607. orthonym-1.0.0/tests/unit/test_bbr_gate_stereo.py +111 -0
  1608. orthonym-1.0.0/tests/unit/test_bbr_perc_chain_exclusion.py +75 -0
  1609. orthonym-1.0.0/tests/unit/test_benzene.py +556 -0
  1610. orthonym-1.0.0/tests/unit/test_besteffort_full_rt_gate.py +121 -0
  1611. orthonym-1.0.0/tests/unit/test_boronic_acid.py +58 -0
  1612. orthonym-1.0.0/tests/unit/test_branched_ester_prefix.py +117 -0
  1613. orthonym-1.0.0/tests/unit/test_c7_brackets_triazine.py +97 -0
  1614. orthonym-1.0.0/tests/unit/test_carotenoid_tier_honesty.py +76 -0
  1615. orthonym-1.0.0/tests/unit/test_chain_fg_exclusion.py +225 -0
  1616. orthonym-1.0.0/tests/unit/test_charged_retained_first.py +44 -0
  1617. orthonym-1.0.0/tests/unit/test_classify_self01.py +63 -0
  1618. orthonym-1.0.0/tests/unit/test_cluster_coverage_tell.py +130 -0
  1619. orthonym-1.0.0/tests/unit/test_coverage_contract.py +372 -0
  1620. orthonym-1.0.0/tests/unit/test_coverage_gates.py +425 -0
  1621. orthonym-1.0.0/tests/unit/test_coverage_veto.py +168 -0
  1622. orthonym-1.0.0/tests/unit/test_cycloalkanes.py +222 -0
  1623. orthonym-1.0.0/tests/unit/test_cycloalkenes.py +226 -0
  1624. orthonym-1.0.0/tests/unit/test_d2_nsubst_diamine.py +154 -0
  1625. orthonym-1.0.0/tests/unit/test_decomposition_stereo.py +419 -0
  1626. orthonym-1.0.0/tests/unit/test_defect_distance_instrument.py +268 -0
  1627. orthonym-1.0.0/tests/unit/test_determinism_lone_pair_spellings.py +100 -0
  1628. orthonym-1.0.0/tests/unit/test_diacids_multisuffix.py +175 -0
  1629. orthonym-1.0.0/tests/unit/test_discover_substituents.py +400 -0
  1630. orthonym-1.0.0/tests/unit/test_e1_numbering_determinism.py +360 -0
  1631. orthonym-1.0.0/tests/unit/test_e2_seniority_cascade.py +275 -0
  1632. orthonym-1.0.0/tests/unit/test_emit_tier_flags.py +127 -0
  1633. orthonym-1.0.0/tests/unit/test_esters.py +907 -0
  1634. orthonym-1.0.0/tests/unit/test_exocyclic_naming.py +385 -0
  1635. orthonym-1.0.0/tests/unit/test_factor_multiple_bond_count.py +271 -0
  1636. orthonym-1.0.0/tests/unit/test_finish_shadow_audit.py +156 -0
  1637. orthonym-1.0.0/tests/unit/test_fragment_naming.py +282 -0
  1638. orthonym-1.0.0/tests/unit/test_functional_groups.py +147 -0
  1639. orthonym-1.0.0/tests/unit/test_functional_groups_naming.py +342 -0
  1640. orthonym-1.0.0/tests/unit/test_g0_fail_closed.py +289 -0
  1641. orthonym-1.0.0/tests/unit/test_g1_bridged_fused.py +132 -0
  1642. orthonym-1.0.0/tests/unit/test_gate_parallel_equivalence.py +142 -0
  1643. orthonym-1.0.0/tests/unit/test_gate_set_regression.py +70 -0
  1644. orthonym-1.0.0/tests/unit/test_gate_stereo_fabrication.py +22 -0
  1645. orthonym-1.0.0/tests/unit/test_general_fallback_wiring.py +342 -0
  1646. orthonym-1.0.0/tests/unit/test_graded_scoring.py +361 -0
  1647. orthonym-1.0.0/tests/unit/test_harness_radical_scoring.py +33 -0
  1648. orthonym-1.0.0/tests/unit/test_harness_run_id.py +36 -0
  1649. orthonym-1.0.0/tests/unit/test_heterocycle_detection.py +861 -0
  1650. orthonym-1.0.0/tests/unit/test_heterocycle_naming.py +755 -0
  1651. orthonym-1.0.0/tests/unit/test_hw_data.py +476 -0
  1652. orthonym-1.0.0/tests/unit/test_hydroperoxides.py +112 -0
  1653. orthonym-1.0.0/tests/unit/test_hyg02_error_catalog.py +181 -0
  1654. orthonym-1.0.0/tests/unit/test_imine_oxime_hydrazone.py +227 -0
  1655. orthonym-1.0.0/tests/unit/test_inline_g1_stereo_conflict.py +131 -0
  1656. orthonym-1.0.0/tests/unit/test_ion_suffix_seam.py +233 -0
  1657. orthonym-1.0.0/tests/unit/test_jars.py +162 -0
  1658. orthonym-1.0.0/tests/unit/test_jars_front_door.py +74 -0
  1659. orthonym-1.0.0/tests/unit/test_jvm_budget.py +273 -0
  1660. orthonym-1.0.0/tests/unit/test_mba172_moving_base_atom.py +110 -0
  1661. orthonym-1.0.0/tests/unit/test_multi_amide_quality_gate.py +143 -0
  1662. orthonym-1.0.0/tests/unit/test_multiplicative.py +247 -0
  1663. orthonym-1.0.0/tests/unit/test_multiplicative_prefix_names.py +96 -0
  1664. orthonym-1.0.0/tests/unit/test_n_oxide_isocyanate_carbamate.py +194 -0
  1665. orthonym-1.0.0/tests/unit/test_n_substituent_naming.py +77 -0
  1666. orthonym-1.0.0/tests/unit/test_name_substituent.py +488 -0
  1667. orthonym-1.0.0/tests/unit/test_name_with_confidence_isotope_v36.py +103 -0
  1668. orthonym-1.0.0/tests/unit/test_name_with_tree_threadsafety.py +39 -0
  1669. orthonym-1.0.0/tests/unit/test_namer_style.py +58 -0
  1670. orthonym-1.0.0/tests/unit/test_nitriles.py +228 -0
  1671. orthonym-1.0.0/tests/unit/test_no_sentinel_emission.py +227 -0
  1672. orthonym-1.0.0/tests/unit/test_np_ester_decoration.py +136 -0
  1673. orthonym-1.0.0/tests/unit/test_offer_at_finish.py +146 -0
  1674. orthonym-1.0.0/tests/unit/test_opsin_gate_test_harness.py +215 -0
  1675. orthonym-1.0.0/tests/unit/test_opsin_validity_gate.py +394 -0
  1676. orthonym-1.0.0/tests/unit/test_peptides.py +442 -0
  1677. orthonym-1.0.0/tests/unit/test_perception_171_gold_tripwires.py +149 -0
  1678. orthonym-1.0.0/tests/unit/test_phase21_opsin_regression.py +187 -0
  1679. orthonym-1.0.0/tests/unit/test_phase25_quick_wins.py +61 -0
  1680. orthonym-1.0.0/tests/unit/test_phase26_ether_fixes.py +218 -0
  1681. orthonym-1.0.0/tests/unit/test_phase26_stereo_fixes.py +219 -0
  1682. orthonym-1.0.0/tests/unit/test_phase27_isoindoline.py +232 -0
  1683. orthonym-1.0.0/tests/unit/test_phase8_boron_group14.py +135 -0
  1684. orthonym-1.0.0/tests/unit/test_phase9_oxoacids_frn.py +550 -0
  1685. orthonym-1.0.0/tests/unit/test_pin_policy.py +488 -0
  1686. orthonym-1.0.0/tests/unit/test_polycyclics.py +417 -0
  1687. orthonym-1.0.0/tests/unit/test_polyfunctional_basic.py +336 -0
  1688. orthonym-1.0.0/tests/unit/test_process_cache.py +60 -0
  1689. orthonym-1.0.0/tests/unit/test_proline_acceptor_peptides.py +86 -0
  1690. orthonym-1.0.0/tests/unit/test_provenance_stereo_flag.py +77 -0
  1691. orthonym-1.0.0/tests/unit/test_pubchem_validator.py +272 -0
  1692. orthonym-1.0.0/tests/unit/test_quality_gate_confidence.py +165 -0
  1693. orthonym-1.0.0/tests/unit/test_registration_hash_gate.py +71 -0
  1694. orthonym-1.0.0/tests/unit/test_ring_locant_coordination.py +118 -0
  1695. orthonym-1.0.0/tests/unit/test_rt_assert_helper.py +48 -0
  1696. orthonym-1.0.0/tests/unit/test_rt_match_stereo_conflict.py +128 -0
  1697. orthonym-1.0.0/tests/unit/test_rt_over_pool.py +262 -0
  1698. orthonym-1.0.0/tests/unit/test_runtime_cache.py +187 -0
  1699. orthonym-1.0.0/tests/unit/test_runtime_tuning.py +45 -0
  1700. orthonym-1.0.0/tests/unit/test_salt_oxidation_state.py +46 -0
  1701. orthonym-1.0.0/tests/unit/test_self01_stereo_completeness.py +73 -0
  1702. orthonym-1.0.0/tests/unit/test_self_consistency_ez.py +84 -0
  1703. orthonym-1.0.0/tests/unit/test_size_cutoff_removal.py +97 -0
  1704. orthonym-1.0.0/tests/unit/test_species_detection_fixes.py +251 -0
  1705. orthonym-1.0.0/tests/unit/test_stereo_integration.py +377 -0
  1706. orthonym-1.0.0/tests/unit/test_stereo_locant_fix.py +169 -0
  1707. orthonym-1.0.0/tests/unit/test_stereo_locant_fixes.py +238 -0
  1708. orthonym-1.0.0/tests/unit/test_stereo_tier_policy.py +238 -0
  1709. orthonym-1.0.0/tests/unit/test_substituent_enumerator.py +454 -0
  1710. orthonym-1.0.0/tests/unit/test_substituent_internal_ez.py +198 -0
  1711. orthonym-1.0.0/tests/unit/test_substituted_cycloalkanes.py +365 -0
  1712. orthonym-1.0.0/tests/unit/test_substituted_heterocycles.py +359 -0
  1713. orthonym-1.0.0/tests/unit/test_t4_floor_offer.py +185 -0
  1714. orthonym-1.0.0/tests/unit/test_t4_floor_offer_fail_closed.py +188 -0
  1715. orthonym-1.0.0/tests/unit/test_t4_rescue_guard.py +41 -0
  1716. orthonym-1.0.0/tests/unit/test_t4_stereo_verify_before_commit_v35.py +72 -0
  1717. orthonym-1.0.0/tests/unit/test_thread_local_cleanup_146.py +51 -0
  1718. orthonym-1.0.0/tests/unit/test_triviality_controller_feature_flag.py +82 -0
  1719. orthonym-1.0.0/tests/unit/test_unsaturation.py +220 -0
  1720. orthonym-1.0.0/tests/unit/test_urea_guanidine.py +221 -0
  1721. orthonym-1.0.0/tests/unit/test_v26_p0_complete_flag.py +133 -0
  1722. orthonym-1.0.0/tests/unit/test_v29_p3close_diagnose_tool.py +372 -0
  1723. orthonym-1.0.0/tests/unit/test_v29_phase4_gate_rejection_retries.py +93 -0
  1724. orthonym-1.0.0/tests/unit/test_v29_phase7_gate_outcome_honesty.py +265 -0
  1725. orthonym-1.0.0/tests/unit/test_valency_fixes.py +368 -0
  1726. orthonym-1.0.0/tests/unit/test_wildcard_failclose.py +55 -0
  1727. orthonym-1.0.0/tests/unit/test_zwitterion_salt.py +155 -0
  1728. orthonym-1.0.0/tests/unit/validation/__init__.py +1 -0
  1729. orthonym-1.0.0/tests/unit/validation/data/token_arity_truths.json +8906 -0
  1730. orthonym-1.0.0/tests/unit/validation/test_atom_coverage_structural.py +281 -0
  1731. orthonym-1.0.0/tests/unit/validation/test_binding_proof_wiring.py +272 -0
  1732. orthonym-1.0.0/tests/unit/validation/test_binding_spine.py +899 -0
  1733. orthonym-1.0.0/tests/unit/validation/test_binding_spine_p8_stereo.py +535 -0
  1734. orthonym-1.0.0/tests/unit/validation/test_coverage_gate.py +96 -0
  1735. orthonym-1.0.0/tests/unit/validation/test_determinism.py +87 -0
  1736. orthonym-1.0.0/tests/unit/validation/test_e1_certificate.py +207 -0
  1737. orthonym-1.0.0/tests/unit/validation/test_extended_smiles_fallback.py +51 -0
  1738. orthonym-1.0.0/tests/unit/validation/test_free_valence_morphology.py +108 -0
  1739. orthonym-1.0.0/tests/unit/validation/test_jvm_bridge_thread_exit.py +67 -0
  1740. orthonym-1.0.0/tests/unit/validation/test_lexicon_disk_cache.py +80 -0
  1741. orthonym-1.0.0/tests/unit/validation/test_name_exits_are_audited.py +372 -0
  1742. orthonym-1.0.0/tests/unit/validation/test_name_morphemes.py +178 -0
  1743. orthonym-1.0.0/tests/unit/validation/test_opsin_grammar.py +654 -0
  1744. orthonym-1.0.0/tests/unit/validation/test_opsin_server_and_cip_cache.py +87 -0
  1745. orthonym-1.0.0/tests/unit/validation/test_opsin_stdout_memo.py +35 -0
  1746. orthonym-1.0.0/tests/unit/validation/test_pin_carveout_atom_coverage.py +295 -0
  1747. orthonym-1.0.0/tests/unit/validation/test_pin_conformance_packs.py +143 -0
  1748. orthonym-1.0.0/tests/unit/validation/test_proof_ledger.py +116 -0
  1749. orthonym-1.0.0/tests/unit/validation/test_protonation_identity.py +134 -0
  1750. orthonym-1.0.0/tests/unit/validation/test_radical_identity.py +85 -0
  1751. orthonym-1.0.0/tests/unit/validation/test_reconstruct.py +138 -0
  1752. orthonym-1.0.0/tests/unit/validation/test_rt_tripwire_is_not_a_gate.py +79 -0
  1753. orthonym-1.0.0/tests/unit/validation/test_spine_free_valence.py +205 -0
  1754. orthonym-1.0.0/tests/unit/validation/test_token_arity_soundness.py +444 -0
  1755. orthonym-1.0.0/tests/unit/validation/test_v29_p2_ring_parent_bindings.py +595 -0
  1756. orthonym-1.0.0/tests/unit/validation/test_v38_p1_warm_opsin.py +155 -0
  1757. orthonym-1.0.0/tests/unit/validation/test_w2_jarabsent_coverage.py +177 -0
  1758. orthonym-1.0.0/tests/validation/__init__.py +1 -0
  1759. orthonym-1.0.0/tests/validation/test_accuracy.py +503 -0
@@ -0,0 +1,85 @@
1
+ name: CI
2
+
3
+ # Lightweight public CI: install the package, confirm it imports and names a
4
+ # handful of molecules correctly, and run advisory linting. Does not depend on
5
+ # the internal benchmark baselines or the large corpora — a contributor's PR can
6
+ # pass this without the full benchmarking apparatus.
7
+
8
+ on:
9
+ push:
10
+ branches: [main]
11
+ pull_request:
12
+ branches: [main]
13
+ workflow_dispatch:
14
+
15
+ env:
16
+ ORTHONYM_REQUIRE_JARS: "1" # a missing jar fails tests instead of skipping them
17
+
18
+ jobs:
19
+ build-and-smoke:
20
+ name: Install + naming smoke test
21
+ runs-on: ubuntu-latest
22
+ timeout-minutes: 15
23
+ steps:
24
+ - uses: actions/checkout@v5
25
+
26
+ - name: Set up Python 3.12
27
+ uses: actions/setup-python@v6
28
+ with:
29
+ python-version: '3.12'
30
+ cache: pip
31
+
32
+ - name: Set up Java 17 (for OPSIN round-trip validation)
33
+ uses: actions/setup-java@v5
34
+ with:
35
+ distribution: temurin
36
+ java-version: '17'
37
+
38
+ - name: Install package
39
+ run: |
40
+ python -m pip install --upgrade pip
41
+ pip install -e ".[dev]"
42
+
43
+ - name: Fetch and verify the OPSIN and centres jars
44
+ # The jars are not in the repository; this downloads them from their
45
+ # official releases and checks the pinned SHA-256 (fails the job otherwise).
46
+ run: orthonym --fetch-jars
47
+
48
+ - name: Naming smoke test
49
+ run: |
50
+ python - <<'PY'
51
+ from orthonym import name_compound
52
+ cases = {
53
+ "CCO": "ethanol",
54
+ "CC(=O)O": "acetic acid",
55
+ "c1ccccc1": "benzene",
56
+ "CCN": "ethanamine",
57
+ }
58
+ fails = []
59
+ for smi, want in cases.items():
60
+ got = name_compound(smi)
61
+ print(f"{smi:12s} -> {got!r} (want {want!r})")
62
+ if got != want:
63
+ fails.append((smi, got, want))
64
+ if fails:
65
+ raise SystemExit(f"smoke test failed: {fails}")
66
+ print("smoke OK")
67
+ PY
68
+
69
+ lint:
70
+ name: Lint (advisory)
71
+ runs-on: ubuntu-latest
72
+ timeout-minutes: 10
73
+ continue-on-error: true
74
+ steps:
75
+ - uses: actions/checkout@v5
76
+ - uses: actions/setup-python@v6
77
+ with:
78
+ python-version: '3.12'
79
+ cache: pip
80
+ - name: Install linters
81
+ run: |
82
+ python -m pip install --upgrade pip
83
+ pip install ruff
84
+ - name: Ruff check (advisory)
85
+ run: ruff check src || true
@@ -0,0 +1,73 @@
1
+ name: Docs
2
+
3
+ # Build the documentation site from guide/ and publish it with GitHub Pages.
4
+ # The build imports the package for the API pages but names no molecule, so
5
+ # it needs neither a Java runtime nor the OPSIN and centres jars.
6
+ # Repository setting needed once: Settings > Pages > Source = GitHub Actions.
7
+ # The site is published from Steinbeck-Lab/Orthonym only. Every other copy of the
8
+ # repository (a mirror or a fork) still builds the site with -W as a check, but
9
+ # neither configures Pages nor deploys, so it needs no Pages setting.
10
+
11
+ on:
12
+ push:
13
+ branches: [main]
14
+ workflow_dispatch:
15
+
16
+ permissions:
17
+ contents: read
18
+ pages: write
19
+ id-token: write
20
+
21
+ concurrency:
22
+ group: pages
23
+ cancel-in-progress: false
24
+
25
+ jobs:
26
+ build:
27
+ name: Build the site
28
+ runs-on: ubuntu-latest
29
+ timeout-minutes: 20
30
+ env:
31
+ ORTHONYM_SKIP_JAR_PREFETCH: "1" # the build names nothing; no jar download at install
32
+ steps:
33
+ - uses: actions/checkout@v5
34
+
35
+ - name: Set up Python 3.12
36
+ uses: actions/setup-python@v6
37
+ with:
38
+ python-version: '3.12'
39
+ cache: pip
40
+
41
+ - name: Install the package and the docs tools
42
+ run: |
43
+ python -m pip install --upgrade pip
44
+ pip install -e ".[docs]"
45
+
46
+ - name: Configure Pages
47
+ id: pages
48
+ if: github.repository == 'Steinbeck-Lab/Orthonym'
49
+ uses: actions/configure-pages@v5
50
+
51
+ - name: Build (warnings are errors)
52
+ env:
53
+ ORTHONYM_DOCS_BASEURL: ${{ steps.pages.outputs.base_url }}
54
+ run: sphinx-build -W -b html guide _build/html
55
+
56
+ - name: Upload the site
57
+ if: github.repository == 'Steinbeck-Lab/Orthonym'
58
+ uses: actions/upload-pages-artifact@v3
59
+ with:
60
+ path: _build/html
61
+
62
+ deploy:
63
+ name: Deploy to GitHub Pages
64
+ needs: build
65
+ if: github.repository == 'Steinbeck-Lab/Orthonym'
66
+ runs-on: ubuntu-latest
67
+ environment:
68
+ name: github-pages
69
+ url: ${{ steps.deployment.outputs.page_url }}
70
+ steps:
71
+ - name: Deploy
72
+ id: deployment
73
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,287 @@
1
+ name: pypi-release
2
+
3
+ # Builds the sdist and the wheel from a release tag, checks them, and uploads them
4
+ # to PyPI with Trusted Publishing (OpenID Connect; no API token secret exists).
5
+ #
6
+ # Started by the GitHub Release that release-please.yml creates. That Release is
7
+ # created with the RELEASE_PLEASE_TOKEN personal access token, so its
8
+ # `release: published` event DOES start this workflow; a Release created with the
9
+ # built-in GITHUB_TOKEN would not (events caused by GITHUB_TOKEN start no new
10
+ # workflow runs).
11
+ #
12
+ # A manual run (workflow_dispatch) rebuilds a given tag and uploads it to TestPyPI
13
+ # by default, or to PyPI when target is `pypi`. A manual PyPI upload must be
14
+ # started FROM the release tag ("Use workflow from: tag vX.Y.Z", or
15
+ # `gh workflow run pypi-release.yml --ref vX.Y.Z -f tag=vX.Y.Z -f target=pypi`):
16
+ # the publish-pypi job refuses any other ref, so a run from a branch (whose copy
17
+ # of this file may differ) can never upload to PyPI.
18
+ #
19
+ # This is a separate top-level workflow, not a reusable one, because Trusted
20
+ # Publishing cannot be used from within a reusable workflow.
21
+ #
22
+ # PyPI is switched on separately: every job also requires the repository variable
23
+ # PYPI_ENABLED == 'true'. Until the maintainer sets it (after the PyPI setup), a
24
+ # Release made by release-please skips this whole workflow. To upload an existing
25
+ # tag later: set PYPI_ENABLED=true, then run this workflow from that tag (see above).
26
+ #
27
+ # Run in ONE home only: every job requires the repository variable
28
+ # RELEASE_HOME == 'true', which is set in the release home only: exactly one
29
+ # home, the one the maintainer's local publish tooling pushes first (see
30
+ # release-please.yml).
31
+ #
32
+ # The approval gate. There is NO human approval step inside this workflow while
33
+ # the repository is private: required reviewers on an environment need a PUBLIC
34
+ # repository on GitHub Free, Pro and Team plans. The human gate is merging the
35
+ # release PR (release-please.yml); the Release that merge produces uploads at
36
+ # once. The `pypi` environment is still used, because the PyPI trusted publisher
37
+ # is bound to it. While the repository is private, restrict the `pypi`
38
+ # environment to the deployment tag rule `v*` (Settings -> Environments ->
39
+ # Deployment branches and tags -> Selected branches and tags; available for
40
+ # private repositories on a user-owned Pro plan; an organization on GitHub Free
41
+ # cannot create environments for a private repository at all). Once the
42
+ # repository is public, add required reviewers to `pypi` as well.
43
+ #
44
+ # One-time setup, outside this file: create the `pypi` and `testpypi`
45
+ # environments first (a workflow that names a missing environment creates it
46
+ # without any protection rules). Then add a (pending) trusted publisher for
47
+ # project `orthonym` on PyPI and, with a separate account, on TestPyPI, naming
48
+ # this repository's owner and name, this workflow file (pypi-release.yml) and the
49
+ # environment (`pypi`, `testpypi`).
50
+ #
51
+ # The upload also publishes digital attestations (on by default with Trusted
52
+ # Publishing); they name the source repository, workflow and commit in a public
53
+ # transparency log, even while the repository is private.
54
+
55
+ on:
56
+ release:
57
+ types: [published]
58
+ workflow_dispatch:
59
+ inputs:
60
+ tag:
61
+ description: 'Release tag to build, e.g. v1.1.0'
62
+ required: true
63
+ type: string
64
+ target:
65
+ description: 'Where to upload the build'
66
+ required: true
67
+ default: testpypi
68
+ type: choice
69
+ options:
70
+ - testpypi
71
+ - pypi
72
+
73
+ permissions:
74
+ contents: read
75
+
76
+ env:
77
+ # The tag to build: the published Release's tag, or the dispatch input. It is
78
+ # only ever read through this variable (never pasted into a script).
79
+ RELEASE_TAG: ${{ github.event_name == 'release' && github.event.release.tag_name || inputs.tag }}
80
+
81
+ jobs:
82
+ build:
83
+ name: Build and check the distributions
84
+ if: vars.RELEASE_HOME == 'true' && vars.PYPI_ENABLED == 'true'
85
+ runs-on: ubuntu-latest
86
+ timeout-minutes: 30
87
+ steps:
88
+ - name: Check the tag name
89
+ run: |
90
+ if ! printf '%s\n' "$RELEASE_TAG" | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]+([.+-][0-9A-Za-z.+-]+)?$'; then
91
+ echo "::error::'$RELEASE_TAG' is not a release tag of the form vX.Y.Z"
92
+ exit 1
93
+ fi
94
+ echo "building tag $RELEASE_TAG"
95
+
96
+ - uses: actions/checkout@v5
97
+ with:
98
+ ref: refs/tags/${{ env.RELEASE_TAG }}
99
+ persist-credentials: false
100
+
101
+ - name: Set up Python 3.12
102
+ uses: actions/setup-python@v6
103
+ with:
104
+ python-version: '3.12'
105
+
106
+ - name: Set up Java 17 (for the OPSIN round-trip in the smoke test)
107
+ uses: actions/setup-java@v5
108
+ with:
109
+ distribution: temurin
110
+ java-version: '17'
111
+
112
+ - name: Install the build tools
113
+ run: |
114
+ python -m pip install --upgrade pip
115
+ pip install build twine
116
+
117
+ - name: Build the sdist and the wheel
118
+ env:
119
+ # The build hook would otherwise download the jars into the runner's
120
+ # cache. They are never part of the distributions either way.
121
+ ORTHONYM_SKIP_JAR_PREFETCH: "1"
122
+ run: python -m build
123
+
124
+ - name: twine check
125
+ run: twine check --strict dist/*
126
+
127
+ - name: No jar inside the wheel or the sdist
128
+ run: |
129
+ shopt -s nullglob
130
+ wheels=(dist/*.whl)
131
+ sdists=(dist/*.tar.gz)
132
+ if [ "${#wheels[@]}" -ne 1 ] || [ "${#sdists[@]}" -ne 1 ]; then
133
+ echo "::error::expected exactly one wheel and one sdist, got: $(ls dist)"
134
+ exit 1
135
+ fi
136
+ python -c 'import sys, zipfile; print("\n".join(zipfile.ZipFile(sys.argv[1]).namelist()))' \
137
+ "${wheels[0]}" > "$RUNNER_TEMP/wheel-files.txt"
138
+ tar -tzf "${sdists[0]}" > "$RUNNER_TEMP/sdist-files.txt"
139
+ echo "wheel: $(wc -l < "$RUNNER_TEMP/wheel-files.txt") files; sdist: $(wc -l < "$RUNNER_TEMP/sdist-files.txt") files"
140
+ if grep -Ei '\.jar$' "$RUNNER_TEMP/wheel-files.txt" "$RUNNER_TEMP/sdist-files.txt"; then
141
+ echo "::error::a jar is inside a distribution; the jars must never be redistributed"
142
+ exit 1
143
+ fi
144
+ echo "no jar in either archive"
145
+
146
+ - name: Versions agree (tag, pyproject.toml, wheel, sdist)
147
+ run: |
148
+ python - <<'PY'
149
+ import os, sys, tarfile, tomllib, zipfile
150
+ from pathlib import Path
151
+ from packaging.version import Version
152
+
153
+ tag = os.environ["RELEASE_TAG"]
154
+ want = tag[1:] # the tag without its leading "v"
155
+ project = tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"]
156
+
157
+ def field(text, name):
158
+ for line in text.splitlines():
159
+ if line.startswith(name + ": "):
160
+ return line.split(": ", 1)[1].strip()
161
+ raise SystemExit(f"no {name} field")
162
+
163
+ whl = next(Path("dist").glob("*.whl"))
164
+ with zipfile.ZipFile(whl) as z:
165
+ meta = next(n for n in z.namelist() if n.endswith(".dist-info/METADATA"))
166
+ wheel_version = field(z.read(meta).decode(), "Version")
167
+ sd = next(Path("dist").glob("*.tar.gz"))
168
+ with tarfile.open(sd) as t:
169
+ info = next(m for m in t.getmembers() if m.name.count("/") == 1 and m.name.endswith("/PKG-INFO"))
170
+ sdist_version = field(t.extractfile(info).read().decode(), "Version")
171
+
172
+ print(f"tag {tag} -> {want}; pyproject {project}; wheel {wheel_version}; sdist {sdist_version}")
173
+ bad = []
174
+ if project != want:
175
+ bad.append(f"pyproject.toml version {project!r} != tag without v {want!r}")
176
+ for label, v in (("wheel", wheel_version), ("sdist", sdist_version)):
177
+ if Version(v) != Version(want):
178
+ bad.append(f"{label} version {v!r} != {want!r}")
179
+ if bad:
180
+ sys.exit("VERSION MISMATCH: " + "; ".join(bad))
181
+ print("versions agree")
182
+ PY
183
+
184
+ - name: Install the wheel into a fresh venv, fetch the jars, smoke test
185
+ run: |
186
+ python -m venv "$RUNNER_TEMP/fresh"
187
+ FRESH="$RUNNER_TEMP/fresh/bin"
188
+ "$FRESH/python" -m pip install --upgrade pip
189
+ "$FRESH/python" -m pip install "$GITHUB_WORKSPACE"/dist/*.whl
190
+ # Run outside the checkout so nothing is imported from the source tree.
191
+ cd "$RUNNER_TEMP"
192
+ "$FRESH/orthonym" --fetch-jars
193
+ "$FRESH/python" - <<'PY'
194
+ from orthonym import name_compound
195
+ cases = {
196
+ "CCO": "ethanol",
197
+ "CC(=O)O": "acetic acid",
198
+ "c1ccccc1": "benzene",
199
+ "CCN": "ethanamine",
200
+ }
201
+ fails = []
202
+ for smi, want in cases.items():
203
+ got = name_compound(smi)
204
+ print(f"{smi:12s} -> {got!r} (want {want!r})")
205
+ if got != want:
206
+ fails.append((smi, got, want))
207
+ if fails:
208
+ raise SystemExit(f"smoke test failed: {fails}")
209
+ print("smoke OK")
210
+ PY
211
+ "$FRESH/python" -c 'import os, orthonym; v = os.environ["RELEASE_TAG"][1:]; assert orthonym.__version__ == v, (orthonym.__version__, v); print("orthonym.__version__ ==", v)'
212
+
213
+ - name: Upload the distributions
214
+ uses: actions/upload-artifact@v6
215
+ with:
216
+ name: dist
217
+ path: dist/
218
+ if-no-files-found: error
219
+
220
+ publish-pypi:
221
+ name: Upload to PyPI
222
+ needs: build
223
+ # A published Release, or a manual run with target=pypi.
224
+ if: >-
225
+ vars.RELEASE_HOME == 'true' && vars.PYPI_ENABLED == 'true' &&
226
+ (github.event_name == 'release' ||
227
+ (github.event_name == 'workflow_dispatch' && inputs.target == 'pypi'))
228
+ runs-on: ubuntu-latest
229
+ timeout-minutes: 15
230
+ environment:
231
+ name: pypi
232
+ url: https://pypi.org/p/orthonym
233
+ permissions:
234
+ id-token: write # Trusted Publishing; no token secret
235
+ steps:
236
+ # A manual run must be started from the tag it uploads, so a run from a
237
+ # branch can never reach PyPI. (This guard lives in the workflow file, which
238
+ # a branch could change; the `v*` deployment tag rule on the `pypi`
239
+ # environment is the check GitHub enforces. Neither stops someone with
240
+ # write access from creating a new v* tag on any commit and uploading from
241
+ # it: only a tag ruleset limiting who may create v* tags, or required
242
+ # reviewers once the repository is public, closes that.)
243
+ - name: Refuse unless running from the release tag
244
+ env:
245
+ REF: ${{ github.ref }}
246
+ run: |
247
+ case "$REF" in
248
+ refs/tags/v*) ;;
249
+ *) echo "::error::this run is on '$REF'; a PyPI upload must run from the release tag (refs/tags/v...)"; exit 1 ;;
250
+ esac
251
+ if [ "$REF" != "refs/tags/$RELEASE_TAG" ]; then
252
+ echo "::error::this run is on '$REF' but uploads '$RELEASE_TAG'; start it from refs/tags/$RELEASE_TAG"
253
+ exit 1
254
+ fi
255
+ echo "running from $REF"
256
+
257
+ - uses: actions/download-artifact@v7
258
+ with:
259
+ name: dist
260
+ path: dist/
261
+
262
+ - name: Publish to PyPI
263
+ uses: pypa/gh-action-pypi-publish@v1.14.2
264
+
265
+ publish-testpypi:
266
+ name: Upload to TestPyPI
267
+ needs: build
268
+ if: >-
269
+ vars.RELEASE_HOME == 'true' && vars.PYPI_ENABLED == 'true' &&
270
+ github.event_name == 'workflow_dispatch' && inputs.target == 'testpypi'
271
+ runs-on: ubuntu-latest
272
+ timeout-minutes: 15
273
+ environment:
274
+ name: testpypi
275
+ url: https://test.pypi.org/p/orthonym
276
+ permissions:
277
+ id-token: write # Trusted Publishing; no token secret
278
+ steps:
279
+ - uses: actions/download-artifact@v7
280
+ with:
281
+ name: dist
282
+ path: dist/
283
+
284
+ - name: Publish to TestPyPI
285
+ uses: pypa/gh-action-pypi-publish@v1.14.2
286
+ with:
287
+ repository-url: https://test.pypi.org/legacy/
@@ -0,0 +1,85 @@
1
+ name: release-please
2
+
3
+ # release-please keeps ONE pull request open that accumulates the next release:
4
+ # the CHANGELOG.md entry, .release-please-manifest.json and the version bump in
5
+ # pyproject.toml ([project] version) and src/orthonym/__init__.py (__version__). The
6
+ # python strategy updates both version files by itself; the `extra-files` entry in
7
+ # release-please-config.json also rewrites the __init__ line through its
8
+ # `x-release-please-version` marker. Merging that PR makes release-please create
9
+ # the tag (vX.Y.Z) and the GitHub Release on the next run.
10
+ #
11
+ # CHANGELOG.md: release-please inserts each release above the previous one, below
12
+ # the file's preamble, in its own format (`## [X.Y.Z](compare link) (date)` and
13
+ # `### Features` / `### Bug Fixes` / ...), not in the Keep a Changelog layout the
14
+ # preamble describes. The first release's compare link points at `v1.0.0`, which
15
+ # is not a tag on GitHub, so that one link does not resolve.
16
+ #
17
+ # Nothing is built or deployed from this workflow. The PyPI upload is a separate
18
+ # workflow (pypi-release.yml), started by the GitHub Release this one creates.
19
+ # Merging the release PR is the human gate for a release: a required-reviewer
20
+ # approval on the `pypi` environment is only available once the repository is
21
+ # public (see pypi-release.yml).
22
+ #
23
+ # Run in ONE home only. The same history is pushed to two repositories
24
+ # (Kohulan/Orthonym and Beilstein-Institut/Orthonym). Only the home whose
25
+ # repository variable RELEASE_HOME is 'true' runs this job, so the other home
26
+ # never opens a release PR and never tags. Set that variable in exactly one home,
27
+ # and it must be the home that the maintainer's local publish tooling pushes
28
+ # first.
29
+ #
30
+ # Versions come from the Conventional Commit types of the commits after
31
+ # `bootstrap-sha` (release-please-config.json) until the first release exists, and
32
+ # after the last release from then on: `!` or a BREAKING CHANGE footer -> major;
33
+ # feat -> minor; fix, perf, deps, revert and docs -> patch (all five appear in the
34
+ # python changelog); chore, ci, build, test, style and refactor alone -> no release.
35
+ # The maintainer's local publish tooling writes those messages; they carry the
36
+ # release type only.
37
+
38
+ on:
39
+ push:
40
+ branches: [main]
41
+ workflow_dispatch:
42
+
43
+ # The action works only with the personal access token passed as `token` below;
44
+ # it never uses the built-in GITHUB_TOKEN, so that token gets read access only.
45
+ permissions:
46
+ contents: read
47
+
48
+ jobs:
49
+ release-please:
50
+ if: vars.RELEASE_HOME == 'true'
51
+ runs-on: ubuntu-latest
52
+ timeout-minutes: 10
53
+ outputs:
54
+ # For the record only: pypi-release.yml starts on the `release: published`
55
+ # event, not from these outputs.
56
+ release_created: ${{ steps.release.outputs.release_created }}
57
+ tag_name: ${{ steps.release.outputs.tag_name }}
58
+ steps:
59
+ - uses: googleapis/release-please-action@v5
60
+ id: release
61
+ with:
62
+ config-file: release-please-config.json
63
+ manifest-file: .release-please-manifest.json
64
+ # A personal access token is REQUIRED here. Both homes report
65
+ # can_approve_pull_request_reviews=false and default_workflow_permissions=read,
66
+ # so the built-in GITHUB_TOKEN cannot open the release PR. A Release made
67
+ # with the PAT also starts pypi-release.yml; one made with GITHUB_TOKEN
68
+ # would not (events caused by GITHUB_TOKEN start no new workflow runs).
69
+ #
70
+ # A fine-grained PAT limited to this one repository, with these
71
+ # repository permissions:
72
+ # Contents: Read and write (release branch, tag, Release)
73
+ # Pull requests: Read and write (the release PR and its labels)
74
+ # Workflows: Read and write (a tag or Release on a commit that
75
+ # changes .github/workflows/ needs it)
76
+ # Issues: Read and write (optional; labels also work through
77
+ # Pull requests)
78
+ # Metadata: Read (added automatically)
79
+ # Its resource owner must be the repository's owner. For an organization
80
+ # repository, an organization member creates it (an outside collaborator
81
+ # cannot), and by default an organization owner must approve it before it
82
+ # can write. It expires (organizations default to at most 366 days):
83
+ # renew it before then. A secret name cannot start with GITHUB_, hence
84
+ # RELEASE_PLEASE_TOKEN.
85
+ token: ${{ secrets.RELEASE_PLEASE_TOKEN }}
@@ -0,0 +1,165 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+
23
+ # Virtual environments
24
+ .venv/
25
+ venv/
26
+ ENV/
27
+
28
+ # IDE
29
+ .idea/
30
+ .vscode/
31
+ *.swp
32
+ *.swo
33
+ *~
34
+
35
+ # Testing
36
+ .tox/
37
+ .coverage
38
+ .coverage.*
39
+ htmlcov/
40
+ .pytest_cache/
41
+ .hypothesis/
42
+
43
+ # Jupyter
44
+ .ipynb_checkpoints/
45
+
46
+ # OS
47
+ .DS_Store
48
+ Thumbs.db
49
+
50
+ # Benchmark output
51
+ benchmark_graded_results.csv
52
+ benchmark_graded_results.json
53
+
54
+ # Local development
55
+ *.local
56
+ .env
57
+
58
+ stereo_gap_trace_results.json
59
+
60
+ # Phase 145: raw corpus caches (too large to commit)
61
+
62
+
63
+
64
+ # Phase 145.1-04: byte-identical verification output dirs (ISS-006)
65
+ tmp_byte_identical_subset/
66
+ tmp_byte_identical_full/
67
+
68
+ # OPSIN reference codebase (vendored at repo root for code reference per the contributor guide;
69
+ # not part of Orthonym source. ~ 14 MB, 8 entries — keep local but untracked.)
70
+ opsin/
71
+
72
+ # Gate run artifacts ( + v22_gate.py completion sentinel)
73
+ gate_verdict.json
74
+ gate_run.log
75
+ # Concurrency locks guarding those artifacts against a second gate. flock-based,
76
+ # so they are never stale -- the kernel releases them even on SIGKILL.
77
+ *.lock
78
+
79
+ # JVM crash dumps. 19 of these had accumulated untracked in the repo root and
80
+ # were acknowledged in NO doc or commit; they are all from the JPype in-process
81
+ # JVM (argv `-Xmx512m -Djava.awt.headless=true --enable-native-access=ALL-UNNAMED`,
82
+ # no `-jar`), 15 within three days. Ignoring them keeps `git status` readable --
83
+ # it does NOT mean they are benign. The open investigation and what is and is not
84
+ # established about their cause: §H4.
85
+ hs_err_pid*.log
86
+ replay_pid*.log
87
+ core.[0-9]*
88
+
89
+ # v37 SP0 census harness output ():
90
+ # a per-molecule JSONL over the full 111,843-unique-SMILES ChEBI corpus is a
91
+ # measurement artifact, not source -- keep it local like output.
92
+
93
+
94
+ # Personal, per-machine Code overrides. This file was TRACKED until
95
+ # 2026-08-04, which put one developer's machine-specific permission allowlist
96
+ # (conda paths, absolute /home paths) into the shared repo and would make any
97
+ # second developer's local overrides collide with it. `./settings.json`
98
+ # stays tracked -- that is the team-wide file, and it carries the agent-teams
99
+ # flag plus the guardrails in the contributor guide. Only the `.local.` sibling is personal.
100
+ ./settings.local.json
101
+
102
+ # ======================================================================
103
+ # Public-release: internal / local-only material (kept on disk, never shipped)
104
+ # ======================================================================
105
+ # Internal planning, agent tooling, and dev docs. Local-only.
106
+
107
+ ./
108
+ .superpowers/
109
+ .agents/
110
+ docs/
111
+
112
+ data/pubchem_cache.json
113
+ # Full internal engineering invariants live here locally; the tracked
114
+ # the contributor guide is the scrubbed public contributor guide.
115
+ .local.md
116
+
117
+ # Internal reports (local-only)
118
+ /TECHNICAL_REPORT.md
119
+ /FAILURE_ANALYSIS.md
120
+ /COMPREHENSIVE_PHASES.md
121
+ /PRODUCT.md
122
+
123
+ # Copyrighted reference document (local-only)
124
+ /IUPAC_BlueBook_Organic_Naming_Guide.docx
125
+
126
+ # Large regenerable data dumps (local-only; derive from ChEBI)
127
+ /ChEBI_IUPAC.txt
128
+ /ChEBI_SMILES.txt
129
+ /ChEBI_IUPAC_OPSIN.txt
130
+ /ChEBI_OPSIN_Retranslation
131
+ /chebi_iupac_filtered.tsv
132
+ /l
133
+
134
+ # Root benchmark / debug artifacts (local-only)
135
+ /benchmark_*.json
136
+ /benchmark_*.csv
137
+ /benchmark_summary.md
138
+ /_drop23_*.json
139
+ /pipeline_traces.json
140
+ /gap_summary.json
141
+ /opsin_all_classifications.json
142
+ /opsin_discrimination.json
143
+ /Untitled.ipynb
144
+ /test_orthonym.ipynb
145
+ /test_bicyclo_check.py
146
+ /test_composer_routing_debug.py
147
+ /test_lactone_detection.py
148
+ /test_pentacyclic_lactone_debug.py
149
+ /test_phase2_fused_rings.py
150
+
151
+ # Reference-engine comparison harnesses + their outputs (local-only; they
152
+ # import external tools not part of Orthonym and are not shipped publicly).
153
+
154
+
155
+ benchmarks/*/rows_reference-engine.jsonl.gz
156
+ benchmarks/*/hh_10k_*.json
157
+
158
+ # Stray leftover test-data snippet (unreferenced)
159
+ /test.tsv
160
+
161
+ # Third-party jars are downloaded at install, never committed
162
+ *.jar
163
+
164
+ # Documentation build output (sphinx-build guide _build/html)
165
+ _build/