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,28 @@
1
+ # 40 — UnitType-dictionary convention: full upstream constraint coverage
2
+
3
+ ## Why
4
+
5
+ `reference-docs/conventions/unitType-dictionary.md` requires
6
+ namespace, definition child, and id pattern. The gem ships 1 rule.
7
+
8
+ ## Current constraints (1)
9
+
10
+ UnitTypeMustHaveIdAndName.
11
+
12
+ ## Missing rules
13
+
14
+ - `unitTypeList` MUST have `namespace` attribute.
15
+ - `unitType` MUST contain a single `definition` child.
16
+ - `unitType` `id` MUST match `[A-Za-z][A-Za-z0-9._-]*`.
17
+ - `unitTypeList` MUST contain at least one `unitType` child.
18
+
19
+ ## Implementation
20
+
21
+ NodeConstraint subclasses. Register in
22
+ `lib/chemicalml/convention/unit_type_dictionary.rb`.
23
+
24
+ ## Acceptance
25
+
26
+ - 4 new constraint classes registered.
27
+ - Per-class spec under `spec/chemicalml/convention/unit_type_dictionary/`.
28
+ - Full suite still green.
@@ -0,0 +1,43 @@
1
+ # 41 — Expand canonical Model layer for chemistry completeness
2
+
3
+ ## Why
4
+
5
+ The canonical `Model::*` layer has 28 classes but the CML wire layer
6
+ has 121. Many chemistry concepts (crystallography, spectroscopy,
7
+ z-matrix, isotopes, samples, reaction schemes) have no canonical
8
+ representation, forcing callers to use wire classes directly —
9
+ breaking the "all adapters speak the canonical model" invariant.
10
+
11
+ ## New Model classes
12
+
13
+ - `Model::Lattice` — `lattice_type`, `a/b/c/alpha/beta/gamma`,
14
+ children: cell_parameters, lattice_vectors
15
+ - `Model::Crystal` — wraps lattice + scalar/array geometry
16
+ - `Model::ZMatrix` — internal coordinates (atomRefs + lengths/angles)
17
+ - `Model::Isotope` — number, spin, abundance, mass
18
+ - `Model::IsotopeList` — collection
19
+ - `Model::Sample` — sample metadata (state, amount, count)
20
+ - `Model::Spectrum` — `id`, `title`, `dict_ref`, xaxis/yaxis,
21
+ spectrum_data
22
+ - `Model::Peak` — `atomRefs`, `xValue`, `yValue`, `multiplicity`,
23
+ `peakShape`
24
+ - `Model::PeakList` — collection
25
+ - `Model::ReactionScheme` — `id`, `name`, reaction_step_list
26
+ - `Model::ReactionStep` — `atoms`, `reactiveCentre`, `type`
27
+ - `Model::Spectator` / `Model::SpectatorList`
28
+ - `Model::MoleculeList` — collection (distinct from `molecule[]`)
29
+ - `Model::Observation` — observation record
30
+
31
+ ## Implementation pattern
32
+
33
+ Each class subclasses `Model::Node` and provides:
34
+ - `attr_accessor` for every value
35
+ - `initialize` with keyword args + sensible defaults
36
+ - `children` returning child Model nodes
37
+ - `value_attributes` returning the equality/hash snapshot
38
+
39
+ ## Acceptance
40
+
41
+ - 14 new Model classes.
42
+ - Per-class spec under `spec/chemicalml/model/`.
43
+ - Full suite still green.
@@ -0,0 +1,31 @@
1
+ # 42 — Wire new Model classes through the translator
2
+
3
+ ## Why
4
+
5
+ New `Model::*` classes from TODO 41 are inert until the translator
6
+ maps them to/from CML wire format.
7
+
8
+ ## Translator additions
9
+
10
+ - `molecule_to_canonical`: include `crystal`, `spectra`,
11
+ `spectra_lists`, `z_matrix`, `isotope_list`, `sample` fields.
12
+ - `molecule_from_canonical`: reverse of above.
13
+ - New helpers: `crystal_to/from_canonical`,
14
+ `lattice_to/from_canonical`, `spectrum_to/from_canonical`,
15
+ `peak_to/from_canonical`, `z_matrix_to/from_canonical`,
16
+ `isotope_to/from_canonical`, `sample_to/from_canonical`,
17
+ `reaction_scheme_to/from_canonical`, `spectator_to/from_canonical`.
18
+ - `module_to_canonical`: stop hardcoding `lists: []` — collect
19
+ `<list>` children into Model::List collection.
20
+
21
+ ## Implementation
22
+
23
+ All schema-aware (take `schema:` keyword). Use `WireClassRegistry`
24
+ for every wire class lookup. Add to existing
25
+ `translator.rb` + `translator/value_translations.rb`.
26
+
27
+ ## Acceptance
28
+
29
+ - Round-trip spec: parse CML with crystal/spectrum/zMatrix →
30
+ Model → serialize → same CML (canon-compared).
31
+ - Full suite still green.
@@ -0,0 +1,39 @@
1
+ # 43 — Refactor Dictionary::Model away from hand-rolled `to_h`
2
+
3
+ ## Why
4
+
5
+ `lib/chemicalml/dictionary/model.rb`, `entry.rb`, `enum.rb`, `link.rb`
6
+ define `def to_h` — hand-rolled serialization. The project's coding
7
+ standard #2 forbids this. The Loader uses `to_h` to round-trip YAML,
8
+ but the canonical Model layer uses `value_attributes` for the same
9
+ purpose. Align Dictionary with the rest of the codebase.
10
+
11
+ ## Current state
12
+
13
+ ```ruby
14
+ class Model
15
+ def to_h
16
+ { namespace: ..., prefix: ..., title: ...,
17
+ description: ..., entries: entries.map(&:to_h) }
18
+ end
19
+ end
20
+ ```
21
+
22
+ Same pattern in Entry, Enum, Link.
23
+
24
+ ## Target
25
+
26
+ - Drop `def to_h`.
27
+ - `value_attributes` returns the same shape (used by Loader to dump
28
+ YAML, by `==`/`hash` for equality).
29
+ - Loader's `dump_to_hash` calls `model.value_attributes`.
30
+
31
+ If Loader needs a specific YAML shape (string keys vs symbol keys),
32
+ add a thin `as_yaml` adapter — but the model itself only exposes
33
+ `value_attributes`.
34
+
35
+ ## Acceptance
36
+
37
+ - No `def to_h` / `to_hash` anywhere in `lib/chemicalml/dictionary/`.
38
+ - Loader round-trip still works (specs pass).
39
+ - Full suite still green.
@@ -0,0 +1,44 @@
1
+ # 44 — Fix SCHEMA3_ONLY and add Schema24 Module class
2
+
3
+ ## Why
4
+
5
+ Actual XSD diff (via `grep '<xsd:element name='`):
6
+
7
+ - Schema3 has **121** elements. Our `Elements::ALL` matches.
8
+ - Schema24 has **137** elements (a superset of Schema3 for most parts).
9
+ - **`anyCml` is in Schema3 but NOT Schema24** → must be in
10
+ `SCHEMA3_ONLY`.
11
+ - `module` is in BOTH schemas → currently listed in SCHEMA3_ONLY
12
+ is **wrong**.
13
+
14
+ Current `SCHEMA3_ONLY = %i[Module]` is incorrect and Schema24 is
15
+ missing its `cml_module.rb` wire class entirely.
16
+
17
+ ## Fix
18
+
19
+ 1. `lib/chemicalml/cml/elements.rb`:
20
+ `SCHEMA3_ONLY = %i[AnyCml].freeze`
21
+ 2. Create `lib/chemicalml/cml/schema24/cml_module.rb` mirroring
22
+ `schema3/cml_module.rb`.
23
+ 3. Update Schema24 autoload list to include `cml_module`.
24
+ 4. Update translator comment ("Schema 3 only — Schema 2.4 lacks
25
+ `<module>`") — no longer accurate.
26
+ 5. Verify Schema24 Configuration registers Module.
27
+
28
+ ## Schema24-only elements (not modeled yet)
29
+
30
+ Schema24 has 16 elements not in Schema3: alternative, annotation,
31
+ appinfo, arg, complexObject, enumeration, expression, float,
32
+ floatArray, integer, integerArray, operator, relatedEntry, string,
33
+ stringArray, tcell, trow.
34
+
35
+ These are Schema-2.4-only legacy elements. They're outside the
36
+ gem's current scope (the gem focuses on Schema 3 + intersection).
37
+ Document them in CLAUDE.md so future contributors know.
38
+
39
+ ## Acceptance
40
+
41
+ - SCHEMA3_ONLY = %i[AnyCml].
42
+ - Schema24::CmlModule wire class exists, parses, serializes.
43
+ - Translator's module_from_canonical works for schema24.
44
+ - Full suite still green.
@@ -0,0 +1,23 @@
1
+ # 45 — Documentation cleanup and final spec verification
2
+
3
+ ## Why
4
+
5
+ Stale comments and docs rot fast. After TODOs 36–44 land, sweep the
6
+ codebase for outdated references and run the full suite end-to-end.
7
+
8
+ ## Updates
9
+
10
+ - `lib/chemicalml/cml.rb`: comment says "All 36 aliases load from a
11
+ single file" — actually 121 now.
12
+ - `CLAUDE.md`: refresh any counts (121 elements, ~45 constraints,
13
+ 14 model classes added, etc.).
14
+ - `CLAUDE.md`: note Schema24-only legacy elements not modeled.
15
+ - Verify `bundle exec rspec` is fully green.
16
+ - Verify `bundle exec rubocop` is clean (or autocorrect what's
17
+ safe).
18
+
19
+ ## Acceptance
20
+
21
+ - All counts in docs match the actual codebase.
22
+ - Full rspec suite passes.
23
+ - Rubocop reports no new offenses.
@@ -0,0 +1,24 @@
1
+ # 46 — Fix LatticeVector content attribute
2
+
3
+ ## Why
4
+
5
+ `<latticeVector>1 0 0</latticeVector>` carries vector components as
6
+ element content. `lib/chemicalml/cml/base/lattice_vector.rb` declares
7
+ only id/title/dictRef/convention/units — **no content attribute**.
8
+ The translator's workaround maps `lv.content` ↔ wire `units` —
9
+ semantically wrong (units ≠ vector components).
10
+
11
+ ## Fix
12
+
13
+ 1. Add `attribute :content, :string` + `map_content` to Base::LatticeVector.
14
+ 2. Update Model::LatticeVector to carry `units` and `content` as
15
+ independent fields.
16
+ 3. Update translator `lattice_vector_to/from_canonical` to map both.
17
+ 4. Spec round-trip.
18
+
19
+ ## Acceptance
20
+
21
+ - `<latticeVector units="unit:nm">1 0 0</latticeVector>` round-trips
22
+ with units and content preserved.
23
+ - Translator spec covers the fix.
24
+ - Full suite green.
@@ -0,0 +1,23 @@
1
+ # 47 — Wire Molecule#crystal/spectra/property_lists through translator
2
+
3
+ ## Why
4
+
5
+ `Base::Molecule` declares `crystal`, `spectra`, `property_lists`
6
+ children, but `Model::Molecule` doesn't have those fields and
7
+ `molecule_to_canonical/from_canonical` silently drops them. Silent
8
+ data loss.
9
+
10
+ ## Fix
11
+
12
+ 1. Add `crystal`, `spectra`, `property_lists` accessors to
13
+ `Model::Molecule`.
14
+ 2. Wire through `molecule_to_canonical` (read wire, build Model) and
15
+ `molecule_from_canonical` (read Model, build wire).
16
+ 3. Update `Model::Molecule#children` and `#value_attributes`.
17
+ 4. Spec round-trip with a molecule containing crystal + propertyList.
18
+
19
+ ## Acceptance
20
+
21
+ - A molecule with `<crystal>` and `<propertyList>` children round-trips
22
+ through canonical without loss.
23
+ - Full suite green.
@@ -0,0 +1,21 @@
1
+ # 48 — Add Model::List and wire Module#lists
2
+
3
+ ## Why
4
+
5
+ `Model::Module` has a `lists` accessor but `module_to_canonical`
6
+ hardcodes `lists: []`. There is no `Model::List` canonical class, so
7
+ wire `<list>` children of `<module>` are silently dropped.
8
+
9
+ ## Fix
10
+
11
+ 1. Add `Model::List` mirroring `Base::List` shape: id/title/dictRef/
12
+ convention + scalar/array/matrix/list children.
13
+ 2. Wire `module_to_canonical` to map `wire_module.lists` (drop the
14
+ hardcoded `[]`).
15
+ 3. Wire `module_from_canonical` reverse.
16
+ 4. Spec round-trip.
17
+
18
+ ## Acceptance
19
+
20
+ - A `<module>` containing a `<list>` child round-trips without loss.
21
+ - Full suite green.
@@ -0,0 +1,34 @@
1
+ # 49 — Add more chemistry Model classes
2
+
3
+ ## Why
4
+
5
+ Several chemically-meaningful CML elements still lack canonical Model
6
+ classes, forcing callers to use wire classes directly and breaking the
7
+ "all adapters speak canonical" invariant.
8
+
9
+ ## New Model classes
10
+
11
+ - `Model::Torsion` — `<torsion>` (4-atom dihedral)
12
+ - `Model::Angle` — `<angle>` (3-atom angle)
13
+ - `Model::Length` — `<length>` (2-atom distance)
14
+ - `Model::Action` / `Model::ActionList` — `<action>` / `<actionList>`
15
+ - `Model::Map` — `<map>` (atom mapping across reaction)
16
+ - `Model::Fragment` / `Model::FragmentList` — substructure references
17
+ - `Model::ReactionStepList` — list of `<reactionStep>`
18
+ - `Model::ReactiveCentre` — `<reactiveCentre>`
19
+ - `Model::TransitionState` — `<transitionState>`
20
+ - `Model::PeakGroup` — `<peakGroup>`
21
+ - `Model::SpectrumList` — `<spectrumList>`
22
+ - `Model::SpectrumData` — `<spectrumData>`
23
+ - `Model::Region` — `<region>`
24
+
25
+ ## Wire translator mappings
26
+
27
+ For each new Model class, add `*_to_canonical` / `*_from_canonical`
28
+ helpers. Most are simple (id/title/dictRef/convention).
29
+
30
+ ## Acceptance
31
+
32
+ - Each new Model class has instantiation + value_attributes specs.
33
+ - Translator mappings round-trip.
34
+ - Full suite green.
@@ -0,0 +1,29 @@
1
+ # 50 — ValidationReport with severity filtering
2
+
3
+ ## Why
4
+
5
+ `Convention.validate` returns a flat array of `Violation`s. Callers
6
+ that want only errors or only warnings have to filter manually. Add
7
+ a `ValidationReport` value object that wraps the array and exposes
8
+ severity-based views.
9
+
10
+ ## API
11
+
12
+ ```ruby
13
+ report = Chemicalml::Convention::ValidationReport.new(violations)
14
+ report.errors # [Violation] with severity == :error
15
+ report.warnings # [Violation] with severity == :warning
16
+ report.ok? # errors.empty?
17
+ report.has_warnings? # warnings.any?
18
+ report.violations # raw array (backward compat)
19
+ ```
20
+
21
+ Also add `Convention.validate_report(doc)` returning a
22
+ `ValidationReport` instead of an array. Existing `validate` keeps its
23
+ array return shape (backward compatible).
24
+
25
+ ## Acceptance
26
+
27
+ - New spec covers all 5 helpers.
28
+ - Existing validate specs unchanged.
29
+ - Full suite green.
@@ -0,0 +1,30 @@
1
+ # 51 — Convention auto-detection
2
+
3
+ ## Why
4
+
5
+ Currently a caller has to know the convention QName and pass it to
6
+ `Convention::Registry.validate(doc, qname: "convention:molecular")`.
7
+ The document itself declares its convention via the `convention`
8
+ attribute on its root element — the gem should be able to detect and
9
+ dispatch automatically.
10
+
11
+ ## API
12
+
13
+ ```ruby
14
+ Chemicalml::Convention::Registry.detect_and_validate(doc)
15
+ # → [Violation, ...] (or ValidationReport)
16
+ ```
17
+
18
+ Internally:
19
+ 1. Find the root element (Document or Molecule or Module).
20
+ 2. Read its `convention` attribute.
21
+ 3. Look up in `Registry`.
22
+ 4. If found → run `convention.validate(doc)`.
23
+ 5. If not found → raise ArgumentError naming the convention.
24
+
25
+ ## Acceptance
26
+
27
+ - Spec: a doc with `convention="convention:molecular"` auto-validates.
28
+ - Spec: unknown convention raises ArgumentError.
29
+ - Spec: doc without convention raises ArgumentError.
30
+ - Full suite green.
@@ -0,0 +1,28 @@
1
+ # 52 — Schema24 legacy elements (selective)
2
+
3
+ ## Why
4
+
5
+ Schema 2.4 XSD declares 17 elements not in Schema 3. Three of them
6
+ are useful enough to model: `annotation` (documentation wrapper),
7
+ `appinfo` (application info), `enumeration` (dictionary enum, used
8
+ by entries that predate the schema3 enum attribute).
9
+
10
+ The other 14 (`alternative`, `arg`, `complexObject`, `expression`,
11
+ `float`, `floatArray`, `integer`, `integerArray`, `operator`,
12
+ `relatedEntry`, `string`, `stringArray`, `tcell`, `trow`) are either
13
+ redundant with Schema 3's unified `scalar`/`array`/`table` or relate
14
+ to legacy expression machinery. Out of scope for now.
15
+
16
+ ## Implementation
17
+
18
+ - Add `Base::Annotation`, `Base::Appinfo`, `Base::Enumeration`.
19
+ - Add `Role::Annotation`, `Role::Appinfo`, `Role::Enumeration`.
20
+ - Add `Schema24::Annotation`, `Schema24::Appinfo`, `Schema24::Enumeration`.
21
+ - Add to `Elements::ALL` with new `SCHEMA24_ONLY` list.
22
+ - Schema3 skips these; Schema24 registers them.
23
+
24
+ ## Acceptance
25
+
26
+ - Three new wire classes registered for Schema24 only.
27
+ - Schema3 lookup raises ArgumentError for these (not in Schema 3).
28
+ - Full suite green.
@@ -0,0 +1,30 @@
1
+ # 53 — Round-trip integration specs
2
+
3
+ ## Why
4
+
5
+ Per-element translator specs cover individual `*_to_canonical` /
6
+ `*_from_canonical` calls. They miss integration issues — wire-format
7
+ mismatches, attribute renames, namespace leaks — that only surface
8
+ when you go XML → canonical → XML → canonical and compare.
9
+
10
+ ## Specs
11
+
12
+ A new `spec/chemicalml/integration/round_trip_spec.rb` that, for each
13
+ fixture under `spec/fixtures/schema3/`:
14
+
15
+ 1. Parse the CML XML → wire tree.
16
+ 2. Translate wire → canonical Model.
17
+ 3. Translate canonical → wire.
18
+ 4. Serialize wire → XML.
19
+ 5. Re-parse → second wire tree.
20
+ 6. Compare first and second wire trees via `value_attributes`.
21
+
22
+ Uses real wire instances throughout (no doubles per project rule).
23
+ Also includes synthetic minimal docs for: crystal-bearing molecule,
24
+ spectrum-bearing molecule, zMatrix molecule, isotopeList molecule.
25
+
26
+ ## Acceptance
27
+
28
+ - Every fixture round-trips.
29
+ - Synthetic minimal docs round-trip.
30
+ - Full suite green.
@@ -0,0 +1,38 @@
1
+ # 54 — Document VersionedParser namespace shim
2
+
3
+ ## Why
4
+
5
+ `lib/chemicalml/versioned_parser.rb` uses regex for two pre-processing
6
+ steps before delegating to `lutaml-model`:
7
+
8
+ 1. `root_element_of(xml)` — peeks the XML for the root element local
9
+ name so the parser can dispatch to the right wire class.
10
+ 2. `inject_namespace(xml, uri, root)` — when the caller passes
11
+ `namespace_exist: false`, injects `xmlns="..."` into the root
12
+ start tag.
13
+
14
+ Both are pre-processing shims. The actual parse goes through
15
+ `Lutaml::Model::Serializable.from_xml` (line 45). Neither function
16
+ serializes, deserializes, or constructs XML nodes — they're string
17
+ pre-processing for input normalization.
18
+
19
+ The user asked to confirm this. The answer:
20
+
21
+ - All actual XML parsing and serialization goes through lutaml-model.
22
+ - 242 wire classes extend `Lutaml::Model::Serializable`.
23
+ - Zero `def to_xml`/`from_xml`/`to_h`/`from_h` on any model class.
24
+ - Zero Nokogiri/REXML references in `lib/`.
25
+ - The two regex helpers in `versioned_parser.rb` are pre-processing
26
+ for input normalization, not serialization. They are explicitly
27
+ documented as such.
28
+
29
+ ## Action
30
+
31
+ - Add a clear comment block at the top of `versioned_parser.rb`
32
+ explaining the boundary.
33
+ - No code change.
34
+
35
+ ## Acceptance
36
+
37
+ - Comment added.
38
+ - Full suite green.
@@ -0,0 +1,20 @@
1
+ # 55 — Fix Model::Molecule missing attributes (correctness)
2
+
3
+ ## Why
4
+
5
+ `Base::Molecule` declares `spin_multiplicity`, `dict_ref`,
6
+ `convention`, `chirality` attributes, but `Model::Molecule` doesn't
7
+ have them and the translator drops them silently. These are
8
+ chemically important (chirality in particular).
9
+
10
+ ## Fix
11
+
12
+ Add `spin_multiplicity`, `dict_ref`, `convention`, `chirality` to
13
+ `Model::Molecule`. Update translator molecule_to_canonical and
14
+ molecule_from_canonical to map them.
15
+
16
+ ## Acceptance
17
+
18
+ - All 4 attributes round-trip through translator.
19
+ - Existing specs unchanged.
20
+ - Full suite green.
@@ -0,0 +1,24 @@
1
+ # 56 — Geometry Model classes
2
+
3
+ ## Why
4
+
5
+ CML declares 6 geometry primitives (`point3`, `vector3`, `line3`,
6
+ `plane3`, `sphere3`, `transform3`) plus `cellParameter` and
7
+ `dimension` — all share the same shape (id/title/dictRef/convention +
8
+ content). They're used as children of `atom`, `molecule`, `crystal`,
9
+ etc. Without canonical Models, callers must use wire classes directly.
10
+
11
+ ## Implementation
12
+
13
+ One Model class per element. Each carries `id`, `title`, `dict_ref`,
14
+ `convention`, `content` (the geometry string). Identical shape, so
15
+ specs can be parametrized.
16
+
17
+ For `cellParameter`: also `cellType` attribute (per Schema 3 XSD).
18
+ For `dimension`: also `name` attribute.
19
+
20
+ ## Acceptance
21
+
22
+ - 8 new Model classes registered.
23
+ - Per-class spec.
24
+ - Full suite green.
@@ -0,0 +1,26 @@
1
+ # 57 — Compchem Model classes
2
+
3
+ ## Why
4
+
5
+ Schema 3 declares 10 compchem-specific elements not yet modeled:
6
+ `gradient`, `eigen`, `kpoint`, `kpointList`, `band`, `bandList`,
7
+ `basisSet`, `atomicBasisFunction`, `particle`, `electron`. All
8
+ are common in computational chemistry output.
9
+
10
+ ## Implementation
11
+
12
+ - `Model::Gradient` — id/title/dictRef/convention/units/content
13
+ - `Model::Eigen` — id/title/dictRef/convention/units/type/content
14
+ - `Model::Kpoint` / `Model::KpointList`
15
+ - `Model::Band` / `Model::BandList`
16
+ - `Model::BasisSet` / `Model::AtomicBasisFunction`
17
+ - `Model::Particle` / `Model::Electron`
18
+
19
+ Each follows the Node pattern: attr_accessor, initialize, children,
20
+ value_attributes.
21
+
22
+ ## Acceptance
23
+
24
+ - 10 new Model classes.
25
+ - Per-class spec.
26
+ - Full suite green.
@@ -0,0 +1,24 @@
1
+ # 58 — Remaining Model classes for full element coverage
2
+
3
+ ## Why
4
+
5
+ Several wire elements still lack canonical Models, breaking the "all
6
+ adapters speak canonical" invariant for these element types.
7
+
8
+ ## New Model classes (25)
9
+
10
+ - **Documentation**: Definition, Description, Documentation, Link
11
+ - **Chemistry**: Symmetry (pointGroup/spaceGroup), System
12
+ (atomArray/molecules), Stmml
13
+ - **Containers**: ArrayList, ConditionList, SubstanceList
14
+ - **Sets**: AtomSet, BondSet
15
+ - **Typing**: AtomType, AtomTypeList, BondType, BondTypeList
16
+ - **Mechanism**: Mechanism, MechanismComponent, Join
17
+ - **Other**: Object, Observation, PeakStructure, Potential,
18
+ PotentialForm, PotentialList
19
+
20
+ ## Acceptance
21
+
22
+ - 25 new Model classes.
23
+ - Per-class spec (lightweight — just instantiation + value_attributes).
24
+ - Full suite green.
@@ -0,0 +1,18 @@
1
+ # 59 — Wire new Models through translator
2
+
3
+ ## Why
4
+
5
+ Models added in TODOs 56-58 are inert without translator mappings.
6
+ Add `*_to_canonical` / `*_from_canonical` for each.
7
+
8
+ ## Implementation
9
+
10
+ Most share the geometry-simple shape (id/title/dictRef/convention +
11
+ content). Factor a shared helper to avoid copy-paste.
12
+
13
+ ## Acceptance
14
+
15
+ - Translator spec for each new Model class.
16
+ - Round-trip integration test covers a synthetic doc using one new
17
+ Model class end-to-end.
18
+ - Full suite green.
@@ -0,0 +1,19 @@
1
+ # 60 — Update CLAUDE.md and final verification
2
+
3
+ ## Why
4
+
5
+ Counts in CLAUDE.md and project docs are stale after TODOs 36-59.
6
+
7
+ ## Updates
8
+
9
+ - CLAUDE.md model count (was 43, now ~100).
10
+ - Constraint count (was 17, now 60).
11
+ - Note ValidationReport, detect_and_validate APIs.
12
+ - Note Schema24 legacy elements.
13
+ - Verify `bundle exec rspec` fully green.
14
+ - Verify zero forbidden patterns.
15
+
16
+ ## Acceptance
17
+
18
+ - Docs reflect current state.
19
+ - Full suite green.
@@ -0,0 +1,30 @@
1
+ # TODO.align (round 10)
2
+
3
+ Code cleanliness fixes.
4
+
5
+ | # | Workstream | Status |
6
+ |---|---|---|
7
+ | 40 | Fix Base file indentation + extract Translator helpers | complete |
8
+
9
+ ## Issues fixed
10
+
11
+ ### 1. Base file indentation
12
+
13
+ All 36 Base mixin files had inconsistent indentation on the
14
+ `namespace` line inside `xml do` blocks — 12 spaces instead of 14.
15
+ Fixed via automated `ruby -i -pe` across `lib/chemicalml/cml/base/*.rb`.
16
+
17
+ ### 2. Translator DRY: extracted name_to_canonical / identifier_to_canonical
18
+
19
+ `molecule_to_canonical` was constructing `Model::Name` and
20
+ `Model::Identifier` inline (two multi-argument `.new` calls in a
21
+ single hash value) instead of calling dedicated helper methods —
22
+ unlike every other element type which has its own `X_to_canonical`
23
+ helper. Extracted to `name_to_canonical` / `identifier_to_canonical`
24
+ methods for consistency with the rest of the Translator.
25
+
26
+ ## Final metrics
27
+
28
+ - 179 examples, 0 failures
29
+ - 0 forbidden patterns
30
+ - 227 lib files