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.
Files changed (452) hide show
  1. {chython-3.0/chython.egg-info → chython-3.0.1}/PKG-INFO +1 -1
  2. {chython-3.0 → chython-3.0.1}/build_inchi.py +8 -0
  3. {chython-3.0 → chython-3.0.1}/chython/test/test_libinchi_staging.py +80 -11
  4. {chython-3.0 → chython-3.0.1}/chython/test/test_release_build.py +88 -1
  5. {chython-3.0 → chython-3.0.1/chython.egg-info}/PKG-INFO +1 -1
  6. {chython-3.0 → chython-3.0.1}/pyproject.toml +1 -1
  7. {chython-3.0 → chython-3.0.1}/setup.py +8 -1
  8. {chython-3.0 → chython-3.0.1}/LICENSE +0 -0
  9. {chython-3.0 → chython-3.0.1}/MANIFEST.in +0 -0
  10. {chython-3.0 → chython-3.0.1}/README.md +0 -0
  11. {chython-3.0 → chython-3.0.1}/chython/__init__.py +0 -0
  12. {chython-3.0 → chython-3.0.1}/chython/_functions.py +0 -0
  13. {chython-3.0 → chython-3.0.1}/chython/chemistry/__init__.py +0 -0
  14. {chython-3.0 → chython-3.0.1}/chython/chemistry/_abbreviations.py +0 -0
  15. {chython-3.0 → chython-3.0.1}/chython/chemistry/_canonicalize.py +0 -0
  16. {chython-3.0 → chython-3.0.1}/chython/chemistry/_counts.py +0 -0
  17. {chython-3.0 → chython-3.0.1}/chython/chemistry/_crippen.py +0 -0
  18. {chython-3.0 → chython-3.0.1}/chython/chemistry/_hydrogens.py +0 -0
  19. {chython-3.0 → chython-3.0.1}/chython/chemistry/_implicit.py +0 -0
  20. {chython-3.0 → chython-3.0.1}/chython/chemistry/_isomers.py +0 -0
  21. {chython-3.0 → chython-3.0.1}/chython/chemistry/_maccs.py +0 -0
  22. {chython-3.0 → chython-3.0.1}/chython/chemistry/_perceive.py +0 -0
  23. {chython-3.0 → chython-3.0.1}/chython/chemistry/_pharmacophore.py +0 -0
  24. {chython-3.0 → chython-3.0.1}/chython/chemistry/_protomers.py +0 -0
  25. {chython-3.0 → chython-3.0.1}/chython/chemistry/_qed.py +0 -0
  26. {chython-3.0 → chython-3.0.1}/chython/chemistry/_residues.py +0 -0
  27. {chython-3.0 → chython-3.0.1}/chython/chemistry/_resonance.py +0 -0
  28. {chython-3.0 → chython-3.0.1}/chython/chemistry/_salts.py +0 -0
  29. {chython-3.0 → chython-3.0.1}/chython/chemistry/_saturate.py +0 -0
  30. {chython-3.0 → chython-3.0.1}/chython/chemistry/_smarts.py +0 -0
  31. {chython-3.0 → chython-3.0.1}/chython/chemistry/_standardize.py +0 -0
  32. {chython-3.0 → chython-3.0.1}/chython/chemistry/_tables.py +0 -0
  33. {chython-3.0 → chython-3.0.1}/chython/chemistry/_tpsa.py +0 -0
  34. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/abbreviations.tsv +0 -0
  35. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/acids.tsv +0 -0
  36. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/covalent_radii.tsv +0 -0
  37. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/crippen.tsv +0 -0
  38. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/hbond.tsv +0 -0
  39. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/maccs.tsv +0 -0
  40. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/maccs_corpus.tsv +0 -0
  41. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/pharmacophore.tsv +0 -0
  42. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/qed_alerts.tsv +0 -0
  43. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/residues.tsv +0 -0
  44. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/resonance.tsv +0 -0
  45. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/rotatable.tsv +0 -0
  46. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/salts.tsv +0 -0
  47. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/standardize_groups.tsv +0 -0
  48. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/standardize_metals.tsv +0 -0
  49. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/sybyl_types.tsv +0 -0
  50. {chython-3.0 → chython-3.0.1}/chython/chemistry/tables/tpsa.tsv +0 -0
  51. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/__init__.py +0 -0
  52. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/_corpus.py +0 -0
  53. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/_oracle.py +0 -0
  54. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/gen_standardize_rules.py +0 -0
  55. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_abbreviations.py +0 -0
  56. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_acids_tsv.py +0 -0
  57. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_canonicalize.py +0 -0
  58. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_counts.py +0 -0
  59. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_covalent_radii_tsv.py +0 -0
  60. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_crippen.py +0 -0
  61. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_crippen_tsv.py +0 -0
  62. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_dependency_direction.py +0 -0
  63. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_featurizer_injection.py +0 -0
  64. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_featurizer_tables_lazy.py +0 -0
  65. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_isomers.py +0 -0
  66. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_maccs.py +0 -0
  67. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_maccs_corpus.py +0 -0
  68. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_maccs_tsv.py +0 -0
  69. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_perceive.py +0 -0
  70. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_pharmacophore.py +0 -0
  71. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_protomers.py +0 -0
  72. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_qed.py +0 -0
  73. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_qed_alerts_tsv.py +0 -0
  74. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_reaction_hydrogen_repair.py +0 -0
  75. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_reaction_passes.py +0 -0
  76. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_residues.py +0 -0
  77. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_resonance.py +0 -0
  78. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_resonance_tsv.py +0 -0
  79. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_salts.py +0 -0
  80. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_saturate.py +0 -0
  81. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_smarts.py +0 -0
  82. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_differential.py +0 -0
  83. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_groups_port.py +0 -0
  84. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_overvalent_nitrogen.py +0 -0
  85. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_rules_examples.py +0 -0
  86. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_rules_merges.py +0 -0
  87. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_standardize_rules_tsv.py +0 -0
  88. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_thiele_is_single_purpose.py +0 -0
  89. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_tpsa.py +0 -0
  90. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_tpsa_tsv.py +0 -0
  91. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_valence_report.py +0 -0
  92. {chython-3.0 → chython-3.0.1}/chython/chemistry/test/test_z_translation.py +0 -0
  93. {chython-3.0 → chython-3.0.1}/chython/core/RULES.md +0 -0
  94. {chython-3.0 → chython-3.0.1}/chython/core/__init__.py +0 -0
  95. {chython-3.0 → chython-3.0.1}/chython/core/_canonical.pxi +0 -0
  96. {chython-3.0 → chython-3.0.1}/chython/core/_core.pyx +0 -0
  97. {chython-3.0 → chython-3.0.1}/chython/core/_descriptors.pxi +0 -0
  98. {chython-3.0 → chython-3.0.1}/chython/core/_elements.pxi +0 -0
  99. {chython-3.0 → chython-3.0.1}/chython/core/_facade.py +0 -0
  100. {chython-3.0 → chython-3.0.1}/chython/core/_features.pxi +0 -0
  101. {chython-3.0 → chython-3.0.1}/chython/core/_fingerprints.pxi +0 -0
  102. {chython-3.0 → chython-3.0.1}/chython/core/_hydrogens.pxi +0 -0
  103. {chython-3.0 → chython-3.0.1}/chython/core/_inchi.pxi +0 -0
  104. {chython-3.0 → chython-3.0.1}/chython/core/_isomorphism.pxi +0 -0
  105. {chython-3.0 → chython-3.0.1}/chython/core/_kekule.pxi +0 -0
  106. {chython-3.0 → chython-3.0.1}/chython/core/_log.py +0 -0
  107. {chython-3.0 → chython-3.0.1}/chython/core/_ml.pxi +0 -0
  108. {chython-3.0 → chython-3.0.1}/chython/core/_molecule_arena.pxi +0 -0
  109. {chython-3.0 → chython-3.0.1}/chython/core/_molecule_container.pxi +0 -0
  110. {chython-3.0 → chython-3.0.1}/chython/core/_molecule_topology.pxi +0 -0
  111. {chython-3.0 → chython-3.0.1}/chython/core/_molecule_views.pxi +0 -0
  112. {chython-3.0 → chython-3.0.1}/chython/core/_morgan.pxi +0 -0
  113. {chython-3.0 → chython-3.0.1}/chython/core/_pach.pxi +0 -0
  114. {chython-3.0 → chython-3.0.1}/chython/core/_pach3.pxi +0 -0
  115. {chython-3.0 → chython-3.0.1}/chython/core/_query_arena.pxi +0 -0
  116. {chython-3.0 → chython-3.0.1}/chython/core/_query_boxes.pxi +0 -0
  117. {chython-3.0 → chython-3.0.1}/chython/core/_query_container.pxi +0 -0
  118. {chython-3.0 → chython-3.0.1}/chython/core/_query_seal.pxi +0 -0
  119. {chython-3.0 → chython-3.0.1}/chython/core/_reaction_passes.py +0 -0
  120. {chython-3.0 → chython-3.0.1}/chython/core/_rings.pxi +0 -0
  121. {chython-3.0 → chython-3.0.1}/chython/core/_smarts_read.pxi +0 -0
  122. {chython-3.0 → chython-3.0.1}/chython/core/_smiles_read.pxi +0 -0
  123. {chython-3.0 → chython-3.0.1}/chython/core/_smiles_write.pxi +0 -0
  124. {chython-3.0 → chython-3.0.1}/chython/core/_smirks_patch.pxi +0 -0
  125. {chython-3.0 → chython-3.0.1}/chython/core/_smirks_read.pxi +0 -0
  126. {chython-3.0 → chython-3.0.1}/chython/core/_sssr.pxi +0 -0
  127. {chython-3.0 → chython-3.0.1}/chython/core/_stereo.pxi +0 -0
  128. {chython-3.0 → chython-3.0.1}/chython/core/_thiele.pxi +0 -0
  129. {chython-3.0 → chython-3.0.1}/chython/core/_valence.pxi +0 -0
  130. {chython-3.0 → chython-3.0.1}/chython/core/elements.tsv +0 -0
  131. {chython-3.0 → chython-3.0.1}/chython/core/isotopes.tsv +0 -0
  132. {chython-3.0 → chython-3.0.1}/chython/core/reaction.py +0 -0
  133. {chython-3.0 → chython-3.0.1}/chython/core/test/__init__.py +0 -0
  134. {chython-3.0 → chython-3.0.1}/chython/core/test/arena_v4_corpus.bin.gz +0 -0
  135. {chython-3.0 → chython-3.0.1}/chython/core/test/bench_ml.py +0 -0
  136. {chython-3.0 → chython-3.0.1}/chython/core/test/chytorch_oracle.py +0 -0
  137. {chython-3.0 → chython-3.0.1}/chython/core/test/gen_element_tables.py +0 -0
  138. {chython-3.0 → chython-3.0.1}/chython/core/test/gen_modeling_view_corpus.py +0 -0
  139. {chython-3.0 → chython-3.0.1}/chython/core/test/gen_pach3_corpus.py +0 -0
  140. {chython-3.0 → chython-3.0.1}/chython/core/test/gen_reaction_pach_corpus.py +0 -0
  141. {chython-3.0 → chython-3.0.1}/chython/core/test/gen_v3_fixtures.py +0 -0
  142. {chython-3.0 → chython-3.0.1}/chython/core/test/gen_v4_fixtures.py +0 -0
  143. {chython-3.0 → chython-3.0.1}/chython/core/test/gen_valence_rules.py +0 -0
  144. {chython-3.0 → chython-3.0.1}/chython/core/test/modeling_view_corpus.json.gz +0 -0
  145. {chython-3.0 → chython-3.0.1}/chython/core/test/modeling_view_corpus.py +0 -0
  146. {chython-3.0 → chython-3.0.1}/chython/core/test/oracle.py +0 -0
  147. {chython-3.0 → chython-3.0.1}/chython/core/test/pach3_corpus.py +0 -0
  148. {chython-3.0 → chython-3.0.1}/chython/core/test/pach_corpus.py +0 -0
  149. {chython-3.0 → chython-3.0.1}/chython/core/test/pach_v0_corpus.bin.gz +0 -0
  150. {chython-3.0 → chython-3.0.1}/chython/core/test/pach_v0_native_corpus.bin.gz +0 -0
  151. {chython-3.0 → chython-3.0.1}/chython/core/test/pach_v2_corpus.bin.gz +0 -0
  152. {chython-3.0 → chython-3.0.1}/chython/core/test/pach_v3_corpus.bin.gz +0 -0
  153. {chython-3.0 → chython-3.0.1}/chython/core/test/pach_v4_corpus.bin.gz +0 -0
  154. {chython-3.0 → chython-3.0.1}/chython/core/test/reaction_pach_corpus.py +0 -0
  155. {chython-3.0 → chython-3.0.1}/chython/core/test/reaction_pach_v2_corpus.bin.gz +0 -0
  156. {chython-3.0 → chython-3.0.1}/chython/core/test/test_aggregates.py +0 -0
  157. {chython-3.0 → chython-3.0.1}/chython/core/test/test_alternative_spellings.py +0 -0
  158. {chython-3.0 → chython-3.0.1}/chython/core/test/test_apply_scratch_probe.py +0 -0
  159. {chython-3.0 → chython-3.0.1}/chython/core/test/test_arena_f60.py +0 -0
  160. {chython-3.0 → chython-3.0.1}/chython/core/test/test_arena_identity.py +0 -0
  161. {chython-3.0 → chython-3.0.1}/chython/core/test/test_arena_v3_compat.py +0 -0
  162. {chython-3.0 → chython-3.0.1}/chython/core/test/test_arena_v4_compat.py +0 -0
  163. {chython-3.0 → chython-3.0.1}/chython/core/test/test_aromatic_storage.py +0 -0
  164. {chython-3.0 → chython-3.0.1}/chython/core/test/test_canonical.py +0 -0
  165. {chython-3.0 → chython-3.0.1}/chython/core/test/test_canonical_mirror.py +0 -0
  166. {chython-3.0 → chython-3.0.1}/chython/core/test/test_cip_storage.py +0 -0
  167. {chython-3.0 → chython-3.0.1}/chython/core/test/test_clean_isotopes_and_coordinate_bonds.py +0 -0
  168. {chython-3.0 → chython-3.0.1}/chython/core/test/test_clean_stereo.py +0 -0
  169. {chython-3.0 → chython-3.0.1}/chython/core/test/test_conformers.py +0 -0
  170. {chython-3.0 → chython-3.0.1}/chython/core/test/test_container_log.py +0 -0
  171. {chython-3.0 → chython-3.0.1}/chython/core/test/test_copy_caches.py +0 -0
  172. {chython-3.0 → chython-3.0.1}/chython/core/test/test_derive.py +0 -0
  173. {chython-3.0 → chython-3.0.1}/chython/core/test/test_descriptors.py +0 -0
  174. {chython-3.0 → chython-3.0.1}/chython/core/test/test_element_tables.py +0 -0
  175. {chython-3.0 → chython-3.0.1}/chython/core/test/test_facade.py +0 -0
  176. {chython-3.0 → chython-3.0.1}/chython/core/test/test_features.py +0 -0
  177. {chython-3.0 → chython-3.0.1}/chython/core/test/test_featurizer_injection.py +0 -0
  178. {chython-3.0 → chython-3.0.1}/chython/core/test/test_fingerprints.py +0 -0
  179. {chython-3.0 → chython-3.0.1}/chython/core/test/test_geometry.py +0 -0
  180. {chython-3.0 → chython-3.0.1}/chython/core/test/test_h_unknown.py +0 -0
  181. {chython-3.0 → chython-3.0.1}/chython/core/test/test_hydrogens.py +0 -0
  182. {chython-3.0 → chython-3.0.1}/chython/core/test/test_inchi.py +0 -0
  183. {chython-3.0 → chython-3.0.1}/chython/core/test/test_interop_injection.py +0 -0
  184. {chython-3.0 → chython-3.0.1}/chython/core/test/test_isomorphism.py +0 -0
  185. {chython-3.0 → chython-3.0.1}/chython/core/test/test_kekule.py +0 -0
  186. {chython-3.0 → chython-3.0.1}/chython/core/test/test_log.py +0 -0
  187. {chython-3.0 → chython-3.0.1}/chython/core/test/test_magic.py +0 -0
  188. {chython-3.0 → chython-3.0.1}/chython/core/test/test_meta.py +0 -0
  189. {chython-3.0 → chython-3.0.1}/chython/core/test/test_ml_encoding.py +0 -0
  190. {chython-3.0 → chython-3.0.1}/chython/core/test/test_ml_reaction_transition.py +0 -0
  191. {chython-3.0 → chython-3.0.1}/chython/core/test/test_ml_state_view.py +0 -0
  192. {chython-3.0 → chython-3.0.1}/chython/core/test/test_ml_transition_view.py +0 -0
  193. {chython-3.0 → chython-3.0.1}/chython/core/test/test_ml_unpack_differential.py +0 -0
  194. {chython-3.0 → chython-3.0.1}/chython/core/test/test_modeling_view_frozen.py +0 -0
  195. {chython-3.0 → chython-3.0.1}/chython/core/test/test_molecule.py +0 -0
  196. {chython-3.0 → chython-3.0.1}/chython/core/test/test_morgan.py +0 -0
  197. {chython-3.0 → chython-3.0.1}/chython/core/test/test_no_chython_two_imports.py +0 -0
  198. {chython-3.0 → chython-3.0.1}/chython/core/test/test_oracle.py +0 -0
  199. {chython-3.0 → chython-3.0.1}/chython/core/test/test_pach.py +0 -0
  200. {chython-3.0 → chython-3.0.1}/chython/core/test/test_pach3.py +0 -0
  201. {chython-3.0 → chython-3.0.1}/chython/core/test/test_pack.py +0 -0
  202. {chython-3.0 → chython-3.0.1}/chython/core/test/test_query.py +0 -0
  203. {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_edit.py +0 -0
  204. {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_query.py +0 -0
  205. {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_semantics.py +0 -0
  206. {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_serialisation.py +0 -0
  207. {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_smirks.py +0 -0
  208. {chython-3.0 → chython-3.0.1}/chython/core/test/test_r_storage.py +0 -0
  209. {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_container.py +0 -0
  210. {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_identity.py +0 -0
  211. {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_pach.py +0 -0
  212. {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_passes.py +0 -0
  213. {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_patch_stereo.py +0 -0
  214. {chython-3.0 → chython-3.0.1}/chython/core/test/test_reaction_smiles.py +0 -0
  215. {chython-3.0 → chython-3.0.1}/chython/core/test/test_rings.py +0 -0
  216. {chython-3.0 → chython-3.0.1}/chython/core/test/test_rings_c60.py +0 -0
  217. {chython-3.0 → chython-3.0.1}/chython/core/test/test_set_element.py +0 -0
  218. {chython-3.0 → chython-3.0.1}/chython/core/test/test_sgroups.py +0 -0
  219. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smarts_read.py +0 -0
  220. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_r.py +0 -0
  221. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_read.py +0 -0
  222. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_roundtrip.py +0 -0
  223. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write.py +0 -0
  224. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_aromatic.py +0 -0
  225. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_cis_trans.py +0 -0
  226. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_detached.py +0 -0
  227. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_differential.py +0 -0
  228. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_h_unknown.py +0 -0
  229. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_stereo.py +0 -0
  230. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smiles_write_sticky.py +0 -0
  231. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smirks_filter.py +0 -0
  232. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smirks_patch.py +0 -0
  233. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smirks_read.py +0 -0
  234. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smirks_report.py +0 -0
  235. {chython-3.0 → chython-3.0.1}/chython/core/test/test_smirks_stereo.py +0 -0
  236. {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_acceptance.py +0 -0
  237. {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_parity.py +0 -0
  238. {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_perception.py +0 -0
  239. {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_query.py +0 -0
  240. {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_units.py +0 -0
  241. {chython-3.0 → chython-3.0.1}/chython/core/test/test_stereo_v2_differential.py +0 -0
  242. {chython-3.0 → chython-3.0.1}/chython/core/test/test_structure.py +0 -0
  243. {chython-3.0 → chython-3.0.1}/chython/core/test/test_thiele.py +0 -0
  244. {chython-3.0 → chython-3.0.1}/chython/core/test/test_title.py +0 -0
  245. {chython-3.0 → chython-3.0.1}/chython/core/test/test_topology.py +0 -0
  246. {chython-3.0 → chython-3.0.1}/chython/core/test/test_union_stereo.py +0 -0
  247. {chython-3.0 → chython-3.0.1}/chython/core/test/test_valence.py +0 -0
  248. {chython-3.0 → chython-3.0.1}/chython/core/test/test_view_surface.py +0 -0
  249. {chython-3.0 → chython-3.0.1}/chython/core/test/v3_fixtures.py +0 -0
  250. {chython-3.0 → chython-3.0.1}/chython/core/test/v4_fixtures.py +0 -0
  251. {chython-3.0 → chython-3.0.1}/chython/core/valence_rules.tsv +0 -0
  252. {chython-3.0 → chython-3.0.1}/chython/core/wedge.py +0 -0
  253. {chython-3.0 → chython-3.0.1}/chython/depict/__init__.py +0 -0
  254. {chython-3.0 → chython-3.0.1}/chython/depict/_config.py +0 -0
  255. {chython-3.0 → chython-3.0.1}/chython/depict/_hooks.py +0 -0
  256. {chython-3.0 → chython-3.0.1}/chython/depict/bonds.py +0 -0
  257. {chython-3.0 → chython-3.0.1}/chython/depict/colorbar.py +0 -0
  258. {chython-3.0 → chython-3.0.1}/chython/depict/colormap.py +0 -0
  259. {chython-3.0 → chython-3.0.1}/chython/depict/field.py +0 -0
  260. {chython-3.0 → chython-3.0.1}/chython/depict/figure.py +0 -0
  261. {chython-3.0 → chython-3.0.1}/chython/depict/label.py +0 -0
  262. {chython-3.0 → chython-3.0.1}/chython/depict/layout/__init__.py +0 -0
  263. {chython-3.0 → chython-3.0.1}/chython/depict/layout/clean2d.js +0 -0
  264. {chython-3.0 → chython-3.0.1}/chython/depict/layout/molecule.py +0 -0
  265. {chython-3.0 → chython-3.0.1}/chython/depict/layout/reaction.py +0 -0
  266. {chython-3.0 → chython-3.0.1}/chython/depict/metrics/__init__.py +0 -0
  267. {chython-3.0 → chython-3.0.1}/chython/depict/metrics/helvetica.tsv +0 -0
  268. {chython-3.0 → chython-3.0.1}/chython/depict/metrics/times.tsv +0 -0
  269. {chython-3.0 → chython-3.0.1}/chython/depict/overlay.py +0 -0
  270. {chython-3.0 → chython-3.0.1}/chython/depict/render/__init__.py +0 -0
  271. {chython-3.0 → chython-3.0.1}/chython/depict/render/svg.py +0 -0
  272. {chython-3.0 → chython-3.0.1}/chython/depict/scene.py +0 -0
  273. {chython-3.0 → chython-3.0.1}/chython/depict/style.py +0 -0
  274. {chython-3.0 → chython-3.0.1}/chython/depict/test/__init__.py +0 -0
  275. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_bonds.py +0 -0
  276. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_clean2d.py +0 -0
  277. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_colorbar.py +0 -0
  278. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_colormap.py +0 -0
  279. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_field.py +0 -0
  280. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_figure.py +0 -0
  281. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_label.py +0 -0
  282. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_metrics.py +0 -0
  283. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_overlay.py +0 -0
  284. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_package.py +0 -0
  285. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_r_atom.py +0 -0
  286. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_scene.py +0 -0
  287. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_style.py +0 -0
  288. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_svg.py +0 -0
  289. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_wedge_draw.py +0 -0
  290. {chython-3.0 → chython-3.0.1}/chython/depict/test/test_x3dom.py +0 -0
  291. {chython-3.0 → chython-3.0.1}/chython/depict/wedge.py +0 -0
  292. {chython-3.0 → chython-3.0.1}/chython/depict/x3dom.py +0 -0
  293. {chython-3.0 → chython-3.0.1}/chython/exceptions.py +0 -0
  294. {chython-3.0 → chython-3.0.1}/chython/formats/__init__.py +0 -0
  295. {chython-3.0 → chython-3.0.1}/chython/formats/_text.py +0 -0
  296. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/CTFILE.md +0 -0
  297. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/__init__.py +0 -0
  298. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_ctab.py +0 -0
  299. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_errors.py +0 -0
  300. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_facade.py +0 -0
  301. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_hydrogens.py +0 -0
  302. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_rdf.py +0 -0
  303. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_rxn.py +0 -0
  304. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_sdf.py +0 -0
  305. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_sgroup.py +0 -0
  306. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_stream.py +0 -0
  307. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_tokens.py +0 -0
  308. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_v2000.py +0 -0
  309. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/_v3000.py +0 -0
  310. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/__init__.py +0 -0
  311. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/conftest.py +0 -0
  312. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_aromatic.py +0 -0
  313. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_container_log.py +0 -0
  314. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_data_labels.py +0 -0
  315. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_facade.py +0 -0
  316. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_fidelity.py +0 -0
  317. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_hydrogens.py +0 -0
  318. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_r_atom.py +0 -0
  319. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_rdf.py +0 -0
  320. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_rxn.py +0 -0
  321. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_sdf.py +0 -0
  322. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_sgroup.py +0 -0
  323. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_stream.py +0 -0
  324. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_tokens.py +0 -0
  325. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_v2000.py +0 -0
  326. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_v3000.py +0 -0
  327. {chython-3.0 → chython-3.0.1}/chython/formats/ctfile/test/test_wedge.py +0 -0
  328. {chython-3.0 → chython-3.0.1}/chython/formats/mol2.py +0 -0
  329. {chython-3.0 → chython-3.0.1}/chython/formats/pdb/__init__.py +0 -0
  330. {chython-3.0 → chython-3.0.1}/chython/formats/pdb/_builder.py +0 -0
  331. {chython-3.0 → chython-3.0.1}/chython/formats/pdb/_legacy.py +0 -0
  332. {chython-3.0 → chython-3.0.1}/chython/formats/pdb/_mmcif.py +0 -0
  333. {chython-3.0 → chython-3.0.1}/chython/formats/pdb/_records.py +0 -0
  334. {chython-3.0 → chython-3.0.1}/chython/formats/pdb/_star.py +0 -0
  335. {chython-3.0 → chython-3.0.1}/chython/formats/test/__init__.py +0 -0
  336. {chython-3.0 → chython-3.0.1}/chython/formats/test/conftest.py +0 -0
  337. {chython-3.0 → chython-3.0.1}/chython/formats/test/oracles.py +0 -0
  338. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_conformance.py +0 -0
  339. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_done_when.py +0 -0
  340. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_isolation.py +0 -0
  341. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_log_prefix.py +0 -0
  342. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_mmcif.py +0 -0
  343. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_mol2.py +0 -0
  344. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_no_review_bookkeeping.py +0 -0
  345. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_oracles.py +0 -0
  346. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_pdb.py +0 -0
  347. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_pdb_builder.py +0 -0
  348. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_perceive_agreement.py +0 -0
  349. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_read_only_facades.py +0 -0
  350. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_xyz.py +0 -0
  351. {chython-3.0 → chython-3.0.1}/chython/formats/test/test_xyz_builder.py +0 -0
  352. {chython-3.0 → chython-3.0.1}/chython/formats/xml/__init__.py +0 -0
  353. {chython-3.0 → chython-3.0.1}/chython/formats/xml/_cml.py +0 -0
  354. {chython-3.0 → chython-3.0.1}/chython/formats/xml/_dialect.py +0 -0
  355. {chython-3.0 → chython-3.0.1}/chython/formats/xml/_errors.py +0 -0
  356. {chython-3.0 → chython-3.0.1}/chython/formats/xml/_facade.py +0 -0
  357. {chython-3.0 → chython-3.0.1}/chython/formats/xml/_mrv.py +0 -0
  358. {chython-3.0 → chython-3.0.1}/chython/formats/xml/_tree.py +0 -0
  359. {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/__init__.py +0 -0
  360. {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/conftest.py +0 -0
  361. {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_cml.py +0 -0
  362. {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_container_log.py +0 -0
  363. {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_dialect.py +0 -0
  364. {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_equivalence.py +0 -0
  365. {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_facade.py +0 -0
  366. {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_mrv.py +0 -0
  367. {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_mrv_census.py +0 -0
  368. {chython-3.0 → chython-3.0.1}/chython/formats/xml/test/test_tree.py +0 -0
  369. {chython-3.0 → chython-3.0.1}/chython/formats/xyz.py +0 -0
  370. {chython-3.0 → chython-3.0.1}/chython/interop/__init__.py +0 -0
  371. {chython-3.0 → chython-3.0.1}/chython/interop/_cdk.py +0 -0
  372. {chython-3.0 → chython-3.0.1}/chython/interop/_cdpkit.py +0 -0
  373. {chython-3.0 → chython-3.0.1}/chython/interop/_indigo.py +0 -0
  374. {chython-3.0 → chython-3.0.1}/chython/interop/_iupac.py +0 -0
  375. {chython-3.0 → chython-3.0.1}/chython/interop/_java.py +0 -0
  376. {chython-3.0 → chython-3.0.1}/chython/interop/_openbabel.py +0 -0
  377. {chython-3.0 → chython-3.0.1}/chython/interop/_pandas.py +0 -0
  378. {chython-3.0 → chython-3.0.1}/chython/interop/_rdkit.py +0 -0
  379. {chython-3.0 → chython-3.0.1}/chython/interop/_records.py +0 -0
  380. {chython-3.0 → chython-3.0.1}/chython/interop/_stereo.py +0 -0
  381. {chython-3.0 → chython-3.0.1}/chython/interop/config.py +0 -0
  382. {chython-3.0 → chython-3.0.1}/chython/interop/conformers.py +0 -0
  383. {chython-3.0 → chython-3.0.1}/chython/interop/test/__init__.py +0 -0
  384. {chython-3.0 → chython-3.0.1}/chython/interop/test/conftest.py +0 -0
  385. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_cdk.py +0 -0
  386. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_cdpkit.py +0 -0
  387. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_config.py +0 -0
  388. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_conformers.py +0 -0
  389. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_coordinate_honesty.py +0 -0
  390. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_dispatch.py +0 -0
  391. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_indigo.py +0 -0
  392. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_iupac.py +0 -0
  393. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_log_delivery.py +0 -0
  394. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_openbabel.py +0 -0
  395. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_pandas.py +0 -0
  396. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_rdkit.py +0 -0
  397. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_stereo.py +0 -0
  398. {chython-3.0 → chython-3.0.1}/chython/interop/test/test_v2_oracle.py +0 -0
  399. {chython-3.0 → chython-3.0.1}/chython/reactions/__init__.py +0 -0
  400. {chython-3.0 → chython-3.0.1}/chython/reactions/_enumerate.py +0 -0
  401. {chython-3.0 → chython-3.0.1}/chython/reactions/_numbering.py +0 -0
  402. {chython-3.0 → chython-3.0.1}/chython/reactions/_reconstruct.py +0 -0
  403. {chython-3.0 → chython-3.0.1}/chython/reactions/_stickers.py +0 -0
  404. {chython-3.0 → chython-3.0.1}/chython/reactions/_tables.py +0 -0
  405. {chython-3.0 → chython-3.0.1}/chython/reactions/attention/__init__.py +0 -0
  406. {chython-3.0 → chython-3.0.1}/chython/reactions/attention/_assign.py +0 -0
  407. {chython-3.0 → chython-3.0.1}/chython/reactions/attention/_encode.py +0 -0
  408. {chython-3.0 → chython-3.0.1}/chython/reactions/attention/_session.py +0 -0
  409. {chython-3.0 → chython-3.0.1}/chython/reactions/tables/functional.tsv +0 -0
  410. {chython-3.0 → chython-3.0.1}/chython/reactions/tables/protective.tsv +0 -0
  411. {chython-3.0 → chython-3.0.1}/chython/reactions/tables/reactions.tsv +0 -0
  412. {chython-3.0 → chython-3.0.1}/chython/reactions/tables/roles.tsv +0 -0
  413. {chython-3.0 → chython-3.0.1}/chython/reactions/test/__init__.py +0 -0
  414. {chython-3.0 → chython-3.0.1}/chython/reactions/test/_frozen_ids.py +0 -0
  415. {chython-3.0 → chython-3.0.1}/chython/reactions/test/gen_corpus_glossary.py +0 -0
  416. {chython-3.0 → chython-3.0.1}/chython/reactions/test/golden_subset.smi +0 -0
  417. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_attention.py +0 -0
  418. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_attention_assign.py +0 -0
  419. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_attention_encode.py +0 -0
  420. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_attention_isolation.py +0 -0
  421. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_corpus_glossary.py +0 -0
  422. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_dependency_direction.py +0 -0
  423. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_enumerate.py +0 -0
  424. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_functional.py +0 -0
  425. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_id_stability.py +0 -0
  426. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_numbering.py +0 -0
  427. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_probes.py +0 -0
  428. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_protective.py +0 -0
  429. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_reconstruct.py +0 -0
  430. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_roles.py +0 -0
  431. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_stickers.py +0 -0
  432. {chython-3.0 → chython-3.0.1}/chython/reactions/test/test_tables.py +0 -0
  433. {chython-3.0 → chython-3.0.1}/chython/test/__init__.py +0 -0
  434. {chython-3.0 → chython-3.0.1}/chython/test/test_code_hygiene.py +0 -0
  435. {chython-3.0 → chython-3.0.1}/chython/test/test_container_methods.py +0 -0
  436. {chython-3.0 → chython-3.0.1}/chython/test/test_doc_figures.py +0 -0
  437. {chython-3.0 → chython-3.0.1}/chython/test/test_doc_references.py +0 -0
  438. {chython-3.0 → chython-3.0.1}/chython/test/test_doc_samples.py +0 -0
  439. {chython-3.0 → chython-3.0.1}/chython/test/test_facade_names.py +0 -0
  440. {chython-3.0 → chython-3.0.1}/chython/test/test_hydrogen_parity.py +0 -0
  441. {chython-3.0 → chython-3.0.1}/chython/test/test_log_records.py +0 -0
  442. {chython-3.0 → chython-3.0.1}/chython/test/test_optional_numpy.py +0 -0
  443. {chython-3.0 → chython-3.0.1}/chython/test/test_packaging.py +0 -0
  444. {chython-3.0 → chython-3.0.1}/chython/test/test_performance.py +0 -0
  445. {chython-3.0 → chython-3.0.1}/chython/test/test_r_atom_integration.py +0 -0
  446. {chython-3.0 → chython-3.0.1}/chython/test/test_stereo_bluebook.py +0 -0
  447. {chython-3.0 → chython-3.0.1}/chython/test/test_v2_boundary.py +0 -0
  448. {chython-3.0 → chython-3.0.1}/chython.egg-info/SOURCES.txt +0 -0
  449. {chython-3.0 → chython-3.0.1}/chython.egg-info/dependency_links.txt +0 -0
  450. {chython-3.0 → chython-3.0.1}/chython.egg-info/requires.txt +0 -0
  451. {chython-3.0 → chython-3.0.1}/chython.egg-info/top_level.txt +0 -0
  452. {chython-3.0 → chython-3.0.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chython
3
- Version: 3.0
3
+ Version: 3.0.1
4
4
  Summary: Library for processing molecules and reactions in python way
5
5
  Author-email: Ramil Nugmanov <nougmanoff@protonmail.com>
6
6
  License-Expression: LGPL-3.0-or-later
@@ -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 test_the_linux_wheel_is_retagged_for_manylinux():
199
- """setuptools tags Linux wheels `linux_x86_64`, which PyPI rejects; poetry-core did not.
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
- 2.24 published `manylinux_2_39_*` with no repair step because poetry-core took its platform tag from
202
- `packaging.tags`. `bdist_wheel` does not, so the backend migration silently removed the only reason
203
- the Linux uploads worked -- a failure that appears at `twine upload`, on Linux only, during a
204
- release.
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
- text = _workflow()
207
- assert 'wheel tags' in text or 'auditwheel' in text, \
208
- 'no retag or repair step for Linux: setuptools emits linux_x86_64 and PyPI rejects it'
209
- assert 'sys_tags' in text or 'manylinux' in text, \
210
- 'the retag step does not name a manylinux tag or compute one'
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], module.cmake_args()
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():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chython
3
- Version: 3.0
3
+ Version: 3.0.1
4
4
  Summary: Library for processing molecules and reactions in python way
5
5
  Author-email: Ramil Nugmanov <nougmanoff@protonmail.com>
6
6
  License-Expression: LGPL-3.0-or-later
@@ -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