chython 3.0__tar.gz → 3.0.1__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.
- {chython-3.0/chython.egg-info → chython-3.0.1}/PKG-INFO +1 -1
- {chython-3.0 → chython-3.0.1}/build_inchi.py +8 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_libinchi_staging.py +80 -11
- {chython-3.0 → chython-3.0.1}/chython/test/test_release_build.py +88 -1
- {chython-3.0 → chython-3.0.1/chython.egg-info}/PKG-INFO +1 -1
- {chython-3.0 → chython-3.0.1}/pyproject.toml +1 -1
- {chython-3.0 → chython-3.0.1}/setup.py +8 -1
- {chython-3.0 → chython-3.0.1}/LICENSE +0 -0
- {chython-3.0 → chython-3.0.1}/MANIFEST.in +0 -0
- {chython-3.0 → chython-3.0.1}/README.md +0 -0
- {chython-3.0 → chython-3.0.1}/chython/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/_functions.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_abbreviations.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_canonicalize.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_counts.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_crippen.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_hydrogens.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_implicit.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_isomers.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_maccs.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_perceive.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_pharmacophore.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_protomers.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_qed.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_residues.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_resonance.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_salts.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_saturate.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_smarts.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_standardize.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_tables.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/_tpsa.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/abbreviations.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/acids.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/covalent_radii.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/crippen.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/hbond.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/maccs.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/maccs_corpus.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/pharmacophore.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/qed_alerts.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/residues.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/resonance.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/rotatable.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/salts.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/standardize_groups.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/standardize_metals.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/sybyl_types.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/tpsa.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/_corpus.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/_oracle.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/gen_standardize_rules.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_abbreviations.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_acids_tsv.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_canonicalize.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_counts.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_covalent_radii_tsv.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_crippen.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_crippen_tsv.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_dependency_direction.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_featurizer_injection.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_featurizer_tables_lazy.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_isomers.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_maccs.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_maccs_corpus.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_maccs_tsv.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_perceive.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_pharmacophore.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_protomers.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_qed.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_qed_alerts_tsv.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_reaction_hydrogen_repair.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_reaction_passes.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_residues.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_resonance.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_resonance_tsv.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_salts.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_saturate.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_smarts.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_differential.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_groups_port.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_overvalent_nitrogen.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_rules_examples.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_rules_merges.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_rules_tsv.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_thiele_is_single_purpose.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_tpsa.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_tpsa_tsv.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_valence_report.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_z_translation.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/RULES.md +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_canonical.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_core.pyx +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_descriptors.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_elements.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_facade.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_features.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_fingerprints.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_hydrogens.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_inchi.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_isomorphism.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_kekule.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_log.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_ml.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_molecule_arena.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_molecule_container.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_molecule_topology.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_molecule_views.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_morgan.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_pach.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_pach3.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_query_arena.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_query_boxes.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_query_container.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_query_seal.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_reaction_passes.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_rings.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_smarts_read.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_smiles_read.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_smiles_write.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_smirks_patch.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_smirks_read.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_sssr.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_stereo.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_thiele.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/_valence.pxi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/elements.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/isotopes.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/reaction.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/arena_v4_corpus.bin.gz +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/bench_ml.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/chytorch_oracle.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/gen_element_tables.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/gen_modeling_view_corpus.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/gen_pach3_corpus.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/gen_reaction_pach_corpus.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/gen_v3_fixtures.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/gen_v4_fixtures.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/gen_valence_rules.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/modeling_view_corpus.json.gz +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/modeling_view_corpus.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/oracle.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/pach3_corpus.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/pach_corpus.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/pach_v0_corpus.bin.gz +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/pach_v0_native_corpus.bin.gz +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/pach_v2_corpus.bin.gz +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/pach_v3_corpus.bin.gz +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/pach_v4_corpus.bin.gz +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/reaction_pach_corpus.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/reaction_pach_v2_corpus.bin.gz +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_aggregates.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_alternative_spellings.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_apply_scratch_probe.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_arena_f60.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_arena_identity.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_arena_v3_compat.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_arena_v4_compat.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_aromatic_storage.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_canonical.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_canonical_mirror.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_cip_storage.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_clean_isotopes_and_coordinate_bonds.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_clean_stereo.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_conformers.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_container_log.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_copy_caches.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_derive.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_descriptors.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_element_tables.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_facade.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_features.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_featurizer_injection.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_fingerprints.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_geometry.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_h_unknown.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_hydrogens.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_inchi.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_interop_injection.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_isomorphism.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_kekule.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_log.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_magic.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_meta.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_ml_encoding.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_ml_reaction_transition.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_ml_state_view.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_ml_transition_view.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_ml_unpack_differential.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_modeling_view_frozen.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_molecule.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_morgan.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_no_chython_two_imports.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_oracle.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_pach.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_pach3.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_pack.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_query.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_edit.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_query.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_semantics.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_serialisation.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_smirks.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_storage.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_container.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_identity.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_pach.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_passes.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_patch_stereo.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_smiles.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_rings.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_rings_c60.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_set_element.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_sgroups.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smarts_read.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_r.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_read.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_roundtrip.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_aromatic.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_cis_trans.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_detached.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_differential.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_h_unknown.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_stereo.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_sticky.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smirks_filter.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smirks_patch.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smirks_read.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smirks_report.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_smirks_stereo.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_acceptance.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_parity.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_perception.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_query.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_units.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_v2_differential.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_structure.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_thiele.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_title.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_topology.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_union_stereo.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_valence.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/test_view_surface.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/v3_fixtures.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/test/v4_fixtures.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/valence_rules.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/core/wedge.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/_config.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/_hooks.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/bonds.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/colorbar.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/colormap.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/field.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/figure.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/label.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/layout/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/layout/clean2d.js +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/layout/molecule.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/layout/reaction.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/metrics/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/metrics/helvetica.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/metrics/times.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/overlay.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/render/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/render/svg.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/scene.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/style.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_bonds.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_clean2d.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_colorbar.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_colormap.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_field.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_figure.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_label.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_metrics.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_overlay.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_package.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_r_atom.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_scene.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_style.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_svg.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_wedge_draw.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/test/test_x3dom.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/wedge.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/depict/x3dom.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/exceptions.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/_text.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/CTFILE.md +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_ctab.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_errors.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_facade.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_hydrogens.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_rdf.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_rxn.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_sdf.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_sgroup.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_stream.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_tokens.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_v2000.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_v3000.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/conftest.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_aromatic.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_container_log.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_data_labels.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_facade.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_fidelity.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_hydrogens.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_r_atom.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_rdf.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_rxn.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_sdf.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_sgroup.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_stream.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_tokens.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_v2000.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_v3000.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_wedge.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/mol2.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/pdb/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/pdb/_builder.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/pdb/_legacy.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/pdb/_mmcif.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/pdb/_records.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/pdb/_star.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/conftest.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/oracles.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_conformance.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_done_when.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_isolation.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_log_prefix.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_mmcif.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_mol2.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_no_review_bookkeeping.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_oracles.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_pdb.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_pdb_builder.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_perceive_agreement.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_read_only_facades.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_xyz.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/test/test_xyz_builder.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/_cml.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/_dialect.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/_errors.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/_facade.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/_mrv.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/_tree.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/conftest.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_cml.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_container_log.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_dialect.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_equivalence.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_facade.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_mrv.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_mrv_census.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_tree.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/formats/xyz.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/_cdk.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/_cdpkit.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/_indigo.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/_iupac.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/_java.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/_openbabel.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/_pandas.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/_rdkit.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/_records.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/_stereo.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/config.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/conformers.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/conftest.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_cdk.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_cdpkit.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_config.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_conformers.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_coordinate_honesty.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_dispatch.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_indigo.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_iupac.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_log_delivery.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_openbabel.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_pandas.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_rdkit.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_stereo.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/interop/test/test_v2_oracle.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/_enumerate.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/_numbering.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/_reconstruct.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/_stickers.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/_tables.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/attention/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/attention/_assign.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/attention/_encode.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/attention/_session.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/tables/functional.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/tables/protective.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/tables/reactions.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/tables/roles.tsv +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/_frozen_ids.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/gen_corpus_glossary.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/golden_subset.smi +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_attention.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_attention_assign.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_attention_encode.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_attention_isolation.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_corpus_glossary.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_dependency_direction.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_enumerate.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_functional.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_id_stability.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_numbering.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_probes.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_protective.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_reconstruct.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_roles.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_stickers.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_tables.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/__init__.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_code_hygiene.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_container_methods.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_doc_figures.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_doc_references.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_doc_samples.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_facade_names.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_hydrogen_parity.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_log_records.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_optional_numpy.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_packaging.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_performance.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_r_atom_integration.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_stereo_bluebook.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython/test/test_v2_boundary.py +0 -0
- {chython-3.0 → chython-3.0.1}/chython.egg-info/SOURCES.txt +0 -0
- {chython-3.0 → chython-3.0.1}/chython.egg-info/dependency_links.txt +0 -0
- {chython-3.0 → chython-3.0.1}/chython.egg-info/requires.txt +0 -0
- {chython-3.0 → chython-3.0.1}/chython.egg-info/top_level.txt +0 -0
- {chython-3.0 → chython-3.0.1}/setup.cfg +0 -0
|
@@ -63,6 +63,12 @@ def cmake_args() -> list[str]:
|
|
|
63
63
|
* ``-fsigned-char`` -- plain `char` is unsigned on Linux ARM. `setup.py` compiles the extension
|
|
64
64
|
with the flag for the same reason, and InChI's own gcc option set lists it; its public types are
|
|
65
65
|
`S_CHAR`, spelled `signed char`, so the flag is about the library's internal bare `char`.
|
|
66
|
+
* ``CMAKE_SHARED_LINKER_FLAGS=-Wl,-s`` on Linux -- ``INCHI_API/libinchi/src/CMakeLists.txt`` gives
|
|
67
|
+
gcc-like compilers ``-g;-O1`` through ``target_compile_options``, which lands after
|
|
68
|
+
``CMAKE_C_FLAGS`` and after the ``Release`` config's own flags, so neither ``CMAKE_BUILD_TYPE``
|
|
69
|
+
nor a ``-g0`` above can cancel it. A link-time strip can: measured on 3.0's Linux wheel,
|
|
70
|
+
``.debug*`` was 3.05 MB of a 4.36 MB ``libinchi.so`` whose ``.text`` is 1.00 MB. Linux only --
|
|
71
|
+
ld64 deprecates ``-s`` and the linked Mach-O carries no DWARF to begin with.
|
|
66
72
|
* ``CMAKE_OSX_ARCHITECTURES`` -- a universal2 interpreter needs both slices, or InChI is absent on
|
|
67
73
|
the arch the dylib lacks while `import chython` still succeeds and every InChI test skips.
|
|
68
74
|
* ``CMAKE_OSX_DEPLOYMENT_TARGET`` -- ``wheel``'s ``calculate_macosx_platform_tag`` raises the
|
|
@@ -78,6 +84,8 @@ def cmake_args() -> list[str]:
|
|
|
78
84
|
if platform.startswith('win'):
|
|
79
85
|
return [] # MSVC's `char` is signed and the rest is mac
|
|
80
86
|
args = ['-DCMAKE_C_FLAGS=-fsigned-char']
|
|
87
|
+
if platform.startswith('linux'):
|
|
88
|
+
args.append('-DCMAKE_SHARED_LINKER_FLAGS=-Wl,-s')
|
|
81
89
|
parts = platform.split('-')
|
|
82
90
|
if platform.startswith('macosx') and len(parts) == 3:
|
|
83
91
|
_, target, arch = parts
|
|
@@ -44,8 +44,15 @@ the suite's `needs_inchi` marks skip. Every assertion is therefore about declar
|
|
|
44
44
|
build output that is checked only if build output exists.
|
|
45
45
|
"""
|
|
46
46
|
from ast import Call, Constant, Dict, Name, parse, walk
|
|
47
|
+
from os import environ
|
|
47
48
|
from pathlib import Path
|
|
49
|
+
from platform import system
|
|
50
|
+
from pytest import skip
|
|
48
51
|
from re import DOTALL, finditer, search
|
|
52
|
+
from subprocess import check_output
|
|
53
|
+
from sys import executable
|
|
54
|
+
from tempfile import TemporaryDirectory
|
|
55
|
+
from textwrap import dedent
|
|
49
56
|
|
|
50
57
|
|
|
51
58
|
ROOT = Path(__file__).resolve().parent.parent.parent
|
|
@@ -105,6 +112,56 @@ def _workflow():
|
|
|
105
112
|
return '\n'.join(line for line in text.splitlines() if not line.lstrip().startswith('#'))
|
|
106
113
|
|
|
107
114
|
|
|
115
|
+
def _retag_probe():
|
|
116
|
+
"""The Linux retag step's shell, dedented as YAML hands it to bash, minus its two effects.
|
|
117
|
+
|
|
118
|
+
`pip install` and the `wheel tags` call are dropped by name -- and asserted present, so a rename
|
|
119
|
+
cannot turn this into a probe of nothing -- which leaves the tag COMPUTATION, side-effect free and
|
|
120
|
+
runnable here. The step's own `echo` is what reports the answer, in this probe and in the CI log.
|
|
121
|
+
"""
|
|
122
|
+
step = search(r'- name: Retag[^\n]*\n(.*?)(?=\n - name:|\Z)', _workflow(), DOTALL)
|
|
123
|
+
assert step, 'the release workflow has no Retag step'
|
|
124
|
+
body = search(r'run: \|\n(.*)', step.group(1), DOTALL)
|
|
125
|
+
assert body, 'the Retag step has no `run:` block'
|
|
126
|
+
script = dedent(body.group(1))
|
|
127
|
+
assert 'python -m wheel tags' in script or 'auditwheel' in script, \
|
|
128
|
+
'no retag or repair step for Linux: setuptools emits linux_x86_64 and PyPI rejects it'
|
|
129
|
+
assert 'pip install --upgrade wheel' in script and 'dist/*.whl' in script, \
|
|
130
|
+
'the retag step no longer installs wheel, or no longer retags dist/*.whl'
|
|
131
|
+
return '\n'.join(line for line in script.splitlines()
|
|
132
|
+
if 'pip install' not in line and 'dist/*.whl' not in line)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _run_probe(*, tags=None):
|
|
136
|
+
"""Run the probe under bash and return the platform tag it chose.
|
|
137
|
+
|
|
138
|
+
`python` is shimmed onto PATH because that is the name the workflow uses and a developer's machine
|
|
139
|
+
need not have it. `tags` replaces `packaging.tags` with a stub yielding exactly those platforms.
|
|
140
|
+
|
|
141
|
+
POSIX only: the shim is a symlink with no `.exe`, which Git Bash cannot exec, and PATH there is
|
|
142
|
+
`;`-joined. Nothing is lost -- the step this probes carries `if: runner.os == 'Linux'`.
|
|
143
|
+
"""
|
|
144
|
+
if system() == 'Windows':
|
|
145
|
+
skip('the retag step is Linux-only and this probe shims `python` the POSIX way')
|
|
146
|
+
with TemporaryDirectory() as tmp:
|
|
147
|
+
tmp = Path(tmp)
|
|
148
|
+
(tmp / 'bin').mkdir()
|
|
149
|
+
(tmp / 'bin' / 'python').symlink_to(executable)
|
|
150
|
+
env = {**environ, 'PATH': '%s:%s' % (tmp / 'bin', environ['PATH'])}
|
|
151
|
+
if tags is not None:
|
|
152
|
+
(tmp / 'packaging').mkdir()
|
|
153
|
+
(tmp / 'packaging' / '__init__.py').write_text('')
|
|
154
|
+
(tmp / 'packaging' / 'tags.py').write_text(
|
|
155
|
+
'class Tag:\n'
|
|
156
|
+
' def __init__(self, platform):\n'
|
|
157
|
+
' self.platform = platform\n'
|
|
158
|
+
'\n'
|
|
159
|
+
'def sys_tags():\n'
|
|
160
|
+
' return [Tag(p) for p in %r]\n' % (tuple(tags),), encoding='utf-8')
|
|
161
|
+
env['PYTHONPATH'] = str(tmp)
|
|
162
|
+
return check_output(['bash', '-e'], input=_retag_probe(), text=True, env=env).split()[-1]
|
|
163
|
+
|
|
164
|
+
|
|
108
165
|
# --- the mechanism ---------------------------------------------------------------------------------
|
|
109
166
|
|
|
110
167
|
def test_libinchi_is_not_package_data():
|
|
@@ -195,19 +252,31 @@ def test_the_workflow_builds_with_the_declared_backend():
|
|
|
195
252
|
assert 'python -m build' in text, 'the workflow has no PEP 517 build step'
|
|
196
253
|
|
|
197
254
|
|
|
198
|
-
def
|
|
199
|
-
"""
|
|
255
|
+
def test_the_linux_wheel_is_retagged_by_prefix_and_not_by_the_first_tag_offered():
|
|
256
|
+
"""The step's tag is RUN here, because a step that names `manylinux` need not compute one.
|
|
200
257
|
|
|
201
|
-
|
|
202
|
-
`
|
|
203
|
-
the
|
|
204
|
-
|
|
258
|
+
`sys_tags()` is ordered best-first, and since packaging 26.3 the best Linux tag is the native
|
|
259
|
+
`linux_x86_64` rather than a manylinux one (packaging #160). So `next(iter(sys_tags())).platform`
|
|
260
|
+
returns the tag PyPI rejects, `wheel tags --platform-tag linux_x86_64` renames nothing, and the step
|
|
261
|
+
reports success -- the whole failure being one line of the log reading `retagging as linux_x86_64`.
|
|
262
|
+
The stub is that ordering; the assertion is that the highest manylinux tag is picked out of it.
|
|
205
263
|
"""
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
'
|
|
209
|
-
|
|
210
|
-
|
|
264
|
+
assert _run_probe(tags=('linux_x86_64', 'manylinux_2_39_x86_64', 'manylinux_2_5_x86_64')) == \
|
|
265
|
+
'manylinux_2_39_x86_64', 'the retag step takes the first tag `sys_tags()` offers, which on Linux ' \
|
|
266
|
+
'is the bare `linux_x86_64` PyPI rejects; select the tag by its `manylinux` prefix instead'
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def test_the_retag_step_finds_a_manylinux_tag_on_the_platform_it_runs_on():
|
|
270
|
+
"""The same computation against the real `packaging`, which is what the stub above stands in for.
|
|
271
|
+
|
|
272
|
+
Linux only: this is the platform the step has an `if` for, and the one every other wheel in the
|
|
273
|
+
matrix is already tagged correctly on.
|
|
274
|
+
"""
|
|
275
|
+
if system() != 'Linux':
|
|
276
|
+
skip('the retag step runs on Linux only')
|
|
277
|
+
tag = _run_probe()
|
|
278
|
+
assert tag.startswith('manylinux'), \
|
|
279
|
+
'the retag step computes %r on this runner; PyPI rejects it and twine fails the release' % tag
|
|
211
280
|
|
|
212
281
|
|
|
213
282
|
# --- the staging itself, when there is build output to look at -------------------------------------
|
|
@@ -45,6 +45,7 @@ from ast import Assign, Constant, List, Name, parse, walk
|
|
|
45
45
|
from importlib.util import module_from_spec, spec_from_file_location
|
|
46
46
|
from pathlib import Path
|
|
47
47
|
from re import M, finditer
|
|
48
|
+
from struct import unpack_from
|
|
48
49
|
|
|
49
50
|
|
|
50
51
|
ROOT = Path(__file__).resolve().parent.parent.parent
|
|
@@ -53,6 +54,13 @@ ROOT = Path(__file__).resolve().parent.parent.parent
|
|
|
53
54
|
# both take it; MSVC's default is already signed and its switch (`/J`) is the opposite one.
|
|
54
55
|
SIGNED_CHAR = '-fsigned-char'
|
|
55
56
|
|
|
57
|
+
# The two that keep DWARF out of the Linux wheel: `-g0` cancels the `-g` distutils inherits from
|
|
58
|
+
# CPython's `CFLAGS`, and the link-time strip is the only thing that reaches the `-g` InChI's own
|
|
59
|
+
# CMakeLists gives gcc. Neither has a macOS or MSVC counterpart -- those toolchains put debug info in a
|
|
60
|
+
# `.dSYM` and a `.pdb`, outside the wheel either way.
|
|
61
|
+
NO_DEBUG_INFO = '-g0'
|
|
62
|
+
STRIP = '-Wl,-s'
|
|
63
|
+
|
|
56
64
|
|
|
57
65
|
def _build_inchi():
|
|
58
66
|
"""The builder module, loaded from the repo root by path.
|
|
@@ -166,7 +174,8 @@ def test_the_linux_build_is_told_nothing_about_architectures():
|
|
|
166
174
|
not something this file expresses."""
|
|
167
175
|
module = _build_inchi()
|
|
168
176
|
module.get_platform = lambda: 'linux-aarch64'
|
|
169
|
-
assert module.cmake_args() == ['-DCMAKE_C_FLAGS=%s' % SIGNED_CHAR],
|
|
177
|
+
assert module.cmake_args() == ['-DCMAKE_C_FLAGS=%s' % SIGNED_CHAR, '-DCMAKE_SHARED_LINKER_FLAGS=%s' % STRIP], \
|
|
178
|
+
module.cmake_args()
|
|
170
179
|
|
|
171
180
|
|
|
172
181
|
def test_the_libinchi_job_pins_the_interpreter_it_reads_the_platform_from():
|
|
@@ -182,6 +191,84 @@ def test_the_libinchi_job_pins_the_interpreter_it_reads_the_platform_from():
|
|
|
182
191
|
'every wheel carrying this dylib.')
|
|
183
192
|
|
|
184
193
|
|
|
194
|
+
# --- debug info stays out of the wheel -------------------------------------------------------------
|
|
195
|
+
|
|
196
|
+
def test_the_linux_extension_asks_for_no_debug_info():
|
|
197
|
+
"""distutils compiles an extension with CPython's own `CFLAGS`, and those carry `-g`.
|
|
198
|
+
|
|
199
|
+
Measured on 3.0's cp312 Linux wheel: `.debug*` was 17.50 MB of a 20.82 MB `_core.so` whose `.text` is
|
|
200
|
+
2.52 MB, against a 2.18 MB `.pyd` for the same code on Windows. These flags are appended after
|
|
201
|
+
CPython's and gcc takes the last of `-g`/`-g0`, which is what lets a flag here cancel one from there.
|
|
202
|
+
"""
|
|
203
|
+
linux = [flags for flags in _extra_compile_args() if '-O3' in flags]
|
|
204
|
+
assert len(linux) == 1, \
|
|
205
|
+
'setup.py no longer has exactly one -O3 branch, so the Linux branch is not identifiable here'
|
|
206
|
+
assert NO_DEBUG_INFO in linux[0], (
|
|
207
|
+
'the Linux extension is compiled without %s, so the `-g` in CPython\'s CFLAGS stands and the '
|
|
208
|
+
'wheel ships DWARF -- 84%% of `_core.so` when this was last measured' % NO_DEBUG_INFO)
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def test_libinchi_is_stripped_at_link_time_on_linux_and_nowhere_else():
|
|
212
|
+
"""`CMAKE_BUILD_TYPE=Release` does not remove InChI's `-g`, because InChI's own CMakeLists adds it.
|
|
213
|
+
|
|
214
|
+
`INCHI_API/libinchi/src/CMakeLists.txt` gives gcc-like compilers `-g;-O1` through
|
|
215
|
+
`target_compile_options`, which lands after both `CMAKE_C_FLAGS` and the config's flags -- so a `-g0`
|
|
216
|
+
passed in cannot win and only a link-time strip reaches it. 3.05 MB of a 4.36 MB `libinchi.so`.
|
|
217
|
+
"""
|
|
218
|
+
module = _build_inchi()
|
|
219
|
+
for platform, wanted in (('linux-x86_64', True), ('linux-aarch64', True),
|
|
220
|
+
('macosx-10.9-universal2', False), ('macosx-11.0-arm64', False),
|
|
221
|
+
('win-amd64', False)):
|
|
222
|
+
module.get_platform = lambda p=platform: p
|
|
223
|
+
stripping = any(STRIP in flag for flag in module.cmake_args())
|
|
224
|
+
assert stripping is wanted, (
|
|
225
|
+
'%s: cmake_args() %s the link-time strip. Without it on Linux libinchi carries 3 MB of '
|
|
226
|
+
'DWARF into every wheel; with it on macOS, ld64 deprecates `-s` and the linked Mach-O has no '
|
|
227
|
+
'DWARF to remove.' % (platform, 'lacks' if wanted else 'should not pass'))
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def _elf_debug_bytes(data):
|
|
231
|
+
"""(total, `.debug*` bytes) for an ELF image, or None when it is not one.
|
|
232
|
+
|
|
233
|
+
`struct` and not `readelf`: the property is worth checking on any Linux row of the test matrix, and a
|
|
234
|
+
binutils dependency would make it skip instead.
|
|
235
|
+
"""
|
|
236
|
+
if data[:4] != b'\x7fELF' or data[4] != 2: # ELF64 only; nothing here builds 32-bit
|
|
237
|
+
return None
|
|
238
|
+
shoff, = unpack_from('<Q', data, 0x28)
|
|
239
|
+
shentsize, shnum, shstrndx = unpack_from('<HHH', data, 0x3a)
|
|
240
|
+
names = unpack_from('<Q', data, shoff + shstrndx * shentsize + 24)[0]
|
|
241
|
+
debug = 0
|
|
242
|
+
for i in range(shnum):
|
|
243
|
+
offset, = unpack_from('<I', data, shoff + i * shentsize)
|
|
244
|
+
name = data[names + offset:data.index(b'\0', names + offset)]
|
|
245
|
+
if name.startswith(b'.debug'):
|
|
246
|
+
debug += unpack_from('<Q', data, shoff + i * shentsize + 32)[0]
|
|
247
|
+
return len(data), debug
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def test_a_built_linux_binary_carries_no_dwarf():
|
|
251
|
+
"""The property the two flags above are for, against build output whenever there is some.
|
|
252
|
+
|
|
253
|
+
Vacuous off Linux and on a checkout nobody has built -- said out loud, because a silent pass for a
|
|
254
|
+
structural reason is what the declarations above are the guard against. This is the assertion that
|
|
255
|
+
would survive a gcc that ignored `-g0` or a cmake that dropped the linker flag.
|
|
256
|
+
"""
|
|
257
|
+
offenders = []
|
|
258
|
+
for path in [*(ROOT / 'chython' / 'core').glob('_core*.so'), ROOT / 'build' / 'inchi' / 'libinchi.so']:
|
|
259
|
+
if not path.exists():
|
|
260
|
+
continue
|
|
261
|
+
measured = _elf_debug_bytes(path.read_bytes())
|
|
262
|
+
if measured and measured[1]:
|
|
263
|
+
offenders.append('%s: %.2f MB of %.2f MB is .debug*'
|
|
264
|
+
% (path.name, measured[1] / 1048576, measured[0] / 1048576))
|
|
265
|
+
assert not offenders, (
|
|
266
|
+
'these binaries would ship their debug info inside the wheel:\n %s\n'
|
|
267
|
+
'The extension takes `%s` from setup.py and libinchi takes `%s` from build_inchi.py; a build '
|
|
268
|
+
'that predates either needs redoing before it is measured.' % ('\n '.join(offenders),
|
|
269
|
+
NO_DEBUG_INFO, STRIP))
|
|
270
|
+
|
|
271
|
+
|
|
185
272
|
# --- the source distribution -----------------------------------------------------------------------
|
|
186
273
|
|
|
187
274
|
def test_the_release_publishes_a_source_distribution():
|
|
@@ -4,7 +4,7 @@ build-backend = 'setuptools.build_meta'
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = 'chython'
|
|
7
|
-
version = '3.0'
|
|
7
|
+
version = '3.0.1'
|
|
8
8
|
description = 'Library for processing molecules and reactions in python way'
|
|
9
9
|
authors = [{name = 'Ramil Nugmanov', email = 'nougmanoff@protonmail.com'}]
|
|
10
10
|
license = 'LGPL-3.0-or-later'
|
|
@@ -56,11 +56,18 @@ from build_inchi import build as build_libinchi, libname_for_platform # noqa: E
|
|
|
56
56
|
# is what makes the arm wheel the same program as the one the tests ran against; it is a no-op on
|
|
57
57
|
# x86-64, which is why it is not conditional within Linux. MSVC needs nothing (its default is signed;
|
|
58
58
|
# `/J` is the opposite switch), and the InChI build gets the same flag from `build_inchi.py`.
|
|
59
|
+
#
|
|
60
|
+
# `-g0` ON LINUX ONLY, because distutils compiles an extension with CPython's own `CFLAGS` and those
|
|
61
|
+
# carry `-g`: measured on 3.0's cp312 wheel, `.debug*` was 17.50 MB of a 20.82 MB `_core.so` whose
|
|
62
|
+
# `.text` is 2.52 MB. These flags are appended after CPython's and gcc takes the last of `-g`/`-g0`,
|
|
63
|
+
# which is what makes a flag here able to cancel one from there. `.symtab` is not debug info and
|
|
64
|
+
# survives, so a C-level backtrace keeps its function names. Nothing to do on the other two: clang
|
|
65
|
+
# leaves DWARF in the `.o` files and emits a `.dSYM` only when asked, and MSVC writes a separate `.pdb`.
|
|
59
66
|
platform = get_platform()
|
|
60
67
|
if platform == 'win-amd64':
|
|
61
68
|
extra_compile_args = ['/O2']
|
|
62
69
|
elif platform.startswith('linux'):
|
|
63
|
-
extra_compile_args = ['-O3', '-fsigned-char']
|
|
70
|
+
extra_compile_args = ['-O3', '-g0', '-fsigned-char']
|
|
64
71
|
else:
|
|
65
72
|
extra_compile_args = ['-fsigned-char']
|
|
66
73
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_overvalent_nitrogen.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|