chemicalml 0.2.1 → 0.3.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 (347) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +23 -0
  3. data/CLAUDE.md +49 -1
  4. data/README.adoc +154 -26
  5. data/TODO.align/61-parallel-array-attrs.md +54 -0
  6. data/TODO.align/62-per-element-attribute-gaps.md +49 -0
  7. data/TODO.align/63-universal-children-mixin.md +42 -0
  8. data/TODO.align/64-per-element-child-gaps.md +81 -0
  9. data/TODO.align/65-simple-unit-convention.md +40 -0
  10. data/TODO.align/66-schema24-legacy-children.md +32 -0
  11. data/TODO.align/67-final-verification.md +32 -0
  12. data/TODO.align/68-detection-coverage.md +33 -0
  13. data/TODO.align/69-json-yaml-roundtrip.md +27 -0
  14. data/TODO.align/70-iterative-walker.md +40 -0
  15. data/TODO.align/71-violation-value.md +25 -0
  16. data/TODO.align/72-close-child-gaps.md +66 -0
  17. data/TODO.align/73-schema24-parse-limitation.md +64 -0
  18. data/TODO.align/74-final-verification-round18.md +15 -0
  19. data/TODO.align/75-key-value-mappings.md +43 -0
  20. data/TODO.align/76-schema24-workaround.md +57 -0
  21. data/TODO.align/77-convention-coverage-matrix.md +31 -0
  22. data/TODO.align/78-fixture-audit.md +23 -0
  23. data/TODO.align/79-final-verification-round19.md +15 -0
  24. data/TODO.align/80-xsd-enum-constants.md +35 -0
  25. data/TODO.align/81-enum-validation-constraints.md +29 -0
  26. data/TODO.align/82-reference-resolver.md +33 -0
  27. data/TODO.align/83-toml-roundtrip.md +20 -0
  28. data/TODO.align/84-final-verification-round21.md +16 -0
  29. data/TODO.align/85-bond-distinct-atoms.md +25 -0
  30. data/TODO.align/86-references-should-resolve.md +20 -0
  31. data/TODO.align/87-cli-utility.md +26 -0
  32. data/TODO.align/88-diverse-fixtures.md +26 -0
  33. data/TODO.align/89-final-verification-round22.md +15 -0
  34. data/TODO.align/90-bond-stereo-completeness.md +31 -0
  35. data/TODO.align/91-atomparity-distinct.md +21 -0
  36. data/TODO.align/92-unit-dictionary-completeness.md +28 -0
  37. data/TODO.align/93-yard-docs.md +23 -0
  38. data/TODO.align/94-final-verification-round23.md +15 -0
  39. data/TODO.align/README.round17.md +28 -0
  40. data/TODO.align/README.round18.md +37 -0
  41. data/TODO.align/README.round19.md +40 -0
  42. data/TODO.align/README.round20.md +49 -0
  43. data/TODO.align/README.round21.md +35 -0
  44. data/TODO.align/README.round22.md +48 -0
  45. data/TODO.align/README.round23.md +46 -0
  46. data/TODO.align/README.round24.md +53 -0
  47. data/TODO.align/README.round25.md +66 -0
  48. data/TODO.align/README.round26.md +55 -0
  49. data/TODO.align/README.round27.md +51 -0
  50. data/TODO.align/README.round28.md +61 -0
  51. data/TODO.align/README.round29.md +64 -0
  52. data/TODO.align/README.round30.md +50 -0
  53. data/TODO.align/README.round31.md +54 -0
  54. data/TODO.align/README.round32.md +67 -0
  55. data/TODO.align/README.round33.md +62 -0
  56. data/TODO.align/README.round34.md +70 -0
  57. data/docs/constraints.md +161 -0
  58. data/docs/generate_constraint_docs.rb +44 -0
  59. data/exe/chemicalml +6 -0
  60. data/lib/chemicalml/cli/base.rb +68 -0
  61. data/lib/chemicalml/cli/command.rb +43 -0
  62. data/lib/chemicalml/cli/constraints_command.rb +27 -0
  63. data/lib/chemicalml/cli/conventions_command.rb +14 -0
  64. data/lib/chemicalml/cli/dictionaries_command.rb +14 -0
  65. data/lib/chemicalml/cli/elements_command.rb +17 -0
  66. data/lib/chemicalml/cli/enums_command.rb +17 -0
  67. data/lib/chemicalml/cli/info_command.rb +77 -0
  68. data/lib/chemicalml/cli/inspect_command.rb +39 -0
  69. data/lib/chemicalml/cli/validate_command.rb +54 -0
  70. data/lib/chemicalml/cli.rb +43 -0
  71. data/lib/chemicalml/cml/base/abundance.rb +18 -8
  72. data/lib/chemicalml/cml/base/action.rb +34 -16
  73. data/lib/chemicalml/cml/base/action_list.rb +35 -17
  74. data/lib/chemicalml/cml/base/alternative.rb +13 -4
  75. data/lib/chemicalml/cml/base/amount.rb +14 -6
  76. data/lib/chemicalml/cml/base/angle.rb +28 -13
  77. data/lib/chemicalml/cml/base/annotation.rb +14 -6
  78. data/lib/chemicalml/cml/base/any_cml.rb +12 -5
  79. data/lib/chemicalml/cml/base/appinfo.rb +14 -6
  80. data/lib/chemicalml/cml/base/arg.rb +47 -13
  81. data/lib/chemicalml/cml/base/array.rb +40 -19
  82. data/lib/chemicalml/cml/base/array_list.rb +14 -6
  83. data/lib/chemicalml/cml/base/atom.rb +84 -28
  84. data/lib/chemicalml/cml/base/atom_array.rb +60 -23
  85. data/lib/chemicalml/cml/base/atom_parity.rb +14 -6
  86. data/lib/chemicalml/cml/base/atom_set.rb +14 -6
  87. data/lib/chemicalml/cml/base/atom_type.rb +25 -9
  88. data/lib/chemicalml/cml/base/atom_type_list.rb +22 -8
  89. data/lib/chemicalml/cml/base/atomic_basis_function.rb +33 -13
  90. data/lib/chemicalml/cml/base/band.rb +21 -8
  91. data/lib/chemicalml/cml/base/band_list.rb +15 -7
  92. data/lib/chemicalml/cml/base/basis_set.rb +24 -9
  93. data/lib/chemicalml/cml/base/bond.rb +36 -10
  94. data/lib/chemicalml/cml/base/bond_array.rb +34 -11
  95. data/lib/chemicalml/cml/base/bond_set.rb +14 -6
  96. data/lib/chemicalml/cml/base/bond_stereo.rb +20 -9
  97. data/lib/chemicalml/cml/base/bond_type.rb +23 -8
  98. data/lib/chemicalml/cml/base/bond_type_list.rb +22 -8
  99. data/lib/chemicalml/cml/base/cell_parameter.rb +28 -10
  100. data/lib/chemicalml/cml/base/cml_module.rb +36 -11
  101. data/lib/chemicalml/cml/base/common_children.rb +35 -0
  102. data/lib/chemicalml/cml/base/complex_object.rb +12 -5
  103. data/lib/chemicalml/cml/base/condition_list.rb +26 -10
  104. data/lib/chemicalml/cml/base/crystal.rb +26 -10
  105. data/lib/chemicalml/cml/base/definition.rb +12 -5
  106. data/lib/chemicalml/cml/base/description.rb +14 -6
  107. data/lib/chemicalml/cml/base/dictionary.rb +27 -10
  108. data/lib/chemicalml/cml/base/dictionary_entry.rb +67 -8
  109. data/lib/chemicalml/cml/base/dimension.rb +26 -12
  110. data/lib/chemicalml/cml/base/document.rb +18 -8
  111. data/lib/chemicalml/cml/base/documentation.rb +12 -5
  112. data/lib/chemicalml/cml/base/eigen.rb +32 -8
  113. data/lib/chemicalml/cml/base/electron.rb +26 -12
  114. data/lib/chemicalml/cml/base/enumeration.rb +16 -7
  115. data/lib/chemicalml/cml/base/expression.rb +21 -6
  116. data/lib/chemicalml/cml/base/float.rb +22 -10
  117. data/lib/chemicalml/cml/base/float_array.rb +24 -11
  118. data/lib/chemicalml/cml/base/formula.rb +31 -10
  119. data/lib/chemicalml/cml/base/fragment.rb +30 -12
  120. data/lib/chemicalml/cml/base/fragment_list.rb +24 -9
  121. data/lib/chemicalml/cml/base/gradient.rb +19 -6
  122. data/lib/chemicalml/cml/base/identifier.rb +18 -8
  123. data/lib/chemicalml/cml/base/integer.rb +22 -10
  124. data/lib/chemicalml/cml/base/integer_array.rb +24 -11
  125. data/lib/chemicalml/cml/base/isotope.rb +28 -9
  126. data/lib/chemicalml/cml/base/isotope_list.rb +17 -8
  127. data/lib/chemicalml/cml/base/join.rb +25 -9
  128. data/lib/chemicalml/cml/base/kpoint.rb +16 -7
  129. data/lib/chemicalml/cml/base/kpoint_list.rb +15 -7
  130. data/lib/chemicalml/cml/base/label.rb +14 -6
  131. data/lib/chemicalml/cml/base/lattice.rb +35 -10
  132. data/lib/chemicalml/cml/base/lattice_vector.rb +16 -7
  133. data/lib/chemicalml/cml/base/length.rb +26 -12
  134. data/lib/chemicalml/cml/base/line3.rb +18 -8
  135. data/lib/chemicalml/cml/base/link.rb +41 -20
  136. data/lib/chemicalml/cml/base/list.rb +22 -10
  137. data/lib/chemicalml/cml/base/map.rb +32 -11
  138. data/lib/chemicalml/cml/base/matrix.rb +32 -15
  139. data/lib/chemicalml/cml/base/mechanism.rb +20 -7
  140. data/lib/chemicalml/cml/base/mechanism_component.rb +14 -6
  141. data/lib/chemicalml/cml/base/metadata.rb +18 -8
  142. data/lib/chemicalml/cml/base/metadata_list.rb +27 -8
  143. data/lib/chemicalml/cml/base/molecule.rb +90 -26
  144. data/lib/chemicalml/cml/base/molecule_list.rb +26 -8
  145. data/lib/chemicalml/cml/base/name.rb +10 -4
  146. data/lib/chemicalml/cml/base/object.rb +18 -8
  147. data/lib/chemicalml/cml/base/observation.rb +16 -7
  148. data/lib/chemicalml/cml/base/operator.rb +14 -6
  149. data/lib/chemicalml/cml/base/parameter.rb +33 -13
  150. data/lib/chemicalml/cml/base/parameter_list.rb +27 -8
  151. data/lib/chemicalml/cml/base/particle.rb +20 -9
  152. data/lib/chemicalml/cml/base/peak.rb +71 -26
  153. data/lib/chemicalml/cml/base/peak_group.rb +62 -26
  154. data/lib/chemicalml/cml/base/peak_list.rb +24 -9
  155. data/lib/chemicalml/cml/base/peak_structure.rb +40 -13
  156. data/lib/chemicalml/cml/base/plane3.rb +14 -6
  157. data/lib/chemicalml/cml/base/point3.rb +14 -6
  158. data/lib/chemicalml/cml/base/potential.rb +17 -6
  159. data/lib/chemicalml/cml/base/potential_form.rb +30 -7
  160. data/lib/chemicalml/cml/base/potential_list.rb +15 -7
  161. data/lib/chemicalml/cml/base/product.rb +45 -10
  162. data/lib/chemicalml/cml/base/product_list.rb +29 -9
  163. data/lib/chemicalml/cml/base/property.rb +29 -11
  164. data/lib/chemicalml/cml/base/property_list.rb +23 -8
  165. data/lib/chemicalml/cml/base/reactant.rb +45 -10
  166. data/lib/chemicalml/cml/base/reactant_list.rb +29 -9
  167. data/lib/chemicalml/cml/base/reaction.rb +74 -20
  168. data/lib/chemicalml/cml/base/reaction_list.rb +23 -8
  169. data/lib/chemicalml/cml/base/reaction_scheme.rb +43 -13
  170. data/lib/chemicalml/cml/base/reaction_step.rb +30 -12
  171. data/lib/chemicalml/cml/base/reaction_step_list.rb +30 -11
  172. data/lib/chemicalml/cml/base/reactive_centre.rb +31 -6
  173. data/lib/chemicalml/cml/base/region.rb +20 -9
  174. data/lib/chemicalml/cml/base/related_entry.rb +11 -3
  175. data/lib/chemicalml/cml/base/sample.rb +30 -7
  176. data/lib/chemicalml/cml/base/scalar.rb +32 -15
  177. data/lib/chemicalml/cml/base/spectator.rb +25 -6
  178. data/lib/chemicalml/cml/base/spectator_list.rb +20 -7
  179. data/lib/chemicalml/cml/base/spectrum.rb +57 -18
  180. data/lib/chemicalml/cml/base/spectrum_data.rb +19 -9
  181. data/lib/chemicalml/cml/base/spectrum_list.rb +28 -9
  182. data/lib/chemicalml/cml/base/sphere3.rb +14 -6
  183. data/lib/chemicalml/cml/base/stmml.rb +12 -5
  184. data/lib/chemicalml/cml/base/string.rb +14 -6
  185. data/lib/chemicalml/cml/base/string_array.rb +22 -10
  186. data/lib/chemicalml/cml/base/substance.rb +36 -14
  187. data/lib/chemicalml/cml/base/substance_list.rb +29 -10
  188. data/lib/chemicalml/cml/base/symmetry.rb +31 -9
  189. data/lib/chemicalml/cml/base/system.rb +21 -10
  190. data/lib/chemicalml/cml/base/table.rb +38 -13
  191. data/lib/chemicalml/cml/base/table_cell.rb +12 -5
  192. data/lib/chemicalml/cml/base/table_content.rb +19 -9
  193. data/lib/chemicalml/cml/base/table_header.rb +15 -7
  194. data/lib/chemicalml/cml/base/table_header_cell.rb +22 -10
  195. data/lib/chemicalml/cml/base/table_row.rb +15 -7
  196. data/lib/chemicalml/cml/base/table_row_list.rb +15 -7
  197. data/lib/chemicalml/cml/base/tcell.rb +16 -7
  198. data/lib/chemicalml/cml/base/torsion.rb +28 -13
  199. data/lib/chemicalml/cml/base/transform3.rb +12 -5
  200. data/lib/chemicalml/cml/base/transition_state.rb +23 -5
  201. data/lib/chemicalml/cml/base/trow.rb +22 -6
  202. data/lib/chemicalml/cml/base/unit.rb +39 -16
  203. data/lib/chemicalml/cml/base/unit_list.rb +34 -12
  204. data/lib/chemicalml/cml/base/unit_type.rb +27 -10
  205. data/lib/chemicalml/cml/base/unit_type_list.rb +29 -11
  206. data/lib/chemicalml/cml/base/vector3.rb +14 -6
  207. data/lib/chemicalml/cml/base/xaxis.rb +30 -10
  208. data/lib/chemicalml/cml/base/yaxis.rb +30 -10
  209. data/lib/chemicalml/cml/base/z_matrix.rb +26 -5
  210. data/lib/chemicalml/cml/base.rb +139 -138
  211. data/lib/chemicalml/cml/canonical_comparison.rb +54 -0
  212. data/lib/chemicalml/cml/elements.rb +145 -136
  213. data/lib/chemicalml/cml/enums.rb +55 -0
  214. data/lib/chemicalml/cml/namespace.rb +2 -3
  215. data/lib/chemicalml/cml/patterns.rb +33 -0
  216. data/lib/chemicalml/cml/reference_resolver.rb +137 -0
  217. data/lib/chemicalml/cml/role.rb +138 -138
  218. data/lib/chemicalml/cml/schema24/configuration.rb +11 -1
  219. data/lib/chemicalml/cml/schema24.rb +139 -139
  220. data/lib/chemicalml/cml/schema3.rb +123 -123
  221. data/lib/chemicalml/cml/visitable.rb +77 -3
  222. data/lib/chemicalml/cml/wire_class_registry.rb +3 -3
  223. data/lib/chemicalml/cml.rb +163 -129
  224. data/lib/chemicalml/context_configuration.rb +4 -2
  225. data/lib/chemicalml/convention/cascade/constraints/reaction_scheme_must_have_content.rb +33 -0
  226. data/lib/chemicalml/convention/cascade/constraints/reaction_step_list_must_contain_steps.rb +31 -0
  227. data/lib/chemicalml/convention/cascade/constraints/reaction_step_must_have_reaction_or_lists.rb +33 -0
  228. data/lib/chemicalml/convention/cascade/constraints/reactive_centre_atom_refs_should_be_present.rb +34 -0
  229. data/lib/chemicalml/convention/cascade/constraints.rb +18 -0
  230. data/lib/chemicalml/convention/cascade.rb +43 -0
  231. data/lib/chemicalml/convention/compchem/constraints/array_rules.rb +1 -1
  232. data/lib/chemicalml/convention/compchem/constraints/calculation_requires_finalization.rb +1 -1
  233. data/lib/chemicalml/convention/compchem/constraints/compchem_module_must_contain_job_list.rb +2 -1
  234. data/lib/chemicalml/convention/compchem/constraints/environment_at_most_one_property_list.rb +1 -1
  235. data/lib/chemicalml/convention/compchem/constraints/environment_must_not_contain_parameter.rb +1 -1
  236. data/lib/chemicalml/convention/compchem/constraints/finalization_at_most_one_molecule.rb +1 -1
  237. data/lib/chemicalml/convention/compchem/constraints/finalization_at_most_one_property_list.rb +1 -1
  238. data/lib/chemicalml/convention/compchem/constraints/finalization_must_have_content.rb +44 -0
  239. data/lib/chemicalml/convention/compchem/constraints/finalization_must_not_contain_parameter.rb +1 -1
  240. data/lib/chemicalml/convention/compchem/constraints/initialization_at_most_one_molecule.rb +1 -1
  241. data/lib/chemicalml/convention/compchem/constraints/initialization_at_most_one_parameter_list.rb +1 -1
  242. data/lib/chemicalml/convention/compchem/constraints/initialization_must_have_content.rb +54 -0
  243. data/lib/chemicalml/convention/compchem/constraints/initialization_must_not_contain_property.rb +1 -1
  244. data/lib/chemicalml/convention/compchem/constraints/job_list_module_must_have_id.rb +1 -0
  245. data/lib/chemicalml/convention/compchem/constraints/job_module_at_most_one_environment.rb +1 -1
  246. data/lib/chemicalml/convention/compchem/constraints/job_module_at_most_one_finalization.rb +1 -1
  247. data/lib/chemicalml/convention/compchem/constraints/job_module_must_have_id.rb +1 -0
  248. data/lib/chemicalml/convention/compchem/constraints/job_must_contain_initialization.rb +1 -0
  249. data/lib/chemicalml/convention/compchem/constraints/matrix_rules.rb +1 -1
  250. data/lib/chemicalml/convention/compchem/constraints/scalar_units.rb +1 -1
  251. data/lib/chemicalml/convention/compchem/constraints.rb +4 -0
  252. data/lib/chemicalml/convention/compchem.rb +4 -2
  253. data/lib/chemicalml/convention/constraint.rb +40 -9
  254. data/lib/chemicalml/convention/coordinator.rb +4 -3
  255. data/lib/chemicalml/convention/detection.rb +10 -4
  256. data/lib/chemicalml/convention/dictionary/constraints/dictionary_must_have_namespace.rb +1 -0
  257. data/lib/chemicalml/convention/dictionary/constraints/dictionary_namespace_should_end_with_slash_or_hash.rb +1 -1
  258. data/lib/chemicalml/convention/dictionary/constraints/entry_id_must_match_pattern.rb +1 -1
  259. data/lib/chemicalml/convention/dictionary/constraints/entry_ids_unique_within_dictionary.rb +1 -1
  260. data/lib/chemicalml/convention/dictionary/constraints/entry_must_contain_definition.rb +1 -0
  261. data/lib/chemicalml/convention/dictionary/constraints/entry_must_have_id_and_term.rb +1 -1
  262. data/lib/chemicalml/convention/dictionary/constraints/entry_must_have_unit_type.rb +1 -0
  263. data/lib/chemicalml/convention/dictionary/constraints/entry_units_co_constraints.rb +1 -1
  264. data/lib/chemicalml/convention/dictionary/constraints.rb +8 -8
  265. data/lib/chemicalml/convention/dictionary.rb +2 -2
  266. data/lib/chemicalml/convention/molecular/constraints/atom_array_must_be_child_of_molecule_or_formula.rb +1 -0
  267. data/lib/chemicalml/convention/molecular/constraints/atom_array_must_contain_atoms.rb +15 -6
  268. data/lib/chemicalml/convention/molecular/constraints/atom_coordinates_must_be_paired.rb +1 -1
  269. data/lib/chemicalml/convention/molecular/constraints/atom_element_type_should_be_in_periodic_table.rb +39 -0
  270. data/lib/chemicalml/convention/molecular/constraints/atom_id_must_match_pattern.rb +3 -2
  271. data/lib/chemicalml/convention/molecular/constraints/atom_ids_unique_within_molecule.rb +1 -0
  272. data/lib/chemicalml/convention/molecular/constraints/atom_must_have_element_type.rb +1 -1
  273. data/lib/chemicalml/convention/molecular/constraints/atom_must_have_id.rb +2 -1
  274. data/lib/chemicalml/convention/molecular/constraints/atom_parity_atom_refs4_should_be_distinct.rb +44 -0
  275. data/lib/chemicalml/convention/molecular/constraints/atom_parity_should_include_parent_atom.rb +65 -0
  276. data/lib/chemicalml/convention/molecular/constraints/bond_array_must_be_child_of_molecule.rb +1 -0
  277. data/lib/chemicalml/convention/molecular/constraints/bond_atom_refs2_should_be_distinct.rb +44 -0
  278. data/lib/chemicalml/convention/molecular/constraints/bond_id_should_match_pattern.rb +38 -0
  279. data/lib/chemicalml/convention/molecular/constraints/bond_ids_unique_within_molecule.rb +1 -0
  280. data/lib/chemicalml/convention/molecular/constraints/bond_must_have_atom_refs2.rb +1 -1
  281. data/lib/chemicalml/convention/molecular/constraints/bond_must_have_order.rb +2 -1
  282. data/lib/chemicalml/convention/molecular/constraints/bond_must_reference_atoms_in_same_molecule.rb +1 -0
  283. data/lib/chemicalml/convention/molecular/constraints/bond_order_other_must_have_dict_ref.rb +1 -0
  284. data/lib/chemicalml/convention/molecular/constraints/bond_order_should_be_in_enum.rb +39 -0
  285. data/lib/chemicalml/convention/molecular/constraints/bond_order_should_not_be_numeric.rb +1 -1
  286. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_atom_refs4_should_be_distinct.rb +43 -0
  287. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_cis_trans_must_have_atom_refs4.rb +1 -1
  288. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_other_must_have_dict_ref.rb +1 -0
  289. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_should_be_in_enum.rb +38 -0
  290. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_wedge_hash_must_have_atom_refs2.rb +1 -1
  291. data/lib/chemicalml/convention/molecular/constraints/dict_ref_should_resolve.rb +59 -0
  292. data/lib/chemicalml/convention/molecular/constraints/molecule_atom_array_mutually_exclusive_with_children.rb +1 -0
  293. data/lib/chemicalml/convention/molecular/constraints/molecule_bond_array_mutually_exclusive_with_children.rb +1 -0
  294. data/lib/chemicalml/convention/molecular/constraints/molecule_chirality_should_be_in_enum.rb +38 -0
  295. data/lib/chemicalml/convention/molecular/constraints/molecule_count_must_not_appear_on_top_level.rb +1 -0
  296. data/lib/chemicalml/convention/molecular/constraints/molecule_id_should_match_pattern.rb +38 -0
  297. data/lib/chemicalml/convention/molecular/constraints/molecule_must_have_id.rb +1 -1
  298. data/lib/chemicalml/convention/molecular/constraints/property_must_have_dict_ref.rb +1 -1
  299. data/lib/chemicalml/convention/molecular/constraints/property_scalar_data_type_matches_dictionary.rb +58 -0
  300. data/lib/chemicalml/convention/molecular/constraints/references_should_resolve.rb +37 -0
  301. data/lib/chemicalml/convention/molecular/constraints/scalar_must_have_data_type.rb +1 -1
  302. data/lib/chemicalml/convention/molecular/constraints.rb +49 -23
  303. data/lib/chemicalml/convention/molecular.rb +15 -2
  304. data/lib/chemicalml/convention/registry.rb +79 -11
  305. data/lib/chemicalml/convention/simple_unit/constraints/root_must_be_unit_list.rb +24 -0
  306. data/lib/chemicalml/convention/simple_unit/constraints/unit_must_have_power.rb +32 -0
  307. data/lib/chemicalml/convention/simple_unit/constraints/unit_must_have_symbol.rb +31 -0
  308. data/lib/chemicalml/convention/simple_unit/constraints.rb +16 -0
  309. data/lib/chemicalml/convention/simple_unit.rb +37 -0
  310. data/lib/chemicalml/convention/spectroscopy/constraints/peak_list_must_contain_peaks.rb +31 -0
  311. data/lib/chemicalml/convention/spectroscopy/constraints/peak_should_have_values.rb +34 -0
  312. data/lib/chemicalml/convention/spectroscopy/constraints/spectrum_must_have_content.rb +31 -0
  313. data/lib/chemicalml/convention/spectroscopy/constraints/spectrum_must_have_convention.rb +32 -0
  314. data/lib/chemicalml/convention/spectroscopy/constraints/spectrum_must_have_format.rb +31 -0
  315. data/lib/chemicalml/convention/spectroscopy/constraints.rb +20 -0
  316. data/lib/chemicalml/convention/spectroscopy.rb +41 -0
  317. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_list_must_contain_at_least_one_unit.rb +1 -0
  318. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_list_must_have_namespace.rb +1 -1
  319. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_contain_definition.rb +1 -0
  320. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_id.rb +1 -0
  321. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_multiplier_or_constant_to_si.rb +34 -0
  322. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_parent_si.rb +32 -0
  323. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_symbol_and_unit_type.rb +1 -1
  324. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_title.rb +32 -0
  325. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_parent_si_should_resolve.rb +45 -0
  326. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_unit_type_should_resolve.rb +46 -0
  327. data/lib/chemicalml/convention/unit_dictionary/constraints.rb +10 -0
  328. data/lib/chemicalml/convention/unit_dictionary.rb +7 -2
  329. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_id_must_match_pattern.rb +1 -1
  330. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_list_must_contain_at_least_one_unit_type.rb +1 -0
  331. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_list_must_have_namespace.rb +1 -1
  332. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_must_contain_definition.rb +1 -0
  333. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_must_have_id_and_name.rb +1 -1
  334. data/lib/chemicalml/convention/unit_type_dictionary.rb +2 -2
  335. data/lib/chemicalml/convention/validation_report.rb +30 -3
  336. data/lib/chemicalml/convention/violation.rb +9 -3
  337. data/lib/chemicalml/convention.rb +41 -14
  338. data/lib/chemicalml/dictionary.rb +13 -9
  339. data/lib/chemicalml/logger.rb +47 -0
  340. data/lib/chemicalml/schema/definition.rb +2 -2
  341. data/lib/chemicalml/schema.rb +7 -7
  342. data/lib/chemicalml/version.rb +1 -1
  343. data/lib/chemicalml/versioned_parser.rb +10 -10
  344. data/lib/chemicalml.rb +78 -15
  345. data/lib/tasks/reference_fetch.rake +30 -31
  346. data/lib/tasks/scrape_fixtures.rake +23 -24
  347. metadata +114 -3
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "chemicalml"
4
+
5
+ # Auto-generated documentation of every registered convention
6
+ # constraint. Run via `bundle exec rake docs:constraints` or
7
+ # `bundle exec ruby docs/generate_constraint_docs.rb`.
8
+ #
9
+ # Single source of truth: derived from `Convention::Registry.each_constraint`.
10
+ # Do not edit `docs/constraints.md` by hand — regenerate.
11
+
12
+ output = []
13
+ output << "# Registered Convention Constraints"
14
+ output << ""
15
+ output << "Auto-generated from `Chemicalml::Convention::Registry.each_constraint`."
16
+ output << "Last regenerated: #{Time.now.utc.iso8601}."
17
+ output << ""
18
+ output << "Total constraints: **#{Chemicalml::Convention::Registry.total_constraint_count}**"
19
+ output << ""
20
+
21
+ Chemicalml::Convention::Registry.each do |conv|
22
+ output << "## #{conv.qname}"
23
+ output << ""
24
+ output << "- **Namespace**: `#{conv.namespace_uri}`"
25
+ output << "- **Constraint count**: #{conv.constraint_count}"
26
+ output << ""
27
+
28
+ output << "| Constraint | Applies to | Description |"
29
+ output << "|---|---|---|"
30
+ conv.constraints.each do |klass|
31
+ name = klass.name.split("::").last
32
+ roles = klass.applies_to_roles
33
+ applies = roles.nil? ? "_(document-wide)_" : roles.map { |r| r.name.split("::").last }.join(", ")
34
+ desc = klass.description
35
+ desc = "" if desc == name
36
+ desc_escaped = desc.gsub("|", "\\|")
37
+ output << "| `#{name}` | #{applies} | #{desc_escaped} |"
38
+ end
39
+ output << ""
40
+ end
41
+
42
+ path = File.expand_path("constraints.md", __dir__)
43
+ File.write(path, output.join("\n"))
44
+ puts "Wrote #{path} (#{Chemicalml::Convention::Registry.total_constraint_count} constraints)"
data/exe/chemicalml ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift(File.expand_path("../lib", __dir__))
5
+ require "chemicalml"
6
+ exit Chemicalml::Cli.run(ARGV)
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+
5
+ module Chemicalml
6
+ module Cli
7
+ # Thor-based dispatcher. Each command delegates to a dedicated
8
+ # `Chemicalml::Cli::*Command` class invoked as
9
+ # `MyCommand.new.run(options)`, where `options` is a single hash
10
+ # carrying both positional args (keyed by name) and flags.
11
+ #
12
+ # A `Chemicalml::Logger` bridged to Thor's shell is injected into
13
+ # every command — so info/warn/error get coloured output on the
14
+ # terminal while remaining loggable for library callers.
15
+ class Base < Thor
16
+ private
17
+
18
+ # Build a logger bridged to this Thor instance for coloured output.
19
+ def bridged_logger
20
+ Chemicalml::Logger.default.tap { |l| l.thor_shell = self }
21
+ end
22
+
23
+ public
24
+
25
+ desc 'validate FILE', 'Validate a CML file against its declared convention'
26
+ method_option :json, type: :boolean, aliases: '-j',
27
+ desc: 'Emit machine-readable JSON output'
28
+ def validate(file)
29
+ ValidateCommand.new(logger: bridged_logger).run(file: file, json: options[:json])
30
+ end
31
+
32
+ desc 'inspect FILE', 'Print a tree-style summary of the document'
33
+ def inspect(file)
34
+ InspectCommand.new(logger: bridged_logger).run(file: file)
35
+ end
36
+
37
+ desc 'conventions', 'List registered conventions'
38
+ def conventions
39
+ ConventionsCommand.new(logger: bridged_logger).run({})
40
+ end
41
+
42
+ desc 'dictionaries', 'List built-in dictionaries'
43
+ def dictionaries
44
+ DictionariesCommand.new(logger: bridged_logger).run({})
45
+ end
46
+
47
+ desc 'elements', 'List all CML wire classes'
48
+ def elements
49
+ ElementsCommand.new(logger: bridged_logger).run({})
50
+ end
51
+
52
+ desc 'constraints', 'List all registered constraints'
53
+ def constraints
54
+ ConstraintsCommand.new(logger: bridged_logger).run({})
55
+ end
56
+
57
+ desc 'enums', 'List all XSD enum constants'
58
+ def enums
59
+ EnumsCommand.new(logger: bridged_logger).run({})
60
+ end
61
+
62
+ desc 'info ELEMENT', 'Show details about a CML element'
63
+ def info(element)
64
+ InfoCommand.new(logger: bridged_logger).run(element: element)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cli
5
+ # Base class for every command. Subclasses implement `#run(options)`.
6
+ #
7
+ # Each command receives a `Chemicalml::Logger` in its constructor.
8
+ # When dispatched via Thor (the normal CLI path), the logger is
9
+ # bridged to Thor's shell for coloured output. When invoked
10
+ # directly (MyCommand.new.run(options)), the logger writes plain
11
+ # text to $stderr.
12
+ class Command
13
+ attr_reader :logger
14
+
15
+ # @param logger [Chemicalml::Logger] the logger to use. Defaults
16
+ # to a plain stderr logger. The Thor dispatcher passes one
17
+ # bridged to Thor's shell for colour.
18
+ def initialize(logger: Chemicalml::Logger.default)
19
+ @logger = logger
20
+ end
21
+
22
+ class << self
23
+ def run(options = {}, logger: Chemicalml::Logger.default)
24
+ new(logger: logger).run(options)
25
+ end
26
+ end
27
+
28
+ def run(_options = {})
29
+ raise NotImplementedError, "#{self.class} must implement #run"
30
+ end
31
+
32
+ private
33
+
34
+ def puts(*args)
35
+ $stdout.puts(*args)
36
+ end
37
+
38
+ def stderr(*args)
39
+ $stderr.puts(*args)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cli
5
+ # `chemicalml constraints` — list every registered constraint
6
+ # across every convention with its applies_to roles.
7
+ class ConstraintsCommand < Command
8
+ def run(_options = {})
9
+ current = nil
10
+ Chemicalml::Convention::Registry.each_constraint do |conv, klass|
11
+ unless conv.qname == current
12
+ current = conv.qname
13
+ puts ''
14
+ puts "=== #{current} (#{conv.constraint_count}) ==="
15
+ end
16
+ name = klass.name.split('::').last
17
+ applies = klass.applies_to_roles
18
+ roles_str = applies.nil? ? '' : " → #{applies.map { |r| r.name.split('::').last }.join(', ')}"
19
+ puts " #{name}#{roles_str}"
20
+ desc = klass.description
21
+ puts " #{desc}" unless desc == name
22
+ end
23
+ 0
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cli
5
+ # `chemicalml conventions` — list every registered convention
6
+ # by QName, sorted.
7
+ class ConventionsCommand < Command
8
+ def run(_options = {})
9
+ Chemicalml::Convention::Registry.builtin_qnames.sort.each { |q| puts q }
10
+ 0
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cli
5
+ # `chemicalml dictionaries` — list built-in YAML dictionaries
6
+ # by short name.
7
+ class DictionariesCommand < Command
8
+ def run(_options = {})
9
+ Chemicalml::Dictionary::Registry.builtin_names.each { |n| puts n }
10
+ 0
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cli
5
+ # `chemicalml elements` — list every CML wire class registered
6
+ # in Schema3 with its XML element name.
7
+ class ElementsCommand < Command
8
+ def run(_options = {})
9
+ Chemicalml::Cml::Schema3::Configuration.ensure_registered!
10
+ Chemicalml::Cml::Elements::ALL.sort.each do |cls, xml_id|
11
+ puts "#{cls.to_s.ljust(25)} → <#{xml_id}>"
12
+ end
13
+ 0
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cli
5
+ # `chemicalml enums` — list every `Cml::Enums` constant with
6
+ # its allowed values.
7
+ class EnumsCommand < Command
8
+ def run(_options = {})
9
+ Chemicalml::Cml::Enums.constants(false).sort.each do |name|
10
+ values = Chemicalml::Cml::Enums.const_get(name)
11
+ puts "#{name} (#{values.size}): #{values.to_a.sort.first(20).join(', ')}"
12
+ end
13
+ 0
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cli
5
+ # `chemicalml info <element>` — show details about a CML element
6
+ # by XML name: Ruby class, role, attributes, applicable constraints.
7
+ class InfoCommand < Command
8
+ def run(options)
9
+ name = options[:element]
10
+ unless name
11
+ logger.error 'info requires an <element-name> argument (e.g. "atom")'
12
+ return 2
13
+ end
14
+
15
+ klass = Chemicalml::Cml.for_xml_name(name)
16
+ unless klass
17
+ stderr "unknown element: #{name}"
18
+ return 2
19
+ end
20
+
21
+ Chemicalml::Cml::Schema3::Configuration.ensure_registered!
22
+ puts "Element: <#{name}>"
23
+ puts "Class: #{klass}"
24
+ role = role_of(klass)
25
+ puts "Role: #{role || '(none)'}"
26
+ puts ''
27
+ puts "Attributes (#{klass.attributes.size}):"
28
+ klass.attributes.each_value do |attr|
29
+ col = attr.collection? ? '[]' : ' '
30
+ puts " #{attr.name}#{col}"
31
+ end
32
+ applicable = constraints_for_role(role)
33
+ return 0 if applicable.empty?
34
+
35
+ puts ''
36
+ puts "Applicable constraints (#{applicable.size}):"
37
+ applicable.each do |(conv, c)|
38
+ puts " [#{conv.qname}] #{c.name.split('::').last}"
39
+ end
40
+ 0
41
+ end
42
+
43
+ private
44
+
45
+ def role_of(klass)
46
+ # Find the most specific Role module included in klass
47
+ # (the one with the longest name that matches Cml::Role::*).
48
+ klass.ancestors.find do |a|
49
+ next false unless a.is_a?(Module)
50
+ next false unless a.name
51
+
52
+ a.name.start_with?('Chemicalml::Cml::Role::')
53
+ end
54
+ end
55
+
56
+ def constraints_for_role(role)
57
+ return [] unless role
58
+
59
+ Chemicalml::Convention::Registry.each_constraint.with_object([]) do |(conv, c), acc|
60
+ roles = c.applies_to_roles
61
+ next if roles.nil?
62
+
63
+ matched = roles.any? do |r|
64
+ role <= r
65
+ rescue StandardError
66
+ false
67
+ end
68
+ next unless matched
69
+
70
+ acc << [conv, c]
71
+ end
72
+ rescue StandardError
73
+ []
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cli
5
+ # `chemicalml inspect <file>` — print a tree-style summary of
6
+ # the document: element names, ids, nested children.
7
+ class InspectCommand < Command
8
+ def run(options)
9
+ path = options[:file]
10
+ unless path
11
+ logger.error 'inspect requires a <file> argument'
12
+ return 2
13
+ end
14
+
15
+ doc = Chemicalml.parse(File.read(path), schema: :schema3)
16
+ print_tree(doc, 0)
17
+ 0
18
+ rescue ArgumentError, Lutaml::Model::InvalidFormatError => e
19
+ logger.error "FAIL: #{e.message}"
20
+ 2
21
+ end
22
+
23
+ private
24
+
25
+ def print_tree(node, depth, max_depth: 6)
26
+ return if depth > max_depth
27
+ return unless node.is_a?(Lutaml::Model::Serializable)
28
+
29
+ indent = ' ' * depth
30
+ line = "#{indent}#{node.class.name.split('::').last}"
31
+ line += " [#{node.node_id}]" if node.is_a?(Chemicalml::Cml::Visitable) && node.node_id
32
+ puts line
33
+ return unless node.is_a?(Chemicalml::Cml::Visitable)
34
+
35
+ node.wire_children.each { |c| print_tree(c, depth + 1, max_depth: max_depth) }
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ module Cli
5
+ # `chemicalml validate <file>` — auto-detect convention and
6
+ # print violations. With `--json` / `-j`, emits machine-readable
7
+ # JSON.
8
+ class ValidateCommand < Command
9
+ def run(options)
10
+ path = options[:file]
11
+ unless path
12
+ logger.error 'validate requires a <file> argument'
13
+ return 2
14
+ end
15
+
16
+ logger.info "Validating #{path}" unless options[:json]
17
+ doc = Chemicalml.parse(File.read(path), schema: :schema3)
18
+ report = Chemicalml.validate(doc)
19
+
20
+ if options[:json]
21
+ puts json_report(report, path)
22
+ elsif report.ok? && !report.has_warnings?
23
+ logger.info "OK: #{path}"
24
+ else
25
+ logger.error report.summary
26
+ end
27
+ report.ok? ? 0 : 1
28
+ rescue ArgumentError, Lutaml::Model::InvalidFormatError => e
29
+ logger.error "FAIL: #{e.message}"
30
+ 2
31
+ end
32
+
33
+ private
34
+
35
+ def json_report(report, path)
36
+ require 'json'
37
+ payload = {
38
+ file: path,
39
+ ok: report.ok?,
40
+ has_warnings: report.has_warnings?,
41
+ violations: report.violations.map do |v|
42
+ {
43
+ severity: v.severity,
44
+ path: v.path,
45
+ message: v.message,
46
+ value: v.value
47
+ }.compact
48
+ end
49
+ }
50
+ JSON.pretty_generate(payload)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Chemicalml
4
+ # Command-line interface. Built on Thor for dispatch; each command is
5
+ # a dedicated class under `Chemicalml::Cli::*Command` exposing
6
+ # `.run(args, options)` (and `#run` on an instance).
7
+ #
8
+ # Dispatch flow:
9
+ #
10
+ # exe/chemicalml ARGV
11
+ # -> Chemicalml::Cli::Base.start(ARGV) (Thor)
12
+ # -> Chemicalml::Cli::<Name>Command.new.run(args, options)
13
+ #
14
+ # Adding a new command:
15
+ # 1. Create `lib/chemicalml/cli/<name>_command.rb` with a class
16
+ # extending `Chemicalml::Cli::Command` and implementing `#run`.
17
+ # 2. Add one `desc + def` block in `Chemicalml::Cli::Base` that
18
+ # invokes `<Name>Command.new.run(args, options)`.
19
+ # 3. Add the autoload entry below.
20
+ module Cli
21
+ autoload :Base, 'chemicalml/cli/base'
22
+ autoload :Command, 'chemicalml/cli/command'
23
+ autoload :ValidateCommand, 'chemicalml/cli/validate_command'
24
+ autoload :InspectCommand, 'chemicalml/cli/inspect_command'
25
+ autoload :ConventionsCommand, 'chemicalml/cli/conventions_command'
26
+ autoload :DictionariesCommand, 'chemicalml/cli/dictionaries_command'
27
+ autoload :ElementsCommand, 'chemicalml/cli/elements_command'
28
+ autoload :ConstraintsCommand, 'chemicalml/cli/constraints_command'
29
+ autoload :EnumsCommand, 'chemicalml/cli/enums_command'
30
+ autoload :InfoCommand, 'chemicalml/cli/info_command'
31
+
32
+ # Backward-compatible entry point used by `exe/chemicalml` and tests.
33
+ # @param argv [Array<String>] the command line.
34
+ # @return [Integer] process exit code.
35
+ def self.run(argv)
36
+ Base.start(argv)
37
+ 0
38
+ rescue StandardError => e
39
+ warn "FAIL: #{e.message}"
40
+ 2
41
+ end
42
+ end
43
+ end
@@ -7,6 +7,7 @@ module Chemicalml
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  include Chemicalml::Cml::Role::Abundance
10
+
10
11
  attribute :id, :string
11
12
  attribute :title, :string
12
13
  attribute :dict_ref, :string
@@ -17,14 +18,23 @@ module Chemicalml
17
18
  attribute :units, :string
18
19
  xml do
19
20
  namespace Chemicalml::Cml::Namespace
20
- root "abundance"
21
- map_attribute "id", to: :id
22
- map_attribute "title", to: :title
23
- map_attribute "dictRef", to: :dict_ref
24
- map_attribute "convention", to: :convention
25
- map_attribute "min", to: :min
26
- map_attribute "max", to: :max
27
- map_attribute "units", to: :units
21
+ root 'abundance'
22
+ map_attribute 'id', to: :id
23
+ map_attribute 'title', to: :title
24
+ map_attribute 'dictRef', to: :dict_ref
25
+ map_attribute 'convention', to: :convention
26
+ map_attribute 'min', to: :min
27
+ map_attribute 'max', to: :max
28
+ map_attribute 'units', to: :units
29
+ end
30
+ key_value do
31
+ map 'id', to: :id
32
+ map 'title', to: :title
33
+ map 'dictRef', to: :dict_ref
34
+ map 'convention', to: :convention
35
+ map 'min', to: :min
36
+ map 'max', to: :max
37
+ map 'units', to: :units
28
38
  end
29
39
  end
30
40
  end
@@ -7,6 +7,7 @@ module Chemicalml
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  include Chemicalml::Cml::Role::Action
10
+
10
11
  attribute :id, :string
11
12
  attribute :title, :string
12
13
  attribute :dict_ref, :string
@@ -25,22 +26,39 @@ module Chemicalml
25
26
  attribute :ref, :string
26
27
  xml do
27
28
  namespace Chemicalml::Cml::Namespace
28
- root "action"
29
- map_attribute "id", to: :id
30
- map_attribute "title", to: :title
31
- map_attribute "dictRef", to: :dict_ref
32
- map_attribute "convention", to: :convention
33
- map_attribute "order", to: :order
34
- map_attribute "units", to: :units
35
- map_attribute "start", to: :start
36
- map_attribute "startCondition", to: :start_condition
37
- map_attribute "duration", to: :duration
38
- map_attribute "end", to: :end
39
- map_attribute "endCondition", to: :end_condition
40
- map_attribute "type", to: :type
41
- map_attribute "actionOrder", to: :action_order
42
- map_attribute "count", to: :count
43
- map_attribute "ref", to: :ref
29
+ root 'action'
30
+ map_attribute 'id', to: :id
31
+ map_attribute 'title', to: :title
32
+ map_attribute 'dictRef', to: :dict_ref
33
+ map_attribute 'convention', to: :convention
34
+ map_attribute 'order', to: :order
35
+ map_attribute 'units', to: :units
36
+ map_attribute 'start', to: :start
37
+ map_attribute 'startCondition', to: :start_condition
38
+ map_attribute 'duration', to: :duration
39
+ map_attribute 'end', to: :end
40
+ map_attribute 'endCondition', to: :end_condition
41
+ map_attribute 'type', to: :type
42
+ map_attribute 'actionOrder', to: :action_order
43
+ map_attribute 'count', to: :count
44
+ map_attribute 'ref', to: :ref
45
+ end
46
+ key_value do
47
+ map 'id', to: :id
48
+ map 'title', to: :title
49
+ map 'dictRef', to: :dict_ref
50
+ map 'convention', to: :convention
51
+ map 'order', to: :order
52
+ map 'units', to: :units
53
+ map 'start', to: :start
54
+ map 'startCondition', to: :start_condition
55
+ map 'duration', to: :duration
56
+ map 'end', to: :end
57
+ map 'endCondition', to: :end_condition
58
+ map 'type', to: :type
59
+ map 'actionOrder', to: :action_order
60
+ map 'count', to: :count
61
+ map 'ref', to: :ref
44
62
  end
45
63
  end
46
64
  end
@@ -7,13 +7,14 @@ module Chemicalml
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  include Chemicalml::Cml::Role::ActionList
10
+
10
11
  attribute :id, :string
11
12
  attribute :title, :string
12
13
  attribute :dict_ref, :string
13
14
  attribute :convention, :string
14
15
  attribute :order, :string
15
16
 
16
- attribute :actions, :action, collection: true
17
+ attribute :actions, :action, collection: true
17
18
 
18
19
  attribute :start, :string
19
20
  attribute :start_condition, :string
@@ -26,22 +27,39 @@ module Chemicalml
26
27
  attribute :action_order, :string
27
28
  xml do
28
29
  namespace Chemicalml::Cml::Namespace
29
- map_element "action", to: :actions
30
- root "actionList"
31
- map_attribute "id", to: :id
32
- map_attribute "title", to: :title
33
- map_attribute "dictRef", to: :dict_ref
34
- map_attribute "convention", to: :convention
35
- map_attribute "order", to: :order
36
- map_attribute "start", to: :start
37
- map_attribute "startCondition", to: :start_condition
38
- map_attribute "duration", to: :duration
39
- map_attribute "end", to: :end
40
- map_attribute "endCondition", to: :end_condition
41
- map_attribute "units", to: :units
42
- map_attribute "count", to: :count
43
- map_attribute "type", to: :type
44
- map_attribute "actionOrder", to: :action_order
30
+ map_element 'action', to: :actions
31
+ root 'actionList'
32
+ map_attribute 'id', to: :id
33
+ map_attribute 'title', to: :title
34
+ map_attribute 'dictRef', to: :dict_ref
35
+ map_attribute 'convention', to: :convention
36
+ map_attribute 'order', to: :order
37
+ map_attribute 'start', to: :start
38
+ map_attribute 'startCondition', to: :start_condition
39
+ map_attribute 'duration', to: :duration
40
+ map_attribute 'end', to: :end
41
+ map_attribute 'endCondition', to: :end_condition
42
+ map_attribute 'units', to: :units
43
+ map_attribute 'count', to: :count
44
+ map_attribute 'type', to: :type
45
+ map_attribute 'actionOrder', to: :action_order
46
+ end
47
+ key_value do
48
+ map 'action', to: :actions
49
+ map 'id', to: :id
50
+ map 'title', to: :title
51
+ map 'dictRef', to: :dict_ref
52
+ map 'convention', to: :convention
53
+ map 'order', to: :order
54
+ map 'start', to: :start
55
+ map 'startCondition', to: :start_condition
56
+ map 'duration', to: :duration
57
+ map 'end', to: :end
58
+ map 'endCondition', to: :end_condition
59
+ map 'units', to: :units
60
+ map 'count', to: :count
61
+ map 'type', to: :type
62
+ map 'actionOrder', to: :action_order
45
63
  end
46
64
  end
47
65
  end