chemicalml 0.1.0 → 0.2.0

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 (568) 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 +28 -0
  8. data/CHANGELOG.md +52 -12
  9. data/Gemfile +2 -1
  10. data/Rakefile +9 -4
  11. data/TODO.align/18-wire-class-registry.md +46 -0
  12. data/TODO.align/19-schema-aware-translator.md +33 -0
  13. data/TODO.align/20-missing-translator-rules.md +44 -0
  14. data/TODO.align/21-encapsulate-translator.md +33 -0
  15. data/TODO.align/22-dry-role-modules.md +32 -0
  16. data/TODO.align/23-final-spec-lint.md +25 -0
  17. data/TODO.align/24-autoload-wire-classes.md +84 -0
  18. data/TODO.align/25-value-container-schema-awareness.md +44 -0
  19. data/TODO.align/26-remove-dead-code.md +16 -0
  20. data/TODO.align/27-final-spec-lint.md +26 -0
  21. data/TODO.align/28-stereo-model.md +40 -0
  22. data/TODO.align/29-stereo-wire-children.md +30 -0
  23. data/TODO.align/30-stereo-translator.md +32 -0
  24. data/TODO.align/31-final-spec-lint.md +20 -0
  25. data/TODO.align/32-polymorphic-translator.md +43 -0
  26. data/TODO.align/33-polymorphic-parse.md +43 -0
  27. data/TODO.align/34-polymorphic-specs.md +16 -0
  28. data/TODO.align/35-final-spec-lint.md +10 -0
  29. data/TODO.align/README.round10.md +30 -0
  30. data/TODO.align/README.round11.md +50 -0
  31. data/TODO.align/README.round12.md +73 -0
  32. data/TODO.align/README.round13.md +59 -0
  33. data/TODO.align/README.round14.md +48 -0
  34. data/TODO.align/README.round15.md +86 -0
  35. data/TODO.align/README.round16.md +46 -0
  36. data/TODO.align/README.round3.md +27 -0
  37. data/TODO.align/README.round4.md +18 -0
  38. data/TODO.align/README.round5.md +20 -0
  39. data/TODO.align/README.round6.md +27 -0
  40. data/TODO.align/README.round7.md +43 -0
  41. data/TODO.align/README.round8.md +24 -0
  42. data/TODO.align/README.round9.md +50 -0
  43. data/data/dictionaries/_index.yaml +9 -1
  44. data/data/dictionaries/cif.yaml +155 -0
  45. data/data/dictionaries/cml.yaml +172 -0
  46. data/data/dictionaries/cml_formula.yaml +63 -0
  47. data/data/dictionaries/cml_name.yaml +84 -0
  48. data/data/dictionaries/unit_non_si.yaml +30 -0
  49. data/data/dictionaries/unit_type.yaml +12 -0
  50. data/lib/chemicalml/cml/aliases.rb +20 -0
  51. data/lib/chemicalml/cml/base/abundance.rb +28 -0
  52. data/lib/chemicalml/cml/base/action.rb +30 -0
  53. data/lib/chemicalml/cml/base/action_list.rb +33 -0
  54. data/lib/chemicalml/cml/base/amount.rb +28 -0
  55. data/lib/chemicalml/cml/base/angle.rb +32 -0
  56. data/lib/chemicalml/cml/base/any_cml.rb +28 -0
  57. data/lib/chemicalml/cml/base/array.rb +1 -1
  58. data/lib/chemicalml/cml/base/array_list.rb +28 -0
  59. data/lib/chemicalml/cml/base/atom.rb +19 -1
  60. data/lib/chemicalml/cml/base/atom_array.rb +1 -1
  61. data/lib/chemicalml/cml/base/atom_parity.rb +1 -1
  62. data/lib/chemicalml/cml/base/atom_set.rb +28 -0
  63. data/lib/chemicalml/cml/base/atom_type.rb +32 -0
  64. data/lib/chemicalml/cml/base/atom_type_list.rb +31 -0
  65. data/lib/chemicalml/cml/base/atomic_basis_function.rb +40 -0
  66. data/lib/chemicalml/cml/base/band.rb +32 -0
  67. data/lib/chemicalml/cml/base/band_list.rb +31 -0
  68. data/lib/chemicalml/cml/base/basis_set.rb +31 -0
  69. data/lib/chemicalml/cml/base/bond.rb +5 -1
  70. data/lib/chemicalml/cml/base/bond_array.rb +1 -1
  71. data/lib/chemicalml/cml/base/bond_set.rb +28 -0
  72. data/lib/chemicalml/cml/base/bond_stereo.rb +1 -1
  73. data/lib/chemicalml/cml/base/bond_type.rb +32 -0
  74. data/lib/chemicalml/cml/base/bond_type_list.rb +31 -0
  75. data/lib/chemicalml/cml/base/cell_parameter.rb +34 -0
  76. data/lib/chemicalml/cml/base/cml_module.rb +1 -1
  77. data/lib/chemicalml/cml/base/condition_list.rb +33 -0
  78. data/lib/chemicalml/cml/base/crystal.rb +35 -0
  79. data/lib/chemicalml/cml/base/definition.rb +30 -0
  80. data/lib/chemicalml/cml/base/description.rb +30 -0
  81. data/lib/chemicalml/cml/base/dictionary.rb +1 -1
  82. data/lib/chemicalml/cml/base/dictionary_entry.rb +1 -1
  83. data/lib/chemicalml/cml/base/dimension.rb +32 -0
  84. data/lib/chemicalml/cml/base/document.rb +9 -1
  85. data/lib/chemicalml/cml/base/documentation.rb +30 -0
  86. data/lib/chemicalml/cml/base/eigen.rb +34 -0
  87. data/lib/chemicalml/cml/base/electron.rb +36 -0
  88. data/lib/chemicalml/cml/base/formula.rb +1 -1
  89. data/lib/chemicalml/cml/base/fragment.rb +35 -0
  90. data/lib/chemicalml/cml/base/fragment_list.rb +31 -0
  91. data/lib/chemicalml/cml/base/gradient.rb +32 -0
  92. data/lib/chemicalml/cml/base/identifier.rb +1 -1
  93. data/lib/chemicalml/cml/base/isotope.rb +34 -0
  94. data/lib/chemicalml/cml/base/isotope_list.rb +31 -0
  95. data/lib/chemicalml/cml/base/join.rb +30 -0
  96. data/lib/chemicalml/cml/base/kpoint.rb +32 -0
  97. data/lib/chemicalml/cml/base/kpoint_list.rb +31 -0
  98. data/lib/chemicalml/cml/base/label.rb +1 -1
  99. data/lib/chemicalml/cml/base/lattice.rb +35 -0
  100. data/lib/chemicalml/cml/base/lattice_vector.rb +30 -0
  101. data/lib/chemicalml/cml/base/length.rb +32 -0
  102. data/lib/chemicalml/cml/base/line3.rb +30 -0
  103. data/lib/chemicalml/cml/base/link.rb +38 -0
  104. data/lib/chemicalml/cml/base/list.rb +1 -1
  105. data/lib/chemicalml/cml/base/map.rb +28 -0
  106. data/lib/chemicalml/cml/base/matrix.rb +1 -1
  107. data/lib/chemicalml/cml/base/mechanism.rb +31 -0
  108. data/lib/chemicalml/cml/base/mechanism_component.rb +30 -0
  109. data/lib/chemicalml/cml/base/metadata.rb +1 -1
  110. data/lib/chemicalml/cml/base/metadata_list.rb +1 -1
  111. data/lib/chemicalml/cml/base/molecule.rb +17 -1
  112. data/lib/chemicalml/cml/base/molecule_list.rb +31 -0
  113. data/lib/chemicalml/cml/base/name.rb +1 -1
  114. data/lib/chemicalml/cml/base/object.rb +30 -0
  115. data/lib/chemicalml/cml/base/observation.rb +28 -0
  116. data/lib/chemicalml/cml/base/parameter.rb +1 -1
  117. data/lib/chemicalml/cml/base/parameter_list.rb +1 -1
  118. data/lib/chemicalml/cml/base/particle.rb +30 -0
  119. data/lib/chemicalml/cml/base/peak.rb +40 -0
  120. data/lib/chemicalml/cml/base/peak_group.rb +31 -0
  121. data/lib/chemicalml/cml/base/peak_list.rb +33 -0
  122. data/lib/chemicalml/cml/base/peak_structure.rb +30 -0
  123. data/lib/chemicalml/cml/base/plane3.rb +30 -0
  124. data/lib/chemicalml/cml/base/point3.rb +30 -0
  125. data/lib/chemicalml/cml/base/potential.rb +30 -0
  126. data/lib/chemicalml/cml/base/potential_form.rb +30 -0
  127. data/lib/chemicalml/cml/base/potential_list.rb +31 -0
  128. data/lib/chemicalml/cml/base/product.rb +1 -1
  129. data/lib/chemicalml/cml/base/product_list.rb +1 -1
  130. data/lib/chemicalml/cml/base/property.rb +1 -1
  131. data/lib/chemicalml/cml/base/property_list.rb +1 -1
  132. data/lib/chemicalml/cml/base/reactant.rb +1 -1
  133. data/lib/chemicalml/cml/base/reactant_list.rb +1 -1
  134. data/lib/chemicalml/cml/base/reaction.rb +9 -1
  135. data/lib/chemicalml/cml/base/reaction_list.rb +1 -1
  136. data/lib/chemicalml/cml/base/reaction_scheme.rb +33 -0
  137. data/lib/chemicalml/cml/base/reaction_step.rb +35 -0
  138. data/lib/chemicalml/cml/base/reaction_step_list.rb +31 -0
  139. data/lib/chemicalml/cml/base/reactive_centre.rb +30 -0
  140. data/lib/chemicalml/cml/base/region.rb +28 -0
  141. data/lib/chemicalml/cml/base/sample.rb +28 -0
  142. data/lib/chemicalml/cml/base/scalar.rb +1 -1
  143. data/lib/chemicalml/cml/base/spectator.rb +28 -0
  144. data/lib/chemicalml/cml/base/spectator_list.rb +31 -0
  145. data/lib/chemicalml/cml/base/spectrum.rb +41 -0
  146. data/lib/chemicalml/cml/base/spectrum_data.rb +33 -0
  147. data/lib/chemicalml/cml/base/spectrum_list.rb +31 -0
  148. data/lib/chemicalml/cml/base/sphere3.rb +30 -0
  149. data/lib/chemicalml/cml/base/stmml.rb +28 -0
  150. data/lib/chemicalml/cml/base/substance.rb +1 -1
  151. data/lib/chemicalml/cml/base/substance_list.rb +31 -0
  152. data/lib/chemicalml/cml/base/symmetry.rb +32 -0
  153. data/lib/chemicalml/cml/base/system.rb +33 -0
  154. data/lib/chemicalml/cml/base/table.rb +33 -0
  155. data/lib/chemicalml/cml/base/table_cell.rb +30 -0
  156. data/lib/chemicalml/cml/base/table_content.rb +33 -0
  157. data/lib/chemicalml/cml/base/table_header.rb +31 -0
  158. data/lib/chemicalml/cml/base/table_header_cell.rb +30 -0
  159. data/lib/chemicalml/cml/base/table_row.rb +31 -0
  160. data/lib/chemicalml/cml/base/table_row_list.rb +31 -0
  161. data/lib/chemicalml/cml/base/torsion.rb +32 -0
  162. data/lib/chemicalml/cml/base/transform3.rb +30 -0
  163. data/lib/chemicalml/cml/base/transition_state.rb +28 -0
  164. data/lib/chemicalml/cml/base/unit.rb +1 -1
  165. data/lib/chemicalml/cml/base/unit_list.rb +1 -1
  166. data/lib/chemicalml/cml/base/unit_type.rb +1 -1
  167. data/lib/chemicalml/cml/base/unit_type_list.rb +1 -1
  168. data/lib/chemicalml/cml/base/vector3.rb +30 -0
  169. data/lib/chemicalml/cml/base/xaxis.rb +32 -0
  170. data/lib/chemicalml/cml/base/yaxis.rb +32 -0
  171. data/lib/chemicalml/cml/base/z_matrix.rb +30 -0
  172. data/lib/chemicalml/cml/base.rb +85 -0
  173. data/lib/chemicalml/cml/child_mappings.rb +168 -0
  174. data/lib/chemicalml/cml/elements.rb +130 -42
  175. data/lib/chemicalml/cml/role/abundance.rb +12 -0
  176. data/lib/chemicalml/cml/role/action.rb +12 -0
  177. data/lib/chemicalml/cml/role/action_list.rb +12 -0
  178. data/lib/chemicalml/cml/role/amount.rb +12 -0
  179. data/lib/chemicalml/cml/role/angle.rb +12 -0
  180. data/lib/chemicalml/cml/role/any_cml.rb +12 -0
  181. data/lib/chemicalml/cml/role/array_list.rb +12 -0
  182. data/lib/chemicalml/cml/role/atom_set.rb +12 -0
  183. data/lib/chemicalml/cml/role/atom_type.rb +12 -0
  184. data/lib/chemicalml/cml/role/atom_type_list.rb +12 -0
  185. data/lib/chemicalml/cml/role/atomic_basis_function.rb +12 -0
  186. data/lib/chemicalml/cml/role/band.rb +12 -0
  187. data/lib/chemicalml/cml/role/band_list.rb +12 -0
  188. data/lib/chemicalml/cml/role/basis_set.rb +12 -0
  189. data/lib/chemicalml/cml/role/bond_set.rb +12 -0
  190. data/lib/chemicalml/cml/role/bond_type.rb +12 -0
  191. data/lib/chemicalml/cml/role/bond_type_list.rb +12 -0
  192. data/lib/chemicalml/cml/role/cell_parameter.rb +12 -0
  193. data/lib/chemicalml/cml/role/condition_list.rb +12 -0
  194. data/lib/chemicalml/cml/role/crystal.rb +12 -0
  195. data/lib/chemicalml/cml/role/definition.rb +12 -0
  196. data/lib/chemicalml/cml/role/description.rb +12 -0
  197. data/lib/chemicalml/cml/role/dimension.rb +12 -0
  198. data/lib/chemicalml/cml/role/documentation.rb +12 -0
  199. data/lib/chemicalml/cml/role/eigen.rb +12 -0
  200. data/lib/chemicalml/cml/role/electron.rb +12 -0
  201. data/lib/chemicalml/cml/role/fragment.rb +12 -0
  202. data/lib/chemicalml/cml/role/fragment_list.rb +12 -0
  203. data/lib/chemicalml/cml/role/gradient.rb +12 -0
  204. data/lib/chemicalml/cml/role/isotope.rb +12 -0
  205. data/lib/chemicalml/cml/role/isotope_list.rb +12 -0
  206. data/lib/chemicalml/cml/role/join.rb +12 -0
  207. data/lib/chemicalml/cml/role/kpoint.rb +12 -0
  208. data/lib/chemicalml/cml/role/kpoint_list.rb +12 -0
  209. data/lib/chemicalml/cml/role/lattice.rb +12 -0
  210. data/lib/chemicalml/cml/role/lattice_vector.rb +12 -0
  211. data/lib/chemicalml/cml/role/length.rb +12 -0
  212. data/lib/chemicalml/cml/role/line3.rb +12 -0
  213. data/lib/chemicalml/cml/role/link.rb +12 -0
  214. data/lib/chemicalml/cml/role/map.rb +12 -0
  215. data/lib/chemicalml/cml/role/mechanism.rb +12 -0
  216. data/lib/chemicalml/cml/role/mechanism_component.rb +12 -0
  217. data/lib/chemicalml/cml/role/molecule_list.rb +12 -0
  218. data/lib/chemicalml/cml/role/object.rb +12 -0
  219. data/lib/chemicalml/cml/role/observation.rb +12 -0
  220. data/lib/chemicalml/cml/role/particle.rb +12 -0
  221. data/lib/chemicalml/cml/role/peak.rb +12 -0
  222. data/lib/chemicalml/cml/role/peak_group.rb +12 -0
  223. data/lib/chemicalml/cml/role/peak_list.rb +12 -0
  224. data/lib/chemicalml/cml/role/peak_structure.rb +12 -0
  225. data/lib/chemicalml/cml/role/plane3.rb +12 -0
  226. data/lib/chemicalml/cml/role/point3.rb +12 -0
  227. data/lib/chemicalml/cml/role/potential.rb +12 -0
  228. data/lib/chemicalml/cml/role/potential_form.rb +12 -0
  229. data/lib/chemicalml/cml/role/potential_list.rb +12 -0
  230. data/lib/chemicalml/cml/role/reaction_scheme.rb +12 -0
  231. data/lib/chemicalml/cml/role/reaction_step.rb +12 -0
  232. data/lib/chemicalml/cml/role/reaction_step_list.rb +12 -0
  233. data/lib/chemicalml/cml/role/reactive_centre.rb +12 -0
  234. data/lib/chemicalml/cml/role/region.rb +12 -0
  235. data/lib/chemicalml/cml/role/sample.rb +12 -0
  236. data/lib/chemicalml/cml/role/spectator.rb +12 -0
  237. data/lib/chemicalml/cml/role/spectator_list.rb +12 -0
  238. data/lib/chemicalml/cml/role/spectrum.rb +12 -0
  239. data/lib/chemicalml/cml/role/spectrum_data.rb +12 -0
  240. data/lib/chemicalml/cml/role/spectrum_list.rb +12 -0
  241. data/lib/chemicalml/cml/role/sphere3.rb +12 -0
  242. data/lib/chemicalml/cml/role/stmml.rb +12 -0
  243. data/lib/chemicalml/cml/role/substance_list.rb +12 -0
  244. data/lib/chemicalml/cml/role/symmetry.rb +12 -0
  245. data/lib/chemicalml/cml/role/system.rb +12 -0
  246. data/lib/chemicalml/cml/role/table.rb +12 -0
  247. data/lib/chemicalml/cml/role/table_cell.rb +12 -0
  248. data/lib/chemicalml/cml/role/table_content.rb +12 -0
  249. data/lib/chemicalml/cml/role/table_header.rb +12 -0
  250. data/lib/chemicalml/cml/role/table_header_cell.rb +12 -0
  251. data/lib/chemicalml/cml/role/table_row.rb +12 -0
  252. data/lib/chemicalml/cml/role/table_row_list.rb +12 -0
  253. data/lib/chemicalml/cml/role/torsion.rb +12 -0
  254. data/lib/chemicalml/cml/role/transform3.rb +12 -0
  255. data/lib/chemicalml/cml/role/transition_state.rb +12 -0
  256. data/lib/chemicalml/cml/role/vector3.rb +12 -0
  257. data/lib/chemicalml/cml/role/xaxis.rb +12 -0
  258. data/lib/chemicalml/cml/role/yaxis.rb +12 -0
  259. data/lib/chemicalml/cml/role/z_matrix.rb +12 -0
  260. data/lib/chemicalml/cml/role.rb +86 -1
  261. data/lib/chemicalml/cml/schema24/abundance.rb +13 -0
  262. data/lib/chemicalml/cml/schema24/action.rb +13 -0
  263. data/lib/chemicalml/cml/schema24/action_list.rb +13 -0
  264. data/lib/chemicalml/cml/schema24/amount.rb +13 -0
  265. data/lib/chemicalml/cml/schema24/angle.rb +13 -0
  266. data/lib/chemicalml/cml/schema24/any_cml.rb +13 -0
  267. data/lib/chemicalml/cml/schema24/array.rb +15 -0
  268. data/lib/chemicalml/cml/schema24/array_list.rb +13 -0
  269. data/lib/chemicalml/cml/schema24/atom.rb +15 -0
  270. data/lib/chemicalml/cml/schema24/atom_array.rb +15 -0
  271. data/lib/chemicalml/cml/schema24/atom_parity.rb +15 -0
  272. data/lib/chemicalml/cml/schema24/atom_set.rb +13 -0
  273. data/lib/chemicalml/cml/schema24/atom_type.rb +13 -0
  274. data/lib/chemicalml/cml/schema24/atom_type_list.rb +13 -0
  275. data/lib/chemicalml/cml/schema24/atomic_basis_function.rb +13 -0
  276. data/lib/chemicalml/cml/schema24/band.rb +13 -0
  277. data/lib/chemicalml/cml/schema24/band_list.rb +13 -0
  278. data/lib/chemicalml/cml/schema24/basis_set.rb +13 -0
  279. data/lib/chemicalml/cml/schema24/bond.rb +15 -0
  280. data/lib/chemicalml/cml/schema24/bond_array.rb +15 -0
  281. data/lib/chemicalml/cml/schema24/bond_set.rb +13 -0
  282. data/lib/chemicalml/cml/schema24/bond_stereo.rb +15 -0
  283. data/lib/chemicalml/cml/schema24/bond_type.rb +13 -0
  284. data/lib/chemicalml/cml/schema24/bond_type_list.rb +13 -0
  285. data/lib/chemicalml/cml/schema24/cell_parameter.rb +13 -0
  286. data/lib/chemicalml/cml/schema24/condition_list.rb +13 -0
  287. data/lib/chemicalml/cml/schema24/context.rb +18 -0
  288. data/lib/chemicalml/cml/schema24/crystal.rb +13 -0
  289. data/lib/chemicalml/cml/schema24/definition.rb +13 -0
  290. data/lib/chemicalml/cml/schema24/description.rb +13 -0
  291. data/lib/chemicalml/cml/schema24/dictionary.rb +15 -0
  292. data/lib/chemicalml/cml/schema24/dictionary_entry.rb +15 -0
  293. data/lib/chemicalml/cml/schema24/dimension.rb +13 -0
  294. data/lib/chemicalml/cml/schema24/document.rb +15 -0
  295. data/lib/chemicalml/cml/schema24/documentation.rb +13 -0
  296. data/lib/chemicalml/cml/schema24/eigen.rb +13 -0
  297. data/lib/chemicalml/cml/schema24/electron.rb +13 -0
  298. data/lib/chemicalml/cml/schema24/formula.rb +15 -0
  299. data/lib/chemicalml/cml/schema24/fragment.rb +13 -0
  300. data/lib/chemicalml/cml/schema24/fragment_list.rb +13 -0
  301. data/lib/chemicalml/cml/schema24/gradient.rb +13 -0
  302. data/lib/chemicalml/cml/schema24/identifier.rb +15 -0
  303. data/lib/chemicalml/cml/schema24/isotope.rb +13 -0
  304. data/lib/chemicalml/cml/schema24/isotope_list.rb +13 -0
  305. data/lib/chemicalml/cml/schema24/join.rb +13 -0
  306. data/lib/chemicalml/cml/schema24/kpoint.rb +13 -0
  307. data/lib/chemicalml/cml/schema24/kpoint_list.rb +13 -0
  308. data/lib/chemicalml/cml/schema24/label.rb +15 -0
  309. data/lib/chemicalml/cml/schema24/lattice.rb +13 -0
  310. data/lib/chemicalml/cml/schema24/lattice_vector.rb +13 -0
  311. data/lib/chemicalml/cml/schema24/length.rb +13 -0
  312. data/lib/chemicalml/cml/schema24/line3.rb +13 -0
  313. data/lib/chemicalml/cml/schema24/link.rb +13 -0
  314. data/lib/chemicalml/cml/schema24/list.rb +15 -0
  315. data/lib/chemicalml/cml/schema24/map.rb +13 -0
  316. data/lib/chemicalml/cml/schema24/matrix.rb +15 -0
  317. data/lib/chemicalml/cml/schema24/mechanism.rb +13 -0
  318. data/lib/chemicalml/cml/schema24/mechanism_component.rb +13 -0
  319. data/lib/chemicalml/cml/schema24/metadata.rb +15 -0
  320. data/lib/chemicalml/cml/schema24/metadata_list.rb +15 -0
  321. data/lib/chemicalml/cml/schema24/molecule.rb +15 -0
  322. data/lib/chemicalml/cml/schema24/molecule_list.rb +13 -0
  323. data/lib/chemicalml/cml/schema24/name.rb +15 -0
  324. data/lib/chemicalml/cml/schema24/object.rb +13 -0
  325. data/lib/chemicalml/cml/schema24/observation.rb +13 -0
  326. data/lib/chemicalml/cml/schema24/parameter.rb +15 -0
  327. data/lib/chemicalml/cml/schema24/parameter_list.rb +15 -0
  328. data/lib/chemicalml/cml/schema24/particle.rb +13 -0
  329. data/lib/chemicalml/cml/schema24/peak.rb +13 -0
  330. data/lib/chemicalml/cml/schema24/peak_group.rb +13 -0
  331. data/lib/chemicalml/cml/schema24/peak_list.rb +13 -0
  332. data/lib/chemicalml/cml/schema24/peak_structure.rb +13 -0
  333. data/lib/chemicalml/cml/schema24/plane3.rb +13 -0
  334. data/lib/chemicalml/cml/schema24/point3.rb +13 -0
  335. data/lib/chemicalml/cml/schema24/potential.rb +13 -0
  336. data/lib/chemicalml/cml/schema24/potential_form.rb +13 -0
  337. data/lib/chemicalml/cml/schema24/potential_list.rb +13 -0
  338. data/lib/chemicalml/cml/schema24/product.rb +15 -0
  339. data/lib/chemicalml/cml/schema24/product_list.rb +15 -0
  340. data/lib/chemicalml/cml/schema24/property.rb +15 -0
  341. data/lib/chemicalml/cml/schema24/property_list.rb +15 -0
  342. data/lib/chemicalml/cml/schema24/reactant.rb +15 -0
  343. data/lib/chemicalml/cml/schema24/reactant_list.rb +15 -0
  344. data/lib/chemicalml/cml/schema24/reaction.rb +15 -0
  345. data/lib/chemicalml/cml/schema24/reaction_list.rb +15 -0
  346. data/lib/chemicalml/cml/schema24/reaction_scheme.rb +13 -0
  347. data/lib/chemicalml/cml/schema24/reaction_step.rb +13 -0
  348. data/lib/chemicalml/cml/schema24/reaction_step_list.rb +13 -0
  349. data/lib/chemicalml/cml/schema24/reactive_centre.rb +13 -0
  350. data/lib/chemicalml/cml/schema24/region.rb +13 -0
  351. data/lib/chemicalml/cml/schema24/sample.rb +13 -0
  352. data/lib/chemicalml/cml/schema24/scalar.rb +15 -0
  353. data/lib/chemicalml/cml/schema24/spectator.rb +13 -0
  354. data/lib/chemicalml/cml/schema24/spectator_list.rb +13 -0
  355. data/lib/chemicalml/cml/schema24/spectrum.rb +13 -0
  356. data/lib/chemicalml/cml/schema24/spectrum_data.rb +13 -0
  357. data/lib/chemicalml/cml/schema24/spectrum_list.rb +13 -0
  358. data/lib/chemicalml/cml/schema24/sphere3.rb +13 -0
  359. data/lib/chemicalml/cml/schema24/stmml.rb +13 -0
  360. data/lib/chemicalml/cml/schema24/substance.rb +15 -0
  361. data/lib/chemicalml/cml/schema24/substance_list.rb +13 -0
  362. data/lib/chemicalml/cml/schema24/symmetry.rb +13 -0
  363. data/lib/chemicalml/cml/schema24/system.rb +13 -0
  364. data/lib/chemicalml/cml/schema24/table.rb +13 -0
  365. data/lib/chemicalml/cml/schema24/table_cell.rb +13 -0
  366. data/lib/chemicalml/cml/schema24/table_content.rb +13 -0
  367. data/lib/chemicalml/cml/schema24/table_header.rb +13 -0
  368. data/lib/chemicalml/cml/schema24/table_header_cell.rb +13 -0
  369. data/lib/chemicalml/cml/schema24/table_row.rb +13 -0
  370. data/lib/chemicalml/cml/schema24/table_row_list.rb +13 -0
  371. data/lib/chemicalml/cml/schema24/torsion.rb +13 -0
  372. data/lib/chemicalml/cml/schema24/transform3.rb +13 -0
  373. data/lib/chemicalml/cml/schema24/transition_state.rb +13 -0
  374. data/lib/chemicalml/cml/schema24/unit.rb +15 -0
  375. data/lib/chemicalml/cml/schema24/unit_list.rb +15 -0
  376. data/lib/chemicalml/cml/schema24/unit_type.rb +15 -0
  377. data/lib/chemicalml/cml/schema24/unit_type_list.rb +15 -0
  378. data/lib/chemicalml/cml/schema24/vector3.rb +13 -0
  379. data/lib/chemicalml/cml/schema24/xaxis.rb +13 -0
  380. data/lib/chemicalml/cml/schema24/yaxis.rb +13 -0
  381. data/lib/chemicalml/cml/schema24/z_matrix.rb +13 -0
  382. data/lib/chemicalml/cml/schema24.rb +131 -19
  383. data/lib/chemicalml/cml/schema3/abundance.rb +13 -0
  384. data/lib/chemicalml/cml/schema3/action.rb +13 -0
  385. data/lib/chemicalml/cml/schema3/action_list.rb +13 -0
  386. data/lib/chemicalml/cml/schema3/amount.rb +13 -0
  387. data/lib/chemicalml/cml/schema3/angle.rb +13 -0
  388. data/lib/chemicalml/cml/schema3/any_cml.rb +13 -0
  389. data/lib/chemicalml/cml/schema3/array.rb +15 -0
  390. data/lib/chemicalml/cml/schema3/array_list.rb +13 -0
  391. data/lib/chemicalml/cml/schema3/atom.rb +15 -0
  392. data/lib/chemicalml/cml/schema3/atom_array.rb +15 -0
  393. data/lib/chemicalml/cml/schema3/atom_parity.rb +15 -0
  394. data/lib/chemicalml/cml/schema3/atom_set.rb +13 -0
  395. data/lib/chemicalml/cml/schema3/atom_type.rb +13 -0
  396. data/lib/chemicalml/cml/schema3/atom_type_list.rb +13 -0
  397. data/lib/chemicalml/cml/schema3/atomic_basis_function.rb +13 -0
  398. data/lib/chemicalml/cml/schema3/band.rb +13 -0
  399. data/lib/chemicalml/cml/schema3/band_list.rb +13 -0
  400. data/lib/chemicalml/cml/schema3/basis_set.rb +13 -0
  401. data/lib/chemicalml/cml/schema3/bond.rb +15 -0
  402. data/lib/chemicalml/cml/schema3/bond_array.rb +15 -0
  403. data/lib/chemicalml/cml/schema3/bond_set.rb +13 -0
  404. data/lib/chemicalml/cml/schema3/bond_stereo.rb +15 -0
  405. data/lib/chemicalml/cml/schema3/bond_type.rb +13 -0
  406. data/lib/chemicalml/cml/schema3/bond_type_list.rb +13 -0
  407. data/lib/chemicalml/cml/schema3/cell_parameter.rb +13 -0
  408. data/lib/chemicalml/cml/schema3/cml_module.rb +15 -0
  409. data/lib/chemicalml/cml/schema3/condition_list.rb +13 -0
  410. data/lib/chemicalml/cml/schema3/context.rb +18 -0
  411. data/lib/chemicalml/cml/schema3/crystal.rb +13 -0
  412. data/lib/chemicalml/cml/schema3/definition.rb +13 -0
  413. data/lib/chemicalml/cml/schema3/description.rb +13 -0
  414. data/lib/chemicalml/cml/schema3/dictionary.rb +15 -0
  415. data/lib/chemicalml/cml/schema3/dictionary_entry.rb +15 -0
  416. data/lib/chemicalml/cml/schema3/dimension.rb +13 -0
  417. data/lib/chemicalml/cml/schema3/document.rb +15 -0
  418. data/lib/chemicalml/cml/schema3/documentation.rb +13 -0
  419. data/lib/chemicalml/cml/schema3/eigen.rb +13 -0
  420. data/lib/chemicalml/cml/schema3/electron.rb +13 -0
  421. data/lib/chemicalml/cml/schema3/formula.rb +15 -0
  422. data/lib/chemicalml/cml/schema3/fragment.rb +13 -0
  423. data/lib/chemicalml/cml/schema3/fragment_list.rb +13 -0
  424. data/lib/chemicalml/cml/schema3/gradient.rb +13 -0
  425. data/lib/chemicalml/cml/schema3/identifier.rb +15 -0
  426. data/lib/chemicalml/cml/schema3/isotope.rb +13 -0
  427. data/lib/chemicalml/cml/schema3/isotope_list.rb +13 -0
  428. data/lib/chemicalml/cml/schema3/join.rb +13 -0
  429. data/lib/chemicalml/cml/schema3/kpoint.rb +13 -0
  430. data/lib/chemicalml/cml/schema3/kpoint_list.rb +13 -0
  431. data/lib/chemicalml/cml/schema3/label.rb +15 -0
  432. data/lib/chemicalml/cml/schema3/lattice.rb +13 -0
  433. data/lib/chemicalml/cml/schema3/lattice_vector.rb +13 -0
  434. data/lib/chemicalml/cml/schema3/length.rb +13 -0
  435. data/lib/chemicalml/cml/schema3/line3.rb +13 -0
  436. data/lib/chemicalml/cml/schema3/link.rb +13 -0
  437. data/lib/chemicalml/cml/schema3/list.rb +15 -0
  438. data/lib/chemicalml/cml/schema3/map.rb +13 -0
  439. data/lib/chemicalml/cml/schema3/matrix.rb +15 -0
  440. data/lib/chemicalml/cml/schema3/mechanism.rb +13 -0
  441. data/lib/chemicalml/cml/schema3/mechanism_component.rb +13 -0
  442. data/lib/chemicalml/cml/schema3/metadata.rb +15 -0
  443. data/lib/chemicalml/cml/schema3/metadata_list.rb +15 -0
  444. data/lib/chemicalml/cml/schema3/molecule.rb +15 -0
  445. data/lib/chemicalml/cml/schema3/molecule_list.rb +13 -0
  446. data/lib/chemicalml/cml/schema3/name.rb +15 -0
  447. data/lib/chemicalml/cml/schema3/object.rb +13 -0
  448. data/lib/chemicalml/cml/schema3/observation.rb +13 -0
  449. data/lib/chemicalml/cml/schema3/parameter.rb +15 -0
  450. data/lib/chemicalml/cml/schema3/parameter_list.rb +15 -0
  451. data/lib/chemicalml/cml/schema3/particle.rb +13 -0
  452. data/lib/chemicalml/cml/schema3/peak.rb +13 -0
  453. data/lib/chemicalml/cml/schema3/peak_group.rb +13 -0
  454. data/lib/chemicalml/cml/schema3/peak_list.rb +13 -0
  455. data/lib/chemicalml/cml/schema3/peak_structure.rb +13 -0
  456. data/lib/chemicalml/cml/schema3/plane3.rb +13 -0
  457. data/lib/chemicalml/cml/schema3/point3.rb +13 -0
  458. data/lib/chemicalml/cml/schema3/potential.rb +13 -0
  459. data/lib/chemicalml/cml/schema3/potential_form.rb +13 -0
  460. data/lib/chemicalml/cml/schema3/potential_list.rb +13 -0
  461. data/lib/chemicalml/cml/schema3/product.rb +15 -0
  462. data/lib/chemicalml/cml/schema3/product_list.rb +15 -0
  463. data/lib/chemicalml/cml/schema3/property.rb +15 -0
  464. data/lib/chemicalml/cml/schema3/property_list.rb +15 -0
  465. data/lib/chemicalml/cml/schema3/reactant.rb +15 -0
  466. data/lib/chemicalml/cml/schema3/reactant_list.rb +15 -0
  467. data/lib/chemicalml/cml/schema3/reaction.rb +15 -0
  468. data/lib/chemicalml/cml/schema3/reaction_list.rb +15 -0
  469. data/lib/chemicalml/cml/schema3/reaction_scheme.rb +13 -0
  470. data/lib/chemicalml/cml/schema3/reaction_step.rb +13 -0
  471. data/lib/chemicalml/cml/schema3/reaction_step_list.rb +13 -0
  472. data/lib/chemicalml/cml/schema3/reactive_centre.rb +13 -0
  473. data/lib/chemicalml/cml/schema3/region.rb +13 -0
  474. data/lib/chemicalml/cml/schema3/sample.rb +13 -0
  475. data/lib/chemicalml/cml/schema3/scalar.rb +15 -0
  476. data/lib/chemicalml/cml/schema3/spectator.rb +13 -0
  477. data/lib/chemicalml/cml/schema3/spectator_list.rb +13 -0
  478. data/lib/chemicalml/cml/schema3/spectrum.rb +13 -0
  479. data/lib/chemicalml/cml/schema3/spectrum_data.rb +13 -0
  480. data/lib/chemicalml/cml/schema3/spectrum_list.rb +13 -0
  481. data/lib/chemicalml/cml/schema3/sphere3.rb +13 -0
  482. data/lib/chemicalml/cml/schema3/stmml.rb +13 -0
  483. data/lib/chemicalml/cml/schema3/substance.rb +15 -0
  484. data/lib/chemicalml/cml/schema3/substance_list.rb +13 -0
  485. data/lib/chemicalml/cml/schema3/symmetry.rb +13 -0
  486. data/lib/chemicalml/cml/schema3/system.rb +13 -0
  487. data/lib/chemicalml/cml/schema3/table.rb +13 -0
  488. data/lib/chemicalml/cml/schema3/table_cell.rb +13 -0
  489. data/lib/chemicalml/cml/schema3/table_content.rb +13 -0
  490. data/lib/chemicalml/cml/schema3/table_header.rb +13 -0
  491. data/lib/chemicalml/cml/schema3/table_header_cell.rb +13 -0
  492. data/lib/chemicalml/cml/schema3/table_row.rb +13 -0
  493. data/lib/chemicalml/cml/schema3/table_row_list.rb +13 -0
  494. data/lib/chemicalml/cml/schema3/torsion.rb +13 -0
  495. data/lib/chemicalml/cml/schema3/transform3.rb +13 -0
  496. data/lib/chemicalml/cml/schema3/transition_state.rb +13 -0
  497. data/lib/chemicalml/cml/schema3/unit.rb +15 -0
  498. data/lib/chemicalml/cml/schema3/unit_list.rb +15 -0
  499. data/lib/chemicalml/cml/schema3/unit_type.rb +15 -0
  500. data/lib/chemicalml/cml/schema3/unit_type_list.rb +15 -0
  501. data/lib/chemicalml/cml/schema3/vector3.rb +13 -0
  502. data/lib/chemicalml/cml/schema3/xaxis.rb +13 -0
  503. data/lib/chemicalml/cml/schema3/yaxis.rb +13 -0
  504. data/lib/chemicalml/cml/schema3/z_matrix.rb +13 -0
  505. data/lib/chemicalml/cml/schema3.rb +132 -17
  506. data/lib/chemicalml/cml/translator/value_translations.rb +40 -35
  507. data/lib/chemicalml/cml/translator.rb +319 -68
  508. data/lib/chemicalml/cml/wire_class_registry.rb +42 -0
  509. data/lib/chemicalml/cml.rb +138 -44
  510. data/lib/chemicalml/convention/molecular/constraints/atom_coordinates_must_be_paired.rb +32 -0
  511. data/lib/chemicalml/convention/molecular/constraints/atom_id_must_match_pattern.rb +26 -0
  512. data/lib/chemicalml/convention/molecular/constraints/atom_must_have_element_type.rb +20 -0
  513. data/lib/chemicalml/convention/molecular/constraints/atom_must_have_id.rb +20 -0
  514. data/lib/chemicalml/convention/molecular/constraints/bond_must_have_atom_refs2.rb +20 -0
  515. data/lib/chemicalml/convention/molecular/constraints/bond_must_have_order.rb +20 -0
  516. data/lib/chemicalml/convention/molecular/constraints/bond_order_should_not_be_numeric.rb +27 -0
  517. data/lib/chemicalml/convention/molecular/constraints/molecule_must_have_id.rb +20 -0
  518. data/lib/chemicalml/convention/molecular/constraints/property_must_have_dict_ref.rb +20 -0
  519. data/lib/chemicalml/convention/molecular/constraints/scalar_must_have_data_type.rb +20 -0
  520. data/lib/chemicalml/convention/molecular/constraints.rb +20 -3
  521. data/lib/chemicalml/convention/molecular.rb +10 -0
  522. data/lib/chemicalml/model/atom.rb +28 -4
  523. data/lib/chemicalml/model/atom_parity.rb +21 -0
  524. data/lib/chemicalml/model/bond.rb +9 -3
  525. data/lib/chemicalml/model/bond_stereo.rb +29 -0
  526. data/lib/chemicalml/model/molecule.rb +13 -6
  527. data/lib/chemicalml/model.rb +2 -0
  528. data/lib/chemicalml/version.rb +1 -1
  529. data/lib/chemicalml/versioned_parser.rb +53 -12
  530. data/lib/chemicalml.rb +3 -1
  531. metadata +476 -40
  532. data/lib/chemicalml/cml/array.rb +0 -10
  533. data/lib/chemicalml/cml/atom.rb +0 -10
  534. data/lib/chemicalml/cml/atom_array.rb +0 -10
  535. data/lib/chemicalml/cml/atom_parity.rb +0 -10
  536. data/lib/chemicalml/cml/bond.rb +0 -10
  537. data/lib/chemicalml/cml/bond_array.rb +0 -10
  538. data/lib/chemicalml/cml/bond_stereo.rb +0 -10
  539. data/lib/chemicalml/cml/cml_module.rb +0 -10
  540. data/lib/chemicalml/cml/dictionary.rb +0 -10
  541. data/lib/chemicalml/cml/dictionary_entry.rb +0 -10
  542. data/lib/chemicalml/cml/document.rb +0 -10
  543. data/lib/chemicalml/cml/formula.rb +0 -10
  544. data/lib/chemicalml/cml/identifier.rb +0 -10
  545. data/lib/chemicalml/cml/label.rb +0 -10
  546. data/lib/chemicalml/cml/list.rb +0 -10
  547. data/lib/chemicalml/cml/matrix.rb +0 -10
  548. data/lib/chemicalml/cml/metadata.rb +0 -10
  549. data/lib/chemicalml/cml/metadata_list.rb +0 -10
  550. data/lib/chemicalml/cml/molecule.rb +0 -10
  551. data/lib/chemicalml/cml/name.rb +0 -10
  552. data/lib/chemicalml/cml/parameter.rb +0 -10
  553. data/lib/chemicalml/cml/parameter_list.rb +0 -10
  554. data/lib/chemicalml/cml/product.rb +0 -10
  555. data/lib/chemicalml/cml/product_list.rb +0 -10
  556. data/lib/chemicalml/cml/property.rb +0 -10
  557. data/lib/chemicalml/cml/property_list.rb +0 -10
  558. data/lib/chemicalml/cml/reactant.rb +0 -10
  559. data/lib/chemicalml/cml/reactant_list.rb +0 -10
  560. data/lib/chemicalml/cml/reaction.rb +0 -10
  561. data/lib/chemicalml/cml/reaction_list.rb +0 -10
  562. data/lib/chemicalml/cml/scalar.rb +0 -10
  563. data/lib/chemicalml/cml/substance.rb +0 -10
  564. data/lib/chemicalml/cml/unit.rb +0 -10
  565. data/lib/chemicalml/cml/unit_list.rb +0 -10
  566. data/lib/chemicalml/cml/unit_type.rb +0 -10
  567. data/lib/chemicalml/cml/unit_type_list.rb +0 -10
  568. data/lib/chemicalml/cml/wire_class_macro.rb +0 -45
@@ -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,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
@@ -0,0 +1,50 @@
1
+ # TODO.align (round 11)
2
+
3
+ Full CML schema coverage: every element from the XSD now has wire
4
+ classes across Base, Role, Schema3, Schema24, and the Cml alias
5
+ namespace.
6
+
7
+ | # | Workstream | Status |
8
+ |---|---|---|
9
+ | 41 | Full CML element coverage (all 121 XSD elements) | complete |
10
+ | 42 | Final spec + lint pass | complete |
11
+
12
+ ## What was added
13
+
14
+ 85 new CML elements, each with 4 generated files (Base mixin, Role
15
+ module, Schema3 class, Schema24 class) + autoload declarations +
16
+ Elements::ALL entry. The gem now covers every element defined in the
17
+ CML Schema 3 XSD.
18
+
19
+ ### New element categories
20
+
21
+ - **Geometry**: crystal, lattice, latticeVector, cellParameter,
22
+ zMatrix, line3, plane3, point3, sphere3, transform3, vector3,
23
+ angle, length, torsion
24
+ - **Spectroscopy**: spectrum, spectrumData, spectrumList, peak,
25
+ peakGroup, peakList, peakStructure, xaxis, yaxis
26
+ - **Reactions**: reactionScheme, reactionStep, reactionStepList,
27
+ reactiveCentre, transitionState, mechanism, mechanismComponent,
28
+ spectator, spectatorList, moleculeList, substanceList
29
+ - **Electronic structure**: electron, atomicBasisFunction, eigen,
30
+ gradient, band, bandList, basisSet, kpoint, kpointList
31
+ - **Sets / types**: atomSet, atomType, atomTypeList, bondSet,
32
+ bondType, bondTypeList
33
+ - **Containers**: conditionList, fragment, fragmentList, region,
34
+ sample, system, potential, potentialForm, potentialList
35
+ - **Documentation**: definition, description, documentation, dimension
36
+ - **Tables**: table, tableCell, tableContent, tableHeader,
37
+ tableHeaderCell, tableRow, tableRowList
38
+ - **Misc**: abundance, action, actionList, amount, anyCml, arrayList,
39
+ isotope, isotopeList, join, link, map, object, observation,
40
+ particle, stmml, symmetry
41
+
42
+ ### Metrics
43
+
44
+ - Elements::ALL: 121 entries (up from 36)
45
+ - Base mixins: 121
46
+ - Role modules: 121
47
+ - Schema3 classes: 121
48
+ - Schema24 classes: 120 (Module is schema3-only)
49
+ - 179 specs, 0 failures
50
+ - 0 forbidden patterns
@@ -0,0 +1,73 @@
1
+ # TODO.align (round 12)
2
+
3
+ Full CML schema coverage — parent-child wiring + remaining
4
+ dictionaries + universal root parsing.
5
+
6
+ | # | Workstream | Status |
7
+ |---|---|---|
8
+ | 42 | Wire parent-child relationships for 33 container elements | complete |
9
+ | 43 | Add cml, cml_name, cml_formula, cif dictionaries | complete |
10
+ | 44 | Universal root parsing (any element can be root) | complete |
11
+ | 45 | Full coverage spec (121 elements + 8 dictionaries) | complete |
12
+
13
+ ## What was added
14
+
15
+ ### Parent-child relationships (33 containers wired)
16
+
17
+ Every CML container element now declares its valid child elements.
18
+ Previously, parsing `<crystal><scalar>5.64</scalar></crystal>`
19
+ would silently drop the `<scalar>` child. Now it's preserved.
20
+
21
+ Wired containers include:
22
+ Molecule (crystal, spectrum, propertyList), Crystal (scalar,
23
+ lattice, symmetry), Lattice (latticeVector), Spectrum (xaxis,
24
+ yaxis, peakList, conditionList), PeakList (peak, peakGroup),
25
+ Reaction (spectatorList, conditionList, metadataList),
26
+ ReactionScheme, ReactionStepList, ReactionStep, ConditionList,
27
+ FragmentList, Fragment, IsotopeList, BandList, KpointList,
28
+ PotentialList, Table, TableContent, TableHeader, TableRow,
29
+ TableRowList, SpectatorList, MoleculeList, SubstanceList,
30
+ ActionList, AtomTypeList, BondTypeList, Mechanism, SpectrumList,
31
+ SpectrumData, BasisSet, System.
32
+
33
+ ### Remaining dictionaries (4 added)
34
+
35
+ - **cml.yaml** (23 entries) — fundamental chemistry concepts
36
+ (molmass, bp, mp, density, refractiveIndex, solubility,
37
+ vaporPressure, flashPoint, autoignitionTemp, pH, viscosity,
38
+ surfaceTension, dipoleMoment, polarizability, heatOfFormation,
39
+ entropy, freeEnergy, ionizationEnergy, electronAffinity,
40
+ electronegativity, bondEnergy, bondLength, bondAngle)
41
+ - **cml_name.yaml** (10 entries) — naming conventions (IUPAC,
42
+ trivial, CAS, InChI, InChIKey, SMILES, PubChem, ChemSpider,
43
+ DrugBank, ChEBI)
44
+ - **cml_formula.yaml** (7 entries) — formula conventions
45
+ (empirical, molecular, structural, condensed, Hill, SMILES,
46
+ LaTeX)
47
+ - **cif.yaml** (19 entries) — crystallography (cell lengths,
48
+ cell angles, cell volume, Z, crystal system, space group,
49
+ fractional coordinates, occupancy, B factor, radiation
50
+ wavelength, resolution)
51
+
52
+ ### Universal root parsing
53
+
54
+ The `KNOWN_ROOTS` hash is now a fallback, not the primary lookup.
55
+ `Chemicalml.parse(xml)` first checks KNOWN_ROOTS, then falls back
56
+ to `Elements::ALL` — making ANY CML element parseable as a root.
57
+ Adding a new element to `Elements::ALL` automatically makes it
58
+ parseable as a standalone document. OCP — no parse code changes
59
+ needed.
60
+
61
+ ### Total dictionary count: 8
62
+
63
+ compchem (51), cml (23), cml_name (10), cml_formula (7), cif (19),
64
+ unit_si (25), unit_non_si (13), unit_type (35) = 183 total entries.
65
+
66
+ ## Final metrics
67
+
68
+ - 188 examples, 0 failures
69
+ - 121 CML elements (full XSD coverage)
70
+ - 8 dictionaries (183 total entries)
71
+ - 33 container elements with child relationships wired
72
+ - Universal root parsing
73
+ - 0 forbidden patterns
@@ -0,0 +1,59 @@
1
+ # TODO.align (round 13)
2
+
3
+ Critical data-loss fix + missing unit types/units + convention
4
+ constraint expansion.
5
+
6
+ | # | Workstream | Status |
7
+ |---|---|---|
8
+ | 46 | Add atom coordinates (x2/y2/x3/y3/z3/xFract/yFract/zFract) | complete |
9
+ | 47 | Add missing unit types + units | complete |
10
+ | 48 | Add 5 molecular convention constraints | complete |
11
+ | 49 | Final spec + lint pass | complete |
12
+
13
+ ## Critical fix: Atom coordinates were silently dropped
14
+
15
+ The most important fix in this round: CML `<atom>` elements with
16
+ 2D coordinates (x2, y2), 3D coordinates (x3, y3, z3), or fractional
17
+ coordinates (xFract, yFract, zFract) were being silently dropped
18
+ during parsing. This affected virtually every real-world CML file
19
+ that contains molecular structures.
20
+
21
+ Fixed by:
22
+ - Adding x2, y2, x3, y3, z3, xFract, yFract, zFract attributes to
23
+ `Base::Atom` with `map_attribute` declarations.
24
+ - Adding matching fields to `Model::Atom` (canonical).
25
+ - Updating `atom_to_canonical` / `atom_from_canonical` translator
26
+ rules to carry the coordinates through.
27
+
28
+ Verified: parsing `methanol.cml` now correctly preserves
29
+ `x3="-0.713"` through both wire parse and canonical translation.
30
+
31
+ ## Missing unit types + units added
32
+
33
+ 4 unit types referenced by the new dictionaries but not defined:
34
+ density, viscosity, surfaceTension, entropy.
35
+
36
+ 10 non-SI units referenced but not defined:
37
+ g_cm3, Pa_s, N_m, D (debye), A3, kJ_mol, J_molK, eV,
38
+ angstrom2, angstrom3.
39
+
40
+ ## Convention constraints expanded
41
+
42
+ 5 new molecular convention constraints added:
43
+ - `AtomMustHaveId` — every atom must have an `id` attribute
44
+ - `AtomMustHaveElementType` — every atom must have `elementType`
45
+ - `BondMustHaveAtomRefs2` — every bond must have `atomRefs2`
46
+ - `BondMustHaveOrder` — every bond must have `order`
47
+ - `MoleculeMustHaveId` — every molecule must have `id`
48
+
49
+ Total molecular constraints: 8 (up from 3).
50
+
51
+ ## Final metrics
52
+
53
+ - 188 examples, 0 failures
54
+ - 121 CML elements (full XSD coverage)
55
+ - 8 dictionaries (193+ total entries)
56
+ - 8 molecular convention constraints
57
+ - 12 total convention constraints (across 5 conventions)
58
+ - Atom coordinates fully round-trip (2D, 3D, fractional)
59
+ - 0 forbidden patterns
@@ -0,0 +1,48 @@
1
+ # TODO.align (round 14)
2
+
3
+ Common attributes on original elements + performance fix + specs.
4
+
5
+ | # | Workstream | Status |
6
+ |---|---|---|
7
+ | 50 | Add dict_ref/convention/id/title to original elements | complete |
8
+ | 51 | O(1) VersionedParser root lookup | complete |
9
+ | 52 | Coordinate + constraint specs | complete |
10
+
11
+ ## Fixes
12
+
13
+ ### Missing common attributes on original elements
14
+
15
+ Three original Base mixins were missing common CML attributes that
16
+ the 85 generated elements have by default:
17
+
18
+ - **Base::Molecule**: added `dict_ref`, `convention`, `chirality`
19
+ with xml mappings. Without these, molecule-level dictRef
20
+ references and convention attributes were silently dropped.
21
+ - **Base::Document** (`<cml>`): added `id`, `title`, `dict_ref`,
22
+ `convention` with xml mappings. The root `<cml>` element can
23
+ carry these attributes per the CML schema.
24
+ - **Base::Reaction**: added `dict_ref`, `convention` with xml
25
+ mappings.
26
+
27
+ ### O(1) root element lookup
28
+
29
+ VersionedParser was using `Elements::ALL.find { |_, id| id.to_s == root }`
30
+ — O(121) linear search on every `parse()` call. Replaced with a
31
+ pre-built reverse index `Elements::XML_TO_CLASS` (frozen Hash)
32
+ giving O(1) lookup. Adding new elements to `Elements::ALL`
33
+ automatically updates the index.
34
+
35
+ ### New specs (9 examples)
36
+
37
+ - 5 coordinate round-trip specs: 3D (x3/y3/z3), 2D (x2/y2),
38
+ fractional (xFract/yFract/zFract), through wire → canonical → wire.
39
+ - 4 constraint violation specs: atom missing id, atom missing
40
+ elementType, bond missing atomRefs2, molecule missing id.
41
+
42
+ ## Final metrics
43
+
44
+ - **197 examples, 0 failures**
45
+ - 121 CML elements, 8 dictionaries, 12 convention constraints
46
+ - Atom coordinates fully round-trip
47
+ - O(1) root element dispatch
48
+ - 0 forbidden patterns