chemicalml 0.2.1 → 0.4.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 (352) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +21 -14
  3. data/.rubocop.yml +23 -0
  4. data/CHANGELOG.md +32 -0
  5. data/CLAUDE.md +49 -1
  6. data/README.adoc +154 -26
  7. data/TODO.align/61-parallel-array-attrs.md +54 -0
  8. data/TODO.align/62-per-element-attribute-gaps.md +49 -0
  9. data/TODO.align/63-universal-children-mixin.md +42 -0
  10. data/TODO.align/64-per-element-child-gaps.md +81 -0
  11. data/TODO.align/65-simple-unit-convention.md +40 -0
  12. data/TODO.align/66-schema24-legacy-children.md +32 -0
  13. data/TODO.align/67-final-verification.md +32 -0
  14. data/TODO.align/68-detection-coverage.md +33 -0
  15. data/TODO.align/69-json-yaml-roundtrip.md +27 -0
  16. data/TODO.align/70-iterative-walker.md +40 -0
  17. data/TODO.align/71-violation-value.md +25 -0
  18. data/TODO.align/72-close-child-gaps.md +66 -0
  19. data/TODO.align/73-schema24-parse-limitation.md +64 -0
  20. data/TODO.align/74-final-verification-round18.md +15 -0
  21. data/TODO.align/75-key-value-mappings.md +43 -0
  22. data/TODO.align/76-schema24-workaround.md +57 -0
  23. data/TODO.align/77-convention-coverage-matrix.md +31 -0
  24. data/TODO.align/78-fixture-audit.md +23 -0
  25. data/TODO.align/79-final-verification-round19.md +15 -0
  26. data/TODO.align/80-xsd-enum-constants.md +35 -0
  27. data/TODO.align/81-enum-validation-constraints.md +29 -0
  28. data/TODO.align/82-reference-resolver.md +33 -0
  29. data/TODO.align/83-toml-roundtrip.md +20 -0
  30. data/TODO.align/84-final-verification-round21.md +16 -0
  31. data/TODO.align/85-bond-distinct-atoms.md +25 -0
  32. data/TODO.align/86-references-should-resolve.md +20 -0
  33. data/TODO.align/87-cli-utility.md +26 -0
  34. data/TODO.align/88-diverse-fixtures.md +26 -0
  35. data/TODO.align/89-final-verification-round22.md +15 -0
  36. data/TODO.align/90-bond-stereo-completeness.md +31 -0
  37. data/TODO.align/91-atomparity-distinct.md +21 -0
  38. data/TODO.align/92-unit-dictionary-completeness.md +28 -0
  39. data/TODO.align/93-yard-docs.md +23 -0
  40. data/TODO.align/94-final-verification-round23.md +15 -0
  41. data/TODO.align/README.round17.md +28 -0
  42. data/TODO.align/README.round18.md +37 -0
  43. data/TODO.align/README.round19.md +40 -0
  44. data/TODO.align/README.round20.md +49 -0
  45. data/TODO.align/README.round21.md +35 -0
  46. data/TODO.align/README.round22.md +48 -0
  47. data/TODO.align/README.round23.md +46 -0
  48. data/TODO.align/README.round24.md +53 -0
  49. data/TODO.align/README.round25.md +66 -0
  50. data/TODO.align/README.round26.md +55 -0
  51. data/TODO.align/README.round27.md +51 -0
  52. data/TODO.align/README.round28.md +61 -0
  53. data/TODO.align/README.round29.md +64 -0
  54. data/TODO.align/README.round30.md +50 -0
  55. data/TODO.align/README.round31.md +54 -0
  56. data/TODO.align/README.round32.md +67 -0
  57. data/TODO.align/README.round33.md +62 -0
  58. data/TODO.align/README.round34.md +70 -0
  59. data/chemicalml.gemspec +1 -1
  60. data/docs/constraints.md +161 -0
  61. data/docs/generate_constraint_docs.rb +44 -0
  62. data/exe/chemicalml +6 -0
  63. data/lib/chemicalml/cli/base.rb +68 -0
  64. data/lib/chemicalml/cli/command.rb +43 -0
  65. data/lib/chemicalml/cli/constraints_command.rb +27 -0
  66. data/lib/chemicalml/cli/conventions_command.rb +14 -0
  67. data/lib/chemicalml/cli/dictionaries_command.rb +14 -0
  68. data/lib/chemicalml/cli/elements_command.rb +17 -0
  69. data/lib/chemicalml/cli/enums_command.rb +17 -0
  70. data/lib/chemicalml/cli/info_command.rb +77 -0
  71. data/lib/chemicalml/cli/inspect_command.rb +39 -0
  72. data/lib/chemicalml/cli/validate_command.rb +54 -0
  73. data/lib/chemicalml/cli.rb +43 -0
  74. data/lib/chemicalml/cml/base/abundance.rb +18 -8
  75. data/lib/chemicalml/cml/base/action.rb +34 -16
  76. data/lib/chemicalml/cml/base/action_list.rb +35 -17
  77. data/lib/chemicalml/cml/base/alternative.rb +13 -4
  78. data/lib/chemicalml/cml/base/amount.rb +14 -6
  79. data/lib/chemicalml/cml/base/angle.rb +28 -13
  80. data/lib/chemicalml/cml/base/annotation.rb +14 -6
  81. data/lib/chemicalml/cml/base/any_cml.rb +12 -5
  82. data/lib/chemicalml/cml/base/appinfo.rb +14 -6
  83. data/lib/chemicalml/cml/base/arg.rb +47 -13
  84. data/lib/chemicalml/cml/base/array.rb +40 -19
  85. data/lib/chemicalml/cml/base/array_list.rb +14 -6
  86. data/lib/chemicalml/cml/base/atom.rb +84 -28
  87. data/lib/chemicalml/cml/base/atom_array.rb +60 -23
  88. data/lib/chemicalml/cml/base/atom_parity.rb +14 -6
  89. data/lib/chemicalml/cml/base/atom_set.rb +14 -6
  90. data/lib/chemicalml/cml/base/atom_type.rb +25 -9
  91. data/lib/chemicalml/cml/base/atom_type_list.rb +22 -8
  92. data/lib/chemicalml/cml/base/atomic_basis_function.rb +33 -13
  93. data/lib/chemicalml/cml/base/band.rb +21 -8
  94. data/lib/chemicalml/cml/base/band_list.rb +15 -7
  95. data/lib/chemicalml/cml/base/basis_set.rb +24 -9
  96. data/lib/chemicalml/cml/base/bond.rb +36 -10
  97. data/lib/chemicalml/cml/base/bond_array.rb +34 -11
  98. data/lib/chemicalml/cml/base/bond_set.rb +14 -6
  99. data/lib/chemicalml/cml/base/bond_stereo.rb +20 -9
  100. data/lib/chemicalml/cml/base/bond_type.rb +23 -8
  101. data/lib/chemicalml/cml/base/bond_type_list.rb +22 -8
  102. data/lib/chemicalml/cml/base/cell_parameter.rb +28 -10
  103. data/lib/chemicalml/cml/base/cml_module.rb +42 -11
  104. data/lib/chemicalml/cml/base/common_children.rb +35 -0
  105. data/lib/chemicalml/cml/base/complex_object.rb +12 -5
  106. data/lib/chemicalml/cml/base/condition_list.rb +26 -10
  107. data/lib/chemicalml/cml/base/crystal.rb +26 -10
  108. data/lib/chemicalml/cml/base/definition.rb +14 -5
  109. data/lib/chemicalml/cml/base/description.rb +16 -6
  110. data/lib/chemicalml/cml/base/dictionary.rb +28 -11
  111. data/lib/chemicalml/cml/base/dictionary_entry.rb +69 -10
  112. data/lib/chemicalml/cml/base/dimension.rb +26 -12
  113. data/lib/chemicalml/cml/base/document.rb +24 -8
  114. data/lib/chemicalml/cml/base/documentation.rb +12 -5
  115. data/lib/chemicalml/cml/base/eigen.rb +32 -8
  116. data/lib/chemicalml/cml/base/electron.rb +26 -12
  117. data/lib/chemicalml/cml/base/enumeration.rb +16 -7
  118. data/lib/chemicalml/cml/base/expression.rb +21 -6
  119. data/lib/chemicalml/cml/base/float.rb +22 -10
  120. data/lib/chemicalml/cml/base/float_array.rb +24 -11
  121. data/lib/chemicalml/cml/base/formula.rb +31 -10
  122. data/lib/chemicalml/cml/base/fragment.rb +30 -12
  123. data/lib/chemicalml/cml/base/fragment_list.rb +24 -9
  124. data/lib/chemicalml/cml/base/gradient.rb +19 -6
  125. data/lib/chemicalml/cml/base/identifier.rb +18 -8
  126. data/lib/chemicalml/cml/base/integer.rb +22 -10
  127. data/lib/chemicalml/cml/base/integer_array.rb +24 -11
  128. data/lib/chemicalml/cml/base/isotope.rb +28 -9
  129. data/lib/chemicalml/cml/base/isotope_list.rb +17 -8
  130. data/lib/chemicalml/cml/base/join.rb +25 -9
  131. data/lib/chemicalml/cml/base/kpoint.rb +16 -7
  132. data/lib/chemicalml/cml/base/kpoint_list.rb +15 -7
  133. data/lib/chemicalml/cml/base/label.rb +14 -6
  134. data/lib/chemicalml/cml/base/lattice.rb +35 -10
  135. data/lib/chemicalml/cml/base/lattice_vector.rb +16 -7
  136. data/lib/chemicalml/cml/base/length.rb +26 -12
  137. data/lib/chemicalml/cml/base/line3.rb +18 -8
  138. data/lib/chemicalml/cml/base/link.rb +41 -20
  139. data/lib/chemicalml/cml/base/list.rb +22 -10
  140. data/lib/chemicalml/cml/base/map.rb +32 -11
  141. data/lib/chemicalml/cml/base/matrix.rb +32 -15
  142. data/lib/chemicalml/cml/base/mechanism.rb +20 -7
  143. data/lib/chemicalml/cml/base/mechanism_component.rb +14 -6
  144. data/lib/chemicalml/cml/base/metadata.rb +18 -8
  145. data/lib/chemicalml/cml/base/metadata_list.rb +27 -8
  146. data/lib/chemicalml/cml/base/molecule.rb +92 -26
  147. data/lib/chemicalml/cml/base/molecule_list.rb +26 -8
  148. data/lib/chemicalml/cml/base/name.rb +10 -4
  149. data/lib/chemicalml/cml/base/object.rb +18 -8
  150. data/lib/chemicalml/cml/base/observation.rb +16 -7
  151. data/lib/chemicalml/cml/base/operator.rb +14 -6
  152. data/lib/chemicalml/cml/base/parameter.rb +33 -13
  153. data/lib/chemicalml/cml/base/parameter_list.rb +27 -8
  154. data/lib/chemicalml/cml/base/particle.rb +20 -9
  155. data/lib/chemicalml/cml/base/peak.rb +73 -26
  156. data/lib/chemicalml/cml/base/peak_group.rb +62 -26
  157. data/lib/chemicalml/cml/base/peak_list.rb +24 -9
  158. data/lib/chemicalml/cml/base/peak_structure.rb +40 -13
  159. data/lib/chemicalml/cml/base/plane3.rb +14 -6
  160. data/lib/chemicalml/cml/base/point3.rb +14 -6
  161. data/lib/chemicalml/cml/base/potential.rb +17 -6
  162. data/lib/chemicalml/cml/base/potential_form.rb +30 -7
  163. data/lib/chemicalml/cml/base/potential_list.rb +15 -7
  164. data/lib/chemicalml/cml/base/product.rb +45 -10
  165. data/lib/chemicalml/cml/base/product_list.rb +29 -9
  166. data/lib/chemicalml/cml/base/property.rb +29 -11
  167. data/lib/chemicalml/cml/base/property_list.rb +23 -8
  168. data/lib/chemicalml/cml/base/reactant.rb +45 -10
  169. data/lib/chemicalml/cml/base/reactant_list.rb +29 -9
  170. data/lib/chemicalml/cml/base/reaction.rb +74 -20
  171. data/lib/chemicalml/cml/base/reaction_list.rb +23 -8
  172. data/lib/chemicalml/cml/base/reaction_scheme.rb +43 -13
  173. data/lib/chemicalml/cml/base/reaction_step.rb +30 -12
  174. data/lib/chemicalml/cml/base/reaction_step_list.rb +30 -11
  175. data/lib/chemicalml/cml/base/reactive_centre.rb +31 -6
  176. data/lib/chemicalml/cml/base/region.rb +20 -9
  177. data/lib/chemicalml/cml/base/related_entry.rb +11 -3
  178. data/lib/chemicalml/cml/base/sample.rb +30 -7
  179. data/lib/chemicalml/cml/base/scalar.rb +32 -15
  180. data/lib/chemicalml/cml/base/spectator.rb +25 -6
  181. data/lib/chemicalml/cml/base/spectator_list.rb +20 -7
  182. data/lib/chemicalml/cml/base/spectrum.rb +57 -18
  183. data/lib/chemicalml/cml/base/spectrum_data.rb +19 -9
  184. data/lib/chemicalml/cml/base/spectrum_list.rb +28 -9
  185. data/lib/chemicalml/cml/base/sphere3.rb +14 -6
  186. data/lib/chemicalml/cml/base/stmml.rb +12 -5
  187. data/lib/chemicalml/cml/base/string.rb +14 -6
  188. data/lib/chemicalml/cml/base/string_array.rb +22 -10
  189. data/lib/chemicalml/cml/base/substance.rb +36 -14
  190. data/lib/chemicalml/cml/base/substance_list.rb +29 -10
  191. data/lib/chemicalml/cml/base/symmetry.rb +31 -9
  192. data/lib/chemicalml/cml/base/system.rb +21 -10
  193. data/lib/chemicalml/cml/base/table.rb +38 -13
  194. data/lib/chemicalml/cml/base/table_cell.rb +12 -5
  195. data/lib/chemicalml/cml/base/table_content.rb +19 -9
  196. data/lib/chemicalml/cml/base/table_header.rb +15 -7
  197. data/lib/chemicalml/cml/base/table_header_cell.rb +22 -10
  198. data/lib/chemicalml/cml/base/table_row.rb +15 -7
  199. data/lib/chemicalml/cml/base/table_row_list.rb +15 -7
  200. data/lib/chemicalml/cml/base/tcell.rb +16 -7
  201. data/lib/chemicalml/cml/base/torsion.rb +28 -13
  202. data/lib/chemicalml/cml/base/transform3.rb +12 -5
  203. data/lib/chemicalml/cml/base/transition_state.rb +23 -5
  204. data/lib/chemicalml/cml/base/trow.rb +22 -6
  205. data/lib/chemicalml/cml/base/unit.rb +39 -16
  206. data/lib/chemicalml/cml/base/unit_list.rb +34 -12
  207. data/lib/chemicalml/cml/base/unit_type.rb +30 -10
  208. data/lib/chemicalml/cml/base/unit_type_list.rb +29 -11
  209. data/lib/chemicalml/cml/base/vector3.rb +14 -6
  210. data/lib/chemicalml/cml/base/xaxis.rb +32 -10
  211. data/lib/chemicalml/cml/base/yaxis.rb +30 -10
  212. data/lib/chemicalml/cml/base/z_matrix.rb +26 -5
  213. data/lib/chemicalml/cml/base.rb +139 -138
  214. data/lib/chemicalml/cml/canonical_comparison.rb +54 -0
  215. data/lib/chemicalml/cml/elements.rb +145 -136
  216. data/lib/chemicalml/cml/enums.rb +55 -0
  217. data/lib/chemicalml/cml/namespace.rb +2 -3
  218. data/lib/chemicalml/cml/patterns.rb +33 -0
  219. data/lib/chemicalml/cml/reference_resolver.rb +137 -0
  220. data/lib/chemicalml/cml/role.rb +138 -138
  221. data/lib/chemicalml/cml/schema24/configuration.rb +11 -1
  222. data/lib/chemicalml/cml/schema24.rb +139 -139
  223. data/lib/chemicalml/cml/schema3.rb +123 -123
  224. data/lib/chemicalml/cml/visitable.rb +77 -3
  225. data/lib/chemicalml/cml/wire_class_registry.rb +3 -3
  226. data/lib/chemicalml/cml/xhtml/p.rb +21 -0
  227. data/lib/chemicalml/cml/xhtml.rb +20 -0
  228. data/lib/chemicalml/cml.rb +164 -129
  229. data/lib/chemicalml/context_configuration.rb +4 -2
  230. data/lib/chemicalml/convention/cascade/constraints/reaction_scheme_must_have_content.rb +33 -0
  231. data/lib/chemicalml/convention/cascade/constraints/reaction_step_list_must_contain_steps.rb +31 -0
  232. data/lib/chemicalml/convention/cascade/constraints/reaction_step_must_have_reaction_or_lists.rb +33 -0
  233. data/lib/chemicalml/convention/cascade/constraints/reactive_centre_atom_refs_should_be_present.rb +34 -0
  234. data/lib/chemicalml/convention/cascade/constraints.rb +18 -0
  235. data/lib/chemicalml/convention/cascade.rb +43 -0
  236. data/lib/chemicalml/convention/compchem/constraints/array_rules.rb +1 -1
  237. data/lib/chemicalml/convention/compchem/constraints/calculation_requires_finalization.rb +1 -1
  238. data/lib/chemicalml/convention/compchem/constraints/compchem_module_must_contain_job_list.rb +2 -1
  239. data/lib/chemicalml/convention/compchem/constraints/environment_at_most_one_property_list.rb +1 -1
  240. data/lib/chemicalml/convention/compchem/constraints/environment_must_not_contain_parameter.rb +1 -1
  241. data/lib/chemicalml/convention/compchem/constraints/finalization_at_most_one_molecule.rb +1 -1
  242. data/lib/chemicalml/convention/compchem/constraints/finalization_at_most_one_property_list.rb +1 -1
  243. data/lib/chemicalml/convention/compchem/constraints/finalization_must_have_content.rb +44 -0
  244. data/lib/chemicalml/convention/compchem/constraints/finalization_must_not_contain_parameter.rb +1 -1
  245. data/lib/chemicalml/convention/compchem/constraints/initialization_at_most_one_molecule.rb +1 -1
  246. data/lib/chemicalml/convention/compchem/constraints/initialization_at_most_one_parameter_list.rb +1 -1
  247. data/lib/chemicalml/convention/compchem/constraints/initialization_must_have_content.rb +54 -0
  248. data/lib/chemicalml/convention/compchem/constraints/initialization_must_not_contain_property.rb +1 -1
  249. data/lib/chemicalml/convention/compchem/constraints/job_list_module_must_have_id.rb +1 -0
  250. data/lib/chemicalml/convention/compchem/constraints/job_module_at_most_one_environment.rb +1 -1
  251. data/lib/chemicalml/convention/compchem/constraints/job_module_at_most_one_finalization.rb +1 -1
  252. data/lib/chemicalml/convention/compchem/constraints/job_module_must_have_id.rb +1 -0
  253. data/lib/chemicalml/convention/compchem/constraints/job_must_contain_initialization.rb +1 -0
  254. data/lib/chemicalml/convention/compchem/constraints/matrix_rules.rb +1 -1
  255. data/lib/chemicalml/convention/compchem/constraints/scalar_units.rb +1 -1
  256. data/lib/chemicalml/convention/compchem/constraints.rb +4 -0
  257. data/lib/chemicalml/convention/compchem.rb +4 -2
  258. data/lib/chemicalml/convention/constraint.rb +40 -9
  259. data/lib/chemicalml/convention/coordinator.rb +4 -3
  260. data/lib/chemicalml/convention/detection.rb +10 -4
  261. data/lib/chemicalml/convention/dictionary/constraints/dictionary_must_have_namespace.rb +1 -0
  262. data/lib/chemicalml/convention/dictionary/constraints/dictionary_namespace_should_end_with_slash_or_hash.rb +1 -1
  263. data/lib/chemicalml/convention/dictionary/constraints/entry_id_must_match_pattern.rb +1 -1
  264. data/lib/chemicalml/convention/dictionary/constraints/entry_ids_unique_within_dictionary.rb +1 -1
  265. data/lib/chemicalml/convention/dictionary/constraints/entry_must_contain_definition.rb +15 -1
  266. data/lib/chemicalml/convention/dictionary/constraints/entry_must_have_id_and_term.rb +1 -1
  267. data/lib/chemicalml/convention/dictionary/constraints/entry_must_have_unit_type.rb +1 -0
  268. data/lib/chemicalml/convention/dictionary/constraints/entry_units_co_constraints.rb +1 -1
  269. data/lib/chemicalml/convention/dictionary/constraints.rb +8 -8
  270. data/lib/chemicalml/convention/dictionary.rb +2 -2
  271. data/lib/chemicalml/convention/molecular/constraints/atom_array_must_be_child_of_molecule_or_formula.rb +1 -0
  272. data/lib/chemicalml/convention/molecular/constraints/atom_array_must_contain_atoms.rb +15 -6
  273. data/lib/chemicalml/convention/molecular/constraints/atom_coordinates_must_be_paired.rb +1 -1
  274. data/lib/chemicalml/convention/molecular/constraints/atom_element_type_should_be_in_periodic_table.rb +39 -0
  275. data/lib/chemicalml/convention/molecular/constraints/atom_id_must_match_pattern.rb +3 -2
  276. data/lib/chemicalml/convention/molecular/constraints/atom_ids_unique_within_molecule.rb +1 -0
  277. data/lib/chemicalml/convention/molecular/constraints/atom_must_have_element_type.rb +1 -1
  278. data/lib/chemicalml/convention/molecular/constraints/atom_must_have_id.rb +2 -1
  279. data/lib/chemicalml/convention/molecular/constraints/atom_parity_atom_refs4_should_be_distinct.rb +44 -0
  280. data/lib/chemicalml/convention/molecular/constraints/atom_parity_should_include_parent_atom.rb +65 -0
  281. data/lib/chemicalml/convention/molecular/constraints/bond_array_must_be_child_of_molecule.rb +1 -0
  282. data/lib/chemicalml/convention/molecular/constraints/bond_atom_refs2_should_be_distinct.rb +44 -0
  283. data/lib/chemicalml/convention/molecular/constraints/bond_id_should_match_pattern.rb +38 -0
  284. data/lib/chemicalml/convention/molecular/constraints/bond_ids_unique_within_molecule.rb +1 -0
  285. data/lib/chemicalml/convention/molecular/constraints/bond_must_have_atom_refs2.rb +1 -1
  286. data/lib/chemicalml/convention/molecular/constraints/bond_must_have_order.rb +2 -1
  287. data/lib/chemicalml/convention/molecular/constraints/bond_must_reference_atoms_in_same_molecule.rb +1 -0
  288. data/lib/chemicalml/convention/molecular/constraints/bond_order_other_must_have_dict_ref.rb +1 -0
  289. data/lib/chemicalml/convention/molecular/constraints/bond_order_should_be_in_enum.rb +39 -0
  290. data/lib/chemicalml/convention/molecular/constraints/bond_order_should_not_be_numeric.rb +1 -1
  291. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_atom_refs4_should_be_distinct.rb +43 -0
  292. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_cis_trans_must_have_atom_refs4.rb +1 -1
  293. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_other_must_have_dict_ref.rb +1 -0
  294. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_should_be_in_enum.rb +38 -0
  295. data/lib/chemicalml/convention/molecular/constraints/bond_stereo_wedge_hash_must_have_atom_refs2.rb +1 -1
  296. data/lib/chemicalml/convention/molecular/constraints/dict_ref_should_resolve.rb +59 -0
  297. data/lib/chemicalml/convention/molecular/constraints/molecule_atom_array_mutually_exclusive_with_children.rb +1 -0
  298. data/lib/chemicalml/convention/molecular/constraints/molecule_bond_array_mutually_exclusive_with_children.rb +1 -0
  299. data/lib/chemicalml/convention/molecular/constraints/molecule_chirality_should_be_in_enum.rb +38 -0
  300. data/lib/chemicalml/convention/molecular/constraints/molecule_count_must_not_appear_on_top_level.rb +1 -0
  301. data/lib/chemicalml/convention/molecular/constraints/molecule_id_should_match_pattern.rb +38 -0
  302. data/lib/chemicalml/convention/molecular/constraints/molecule_must_have_id.rb +1 -1
  303. data/lib/chemicalml/convention/molecular/constraints/property_must_have_dict_ref.rb +1 -1
  304. data/lib/chemicalml/convention/molecular/constraints/property_scalar_data_type_matches_dictionary.rb +58 -0
  305. data/lib/chemicalml/convention/molecular/constraints/references_should_resolve.rb +37 -0
  306. data/lib/chemicalml/convention/molecular/constraints/scalar_must_have_data_type.rb +1 -1
  307. data/lib/chemicalml/convention/molecular/constraints.rb +49 -23
  308. data/lib/chemicalml/convention/molecular.rb +15 -2
  309. data/lib/chemicalml/convention/registry.rb +79 -11
  310. data/lib/chemicalml/convention/simple_unit/constraints/root_must_be_unit_list.rb +24 -0
  311. data/lib/chemicalml/convention/simple_unit/constraints/unit_must_have_power.rb +32 -0
  312. data/lib/chemicalml/convention/simple_unit/constraints/unit_must_have_symbol.rb +31 -0
  313. data/lib/chemicalml/convention/simple_unit/constraints.rb +16 -0
  314. data/lib/chemicalml/convention/simple_unit.rb +37 -0
  315. data/lib/chemicalml/convention/spectroscopy/constraints/peak_list_must_contain_peaks.rb +31 -0
  316. data/lib/chemicalml/convention/spectroscopy/constraints/peak_should_have_values.rb +34 -0
  317. data/lib/chemicalml/convention/spectroscopy/constraints/spectrum_must_have_content.rb +31 -0
  318. data/lib/chemicalml/convention/spectroscopy/constraints/spectrum_must_have_convention.rb +32 -0
  319. data/lib/chemicalml/convention/spectroscopy/constraints/spectrum_must_have_format.rb +31 -0
  320. data/lib/chemicalml/convention/spectroscopy/constraints.rb +20 -0
  321. data/lib/chemicalml/convention/spectroscopy.rb +41 -0
  322. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_list_must_contain_at_least_one_unit.rb +1 -0
  323. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_list_must_have_namespace.rb +1 -1
  324. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_contain_definition.rb +1 -0
  325. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_id.rb +1 -0
  326. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_multiplier_or_constant_to_si.rb +34 -0
  327. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_parent_si.rb +32 -0
  328. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_symbol_and_unit_type.rb +1 -1
  329. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_must_have_title.rb +32 -0
  330. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_parent_si_should_resolve.rb +45 -0
  331. data/lib/chemicalml/convention/unit_dictionary/constraints/unit_unit_type_should_resolve.rb +46 -0
  332. data/lib/chemicalml/convention/unit_dictionary/constraints.rb +10 -0
  333. data/lib/chemicalml/convention/unit_dictionary.rb +7 -2
  334. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_id_must_match_pattern.rb +1 -1
  335. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_list_must_contain_at_least_one_unit_type.rb +1 -0
  336. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_list_must_have_namespace.rb +1 -1
  337. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_must_contain_definition.rb +1 -0
  338. data/lib/chemicalml/convention/unit_type_dictionary/constraints/unit_type_must_have_id_and_name.rb +1 -1
  339. data/lib/chemicalml/convention/unit_type_dictionary.rb +2 -2
  340. data/lib/chemicalml/convention/validation_report.rb +30 -3
  341. data/lib/chemicalml/convention/violation.rb +9 -3
  342. data/lib/chemicalml/convention.rb +41 -14
  343. data/lib/chemicalml/dictionary.rb +13 -9
  344. data/lib/chemicalml/logger.rb +47 -0
  345. data/lib/chemicalml/schema/definition.rb +2 -2
  346. data/lib/chemicalml/schema.rb +7 -7
  347. data/lib/chemicalml/version.rb +1 -1
  348. data/lib/chemicalml/versioned_parser.rb +10 -10
  349. data/lib/chemicalml.rb +78 -15
  350. data/lib/tasks/reference_fetch.rake +30 -31
  351. data/lib/tasks/scrape_fixtures.rake +23 -24
  352. metadata +118 -5
@@ -7,22 +7,38 @@ module Chemicalml
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  include Chemicalml::Cml::Role::Trow
10
+ include Chemicalml::Cml::Base::CommonChildren
11
+
10
12
  attribute :data_type, :string
11
13
  attribute :title, :string
12
14
  attribute :id, :string
13
15
  attribute :convention, :string
14
16
  attribute :dict_ref, :string
15
17
  attribute :content, :string
18
+ attribute :tcells, :tcell, collection: true
16
19
 
17
20
  xml do
18
21
  namespace Chemicalml::Cml::Namespace
19
- root "trow"
20
- map_attribute "dataType", to: :data_type
21
- map_attribute "title", to: :title
22
- map_attribute "id", to: :id
23
- map_attribute "convention", to: :convention
24
- map_attribute "dictRef", to: :dict_ref
22
+ root 'trow'
23
+ map_attribute 'dataType', to: :data_type
24
+ map_attribute 'title', to: :title
25
+ map_attribute 'id', to: :id
26
+ map_attribute 'convention', to: :convention
27
+ map_attribute 'dictRef', to: :dict_ref
25
28
  map_content to: :content
29
+ map_element 'tcell', to: :tcells
30
+ end
31
+ key_value do
32
+ map 'metadataList', to: :metadata_lists
33
+ map 'label', to: :labels
34
+ map 'name', to: :names
35
+ map 'description', to: :descriptions
36
+ map 'tcell', to: :tcells
37
+ map 'dataType', to: :data_type
38
+ map 'title', to: :title
39
+ map 'id', to: :id
40
+ map 'convention', to: :convention
41
+ map 'dictRef', to: :dict_ref
26
42
  end
27
43
  end
28
44
  end
@@ -7,6 +7,8 @@ module Chemicalml
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  include Chemicalml::Cml::Role::Unit
10
+ include Chemicalml::Cml::Base::CommonChildren
11
+
10
12
  attribute :id, :string
11
13
  attribute :title, :string
12
14
  attribute :symbol, :string
@@ -25,22 +27,43 @@ module Chemicalml
25
27
  attribute :abbreviation, :string
26
28
  xml do
27
29
  namespace Chemicalml::Cml::Namespace
28
- root "unit"
29
- map_attribute "id", to: :id
30
- map_attribute "title", to: :title
31
- map_attribute "symbol", to: :symbol
32
- map_attribute "parentSI", to: :parent_si
33
- map_attribute "multiplierToSI", to: :multiplier_to_si
34
- map_attribute "constantToSI", to: :constant_to_si
35
- map_attribute "unitType", to: :unit_type
36
- map_element "definition", to: :definition
37
- map_element "description", to: :description
38
- map_attribute "units", to: :units
39
- map_attribute "name", to: :name
40
- map_attribute "isSI", to: :is_s_i
41
- map_attribute "multiplierToData", to: :multiplier_to_data
42
- map_attribute "power", to: :power
43
- map_attribute "abbreviation", to: :abbreviation
30
+ root 'unit'
31
+ map_attribute 'id', to: :id
32
+ map_attribute 'title', to: :title
33
+ map_attribute 'symbol', to: :symbol
34
+ map_attribute 'parentSI', to: :parent_si
35
+ map_attribute 'multiplierToSI', to: :multiplier_to_si
36
+ map_attribute 'constantToSI', to: :constant_to_si
37
+ map_attribute 'unitType', to: :unit_type
38
+ map_element 'definition', to: :definition
39
+ map_element 'description', to: :description
40
+ map_attribute 'units', to: :units
41
+ map_attribute 'name', to: :name
42
+ map_attribute 'isSI', to: :is_s_i
43
+ map_attribute 'multiplierToData', to: :multiplier_to_data
44
+ map_attribute 'power', to: :power
45
+ map_attribute 'abbreviation', to: :abbreviation
46
+ end
47
+ key_value do
48
+ map 'metadataList', to: :metadata_lists
49
+ map 'label', to: :labels
50
+ map 'name', to: :names
51
+ map 'description', to: :descriptions
52
+ map 'definition', to: :definition
53
+ map 'description', to: :description
54
+ map 'id', to: :id
55
+ map 'title', to: :title
56
+ map 'symbol', to: :symbol
57
+ map 'parentSI', to: :parent_si
58
+ map 'multiplierToSI', to: :multiplier_to_si
59
+ map 'constantToSI', to: :constant_to_si
60
+ map 'unitType', to: :unit_type
61
+ map 'units', to: :units
62
+ map 'name', to: :name
63
+ map 'isSI', to: :is_s_i
64
+ map 'multiplierToData', to: :multiplier_to_data
65
+ map 'power', to: :power
66
+ map 'abbreviation', to: :abbreviation
44
67
  end
45
68
  end
46
69
  end
@@ -7,6 +7,8 @@ module Chemicalml
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  include Chemicalml::Cml::Role::UnitList
10
+ include Chemicalml::Cml::Base::CommonChildren
11
+
10
12
  attribute :title, :string
11
13
  attribute :namespace, :string
12
14
  attribute :convention, :string
@@ -19,20 +21,40 @@ module Chemicalml
19
21
  attribute :dictionary_prefix, :string
20
22
  attribute :href, :string
21
23
  attribute :unit_list_type, :string
24
+ attribute :type, :string
22
25
  xml do
23
26
  namespace Chemicalml::Cml::Namespace
24
- root "unitList"
25
- map_attribute "title", to: :title
26
- map_attribute "namespace", to: :namespace
27
- map_attribute "convention", to: :convention
28
- map_element "description", to: :description
29
- map_element "unit", to: :units
30
- map_attribute "id", to: :id
31
- map_attribute "dictRef", to: :dict_ref
32
- map_attribute "siNamespace", to: :si_namespace
33
- map_attribute "dictionaryPrefix", to: :dictionary_prefix
34
- map_attribute "href", to: :href
35
- map_attribute "unitListType", to: :unit_list_type
27
+ root 'unitList'
28
+ map_attribute 'title', to: :title
29
+ map_attribute 'namespace', to: :namespace
30
+ map_attribute 'convention', to: :convention
31
+ map_element 'description', to: :description
32
+ map_element 'unit', to: :units
33
+ map_attribute 'id', to: :id
34
+ map_attribute 'dictRef', to: :dict_ref
35
+ map_attribute 'siNamespace', to: :si_namespace
36
+ map_attribute 'dictionaryPrefix', to: :dictionary_prefix
37
+ map_attribute 'href', to: :href
38
+ map_attribute 'unitListType', to: :unit_list_type
39
+ map_attribute 'type', to: :type
40
+ end
41
+ key_value do
42
+ map 'metadataList', to: :metadata_lists
43
+ map 'label', to: :labels
44
+ map 'name', to: :names
45
+ map 'description', to: :descriptions
46
+ map 'description', to: :description
47
+ map 'unit', to: :units
48
+ map 'title', to: :title
49
+ map 'namespace', to: :namespace
50
+ map 'convention', to: :convention
51
+ map 'id', to: :id
52
+ map 'dictRef', to: :dict_ref
53
+ map 'siNamespace', to: :si_namespace
54
+ map 'dictionaryPrefix', to: :dictionary_prefix
55
+ map 'href', to: :href
56
+ map 'unitListType', to: :unit_list_type
57
+ map 'type', to: :type
36
58
  end
37
59
  end
38
60
  end
@@ -7,6 +7,8 @@ module Chemicalml
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  include Chemicalml::Cml::Role::UnitType
10
+ include Chemicalml::Cml::Base::CommonChildren
11
+
10
12
  attribute :id, :string
11
13
  attribute :name, :string
12
14
  attribute :definition, :string
@@ -17,18 +19,36 @@ module Chemicalml
17
19
  attribute :abbreviation, :string
18
20
  attribute :preserve, :string
19
21
  attribute :symbol, :string
22
+ attribute :dimensions, :dimension, collection: true
20
23
  xml do
21
24
  namespace Chemicalml::Cml::Namespace
22
- root "unitType"
23
- map_attribute "id", to: :id
24
- map_attribute "name", to: :name
25
- map_element "definition", to: :definition
26
- map_element "description", to: :description
27
- map_attribute "title", to: :title
28
- map_attribute "parentSI", to: :parent_s_i
29
- map_attribute "abbreviation", to: :abbreviation
30
- map_attribute "preserve", to: :preserve
31
- map_attribute "symbol", to: :symbol
25
+ root 'unitType'
26
+ map_attribute 'id', to: :id
27
+ map_attribute 'name', to: :name
28
+ map_element 'definition', to: :definition
29
+ map_element 'description', to: :description
30
+ map_element 'dimension', to: :dimensions
31
+ map_attribute 'title', to: :title
32
+ map_attribute 'parentSI', to: :parent_s_i
33
+ map_attribute 'abbreviation', to: :abbreviation
34
+ map_attribute 'preserve', to: :preserve
35
+ map_attribute 'symbol', to: :symbol
36
+ end
37
+ key_value do
38
+ map 'metadataList', to: :metadata_lists
39
+ map 'label', to: :labels
40
+ map 'name', to: :names
41
+ map 'description', to: :descriptions
42
+ map 'dimension', to: :dimensions
43
+ map 'definition', to: :definition
44
+ map 'description', to: :description
45
+ map 'id', to: :id
46
+ map 'name', to: :name
47
+ map 'title', to: :title
48
+ map 'parentSI', to: :parent_s_i
49
+ map 'abbreviation', to: :abbreviation
50
+ map 'preserve', to: :preserve
51
+ map 'symbol', to: :symbol
32
52
  end
33
53
  end
34
54
  end
@@ -7,6 +7,8 @@ module Chemicalml
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  include Chemicalml::Cml::Role::UnitTypeList
10
+ include Chemicalml::Cml::Base::CommonChildren
11
+
10
12
  attribute :title, :string
11
13
  attribute :namespace, :string
12
14
  attribute :convention, :string
@@ -20,17 +22,33 @@ module Chemicalml
20
22
  attribute :href, :string
21
23
  xml do
22
24
  namespace Chemicalml::Cml::Namespace
23
- root "unitTypeList"
24
- map_attribute "title", to: :title
25
- map_attribute "namespace", to: :namespace
26
- map_attribute "convention", to: :convention
27
- map_element "description", to: :description
28
- map_element "unitType", to: :unit_types
29
- map_attribute "id", to: :id
30
- map_attribute "dictRef", to: :dict_ref
31
- map_attribute "siNamespace", to: :si_namespace
32
- map_attribute "dictionaryPrefix", to: :dictionary_prefix
33
- map_attribute "href", to: :href
25
+ root 'unitTypeList'
26
+ map_attribute 'title', to: :title
27
+ map_attribute 'namespace', to: :namespace
28
+ map_attribute 'convention', to: :convention
29
+ map_element 'description', to: :description
30
+ map_element 'unitType', to: :unit_types
31
+ map_attribute 'id', to: :id
32
+ map_attribute 'dictRef', to: :dict_ref
33
+ map_attribute 'siNamespace', to: :si_namespace
34
+ map_attribute 'dictionaryPrefix', to: :dictionary_prefix
35
+ map_attribute 'href', to: :href
36
+ end
37
+ key_value do
38
+ map 'metadataList', to: :metadata_lists
39
+ map 'label', to: :labels
40
+ map 'name', to: :names
41
+ map 'description', to: :descriptions
42
+ map 'description', to: :description
43
+ map 'unitType', to: :unit_types
44
+ map 'title', to: :title
45
+ map 'namespace', to: :namespace
46
+ map 'convention', to: :convention
47
+ map 'id', to: :id
48
+ map 'dictRef', to: :dict_ref
49
+ map 'siNamespace', to: :si_namespace
50
+ map 'dictionaryPrefix', to: :dictionary_prefix
51
+ map 'href', to: :href
34
52
  end
35
53
  end
36
54
  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::Vector3
10
+
10
11
  attribute :id, :string
11
12
  attribute :title, :string
12
13
  attribute :dict_ref, :string
@@ -16,13 +17,20 @@ module Chemicalml
16
17
  attribute :units, :string
17
18
  xml do
18
19
  namespace Chemicalml::Cml::Namespace
19
- root "vector3"
20
- map_attribute "id", to: :id
21
- map_attribute "title", to: :title
22
- map_attribute "dictRef", to: :dict_ref
23
- map_attribute "convention", to: :convention
20
+ root 'vector3'
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
24
25
  map_content to: :content
25
- map_attribute "units", to: :units
26
+ map_attribute 'units', to: :units
27
+ end
28
+ key_value do
29
+ map 'id', to: :id
30
+ map 'title', to: :title
31
+ map 'dictRef', to: :dict_ref
32
+ map 'convention', to: :convention
33
+ map 'units', to: :units
26
34
  end
27
35
  end
28
36
  end
@@ -7,28 +7,50 @@ module Chemicalml
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  include Chemicalml::Cml::Role::Xaxis
10
+ include Chemicalml::Cml::Base::CommonChildren
11
+
10
12
  attribute :id, :string
11
13
  attribute :title, :string
12
14
  attribute :dict_ref, :string
13
15
  attribute :convention, :string
14
16
  attribute :units, :string
17
+ attribute :multipler, :string
15
18
  attribute :multiplier, :string
16
19
 
17
20
  attribute :ref, :string
18
21
  attribute :multiplier_to_data, :string
19
22
  attribute :constant_to_data, :string
23
+ attribute :arrays, :array, collection: true
20
24
  xml do
21
25
  namespace Chemicalml::Cml::Namespace
22
- root "xaxis"
23
- map_attribute "id", to: :id
24
- map_attribute "title", to: :title
25
- map_attribute "dictRef", to: :dict_ref
26
- map_attribute "convention", to: :convention
27
- map_attribute "units", to: :units
28
- map_attribute "multiplier", to: :multiplier
29
- map_attribute "ref", to: :ref
30
- map_attribute "multiplierToData", to: :multiplier_to_data
31
- map_attribute "constantToData", to: :constant_to_data
26
+ root 'xaxis'
27
+ map_attribute 'id', to: :id
28
+ map_attribute 'title', to: :title
29
+ map_attribute 'dictRef', to: :dict_ref
30
+ map_attribute 'convention', to: :convention
31
+ map_attribute 'units', to: :units
32
+ map_attribute 'multipler', to: :multipler
33
+ map_attribute 'multiplier', to: :multiplier
34
+ map_attribute 'ref', to: :ref
35
+ map_attribute 'multiplierToData', to: :multiplier_to_data
36
+ map_attribute 'constantToData', to: :constant_to_data
37
+ map_element 'array', to: :arrays
38
+ end
39
+ key_value do
40
+ map 'metadataList', to: :metadata_lists
41
+ map 'label', to: :labels
42
+ map 'name', to: :names
43
+ map 'description', to: :descriptions
44
+ map 'array', to: :arrays
45
+ map 'id', to: :id
46
+ map 'title', to: :title
47
+ map 'dictRef', to: :dict_ref
48
+ map 'convention', to: :convention
49
+ map 'units', to: :units
50
+ map 'multiplier', to: :multiplier
51
+ map 'ref', to: :ref
52
+ map 'multiplierToData', to: :multiplier_to_data
53
+ map 'constantToData', to: :constant_to_data
32
54
  end
33
55
  end
34
56
  end
@@ -7,6 +7,8 @@ module Chemicalml
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  include Chemicalml::Cml::Role::Yaxis
10
+ include Chemicalml::Cml::Base::CommonChildren
11
+
10
12
  attribute :id, :string
11
13
  attribute :title, :string
12
14
  attribute :dict_ref, :string
@@ -17,18 +19,36 @@ module Chemicalml
17
19
  attribute :ref, :string
18
20
  attribute :multiplier_to_data, :string
19
21
  attribute :constant_to_data, :string
22
+ attribute :arrays, :array, collection: true
20
23
  xml do
21
24
  namespace Chemicalml::Cml::Namespace
22
- root "yaxis"
23
- map_attribute "id", to: :id
24
- map_attribute "title", to: :title
25
- map_attribute "dictRef", to: :dict_ref
26
- map_attribute "convention", to: :convention
27
- map_attribute "units", to: :units
28
- map_attribute "multiplier", to: :multiplier
29
- map_attribute "ref", to: :ref
30
- map_attribute "multiplierToData", to: :multiplier_to_data
31
- map_attribute "constantToData", to: :constant_to_data
25
+ root 'yaxis'
26
+ map_attribute 'id', to: :id
27
+ map_attribute 'title', to: :title
28
+ map_attribute 'dictRef', to: :dict_ref
29
+ map_attribute 'convention', to: :convention
30
+ map_attribute 'units', to: :units
31
+ map_attribute 'multiplier', to: :multiplier
32
+ map_attribute 'ref', to: :ref
33
+ map_attribute 'multiplierToData', to: :multiplier_to_data
34
+ map_attribute 'constantToData', to: :constant_to_data
35
+ map_element 'array', to: :arrays
36
+ end
37
+ key_value do
38
+ map 'metadataList', to: :metadata_lists
39
+ map 'label', to: :labels
40
+ map 'name', to: :names
41
+ map 'description', to: :descriptions
42
+ map 'array', to: :arrays
43
+ map 'id', to: :id
44
+ map 'title', to: :title
45
+ map 'dictRef', to: :dict_ref
46
+ map 'convention', to: :convention
47
+ map 'units', to: :units
48
+ map 'multiplier', to: :multiplier
49
+ map 'ref', to: :ref
50
+ map 'multiplierToData', to: :multiplier_to_data
51
+ map 'constantToData', to: :constant_to_data
32
52
  end
33
53
  end
34
54
  end
@@ -7,20 +7,41 @@ module Chemicalml
7
7
  def self.included(klass)
8
8
  klass.class_eval do
9
9
  include Chemicalml::Cml::Role::ZMatrix
10
+ include Chemicalml::Cml::Base::CommonChildren
11
+
10
12
  attribute :id, :string
11
13
  attribute :title, :string
12
14
  attribute :dict_ref, :string
13
15
  attribute :convention, :string
14
16
  attribute :content, :string
17
+ attribute :angles, :angle, collection: true
18
+ attribute :lengths, :length, collection: true
19
+ attribute :torsions, :torsion, collection: true
15
20
 
16
21
  xml do
17
22
  namespace Chemicalml::Cml::Namespace
18
- root "zMatrix"
19
- map_attribute "id", to: :id
20
- map_attribute "title", to: :title
21
- map_attribute "dictRef", to: :dict_ref
22
- map_attribute "convention", to: :convention
23
+ root 'zMatrix'
24
+ map_attribute 'id', to: :id
25
+ map_attribute 'title', to: :title
26
+ map_attribute 'dictRef', to: :dict_ref
27
+ map_attribute 'convention', to: :convention
23
28
  map_content to: :content
29
+ map_element 'angle', to: :angles
30
+ map_element 'length', to: :lengths
31
+ map_element 'torsion', to: :torsions
32
+ end
33
+ key_value do
34
+ map 'metadataList', to: :metadata_lists
35
+ map 'label', to: :labels
36
+ map 'name', to: :names
37
+ map 'description', to: :descriptions
38
+ map 'angle', to: :angles
39
+ map 'length', to: :lengths
40
+ map 'torsion', to: :torsions
41
+ map 'id', to: :id
42
+ map 'title', to: :title
43
+ map 'dictRef', to: :dict_ref
44
+ map 'convention', to: :convention
24
45
  end
25
46
  end
26
47
  end