cdxml-toolkit 0.5.2__tar.gz → 0.5.4__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 (112) hide show
  1. {cdxml_toolkit-0.5.2/cdxml_toolkit.egg-info → cdxml_toolkit-0.5.4}/PKG-INFO +7 -4
  2. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/README.md +5 -1
  3. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/naming/mol_builder.py +14 -0
  4. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4/cdxml_toolkit.egg-info}/PKG-INFO +7 -4
  5. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/pyproject.toml +2 -3
  6. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_mol_builder.py +18 -5
  7. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/LICENSE +0 -0
  8. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/NOTICE.md +0 -0
  9. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/__init__.py +0 -0
  10. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/_jre/__init__.py +0 -0
  11. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/_jre/temurin-21-jre-win-x64.zip +0 -0
  12. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/__init__.py +0 -0
  13. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/deterministic/__init__.py +0 -0
  14. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/deterministic/discover_experiment_files.py +0 -0
  15. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/deterministic/lab_book_formatter.py +0 -0
  16. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/deterministic/lcms_file_categorizer.py +0 -0
  17. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/deterministic/lcms_identifier.py +0 -0
  18. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/deterministic/mass_resolver.py +0 -0
  19. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/deterministic/multi_lcms_analyzer.py +0 -0
  20. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/deterministic/procedure_writer.py +0 -0
  21. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/extract_nmr.py +0 -0
  22. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/format_procedure_entry.py +0 -0
  23. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/lcms_analyzer.py +0 -0
  24. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/analysis/parse_analysis_file.py +0 -0
  25. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/cdxml_builder.py +0 -0
  26. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/cdxml_utils.py +0 -0
  27. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/chemdraw/__init__.py +0 -0
  28. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/chemdraw/_chemscript_server.py +0 -0
  29. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/chemdraw/cdx_converter.py +0 -0
  30. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/chemdraw/cdxml_to_image.py +0 -0
  31. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/chemdraw/cdxml_to_image_rdkit.py +0 -0
  32. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/chemdraw/chemscript_bridge.py +0 -0
  33. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/constants.py +0 -0
  34. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/coord_normalizer.py +0 -0
  35. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/deterministic_pipeline/__init__.py +0 -0
  36. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/deterministic_pipeline/legacy/__init__.py +0 -0
  37. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/deterministic_pipeline/legacy/eln_cdx_cleanup.py +0 -0
  38. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/deterministic_pipeline/legacy/eln_enrichment.py +0 -0
  39. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/deterministic_pipeline/legacy/scheme_aligner.py +0 -0
  40. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/deterministic_pipeline/legacy/scheme_polisher.py +0 -0
  41. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/deterministic_pipeline/legacy/scheme_polisher_v2.py +0 -0
  42. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/deterministic_pipeline/scheme_reader_audit.py +0 -0
  43. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/deterministic_pipeline/scheme_reader_verify.py +0 -0
  44. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/image/__init__.py +0 -0
  45. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/image/reaction_from_image.py +0 -0
  46. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/image/structure_from_image.py +0 -0
  47. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/layout/__init__.py +0 -0
  48. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/layout/alignment.py +0 -0
  49. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/layout/reaction_cleanup.py +0 -0
  50. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/layout/scheme_merger.py +0 -0
  51. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/mcp_server/__init__.py +0 -0
  52. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/mcp_server/__main__.py +0 -0
  53. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/mcp_server/server.py +0 -0
  54. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/naming/__init__.py +0 -0
  55. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/naming/aligned_namer.py +0 -0
  56. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/naming/name_decomposer.py +0 -0
  57. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/naming/reactions_datamol.json +0 -0
  58. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/office/__init__.py +0 -0
  59. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/office/doc_from_template.py +0 -0
  60. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/office/ole_embedder.py +0 -0
  61. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/office/ole_extractor.py +0 -0
  62. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/perception/__init__.py +0 -0
  63. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/perception/compound_search.py +0 -0
  64. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/perception/eln_csv_parser.py +0 -0
  65. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/perception/rdf_parser.py +0 -0
  66. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/perception/reactant_heuristic.py +0 -0
  67. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/perception/reaction_parser.py +0 -0
  68. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/perception/scheme_reader.py +0 -0
  69. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/perception/scheme_refine.py +0 -0
  70. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/perception/scheme_segmenter.py +0 -0
  71. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/perception/spatial_assignment.py +0 -0
  72. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/rdkit_utils.py +0 -0
  73. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/render/__init__.py +0 -0
  74. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/render/auto_layout.py +0 -0
  75. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/render/compact_parser.py +0 -0
  76. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/render/parser.py +0 -0
  77. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/render/render_scheme.py +0 -0
  78. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/render/renderer.py +0 -0
  79. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/render/schema.py +0 -0
  80. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/render/scheme_maker.py +0 -0
  81. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/render/scheme_yaml_writer.py +0 -0
  82. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/resolve/__init__.py +0 -0
  83. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/resolve/cas_resolver.py +0 -0
  84. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/resolve/chemscanner_abbreviations.json +0 -0
  85. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/resolve/condensed_formula.py +0 -0
  86. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/resolve/jre_manager.py +0 -0
  87. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/resolve/reagent_abbreviations.json +0 -0
  88. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/resolve/reagent_db.py +0 -0
  89. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/resolve/superatom_data.json +0 -0
  90. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/resolve/superatom_table.py +0 -0
  91. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit/text_formatting.py +0 -0
  92. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit.egg-info/SOURCES.txt +0 -0
  93. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit.egg-info/dependency_links.txt +0 -0
  94. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit.egg-info/entry_points.txt +0 -0
  95. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit.egg-info/requires.txt +0 -0
  96. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/cdxml_toolkit.egg-info/top_level.txt +0 -0
  97. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/setup.cfg +0 -0
  98. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_builder.py +0 -0
  99. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_cdxml_utils.py +0 -0
  100. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_condensed_formula.py +0 -0
  101. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_constants.py +0 -0
  102. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_merge_yaml.py +0 -0
  103. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_rdkit_utils.py +0 -0
  104. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_reaction_parser.py +0 -0
  105. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_reagent_db.py +0 -0
  106. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_scheme_maker.py +0 -0
  107. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_scheme_reader.py +0 -0
  108. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_smoke.py +0 -0
  109. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_smoke_extended.py +0 -0
  110. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_spatial_assignment.py +0 -0
  111. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_superatom_table.py +0 -0
  112. {cdxml_toolkit-0.5.2 → cdxml_toolkit-0.5.4}/tests/test_text_formatting.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdxml-toolkit
3
- Version: 0.5.2
3
+ Version: 0.5.4
4
4
  Summary: MCP server and Python toolkit for perception, rendering, and analysis of molecules and reaction schemes in ChemDraw CDXML.
5
5
  Author: Hiu Fung Kevin Lee
6
6
  License-Expression: MIT
@@ -11,13 +11,12 @@ Classifier: Development Status :: 4 - Beta
11
11
  Classifier: Intended Audience :: Science/Research
12
12
  Classifier: Topic :: Scientific/Engineering :: Chemistry
13
13
  Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3.9
15
14
  Classifier: Programming Language :: Python :: 3.10
16
15
  Classifier: Programming Language :: Python :: 3.11
17
16
  Classifier: Programming Language :: Python :: 3.12
18
17
  Classifier: Programming Language :: Python :: 3.13
19
18
  Classifier: Operating System :: Microsoft :: Windows
20
- Requires-Python: >=3.9
19
+ Requires-Python: <3.14,>=3.10
21
20
  Description-Content-Type: text/markdown
22
21
  License-File: LICENSE
23
22
  License-File: NOTICE.md
@@ -154,9 +153,13 @@ Expected: 2 tool calls (resolve_name, draw_molecule), produces an aspirin CDXML
154
153
 
155
154
  ## Installation
156
155
 
157
- **Prerequisites:** Windows with ChemDraw (ChemOffice 2015+) and ChemScript installed.
156
+ **Prerequisites:** Windows with ChemDraw (ChemOffice 2015+) and ChemScript installed. Python 3.10–3.13 (3.14 is not yet supported by TensorFlow/DECIMER).
158
157
 
159
158
  ```bash
159
+ # Create a conda environment with a supported Python version
160
+ conda create -n cdxml python=3.12 pip -y
161
+ conda activate cdxml
162
+
160
163
  # From PyPI (recommended)
161
164
  pip install cdxml-toolkit
162
165
 
@@ -108,9 +108,13 @@ Expected: 2 tool calls (resolve_name, draw_molecule), produces an aspirin CDXML
108
108
 
109
109
  ## Installation
110
110
 
111
- **Prerequisites:** Windows with ChemDraw (ChemOffice 2015+) and ChemScript installed.
111
+ **Prerequisites:** Windows with ChemDraw (ChemOffice 2015+) and ChemScript installed. Python 3.10–3.13 (3.14 is not yet supported by TensorFlow/DECIMER).
112
112
 
113
113
  ```bash
114
+ # Create a conda environment with a supported Python version
115
+ conda create -n cdxml python=3.12 pip -y
116
+ conda activate cdxml
117
+
114
118
  # From PyPI (recommended)
115
119
  pip install cdxml-toolkit
116
120
 
@@ -350,6 +350,20 @@ def _try_validate(name: str, use_network: bool = True) -> Optional[str]:
350
350
  if smi:
351
351
  return smi
352
352
 
353
+ # OPSIN fallback (offline IUPAC name resolution, bundled JRE)
354
+ try:
355
+ from cdxml_toolkit.resolve.jre_manager import ensure_java_on_path
356
+ if ensure_java_on_path():
357
+ import warnings
358
+ from py2opsin import py2opsin as _py2opsin
359
+ with warnings.catch_warnings():
360
+ warnings.simplefilter("ignore", RuntimeWarning)
361
+ smi = _py2opsin(name)
362
+ if smi and Chem.MolFromSmiles(smi):
363
+ return _rdkit_canonical(smi)
364
+ except (ImportError, FileNotFoundError):
365
+ pass
366
+
353
367
  # PubChem fallback (for common names)
354
368
  if use_network:
355
369
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdxml-toolkit
3
- Version: 0.5.2
3
+ Version: 0.5.4
4
4
  Summary: MCP server and Python toolkit for perception, rendering, and analysis of molecules and reaction schemes in ChemDraw CDXML.
5
5
  Author: Hiu Fung Kevin Lee
6
6
  License-Expression: MIT
@@ -11,13 +11,12 @@ Classifier: Development Status :: 4 - Beta
11
11
  Classifier: Intended Audience :: Science/Research
12
12
  Classifier: Topic :: Scientific/Engineering :: Chemistry
13
13
  Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3.9
15
14
  Classifier: Programming Language :: Python :: 3.10
16
15
  Classifier: Programming Language :: Python :: 3.11
17
16
  Classifier: Programming Language :: Python :: 3.12
18
17
  Classifier: Programming Language :: Python :: 3.13
19
18
  Classifier: Operating System :: Microsoft :: Windows
20
- Requires-Python: >=3.9
19
+ Requires-Python: <3.14,>=3.10
21
20
  Description-Content-Type: text/markdown
22
21
  License-File: LICENSE
23
22
  License-File: NOTICE.md
@@ -154,9 +153,13 @@ Expected: 2 tool calls (resolve_name, draw_molecule), produces an aspirin CDXML
154
153
 
155
154
  ## Installation
156
155
 
157
- **Prerequisites:** Windows with ChemDraw (ChemOffice 2015+) and ChemScript installed.
156
+ **Prerequisites:** Windows with ChemDraw (ChemOffice 2015+) and ChemScript installed. Python 3.10–3.13 (3.14 is not yet supported by TensorFlow/DECIMER).
158
157
 
159
158
  ```bash
159
+ # Create a conda environment with a supported Python version
160
+ conda create -n cdxml python=3.12 pip -y
161
+ conda activate cdxml
162
+
160
163
  # From PyPI (recommended)
161
164
  pip install cdxml-toolkit
162
165
 
@@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cdxml-toolkit"
7
- version = "0.5.2"
7
+ version = "0.5.4"
8
8
  description = "MCP server and Python toolkit for perception, rendering, and analysis of molecules and reaction schemes in ChemDraw CDXML."
9
9
  readme = "README.md"
10
10
  license = "MIT"
11
- requires-python = ">=3.9"
11
+ requires-python = ">=3.10,<3.14"
12
12
  authors = [
13
13
  {name = "Hiu Fung Kevin Lee"},
14
14
  ]
@@ -17,7 +17,6 @@ classifiers = [
17
17
  "Intended Audience :: Science/Research",
18
18
  "Topic :: Scientific/Engineering :: Chemistry",
19
19
  "Programming Language :: Python :: 3",
20
- "Programming Language :: Python :: 3.9",
21
20
  "Programming Language :: Python :: 3.10",
22
21
  "Programming Language :: Python :: 3.11",
23
22
  "Programming Language :: Python :: 3.12",
@@ -26,21 +26,34 @@ from cdxml_toolkit.naming.mol_builder import (
26
26
 
27
27
 
28
28
  # ---------------------------------------------------------------------------
29
- # Helper: check if ChemScript is available
29
+ # Helper: check if a name-to-structure backend is available
30
30
  # ---------------------------------------------------------------------------
31
31
 
32
- def _chemscript_available():
32
+ def _name_resolver_available():
33
+ """Return True if ChemScript or OPSIN can resolve IUPAC names."""
34
+ # Try ChemScript first
33
35
  try:
34
36
  from cdxml_toolkit.chemdraw.chemscript_bridge import ChemScriptBridge
35
37
  ChemScriptBridge()
36
38
  return True
37
39
  except Exception:
38
- return False
40
+ pass
41
+ # Try OPSIN (bundled offline fallback)
42
+ try:
43
+ from cdxml_toolkit.resolve.jre_manager import ensure_java_on_path
44
+ if ensure_java_on_path():
45
+ from py2opsin import py2opsin as _py2opsin
46
+ smi = _py2opsin("benzene")
47
+ if smi:
48
+ return True
49
+ except Exception:
50
+ pass
51
+ return False
39
52
 
40
53
 
41
54
  needs_chemscript = pytest.mark.skipif(
42
- not _chemscript_available(),
43
- reason="ChemScript not available",
55
+ not _name_resolver_available(),
56
+ reason="No name resolver available (neither ChemScript nor OPSIN)",
44
57
  )
45
58
 
46
59
 
File without changes
File without changes
File without changes