chemicalml 0.1.0 → 0.2.1

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 (740) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/docs.yml +63 -0
  3. data/.github/workflows/links.yml +99 -0
  4. data/.github/workflows/opal.yml +34 -0
  5. data/.github/workflows/performance.yml +25 -0
  6. data/.github/workflows/rake.yml +19 -0
  7. data/.github/workflows/release.yml +34 -0
  8. data/CHANGELOG.md +52 -12
  9. data/CLAUDE.md +48 -41
  10. data/Gemfile +2 -1
  11. data/Rakefile +9 -4
  12. data/TODO.align/18-wire-class-registry.md +46 -0
  13. data/TODO.align/19-schema-aware-translator.md +33 -0
  14. data/TODO.align/20-missing-translator-rules.md +44 -0
  15. data/TODO.align/21-encapsulate-translator.md +33 -0
  16. data/TODO.align/22-dry-role-modules.md +32 -0
  17. data/TODO.align/23-final-spec-lint.md +25 -0
  18. data/TODO.align/24-autoload-wire-classes.md +84 -0
  19. data/TODO.align/25-value-container-schema-awareness.md +44 -0
  20. data/TODO.align/26-remove-dead-code.md +16 -0
  21. data/TODO.align/27-final-spec-lint.md +26 -0
  22. data/TODO.align/28-stereo-model.md +40 -0
  23. data/TODO.align/29-stereo-wire-children.md +30 -0
  24. data/TODO.align/30-stereo-translator.md +32 -0
  25. data/TODO.align/31-final-spec-lint.md +20 -0
  26. data/TODO.align/32-polymorphic-translator.md +43 -0
  27. data/TODO.align/33-polymorphic-parse.md +43 -0
  28. data/TODO.align/34-polymorphic-specs.md +16 -0
  29. data/TODO.align/35-final-spec-lint.md +10 -0
  30. data/TODO.align/36-molecular-convention-coverage.md +46 -0
  31. data/TODO.align/37-compchem-convention-coverage.md +55 -0
  32. data/TODO.align/38-dictionary-convention-coverage.md +34 -0
  33. data/TODO.align/39-unit-dictionary-convention-coverage.md +33 -0
  34. data/TODO.align/40-unit-type-dictionary-convention-coverage.md +28 -0
  35. data/TODO.align/41-expand-canonical-model-layer.md +43 -0
  36. data/TODO.align/42-translator-wire-new-models.md +31 -0
  37. data/TODO.align/43-dictionary-model-no-to-h.md +39 -0
  38. data/TODO.align/44-schema3-only-and-schema24-module.md +44 -0
  39. data/TODO.align/45-documentation-and-final-verification.md +23 -0
  40. data/TODO.align/46-lattice-vector-content.md +24 -0
  41. data/TODO.align/47-molecule-crystal-spectra-property-lists.md +23 -0
  42. data/TODO.align/48-model-list-and-module-lists.md +21 -0
  43. data/TODO.align/49-more-chemistry-models.md +34 -0
  44. data/TODO.align/50-validation-report.md +29 -0
  45. data/TODO.align/51-convention-auto-detection.md +30 -0
  46. data/TODO.align/52-schema24-legacy-elements.md +28 -0
  47. data/TODO.align/53-round-trip-integration-specs.md +30 -0
  48. data/TODO.align/54-document-versioned-parser-shim.md +38 -0
  49. data/TODO.align/55-molecule-missing-attributes.md +20 -0
  50. data/TODO.align/56-geometry-models.md +24 -0
  51. data/TODO.align/57-compchem-models.md +26 -0
  52. data/TODO.align/58-remaining-models.md +24 -0
  53. data/TODO.align/59-wire-new-models-translator.md +18 -0
  54. data/TODO.align/60-docs-and-final-verification.md +19 -0
  55. data/TODO.align/README.round10.md +30 -0
  56. data/TODO.align/README.round11.md +50 -0
  57. data/TODO.align/README.round12.md +73 -0
  58. data/TODO.align/README.round13.md +59 -0
  59. data/TODO.align/README.round14.md +48 -0
  60. data/TODO.align/README.round15.md +86 -0
  61. data/TODO.align/README.round16.md +46 -0
  62. data/TODO.align/README.round3.md +27 -0
  63. data/TODO.align/README.round4.md +18 -0
  64. data/TODO.align/README.round5.md +20 -0
  65. data/TODO.align/README.round6.md +27 -0
  66. data/TODO.align/README.round7.md +43 -0
  67. data/TODO.align/README.round8.md +24 -0
  68. data/TODO.align/README.round9.md +50 -0
  69. data/data/dictionaries/_index.yaml +9 -1
  70. data/data/dictionaries/cif.yaml +155 -0
  71. data/data/dictionaries/cml.yaml +172 -0
  72. data/data/dictionaries/cml_formula.yaml +63 -0
  73. data/data/dictionaries/cml_name.yaml +84 -0
  74. data/data/dictionaries/unit_non_si.yaml +30 -0
  75. data/data/dictionaries/unit_type.yaml +12 -0
  76. data/lib/chemicalml/cml/aliases.rb +20 -0
  77. data/lib/chemicalml/cml/base/abundance.rb +34 -0
  78. data/lib/chemicalml/cml/base/action.rb +50 -0
  79. data/lib/chemicalml/cml/base/action_list.rb +51 -0
  80. data/lib/chemicalml/cml/base/alternative.rb +28 -0
  81. data/lib/chemicalml/cml/base/amount.rb +30 -0
  82. data/lib/chemicalml/cml/base/angle.rb +44 -0
  83. data/lib/chemicalml/cml/base/annotation.rb +30 -0
  84. data/lib/chemicalml/cml/base/any_cml.rb +28 -0
  85. data/lib/chemicalml/cml/base/appinfo.rb +32 -0
  86. data/lib/chemicalml/cml/base/arg.rb +46 -0
  87. data/lib/chemicalml/cml/base/array.rb +23 -1
  88. data/lib/chemicalml/cml/base/array_list.rb +30 -0
  89. data/lib/chemicalml/cml/base/atom.rb +37 -1
  90. data/lib/chemicalml/cml/base/atom_array.rb +39 -1
  91. data/lib/chemicalml/cml/base/atom_parity.rb +9 -1
  92. data/lib/chemicalml/cml/base/atom_set.rb +30 -0
  93. data/lib/chemicalml/cml/base/atom_type.rb +36 -0
  94. data/lib/chemicalml/cml/base/atom_type_list.rb +33 -0
  95. data/lib/chemicalml/cml/base/atomic_basis_function.rb +44 -0
  96. data/lib/chemicalml/cml/base/band.rb +34 -0
  97. data/lib/chemicalml/cml/base/band_list.rb +31 -0
  98. data/lib/chemicalml/cml/base/basis_set.rb +35 -0
  99. data/lib/chemicalml/cml/base/bond.rb +11 -1
  100. data/lib/chemicalml/cml/base/bond_array.rb +17 -1
  101. data/lib/chemicalml/cml/base/bond_set.rb +30 -0
  102. data/lib/chemicalml/cml/base/bond_stereo.rb +11 -1
  103. data/lib/chemicalml/cml/base/bond_type.rb +34 -0
  104. data/lib/chemicalml/cml/base/bond_type_list.rb +33 -0
  105. data/lib/chemicalml/cml/base/cell_parameter.rb +38 -0
  106. data/lib/chemicalml/cml/base/cml_module.rb +1 -1
  107. data/lib/chemicalml/cml/base/complex_object.rb +30 -0
  108. data/lib/chemicalml/cml/base/condition_list.rb +37 -0
  109. data/lib/chemicalml/cml/base/crystal.rb +37 -0
  110. data/lib/chemicalml/cml/base/definition.rb +30 -0
  111. data/lib/chemicalml/cml/base/description.rb +32 -0
  112. data/lib/chemicalml/cml/base/dictionary.rb +7 -1
  113. data/lib/chemicalml/cml/base/dictionary_entry.rb +1 -1
  114. data/lib/chemicalml/cml/base/dimension.rb +42 -0
  115. data/lib/chemicalml/cml/base/document.rb +9 -1
  116. data/lib/chemicalml/cml/base/documentation.rb +30 -0
  117. data/lib/chemicalml/cml/base/eigen.rb +36 -0
  118. data/lib/chemicalml/cml/base/electron.rb +42 -0
  119. data/lib/chemicalml/cml/base/enumeration.rb +32 -0
  120. data/lib/chemicalml/cml/base/expression.rb +32 -0
  121. data/lib/chemicalml/cml/base/float.rb +40 -0
  122. data/lib/chemicalml/cml/base/float_array.rb +42 -0
  123. data/lib/chemicalml/cml/base/formula.rb +1 -1
  124. data/lib/chemicalml/cml/base/fragment.rb +41 -0
  125. data/lib/chemicalml/cml/base/fragment_list.rb +35 -0
  126. data/lib/chemicalml/cml/base/gradient.rb +32 -0
  127. data/lib/chemicalml/cml/base/identifier.rb +9 -1
  128. data/lib/chemicalml/cml/base/integer.rb +40 -0
  129. data/lib/chemicalml/cml/base/integer_array.rb +42 -0
  130. data/lib/chemicalml/cml/base/isotope.rb +36 -0
  131. data/lib/chemicalml/cml/base/isotope_list.rb +33 -0
  132. data/lib/chemicalml/cml/base/join.rb +36 -0
  133. data/lib/chemicalml/cml/base/kpoint.rb +34 -0
  134. data/lib/chemicalml/cml/base/kpoint_list.rb +31 -0
  135. data/lib/chemicalml/cml/base/label.rb +3 -1
  136. data/lib/chemicalml/cml/base/lattice.rb +37 -0
  137. data/lib/chemicalml/cml/base/lattice_vector.rb +32 -0
  138. data/lib/chemicalml/cml/base/length.rb +42 -0
  139. data/lib/chemicalml/cml/base/line3.rb +36 -0
  140. data/lib/chemicalml/cml/base/link.rb +58 -0
  141. data/lib/chemicalml/cml/base/list.rb +3 -1
  142. data/lib/chemicalml/cml/base/map.rb +40 -0
  143. data/lib/chemicalml/cml/base/matrix.rb +13 -1
  144. data/lib/chemicalml/cml/base/mechanism.rb +31 -0
  145. data/lib/chemicalml/cml/base/mechanism_component.rb +30 -0
  146. data/lib/chemicalml/cml/base/metadata.rb +5 -1
  147. data/lib/chemicalml/cml/base/metadata_list.rb +7 -1
  148. data/lib/chemicalml/cml/base/molecule.rb +27 -1
  149. data/lib/chemicalml/cml/base/molecule_list.rb +33 -0
  150. data/lib/chemicalml/cml/base/name.rb +3 -1
  151. data/lib/chemicalml/cml/base/object.rb +34 -0
  152. data/lib/chemicalml/cml/base/observation.rb +32 -0
  153. data/lib/chemicalml/cml/base/operator.rb +32 -0
  154. data/lib/chemicalml/cml/base/parameter.rb +11 -1
  155. data/lib/chemicalml/cml/base/parameter_list.rb +7 -1
  156. data/lib/chemicalml/cml/base/particle.rb +36 -0
  157. data/lib/chemicalml/cml/base/peak.rb +70 -0
  158. data/lib/chemicalml/cml/base/peak_group.rb +69 -0
  159. data/lib/chemicalml/cml/base/peak_list.rb +35 -0
  160. data/lib/chemicalml/cml/base/peak_structure.rb +44 -0
  161. data/lib/chemicalml/cml/base/plane3.rb +32 -0
  162. data/lib/chemicalml/cml/base/point3.rb +32 -0
  163. data/lib/chemicalml/cml/base/potential.rb +30 -0
  164. data/lib/chemicalml/cml/base/potential_form.rb +32 -0
  165. data/lib/chemicalml/cml/base/potential_list.rb +31 -0
  166. data/lib/chemicalml/cml/base/product.rb +17 -1
  167. data/lib/chemicalml/cml/base/product_list.rb +15 -1
  168. data/lib/chemicalml/cml/base/property.rb +7 -1
  169. data/lib/chemicalml/cml/base/property_list.rb +7 -1
  170. data/lib/chemicalml/cml/base/reactant.rb +17 -1
  171. data/lib/chemicalml/cml/base/reactant_list.rb +15 -1
  172. data/lib/chemicalml/cml/base/reaction.rb +25 -1
  173. data/lib/chemicalml/cml/base/reaction_list.rb +13 -1
  174. data/lib/chemicalml/cml/base/reaction_scheme.rb +43 -0
  175. data/lib/chemicalml/cml/base/reaction_step.rb +41 -0
  176. data/lib/chemicalml/cml/base/reaction_step_list.rb +39 -0
  177. data/lib/chemicalml/cml/base/reactive_centre.rb +30 -0
  178. data/lib/chemicalml/cml/base/region.rb +36 -0
  179. data/lib/chemicalml/cml/base/related_entry.rb +26 -0
  180. data/lib/chemicalml/cml/base/sample.rb +32 -0
  181. data/lib/chemicalml/cml/base/scalar.rb +19 -1
  182. data/lib/chemicalml/cml/base/spectator.rb +30 -0
  183. data/lib/chemicalml/cml/base/spectator_list.rb +31 -0
  184. data/lib/chemicalml/cml/base/spectrum.rb +53 -0
  185. data/lib/chemicalml/cml/base/spectrum_data.rb +35 -0
  186. data/lib/chemicalml/cml/base/spectrum_list.rb +35 -0
  187. data/lib/chemicalml/cml/base/sphere3.rb +32 -0
  188. data/lib/chemicalml/cml/base/stmml.rb +28 -0
  189. data/lib/chemicalml/cml/base/string.rb +32 -0
  190. data/lib/chemicalml/cml/base/string_array.rb +40 -0
  191. data/lib/chemicalml/cml/base/substance.rb +13 -1
  192. data/lib/chemicalml/cml/base/substance_list.rb +37 -0
  193. data/lib/chemicalml/cml/base/symmetry.rb +36 -0
  194. data/lib/chemicalml/cml/base/system.rb +37 -0
  195. data/lib/chemicalml/cml/base/table.rb +43 -0
  196. data/lib/chemicalml/cml/base/table_cell.rb +30 -0
  197. data/lib/chemicalml/cml/base/table_content.rb +35 -0
  198. data/lib/chemicalml/cml/base/table_header.rb +31 -0
  199. data/lib/chemicalml/cml/base/table_header_cell.rb +40 -0
  200. data/lib/chemicalml/cml/base/table_row.rb +31 -0
  201. data/lib/chemicalml/cml/base/table_row_list.rb +31 -0
  202. data/lib/chemicalml/cml/base/tcell.rb +34 -0
  203. data/lib/chemicalml/cml/base/torsion.rb +44 -0
  204. data/lib/chemicalml/cml/base/transform3.rb +30 -0
  205. data/lib/chemicalml/cml/base/transition_state.rb +28 -0
  206. data/lib/chemicalml/cml/base/trow.rb +32 -0
  207. data/lib/chemicalml/cml/base/unit.rb +13 -1
  208. data/lib/chemicalml/cml/base/unit_list.rb +13 -1
  209. data/lib/chemicalml/cml/base/unit_type.rb +11 -1
  210. data/lib/chemicalml/cml/base/unit_type_list.rb +11 -1
  211. data/lib/chemicalml/cml/base/vector3.rb +32 -0
  212. data/lib/chemicalml/cml/base/xaxis.rb +38 -0
  213. data/lib/chemicalml/cml/base/yaxis.rb +38 -0
  214. data/lib/chemicalml/cml/base/z_matrix.rb +30 -0
  215. data/lib/chemicalml/cml/base.rb +102 -0
  216. data/lib/chemicalml/cml/elements.rb +166 -43
  217. data/lib/chemicalml/cml/role/abundance.rb +12 -0
  218. data/lib/chemicalml/cml/role/action.rb +12 -0
  219. data/lib/chemicalml/cml/role/action_list.rb +12 -0
  220. data/lib/chemicalml/cml/role/alternative.rb +10 -0
  221. data/lib/chemicalml/cml/role/amount.rb +12 -0
  222. data/lib/chemicalml/cml/role/angle.rb +12 -0
  223. data/lib/chemicalml/cml/role/annotation.rb +10 -0
  224. data/lib/chemicalml/cml/role/any_cml.rb +12 -0
  225. data/lib/chemicalml/cml/role/appinfo.rb +10 -0
  226. data/lib/chemicalml/cml/role/arg.rb +10 -0
  227. data/lib/chemicalml/cml/role/array_list.rb +12 -0
  228. data/lib/chemicalml/cml/role/atom_set.rb +12 -0
  229. data/lib/chemicalml/cml/role/atom_type.rb +12 -0
  230. data/lib/chemicalml/cml/role/atom_type_list.rb +12 -0
  231. data/lib/chemicalml/cml/role/atomic_basis_function.rb +12 -0
  232. data/lib/chemicalml/cml/role/band.rb +12 -0
  233. data/lib/chemicalml/cml/role/band_list.rb +12 -0
  234. data/lib/chemicalml/cml/role/basis_set.rb +12 -0
  235. data/lib/chemicalml/cml/role/bond_set.rb +12 -0
  236. data/lib/chemicalml/cml/role/bond_type.rb +12 -0
  237. data/lib/chemicalml/cml/role/bond_type_list.rb +12 -0
  238. data/lib/chemicalml/cml/role/cell_parameter.rb +12 -0
  239. data/lib/chemicalml/cml/role/cml_module.rb +2 -3
  240. data/lib/chemicalml/cml/role/complex_object.rb +10 -0
  241. data/lib/chemicalml/cml/role/condition_list.rb +12 -0
  242. data/lib/chemicalml/cml/role/crystal.rb +12 -0
  243. data/lib/chemicalml/cml/role/definition.rb +12 -0
  244. data/lib/chemicalml/cml/role/description.rb +12 -0
  245. data/lib/chemicalml/cml/role/dimension.rb +12 -0
  246. data/lib/chemicalml/cml/role/documentation.rb +12 -0
  247. data/lib/chemicalml/cml/role/eigen.rb +12 -0
  248. data/lib/chemicalml/cml/role/electron.rb +12 -0
  249. data/lib/chemicalml/cml/role/enumeration.rb +10 -0
  250. data/lib/chemicalml/cml/role/expression.rb +10 -0
  251. data/lib/chemicalml/cml/role/float.rb +10 -0
  252. data/lib/chemicalml/cml/role/float_array.rb +10 -0
  253. data/lib/chemicalml/cml/role/fragment.rb +12 -0
  254. data/lib/chemicalml/cml/role/fragment_list.rb +12 -0
  255. data/lib/chemicalml/cml/role/gradient.rb +12 -0
  256. data/lib/chemicalml/cml/role/integer.rb +10 -0
  257. data/lib/chemicalml/cml/role/integer_array.rb +10 -0
  258. data/lib/chemicalml/cml/role/isotope.rb +12 -0
  259. data/lib/chemicalml/cml/role/isotope_list.rb +12 -0
  260. data/lib/chemicalml/cml/role/join.rb +12 -0
  261. data/lib/chemicalml/cml/role/kpoint.rb +12 -0
  262. data/lib/chemicalml/cml/role/kpoint_list.rb +12 -0
  263. data/lib/chemicalml/cml/role/lattice.rb +12 -0
  264. data/lib/chemicalml/cml/role/lattice_vector.rb +12 -0
  265. data/lib/chemicalml/cml/role/length.rb +12 -0
  266. data/lib/chemicalml/cml/role/line3.rb +12 -0
  267. data/lib/chemicalml/cml/role/link.rb +12 -0
  268. data/lib/chemicalml/cml/role/map.rb +12 -0
  269. data/lib/chemicalml/cml/role/mechanism.rb +12 -0
  270. data/lib/chemicalml/cml/role/mechanism_component.rb +12 -0
  271. data/lib/chemicalml/cml/role/molecule_list.rb +12 -0
  272. data/lib/chemicalml/cml/role/object.rb +12 -0
  273. data/lib/chemicalml/cml/role/observation.rb +12 -0
  274. data/lib/chemicalml/cml/role/operator.rb +10 -0
  275. data/lib/chemicalml/cml/role/particle.rb +12 -0
  276. data/lib/chemicalml/cml/role/peak.rb +12 -0
  277. data/lib/chemicalml/cml/role/peak_group.rb +12 -0
  278. data/lib/chemicalml/cml/role/peak_list.rb +12 -0
  279. data/lib/chemicalml/cml/role/peak_structure.rb +12 -0
  280. data/lib/chemicalml/cml/role/plane3.rb +12 -0
  281. data/lib/chemicalml/cml/role/point3.rb +12 -0
  282. data/lib/chemicalml/cml/role/potential.rb +12 -0
  283. data/lib/chemicalml/cml/role/potential_form.rb +12 -0
  284. data/lib/chemicalml/cml/role/potential_list.rb +12 -0
  285. data/lib/chemicalml/cml/role/reaction_scheme.rb +12 -0
  286. data/lib/chemicalml/cml/role/reaction_step.rb +12 -0
  287. data/lib/chemicalml/cml/role/reaction_step_list.rb +12 -0
  288. data/lib/chemicalml/cml/role/reactive_centre.rb +12 -0
  289. data/lib/chemicalml/cml/role/region.rb +12 -0
  290. data/lib/chemicalml/cml/role/related_entry.rb +10 -0
  291. data/lib/chemicalml/cml/role/sample.rb +12 -0
  292. data/lib/chemicalml/cml/role/spectator.rb +12 -0
  293. data/lib/chemicalml/cml/role/spectator_list.rb +12 -0
  294. data/lib/chemicalml/cml/role/spectrum.rb +12 -0
  295. data/lib/chemicalml/cml/role/spectrum_data.rb +12 -0
  296. data/lib/chemicalml/cml/role/spectrum_list.rb +12 -0
  297. data/lib/chemicalml/cml/role/sphere3.rb +12 -0
  298. data/lib/chemicalml/cml/role/stmml.rb +12 -0
  299. data/lib/chemicalml/cml/role/string.rb +10 -0
  300. data/lib/chemicalml/cml/role/string_array.rb +10 -0
  301. data/lib/chemicalml/cml/role/substance_list.rb +12 -0
  302. data/lib/chemicalml/cml/role/symmetry.rb +12 -0
  303. data/lib/chemicalml/cml/role/system.rb +12 -0
  304. data/lib/chemicalml/cml/role/table.rb +12 -0
  305. data/lib/chemicalml/cml/role/table_cell.rb +12 -0
  306. data/lib/chemicalml/cml/role/table_content.rb +12 -0
  307. data/lib/chemicalml/cml/role/table_header.rb +12 -0
  308. data/lib/chemicalml/cml/role/table_header_cell.rb +12 -0
  309. data/lib/chemicalml/cml/role/table_row.rb +12 -0
  310. data/lib/chemicalml/cml/role/table_row_list.rb +12 -0
  311. data/lib/chemicalml/cml/role/tcell.rb +10 -0
  312. data/lib/chemicalml/cml/role/torsion.rb +12 -0
  313. data/lib/chemicalml/cml/role/transform3.rb +12 -0
  314. data/lib/chemicalml/cml/role/transition_state.rb +12 -0
  315. data/lib/chemicalml/cml/role/trow.rb +10 -0
  316. data/lib/chemicalml/cml/role/vector3.rb +12 -0
  317. data/lib/chemicalml/cml/role/xaxis.rb +12 -0
  318. data/lib/chemicalml/cml/role/yaxis.rb +12 -0
  319. data/lib/chemicalml/cml/role/z_matrix.rb +12 -0
  320. data/lib/chemicalml/cml/role.rb +103 -1
  321. data/lib/chemicalml/cml/schema24/abundance.rb +13 -0
  322. data/lib/chemicalml/cml/schema24/action.rb +13 -0
  323. data/lib/chemicalml/cml/schema24/action_list.rb +13 -0
  324. data/lib/chemicalml/cml/schema24/alternative.rb +14 -0
  325. data/lib/chemicalml/cml/schema24/amount.rb +13 -0
  326. data/lib/chemicalml/cml/schema24/angle.rb +13 -0
  327. data/lib/chemicalml/cml/schema24/annotation.rb +15 -0
  328. data/lib/chemicalml/cml/schema24/any_cml.rb +13 -0
  329. data/lib/chemicalml/cml/schema24/appinfo.rb +15 -0
  330. data/lib/chemicalml/cml/schema24/arg.rb +14 -0
  331. data/lib/chemicalml/cml/schema24/array.rb +15 -0
  332. data/lib/chemicalml/cml/schema24/array_list.rb +13 -0
  333. data/lib/chemicalml/cml/schema24/atom.rb +15 -0
  334. data/lib/chemicalml/cml/schema24/atom_array.rb +15 -0
  335. data/lib/chemicalml/cml/schema24/atom_parity.rb +15 -0
  336. data/lib/chemicalml/cml/schema24/atom_set.rb +13 -0
  337. data/lib/chemicalml/cml/schema24/atom_type.rb +13 -0
  338. data/lib/chemicalml/cml/schema24/atom_type_list.rb +13 -0
  339. data/lib/chemicalml/cml/schema24/atomic_basis_function.rb +13 -0
  340. data/lib/chemicalml/cml/schema24/band.rb +13 -0
  341. data/lib/chemicalml/cml/schema24/band_list.rb +13 -0
  342. data/lib/chemicalml/cml/schema24/basis_set.rb +13 -0
  343. data/lib/chemicalml/cml/schema24/bond.rb +15 -0
  344. data/lib/chemicalml/cml/schema24/bond_array.rb +15 -0
  345. data/lib/chemicalml/cml/schema24/bond_set.rb +13 -0
  346. data/lib/chemicalml/cml/schema24/bond_stereo.rb +15 -0
  347. data/lib/chemicalml/cml/schema24/bond_type.rb +13 -0
  348. data/lib/chemicalml/cml/schema24/bond_type_list.rb +13 -0
  349. data/lib/chemicalml/cml/schema24/cell_parameter.rb +13 -0
  350. data/lib/chemicalml/cml/schema24/cml_module.rb +18 -0
  351. data/lib/chemicalml/cml/schema24/complex_object.rb +14 -0
  352. data/lib/chemicalml/cml/schema24/condition_list.rb +13 -0
  353. data/lib/chemicalml/cml/schema24/configuration.rb +5 -2
  354. data/lib/chemicalml/cml/schema24/context.rb +18 -0
  355. data/lib/chemicalml/cml/schema24/crystal.rb +13 -0
  356. data/lib/chemicalml/cml/schema24/definition.rb +13 -0
  357. data/lib/chemicalml/cml/schema24/description.rb +13 -0
  358. data/lib/chemicalml/cml/schema24/dictionary.rb +15 -0
  359. data/lib/chemicalml/cml/schema24/dictionary_entry.rb +15 -0
  360. data/lib/chemicalml/cml/schema24/dimension.rb +13 -0
  361. data/lib/chemicalml/cml/schema24/document.rb +15 -0
  362. data/lib/chemicalml/cml/schema24/documentation.rb +13 -0
  363. data/lib/chemicalml/cml/schema24/eigen.rb +13 -0
  364. data/lib/chemicalml/cml/schema24/electron.rb +13 -0
  365. data/lib/chemicalml/cml/schema24/enumeration.rb +16 -0
  366. data/lib/chemicalml/cml/schema24/expression.rb +14 -0
  367. data/lib/chemicalml/cml/schema24/float.rb +14 -0
  368. data/lib/chemicalml/cml/schema24/float_array.rb +14 -0
  369. data/lib/chemicalml/cml/schema24/formula.rb +15 -0
  370. data/lib/chemicalml/cml/schema24/fragment.rb +13 -0
  371. data/lib/chemicalml/cml/schema24/fragment_list.rb +13 -0
  372. data/lib/chemicalml/cml/schema24/gradient.rb +13 -0
  373. data/lib/chemicalml/cml/schema24/identifier.rb +15 -0
  374. data/lib/chemicalml/cml/schema24/integer.rb +14 -0
  375. data/lib/chemicalml/cml/schema24/integer_array.rb +14 -0
  376. data/lib/chemicalml/cml/schema24/isotope.rb +13 -0
  377. data/lib/chemicalml/cml/schema24/isotope_list.rb +13 -0
  378. data/lib/chemicalml/cml/schema24/join.rb +13 -0
  379. data/lib/chemicalml/cml/schema24/kpoint.rb +13 -0
  380. data/lib/chemicalml/cml/schema24/kpoint_list.rb +13 -0
  381. data/lib/chemicalml/cml/schema24/label.rb +15 -0
  382. data/lib/chemicalml/cml/schema24/lattice.rb +13 -0
  383. data/lib/chemicalml/cml/schema24/lattice_vector.rb +13 -0
  384. data/lib/chemicalml/cml/schema24/length.rb +13 -0
  385. data/lib/chemicalml/cml/schema24/line3.rb +13 -0
  386. data/lib/chemicalml/cml/schema24/link.rb +13 -0
  387. data/lib/chemicalml/cml/schema24/list.rb +15 -0
  388. data/lib/chemicalml/cml/schema24/map.rb +13 -0
  389. data/lib/chemicalml/cml/schema24/matrix.rb +15 -0
  390. data/lib/chemicalml/cml/schema24/mechanism.rb +13 -0
  391. data/lib/chemicalml/cml/schema24/mechanism_component.rb +13 -0
  392. data/lib/chemicalml/cml/schema24/metadata.rb +15 -0
  393. data/lib/chemicalml/cml/schema24/metadata_list.rb +15 -0
  394. data/lib/chemicalml/cml/schema24/molecule.rb +15 -0
  395. data/lib/chemicalml/cml/schema24/molecule_list.rb +13 -0
  396. data/lib/chemicalml/cml/schema24/name.rb +15 -0
  397. data/lib/chemicalml/cml/schema24/object.rb +13 -0
  398. data/lib/chemicalml/cml/schema24/observation.rb +13 -0
  399. data/lib/chemicalml/cml/schema24/operator.rb +14 -0
  400. data/lib/chemicalml/cml/schema24/parameter.rb +15 -0
  401. data/lib/chemicalml/cml/schema24/parameter_list.rb +15 -0
  402. data/lib/chemicalml/cml/schema24/particle.rb +13 -0
  403. data/lib/chemicalml/cml/schema24/peak.rb +13 -0
  404. data/lib/chemicalml/cml/schema24/peak_group.rb +13 -0
  405. data/lib/chemicalml/cml/schema24/peak_list.rb +13 -0
  406. data/lib/chemicalml/cml/schema24/peak_structure.rb +13 -0
  407. data/lib/chemicalml/cml/schema24/plane3.rb +13 -0
  408. data/lib/chemicalml/cml/schema24/point3.rb +13 -0
  409. data/lib/chemicalml/cml/schema24/potential.rb +13 -0
  410. data/lib/chemicalml/cml/schema24/potential_form.rb +13 -0
  411. data/lib/chemicalml/cml/schema24/potential_list.rb +13 -0
  412. data/lib/chemicalml/cml/schema24/product.rb +15 -0
  413. data/lib/chemicalml/cml/schema24/product_list.rb +15 -0
  414. data/lib/chemicalml/cml/schema24/property.rb +15 -0
  415. data/lib/chemicalml/cml/schema24/property_list.rb +15 -0
  416. data/lib/chemicalml/cml/schema24/reactant.rb +15 -0
  417. data/lib/chemicalml/cml/schema24/reactant_list.rb +15 -0
  418. data/lib/chemicalml/cml/schema24/reaction.rb +15 -0
  419. data/lib/chemicalml/cml/schema24/reaction_list.rb +15 -0
  420. data/lib/chemicalml/cml/schema24/reaction_scheme.rb +13 -0
  421. data/lib/chemicalml/cml/schema24/reaction_step.rb +13 -0
  422. data/lib/chemicalml/cml/schema24/reaction_step_list.rb +13 -0
  423. data/lib/chemicalml/cml/schema24/reactive_centre.rb +13 -0
  424. data/lib/chemicalml/cml/schema24/region.rb +13 -0
  425. data/lib/chemicalml/cml/schema24/related_entry.rb +14 -0
  426. data/lib/chemicalml/cml/schema24/sample.rb +13 -0
  427. data/lib/chemicalml/cml/schema24/scalar.rb +15 -0
  428. data/lib/chemicalml/cml/schema24/spectator.rb +13 -0
  429. data/lib/chemicalml/cml/schema24/spectator_list.rb +13 -0
  430. data/lib/chemicalml/cml/schema24/spectrum.rb +13 -0
  431. data/lib/chemicalml/cml/schema24/spectrum_data.rb +13 -0
  432. data/lib/chemicalml/cml/schema24/spectrum_list.rb +13 -0
  433. data/lib/chemicalml/cml/schema24/sphere3.rb +13 -0
  434. data/lib/chemicalml/cml/schema24/stmml.rb +13 -0
  435. data/lib/chemicalml/cml/schema24/string.rb +14 -0
  436. data/lib/chemicalml/cml/schema24/string_array.rb +14 -0
  437. data/lib/chemicalml/cml/schema24/substance.rb +15 -0
  438. data/lib/chemicalml/cml/schema24/substance_list.rb +13 -0
  439. data/lib/chemicalml/cml/schema24/symmetry.rb +13 -0
  440. data/lib/chemicalml/cml/schema24/system.rb +13 -0
  441. data/lib/chemicalml/cml/schema24/table.rb +13 -0
  442. data/lib/chemicalml/cml/schema24/table_cell.rb +13 -0
  443. data/lib/chemicalml/cml/schema24/table_content.rb +13 -0
  444. data/lib/chemicalml/cml/schema24/table_header.rb +13 -0
  445. data/lib/chemicalml/cml/schema24/table_header_cell.rb +13 -0
  446. data/lib/chemicalml/cml/schema24/table_row.rb +13 -0
  447. data/lib/chemicalml/cml/schema24/table_row_list.rb +13 -0
  448. data/lib/chemicalml/cml/schema24/tcell.rb +14 -0
  449. data/lib/chemicalml/cml/schema24/torsion.rb +13 -0
  450. data/lib/chemicalml/cml/schema24/transform3.rb +13 -0
  451. data/lib/chemicalml/cml/schema24/transition_state.rb +13 -0
  452. data/lib/chemicalml/cml/schema24/trow.rb +14 -0
  453. data/lib/chemicalml/cml/schema24/unit.rb +15 -0
  454. data/lib/chemicalml/cml/schema24/unit_list.rb +15 -0
  455. data/lib/chemicalml/cml/schema24/unit_type.rb +15 -0
  456. data/lib/chemicalml/cml/schema24/unit_type_list.rb +15 -0
  457. data/lib/chemicalml/cml/schema24/vector3.rb +13 -0
  458. data/lib/chemicalml/cml/schema24/xaxis.rb +13 -0
  459. data/lib/chemicalml/cml/schema24/yaxis.rb +13 -0
  460. data/lib/chemicalml/cml/schema24/z_matrix.rb +13 -0
  461. data/lib/chemicalml/cml/schema24.rb +159 -19
  462. data/lib/chemicalml/cml/schema3/abundance.rb +13 -0
  463. data/lib/chemicalml/cml/schema3/action.rb +13 -0
  464. data/lib/chemicalml/cml/schema3/action_list.rb +13 -0
  465. data/lib/chemicalml/cml/schema3/amount.rb +13 -0
  466. data/lib/chemicalml/cml/schema3/angle.rb +13 -0
  467. data/lib/chemicalml/cml/schema3/any_cml.rb +13 -0
  468. data/lib/chemicalml/cml/schema3/array.rb +15 -0
  469. data/lib/chemicalml/cml/schema3/array_list.rb +13 -0
  470. data/lib/chemicalml/cml/schema3/atom.rb +15 -0
  471. data/lib/chemicalml/cml/schema3/atom_array.rb +15 -0
  472. data/lib/chemicalml/cml/schema3/atom_parity.rb +15 -0
  473. data/lib/chemicalml/cml/schema3/atom_set.rb +13 -0
  474. data/lib/chemicalml/cml/schema3/atom_type.rb +13 -0
  475. data/lib/chemicalml/cml/schema3/atom_type_list.rb +13 -0
  476. data/lib/chemicalml/cml/schema3/atomic_basis_function.rb +13 -0
  477. data/lib/chemicalml/cml/schema3/band.rb +13 -0
  478. data/lib/chemicalml/cml/schema3/band_list.rb +13 -0
  479. data/lib/chemicalml/cml/schema3/basis_set.rb +13 -0
  480. data/lib/chemicalml/cml/schema3/bond.rb +15 -0
  481. data/lib/chemicalml/cml/schema3/bond_array.rb +15 -0
  482. data/lib/chemicalml/cml/schema3/bond_set.rb +13 -0
  483. data/lib/chemicalml/cml/schema3/bond_stereo.rb +15 -0
  484. data/lib/chemicalml/cml/schema3/bond_type.rb +13 -0
  485. data/lib/chemicalml/cml/schema3/bond_type_list.rb +13 -0
  486. data/lib/chemicalml/cml/schema3/cell_parameter.rb +13 -0
  487. data/lib/chemicalml/cml/schema3/cml_module.rb +15 -0
  488. data/lib/chemicalml/cml/schema3/condition_list.rb +13 -0
  489. data/lib/chemicalml/cml/schema3/context.rb +18 -0
  490. data/lib/chemicalml/cml/schema3/crystal.rb +13 -0
  491. data/lib/chemicalml/cml/schema3/definition.rb +13 -0
  492. data/lib/chemicalml/cml/schema3/description.rb +13 -0
  493. data/lib/chemicalml/cml/schema3/dictionary.rb +15 -0
  494. data/lib/chemicalml/cml/schema3/dictionary_entry.rb +15 -0
  495. data/lib/chemicalml/cml/schema3/dimension.rb +13 -0
  496. data/lib/chemicalml/cml/schema3/document.rb +15 -0
  497. data/lib/chemicalml/cml/schema3/documentation.rb +13 -0
  498. data/lib/chemicalml/cml/schema3/eigen.rb +13 -0
  499. data/lib/chemicalml/cml/schema3/electron.rb +13 -0
  500. data/lib/chemicalml/cml/schema3/formula.rb +15 -0
  501. data/lib/chemicalml/cml/schema3/fragment.rb +13 -0
  502. data/lib/chemicalml/cml/schema3/fragment_list.rb +13 -0
  503. data/lib/chemicalml/cml/schema3/gradient.rb +13 -0
  504. data/lib/chemicalml/cml/schema3/identifier.rb +15 -0
  505. data/lib/chemicalml/cml/schema3/isotope.rb +13 -0
  506. data/lib/chemicalml/cml/schema3/isotope_list.rb +13 -0
  507. data/lib/chemicalml/cml/schema3/join.rb +13 -0
  508. data/lib/chemicalml/cml/schema3/kpoint.rb +13 -0
  509. data/lib/chemicalml/cml/schema3/kpoint_list.rb +13 -0
  510. data/lib/chemicalml/cml/schema3/label.rb +15 -0
  511. data/lib/chemicalml/cml/schema3/lattice.rb +13 -0
  512. data/lib/chemicalml/cml/schema3/lattice_vector.rb +13 -0
  513. data/lib/chemicalml/cml/schema3/length.rb +13 -0
  514. data/lib/chemicalml/cml/schema3/line3.rb +13 -0
  515. data/lib/chemicalml/cml/schema3/link.rb +13 -0
  516. data/lib/chemicalml/cml/schema3/list.rb +15 -0
  517. data/lib/chemicalml/cml/schema3/map.rb +13 -0
  518. data/lib/chemicalml/cml/schema3/matrix.rb +15 -0
  519. data/lib/chemicalml/cml/schema3/mechanism.rb +13 -0
  520. data/lib/chemicalml/cml/schema3/mechanism_component.rb +13 -0
  521. data/lib/chemicalml/cml/schema3/metadata.rb +15 -0
  522. data/lib/chemicalml/cml/schema3/metadata_list.rb +15 -0
  523. data/lib/chemicalml/cml/schema3/molecule.rb +15 -0
  524. data/lib/chemicalml/cml/schema3/molecule_list.rb +13 -0
  525. data/lib/chemicalml/cml/schema3/name.rb +15 -0
  526. data/lib/chemicalml/cml/schema3/object.rb +13 -0
  527. data/lib/chemicalml/cml/schema3/observation.rb +13 -0
  528. data/lib/chemicalml/cml/schema3/parameter.rb +15 -0
  529. data/lib/chemicalml/cml/schema3/parameter_list.rb +15 -0
  530. data/lib/chemicalml/cml/schema3/particle.rb +13 -0
  531. data/lib/chemicalml/cml/schema3/peak.rb +13 -0
  532. data/lib/chemicalml/cml/schema3/peak_group.rb +13 -0
  533. data/lib/chemicalml/cml/schema3/peak_list.rb +13 -0
  534. data/lib/chemicalml/cml/schema3/peak_structure.rb +13 -0
  535. data/lib/chemicalml/cml/schema3/plane3.rb +13 -0
  536. data/lib/chemicalml/cml/schema3/point3.rb +13 -0
  537. data/lib/chemicalml/cml/schema3/potential.rb +13 -0
  538. data/lib/chemicalml/cml/schema3/potential_form.rb +13 -0
  539. data/lib/chemicalml/cml/schema3/potential_list.rb +13 -0
  540. data/lib/chemicalml/cml/schema3/product.rb +15 -0
  541. data/lib/chemicalml/cml/schema3/product_list.rb +15 -0
  542. data/lib/chemicalml/cml/schema3/property.rb +15 -0
  543. data/lib/chemicalml/cml/schema3/property_list.rb +15 -0
  544. data/lib/chemicalml/cml/schema3/reactant.rb +15 -0
  545. data/lib/chemicalml/cml/schema3/reactant_list.rb +15 -0
  546. data/lib/chemicalml/cml/schema3/reaction.rb +15 -0
  547. data/lib/chemicalml/cml/schema3/reaction_list.rb +15 -0
  548. data/lib/chemicalml/cml/schema3/reaction_scheme.rb +13 -0
  549. data/lib/chemicalml/cml/schema3/reaction_step.rb +13 -0
  550. data/lib/chemicalml/cml/schema3/reaction_step_list.rb +13 -0
  551. data/lib/chemicalml/cml/schema3/reactive_centre.rb +13 -0
  552. data/lib/chemicalml/cml/schema3/region.rb +13 -0
  553. data/lib/chemicalml/cml/schema3/sample.rb +13 -0
  554. data/lib/chemicalml/cml/schema3/scalar.rb +15 -0
  555. data/lib/chemicalml/cml/schema3/spectator.rb +13 -0
  556. data/lib/chemicalml/cml/schema3/spectator_list.rb +13 -0
  557. data/lib/chemicalml/cml/schema3/spectrum.rb +13 -0
  558. data/lib/chemicalml/cml/schema3/spectrum_data.rb +13 -0
  559. data/lib/chemicalml/cml/schema3/spectrum_list.rb +13 -0
  560. data/lib/chemicalml/cml/schema3/sphere3.rb +13 -0
  561. data/lib/chemicalml/cml/schema3/stmml.rb +13 -0
  562. data/lib/chemicalml/cml/schema3/substance.rb +15 -0
  563. data/lib/chemicalml/cml/schema3/substance_list.rb +13 -0
  564. data/lib/chemicalml/cml/schema3/symmetry.rb +13 -0
  565. data/lib/chemicalml/cml/schema3/system.rb +13 -0
  566. data/lib/chemicalml/cml/schema3/table.rb +13 -0
  567. data/lib/chemicalml/cml/schema3/table_cell.rb +13 -0
  568. data/lib/chemicalml/cml/schema3/table_content.rb +13 -0
  569. data/lib/chemicalml/cml/schema3/table_header.rb +13 -0
  570. data/lib/chemicalml/cml/schema3/table_header_cell.rb +13 -0
  571. data/lib/chemicalml/cml/schema3/table_row.rb +13 -0
  572. data/lib/chemicalml/cml/schema3/table_row_list.rb +13 -0
  573. data/lib/chemicalml/cml/schema3/torsion.rb +13 -0
  574. data/lib/chemicalml/cml/schema3/transform3.rb +13 -0
  575. data/lib/chemicalml/cml/schema3/transition_state.rb +13 -0
  576. data/lib/chemicalml/cml/schema3/unit.rb +15 -0
  577. data/lib/chemicalml/cml/schema3/unit_list.rb +15 -0
  578. data/lib/chemicalml/cml/schema3/unit_type.rb +15 -0
  579. data/lib/chemicalml/cml/schema3/unit_type_list.rb +15 -0
  580. data/lib/chemicalml/cml/schema3/vector3.rb +13 -0
  581. data/lib/chemicalml/cml/schema3/xaxis.rb +13 -0
  582. data/lib/chemicalml/cml/schema3/yaxis.rb +13 -0
  583. data/lib/chemicalml/cml/schema3/z_matrix.rb +13 -0
  584. data/lib/chemicalml/cml/schema3.rb +132 -17
  585. data/lib/chemicalml/cml/wire_class_registry.rb +42 -0
  586. data/lib/chemicalml/cml.rb +136 -44
  587. data/lib/chemicalml/context_configuration.rb +8 -2
  588. data/lib/chemicalml/convention/base.rb +17 -3
  589. data/lib/chemicalml/convention/compchem/constraints/array_rules.rb +44 -0
  590. data/lib/chemicalml/convention/compchem/constraints/calculation_requires_finalization.rb +28 -0
  591. data/lib/chemicalml/convention/compchem/constraints/compchem_module_must_contain_job_list.rb +4 -4
  592. data/lib/chemicalml/convention/compchem/constraints/environment_at_most_one_property_list.rb +26 -0
  593. data/lib/chemicalml/convention/compchem/constraints/environment_must_not_contain_parameter.rb +28 -0
  594. data/lib/chemicalml/convention/compchem/constraints/finalization_at_most_one_molecule.rb +26 -0
  595. data/lib/chemicalml/convention/compchem/constraints/finalization_at_most_one_property_list.rb +26 -0
  596. data/lib/chemicalml/convention/compchem/constraints/finalization_must_not_contain_parameter.rb +27 -0
  597. data/lib/chemicalml/convention/compchem/constraints/initialization_at_most_one_molecule.rb +26 -0
  598. data/lib/chemicalml/convention/compchem/constraints/initialization_at_most_one_parameter_list.rb +26 -0
  599. data/lib/chemicalml/convention/compchem/constraints/initialization_must_not_contain_property.rb +28 -0
  600. data/lib/chemicalml/convention/compchem/constraints/job_list_module_must_have_id.rb +24 -0
  601. data/lib/chemicalml/convention/compchem/constraints/job_module_at_most_one_environment.rb +25 -0
  602. data/lib/chemicalml/convention/compchem/constraints/job_module_at_most_one_finalization.rb +25 -0
  603. data/lib/chemicalml/convention/compchem/constraints/job_module_must_have_id.rb +24 -0
  604. data/lib/chemicalml/convention/compchem/constraints/job_must_contain_initialization.rb +6 -9
  605. data/lib/chemicalml/convention/compchem/constraints/matrix_rules.rb +48 -0
  606. data/lib/chemicalml/convention/compchem/constraints/module_predicates.rb +50 -0
  607. data/lib/chemicalml/convention/compchem/constraints/scalar_units.rb +42 -0
  608. data/lib/chemicalml/convention/compchem/constraints.rb +36 -2
  609. data/lib/chemicalml/convention/compchem.rb +16 -0
  610. data/lib/chemicalml/convention/constraint.rb +31 -18
  611. data/lib/chemicalml/convention/coordinator.rb +89 -0
  612. data/lib/chemicalml/convention/detection.rb +33 -0
  613. data/lib/chemicalml/convention/dictionary/constraints/dictionary_must_have_namespace.rb +28 -0
  614. data/lib/chemicalml/convention/dictionary/constraints/dictionary_namespace_should_end_with_slash_or_hash.rb +32 -0
  615. data/lib/chemicalml/convention/dictionary/constraints/entry_id_must_match_pattern.rb +33 -0
  616. data/lib/chemicalml/convention/dictionary/constraints/entry_ids_unique_within_dictionary.rb +3 -3
  617. data/lib/chemicalml/convention/dictionary/constraints/entry_must_contain_definition.rb +28 -0
  618. data/lib/chemicalml/convention/dictionary/constraints/entry_must_have_id_and_term.rb +5 -5
  619. data/lib/chemicalml/convention/dictionary/constraints/entry_must_have_unit_type.rb +30 -0
  620. data/lib/chemicalml/convention/dictionary/constraints/entry_units_co_constraints.rb +44 -0
  621. data/lib/chemicalml/convention/dictionary/constraints.rb +12 -0
  622. data/lib/chemicalml/convention/dictionary.rb +6 -0
  623. data/lib/chemicalml/convention/molecular/constraints/atom_array_must_be_child_of_molecule_or_formula.rb +40 -0
  624. data/lib/chemicalml/convention/molecular/constraints/atom_array_must_contain_atoms.rb +3 -3
  625. data/lib/chemicalml/convention/molecular/constraints/atom_coordinates_must_be_paired.rb +32 -0
  626. data/lib/chemicalml/convention/molecular/constraints/atom_id_must_match_pattern.rb +26 -0
  627. data/lib/chemicalml/convention/molecular/constraints/atom_ids_unique_within_molecule.rb +2 -2
  628. data/lib/chemicalml/convention/molecular/constraints/atom_must_have_element_type.rb +20 -0
  629. data/lib/chemicalml/convention/molecular/constraints/atom_must_have_id.rb +20 -0
  630. data/lib/chemicalml/convention/molecular/constraints/bond_array_must_be_child_of_molecule.rb +36 -0
  631. data/lib/chemicalml/convention/molecular/constraints/bond_ids_unique_within_molecule.rb +43 -0
  632. data/lib/chemicalml/convention/molecular/constraints/bond_must_have_atom_refs2.rb +20 -0
  633. data/lib/chemicalml/convention/molecular/constraints/bond_must_have_order.rb +20 -0
  634. data/lib/chemicalml/convention/molecular/constraints/bond_must_reference_atoms_in_same_molecule.rb +3 -3
  635. data/lib/chemicalml/convention/molecular/constraints/bond_order_other_must_have_dict_ref.rb +33 -0
  636. data/lib/chemicalml/convention/molecular/constraints/bond_order_should_not_be_numeric.rb +27 -0
  637. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_cis_trans_must_have_atom_refs4.rb +45 -0
  638. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_other_must_have_dict_ref.rb +32 -0
  639. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_wedge_hash_must_have_atom_refs2.rb +45 -0
  640. data/lib/chemicalml/convention/molecular/constraints/molecule_atom_array_mutually_exclusive_with_children.rb +32 -0
  641. data/lib/chemicalml/convention/molecular/constraints/molecule_bond_array_mutually_exclusive_with_children.rb +31 -0
  642. data/lib/chemicalml/convention/molecular/constraints/molecule_count_must_not_appear_on_top_level.rb +34 -0
  643. data/lib/chemicalml/convention/molecular/constraints/molecule_must_have_id.rb +20 -0
  644. data/lib/chemicalml/convention/molecular/constraints/property_must_have_dict_ref.rb +20 -0
  645. data/lib/chemicalml/convention/molecular/constraints/scalar_must_have_data_type.rb +20 -0
  646. data/lib/chemicalml/convention/molecular/constraints.rb +40 -3
  647. data/lib/chemicalml/convention/molecular.rb +20 -0
  648. data/lib/chemicalml/convention/registry.rb +17 -0
  649. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_list_must_contain_at_least_one_unit.rb +28 -0
  650. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_list_must_have_namespace.rb +36 -0
  651. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_contain_definition.rb +27 -0
  652. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_id.rb +27 -0
  653. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_symbol_and_unit_type.rb +3 -3
  654. data/lib/chemicalml/convention/unit_dictionary/constraints.rb +9 -1
  655. data/lib/chemicalml/convention/unit_dictionary.rb +4 -0
  656. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_id_must_match_pattern.rb +31 -0
  657. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_list_must_contain_at_least_one_unit_type.rb +27 -0
  658. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_list_must_have_namespace.rb +35 -0
  659. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_must_contain_definition.rb +27 -0
  660. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_must_have_id_and_name.rb +5 -5
  661. data/lib/chemicalml/convention/unit_type_dictionary/constraints.rb +9 -1
  662. data/lib/chemicalml/convention/unit_type_dictionary.rb +4 -0
  663. data/lib/chemicalml/convention/validation_report.rb +63 -0
  664. data/lib/chemicalml/convention.rb +11 -0
  665. data/lib/chemicalml/dictionary/entry.rb +6 -6
  666. data/lib/chemicalml/dictionary/enum.rb +1 -1
  667. data/lib/chemicalml/dictionary/link.rb +3 -3
  668. data/lib/chemicalml/dictionary/loader.rb +19 -19
  669. data/lib/chemicalml/dictionary/model.rb +5 -5
  670. data/lib/chemicalml/dictionary/registry.rb +9 -9
  671. data/lib/chemicalml/version.rb +1 -1
  672. data/lib/chemicalml/versioned_parser.rb +71 -12
  673. data/lib/chemicalml.rb +4 -3
  674. metadata +594 -69
  675. data/lib/chemicalml/cml/array.rb +0 -10
  676. data/lib/chemicalml/cml/atom.rb +0 -10
  677. data/lib/chemicalml/cml/atom_array.rb +0 -10
  678. data/lib/chemicalml/cml/atom_parity.rb +0 -10
  679. data/lib/chemicalml/cml/bond.rb +0 -10
  680. data/lib/chemicalml/cml/bond_array.rb +0 -10
  681. data/lib/chemicalml/cml/bond_stereo.rb +0 -10
  682. data/lib/chemicalml/cml/cml_module.rb +0 -10
  683. data/lib/chemicalml/cml/dictionary.rb +0 -10
  684. data/lib/chemicalml/cml/dictionary_entry.rb +0 -10
  685. data/lib/chemicalml/cml/document.rb +0 -10
  686. data/lib/chemicalml/cml/formula.rb +0 -10
  687. data/lib/chemicalml/cml/identifier.rb +0 -10
  688. data/lib/chemicalml/cml/label.rb +0 -10
  689. data/lib/chemicalml/cml/list.rb +0 -10
  690. data/lib/chemicalml/cml/matrix.rb +0 -10
  691. data/lib/chemicalml/cml/metadata.rb +0 -10
  692. data/lib/chemicalml/cml/metadata_list.rb +0 -10
  693. data/lib/chemicalml/cml/molecule.rb +0 -10
  694. data/lib/chemicalml/cml/name.rb +0 -10
  695. data/lib/chemicalml/cml/parameter.rb +0 -10
  696. data/lib/chemicalml/cml/parameter_list.rb +0 -10
  697. data/lib/chemicalml/cml/product.rb +0 -10
  698. data/lib/chemicalml/cml/product_list.rb +0 -10
  699. data/lib/chemicalml/cml/property.rb +0 -10
  700. data/lib/chemicalml/cml/property_list.rb +0 -10
  701. data/lib/chemicalml/cml/reactant.rb +0 -10
  702. data/lib/chemicalml/cml/reactant_list.rb +0 -10
  703. data/lib/chemicalml/cml/reaction.rb +0 -10
  704. data/lib/chemicalml/cml/reaction_list.rb +0 -10
  705. data/lib/chemicalml/cml/scalar.rb +0 -10
  706. data/lib/chemicalml/cml/substance.rb +0 -10
  707. data/lib/chemicalml/cml/translator/value_translations.rb +0 -265
  708. data/lib/chemicalml/cml/translator.rb +0 -233
  709. data/lib/chemicalml/cml/unit.rb +0 -10
  710. data/lib/chemicalml/cml/unit_list.rb +0 -10
  711. data/lib/chemicalml/cml/unit_type.rb +0 -10
  712. data/lib/chemicalml/cml/unit_type_list.rb +0 -10
  713. data/lib/chemicalml/cml/wire_class_macro.rb +0 -45
  714. data/lib/chemicalml/model/atom.rb +0 -40
  715. data/lib/chemicalml/model/bond.rb +0 -33
  716. data/lib/chemicalml/model/cml_array.rb +0 -27
  717. data/lib/chemicalml/model/cml_module.rb +0 -45
  718. data/lib/chemicalml/model/document.rb +0 -29
  719. data/lib/chemicalml/model/formula.rb +0 -34
  720. data/lib/chemicalml/model/identifier.rb +0 -21
  721. data/lib/chemicalml/model/label.rb +0 -21
  722. data/lib/chemicalml/model/matrix.rb +0 -29
  723. data/lib/chemicalml/model/metadata.rb +0 -23
  724. data/lib/chemicalml/model/metadata_list.rb +0 -25
  725. data/lib/chemicalml/model/molecule.rb +0 -38
  726. data/lib/chemicalml/model/name.rb +0 -21
  727. data/lib/chemicalml/model/node.rb +0 -45
  728. data/lib/chemicalml/model/parameter.rb +0 -27
  729. data/lib/chemicalml/model/parameter_list.rb +0 -25
  730. data/lib/chemicalml/model/product.rb +0 -21
  731. data/lib/chemicalml/model/product_list.rb +0 -21
  732. data/lib/chemicalml/model/property.rb +0 -28
  733. data/lib/chemicalml/model/property_list.rb +0 -25
  734. data/lib/chemicalml/model/reactant.rb +0 -21
  735. data/lib/chemicalml/model/reactant_list.rb +0 -21
  736. data/lib/chemicalml/model/reaction.rb +0 -41
  737. data/lib/chemicalml/model/reaction_list.rb +0 -23
  738. data/lib/chemicalml/model/scalar.rb +0 -25
  739. data/lib/chemicalml/model/substance.rb +0 -25
  740. data/lib/chemicalml/model.rb +0 -38
@@ -0,0 +1,33 @@
1
+ # 21 — Encapsulate translator internals
2
+
3
+ **Status:** complete
4
+ **Depends on:** 19, 20
5
+
6
+ ## Goal
7
+
8
+ The Translator has 17 public class methods today. Only `to_canonical`
9
+ and `from_canonical` are part of the public API. Every helper
10
+ (`molecule_to_canonical`, `atom_from_canonical`, `cml_order_to_kind`,
11
+ etc.) is an implementation detail and should be private.
12
+
13
+ ## Why
14
+
15
+ - Public API surface = mental load for users. They see 17 methods and
16
+ wonder which to use.
17
+ - Internal helpers shouldn't be callable from outside — encapsulation
18
+ violation.
19
+ - Risk: a future refactor (e.g. visitor pattern) would need to keep
20
+ these as public for backward compat.
21
+
22
+ ## Deliverables
23
+
24
+ - [ ] Add `private_class_method` for every helper method on
25
+ `Translator`.
26
+ - [ ] Same for `ValueTranslations::ClassMethods` helpers.
27
+ - [ ] Verify no spec or external code calls the helpers directly.
28
+
29
+ ## Acceptance
30
+
31
+ - `Chemicalml::Cml::Translator.public_methods(false)` returns only
32
+ `to_canonical` and `from_canonical`.
33
+ - All specs still pass.
@@ -0,0 +1,32 @@
1
+ # 22 — DRY role modules
2
+
3
+ **Status:** rejected
4
+ **Depends on:** —
5
+
6
+ ## Goal (rejected)
7
+
8
+ Replace 36 nearly-identical Role module files with a single
9
+ `Elements::ALL.each_key { const_set(class_name, Module.new) }`
10
+ block.
11
+
12
+ ## Why rejected
13
+
14
+ `const_set(class_name, Module.new)` is **eager** — every role module
15
+ is created when `cml/role.rb` loads. The user's global rule mandates
16
+ **autoload** (lazy file loading), not `const_set`. The two are not
17
+ equivalent:
18
+
19
+ - `autoload :Foo, "path"` — registers a hook; the file loads only
20
+ when `Foo` is first referenced. Enables lazy loading, avoids
21
+ circular dependencies, keeps the load path clean.
22
+ - `const_set(:Foo, Module.new)` — creates the constant eagerly at
23
+ file-load time. No lazy loading.
24
+
25
+ The 36 tiny role files are the price of admission for the lazy-load
26
+ guarantee. They stay.
27
+
28
+ ## Acceptance
29
+
30
+ - Keep the 36 individual role files under `lib/chemicalml/cml/role/`.
31
+ - Keep the autoload declarations in `lib/chemicalml/cml/role.rb`.
32
+ - Do not use `const_set` for role modules.
@@ -0,0 +1,25 @@
1
+ # 23 — Final spec + lint pass
2
+
3
+ **Status:** complete
4
+ **Depends on:** all
5
+
6
+ ## Goal
7
+
8
+ Run the full suite, audit forbidden patterns, document final state.
9
+
10
+ ## Deliverables
11
+
12
+ - [ ] `bundle exec rspec spec/chemicalml/` green.
13
+ - [ ] `Chemicalml::Cml::Translator.public_methods(false)` returns only
14
+ `to_canonical` and `from_canonical`.
15
+ - [ ] No hardcoded `Cml::Foo.new` in translator files.
16
+ - [ ] `from_canonical(schema: :schema24)` produces Schema24 children
17
+ at every level (spec verification).
18
+ - [ ] `lib/chemicalml/cml/role/` directory removed.
19
+ - [ ] Zero `require_relative`, `respond_to?`, `instance_variable_set`/`get`,
20
+ private `send` in lib/.
21
+ - [ ] TODO.align/README.round3.md marked complete.
22
+
23
+ ## Acceptance
24
+
25
+ All checks pass.
@@ -0,0 +1,84 @@
1
+ # 24 — Autoload wire classes (revert round-2 task 12)
2
+
3
+ **Status:** complete
4
+ **Depends on:** —
5
+
6
+ ## Goal
7
+
8
+ Replace the `const_set`-based wire class generation in `schema3.rb`
9
+ and `schema24.rb` with per-class files loaded via `autoload`.
10
+
11
+ ## Why
12
+
13
+ Round 2 task 12 consolidated 72 per-class files into two `const_set`
14
+ loops. The user later pushed back on the same `const_set` pattern in
15
+ role modules — `const_set` is eager, not autoload. The same logic
16
+ applies here: `autoload` is required for lazy loading.
17
+
18
+ ## Design
19
+
20
+ To avoid 72 nearly-identical boilerplate files, each schema gets a
21
+ `Context` module that provides `lutaml_default_register`:
22
+
23
+ ```ruby
24
+ # lib/chemicalml/cml/schema3/context.rb
25
+ module Chemicalml
26
+ module Cml
27
+ module Schema3
28
+ module Context
29
+ def lutaml_default_register
30
+ :chemicalml_schema3
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ ```
37
+
38
+ Each per-class file is then minimal:
39
+
40
+ ```ruby
41
+ # lib/chemicalml/cml/schema3/atom.rb
42
+ module Chemicalml
43
+ module Cml
44
+ module Schema3
45
+ class Atom < Lutaml::Model::Serializable
46
+ include Base::Atom
47
+ include Visitable
48
+ extend Context
49
+ end
50
+ end
51
+ end
52
+ end
53
+ ```
54
+
55
+ And `schema3.rb` declares autoloads:
56
+
57
+ ```ruby
58
+ module Schema3
59
+ autoload :Atom, "chemicalml/cml/schema3/atom"
60
+ autoload :Molecule, "chemicalml/cml/schema3/molecule"
61
+ # ...
62
+ end
63
+ ```
64
+
65
+ ## Deliverables
66
+
67
+ - [ ] `lib/chemicalml/cml/schema3/context.rb` — provides
68
+ `lutaml_default_register` returning `:chemicalml_schema3`.
69
+ - [ ] `lib/chemicalml/cml/schema24/context.rb` — same for
70
+ `:chemicalml_schema24`.
71
+ - [ ] 36 per-class files under `lib/chemicalml/cml/schema3/` (one
72
+ per element in `Elements::ALL`).
73
+ - [ ] 35 per-class files under `lib/chemicalml/cml/schema24/` (no
74
+ `Module` — schema 2.4 lacks it).
75
+ - [ ] `schema3.rb` / `schema24.rb` rewritten with autoloads only,
76
+ no `const_set`.
77
+ - [ ] All specs pass.
78
+
79
+ ## Acceptance
80
+
81
+ - `grep -rn 'const_set' lib/chemicalml/cml/schema3.rb
82
+ lib/chemicalml/cml/schema24.rb` returns nothing.
83
+ - `Schema3::Atom` loads lazily (only when referenced).
84
+ - All 155+ specs still pass.
@@ -0,0 +1,44 @@
1
+ # 25 — value_container schema-awareness
2
+
3
+ **Status:** complete
4
+ **Depends on:** —
5
+
6
+ ## Goal
7
+
8
+ `Chemicalml::Cml::Translator::ValueTranslations` provides
9
+ `scalar_from_canonical`, `array_from_canonical`,
10
+ `matrix_from_canonical`, `value_container_from_canonical`, etc. All
11
+ of them hardcode `Cml::Scalar` / `Cml::Array` / `Cml::Matrix` (which
12
+ are Schema3 aliases).
13
+
14
+ When `Translator.from_canonical(doc, schema: :schema24)` is called
15
+ and the document has properties with scalar values, the scalars end
16
+ up as `Schema3::Scalar` instances inside `Schema24::Property` objects
17
+ — same kind of bug we just fixed for Document → Molecule → Atom.
18
+
19
+ ## Why
20
+
21
+ Consistency. The Translator's main `from_canonical` is now
22
+ schema-aware via `WireClassRegistry`. The value-container path should
23
+ be too.
24
+
25
+ ## Deliverables
26
+
27
+ - [ ] `scalar_from_canonical(scalar, schema:)`,
28
+ `array_from_canonical(array, schema:)`,
29
+ `matrix_from_canonical(matrix, schema:)` — take schema, look
30
+ up wire class via `WireClassRegistry`.
31
+ - [ ] `value_container_from_canonical(value, schema:)` — passes
32
+ schema through.
33
+ - [ ] `property_from_canonical(prop, schema:)`,
34
+ `parameter_from_canonical(param, schema:)` — passes schema to
35
+ value_container_from_canonical.
36
+ - [ ] All callers updated.
37
+ - [ ] Spec verifying `Schema24::Property` has `Schema24::Scalar`
38
+ children.
39
+
40
+ ## Acceptance
41
+
42
+ - A round-trip canonical → Schema24 wire with a property+scalar
43
+ produces `Schema24::Property` with a `Schema24::Scalar` value.
44
+ - All specs pass.
@@ -0,0 +1,16 @@
1
+ # 26 — Remove dead wire_class_macro.rb
2
+
3
+ **Status:** complete
4
+ **Depends on:** —
5
+
6
+ ## Goal
7
+
8
+ `lib/chemicalml/cml/wire_class_macro.rb` is dead code — a leftover
9
+ from the round-2 macro experiment. Nothing references it. Remove.
10
+
11
+ ## Acceptance
12
+
13
+ - `lib/chemicalml/cml/wire_class_macro.rb` deleted.
14
+ - No references to `WireClassMacro` or `define_wire_classes` in lib/
15
+ or spec/.
16
+ - All specs pass.
@@ -0,0 +1,26 @@
1
+ # 27 — Final spec + lint pass
2
+
3
+ **Status:** complete
4
+ **Depends on:** all
5
+
6
+ ## Goal
7
+
8
+ Verify the round-4 changes don't regress anything and the autoload
9
+ rule is now satisfied everywhere it can be.
10
+
11
+ ## Deliverables
12
+
13
+ - [ ] `bundle exec rspec spec/chemicalml/` green.
14
+ - [ ] `grep -rn 'const_set' lib/chemicalml/cml/schema3.rb
15
+ lib/chemicalml/cml/schema24.rb` clean.
16
+ - [ ] `grep -rn 'require_relative' lib/` clean.
17
+ - [ ] `grep -rn '^require .chemicalml' lib/` clean.
18
+ - [ ] `grep -rn 'respond_to?' lib/` clean.
19
+ - [ ] `grep -rn 'instance_variable_set\|instance_variable_get' lib/`
20
+ clean.
21
+ - [ ] `grep -rnE '[^a-zA-Z_\.]send[ ]*\(' lib/` clean.
22
+ - [ ] TODO.align/README.round4.md shows every workstream complete.
23
+
24
+ ## Acceptance
25
+
26
+ All checks pass.
@@ -0,0 +1,40 @@
1
+ # 28 — Model::AtomParity + Model::BondStereo
2
+
3
+ **Status:** complete
4
+ **Depends on:** —
5
+
6
+ ## Goal
7
+
8
+ Add canonical Model classes for the CML stereo elements `<atomParity>`
9
+ and `<bondStereo>`. Wire classes exist; the canonical layer is
10
+ missing.
11
+
12
+ ## Why
13
+
14
+ CML's molecular convention uses `<atomParity>` (atom-centre chirality)
15
+ and `<bondStereo>` (cis/trans + wedge/hatch) to represent
16
+ stereochemistry. Without canonical classes, the gem can parse these
17
+ elements but can't represent them in the format-agnostic model —
18
+ forcing callers to drop stereo info when going through canonical.
19
+
20
+ ## Deliverables
21
+
22
+ - [ ] `lib/chemicalml/model/atom_parity.rb` — Model::AtomParity with
23
+ `atom_refs4` (four atom IDs as array) and `value` (typically
24
+ `"1"`, `"-1"`, `"0"`).
25
+ - [ ] `lib/chemicalml/model/bond_stereo.rb` — Model::BondStereo with
26
+ `atom_refs2` (optional array), `atom_refs4` (optional array),
27
+ `dict_ref` (optional), `value` (the convention letter: `"W"`,
28
+ `"H"`, `"C"`, `"T"`, `"other"`).
29
+ - [ ] Both classes inherit from `Model::Node` and implement
30
+ `value_attributes`.
31
+ - [ ] Autoloads declared in `lib/chemicalml/model.rb`.
32
+ - [ ] Specs.
33
+
34
+ ## Acceptance
35
+
36
+ - `Chemicalml::Model::AtomParity.new(atom_refs4: %w[a1 a2 a3 a4], value: "1")`
37
+ works.
38
+ - `Chemicalml::Model::BondStereo.new(atom_refs4: %w[a1 a2 a3 a4], value: "C")`
39
+ works.
40
+ - Specs pass.
@@ -0,0 +1,30 @@
1
+ # 29 — Wire Atom/Bond to carry stereo children
2
+
3
+ **Status:** complete
4
+ **Depends on:** 28
5
+
6
+ ## Goal
7
+
8
+ Today `Base::Atom` doesn't declare an `atom_parity` child attribute.
9
+ Same for `Base::Bond` and `bond_stereo`. So parsing a fixture with
10
+ `<atom><atomParity .../></atom>` silently drops the parity. Add the
11
+ child attributes to the Base mixins.
12
+
13
+ ## Why
14
+
15
+ Without this, the wire classes can't represent stereo even though
16
+ their dedicated wire classes (AtomParity, BondStereo) exist.
17
+
18
+ ## Deliverables
19
+
20
+ - [ ] `Base::Atom` declares `attribute :atom_parity, :atomParity`
21
+ and `xml do map_element "atomParity", to: :atom_parity end`.
22
+ - [ ] `Base::Bond` declares `attribute :bond_stereo, :bondStereo`
23
+ and `xml do map_element "bondStereo", to: :bond_stereo end`.
24
+ - [ ] Parse a fixture with `<atomParity>` and confirm it's loaded.
25
+ - [ ] Round-trip preserves the child.
26
+
27
+ ## Acceptance
28
+
29
+ - Parsing `ethene_with_bond_stereo.cml` retains the bondStereo.
30
+ - Parsing `chiral_center.cml` retains the atomParity.
@@ -0,0 +1,32 @@
1
+ # 30 — Translator rules for stereo
2
+
3
+ **Status:** complete
4
+ **Depends on:** 28, 29
5
+
6
+ ## Goal
7
+
8
+ Add Translator rules so stereo elements round-trip through the
9
+ canonical Model:
10
+
11
+ - `atom_parity_to_canonical` / `atom_parity_from_canonical`
12
+ - `bond_stereo_to_canonical` / `bond_stereo_from_canonical`
13
+
14
+ And wire them into `molecule_to_canonical` / `molecule_from_canonical`
15
+ so atoms and bonds carry their stereo children across the translation.
16
+
17
+ ## Deliverables
18
+
19
+ - [ ] Translator methods for both elements, schema-aware via
20
+ WireClassRegistry.
21
+ - [ ] `molecule_to_canonical` reads `cml_atom.atom_parity` and
22
+ translates it.
23
+ - [ ] `molecule_from_canonical` writes the parity back to the wire atom.
24
+ - [ ] Same for bonds and `bond_stereo`.
25
+ - [ ] Spec round-tripping a chiral molecule through canonical.
26
+
27
+ ## Acceptance
28
+
29
+ - Round-trip a chiral_center fixture through canonical preserves
30
+ the atomParity value.
31
+ - Round-trip ethene_with_bond_stereo through canonical preserves
32
+ the bondStereo.
@@ -0,0 +1,20 @@
1
+ # 31 — Final spec + lint pass
2
+
3
+ **Status:** complete
4
+ **Depends on:** all
5
+
6
+ ## Goal
7
+
8
+ Verify the stereo additions don't regress anything.
9
+
10
+ ## Deliverables
11
+
12
+ - [ ] `bundle exec rspec spec/chemicalml/` green.
13
+ - [ ] Round-trip of chiral_center.cml and ethene_with_bond_stereo.cml
14
+ preserves the stereo elements.
15
+ - [ ] Zero forbidden patterns in lib/.
16
+ - [ ] TODO.align/README.round5.md marked complete.
17
+
18
+ ## Acceptance
19
+
20
+ All checks pass.
@@ -0,0 +1,43 @@
1
+ # 32 — Polymorphic Translator
2
+
3
+ **Status:** complete
4
+ **Depends on:** —
5
+
6
+ ## Goal
7
+
8
+ `Translator.to_canonical` and `from_canonical` currently only handle
9
+ Document roots. A compchem `<module>` root can't go through the
10
+ canonical round-trip via the public API — callers must know to use
11
+ `module_to_canonical` / `module_from_canonical` directly.
12
+
13
+ Make both methods polymorphic: dispatch on the input's class via
14
+ Role module checks.
15
+
16
+ ## Why
17
+
18
+ Consistency with the rest of the gem. `WireClassRegistry` already
19
+ abstracts over schema versions; the Translator should abstract over
20
+ root element kinds too. Users shouldn't need to know upfront whether
21
+ their CML is `<cml>`-rooted or `<module>`-rooted.
22
+
23
+ ## Deliverables
24
+
25
+ - [ ] `Translator.to_canonical(node)`:
26
+ - if `node.is_a?(Chemicalml::Cml::Role::Document)` → existing
27
+ document translation
28
+ - if `node.is_a?(Chemicalml::Cml::Role::Module)` →
29
+ `module_to_canonical(node)`
30
+ - else raise `ArgumentError`
31
+ - [ ] `Translator.from_canonical(node, schema:)`:
32
+ - if `node.is_a?(Chemicalml::Model::Document)` → existing
33
+ document translation
34
+ - if `node.is_a?(Chemicalml::Model::Module)` →
35
+ `module_from_canonical(node, schema: schema)`
36
+ - else raise `ArgumentError`
37
+
38
+ ## Acceptance
39
+
40
+ - Compchem fixture's wire Module translates to canonical Module
41
+ through the public `to_canonical` API.
42
+ - Canonical Module translates back through `from_canonical`.
43
+ - Unknown input raises `ArgumentError`.
@@ -0,0 +1,43 @@
1
+ # 33 — Polymorphic Chemicalml.parse
2
+
3
+ **Status:** complete
4
+ **Depends on:** 32
5
+
6
+ ## Goal
7
+
8
+ `Chemicalml.parse(xml)` today only handles `<cml>`-rooted documents.
9
+ Compchem documents rooted at `<module>` silently parse as empty
10
+ Documents — the content is dropped without warning.
11
+
12
+ Detect the root element via a regex peek and dispatch to the right
13
+ parser.
14
+
15
+ ## Why
16
+
17
+ Silent data loss. Today's behavior:
18
+ ```
19
+ Chemicalml.parse(File.read("h2_dft.cml"))
20
+ # => #<Chemicalml::Cml::Schema3::Document molecules=[] reactions=[]>
21
+ ```
22
+
23
+ The caller has no indication that all the jobList / job / init / fin
24
+ content was dropped. Should be either parsed correctly or raise an
25
+ error.
26
+
27
+ ## Deliverables
28
+
29
+ - [ ] `Chemicalml.parse(xml, schema:)` peeks the root tag.
30
+ - [ ] `cml`, `molecule`, `reactionList`, `reaction` → Document parser.
31
+ - [ ] `module` → Module parser (Schema3 only — Schema 2.4 lacks it).
32
+ - [ ] Unknown root → `ArgumentError`.
33
+ - [ ] Return type matches the root: Document or Module.
34
+ - [ ] `Chemicalml.serialize(node)` remains polymorphic — already
35
+ just calls `node.to_xml`.
36
+
37
+ ## Acceptance
38
+
39
+ - `Chemicalml.parse(File.read("h2_dft.cml"))` returns a Schema3 Module
40
+ with the jobList intact.
41
+ - `Chemicalml.parse(File.read("water.cml"))` continues to return a
42
+ Schema3 Document.
43
+ - Unknown root raises `ArgumentError`.
@@ -0,0 +1,16 @@
1
+ # 34 — Polymorphic API specs
2
+
3
+ **Status:** complete
4
+ **Depends on:** 32, 33
5
+
6
+ ## Goal
7
+
8
+ Specs covering:
9
+ - Compchem fixture parses to a non-empty Schema3 Module.
10
+ - Polymorphic Translator dispatches Document and Module correctly.
11
+ - Unknown roots / inputs raise ArgumentError.
12
+ - Round-trip compchem → canonical → compchem preserves structure.
13
+
14
+ ## Acceptance
15
+
16
+ All specs green.
@@ -0,0 +1,10 @@
1
+ # 35 — Final spec + lint pass
2
+
3
+ **Status:** complete
4
+ **Depends on:** all
5
+
6
+ ## Acceptance
7
+
8
+ - `bundle exec rspec spec/chemicalml/` green.
9
+ - Zero forbidden patterns in lib/.
10
+ - TODO.align/README.round6.md marked complete.
@@ -0,0 +1,46 @@
1
+ # 36 — Molecular convention: full upstream constraint coverage
2
+
3
+ ## Why
4
+
5
+ `reference-docs/conventions/molecular.md` mandates more rules than the
6
+ gem currently enforces. The walker framework already exists; this is
7
+ purely additive constraint registration.
8
+
9
+ ## Current constraints (13)
10
+
11
+ AtomArrayMustContainAtoms, AtomIdsUniqueWithinMolecule,
12
+ BondMustReferenceAtomsInSameMolecule, AtomMustHaveId,
13
+ AtomMustHaveElementType, BondMustHaveAtomRefs2, BondMustHaveOrder,
14
+ MoleculeMustHaveId, AtomCoordinatesMustBePaired,
15
+ PropertyMustHaveDictRef, ScalarMustHaveDataType,
16
+ BondOrderShouldNotBeNumeric, AtomIdMustMatchPattern.
17
+
18
+ ## Missing rules per upstream spec
19
+
20
+ - `count` attribute MUST NOT appear on top-level molecules (only on
21
+ children of another molecule).
22
+ - `atomArray` — at most one per molecule; mutually exclusive with
23
+ child `<molecule>` elements.
24
+ - `bondArray` — at most one per molecule; mutually exclusive with
25
+ child `<molecule>` elements.
26
+ - `bondStereo` value `W` or `H` MUST have `atomRefs2`, MUST NOT have
27
+ `atomRefs4`.
28
+ - `bondStereo` value `C` or `T` MUST have `atomRefs4`, MUST NOT have
29
+ `atomRefs2`.
30
+ - `bondStereo` value `other` MUST have `dictRef`.
31
+ - `bond` `id` MUST be unique within the eldest containing molecule.
32
+ - `bond` with `order="other"` MUST have `dictRef`.
33
+ - `atomArray` MUST be a child of `molecule` or `formula`.
34
+ - `bondArray` MUST be a child of `molecule`.
35
+
36
+ ## Implementation
37
+
38
+ Each rule → one Constraint subclass + `register` call in
39
+ `lib/chemicalml/convention/molecular.rb`. New files autoloaded from
40
+ `lib/chemicalml/convention/molecular/constraints.rb`.
41
+
42
+ ## Acceptance
43
+
44
+ - 10 new constraint classes registered.
45
+ - Per-class spec under `spec/chemicalml/convention/molecular/`.
46
+ - Full suite still green.
@@ -0,0 +1,55 @@
1
+ # 37 — CompChem convention: full upstream constraint coverage
2
+
3
+ ## Why
4
+
5
+ `reference-docs/conventions/compchem.md` defines a deep module
6
+ structure (jobList → job → initialization/calculation/finalization/
7
+ environment) and value-container rules. The gem currently ships only
8
+ 2 of the ~19 rules.
9
+
10
+ ## Current constraints (2)
11
+
12
+ CompchemModuleMustContainJobList, JobMustContainInitialization.
13
+
14
+ ## Missing structural rules
15
+
16
+ - `jobList` module MUST have `id` unique within compchem module.
17
+ - `job` module MUST have `id` unique within compchem module.
18
+ - `job` module MUST contain at most one `finalization`.
19
+ - `job` module MUST contain at most one `environment`.
20
+ - If a `calculation` is present in a `job`, a `finalization` MUST
21
+ also be present (co-constraint).
22
+ - `initialization` module MUST NOT contain `property`/`propertyList`.
23
+ - `initialization` module MUST NOT contain more than one `molecule`.
24
+ - `initialization` module MUST NOT contain more than one
25
+ `parameterList`.
26
+ - `finalization` module MUST NOT contain `parameter`/`parameterList`.
27
+ - `finalization` module MUST NOT contain more than one `molecule`.
28
+ - `finalization` module MUST NOT contain more than one `propertyList`.
29
+ - `environment` module MUST NOT contain more than one `propertyList`.
30
+ - `environment` module MUST NOT contain `parameter`/`parameterList`
31
+ directly.
32
+
33
+ ## Missing value-container rules
34
+
35
+ - `scalar` with `dataType` `xsd:integer` or `xsd:double` MUST have
36
+ `units`.
37
+ - `scalar` with `dataType` `xsd:string` MUST NOT have `units`.
38
+ - `array` MUST have `size` ≥ 1; `dataType` MUST be integer or double;
39
+ MUST have `units`.
40
+ - `matrix` MUST have `rows` ≥ 1 and `columns` ≥ 1; `dataType` MUST
41
+ be integer or double; MUST have `units`.
42
+
43
+ ## Implementation
44
+
45
+ Use `DocumentConstraint` for cross-node rules (calculation→finalization
46
+ co-constraint), `NodeConstraint` for single-node rules.
47
+
48
+ CompChem modules are `<module dictRef="compchem:*">`. Match by
49
+ `node.is_a?(Chemicalml::Cml::Role::Module)` then check `dict_ref`.
50
+
51
+ ## Acceptance
52
+
53
+ - 17 new constraint classes registered.
54
+ - Per-class spec under `spec/chemicalml/convention/compchem/`.
55
+ - Full suite still green.
@@ -0,0 +1,34 @@
1
+ # 38 — Dictionary convention: full upstream constraint coverage
2
+
3
+ ## Why
4
+
5
+ `reference-docs/conventions/dictionary.md` requires namespace,
6
+ definition children, id patterns, and unitType/units co-constraints.
7
+ Currently 2 of 7 rules enforced.
8
+
9
+ ## Current constraints (2)
10
+
11
+ EntryMustHaveIdAndTerm, EntryIdsUniqueWithinDictionary.
12
+
13
+ ## Missing rules
14
+
15
+ - `dictionary` MUST have `namespace` attribute.
16
+ - `dictionary` `namespace` SHOULD end with `/` or `#` (warning).
17
+ - `entry` MUST contain a single `definition` child.
18
+ - `entry` `id` MUST match `[A-Za-z][A-Za-z0-9._-]*`.
19
+ - `entry` MUST have `unitType` attribute.
20
+ - If `unitType` is `unknown`, `units` MUST NOT be present.
21
+ - If `unitType` is `none`, `units` MUST be present and point to
22
+ `http://www.xml-cml.org/unit/si#none`.
23
+
24
+ ## Implementation
25
+
26
+ New files under
27
+ `lib/chemicalml/convention/dictionary/constraints/`, registered in
28
+ `lib/chemicalml/convention/dictionary.rb`.
29
+
30
+ ## Acceptance
31
+
32
+ - 7 new constraint classes registered.
33
+ - Per-class spec under `spec/chemicalml/convention/dictionary/`.
34
+ - Full suite still green.
@@ -0,0 +1,33 @@
1
+ # 39 — Unit-dictionary convention: full upstream constraint coverage
2
+
3
+ ## Why
4
+
5
+ `reference-docs/conventions/unit-dictionary.md` requires 8 attributes
6
+ on every `<unit>`. The gem currently ships 1 rule.
7
+
8
+ ## Current constraints (1)
9
+
10
+ UnitMustHaveSymbolAndUnitType.
11
+
12
+ ## Missing rules
13
+
14
+ - `unitList` MUST have `namespace` attribute.
15
+ - `unit` MUST have `id` (unique within unitList — already implied by
16
+ pattern rules but enforce presence).
17
+ - `unit` MUST have `title` attribute.
18
+ - `unit` MUST have `parentSI` attribute.
19
+ - `unit` MUST have at least one of `multiplierToSI` or `constantToSI`.
20
+ - `unit` MUST contain a single `definition` child.
21
+ - `unitList` MUST contain at least one `unit` child.
22
+
23
+ ## Implementation
24
+
25
+ NodeConstraint subclasses. Register in
26
+ `lib/chemicalml/convention/unit_dictionary.rb`.
27
+
28
+ ## Acceptance
29
+
30
+ - 7 new constraint classes registered (some may consolidate with
31
+ existing UnitMustHaveSymbolAndUnitType).
32
+ - Per-class spec under `spec/chemicalml/convention/unit_dictionary/`.
33
+ - Full suite still green.