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.
- orthonym-1.0.0/.github/workflows/ci.yml +85 -0
- orthonym-1.0.0/.github/workflows/docs.yml +73 -0
- orthonym-1.0.0/.github/workflows/pypi-release.yml +287 -0
- orthonym-1.0.0/.github/workflows/release-please.yml +85 -0
- orthonym-1.0.0/.gitignore +165 -0
- orthonym-1.0.0/.release-please-manifest.json +3 -0
- orthonym-1.0.0/CHANGELOG.md +155 -0
- orthonym-1.0.0/CITATION.cff +33 -0
- orthonym-1.0.0/CODE_OF_CONDUCT.md +57 -0
- orthonym-1.0.0/CONTRIBUTING.md +89 -0
- orthonym-1.0.0/LICENSE +21 -0
- orthonym-1.0.0/NOTICE +118 -0
- orthonym-1.0.0/PKG-INFO +275 -0
- orthonym-1.0.0/README.md +231 -0
- orthonym-1.0.0/SECURITY.md +33 -0
- orthonym-1.0.0/assets/orthonym-logo-dark.png +0 -0
- orthonym-1.0.0/assets/orthonym-logo.png +0 -0
- orthonym-1.0.0/assets/readme-banner-narrow.svg +56 -0
- orthonym-1.0.0/assets/readme-banner.svg +56 -0
- orthonym-1.0.0/assets/readme-beilstein.svg +1 -0
- orthonym-1.0.0/assets/readme-brush-x.svg +1 -0
- orthonym-1.0.0/assets/readme-collab-line-dark.svg +6 -0
- orthonym-1.0.0/assets/readme-collab-line-narrow-dark.svg +6 -0
- orthonym-1.0.0/assets/readme-collab-line-narrow.svg +6 -0
- orthonym-1.0.0/assets/readme-collab-line.svg +6 -0
- orthonym-1.0.0/assets/readme-cup.svg +1 -0
- orthonym-1.0.0/assets/readme-roundtrip-narrow.svg +331 -0
- orthonym-1.0.0/assets/readme-roundtrip.svg +339 -0
- orthonym-1.0.0/assets/readme-specimen-narrow.svg +45 -0
- orthonym-1.0.0/assets/readme-specimen.svg +45 -0
- orthonym-1.0.0/assets/readme-start.svg +6 -0
- orthonym-1.0.0/assets/readme-steinbeck.svg +1 -0
- orthonym-1.0.0/assets/readme-try.svg +6 -0
- orthonym-1.0.0/guide/.impeccable/design.json +697 -0
- orthonym-1.0.0/guide/DESIGN.md +310 -0
- orthonym-1.0.0/guide/_data/accuracy.json +12 -0
- orthonym-1.0.0/guide/_ext/orthonym_cli_docs.py +31 -0
- orthonym-1.0.0/guide/_ext/orthonym_site.py +401 -0
- orthonym-1.0.0/guide/_static/beilstein-dark.svg +50 -0
- orthonym-1.0.0/guide/_static/beilstein.svg +50 -0
- orthonym-1.0.0/guide/_static/favicon.svg +6 -0
- orthonym-1.0.0/guide/_static/fonts/jetbrains-mono-6.woff2 +0 -0
- orthonym-1.0.0/guide/_static/fonts/public-sans-3.woff2 +0 -0
- orthonym-1.0.0/guide/_static/fonts/public-sans-b3.woff2 +0 -0
- orthonym-1.0.0/guide/_static/fonts/public-sans-i3.woff2 +0 -0
- orthonym-1.0.0/guide/_static/fonts/saira-condensed-3.woff2 +0 -0
- orthonym-1.0.0/guide/_static/orthonym-mark.svg +6 -0
- orthonym-1.0.0/guide/_static/orthonym.css +411 -0
- orthonym-1.0.0/guide/_templates/base.html +12 -0
- orthonym-1.0.0/guide/_templates/components/foot-copyright.html +15 -0
- orthonym-1.0.0/guide/_templates/partials/site-head.html +33 -0
- orthonym-1.0.0/guide/_templates/partials/webfonts.html +0 -0
- orthonym-1.0.0/guide/accuracy.md +32 -0
- orthonym-1.0.0/guide/checking.md +48 -0
- orthonym-1.0.0/guide/conf.py +115 -0
- orthonym-1.0.0/guide/declines.md +61 -0
- orthonym-1.0.0/guide/how-it-works.md +37 -0
- orthonym-1.0.0/guide/index.md +164 -0
- orthonym-1.0.0/guide/project/changelog.md +1 -0
- orthonym-1.0.0/guide/project/cite.md +17 -0
- orthonym-1.0.0/guide/project/contributing.md +1 -0
- orthonym-1.0.0/guide/project/licence.md +7 -0
- orthonym-1.0.0/guide/project/llms.md +12 -0
- orthonym-1.0.0/guide/reference/command-line.md +10 -0
- orthonym-1.0.0/guide/reference/internals/index.md +24 -0
- orthonym-1.0.0/guide/reference/python-api.md +58 -0
- orthonym-1.0.0/guide/start/first-name.md +87 -0
- orthonym-1.0.0/guide/start/install.md +65 -0
- orthonym-1.0.0/guide/tiers.md +65 -0
- orthonym-1.0.0/guide/use/batch.md +45 -0
- orthonym-1.0.0/guide/use/browser.md +30 -0
- orthonym-1.0.0/guide/use/command-line.md +82 -0
- orthonym-1.0.0/guide/use/provenance.md +61 -0
- orthonym-1.0.0/guide/use/python.md +95 -0
- orthonym-1.0.0/hatch_build.py +35 -0
- orthonym-1.0.0/pyproject.toml +130 -0
- orthonym-1.0.0/release-please-config.json +20 -0
- orthonym-1.0.0/src/orthonym/__init__.py +43 -0
- orthonym-1.0.0/src/orthonym/__main__.py +98 -0
- orthonym-1.0.0/src/orthonym/assembly/__init__.py +13 -0
- orthonym-1.0.0/src/orthonym/assembly/candidate_pool.py +1344 -0
- orthonym-1.0.0/src/orthonym/assembly/composer.py +12059 -0
- orthonym-1.0.0/src/orthonym/assembly/composition_primitives.py +692 -0
- orthonym-1.0.0/src/orthonym/assembly/composition_tier.py +101 -0
- orthonym-1.0.0/src/orthonym/assembly/coverage_audit.py +126 -0
- orthonym-1.0.0/src/orthonym/assembly/coverage_scoring.py +804 -0
- orthonym-1.0.0/src/orthonym/assembly/coverage_utils.py +48 -0
- orthonym-1.0.0/src/orthonym/assembly/fragment_naming.py +821 -0
- orthonym-1.0.0/src/orthonym/assembly/general_engine.py +2826 -0
- orthonym-1.0.0/src/orthonym/assembly/general_fusion.py +194 -0
- orthonym-1.0.0/src/orthonym/assembly/group_splitting.py +325 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/__init__.py +134 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/_enrichment.py +133 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/_handler_shared.py +3039 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/acid_halide.py +81 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/amide.py +168 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/amine.py +111 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/anhydride.py +60 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/azine.py +183 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/boronic_acid.py +70 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/carbamate.py +57 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/carbamic_acid.py +59 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/chalcogen_ester.py +263 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/chalcogen_oxide.py +118 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/cyanamide.py +65 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/diamide.py +128 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/ester_family.py +395 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/general_acyclic.py +332 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/guanidine.py +58 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/hydrazone.py +97 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/hydroxamic_acid.py +70 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/hydroximic_acid.py +115 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/hydroxylamine.py +600 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/imidate.py +456 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/imidoyl_thioyl_halide.py +59 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/imine.py +80 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/ion_dispatch.py +72 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/isocyanate.py +95 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/isothiocyanate.py +72 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/lactam.py +76 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/lactone.py +152 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/n_oxide.py +120 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/n_substituted_sulfonamide.py +76 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/nitrile_oxide.py +167 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/nitrite_ester.py +105 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/noncarbon_ester.py +62 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/organometallic.py +133 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/oxime.py +270 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/partial_sat.py +148 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/phosphate_ester.py +77 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/phosphine.py +110 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/phosphine_oxide.py +62 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/phosphinic_acid.py +62 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/phosphonic_acid.py +56 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/pnictogen_inate_ester.py +83 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/pnictogen_oxoacid.py +120 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/polycyclic.py +96 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/ring_assembly.py +72 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/ring_ester.py +184 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/ring_nitrile.py +85 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/simple_molecule.py +65 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/sulfate_ester.py +66 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/sulfone.py +83 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/sulfonimidic_n_hydroxy.py +133 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/sulfonyl_halide.py +60 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/sulfoxide.py +90 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/thiocyanate.py +129 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/thioether.py +105 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/thiourea.py +90 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/tier_a_ring.py +646 -0
- orthonym-1.0.0/src/orthonym/assembly/handlers/urea.py +78 -0
- orthonym-1.0.0/src/orthonym/assembly/inner_dispatch.py +1598 -0
- orthonym-1.0.0/src/orthonym/assembly/locant_omission.py +1036 -0
- orthonym-1.0.0/src/orthonym/assembly/memo.py +285 -0
- orthonym-1.0.0/src/orthonym/assembly/name_comparison.py +213 -0
- orthonym-1.0.0/src/orthonym/assembly/name_tree.py +212 -0
- orthonym-1.0.0/src/orthonym/assembly/name_tree_builder.py +169 -0
- orthonym-1.0.0/src/orthonym/assembly/name_tree_to_string.py +374 -0
- orthonym-1.0.0/src/orthonym/assembly/naming_utils.py +4051 -0
- orthonym-1.0.0/src/orthonym/assembly/nested_memo.py +138 -0
- orthonym-1.0.0/src/orthonym/assembly/offer_pool.py +120 -0
- orthonym-1.0.0/src/orthonym/assembly/per_substring_scoring.py +258 -0
- orthonym-1.0.0/src/orthonym/assembly/resolvers.py +606 -0
- orthonym-1.0.0/src/orthonym/assembly/retained_substitution.py +753 -0
- orthonym-1.0.0/src/orthonym/assembly/substituent_enumerator.py +6403 -0
- orthonym-1.0.0/src/orthonym/assembly/substituent_naming.py +8873 -0
- orthonym-1.0.0/src/orthonym/assembly/substituent_prefix_forms.py +2280 -0
- orthonym-1.0.0/src/orthonym/assembly/t4_coverage.py +665 -0
- orthonym-1.0.0/src/orthonym/assembly/universal_substituent.py +3334 -0
- orthonym-1.0.0/src/orthonym/cli.py +639 -0
- orthonym-1.0.0/src/orthonym/data/__init__.py +490 -0
- orthonym-1.0.0/src/orthonym/data/amino_acids.py +725 -0
- orthonym-1.0.0/src/orthonym/data/bicyclo_systems.py +172 -0
- orthonym-1.0.0/src/orthonym/data/bluebook_not_names.py +750 -0
- orthonym-1.0.0/src/orthonym/data/cation_words.py +62 -0
- orthonym-1.0.0/src/orthonym/data/chain_names.py +337 -0
- orthonym-1.0.0/src/orthonym/data/coordination_retained.py +127 -0
- orthonym-1.0.0/src/orthonym/data/fused_heterocycles.py +3258 -0
- orthonym-1.0.0/src/orthonym/data/fusion_components.py +400 -0
- orthonym-1.0.0/src/orthonym/data/group_split_rules.json +46 -0
- orthonym-1.0.0/src/orthonym/data/group_split_rules.py +194 -0
- orthonym-1.0.0/src/orthonym/data/hw_heteroatoms.py +260 -0
- orthonym-1.0.0/src/orthonym/data/hw_stems.py +307 -0
- orthonym-1.0.0/src/orthonym/data/ion_retained_names.py +541 -0
- orthonym-1.0.0/src/orthonym/data/iupac_2013_pin_list.json +274 -0
- orthonym-1.0.0/src/orthonym/data/natural_products.py +762 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/__init__.py +128 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/_phase150_validation.json +1477 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/_roundtrip_report.json +25 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/_validation_report.json +1114 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/amino_acids_opsin.py +4884 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/aryl_groups.py +7782 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/carbohydrates_opsin.py +2505 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/carboxylic_acids_opsin.py +5346 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/cyclic_groups.py +3435 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/functional_terms.py +761 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/fusion_components_opsin.py +2784 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/natural_products_opsin.py +2427 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/regex_tokens_xml.json +5 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/simple_groups.py +8895 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/substituent_names_opsin.py +8496 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/suffix_rules.py +431 -0
- orthonym-1.0.0/src/orthonym/data/opsin_imports/word_rules.py +71 -0
- orthonym-1.0.0/src/orthonym/data/organometallics.py +261 -0
- orthonym-1.0.0/src/orthonym/data/partial_saturation_refs.py +449 -0
- orthonym-1.0.0/src/orthonym/data/pin_policy.py +73 -0
- orthonym-1.0.0/src/orthonym/data/polycyclic_data.py +1095 -0
- orthonym-1.0.0/src/orthonym/data/resonance_templates.py +214 -0
- orthonym-1.0.0/src/orthonym/data/retained_names.py +955 -0
- orthonym-1.0.0/src/orthonym/data/sugar_names.py +4635 -0
- orthonym-1.0.0/src/orthonym/data/trivial_acids.py +169 -0
- orthonym-1.0.0/src/orthonym/data/triviality_controller_seed.json +752 -0
- orthonym-1.0.0/src/orthonym/data/triviality_controller_seed.py +250 -0
- orthonym-1.0.0/src/orthonym/data/xanthine_derivatives.py +289 -0
- orthonym-1.0.0/src/orthonym/decomposition/__init__.py +21 -0
- orthonym-1.0.0/src/orthonym/decomposition/bond_cleavage.py +734 -0
- orthonym-1.0.0/src/orthonym/decomposition/engine.py +2304 -0
- orthonym-1.0.0/src/orthonym/decomposition/fragment_assembly.py +2604 -0
- orthonym-1.0.0/src/orthonym/decomposition/fragment_capping.py +193 -0
- orthonym-1.0.0/src/orthonym/decomposition/fragment_ranker.py +139 -0
- orthonym-1.0.0/src/orthonym/decomposition/weave.py +663 -0
- orthonym-1.0.0/src/orthonym/diagnostics.py +46 -0
- orthonym-1.0.0/src/orthonym/errors.py +418 -0
- orthonym-1.0.0/src/orthonym/jars.py +276 -0
- orthonym-1.0.0/src/orthonym/jvm_bridge.py +480 -0
- orthonym-1.0.0/src/orthonym/jvm_budget.py +327 -0
- orthonym-1.0.0/src/orthonym/jvm_flags.py +152 -0
- orthonym-1.0.0/src/orthonym/metrics/__init__.py +6 -0
- orthonym-1.0.0/src/orthonym/metrics/abstention.py +162 -0
- orthonym-1.0.0/src/orthonym/metrics/breadth.py +768 -0
- orthonym-1.0.0/src/orthonym/metrics/candidate_ledger.py +186 -0
- orthonym-1.0.0/src/orthonym/metrics/coverage_metrics.py +262 -0
- orthonym-1.0.0/src/orthonym/metrics/provenance.py +532 -0
- orthonym-1.0.0/src/orthonym/namer.py +10184 -0
- orthonym-1.0.0/src/orthonym/perception/centres_bridge.py +420 -0
- orthonym-1.0.0/src/orthonym/perception/chains.py +1385 -0
- orthonym-1.0.0/src/orthonym/perception/functional_groups.py +1667 -0
- orthonym-1.0.0/src/orthonym/perception/ions.py +711 -0
- orthonym-1.0.0/src/orthonym/perception/lambda_hydride.py +52 -0
- orthonym-1.0.0/src/orthonym/perception/lipids.py +398 -0
- orthonym-1.0.0/src/orthonym/perception/metals.py +856 -0
- orthonym-1.0.0/src/orthonym/perception/molcache.py +163 -0
- orthonym-1.0.0/src/orthonym/perception/natural_products.py +443 -0
- orthonym-1.0.0/src/orthonym/perception/rings.py +465 -0
- orthonym-1.0.0/src/orthonym/perception/smarts_cache.py +18 -0
- orthonym-1.0.0/src/orthonym/perception/stereo.py +652 -0
- orthonym-1.0.0/src/orthonym/perception/structure_conservation.py +525 -0
- orthonym-1.0.0/src/orthonym/routing/__init__.py +43 -0
- orthonym-1.0.0/src/orthonym/routing/dispatch_table.py +2810 -0
- orthonym-1.0.0/src/orthonym/routing/dispatcher.py +228 -0
- orthonym-1.0.0/src/orthonym/rules/__init__.py +15 -0
- orthonym-1.0.0/src/orthonym/rules/acid_ester_anion.py +273 -0
- orthonym-1.0.0/src/orthonym/rules/acid_halides.py +1082 -0
- orthonym-1.0.0/src/orthonym/rules/added_carbon_parent.py +435 -0
- orthonym-1.0.0/src/orthonym/rules/adducts.py +516 -0
- orthonym-1.0.0/src/orthonym/rules/amides.py +965 -0
- orthonym-1.0.0/src/orthonym/rules/amino_acids.py +587 -0
- orthonym-1.0.0/src/orthonym/rules/anhydrides.py +1321 -0
- orthonym-1.0.0/src/orthonym/rules/benzene.py +5794 -0
- orthonym-1.0.0/src/orthonym/rules/bicyclo.py +1155 -0
- orthonym-1.0.0/src/orthonym/rules/bridged_fused.py +1937 -0
- orthonym-1.0.0/src/orthonym/rules/catenated_hydrides.py +516 -0
- orthonym-1.0.0/src/orthonym/rules/charged_router.py +3177 -0
- orthonym-1.0.0/src/orthonym/rules/conjugate_controller.py +298 -0
- orthonym-1.0.0/src/orthonym/rules/cycloalkanes.py +901 -0
- orthonym-1.0.0/src/orthonym/rules/esters.py +4064 -0
- orthonym-1.0.0/src/orthonym/rules/functional_replacement.py +375 -0
- orthonym-1.0.0/src/orthonym/rules/fused_ring_selection.py +329 -0
- orthonym-1.0.0/src/orthonym/rules/fused_rings.py +4804 -0
- orthonym-1.0.0/src/orthonym/rules/fusion_descriptors.py +1617 -0
- orthonym-1.0.0/src/orthonym/rules/fusion_numbering.py +580 -0
- orthonym-1.0.0/src/orthonym/rules/fusion_orientation.py +843 -0
- orthonym-1.0.0/src/orthonym/rules/greek_stereo_descriptors.py +21 -0
- orthonym-1.0.0/src/orthonym/rules/heterocycles.py +5199 -0
- orthonym-1.0.0/src/orthonym/rules/inorganic_acids.py +2251 -0
- orthonym-1.0.0/src/orthonym/rules/inositols.py +161 -0
- orthonym-1.0.0/src/orthonym/rules/ions.py +6991 -0
- orthonym-1.0.0/src/orthonym/rules/isotopes.py +3145 -0
- orthonym-1.0.0/src/orthonym/rules/ketenes.py +162 -0
- orthonym-1.0.0/src/orthonym/rules/lactams.py +589 -0
- orthonym-1.0.0/src/orthonym/rules/lactones.py +892 -0
- orthonym-1.0.0/src/orthonym/rules/lambda_convention.py +100 -0
- orthonym-1.0.0/src/orthonym/rules/lipids.py +705 -0
- orthonym-1.0.0/src/orthonym/rules/locant_validation.py +251 -0
- orthonym-1.0.0/src/orthonym/rules/locants.py +937 -0
- orthonym-1.0.0/src/orthonym/rules/mononuclear_hydrides.py +1521 -0
- orthonym-1.0.0/src/orthonym/rules/multiplicative.py +5015 -0
- orthonym-1.0.0/src/orthonym/rules/natural_products.py +2509 -0
- orthonym-1.0.0/src/orthonym/rules/nitramide.py +229 -0
- orthonym-1.0.0/src/orthonym/rules/nitriles.py +200 -0
- orthonym-1.0.0/src/orthonym/rules/nucleosides.py +497 -0
- orthonym-1.0.0/src/orthonym/rules/oligosaccharides.py +1696 -0
- orthonym-1.0.0/src/orthonym/rules/organometallics.py +1530 -0
- orthonym-1.0.0/src/orthonym/rules/ortho_fused.py +673 -0
- orthonym-1.0.0/src/orthonym/rules/p44_scorer.py +606 -0
- orthonym-1.0.0/src/orthonym/rules/parent_correctness.py +287 -0
- orthonym-1.0.0/src/orthonym/rules/parent_ranking.py +384 -0
- orthonym-1.0.0/src/orthonym/rules/parent_selection.py +1013 -0
- orthonym-1.0.0/src/orthonym/rules/partial_saturation.py +2982 -0
- orthonym-1.0.0/src/orthonym/rules/peptides.py +1728 -0
- orthonym-1.0.0/src/orthonym/rules/phane.py +1423 -0
- orthonym-1.0.0/src/orthonym/rules/phosphorus.py +2024 -0
- orthonym-1.0.0/src/orthonym/rules/pin_vocabulary.py +817 -0
- orthonym-1.0.0/src/orthonym/rules/polyazane.py +801 -0
- orthonym-1.0.0/src/orthonym/rules/polychalcogen.py +679 -0
- orthonym-1.0.0/src/orthonym/rules/polycyclic.py +4341 -0
- orthonym-1.0.0/src/orthonym/rules/polycyclic_bridged.py +565 -0
- orthonym-1.0.0/src/orthonym/rules/polycyclic_von_baeyer.py +286 -0
- orthonym-1.0.0/src/orthonym/rules/polycyclics.py +2444 -0
- orthonym-1.0.0/src/orthonym/rules/polyfunctional.py +4197 -0
- orthonym-1.0.0/src/orthonym/rules/polyol_polyester.py +323 -0
- orthonym-1.0.0/src/orthonym/rules/pseudoketones.py +541 -0
- orthonym-1.0.0/src/orthonym/rules/purine.py +572 -0
- orthonym-1.0.0/src/orthonym/rules/purine_oxo.py +210 -0
- orthonym-1.0.0/src/orthonym/rules/radicals.py +2044 -0
- orthonym-1.0.0/src/orthonym/rules/ring_assemblies.py +3552 -0
- orthonym-1.0.0/src/orthonym/rules/ring_chalcogen_oxide.py +313 -0
- orthonym-1.0.0/src/orthonym/rules/ring_replacement.py +361 -0
- orthonym-1.0.0/src/orthonym/rules/ring_selection.py +985 -0
- orthonym-1.0.0/src/orthonym/rules/ring_substituents.py +4830 -0
- orthonym-1.0.0/src/orthonym/rules/ring_unsaturation.py +141 -0
- orthonym-1.0.0/src/orthonym/rules/salts.py +1399 -0
- orthonym-1.0.0/src/orthonym/rules/seniority.py +1248 -0
- orthonym-1.0.0/src/orthonym/rules/skeletal_replacement.py +1809 -0
- orthonym-1.0.0/src/orthonym/rules/spiro.py +6304 -0
- orthonym-1.0.0/src/orthonym/rules/stereochemistry.py +1616 -0
- orthonym-1.0.0/src/orthonym/rules/steroid_stereo.py +321 -0
- orthonym-1.0.0/src/orthonym/rules/substituent_purity.py +289 -0
- orthonym-1.0.0/src/orthonym/rules/sulfonamides.py +449 -0
- orthonym-1.0.0/src/orthonym/rules/sulfur.py +794 -0
- orthonym-1.0.0/src/orthonym/rules/sulfur_oxoacid.py +283 -0
- orthonym-1.0.0/src/orthonym/rules/terminal_fragment.py +770 -0
- orthonym-1.0.0/src/orthonym/rules/terminal_ring.py +709 -0
- orthonym-1.0.0/src/orthonym/rules/thioimides.py +199 -0
- orthonym-1.0.0/src/orthonym/rules/tricyclo.py +862 -0
- orthonym-1.0.0/src/orthonym/rules/vonbaeyer_universal.py +918 -0
- orthonym-1.0.0/src/orthonym/runtime_tuning.py +70 -0
- orthonym-1.0.0/src/orthonym/validation/__init__.py +38 -0
- orthonym-1.0.0/src/orthonym/validation/atom_coverage.py +396 -0
- orthonym-1.0.0/src/orthonym/validation/binding_spine.py +1976 -0
- orthonym-1.0.0/src/orthonym/validation/coverage_gate.py +204 -0
- orthonym-1.0.0/src/orthonym/validation/dual_validator.py +298 -0
- orthonym-1.0.0/src/orthonym/validation/e1_certificate.py +240 -0
- orthonym-1.0.0/src/orthonym/validation/format_validator.py +367 -0
- orthonym-1.0.0/src/orthonym/validation/name_morphemes.py +1632 -0
- orthonym-1.0.0/src/orthonym/validation/opsin_grammar.py +752 -0
- orthonym-1.0.0/src/orthonym/validation/opsin_roundtrip.py +343 -0
- orthonym-1.0.0/src/orthonym/validation/opsin_server.py +153 -0
- orthonym-1.0.0/src/orthonym/validation/proof_ledger.py +149 -0
- orthonym-1.0.0/src/orthonym/validation/protonation_identity.py +63 -0
- orthonym-1.0.0/src/orthonym/validation/pubchem_validator.py +156 -0
- orthonym-1.0.0/src/orthonym/validation/radical_identity.py +116 -0
- orthonym-1.0.0/src/orthonym/validation/reconstruct.py +271 -0
- orthonym-1.0.0/tests/benchmarks/__init__.py +0 -0
- orthonym-1.0.0/tests/benchmarks/test_cfr_dispatch_performance.py +114 -0
- orthonym-1.0.0/tests/benchmarks/test_decomp_performance.py +136 -0
- orthonym-1.0.0/tests/canary/canary_diaryl_methyl.csv +8 -0
- orthonym-1.0.0/tests/canary/canary_functional_replacement.csv +37 -0
- orthonym-1.0.0/tests/canary/canary_ml_rule_based_success.csv +101 -0
- orthonym-1.0.0/tests/canary/canary_organometallics.csv +54 -0
- orthonym-1.0.0/tests/canary/canary_post_160.1.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_post_160.2.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_post_168.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_post_169.5.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_post_169.7_start.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_post_169.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_post_171_start.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_post_blockers_fix_160.1.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_post_cfr_158.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_post_decomp_160.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_post_subenum_fix_160.1.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_pre_168.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_pre_cfr_158.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_pre_decomp_160.csv +1283 -0
- orthonym-1.0.0/tests/canary/canary_triviality_controller.csv +88 -0
- orthonym-1.0.0/tests/conftest.py +600 -0
- orthonym-1.0.0/tests/data/cip_validation/compounds.smi +300 -0
- orthonym-1.0.0/tests/data/cip_validation/rdkit_cip_results.txt +237 -0
- orthonym-1.0.0/tests/data/stereo_handlers/benzene/cases.json +47 -0
- orthonym-1.0.0/tests/data/stereo_handlers/complex_ring/cases.json +107 -0
- orthonym-1.0.0/tests/data/stereo_handlers/cycloalkane/cases.json +50 -0
- orthonym-1.0.0/tests/data/stereo_handlers/cycloalkene/cases.json +37 -0
- orthonym-1.0.0/tests/data/stereo_handlers/cycloalkene_8plus/cases.json +62 -0
- orthonym-1.0.0/tests/data/stereo_handlers/heterocycle/cases.json +63 -0
- orthonym-1.0.0/tests/e2e/test_phase12_ring_chain.py +387 -0
- orthonym-1.0.0/tests/e2e/test_phase13_ions_radicals.py +632 -0
- orthonym-1.0.0/tests/fixtures/benzo_fusion/audit_c_results.json +227 -0
- orthonym-1.0.0/tests/fixtures/benzo_fusion/corpus_mined.json +182 -0
- orthonym-1.0.0/tests/fixtures/chain_freeze_1_500.json +502 -0
- orthonym-1.0.0/tests/fixtures/cyclophane/blue_book_examples.json +117 -0
- orthonym-1.0.0/tests/fixtures/cyclophane/corpus_mined.json +104 -0
- orthonym-1.0.0/tests/fixtures/ester_freeze.json +55 -0
- orthonym-1.0.0/tests/fixtures/handler_tree_probes.json +44 -0
- orthonym-1.0.0/tests/fixtures/indicated_h/audit_b_results.json +1388 -0
- orthonym-1.0.0/tests/fixtures/indicated_h/corpus_mined.json +272 -0
- orthonym-1.0.0/tests/fixtures/multiplicative/blue_book_examples.json +452 -0
- orthonym-1.0.0/tests/fixtures/multiplicative/corpus_mined.json +9557 -0
- orthonym-1.0.0/tests/fixtures/multiplicative/opsin_bridge_inventory.json +758 -0
- orthonym-1.0.0/tests/fixtures/phase_145/chebi_fixture.csv +6 -0
- orthonym-1.0.0/tests/fixtures/phase_145/chebi_sample_5.tsv +5 -0
- orthonym-1.0.0/tests/fixtures/phase_145/opsin_selftest_fixture.csv +6 -0
- orthonym-1.0.0/tests/fixtures/phase_145/pubchem_cid_iupac_sample.tsv +10 -0
- orthonym-1.0.0/tests/fixtures/phase_145/pubchem_cid_smiles_sample.tsv +11 -0
- orthonym-1.0.0/tests/fixtures/phase_145/pubchem_fixture.csv +6 -0
- orthonym-1.0.0/tests/fixtures/ring_systems/assemblies/blue_book_examples.json +146 -0
- orthonym-1.0.0/tests/fixtures/ring_systems/assemblies/corpus_mined.json +16 -0
- orthonym-1.0.0/tests/fixtures/ring_systems/assemblies/literature_validated.json +146 -0
- orthonym-1.0.0/tests/fixtures/ring_systems/spiro/anti_canary.json +132 -0
- orthonym-1.0.0/tests/fixtures/ring_systems/spiro/blue_book_examples.json +262 -0
- orthonym-1.0.0/tests/fixtures/ring_systems/spiro/corpus_mined.json +353 -0
- orthonym-1.0.0/tests/fixtures/ring_systems/vb/blue_book_examples.json +158 -0
- orthonym-1.0.0/tests/fixtures/ring_systems/vb/corpus_mined.json +475 -0
- orthonym-1.0.0/tests/fixtures/serializer_flip_snapshot.csv +19 -0
- orthonym-1.0.0/tests/fixtures/skeletal_replacement/blue_book_examples.json +134 -0
- orthonym-1.0.0/tests/fixtures/skeletal_replacement/corpus_mined.json +11330 -0
- orthonym-1.0.0/tests/integration/__init__.py +1 -0
- orthonym-1.0.0/tests/integration/test_160_1_regression_fixtures.py +298 -0
- orthonym-1.0.0/tests/integration/test_accuracy_fixes_e2e.py +309 -0
- orthonym-1.0.0/tests/integration/test_algorithmic_fusion.py +464 -0
- orthonym-1.0.0/tests/integration/test_amide_n_substitution.py +143 -0
- orthonym-1.0.0/tests/integration/test_amide_ring_subs.py +96 -0
- orthonym-1.0.0/tests/integration/test_amino_acid_format.py +166 -0
- orthonym-1.0.0/tests/integration/test_aspect_routing.py +285 -0
- orthonym-1.0.0/tests/integration/test_assembly_hardening.py +357 -0
- orthonym-1.0.0/tests/integration/test_assembly_prefix_suffix.py +67 -0
- orthonym-1.0.0/tests/integration/test_assembly_vs_multiplicative_dispatch.py +174 -0
- orthonym-1.0.0/tests/integration/test_bare_oxy_fixes.py +174 -0
- orthonym-1.0.0/tests/integration/test_behavioral_freeze.py +43 -0
- orthonym-1.0.0/tests/integration/test_benchmark_multi_corpus.py +157 -0
- orthonym-1.0.0/tests/integration/test_benzo_fusion_corpus.py +196 -0
- orthonym-1.0.0/tests/integration/test_branch_review_fixes.py +875 -0
- orthonym-1.0.0/tests/integration/test_breadth_job1.py +341 -0
- orthonym-1.0.0/tests/integration/test_breadth_zinc_loss.py +133 -0
- orthonym-1.0.0/tests/integration/test_byte_identical_145_1.py +113 -0
- orthonym-1.0.0/tests/integration/test_caffeine_naming.py +222 -0
- orthonym-1.0.0/tests/integration/test_calibrated_gate.py +339 -0
- orthonym-1.0.0/tests/integration/test_canary_connectivity.py +66 -0
- orthonym-1.0.0/tests/integration/test_canary_functional_replacement.py +208 -0
- orthonym-1.0.0/tests/integration/test_canary_name_stability.py +3041 -0
- orthonym-1.0.0/tests/integration/test_canary_organometallics.py +195 -0
- orthonym-1.0.0/tests/integration/test_canary_rt75.py +3302 -0
- orthonym-1.0.0/tests/integration/test_centres_bridge.py +275 -0
- orthonym-1.0.0/tests/integration/test_cfr_dispatch_consistency.py +293 -0
- orthonym-1.0.0/tests/integration/test_cfr_dispatch_recursion.py +226 -0
- orthonym-1.0.0/tests/integration/test_chain_substituent_completeness.py +217 -0
- orthonym-1.0.0/tests/integration/test_chain_universal_pipeline.py +107 -0
- orthonym-1.0.0/tests/integration/test_charge_ion_rt.py +454 -0
- orthonym-1.0.0/tests/integration/test_ci_benchmark.py +558 -0
- orthonym-1.0.0/tests/integration/test_cip_validation.py +571 -0
- orthonym-1.0.0/tests/integration/test_claims_code_a.py +227 -0
- orthonym-1.0.0/tests/integration/test_claims_conformance_exit_check.py +218 -0
- orthonym-1.0.0/tests/integration/test_claims_conformance_shown_names.py +148 -0
- orthonym-1.0.0/tests/integration/test_complex_ring_subs_phase119.py +145 -0
- orthonym-1.0.0/tests/integration/test_complex_rings_integration.py +338 -0
- orthonym-1.0.0/tests/integration/test_confidence_api.py +185 -0
- orthonym-1.0.0/tests/integration/test_coverage_gate_refactor.py +181 -0
- orthonym-1.0.0/tests/integration/test_cq_fallthrough.py +201 -0
- orthonym-1.0.0/tests/integration/test_cq_fallthrough2.py +236 -0
- orthonym-1.0.0/tests/integration/test_cq_tier_superset.py +70 -0
- orthonym-1.0.0/tests/integration/test_cq_total_recursion.py +126 -0
- orthonym-1.0.0/tests/integration/test_cyclophane_corpus.py +197 -0
- orthonym-1.0.0/tests/integration/test_decomp_dump_tree_cli.py +174 -0
- orthonym-1.0.0/tests/integration/test_decomp_handler_consistency.py +144 -0
- orthonym-1.0.0/tests/integration/test_decomp_module_level_export.py +40 -0
- orthonym-1.0.0/tests/integration/test_decomp_name_with_tree.py +213 -0
- orthonym-1.0.0/tests/integration/test_decomposition_e2e.py +395 -0
- orthonym-1.0.0/tests/integration/test_decomposition_ether.py +139 -0
- orthonym-1.0.0/tests/integration/test_decomposition_fragment_fallback.py +206 -0
- orthonym-1.0.0/tests/integration/test_decomposition_iterative.py +250 -0
- orthonym-1.0.0/tests/integration/test_decomposition_new_bonds.py +617 -0
- orthonym-1.0.0/tests/integration/test_decomposition_regression.py +257 -0
- orthonym-1.0.0/tests/integration/test_decomposition_seniority.py +203 -0
- orthonym-1.0.0/tests/integration/test_decomposition_seniority_swap.py +242 -0
- orthonym-1.0.0/tests/integration/test_determinism_np_aromatic_locants.py +243 -0
- orthonym-1.0.0/tests/integration/test_deterministic_output.py +327 -0
- orthonym-1.0.0/tests/integration/test_discover_substituents_integration.py +457 -0
- orthonym-1.0.0/tests/integration/test_dot_disconnected.py +111 -0
- orthonym-1.0.0/tests/integration/test_drop07_drop17_canary.py +67 -0
- orthonym-1.0.0/tests/integration/test_ester_behavioral_freeze.py +44 -0
- orthonym-1.0.0/tests/integration/test_ester_family_d16_unwrap.py +172 -0
- orthonym-1.0.0/tests/integration/test_ester_lipid_format.py +371 -0
- orthonym-1.0.0/tests/integration/test_fatty_acid_phospholipid.py +203 -0
- orthonym-1.0.0/tests/integration/test_fg_drop_audit.py +224 -0
- orthonym-1.0.0/tests/integration/test_format_decomposition_fixes.py +204 -0
- orthonym-1.0.0/tests/integration/test_foundation_e2e.py +312 -0
- orthonym-1.0.0/tests/integration/test_fragment_e2e.py +267 -0
- orthonym-1.0.0/tests/integration/test_frn_byte_identical_v18_canary.py +158 -0
- orthonym-1.0.0/tests/integration/test_fused_het_compound_prefix.py +204 -0
- orthonym-1.0.0/tests/integration/test_fused_het_inner_subs_expanded.py +257 -0
- orthonym-1.0.0/tests/integration/test_fused_het_prefix_opsin_rt.py +147 -0
- orthonym-1.0.0/tests/integration/test_fused_het_retained_names.py +45 -0
- orthonym-1.0.0/tests/integration/test_fused_het_wiring.py +91 -0
- orthonym-1.0.0/tests/integration/test_fused_heterocycle_locant_verification.py +326 -0
- orthonym-1.0.0/tests/integration/test_fused_heterocycle_routing.py +214 -0
- orthonym-1.0.0/tests/integration/test_fused_heterocycles_e2e.py +439 -0
- orthonym-1.0.0/tests/integration/test_glycoside_naming.py +407 -0
- orthonym-1.0.0/tests/integration/test_handler_retrofit.py +829 -0
- orthonym-1.0.0/tests/integration/test_handler_stereo_roundtrip.py +398 -0
- orthonym-1.0.0/tests/integration/test_handler_tree_contract.py +192 -0
- orthonym-1.0.0/tests/integration/test_heterocycles_e2e.py +343 -0
- orthonym-1.0.0/tests/integration/test_indicated_h_corpus.py +185 -0
- orthonym-1.0.0/tests/integration/test_ion_naming.py +259 -0
- orthonym-1.0.0/tests/integration/test_ion_zwitterion_macrocyclic.py +228 -0
- orthonym-1.0.0/tests/integration/test_lipid_roundtrip.py +93 -0
- orthonym-1.0.0/tests/integration/test_long_alkane_names.py +59 -0
- orthonym-1.0.0/tests/integration/test_low_heavy_atom_rescue.py +132 -0
- orthonym-1.0.0/tests/integration/test_macrocyclic_format.py +230 -0
- orthonym-1.0.0/tests/integration/test_malformed_suffixes.py +81 -0
- orthonym-1.0.0/tests/integration/test_medium_parent_fixes.py +534 -0
- orthonym-1.0.0/tests/integration/test_medium_parent_fixes.py.tmp.1647.1772545967863 +411 -0
- orthonym-1.0.0/tests/integration/test_medium_stereo_charge.py +240 -0
- orthonym-1.0.0/tests/integration/test_misc_format_fixes.py +62 -0
- orthonym-1.0.0/tests/integration/test_missing_compound_classes.py +459 -0
- orthonym-1.0.0/tests/integration/test_mixed_spiro_fused_dispatch.py +145 -0
- orthonym-1.0.0/tests/integration/test_multi_bond_e2e.py +252 -0
- orthonym-1.0.0/tests/integration/test_multi_ester.py +175 -0
- orthonym-1.0.0/tests/integration/test_multi_ester_complex.py +134 -0
- orthonym-1.0.0/tests/integration/test_multi_ring_roundtrip.py +265 -0
- orthonym-1.0.0/tests/integration/test_multiplicative_corpus.py +232 -0
- orthonym-1.0.0/tests/integration/test_n_prefix_grouping.py +86 -0
- orthonym-1.0.0/tests/integration/test_name_substituent_integration.py +281 -0
- orthonym-1.0.0/tests/integration/test_natural_products_e2e.py +631 -0
- orthonym-1.0.0/tests/integration/test_near_tie_selection.py +132 -0
- orthonym-1.0.0/tests/integration/test_np_backbone_regression.py +349 -0
- orthonym-1.0.0/tests/integration/test_opsin_format_acyl.py +319 -0
- orthonym-1.0.0/tests/integration/test_opsin_format_compliance.py +513 -0
- orthonym-1.0.0/tests/integration/test_opsin_format_heterocycles.py +188 -0
- orthonym-1.0.0/tests/integration/test_opsin_format_stereo.py +667 -0
- orthonym-1.0.0/tests/integration/test_opsin_format_validation.py +448 -0
- orthonym-1.0.0/tests/integration/test_opsin_format_vb.py +148 -0
- orthonym-1.0.0/tests/integration/test_opsin_grammar_integration.py +526 -0
- orthonym-1.0.0/tests/integration/test_opsin_phase17_validation.py +333 -0
- orthonym-1.0.0/tests/integration/test_opsin_retained_roundtrip.py +274 -0
- orthonym-1.0.0/tests/integration/test_opsin_roundtrip_validation.py +120 -0
- orthonym-1.0.0/tests/integration/test_organometallics.py +131 -0
- orthonym-1.0.0/tests/integration/test_orgm_byte_identical_v18_canary.py +135 -0
- orthonym-1.0.0/tests/integration/test_oversimplified_naming.py +281 -0
- orthonym-1.0.0/tests/integration/test_p2_labels_public_claims.py +102 -0
- orthonym-1.0.0/tests/integration/test_parent_mismatch_benchmark.py +551 -0
- orthonym-1.0.0/tests/integration/test_parenthesization_fixes.py +285 -0
- orthonym-1.0.0/tests/integration/test_peptide_ester_regression.py +273 -0
- orthonym-1.0.0/tests/integration/test_phane_vs_ring_assembly_dispatch.py +188 -0
- orthonym-1.0.0/tests/integration/test_phase105_canary.py +61 -0
- orthonym-1.0.0/tests/integration/test_phase147_cascade_activation.py +437 -0
- orthonym-1.0.0/tests/integration/test_phase149_cascade_activation.py +353 -0
- orthonym-1.0.0/tests/integration/test_phase14_6_e2e.py +244 -0
- orthonym-1.0.0/tests/integration/test_phase14_7_e2e.py +270 -0
- orthonym-1.0.0/tests/integration/test_phase23_e2e.py +453 -0
- orthonym-1.0.0/tests/integration/test_phase6_e2e.py +759 -0
- orthonym-1.0.0/tests/integration/test_phase8_e2e.py +433 -0
- orthonym-1.0.0/tests/integration/test_phenyl_hexanoic_acid.py +100 -0
- orthonym-1.0.0/tests/integration/test_phosphorus_e2e.py +273 -0
- orthonym-1.0.0/tests/integration/test_polycyclic_e2e.py +581 -0
- orthonym-1.0.0/tests/integration/test_polyfunctional_e2e.py +332 -0
- orthonym-1.0.0/tests/integration/test_polyfunctional_prefixes.py +483 -0
- orthonym-1.0.0/tests/integration/test_polyfunctional_split.py +321 -0
- orthonym-1.0.0/tests/integration/test_pool_state_isolation.py +318 -0
- orthonym-1.0.0/tests/integration/test_prefix_emission_e2e.py +61 -0
- orthonym-1.0.0/tests/integration/test_principal_chain_selection.py +431 -0
- orthonym-1.0.0/tests/integration/test_qw_near_match.py +312 -0
- orthonym-1.0.0/tests/integration/test_qw_stereo.py +172 -0
- orthonym-1.0.0/tests/integration/test_readme_claims.py +117 -0
- orthonym-1.0.0/tests/integration/test_recursive_substituents.py +337 -0
- orthonym-1.0.0/tests/integration/test_recursive_substituents_secondary.py +355 -0
- orthonym-1.0.0/tests/integration/test_regression_v5.py +477 -0
- orthonym-1.0.0/tests/integration/test_ring_alcohol_stereo.py +109 -0
- orthonym-1.0.0/tests/integration/test_ring_as_substituent.py +395 -0
- orthonym-1.0.0/tests/integration/test_ring_assembly_3plus.py +134 -0
- orthonym-1.0.0/tests/integration/test_ring_boundary_benchmark.py +128 -0
- orthonym-1.0.0/tests/integration/test_ring_boundary_integration.py +120 -0
- orthonym-1.0.0/tests/integration/test_ring_chain_naming.py +291 -0
- orthonym-1.0.0/tests/integration/test_ring_expansion.py +232 -0
- orthonym-1.0.0/tests/integration/test_ring_foundation_e2e.py +325 -0
- orthonym-1.0.0/tests/integration/test_ring_selection_e2e.py +238 -0
- orthonym-1.0.0/tests/integration/test_ring_substituent_completeness.py +207 -0
- orthonym-1.0.0/tests/integration/test_ring_substituent_regression.py +325 -0
- orthonym-1.0.0/tests/integration/test_roundtrip_regression.py +1217 -0
- orthonym-1.0.0/tests/integration/test_score_based_mode.py +281 -0
- orthonym-1.0.0/tests/integration/test_skeletal_replacement_corpus.py +226 -0
- orthonym-1.0.0/tests/integration/test_small_mol_rt.py +630 -0
- orthonym-1.0.0/tests/integration/test_spiro_heteroatom.py +242 -0
- orthonym-1.0.0/tests/integration/test_stereo_benchmark.py +518 -0
- orthonym-1.0.0/tests/integration/test_stereo_free_steroids.py +66 -0
- orthonym-1.0.0/tests/integration/test_stereo_handler_retrofit.py +378 -0
- orthonym-1.0.0/tests/integration/test_stereochemistry_e2e.py +401 -0
- orthonym-1.0.0/tests/integration/test_steroid_format.py +287 -0
- orthonym-1.0.0/tests/integration/test_steroid_format_fixes.py +470 -0
- orthonym-1.0.0/tests/integration/test_steroid_roundtrip.py +100 -0
- orthonym-1.0.0/tests/integration/test_substituent_completeness_phase48.py +401 -0
- orthonym-1.0.0/tests/integration/test_substituent_prefix_form_integration.py +146 -0
- orthonym-1.0.0/tests/integration/test_sulfur_e2e.py +176 -0
- orthonym-1.0.0/tests/integration/test_terphenyl_substituted_roundtrip.py +112 -0
- orthonym-1.0.0/tests/integration/test_texts_labels_spelling.py +149 -0
- orthonym-1.0.0/tests/integration/test_tier_b_recovery.py +220 -0
- orthonym-1.0.0/tests/integration/test_tier_labels_paper_semantics.py +200 -0
- orthonym-1.0.0/tests/integration/test_triviality_controller.py +545 -0
- orthonym-1.0.0/tests/integration/test_triviality_controller_denylist.py +232 -0
- orthonym-1.0.0/tests/integration/test_triviality_controller_e2e.py +107 -0
- orthonym-1.0.0/tests/integration/test_triviality_controller_rt.py +124 -0
- orthonym-1.0.0/tests/integration/test_v29_p3reg_gate_target_oracle.py +100 -0
- orthonym-1.0.0/tests/integration/test_vb_opsin_format.py +240 -0
- orthonym-1.0.0/tests/ledger/__init__.py +0 -0
- orthonym-1.0.0/tests/ledger/test_build_ledger.py +116 -0
- orthonym-1.0.0/tests/ledger/test_fill_examples.py +128 -0
- orthonym-1.0.0/tests/ledger/test_fill_examples_2b.py +252 -0
- orthonym-1.0.0/tests/ledger/test_reaudit_w8.py +163 -0
- orthonym-1.0.0/tests/ledger/test_regrade.py +188 -0
- orthonym-1.0.0/tests/support/issue108.py +92 -0
- orthonym-1.0.0/tests/support/jars.py +56 -0
- orthonym-1.0.0/tests/support/local_only.py +34 -0
- orthonym-1.0.0/tests/support/rt_assert.py +163 -0
- orthonym-1.0.0/tests/support/v34_charged_probe.py +257 -0
- orthonym-1.0.0/tests/unit/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/assembly/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/assembly/_m2_witnesses.py +124 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_acid_halide.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_amide.py +174 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_amine.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_anhydride.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_benzene.py +51 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_boronic_acid.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_carbamate.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_carbamic_acid.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_chain.py +51 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_complex_ring.py +51 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_diamide.py +104 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_ester.py +51 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_ester_family.py +221 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_general_acyclic.py +51 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_guanidine.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_heterocycle.py +51 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_hydrazone.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_imidate_handler.py +396 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_ion_dispatch.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_isocyanate.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_isothiocyanate.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_lactam.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_lactone.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_multi_ester.py +51 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_n_oxide.py +200 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_organometallic_handler.py +327 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_oxime.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_partial_sat.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_partial_sat_predicate_purity.py +84 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_phosphate_ester.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_phosphine.py +204 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_phosphine_oxide.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_phosphinic_acid.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_polycyclic.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_polyfunctional.py +51 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_ring_assembly.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_ring_ester.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_ring_nitrile.py +178 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_simple_molecule.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_sulfone.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_sulfoxide.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_thioether.py +112 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_tier_a_ring.py +109 -0
- orthonym-1.0.0/tests/unit/assembly/handlers/test_urea.py +169 -0
- orthonym-1.0.0/tests/unit/assembly/test_acyl_amido_prefix.py +186 -0
- orthonym-1.0.0/tests/unit/assembly/test_acyl_coa_giant.py +79 -0
- orthonym-1.0.0/tests/unit/assembly/test_acyl_coa_names.py +60 -0
- orthonym-1.0.0/tests/unit/assembly/test_acyloxy_substituent_prefix.py +138 -0
- orthonym-1.0.0/tests/unit/assembly/test_alkoxy_overcontraction.py +129 -0
- orthonym-1.0.0/tests/unit/assembly/test_alkoxycarbonyl_amino_prefix.py +344 -0
- orthonym-1.0.0/tests/unit/assembly/test_amide_amine_prefix_duplication.py +104 -0
- orthonym-1.0.0/tests/unit/assembly/test_amino_prefix_enclosing_marks.py +141 -0
- orthonym-1.0.0/tests/unit/assembly/test_backstop_inject.py +88 -0
- orthonym-1.0.0/tests/unit/assembly/test_besteffort_stereo_abstain.py +79 -0
- orthonym-1.0.0/tests/unit/assembly/test_bis_catenation_ambiguous.py +92 -0
- orthonym-1.0.0/tests/unit/assembly/test_branch_stereo_v35.py +64 -0
- orthonym-1.0.0/tests/unit/assembly/test_c_branch_fallback_declines.py +41 -0
- orthonym-1.0.0/tests/unit/assembly/test_candidate_name_ring_info.py +154 -0
- orthonym-1.0.0/tests/unit/assembly/test_candidate_name_tree.py +80 -0
- orthonym-1.0.0/tests/unit/assembly/test_candidate_pool.py +517 -0
- orthonym-1.0.0/tests/unit/assembly/test_carbon_ylidene_prefix.py +252 -0
- orthonym-1.0.0/tests/unit/assembly/test_carboxy_acyl_orientation.py +38 -0
- orthonym-1.0.0/tests/unit/assembly/test_carboxy_substituent_prefix.py +135 -0
- orthonym-1.0.0/tests/unit/assembly/test_carrier_sulfinyl_substituent.py +20 -0
- orthonym-1.0.0/tests/unit/assembly/test_cascade_step6_gate.py +153 -0
- orthonym-1.0.0/tests/unit/assembly/test_cationic_substituent.py +160 -0
- orthonym-1.0.0/tests/unit/assembly/test_chalcogen_bridge_prefixes.py +444 -0
- orthonym-1.0.0/tests/unit/assembly/test_charged_aromatic_zwitterion.py +81 -0
- orthonym-1.0.0/tests/unit/assembly/test_cistrans_ring_completeness.py +198 -0
- orthonym-1.0.0/tests/unit/assembly/test_composed_prefix_organyl_constitution.py +232 -0
- orthonym-1.0.0/tests/unit/assembly/test_composition_completeness.py +40 -0
- orthonym-1.0.0/tests/unit/assembly/test_composition_tier.py +101 -0
- orthonym-1.0.0/tests/unit/assembly/test_coverage_audit.py +115 -0
- orthonym-1.0.0/tests/unit/assembly/test_coverage_guards.py +67 -0
- orthonym-1.0.0/tests/unit/assembly/test_diaryl_methyl_substituent.py +234 -0
- orthonym-1.0.0/tests/unit/assembly/test_drop_fixes.py +139 -0
- orthonym-1.0.0/tests/unit/assembly/test_enclosing_marks_conformance.py +126 -0
- orthonym-1.0.0/tests/unit/assembly/test_enrichment_tier_vocabulary.py +209 -0
- orthonym-1.0.0/tests/unit/assembly/test_feature_flag.py +218 -0
- orthonym-1.0.0/tests/unit/assembly/test_filter_lowest_locants.py +158 -0
- orthonym-1.0.0/tests/unit/assembly/test_floor_ring_stereo_completion.py +82 -0
- orthonym-1.0.0/tests/unit/assembly/test_formatting_cleanup.py +196 -0
- orthonym-1.0.0/tests/unit/assembly/test_fragment_cache_pin_names.py +55 -0
- orthonym-1.0.0/tests/unit/assembly/test_free_valence_locant_invariant.py +196 -0
- orthonym-1.0.0/tests/unit/assembly/test_fusion_lambda_guard.py +48 -0
- orthonym-1.0.0/tests/unit/assembly/test_gem_disubstituted_ring_and_thiourea_enrichment.py +480 -0
- orthonym-1.0.0/tests/unit/assembly/test_general_acyclic.py +173 -0
- orthonym-1.0.0/tests/unit/assembly/test_general_engine.py +159 -0
- orthonym-1.0.0/tests/unit/assembly/test_general_engine_zwitterion.py +493 -0
- orthonym-1.0.0/tests/unit/assembly/test_general_monocycle_pg_anchor.py +197 -0
- orthonym-1.0.0/tests/unit/assembly/test_giant_molecule_hang_fix.py +168 -0
- orthonym-1.0.0/tests/unit/assembly/test_handler_shared.py +202 -0
- orthonym-1.0.0/tests/unit/assembly/test_inner_dispatch.py +1236 -0
- orthonym-1.0.0/tests/unit/assembly/test_isolated_naming_session.py +58 -0
- orthonym-1.0.0/tests/unit/assembly/test_lactone_furanone.py +68 -0
- orthonym-1.0.0/tests/unit/assembly/test_lambda_citation_order_regression.py +106 -0
- orthonym-1.0.0/tests/unit/assembly/test_locant_omission.py +583 -0
- orthonym-1.0.0/tests/unit/assembly/test_locant_sort_key_letter_aware.py +41 -0
- orthonym-1.0.0/tests/unit/assembly/test_located_fg_chain_stereo.py +68 -0
- orthonym-1.0.0/tests/unit/assembly/test_m1_missing_enclosure.py +120 -0
- orthonym-1.0.0/tests/unit/assembly/test_m2_cistrans_substituent.py +100 -0
- orthonym-1.0.0/tests/unit/assembly/test_m2_substituent_routing.py +401 -0
- orthonym-1.0.0/tests/unit/assembly/test_m3_atom_coverage_close.py +548 -0
- orthonym-1.0.0/tests/unit/assembly/test_memo.py +248 -0
- orthonym-1.0.0/tests/unit/assembly/test_multiring_competing_fg.py +21 -0
- orthonym-1.0.0/tests/unit/assembly/test_n_branch_fallback_excludes_nitrogen.py +68 -0
- orthonym-1.0.0/tests/unit/assembly/test_n_substituted_amido_prefix.py +195 -0
- orthonym-1.0.0/tests/unit/assembly/test_name_comparison.py +133 -0
- orthonym-1.0.0/tests/unit/assembly/test_name_heteroatom_substituent_split.py +469 -0
- orthonym-1.0.0/tests/unit/assembly/test_name_tree.py +322 -0
- orthonym-1.0.0/tests/unit/assembly/test_name_tree_builder.py +146 -0
- orthonym-1.0.0/tests/unit/assembly/test_name_tree_serializer.py +135 -0
- orthonym-1.0.0/tests/unit/assembly/test_name_tree_to_string.py +331 -0
- orthonym-1.0.0/tests/unit/assembly/test_naming_session_leak_self_heals.py +166 -0
- orthonym-1.0.0/tests/unit/assembly/test_naming_utils.py +682 -0
- orthonym-1.0.0/tests/unit/assembly/test_needs_parens_consolidation.py +42 -0
- orthonym-1.0.0/tests/unit/assembly/test_nested_memo.py +137 -0
- orthonym-1.0.0/tests/unit/assembly/test_nitrogen_ylidene.py +65 -0
- orthonym-1.0.0/tests/unit/assembly/test_nitroso_substituent.py +65 -0
- orthonym-1.0.0/tests/unit/assembly/test_no_abstain_b34_wiring.py +188 -0
- orthonym-1.0.0/tests/unit/assembly/test_no_abstain_cd_checkpoint.py +81 -0
- orthonym-1.0.0/tests/unit/assembly/test_offer_pool.py +80 -0
- orthonym-1.0.0/tests/unit/assembly/test_oracle_jar_resolution.py +53 -0
- orthonym-1.0.0/tests/unit/assembly/test_p14_5_alphanumerical_order.py +188 -0
- orthonym-1.0.0/tests/unit/assembly/test_p14_5_letters_first.py +148 -0
- orthonym-1.0.0/tests/unit/assembly/test_p68_4_1_chalcogen_chain_substituent.py +57 -0
- orthonym-1.0.0/tests/unit/assembly/test_pcg_counting.py +259 -0
- orthonym-1.0.0/tests/unit/assembly/test_per_substring_scoring.py +177 -0
- orthonym-1.0.0/tests/unit/assembly/test_pg_ring_hint_wiring.py +73 -0
- orthonym-1.0.0/tests/unit/assembly/test_polyfunctional_substituent.py +243 -0
- orthonym-1.0.0/tests/unit/assembly/test_pool_best_tier1.py +554 -0
- orthonym-1.0.0/tests/unit/assembly/test_prefix_citation_order.py +59 -0
- orthonym-1.0.0/tests/unit/assembly/test_prewrapped_prefix_nesting.py +61 -0
- orthonym-1.0.0/tests/unit/assembly/test_primed_letter_locant_sort.py +53 -0
- orthonym-1.0.0/tests/unit/assembly/test_ps2_ring_parent_stereo.py +104 -0
- orthonym-1.0.0/tests/unit/assembly/test_ps3_ring_substituent_stereo.py +77 -0
- orthonym-1.0.0/tests/unit/assembly/test_ps4_substituent_ez.py +91 -0
- orthonym-1.0.0/tests/unit/assembly/test_ps5_ring_ez.py +60 -0
- orthonym-1.0.0/tests/unit/assembly/test_pure_alkyl_flatten_guard.py +22 -0
- orthonym-1.0.0/tests/unit/assembly/test_purine_substituent.py +77 -0
- orthonym-1.0.0/tests/unit/assembly/test_q1q2_spelling_v43.py +57 -0
- orthonym-1.0.0/tests/unit/assembly/test_rerooted_fg_substituent.py +134 -0
- orthonym-1.0.0/tests/unit/assembly/test_resolvers.py +401 -0
- orthonym-1.0.0/tests/unit/assembly/test_retained_substitution.py +342 -0
- orthonym-1.0.0/tests/unit/assembly/test_ring_free_valence_class.py +300 -0
- orthonym-1.0.0/tests/unit/assembly/test_ring_n_carbamic_acid.py +27 -0
- orthonym-1.0.0/tests/unit/assembly/test_ring_parent_whole_ring_system.py +123 -0
- orthonym-1.0.0/tests/unit/assembly/test_ringsubst_decorated_heteroarene.py +52 -0
- orthonym-1.0.0/tests/unit/assembly/test_ringsubst_saturated_heterocycle.py +44 -0
- orthonym-1.0.0/tests/unit/assembly/test_select_best_alphanumeric.py +35 -0
- orthonym-1.0.0/tests/unit/assembly/test_serializer_flip_tripwire.py +127 -0
- orthonym-1.0.0/tests/unit/assembly/test_silyloxy.py +38 -0
- orthonym-1.0.0/tests/unit/assembly/test_spiro_principal_suffix.py +34 -0
- orthonym-1.0.0/tests/unit/assembly/test_stereo_detection.py +86 -0
- orthonym-1.0.0/tests/unit/assembly/test_substituent_attach_locant.py +240 -0
- orthonym-1.0.0/tests/unit/assembly/test_substituent_chain_stereo.py +215 -0
- orthonym-1.0.0/tests/unit/assembly/test_substituent_enumerator_tier_05.py +275 -0
- orthonym-1.0.0/tests/unit/assembly/test_substituent_memo_key.py +89 -0
- orthonym-1.0.0/tests/unit/assembly/test_substituent_memo_key_equal.py +131 -0
- orthonym-1.0.0/tests/unit/assembly/test_substituent_naming_polyene.py +26 -0
- orthonym-1.0.0/tests/unit/assembly/test_substituent_order.py +80 -0
- orthonym-1.0.0/tests/unit/assembly/test_substituent_prefix_forms.py +1025 -0
- orthonym-1.0.0/tests/unit/assembly/test_substituent_stereo.py +148 -0
- orthonym-1.0.0/tests/unit/assembly/test_sulfonyl_acyl_substituent.py +68 -0
- orthonym-1.0.0/tests/unit/assembly/test_t4_coverage.py +657 -0
- orthonym-1.0.0/tests/unit/assembly/test_t4_pin_isolation.py +50 -0
- orthonym-1.0.0/tests/unit/assembly/test_thiourea_bridging_and_parent.py +408 -0
- orthonym-1.0.0/tests/unit/assembly/test_universal_halogen_leaf.py +106 -0
- orthonym-1.0.0/tests/unit/assembly/test_universal_skeleton_allowlist.py +218 -0
- orthonym-1.0.0/tests/unit/assembly/test_universal_spiro_fused_leaf.py +279 -0
- orthonym-1.0.0/tests/unit/assembly/test_universal_spiro_leaf.py +146 -0
- orthonym-1.0.0/tests/unit/assembly/test_universal_substituent.py +1091 -0
- orthonym-1.0.0/tests/unit/assembly/test_universal_substituent_hetero_ring.py +149 -0
- orthonym-1.0.0/tests/unit/assembly/test_unsaturation_infix.py +162 -0
- orthonym-1.0.0/tests/unit/assembly/test_v26_bp3_c2_chalcogen_arm_recursion.py +108 -0
- orthonym-1.0.0/tests/unit/assembly/test_v26_p1_monocycle_engine.py +323 -0
- orthonym-1.0.0/tests/unit/assembly/test_v26_p4_multifragment.py +366 -0
- orthonym-1.0.0/tests/unit/assembly/test_v26_p5_charged_general.py +371 -0
- orthonym-1.0.0/tests/unit/assembly/test_v26_p6_retained_preference.py +441 -0
- orthonym-1.0.0/tests/unit/assembly/test_v26_p7_stereo_failclosed.py +265 -0
- orthonym-1.0.0/tests/unit/assembly/test_v27_p5_fusion.py +75 -0
- orthonym-1.0.0/tests/unit/assembly/test_v27_ring_linker_suffix.py +213 -0
- orthonym-1.0.0/tests/unit/assembly/test_v29_p3close_substituted_multiplier.py +650 -0
- orthonym-1.0.0/tests/unit/assembly/test_v29_p3final_multiplied_arity.py +97 -0
- orthonym-1.0.0/tests/unit/assembly/test_v29_p3fix_multiplied_italic_prefix.py +139 -0
- orthonym-1.0.0/tests/unit/assembly/test_v29_p3fix_stem_initial_numeral.py +118 -0
- orthonym-1.0.0/tests/unit/assembly/test_v29_p7_inline_suffix_locant.py +127 -0
- orthonym-1.0.0/tests/unit/assembly/test_v29_t3_carbamate_enclosing_marks.py +82 -0
- orthonym-1.0.0/tests/unit/assembly/test_v29_t3_r_group_caller_refusals.py +248 -0
- orthonym-1.0.0/tests/unit/assembly/test_verify_or_none_best_effort_wiring.py +157 -0
- orthonym-1.0.0/tests/unit/assembly/test_w2e_p1fc_bis_disambiguation.py +61 -0
- orthonym-1.0.0/tests/unit/assembly/test_w2e_p1fc_complex_substitution.py +19 -0
- orthonym-1.0.0/tests/unit/assembly/test_w2e_p1fc_concatenated_complex.py +22 -0
- orthonym-1.0.0/tests/unit/assembly/test_w2e_p1fc_concatenation.py +20 -0
- orthonym-1.0.0/tests/unit/assembly/test_w2e_p1fc_mixed_prefixes.py +29 -0
- orthonym-1.0.0/tests/unit/assembly/test_w2f_p1_amino_branch.py +262 -0
- orthonym-1.0.0/tests/unit/assembly/test_w2f_p3_branched_substituent.py +82 -0
- orthonym-1.0.0/tests/unit/assembly/test_w2f_p4_nitrile_oxide.py +109 -0
- orthonym-1.0.0/tests/unit/assembly/test_w2f_p6_carbamimidate.py +53 -0
- orthonym-1.0.0/tests/unit/assembly/test_w2f_p6_urea_prefix.py +45 -0
- orthonym-1.0.0/tests/unit/assembly/test_ylidene_consumers.py +101 -0
- orthonym-1.0.0/tests/unit/conformance/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/conformance/test_v52_phase01_spelling.py +276 -0
- orthonym-1.0.0/tests/unit/data/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/data/_post_148_2_baseline.json +156 -0
- orthonym-1.0.0/tests/unit/data/fused_heterocycle_expected_canon.json +162 -0
- orthonym-1.0.0/tests/unit/data/smiles_name_inchikey_sweep.py +244 -0
- orthonym-1.0.0/tests/unit/data/test_catalog_byte_identical.py +267 -0
- orthonym-1.0.0/tests/unit/data/test_chain_names.py +479 -0
- orthonym-1.0.0/tests/unit/data/test_chalcone_retained_pin.py +182 -0
- orthonym-1.0.0/tests/unit/data/test_consistency.py +116 -0
- orthonym-1.0.0/tests/unit/data/test_data_table_phase94.py +417 -0
- orthonym-1.0.0/tests/unit/data/test_fused_core_memo.py +133 -0
- orthonym-1.0.0/tests/unit/data/test_fused_het_data_integrity.py +83 -0
- orthonym-1.0.0/tests/unit/data/test_fused_het_prefix_stems.py +280 -0
- orthonym-1.0.0/tests/unit/data/test_fused_heterocycles.py +1456 -0
- orthonym-1.0.0/tests/unit/data/test_fused_heterocycles_indicated_h.py +116 -0
- orthonym-1.0.0/tests/unit/data/test_fusion_components_p25.py +99 -0
- orthonym-1.0.0/tests/unit/data/test_geometry_asserting_retained_names.py +145 -0
- orthonym-1.0.0/tests/unit/data/test_hw_six_ring_least_senior_stem.py +124 -0
- orthonym-1.0.0/tests/unit/data/test_hyg01_ring_bucket_equivalence.py +198 -0
- orthonym-1.0.0/tests/unit/data/test_ion_retained_names.py +249 -0
- orthonym-1.0.0/tests/unit/data/test_natural_products_data.py +213 -0
- orthonym-1.0.0/tests/unit/data/test_np_keying_invariant.py +63 -0
- orthonym-1.0.0/tests/unit/data/test_opsin_import_pin_evidence.py +78 -0
- orthonym-1.0.0/tests/unit/data/test_opsin_imports.py +460 -0
- orthonym-1.0.0/tests/unit/data/test_opsin_merge_layer.py +173 -0
- orthonym-1.0.0/tests/unit/data/test_pin_deny_amino_and_trivial.py +391 -0
- orthonym-1.0.0/tests/unit/data/test_pin_deny_caprolactam.py +122 -0
- orthonym-1.0.0/tests/unit/data/test_polycyclic_data.py +514 -0
- orthonym-1.0.0/tests/unit/data/test_retained_name_classifier.py +399 -0
- orthonym-1.0.0/tests/unit/data/test_retained_names.py +228 -0
- orthonym-1.0.0/tests/unit/data/test_retained_names_pin_cleanup.py +297 -0
- orthonym-1.0.0/tests/unit/data/test_retained_names_size_gate.py +45 -0
- orthonym-1.0.0/tests/unit/data/test_ring_expansion_entries.py +319 -0
- orthonym-1.0.0/tests/unit/data/test_smiles_dict_canonical_lint.py +189 -0
- orthonym-1.0.0/tests/unit/data/test_smiles_name_consistency.py +235 -0
- orthonym-1.0.0/tests/unit/data/test_sugar_c_sub_memo.py +24 -0
- orthonym-1.0.0/tests/unit/data/test_sugar_skeleton.py +350 -0
- orthonym-1.0.0/tests/unit/data/test_triviality_controller_seed.py +158 -0
- orthonym-1.0.0/tests/unit/data/test_v29_p3reg_amino_acid_L_descriptor.py +205 -0
- orthonym-1.0.0/tests/unit/data/test_v42_p11a_retained_pins.py +121 -0
- orthonym-1.0.0/tests/unit/data/test_v42_p11b2_fusdata.py +114 -0
- orthonym-1.0.0/tests/unit/data/test_v42_p9_fusdata.py +169 -0
- orthonym-1.0.0/tests/unit/data/test_xanthine_derivatives.py +263 -0
- orthonym-1.0.0/tests/unit/decomposition/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/decomposition/test_amide_glue_grammar.py +66 -0
- orthonym-1.0.0/tests/unit/decomposition/test_coverage_oracle_rescue.py +222 -0
- orthonym-1.0.0/tests/unit/decomposition/test_floating_nacyl_ambiguity.py +58 -0
- orthonym-1.0.0/tests/unit/decomposition/test_multi_bond.py +1409 -0
- orthonym-1.0.0/tests/unit/decomposition/test_no_partial_assembly.py +400 -0
- orthonym-1.0.0/tests/unit/decomposition/test_quality_gate.py +755 -0
- orthonym-1.0.0/tests/unit/decomposition/test_quality_gate_shadowing.py +149 -0
- orthonym-1.0.0/tests/unit/decomposition/test_weaver_composition.py +118 -0
- orthonym-1.0.0/tests/unit/diagnostics/test_crash_traceback.py +34 -0
- orthonym-1.0.0/tests/unit/diagnostics/test_strict_mode.py +43 -0
- orthonym-1.0.0/tests/unit/eval/test_audit_atom_drop_precision.py +170 -0
- orthonym-1.0.0/tests/unit/eval/test_check_goals.py +77 -0
- orthonym-1.0.0/tests/unit/metrics/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/metrics/test_abstention_codes.py +253 -0
- orthonym-1.0.0/tests/unit/metrics/test_breadth.py +864 -0
- orthonym-1.0.0/tests/unit/metrics/test_candidate_ledger.py +262 -0
- orthonym-1.0.0/tests/unit/metrics/test_coverage_metrics.py +200 -0
- orthonym-1.0.0/tests/unit/metrics/test_parse_suppressed_candidates.py +96 -0
- orthonym-1.0.0/tests/unit/metrics/test_provenance.py +59 -0
- orthonym-1.0.0/tests/unit/namer/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/namer/test_build_ring_info_dispatch.py +286 -0
- orthonym-1.0.0/tests/unit/namer/test_bypass_deleted.py +25 -0
- orthonym-1.0.0/tests/unit/namer/test_classify_cyclic_refactor.py +92 -0
- orthonym-1.0.0/tests/unit/namer/test_fused_parent_selection.py +278 -0
- orthonym-1.0.0/tests/unit/namer/test_gate_stereo_carveout_self01.py +372 -0
- orthonym-1.0.0/tests/unit/namer/test_lone_pair_configuration.py +213 -0
- orthonym-1.0.0/tests/unit/namer/test_lone_pair_first_written.py +182 -0
- orthonym-1.0.0/tests/unit/namer/test_name_ctx_isolation.py +101 -0
- orthonym-1.0.0/tests/unit/namer/test_reduced_mode_labels.py +76 -0
- orthonym-1.0.0/tests/unit/namer/test_self_consistency_gate.py +224 -0
- orthonym-1.0.0/tests/unit/namer/test_trivial_fallback_is_live.py +132 -0
- orthonym-1.0.0/tests/unit/namer/test_v29_p3close_stereo_backstop_falsepos.py +374 -0
- orthonym-1.0.0/tests/unit/perception/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/perception/test_acid_carbon_constraint.py +39 -0
- orthonym-1.0.0/tests/unit/perception/test_alcohol_detection.py +65 -0
- orthonym-1.0.0/tests/unit/perception/test_amine_detection.py +49 -0
- orthonym-1.0.0/tests/unit/perception/test_axial_pin_descriptor.py +123 -0
- orthonym-1.0.0/tests/unit/perception/test_bridgehead_amine_n_stereo.py +68 -0
- orthonym-1.0.0/tests/unit/perception/test_chain_scoring.py +479 -0
- orthonym-1.0.0/tests/unit/perception/test_exocyclic_ylidene_stereo.py +60 -0
- orthonym-1.0.0/tests/unit/perception/test_fg_prefilter.py +53 -0
- orthonym-1.0.0/tests/unit/perception/test_fg_structure_cache.py +56 -0
- orthonym-1.0.0/tests/unit/perception/test_functional_groups_charged.py +63 -0
- orthonym-1.0.0/tests/unit/perception/test_functional_groups_frn.py +293 -0
- orthonym-1.0.0/tests/unit/perception/test_functional_groups_missing_classes.py +100 -0
- orthonym-1.0.0/tests/unit/perception/test_input_stereo_undefined.py +44 -0
- orthonym-1.0.0/tests/unit/perception/test_ions.py +300 -0
- orthonym-1.0.0/tests/unit/perception/test_lipid_detect.py +71 -0
- orthonym-1.0.0/tests/unit/perception/test_maximal_carbon_chains.py +78 -0
- orthonym-1.0.0/tests/unit/perception/test_metals.py +401 -0
- orthonym-1.0.0/tests/unit/perception/test_molcache.py +104 -0
- orthonym-1.0.0/tests/unit/perception/test_molcache_keys.py +51 -0
- orthonym-1.0.0/tests/unit/perception/test_natural_products.py +381 -0
- orthonym-1.0.0/tests/unit/perception/test_nitrite_disambiguation.py +31 -0
- orthonym-1.0.0/tests/unit/perception/test_np_scaffold_match_determinism.py +95 -0
- orthonym-1.0.0/tests/unit/perception/test_perception_gold_targets.py +64 -0
- orthonym-1.0.0/tests/unit/perception/test_ring_boundary.py +137 -0
- orthonym-1.0.0/tests/unit/perception/test_ring_classification.py +121 -0
- orthonym-1.0.0/tests/unit/perception/test_ring_merge_determinism.py +44 -0
- orthonym-1.0.0/tests/unit/perception/test_ring_substituent_detection.py +320 -0
- orthonym-1.0.0/tests/unit/perception/test_semipolar_internal_charge.py +230 -0
- orthonym-1.0.0/tests/unit/perception/test_smarts_cache.py +10 -0
- orthonym-1.0.0/tests/unit/perception/test_steroid_stereo_parity.py +96 -0
- orthonym-1.0.0/tests/unit/perception/test_structure_conservation.py +296 -0
- orthonym-1.0.0/tests/unit/perception/test_v29_r1_ketone_chain_pcg.py +188 -0
- orthonym-1.0.0/tests/unit/perception/test_v38_p2_chain_score_memo.py +150 -0
- orthonym-1.0.0/tests/unit/perception/test_w2f_p6_carbamimidate_perception.py +34 -0
- orthonym-1.0.0/tests/unit/perception/test_w2f_p7_lambda_perception.py +51 -0
- orthonym-1.0.0/tests/unit/routing/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/routing/test_dispatch_table.py +378 -0
- orthonym-1.0.0/tests/unit/routing/test_dispatcher.py +343 -0
- orthonym-1.0.0/tests/unit/routing/test_orgm_dispatch.py +214 -0
- orthonym-1.0.0/tests/unit/rules/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/rules/_macrocycle_smiles.json +7 -0
- orthonym-1.0.0/tests/unit/rules/fusion_engine_helpers.py +55 -0
- orthonym-1.0.0/tests/unit/rules/test_a2_stereo_primed_locant_v36.py +176 -0
- orthonym-1.0.0/tests/unit/rules/test_a4_multiplicative_v50.py +119 -0
- orthonym-1.0.0/tests/unit/rules/test_acetaldehyde_substitutable_parent.py +58 -0
- orthonym-1.0.0/tests/unit/rules/test_acid_ester_anion.py +170 -0
- orthonym-1.0.0/tests/unit/rules/test_acyclic_last_resort_fragments.py +137 -0
- orthonym-1.0.0/tests/unit/rules/test_acyl_taurine.py +104 -0
- orthonym-1.0.0/tests/unit/rules/test_acylamino_substituent.py +73 -0
- orthonym-1.0.0/tests/unit/rules/test_acylhydrazone.py +79 -0
- orthonym-1.0.0/tests/unit/rules/test_added_carbon_substituent.py +169 -0
- orthonym-1.0.0/tests/unit/rules/test_adducts.py +292 -0
- orthonym-1.0.0/tests/unit/rules/test_adducts_single_atom_v43.py +71 -0
- orthonym-1.0.0/tests/unit/rules/test_adducts_t4_tier.py +27 -0
- orthonym-1.0.0/tests/unit/rules/test_alkaloid_decoration.py +187 -0
- orthonym-1.0.0/tests/unit/rules/test_alkenyl_ol_substituent.py +220 -0
- orthonym-1.0.0/tests/unit/rules/test_alkenyl_prefix.py +169 -0
- orthonym-1.0.0/tests/unit/rules/test_alkoxy_substituent_general.py +48 -0
- orthonym-1.0.0/tests/unit/rules/test_alkoxycarbonyl_prefix.py +133 -0
- orthonym-1.0.0/tests/unit/rules/test_allene_cip_priority.py +260 -0
- orthonym-1.0.0/tests/unit/rules/test_amide_amino_prefix_marks.py +30 -0
- orthonym-1.0.0/tests/unit/rules/test_amide_merged_prefix_p16_3_3.py +164 -0
- orthonym-1.0.0/tests/unit/rules/test_amide_prefix_forms.py +316 -0
- orthonym-1.0.0/tests/unit/rules/test_amidine_c2.py +98 -0
- orthonym-1.0.0/tests/unit/rules/test_amine_prefix_merge_p14_5.py +84 -0
- orthonym-1.0.0/tests/unit/rules/test_amine_smarts_fix.py +55 -0
- orthonym-1.0.0/tests/unit/rules/test_aminium_polyacid.py +228 -0
- orthonym-1.0.0/tests/unit/rules/test_amino_acid_backbone_invariant.py +120 -0
- orthonym-1.0.0/tests/unit/rules/test_amino_acid_derivatives.py +170 -0
- orthonym-1.0.0/tests/unit/rules/test_amino_acid_diacid.py +77 -0
- orthonym-1.0.0/tests/unit/rules/test_amino_acid_stereo.py +128 -0
- orthonym-1.0.0/tests/unit/rules/test_amino_acids_stereo_honesty.py +23 -0
- orthonym-1.0.0/tests/unit/rules/test_among_rings_gold.py +119 -0
- orthonym-1.0.0/tests/unit/rules/test_anhydride_substituents.py +34 -0
- orthonym-1.0.0/tests/unit/rules/test_anilino_preferred_prefix.py +570 -0
- orthonym-1.0.0/tests/unit/rules/test_anion_ide_uide_v52.py +165 -0
- orthonym-1.0.0/tests/unit/rules/test_aromatic_not_mancude.py +233 -0
- orthonym-1.0.0/tests/unit/rules/test_aromatic_sulfonyl_pin.py +39 -0
- orthonym-1.0.0/tests/unit/rules/test_axial_chirality.py +505 -0
- orthonym-1.0.0/tests/unit/rules/test_bare_oxy_comprehensive.py +179 -0
- orthonym-1.0.0/tests/unit/rules/test_bb_loss_thiodicarbonate.py +93 -0
- orthonym-1.0.0/tests/unit/rules/test_benzene_functionalized_chain.py +286 -0
- orthonym-1.0.0/tests/unit/rules/test_benzene_handler_accuracy.py +96 -0
- orthonym-1.0.0/tests/unit/rules/test_benzene_suffix_fg.py +196 -0
- orthonym-1.0.0/tests/unit/rules/test_benzene_suffix_forms.py +142 -0
- orthonym-1.0.0/tests/unit/rules/test_benzo_annulene.py +82 -0
- orthonym-1.0.0/tests/unit/rules/test_bicyclo.py +657 -0
- orthonym-1.0.0/tests/unit/rules/test_bicyclo_complete.py +481 -0
- orthonym-1.0.0/tests/unit/rules/test_bicyclo_complex_substituent.py +199 -0
- orthonym-1.0.0/tests/unit/rules/test_bicyclo_fused_routing.py +279 -0
- orthonym-1.0.0/tests/unit/rules/test_bicyclo_pendant_ring.py +160 -0
- orthonym-1.0.0/tests/unit/rules/test_bis_linker_multiplication_8d.py +160 -0
- orthonym-1.0.0/tests/unit/rules/test_bis_quaternary_aminium_pin.py +67 -0
- orthonym-1.0.0/tests/unit/rules/test_bis_suffix_multiplication_8c.py +101 -0
- orthonym-1.0.0/tests/unit/rules/test_bond_cleavage.py +377 -0
- orthonym-1.0.0/tests/unit/rules/test_boron_fused_heterocycles.py +131 -0
- orthonym-1.0.0/tests/unit/rules/test_breadth_restore_acyloxy_floor.py +198 -0
- orthonym-1.0.0/tests/unit/rules/test_bridged_fused.py +302 -0
- orthonym-1.0.0/tests/unit/rules/test_bugb_guard.py +224 -0
- orthonym-1.0.0/tests/unit/rules/test_build_ring_pos_homogeneity.py +162 -0
- orthonym-1.0.0/tests/unit/rules/test_c1c2c6_ring_topology_v36.py +287 -0
- orthonym-1.0.0/tests/unit/rules/test_c3_substituent_assembly_v36.py +322 -0
- orthonym-1.0.0/tests/unit/rules/test_c4_aromatic_amines.py +167 -0
- orthonym-1.0.0/tests/unit/rules/test_c4_ring_assembly_v36.py +193 -0
- orthonym-1.0.0/tests/unit/rules/test_c5_wave_a_v36.py +202 -0
- orthonym-1.0.0/tests/unit/rules/test_c6_spiro_ketals_v36.py +100 -0
- orthonym-1.0.0/tests/unit/rules/test_c_waveB_v36.py +250 -0
- orthonym-1.0.0/tests/unit/rules/test_c_waveC_v36.py +220 -0
- orthonym-1.0.0/tests/unit/rules/test_c_waveE_v36.py +226 -0
- orthonym-1.0.0/tests/unit/rules/test_c_waveF_v36.py +167 -0
- orthonym-1.0.0/tests/unit/rules/test_carbamic_acids.py +89 -0
- orthonym-1.0.0/tests/unit/rules/test_carbanion_ide.py +147 -0
- orthonym-1.0.0/tests/unit/rules/test_carbohydrate_tail.py +92 -0
- orthonym-1.0.0/tests/unit/rules/test_carotene_parents.py +75 -0
- orthonym-1.0.0/tests/unit/rules/test_catalog_fr23_agreement.py +193 -0
- orthonym-1.0.0/tests/unit/rules/test_catenated_cations_v52.py +222 -0
- orthonym-1.0.0/tests/unit/rules/test_cation_charge_preservation.py +24 -0
- orthonym-1.0.0/tests/unit/rules/test_cephem_vonbaeyer.py +146 -0
- orthonym-1.0.0/tests/unit/rules/test_chain_ring_bugs.py +154 -0
- orthonym-1.0.0/tests/unit/rules/test_chain_tiebreakers.py +161 -0
- orthonym-1.0.0/tests/unit/rules/test_chalcogen_acids.py +69 -0
- orthonym-1.0.0/tests/unit/rules/test_charge_first_pcg.py +114 -0
- orthonym-1.0.0/tests/unit/rules/test_charge_form_names.py +68 -0
- orthonym-1.0.0/tests/unit/rules/test_charge_producer_fixes.py +260 -0
- orthonym-1.0.0/tests/unit/rules/test_charged_carboxylate_breadth.py +46 -0
- orthonym-1.0.0/tests/unit/rules/test_charged_completion.py +332 -0
- orthonym-1.0.0/tests/unit/rules/test_charged_ester_anion_slice_a.py +121 -0
- orthonym-1.0.0/tests/unit/rules/test_charged_fg_v36.py +174 -0
- orthonym-1.0.0/tests/unit/rules/test_charged_multicentre.py +261 -0
- orthonym-1.0.0/tests/unit/rules/test_charged_router.py +248 -0
- orthonym-1.0.0/tests/unit/rules/test_charged_species_breadth.py +83 -0
- orthonym-1.0.0/tests/unit/rules/test_charged_species_v52.py +117 -0
- orthonym-1.0.0/tests/unit/rules/test_charged_spiro.py +171 -0
- orthonym-1.0.0/tests/unit/rules/test_charged_suffixes_ft6.py +277 -0
- orthonym-1.0.0/tests/unit/rules/test_chebi_losses.py +665 -0
- orthonym-1.0.0/tests/unit/rules/test_cip_limitations.py +231 -0
- orthonym-1.0.0/tests/unit/rules/test_cluster_d_pin_backlog.py +93 -0
- orthonym-1.0.0/tests/unit/rules/test_collision_audit.py +336 -0
- orthonym-1.0.0/tests/unit/rules/test_compare_locant_sets_tuple.py +222 -0
- orthonym-1.0.0/tests/unit/rules/test_complex_fusion_descriptors.py +412 -0
- orthonym-1.0.0/tests/unit/rules/test_complex_ring_handler_accuracy.py +246 -0
- orthonym-1.0.0/tests/unit/rules/test_component_identification.py +340 -0
- orthonym-1.0.0/tests/unit/rules/test_composer2_chain_rooted_decorated_ring.py +65 -0
- orthonym-1.0.0/tests/unit/rules/test_composer_dispatch_invariants.py +112 -0
- orthonym-1.0.0/tests/unit/rules/test_composite_acyl_enclosure.py +61 -0
- orthonym-1.0.0/tests/unit/rules/test_composite_oxy_enclosure.py +62 -0
- orthonym-1.0.0/tests/unit/rules/test_compound_class_routing.py +234 -0
- orthonym-1.0.0/tests/unit/rules/test_compound_prefix_generators.py +257 -0
- orthonym-1.0.0/tests/unit/rules/test_conjugate_controller.py +257 -0
- orthonym-1.0.0/tests/unit/rules/test_core_namer_substituent_v36.py +245 -0
- orthonym-1.0.0/tests/unit/rules/test_coverage_gating_expansion.py +221 -0
- orthonym-1.0.0/tests/unit/rules/test_coverage_scoring.py +415 -0
- orthonym-1.0.0/tests/unit/rules/test_ct2_hw_partial_saturation.py +101 -0
- orthonym-1.0.0/tests/unit/rules/test_ct4_ncomponent_fusion.py +127 -0
- orthonym-1.0.0/tests/unit/rules/test_cyclic_imides.py +198 -0
- orthonym-1.0.0/tests/unit/rules/test_cycloalkane_cip_tiebreak.py +26 -0
- orthonym-1.0.0/tests/unit/rules/test_cycloalkane_suffix_locant.py +119 -0
- orthonym-1.0.0/tests/unit/rules/test_cycloalkene_locant.py +36 -0
- orthonym-1.0.0/tests/unit/rules/test_d1_coordination_v36.py +374 -0
- orthonym-1.0.0/tests/unit/rules/test_decision_a_n_substituted_amino_acids.py +461 -0
- orthonym-1.0.0/tests/unit/rules/test_decomposition_engine.py +857 -0
- orthonym-1.0.0/tests/unit/rules/test_decorated_ring_substituent.py +158 -0
- orthonym-1.0.0/tests/unit/rules/test_diacylamide_seniority.py +54 -0
- orthonym-1.0.0/tests/unit/rules/test_dibenzo_hydro.py +126 -0
- orthonym-1.0.0/tests/unit/rules/test_dihydro_heterocycle_suffix.py +163 -0
- orthonym-1.0.0/tests/unit/rules/test_disaccharide.py +560 -0
- orthonym-1.0.0/tests/unit/rules/test_dispiro_return_arc_numbering.py +109 -0
- orthonym-1.0.0/tests/unit/rules/test_disulfide_attachment.py +127 -0
- orthonym-1.0.0/tests/unit/rules/test_dithioic_acid_enclosure.py +56 -0
- orthonym-1.0.0/tests/unit/rules/test_dl_suppression.py +89 -0
- orthonym-1.0.0/tests/unit/rules/test_edta.py +95 -0
- orthonym-1.0.0/tests/unit/rules/test_errata_assembly.py +162 -0
- orthonym-1.0.0/tests/unit/rules/test_errata_data_logic.py +373 -0
- orthonym-1.0.0/tests/unit/rules/test_ester_alkyl_stereo.py +160 -0
- orthonym-1.0.0/tests/unit/rules/test_ester_anion_zwitterion.py +57 -0
- orthonym-1.0.0/tests/unit/rules/test_ester_orientation.py +87 -0
- orthonym-1.0.0/tests/unit/rules/test_ester_ring_acid_substituents.py +78 -0
- orthonym-1.0.0/tests/unit/rules/test_ether_format.py +109 -0
- orthonym-1.0.0/tests/unit/rules/test_fb_arenesulfonamide_merge.py +212 -0
- orthonym-1.0.0/tests/unit/rules/test_ff_locant_fix.py +120 -0
- orthonym-1.0.0/tests/unit/rules/test_fg_perception_new.py +202 -0
- orthonym-1.0.0/tests/unit/rules/test_fg_prefix_forms.py +149 -0
- orthonym-1.0.0/tests/unit/rules/test_format_validator.py +218 -0
- orthonym-1.0.0/tests/unit/rules/test_fragment_assembly.py +816 -0
- orthonym-1.0.0/tests/unit/rules/test_fragment_capping.py +270 -0
- orthonym-1.0.0/tests/unit/rules/test_fragment_depth_cache.py +515 -0
- orthonym-1.0.0/tests/unit/rules/test_fragment_ranker.py +155 -0
- orthonym-1.0.0/tests/unit/rules/test_fused_acyl_ester_substituent.py +96 -0
- orthonym-1.0.0/tests/unit/rules/test_fused_heterocycle_expansion.py +256 -0
- orthonym-1.0.0/tests/unit/rules/test_fused_heterocycle_locants.py +472 -0
- orthonym-1.0.0/tests/unit/rules/test_fused_hydroxy_seniority.py +85 -0
- orthonym-1.0.0/tests/unit/rules/test_fused_parent_component_seniority.py +123 -0
- orthonym-1.0.0/tests/unit/rules/test_fused_ring_selection.py +1057 -0
- orthonym-1.0.0/tests/unit/rules/test_fused_ring_substituent_routing.py +141 -0
- orthonym-1.0.0/tests/unit/rules/test_fused_rings.py +1150 -0
- orthonym-1.0.0/tests/unit/rules/test_fused_substituent_completeness.py +44 -0
- orthonym-1.0.0/tests/unit/rules/test_fusion_abstain_recovery.py +31 -0
- orthonym-1.0.0/tests/unit/rules/test_fusion_descriptor_determinism.py +29 -0
- orthonym-1.0.0/tests/unit/rules/test_fusion_descriptor_hyphen.py +29 -0
- orthonym-1.0.0/tests/unit/rules/test_fusion_descriptors.py +833 -0
- orthonym-1.0.0/tests/unit/rules/test_fusion_iupac_numbering.py +188 -0
- orthonym-1.0.0/tests/unit/rules/test_fusion_mancude_indicated_h.py +76 -0
- orthonym-1.0.0/tests/unit/rules/test_fusion_numbering.py +301 -0
- orthonym-1.0.0/tests/unit/rules/test_fusion_orientation.py +171 -0
- orthonym-1.0.0/tests/unit/rules/test_generic_glycosyloxy.py +79 -0
- orthonym-1.0.0/tests/unit/rules/test_glucosinolate_osulfate.py +127 -0
- orthonym-1.0.0/tests/unit/rules/test_glycoside_parent_preference.py +81 -0
- orthonym-1.0.0/tests/unit/rules/test_group12_organometallic_ligands.py +82 -0
- orthonym-1.0.0/tests/unit/rules/test_group13_no_pin_status.py +31 -0
- orthonym-1.0.0/tests/unit/rules/test_group_splitting.py +150 -0
- orthonym-1.0.0/tests/unit/rules/test_guard2_stereo_aware.py +49 -0
- orthonym-1.0.0/tests/unit/rules/test_handler_coverage.py +78 -0
- orthonym-1.0.0/tests/unit/rules/test_handler_enrichment.py +207 -0
- orthonym-1.0.0/tests/unit/rules/test_handler_stereo_injection.py +937 -0
- orthonym-1.0.0/tests/unit/rules/test_heptacene.py +152 -0
- orthonym-1.0.0/tests/unit/rules/test_heteroaromatic_compound_substituent.py +52 -0
- orthonym-1.0.0/tests/unit/rules/test_heteroaryl_sulfinyl_substituent.py +58 -0
- orthonym-1.0.0/tests/unit/rules/test_heteroatom_substituent_prefix.py +41 -0
- orthonym-1.0.0/tests/unit/rules/test_heterocycle_handler_accuracy.py +148 -0
- orthonym-1.0.0/tests/unit/rules/test_heterocycle_multiplied_prefix_collapse.py +229 -0
- orthonym-1.0.0/tests/unit/rules/test_heterocycle_substituents.py +85 -0
- orthonym-1.0.0/tests/unit/rules/test_heterol_suffix.py +71 -0
- orthonym-1.0.0/tests/unit/rules/test_hw_locant_citation_order.py +104 -0
- orthonym-1.0.0/tests/unit/rules/test_hw_vs_replacement_boundary.py +184 -0
- orthonym-1.0.0/tests/unit/rules/test_hydrazide.py +112 -0
- orthonym-1.0.0/tests/unit/rules/test_hydro_fused_substituent_locants.py +269 -0
- orthonym-1.0.0/tests/unit/rules/test_hydro_indicated_h_locant_disjoint.py +180 -0
- orthonym-1.0.0/tests/unit/rules/test_hydro_mancude_indicated_h.py +295 -0
- orthonym-1.0.0/tests/unit/rules/test_hypervalent_iodine.py +96 -0
- orthonym-1.0.0/tests/unit/rules/test_identify_parent_and_child.py +88 -0
- orthonym-1.0.0/tests/unit/rules/test_indicated_hydrogen.py +286 -0
- orthonym-1.0.0/tests/unit/rules/test_inorganic_anion_salts.py +61 -0
- orthonym-1.0.0/tests/unit/rules/test_ions.py +827 -0
- orthonym-1.0.0/tests/unit/rules/test_is_cyclic_removal.py +140 -0
- orthonym-1.0.0/tests/unit/rules/test_isotope_distinct_multi_locant.py +70 -0
- orthonym-1.0.0/tests/unit/rules/test_isotope_reclaim.py +106 -0
- orthonym-1.0.0/tests/unit/rules/test_isotopes.py +576 -0
- orthonym-1.0.0/tests/unit/rules/test_isotopes_p82_v52.py +841 -0
- orthonym-1.0.0/tests/unit/rules/test_isotopes_v36.py +137 -0
- orthonym-1.0.0/tests/unit/rules/test_iupac_errata_157.py +900 -0
- orthonym-1.0.0/tests/unit/rules/test_j12_verify_fixes.py +305 -0
- orthonym-1.0.0/tests/unit/rules/test_j5_pin_labels_b.py +102 -0
- orthonym-1.0.0/tests/unit/rules/test_j6_breadth.py +319 -0
- orthonym-1.0.0/tests/unit/rules/test_j7_defects_misc.py +302 -0
- orthonym-1.0.0/tests/unit/rules/test_lactam_n_locant.py +190 -0
- orthonym-1.0.0/tests/unit/rules/test_lactams.py +224 -0
- orthonym-1.0.0/tests/unit/rules/test_lactones.py +390 -0
- orthonym-1.0.0/tests/unit/rules/test_lambda5_heterone_family.py +406 -0
- orthonym-1.0.0/tests/unit/rules/test_lambda_azanyl_prefix.py +81 -0
- orthonym-1.0.0/tests/unit/rules/test_lambda_convention.py +123 -0
- orthonym-1.0.0/tests/unit/rules/test_lambda_fused.py +42 -0
- orthonym-1.0.0/tests/unit/rules/test_lambda_heteromonocycles.py +59 -0
- orthonym-1.0.0/tests/unit/rules/test_lambda_hydro_heteromonocycles.py +225 -0
- orthonym-1.0.0/tests/unit/rules/test_lipids.py +126 -0
- orthonym-1.0.0/tests/unit/rules/test_locant_alphabetical.py +238 -0
- orthonym-1.0.0/tests/unit/rules/test_locant_assignment.py +95 -0
- orthonym-1.0.0/tests/unit/rules/test_locant_one_elision.py +322 -0
- orthonym-1.0.0/tests/unit/rules/test_locant_str_coercion_and_perf_rescue.py +106 -0
- orthonym-1.0.0/tests/unit/rules/test_locant_validation.py +324 -0
- orthonym-1.0.0/tests/unit/rules/test_locants.py +505 -0
- orthonym-1.0.0/tests/unit/rules/test_locants_stereo_tiebreak.py +131 -0
- orthonym-1.0.0/tests/unit/rules/test_m25_workbudget.py +155 -0
- orthonym-1.0.0/tests/unit/rules/test_m41_vonbaeyer_gold_stable.py +127 -0
- orthonym-1.0.0/tests/unit/rules/test_m6_fused_catalog.py +205 -0
- orthonym-1.0.0/tests/unit/rules/test_macrocycle_naming.py +141 -0
- orthonym-1.0.0/tests/unit/rules/test_main_ring_memo.py +52 -0
- orthonym-1.0.0/tests/unit/rules/test_mancude_tautomer_assembly.py +163 -0
- orthonym-1.0.0/tests/unit/rules/test_masked_spiro.py +121 -0
- orthonym-1.0.0/tests/unit/rules/test_metal_adducts_best_effort.py +159 -0
- orthonym-1.0.0/tests/unit/rules/test_methylidene_guard.py +156 -0
- orthonym-1.0.0/tests/unit/rules/test_mixed_spiro_fused.py +679 -0
- orthonym-1.0.0/tests/unit/rules/test_mononuclear_hydrides.py +173 -0
- orthonym-1.0.0/tests/unit/rules/test_multi_anion.py +215 -0
- orthonym-1.0.0/tests/unit/rules/test_multi_ring_sub.py +274 -0
- orthonym-1.0.0/tests/unit/rules/test_multifragment_component_recovery.py +152 -0
- orthonym-1.0.0/tests/unit/rules/test_multifragment_reclaim.py +170 -0
- orthonym-1.0.0/tests/unit/rules/test_multiplicative.py +717 -0
- orthonym-1.0.0/tests/unit/rules/test_n_acyl_branch_coverage.py +73 -0
- orthonym-1.0.0/tests/unit/rules/test_n_aryl_amide_ring_fg.py +98 -0
- orthonym-1.0.0/tests/unit/rules/test_n_cation_non_pin_labels.py +173 -0
- orthonym-1.0.0/tests/unit/rules/test_n_locant_formatting.py +53 -0
- orthonym-1.0.0/tests/unit/rules/test_n_oxide_locant.py +167 -0
- orthonym-1.0.0/tests/unit/rules/test_n_oxyl_radicals.py +100 -0
- orthonym-1.0.0/tests/unit/rules/test_n_prefix_dedup.py +165 -0
- orthonym-1.0.0/tests/unit/rules/test_n_rooted_ring_amino_substituent.py +124 -0
- orthonym-1.0.0/tests/unit/rules/test_n_rooted_substituent_general.py +52 -0
- orthonym-1.0.0/tests/unit/rules/test_naming_cascade_quality.py +167 -0
- orthonym-1.0.0/tests/unit/rules/test_natural_products_aromatic_locants.py +188 -0
- orthonym-1.0.0/tests/unit/rules/test_natural_products_gap.py +230 -0
- orthonym-1.0.0/tests/unit/rules/test_natural_products_naming.py +570 -0
- orthonym-1.0.0/tests/unit/rules/test_natural_products_stereo_honesty.py +40 -0
- orthonym-1.0.0/tests/unit/rules/test_new_fg_classes.py +214 -0
- orthonym-1.0.0/tests/unit/rules/test_nitrile_oxide_prefix.py +85 -0
- orthonym-1.0.0/tests/unit/rules/test_non_pin_class_labels.py +217 -0
- orthonym-1.0.0/tests/unit/rules/test_nonreducing_oligo.py +237 -0
- orthonym-1.0.0/tests/unit/rules/test_np_aromatic_detection.py +97 -0
- orthonym-1.0.0/tests/unit/rules/test_np_decoration_completeness.py +61 -0
- orthonym-1.0.0/tests/unit/rules/test_np_decorations.py +231 -0
- orthonym-1.0.0/tests/unit/rules/test_np_modifications.py +396 -0
- orthonym-1.0.0/tests/unit/rules/test_np_saturated_stereo.py +104 -0
- orthonym-1.0.0/tests/unit/rules/test_np_stereoparents.py +157 -0
- orthonym-1.0.0/tests/unit/rules/test_np_vonbaeyer_fallback.py +139 -0
- orthonym-1.0.0/tests/unit/rules/test_nsubst_amidine_d1.py +141 -0
- orthonym-1.0.0/tests/unit/rules/test_numbering_feature_ladder.py +39 -0
- orthonym-1.0.0/tests/unit/rules/test_oligosaccharides_be_rt_gate.py +126 -0
- orthonym-1.0.0/tests/unit/rules/test_onium_hydride_parent_v52.py +97 -0
- orthonym-1.0.0/tests/unit/rules/test_opsin_acyloxy_format.py +175 -0
- orthonym-1.0.0/tests/unit/rules/test_opsin_format_compliance.py +994 -0
- orthonym-1.0.0/tests/unit/rules/test_organometallic_extension.py +112 -0
- orthonym-1.0.0/tests/unit/rules/test_organometallics.py +364 -0
- orthonym-1.0.0/tests/unit/rules/test_organometallics_p69_w8.py +429 -0
- orthonym-1.0.0/tests/unit/rules/test_oxo_prefix_senior_suffix.py +221 -0
- orthonym-1.0.0/tests/unit/rules/test_oxo_purine.py +143 -0
- orthonym-1.0.0/tests/unit/rules/test_oxoacid_anion_salts.py +64 -0
- orthonym-1.0.0/tests/unit/rules/test_p102_6_1_2_glycosyloxy.py +299 -0
- orthonym-1.0.0/tests/unit/rules/test_p11_needs_example_sweep.py +99 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_3_4_3_monosubstituted_locant.py +467 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_3_4_4_no_isomer_by_relocation.py +397 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_3_4_5_benzene_uniform.py +400 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_3_4_5_parent_scope.py +767 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_3_4_5_substituent_scope.py +601 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_3_4_peroxy_acid_locant.py +202 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_3_4_ring_suffix_locant.py +228 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_3_4_task3b_baked_locants.py +467 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_3_4_urea_letter_locants.py +92 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_4_g_total_order.py +713 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_4_j_numbering_determinism.py +444 -0
- orthonym-1.0.0/tests/unit/rules/test_p14_4_pcg_lowest_locant.py +520 -0
- orthonym-1.0.0/tests/unit/rules/test_p16_3_5_heterocycle_bis_multiplier.py +86 -0
- orthonym-1.0.0/tests/unit/rules/test_p1_branch_losses.py +380 -0
- orthonym-1.0.0/tests/unit/rules/test_p22_2_1_locant_bearing_retained_pins.py +258 -0
- orthonym-1.0.0/tests/unit/rules/test_p22_2_1_pyran_indicated_hydrogen.py +116 -0
- orthonym-1.0.0/tests/unit/rules/test_p41_fused_heteroaryl_ol_suffix.py +90 -0
- orthonym-1.0.0/tests/unit/rules/test_p41_fused_n_substituted_amine.py +96 -0
- orthonym-1.0.0/tests/unit/rules/test_p44_scorer.py +282 -0
- orthonym-1.0.0/tests/unit/rules/test_p4_oxoacid_anhydride.py +208 -0
- orthonym-1.0.0/tests/unit/rules/test_p68_element_guard_refutation.py +97 -0
- orthonym-1.0.0/tests/unit/rules/test_p6_cluster_e_bis_stereo_veto.py +50 -0
- orthonym-1.0.0/tests/unit/rules/test_p74_1_2_ring_zwitterion.py +278 -0
- orthonym-1.0.0/tests/unit/rules/test_p74_anion_locants.py +152 -0
- orthonym-1.0.0/tests/unit/rules/test_p7_inline_suffix_attachment.py +183 -0
- orthonym-1.0.0/tests/unit/rules/test_parent_correctness.py +274 -0
- orthonym-1.0.0/tests/unit/rules/test_parent_locant_parity.py +621 -0
- orthonym-1.0.0/tests/unit/rules/test_parent_selection.py +2012 -0
- orthonym-1.0.0/tests/unit/rules/test_partial_sat_amine_suffix.py +50 -0
- orthonym-1.0.0/tests/unit/rules/test_partial_saturation.py +470 -0
- orthonym-1.0.0/tests/unit/rules/test_partial_saturation_carbocycles.py +347 -0
- orthonym-1.0.0/tests/unit/rules/test_partial_saturation_nitrogen.py +65 -0
- orthonym-1.0.0/tests/unit/rules/test_peptide_backbone_substitutive.py +191 -0
- orthonym-1.0.0/tests/unit/rules/test_peptide_breadth.py +266 -0
- orthonym-1.0.0/tests/unit/rules/test_peptide_capped_termini.py +289 -0
- orthonym-1.0.0/tests/unit/rules/test_peptide_dispatch_proline_cterm.py +183 -0
- orthonym-1.0.0/tests/unit/rules/test_phane.py +215 -0
- orthonym-1.0.0/tests/unit/rules/test_phane_boundary.py +52 -0
- orthonym-1.0.0/tests/unit/rules/test_phane_pin.py +427 -0
- orthonym-1.0.0/tests/unit/rules/test_phase10_organometallic_core.py +112 -0
- orthonym-1.0.0/tests/unit/rules/test_phase11_carbohydrate.py +106 -0
- orthonym-1.0.0/tests/unit/rules/test_phase12_amino_acid.py +90 -0
- orthonym-1.0.0/tests/unit/rules/test_phase12_deferred.py +217 -0
- orthonym-1.0.0/tests/unit/rules/test_phase13b_a_s1.py +112 -0
- orthonym-1.0.0/tests/unit/rules/test_phase143_regressions.py +134 -0
- orthonym-1.0.0/tests/unit/rules/test_phase14_nucleosides.py +165 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_acyloxymethyl_ring.py +54 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_aryloxymethyl.py +90 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_bicyclo_branched_alkyl.py +60 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_bicyclo_substituent_dropguard.py +34 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_bridgehead_scope.py +41 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_diacylglycerol.py +131 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_e2_capability.py +352 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_e3_assembly.py +230 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_enclosing_marks.py +67 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_ester_ringacid.py +127 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_heteroacid_principal_chain.py +38 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_macrolactone.py +46 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_wave2_brace_escalation.py +27 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_wave2_heteroacid_extra_elements.py +43 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_wave2_independent_ester.py +95 -0
- orthonym-1.0.0/tests/unit/rules/test_phase6_wave2_nitro_locant.py +47 -0
- orthonym-1.0.0/tests/unit/rules/test_phase_h_stereo.py +175 -0
- orthonym-1.0.0/tests/unit/rules/test_phosphoanhydride_substituent.py +150 -0
- orthonym-1.0.0/tests/unit/rules/test_phospholipids_p107.py +59 -0
- orthonym-1.0.0/tests/unit/rules/test_phosphorus.py +681 -0
- orthonym-1.0.0/tests/unit/rules/test_phosphorus_smarts.py +208 -0
- orthonym-1.0.0/tests/unit/rules/test_phosphorus_substituent_structure_proof.py +140 -0
- orthonym-1.0.0/tests/unit/rules/test_pin_heteroaryl_substituent.py +134 -0
- orthonym-1.0.0/tests/unit/rules/test_pin_vocabulary.py +261 -0
- orthonym-1.0.0/tests/unit/rules/test_pnictogen_oxoacids.py +514 -0
- orthonym-1.0.0/tests/unit/rules/test_polyazane.py +170 -0
- orthonym-1.0.0/tests/unit/rules/test_polycation.py +144 -0
- orthonym-1.0.0/tests/unit/rules/test_polychalcogen.py +66 -0
- orthonym-1.0.0/tests/unit/rules/test_polycyclic_bridged.py +468 -0
- orthonym-1.0.0/tests/unit/rules/test_polycyclic_exocyclic_ylidene.py +136 -0
- orthonym-1.0.0/tests/unit/rules/test_polycyclic_features.py +392 -0
- orthonym-1.0.0/tests/unit/rules/test_polycyclic_hetero.py +553 -0
- orthonym-1.0.0/tests/unit/rules/test_polycyclic_iupac_locants.py +203 -0
- orthonym-1.0.0/tests/unit/rules/test_polycyclic_simple_paths.py +92 -0
- orthonym-1.0.0/tests/unit/rules/test_polycyclic_vb.py +791 -0
- orthonym-1.0.0/tests/unit/rules/test_polycyclic_von_baeyer.py +520 -0
- orthonym-1.0.0/tests/unit/rules/test_polyfunctional_detection.py +52 -0
- orthonym-1.0.0/tests/unit/rules/test_polyol_polyester.py +59 -0
- orthonym-1.0.0/tests/unit/rules/test_polyspiro_fused_component_coverage.py +109 -0
- orthonym-1.0.0/tests/unit/rules/test_polyvalent_radicals.py +125 -0
- orthonym-1.0.0/tests/unit/rules/test_preexisting_pin_spelling.py +303 -0
- orthonym-1.0.0/tests/unit/rules/test_prefix_emission.py +122 -0
- orthonym-1.0.0/tests/unit/rules/test_prefix_order_fallback.py +245 -0
- orthonym-1.0.0/tests/unit/rules/test_principal_group_parent_membership.py +85 -0
- orthonym-1.0.0/tests/unit/rules/test_ps1_stereo_completeness.py +73 -0
- orthonym-1.0.0/tests/unit/rules/test_pseudoasymmetric_verification.py +131 -0
- orthonym-1.0.0/tests/unit/rules/test_pseudoketone_not_hydro.py +162 -0
- orthonym-1.0.0/tests/unit/rules/test_pubchem_losses.py +198 -0
- orthonym-1.0.0/tests/unit/rules/test_purine_best_effort_substituent.py +199 -0
- orthonym-1.0.0/tests/unit/rules/test_purine_oxo.py +84 -0
- orthonym-1.0.0/tests/unit/rules/test_quaternary_aminium.py +88 -0
- orthonym-1.0.0/tests/unit/rules/test_quaternary_aminium_locant.py +144 -0
- orthonym-1.0.0/tests/unit/rules/test_r1fix_cyclic_urea_and_symmetric_locant.py +109 -0
- orthonym-1.0.0/tests/unit/rules/test_r_group_naming.py +47 -0
- orthonym-1.0.0/tests/unit/rules/test_radical_184.py +84 -0
- orthonym-1.0.0/tests/unit/rules/test_radical_producers_strict_rt.py +117 -0
- orthonym-1.0.0/tests/unit/rules/test_radicals.py +533 -0
- orthonym-1.0.0/tests/unit/rules/test_radicals_b11_radical_ions.py +85 -0
- orthonym-1.0.0/tests/unit/rules/test_radicals_b3_b4.py +69 -0
- orthonym-1.0.0/tests/unit/rules/test_radicals_b5_carbon.py +47 -0
- orthonym-1.0.0/tests/unit/rules/test_radicals_b6_multicentre.py +47 -0
- orthonym-1.0.0/tests/unit/rules/test_radicals_b7_routing.py +46 -0
- orthonym-1.0.0/tests/unit/rules/test_radicals_b8_spelling.py +58 -0
- orthonym-1.0.0/tests/unit/rules/test_radicals_b9_nitrene.py +47 -0
- orthonym-1.0.0/tests/unit/rules/test_radicals_methane_and_chains.py +35 -0
- orthonym-1.0.0/tests/unit/rules/test_radicals_v36.py +160 -0
- orthonym-1.0.0/tests/unit/rules/test_reclaim_p2_a1_iodane_suffix.py +153 -0
- orthonym-1.0.0/tests/unit/rules/test_reclaim_p2_b1_hydro_prefix.py +238 -0
- orthonym-1.0.0/tests/unit/rules/test_reclaim_p2_b2_spiro_numbering.py +188 -0
- orthonym-1.0.0/tests/unit/rules/test_reclaim_stereo.py +351 -0
- orthonym-1.0.0/tests/unit/rules/test_recursive_substituent_downgrade.py +150 -0
- orthonym-1.0.0/tests/unit/rules/test_resonance_twins.py +175 -0
- orthonym-1.0.0/tests/unit/rules/test_retained_name_pin_status.py +377 -0
- orthonym-1.0.0/tests/unit/rules/test_retained_names_expansion.py +284 -0
- orthonym-1.0.0/tests/unit/rules/test_retained_ring_indicated_h_substitution.py +281 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_acid_ester_words.py +43 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_assemblies.py +642 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_assemblies_3plus.py +596 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_assembly_substituent.py +156 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_cation_locant_v52.py +138 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_ester_parent_monocycle.py +43 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_fg_substituents.py +142 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_heteroatom_variety.py +206 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_hydrazide_nn.py +178 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_junction_stereo.py +391 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_locant_numbering.py +94 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_n_carboxy_suffix.py +98 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_n_sulfinate_anion.py +86 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_parent_p4521_tiebreak.py +72 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_replacement.py +460 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_score_memo.py +26 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_selection.py +317 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_senior_to_chain_p44_1_2_2.py +107 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_sub_naming.py +127 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_substituent_names.py +103 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_substituent_relative.py +82 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_substituents.py +283 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_sulfonic_sulfinic_suffix.py +124 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_tier_order_p52.py +207 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_unsaturation.py +352 -0
- orthonym-1.0.0/tests/unit/rules/test_ring_unsaturation_tier.py +65 -0
- orthonym-1.0.0/tests/unit/rules/test_ringsubst_azole_stems.py +74 -0
- orthonym-1.0.0/tests/unit/rules/test_s_rooted_ring_sulfanyl_substituent.py +159 -0
- orthonym-1.0.0/tests/unit/rules/test_salt_cations_v36.py +251 -0
- orthonym-1.0.0/tests/unit/rules/test_salt_neutral_coformer.py +101 -0
- orthonym-1.0.0/tests/unit/rules/test_salt_stoichiometry_v36.py +207 -0
- orthonym-1.0.0/tests/unit/rules/test_salts.py +249 -0
- orthonym-1.0.0/tests/unit/rules/test_second_substituent_enclosure.py +60 -0
- orthonym-1.0.0/tests/unit/rules/test_seniority_completeness.py +239 -0
- orthonym-1.0.0/tests/unit/rules/test_seniority_equalization.py +61 -0
- orthonym-1.0.0/tests/unit/rules/test_seniority_frn.py +216 -0
- orthonym-1.0.0/tests/unit/rules/test_seniority_multiplicative_v52.py +116 -0
- orthonym-1.0.0/tests/unit/rules/test_seniority_swap.py +416 -0
- orthonym-1.0.0/tests/unit/rules/test_seniority_thiol_hydroperoxide.py +67 -0
- orthonym-1.0.0/tests/unit/rules/test_silacycle_ring.py +31 -0
- orthonym-1.0.0/tests/unit/rules/test_skeletal_replacement.py +740 -0
- orthonym-1.0.0/tests/unit/rules/test_spaced_prefix_backstop.py +34 -0
- orthonym-1.0.0/tests/unit/rules/test_spiro.py +500 -0
- orthonym-1.0.0/tests/unit/rules/test_spiro_fused_component_numbering.py +81 -0
- orthonym-1.0.0/tests/unit/rules/test_spiro_g4.py +356 -0
- orthonym-1.0.0/tests/unit/rules/test_spiro_multi.py +305 -0
- orthonym-1.0.0/tests/unit/rules/test_spiro_named_components_fusion.py +139 -0
- orthonym-1.0.0/tests/unit/rules/test_spiro_numbering.py +199 -0
- orthonym-1.0.0/tests/unit/rules/test_spiro_quinone_alkaloid.py +71 -0
- orthonym-1.0.0/tests/unit/rules/test_spiro_side_ring_numbering.py +121 -0
- orthonym-1.0.0/tests/unit/rules/test_spirobi_hydro_hoisting.py +405 -0
- orthonym-1.0.0/tests/unit/rules/test_stereo_backstop.py +256 -0
- orthonym-1.0.0/tests/unit/rules/test_stereo_benzene_ester.py +268 -0
- orthonym-1.0.0/tests/unit/rules/test_stereo_fabrication_controls.py +39 -0
- orthonym-1.0.0/tests/unit/rules/test_stereo_mismatch_fixes.py +257 -0
- orthonym-1.0.0/tests/unit/rules/test_stereo_omission_reclaim.py +148 -0
- orthonym-1.0.0/tests/unit/rules/test_stereo_path_addition.py +262 -0
- orthonym-1.0.0/tests/unit/rules/test_stereochemistry.py +811 -0
- orthonym-1.0.0/tests/unit/rules/test_steroid_alpha_beta.py +133 -0
- orthonym-1.0.0/tests/unit/rules/test_steroid_conjugate.py +164 -0
- orthonym-1.0.0/tests/unit/rules/test_substituent_naming.py +357 -0
- orthonym-1.0.0/tests/unit/rules/test_substituted_purine.py +91 -0
- orthonym-1.0.0/tests/unit/rules/test_substituted_ring_cation.py +118 -0
- orthonym-1.0.0/tests/unit/rules/test_suffix_context.py +107 -0
- orthonym-1.0.0/tests/unit/rules/test_sugar_names.py +282 -0
- orthonym-1.0.0/tests/unit/rules/test_sulfate_ester.py +102 -0
- orthonym-1.0.0/tests/unit/rules/test_sulfinamides_class.py +186 -0
- orthonym-1.0.0/tests/unit/rules/test_sulfonamides_n_substituted.py +229 -0
- orthonym-1.0.0/tests/unit/rules/test_sulfonamido_substituent_general.py +225 -0
- orthonym-1.0.0/tests/unit/rules/test_sulfur.py +249 -0
- orthonym-1.0.0/tests/unit/rules/test_systematic_carbohydrate.py +752 -0
- orthonym-1.0.0/tests/unit/rules/test_task9_point_fixes.py +297 -0
- orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_chain.py +419 -0
- orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_chain_to_ring.py +86 -0
- orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_chiral.py +49 -0
- orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_composite.py +168 -0
- orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_oxo_branch.py +139 -0
- orthonym-1.0.0/tests/unit/rules/test_terminal_fragment_unsaturated_stereo.py +82 -0
- orthonym-1.0.0/tests/unit/rules/test_terminal_n_prefixes.py +161 -0
- orthonym-1.0.0/tests/unit/rules/test_terphenyl_middle_locant_determinism.py +38 -0
- orthonym-1.0.0/tests/unit/rules/test_thiocarboxylic_acids.py +202 -0
- orthonym-1.0.0/tests/unit/rules/test_tier2a_imine_oxime.py +117 -0
- orthonym-1.0.0/tests/unit/rules/test_tier2c_ring_ketone_locant.py +77 -0
- orthonym-1.0.0/tests/unit/rules/test_tier2d_data_flips.py +131 -0
- orthonym-1.0.0/tests/unit/rules/test_tier3a_skeletal_parent.py +288 -0
- orthonym-1.0.0/tests/unit/rules/test_tier3b_sulfoxide_substitutive.py +287 -0
- orthonym-1.0.0/tests/unit/rules/test_tier3cd_styryl_sulfonimidamide.py +97 -0
- orthonym-1.0.0/tests/unit/rules/test_tier3d_composite_n.py +109 -0
- orthonym-1.0.0/tests/unit/rules/test_tier4_fused_catalog.py +137 -0
- orthonym-1.0.0/tests/unit/rules/test_tier5a_multiplicative.py +209 -0
- orthonym-1.0.0/tests/unit/rules/test_tier5b_located_substituted_alkyl.py +122 -0
- orthonym-1.0.0/tests/unit/rules/test_tier5c_acyl_prefix_on_senior.py +84 -0
- orthonym-1.0.0/tests/unit/rules/test_tier5d_het_carboxamide_n.py +56 -0
- orthonym-1.0.0/tests/unit/rules/test_tier6_exotics.py +347 -0
- orthonym-1.0.0/tests/unit/rules/test_try_algorithmic_fusion_name.py +58 -0
- orthonym-1.0.0/tests/unit/rules/test_uronium.py +62 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_bp1_nucleobase_heterone.py +68 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_bp2_rc2b_polyacid_monoester.py +62 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_bp2_rc3_unsaturated_oxo_substituent.py +77 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_bp2_rc5_urea_enclosure.py +54 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_bp2_substituent_strings.py +83 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_bp3_c1_chalcogen_aminoacid.py +27 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_bp4_fused_substituent.py +305 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_bp4p4_flavone_dehead.py +55 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_bp5_amide_ring_absorb.py +38 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_heteroaryl_ether_substituent.py +44 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_p2_aromatic_vonbaeyer.py +401 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_p3_failclosed_routing.py +308 -0
- orthonym-1.0.0/tests/unit/rules/test_v26_triazine_ring_polyamine.py +38 -0
- orthonym-1.0.0/tests/unit/rules/test_v27_cage_substituent.py +203 -0
- orthonym-1.0.0/tests/unit/rules/test_v27_p3_spiro_engine.py +240 -0
- orthonym-1.0.0/tests/unit/rules/test_v27_p4_thione.py +77 -0
- orthonym-1.0.0/tests/unit/rules/test_v28_composer1.py +460 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_p2_vb_ring_count.py +354 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_p3_organyl_routing.py +1630 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_p3b_italicized_prefix.py +584 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_p3b_refusal_sentinels.py +156 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_p3cleanup_enclosure.py +202 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_p3fix_determinism_total_order.py +207 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_p3fix_formazan_prefixes.py +85 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_p3fix_stereo_expression.py +431 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_p3reg_fg_prefix_enclosure.py +176 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_p8_bridging_amine_determinism.py +135 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_phase5_ester_organyl_primitive.py +150 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_phase6_decorated_phenyl_substituent.py +222 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_phase7_locant_hyphen.py +202 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_phase7_prefix_vocabulary.py +240 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_phase7_stereo_locant_resolution.py +707 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_replacement_prefix_totality.py +817 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_t2_count_based_naming.py +306 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_table_1_5_completion.py +660 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_taskS2_polycyclic_legality_wiring.py +193 -0
- orthonym-1.0.0/tests/unit/rules/test_v29_taskS_vb_descriptor_legality.py +214 -0
- orthonym-1.0.0/tests/unit/rules/test_v30_piece2_decorated_fused_substituent.py +125 -0
- orthonym-1.0.0/tests/unit/rules/test_v30_primed_locant_stereo_sort.py +46 -0
- orthonym-1.0.0/tests/unit/rules/test_v30_sliceC_acetic_amido.py +86 -0
- orthonym-1.0.0/tests/unit/rules/test_v30_sliceC_ring_acyl_amido.py +91 -0
- orthonym-1.0.0/tests/unit/rules/test_v30_t4_phosphane_ring_subs.py +62 -0
- orthonym-1.0.0/tests/unit/rules/test_v30_terminal_ring.py +441 -0
- orthonym-1.0.0/tests/unit/rules/test_v31_aroyl_anilide_seniority.py +80 -0
- orthonym-1.0.0/tests/unit/rules/test_v31_compound_alkyl_enclosure.py +61 -0
- orthonym-1.0.0/tests/unit/rules/test_v31_deeper_amide.py +77 -0
- orthonym-1.0.0/tests/unit/rules/test_v31_ester_ring_alcohol_component.py +42 -0
- orthonym-1.0.0/tests/unit/rules/test_v31_substituent_stereo_locant.py +36 -0
- orthonym-1.0.0/tests/unit/rules/test_v34_composed_charge.py +972 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_acyloxy_general.py +149 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_corestereo.py +190 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_ct5_threeway.py +95 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_sp1_areplacement_spelling.py +96 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_sp1_compound_substituent.py +101 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_sp1_parent_offer.py +125 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_sp1_recursive_fragment.py +173 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_sp1_vonbaeyer_seniority.py +66 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_sp2_bicyclic_seniority.py +54 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_sp2_deep_numbering.py +81 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_sp2_spiro_substituent.py +99 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_sp2_spiro_vb_spelling.py +50 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_sp5_flag_isolation.py +67 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_spiro_hoist.py +109 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_stereo_completion.py +297 -0
- orthonym-1.0.0/tests/unit/rules/test_v37_tierpolicy.py +243 -0
- orthonym-1.0.0/tests/unit/rules/test_v38_cp2_fused_locants.py +217 -0
- orthonym-1.0.0/tests/unit/rules/test_v38_cp2b_catalog_fused_locants.py +138 -0
- orthonym-1.0.0/tests/unit/rules/test_v38_drop12_phospho.py +197 -0
- orthonym-1.0.0/tests/unit/rules/test_v38_drop23_phosphodiester.py +171 -0
- orthonym-1.0.0/tests/unit/rules/test_v38_incr1a_glycoside_aglycone.py +193 -0
- orthonym-1.0.0/tests/unit/rules/test_v38_peptide_substitutive.py +212 -0
- orthonym-1.0.0/tests/unit/rules/test_v38_salt.py +212 -0
- orthonym-1.0.0/tests/unit/rules/test_v42_11b1_sulfur_oxoacid_prefix.py +203 -0
- orthonym-1.0.0/tests/unit/rules/test_v42_11c1_locant_hyphen_pins.py +93 -0
- orthonym-1.0.0/tests/unit/rules/test_v42_11c2_selection_pins.py +156 -0
- orthonym-1.0.0/tests/unit/rules/test_v42_11c3_pin_spelling.py +235 -0
- orthonym-1.0.0/tests/unit/rules/test_v42_7c2_hydrazinyl_prefix.py +103 -0
- orthonym-1.0.0/tests/unit/rules/test_v42_fablefix_pnictogen.py +107 -0
- orthonym-1.0.0/tests/unit/rules/test_v42_p11_ene_before_yne_tiebreak.py +142 -0
- orthonym-1.0.0/tests/unit/rules/test_v42_p3c_acyl_prefix_substituent.py +93 -0
- orthonym-1.0.0/tests/unit/rules/test_v42_p6f_ring_thiolactam_suffix.py +93 -0
- orthonym-1.0.0/tests/unit/rules/test_v42_p9_fusion_numbering_tiebreak.py +121 -0
- orthonym-1.0.0/tests/unit/rules/test_v52_acid_deriv.py +264 -0
- orthonym-1.0.0/tests/unit/rules/test_v52_p04_fusion_select.py +121 -0
- orthonym-1.0.0/tests/unit/rules/test_v52_phase02_noncarbon.py +172 -0
- orthonym-1.0.0/tests/unit/rules/test_von_baeyer_locant_orientation.py +148 -0
- orthonym-1.0.0/tests/unit/rules/test_von_baeyer_vowel_elision.py +140 -0
- orthonym-1.0.0/tests/unit/rules/test_vonbaeyer_parent_fallback.py +481 -0
- orthonym-1.0.0/tests/unit/rules/test_vonbaeyer_spiro.py +200 -0
- orthonym-1.0.0/tests/unit/rules/test_vonbaeyer_universal.py +98 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1_amide.py +290 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_benzyl.py +34 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_chain_vs_ring_pg.py +49 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_free_valence.py +34 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_heterochain_acid.py +28 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_multiring_pg.py +62 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_substituted_benzyl.py +20 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fc_verified_head.py +32 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_am2_amide.py +32 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_am3_failclosed.py +35 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_carbamimidate.py +20 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_carbamoylamino_nsub.py +30 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_cyclic_carbonate.py +32 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_heteroimine.py +26 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_imido_prefix.py +74 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_ketene_completion.py +38 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_oxamoylimino.py +34 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_ring_imino.py +35 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_ring_peroxol.py +29 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_semicarbazone.py +33 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_sulfonimidamide.py +30 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_thioacyl_amide.py +55 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_thioamide_chain.py +24 -0
- orthonym-1.0.0/tests/unit/rules/test_w2e_p1fg_verified_head.py +55 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p10_fusion.py +78 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p1_alpha_benzyl.py +185 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p1_oxybis_methylene.py +173 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p3_polyfunctional_branch.py +79 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p4_dihydro_hw.py +43 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p4_ring_imine.py +76 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p6_urea_acyclic.py +19 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p6_urea_naphthalene.py +23 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p7_evidence.py +14 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p7_lambda_naming.py +22 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p7_numbering.py +13 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p7_phosphanyl.py +29 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p8_aryl_substituent.py +67 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p8_diarylamine_build.py +35 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p8_diarylamine_evidence.py +34 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p8_ether_evidence.py +37 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p8_fail_closed.py +52 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p8_multiplicative_declines.py +22 -0
- orthonym-1.0.0/tests/unit/rules/test_w2f_p8_phenoxy.py +33 -0
- orthonym-1.0.0/tests/unit/rules/test_w8p2_aryloxy_substituent.py +58 -0
- orthonym-1.0.0/tests/unit/rules/test_w8p2_ring_assembly_pcg.py +208 -0
- orthonym-1.0.0/tests/unit/rules/test_wave0_safety_leaks.py +71 -0
- orthonym-1.0.0/tests/unit/rules/test_wave1_roots.py +193 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_b1_skeletal.py +178 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_b2_multiplicative.py +132 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_b3_bridged_fused.py +112 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_b4_misc.py +206 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_c.py +142 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_c2.py +192 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_d.py +179 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_t1.py +182 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_t2_amide_n.py +40 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_t2_data_catalog.py +95 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_t2_mult_bridges.py +33 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_completion_t2_ring_fg.py +48 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_p1_chains_a.py +262 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_p1_chains_b.py +195 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_p3_ring_selection.py +196 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_p3_spiro.py +202 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_p5_bridged.py +244 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_p5_fused.py +263 -0
- orthonym-1.0.0/tests/unit/rules/test_wave2_p9_spiro_named_components.py +64 -0
- orthonym-1.0.0/tests/unit/rules/test_wave8_p1_roots.py +95 -0
- orthonym-1.0.0/tests/unit/rules/test_word_rules.py +97 -0
- orthonym-1.0.0/tests/unit/rules/test_zwitterion_betaine_unsat.py +70 -0
- orthonym-1.0.0/tests/unit/scripts/__init__.py +0 -0
- orthonym-1.0.0/tests/unit/scripts/test_calibrate_phase_148_1.py +274 -0
- orthonym-1.0.0/tests/unit/scripts/test_extract_chebi_expanded.py +179 -0
- orthonym-1.0.0/tests/unit/scripts/test_extract_pubchem.py +96 -0
- orthonym-1.0.0/tests/unit/scripts/test_gate_row_flips.py +248 -0
- orthonym-1.0.0/tests/unit/scripts/test_generate_calibration_splits.py +140 -0
- orthonym-1.0.0/tests/unit/scripts/test_generate_calibration_splits_148_1.py +193 -0
- orthonym-1.0.0/tests/unit/scripts/test_issue108_tools.py +1047 -0
- orthonym-1.0.0/tests/unit/scripts/test_phase146_factor_distributions.py +195 -0
- orthonym-1.0.0/tests/unit/scripts/test_phase146_ship_gate.py +562 -0
- orthonym-1.0.0/tests/unit/test_acid_halides.py +262 -0
- orthonym-1.0.0/tests/unit/test_acylamino_ring_fix.py +64 -0
- orthonym-1.0.0/tests/unit/test_alkanes.py +264 -0
- orthonym-1.0.0/tests/unit/test_amide_ez_stereo.py +112 -0
- orthonym-1.0.0/tests/unit/test_amides.py +352 -0
- orthonym-1.0.0/tests/unit/test_amino_acid_fg_bailout.py +88 -0
- orthonym-1.0.0/tests/unit/test_amino_acids.py +654 -0
- orthonym-1.0.0/tests/unit/test_anhydrides.py +161 -0
- orthonym-1.0.0/tests/unit/test_atom_coverage.py +173 -0
- orthonym-1.0.0/tests/unit/test_bbr_gate_stereo.py +111 -0
- orthonym-1.0.0/tests/unit/test_bbr_perc_chain_exclusion.py +75 -0
- orthonym-1.0.0/tests/unit/test_benzene.py +556 -0
- orthonym-1.0.0/tests/unit/test_besteffort_full_rt_gate.py +121 -0
- orthonym-1.0.0/tests/unit/test_boronic_acid.py +58 -0
- orthonym-1.0.0/tests/unit/test_branched_ester_prefix.py +117 -0
- orthonym-1.0.0/tests/unit/test_c7_brackets_triazine.py +97 -0
- orthonym-1.0.0/tests/unit/test_carotenoid_tier_honesty.py +76 -0
- orthonym-1.0.0/tests/unit/test_chain_fg_exclusion.py +225 -0
- orthonym-1.0.0/tests/unit/test_charged_retained_first.py +44 -0
- orthonym-1.0.0/tests/unit/test_classify_self01.py +63 -0
- orthonym-1.0.0/tests/unit/test_cluster_coverage_tell.py +130 -0
- orthonym-1.0.0/tests/unit/test_coverage_contract.py +372 -0
- orthonym-1.0.0/tests/unit/test_coverage_gates.py +425 -0
- orthonym-1.0.0/tests/unit/test_coverage_veto.py +168 -0
- orthonym-1.0.0/tests/unit/test_cycloalkanes.py +222 -0
- orthonym-1.0.0/tests/unit/test_cycloalkenes.py +226 -0
- orthonym-1.0.0/tests/unit/test_d2_nsubst_diamine.py +154 -0
- orthonym-1.0.0/tests/unit/test_decomposition_stereo.py +419 -0
- orthonym-1.0.0/tests/unit/test_defect_distance_instrument.py +268 -0
- orthonym-1.0.0/tests/unit/test_determinism_lone_pair_spellings.py +100 -0
- orthonym-1.0.0/tests/unit/test_diacids_multisuffix.py +175 -0
- orthonym-1.0.0/tests/unit/test_discover_substituents.py +400 -0
- orthonym-1.0.0/tests/unit/test_e1_numbering_determinism.py +360 -0
- orthonym-1.0.0/tests/unit/test_e2_seniority_cascade.py +275 -0
- orthonym-1.0.0/tests/unit/test_emit_tier_flags.py +127 -0
- orthonym-1.0.0/tests/unit/test_esters.py +907 -0
- orthonym-1.0.0/tests/unit/test_exocyclic_naming.py +385 -0
- orthonym-1.0.0/tests/unit/test_factor_multiple_bond_count.py +271 -0
- orthonym-1.0.0/tests/unit/test_finish_shadow_audit.py +156 -0
- orthonym-1.0.0/tests/unit/test_fragment_naming.py +282 -0
- orthonym-1.0.0/tests/unit/test_functional_groups.py +147 -0
- orthonym-1.0.0/tests/unit/test_functional_groups_naming.py +342 -0
- orthonym-1.0.0/tests/unit/test_g0_fail_closed.py +289 -0
- orthonym-1.0.0/tests/unit/test_g1_bridged_fused.py +132 -0
- orthonym-1.0.0/tests/unit/test_gate_parallel_equivalence.py +142 -0
- orthonym-1.0.0/tests/unit/test_gate_set_regression.py +70 -0
- orthonym-1.0.0/tests/unit/test_gate_stereo_fabrication.py +22 -0
- orthonym-1.0.0/tests/unit/test_general_fallback_wiring.py +342 -0
- orthonym-1.0.0/tests/unit/test_graded_scoring.py +361 -0
- orthonym-1.0.0/tests/unit/test_harness_radical_scoring.py +33 -0
- orthonym-1.0.0/tests/unit/test_harness_run_id.py +36 -0
- orthonym-1.0.0/tests/unit/test_heterocycle_detection.py +861 -0
- orthonym-1.0.0/tests/unit/test_heterocycle_naming.py +755 -0
- orthonym-1.0.0/tests/unit/test_hw_data.py +476 -0
- orthonym-1.0.0/tests/unit/test_hydroperoxides.py +112 -0
- orthonym-1.0.0/tests/unit/test_hyg02_error_catalog.py +181 -0
- orthonym-1.0.0/tests/unit/test_imine_oxime_hydrazone.py +227 -0
- orthonym-1.0.0/tests/unit/test_inline_g1_stereo_conflict.py +131 -0
- orthonym-1.0.0/tests/unit/test_ion_suffix_seam.py +233 -0
- orthonym-1.0.0/tests/unit/test_jars.py +162 -0
- orthonym-1.0.0/tests/unit/test_jars_front_door.py +74 -0
- orthonym-1.0.0/tests/unit/test_jvm_budget.py +273 -0
- orthonym-1.0.0/tests/unit/test_mba172_moving_base_atom.py +110 -0
- orthonym-1.0.0/tests/unit/test_multi_amide_quality_gate.py +143 -0
- orthonym-1.0.0/tests/unit/test_multiplicative.py +247 -0
- orthonym-1.0.0/tests/unit/test_multiplicative_prefix_names.py +96 -0
- orthonym-1.0.0/tests/unit/test_n_oxide_isocyanate_carbamate.py +194 -0
- orthonym-1.0.0/tests/unit/test_n_substituent_naming.py +77 -0
- orthonym-1.0.0/tests/unit/test_name_substituent.py +488 -0
- orthonym-1.0.0/tests/unit/test_name_with_confidence_isotope_v36.py +103 -0
- orthonym-1.0.0/tests/unit/test_name_with_tree_threadsafety.py +39 -0
- orthonym-1.0.0/tests/unit/test_namer_style.py +58 -0
- orthonym-1.0.0/tests/unit/test_nitriles.py +228 -0
- orthonym-1.0.0/tests/unit/test_no_sentinel_emission.py +227 -0
- orthonym-1.0.0/tests/unit/test_np_ester_decoration.py +136 -0
- orthonym-1.0.0/tests/unit/test_offer_at_finish.py +146 -0
- orthonym-1.0.0/tests/unit/test_opsin_gate_test_harness.py +215 -0
- orthonym-1.0.0/tests/unit/test_opsin_validity_gate.py +394 -0
- orthonym-1.0.0/tests/unit/test_peptides.py +442 -0
- orthonym-1.0.0/tests/unit/test_perception_171_gold_tripwires.py +149 -0
- orthonym-1.0.0/tests/unit/test_phase21_opsin_regression.py +187 -0
- orthonym-1.0.0/tests/unit/test_phase25_quick_wins.py +61 -0
- orthonym-1.0.0/tests/unit/test_phase26_ether_fixes.py +218 -0
- orthonym-1.0.0/tests/unit/test_phase26_stereo_fixes.py +219 -0
- orthonym-1.0.0/tests/unit/test_phase27_isoindoline.py +232 -0
- orthonym-1.0.0/tests/unit/test_phase8_boron_group14.py +135 -0
- orthonym-1.0.0/tests/unit/test_phase9_oxoacids_frn.py +550 -0
- orthonym-1.0.0/tests/unit/test_pin_policy.py +488 -0
- orthonym-1.0.0/tests/unit/test_polycyclics.py +417 -0
- orthonym-1.0.0/tests/unit/test_polyfunctional_basic.py +336 -0
- orthonym-1.0.0/tests/unit/test_process_cache.py +60 -0
- orthonym-1.0.0/tests/unit/test_proline_acceptor_peptides.py +86 -0
- orthonym-1.0.0/tests/unit/test_provenance_stereo_flag.py +77 -0
- orthonym-1.0.0/tests/unit/test_pubchem_validator.py +272 -0
- orthonym-1.0.0/tests/unit/test_quality_gate_confidence.py +165 -0
- orthonym-1.0.0/tests/unit/test_registration_hash_gate.py +71 -0
- orthonym-1.0.0/tests/unit/test_ring_locant_coordination.py +118 -0
- orthonym-1.0.0/tests/unit/test_rt_assert_helper.py +48 -0
- orthonym-1.0.0/tests/unit/test_rt_match_stereo_conflict.py +128 -0
- orthonym-1.0.0/tests/unit/test_rt_over_pool.py +262 -0
- orthonym-1.0.0/tests/unit/test_runtime_cache.py +187 -0
- orthonym-1.0.0/tests/unit/test_runtime_tuning.py +45 -0
- orthonym-1.0.0/tests/unit/test_salt_oxidation_state.py +46 -0
- orthonym-1.0.0/tests/unit/test_self01_stereo_completeness.py +73 -0
- orthonym-1.0.0/tests/unit/test_self_consistency_ez.py +84 -0
- orthonym-1.0.0/tests/unit/test_size_cutoff_removal.py +97 -0
- orthonym-1.0.0/tests/unit/test_species_detection_fixes.py +251 -0
- orthonym-1.0.0/tests/unit/test_stereo_integration.py +377 -0
- orthonym-1.0.0/tests/unit/test_stereo_locant_fix.py +169 -0
- orthonym-1.0.0/tests/unit/test_stereo_locant_fixes.py +238 -0
- orthonym-1.0.0/tests/unit/test_stereo_tier_policy.py +238 -0
- orthonym-1.0.0/tests/unit/test_substituent_enumerator.py +454 -0
- orthonym-1.0.0/tests/unit/test_substituent_internal_ez.py +198 -0
- orthonym-1.0.0/tests/unit/test_substituted_cycloalkanes.py +365 -0
- orthonym-1.0.0/tests/unit/test_substituted_heterocycles.py +359 -0
- orthonym-1.0.0/tests/unit/test_t4_floor_offer.py +185 -0
- orthonym-1.0.0/tests/unit/test_t4_floor_offer_fail_closed.py +188 -0
- orthonym-1.0.0/tests/unit/test_t4_rescue_guard.py +41 -0
- orthonym-1.0.0/tests/unit/test_t4_stereo_verify_before_commit_v35.py +72 -0
- orthonym-1.0.0/tests/unit/test_thread_local_cleanup_146.py +51 -0
- orthonym-1.0.0/tests/unit/test_triviality_controller_feature_flag.py +82 -0
- orthonym-1.0.0/tests/unit/test_unsaturation.py +220 -0
- orthonym-1.0.0/tests/unit/test_urea_guanidine.py +221 -0
- orthonym-1.0.0/tests/unit/test_v26_p0_complete_flag.py +133 -0
- orthonym-1.0.0/tests/unit/test_v29_p3close_diagnose_tool.py +372 -0
- orthonym-1.0.0/tests/unit/test_v29_phase4_gate_rejection_retries.py +93 -0
- orthonym-1.0.0/tests/unit/test_v29_phase7_gate_outcome_honesty.py +265 -0
- orthonym-1.0.0/tests/unit/test_valency_fixes.py +368 -0
- orthonym-1.0.0/tests/unit/test_wildcard_failclose.py +55 -0
- orthonym-1.0.0/tests/unit/test_zwitterion_salt.py +155 -0
- orthonym-1.0.0/tests/unit/validation/__init__.py +1 -0
- orthonym-1.0.0/tests/unit/validation/data/token_arity_truths.json +8906 -0
- orthonym-1.0.0/tests/unit/validation/test_atom_coverage_structural.py +281 -0
- orthonym-1.0.0/tests/unit/validation/test_binding_proof_wiring.py +272 -0
- orthonym-1.0.0/tests/unit/validation/test_binding_spine.py +899 -0
- orthonym-1.0.0/tests/unit/validation/test_binding_spine_p8_stereo.py +535 -0
- orthonym-1.0.0/tests/unit/validation/test_coverage_gate.py +96 -0
- orthonym-1.0.0/tests/unit/validation/test_determinism.py +87 -0
- orthonym-1.0.0/tests/unit/validation/test_e1_certificate.py +207 -0
- orthonym-1.0.0/tests/unit/validation/test_extended_smiles_fallback.py +51 -0
- orthonym-1.0.0/tests/unit/validation/test_free_valence_morphology.py +108 -0
- orthonym-1.0.0/tests/unit/validation/test_jvm_bridge_thread_exit.py +67 -0
- orthonym-1.0.0/tests/unit/validation/test_lexicon_disk_cache.py +80 -0
- orthonym-1.0.0/tests/unit/validation/test_name_exits_are_audited.py +372 -0
- orthonym-1.0.0/tests/unit/validation/test_name_morphemes.py +178 -0
- orthonym-1.0.0/tests/unit/validation/test_opsin_grammar.py +654 -0
- orthonym-1.0.0/tests/unit/validation/test_opsin_server_and_cip_cache.py +87 -0
- orthonym-1.0.0/tests/unit/validation/test_opsin_stdout_memo.py +35 -0
- orthonym-1.0.0/tests/unit/validation/test_pin_carveout_atom_coverage.py +295 -0
- orthonym-1.0.0/tests/unit/validation/test_pin_conformance_packs.py +143 -0
- orthonym-1.0.0/tests/unit/validation/test_proof_ledger.py +116 -0
- orthonym-1.0.0/tests/unit/validation/test_protonation_identity.py +134 -0
- orthonym-1.0.0/tests/unit/validation/test_radical_identity.py +85 -0
- orthonym-1.0.0/tests/unit/validation/test_reconstruct.py +138 -0
- orthonym-1.0.0/tests/unit/validation/test_rt_tripwire_is_not_a_gate.py +79 -0
- orthonym-1.0.0/tests/unit/validation/test_spine_free_valence.py +205 -0
- orthonym-1.0.0/tests/unit/validation/test_token_arity_soundness.py +444 -0
- orthonym-1.0.0/tests/unit/validation/test_v29_p2_ring_parent_bindings.py +595 -0
- orthonym-1.0.0/tests/unit/validation/test_v38_p1_warm_opsin.py +155 -0
- orthonym-1.0.0/tests/unit/validation/test_w2_jarabsent_coverage.py +177 -0
- orthonym-1.0.0/tests/validation/__init__.py +1 -0
- 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/
|