unitsml 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/dependent-repos.json +5 -0
  3. data/.github/workflows/depenedent-gems.yml +16 -0
  4. data/Gemfile +1 -0
  5. data/lib/unitsml/dimension.rb +47 -38
  6. data/lib/unitsml/extender.rb +24 -10
  7. data/lib/unitsml/formula.rb +79 -55
  8. data/lib/unitsml/model/dimension.rb +42 -0
  9. data/lib/unitsml/model/dimension_quantities/amount_of_substance.rb +10 -0
  10. data/lib/unitsml/model/dimension_quantities/electric_current.rb +10 -0
  11. data/lib/unitsml/model/dimension_quantities/length.rb +10 -0
  12. data/lib/unitsml/model/dimension_quantities/luminous_intensity.rb +10 -0
  13. data/lib/unitsml/model/dimension_quantities/mass.rb +10 -0
  14. data/lib/unitsml/model/dimension_quantities/plane_angle.rb +10 -0
  15. data/lib/unitsml/model/dimension_quantities/quantity.rb +17 -0
  16. data/lib/unitsml/model/dimension_quantities/thermodynamic_temperature.rb +10 -0
  17. data/lib/unitsml/model/dimension_quantities/time.rb +10 -0
  18. data/lib/unitsml/model/prefix.rb +28 -0
  19. data/lib/unitsml/model/prefixes/name.rb +19 -0
  20. data/lib/unitsml/model/prefixes/symbol.rb +19 -0
  21. data/lib/unitsml/model/quantities/name.rb +19 -0
  22. data/lib/unitsml/model/quantity.rb +24 -0
  23. data/lib/unitsml/model/unit.rb +31 -0
  24. data/lib/unitsml/model/units/enumerated_root_unit.rb +19 -0
  25. data/lib/unitsml/model/units/name.rb +19 -0
  26. data/lib/unitsml/model/units/root_units.rb +17 -0
  27. data/lib/unitsml/model/units/symbol.rb +26 -0
  28. data/lib/unitsml/model/units/system.rb +21 -0
  29. data/lib/unitsml/parse.rb +5 -7
  30. data/lib/unitsml/parser.rb +3 -3
  31. data/lib/unitsml/prefix.rb +21 -21
  32. data/lib/unitsml/sqrt.rb +10 -10
  33. data/lib/unitsml/unit.rb +35 -35
  34. data/lib/unitsml/unitsdb/dimension.rb +88 -0
  35. data/lib/unitsml/unitsdb/dimension_quantity.rb +15 -0
  36. data/lib/unitsml/unitsdb/dimensions.rb +38 -0
  37. data/lib/unitsml/unitsdb/prefixes.rb +22 -0
  38. data/lib/unitsml/unitsdb/quantities.rb +13 -0
  39. data/lib/unitsml/unitsdb/units.rb +44 -0
  40. data/lib/unitsml/unitsdb.rb +13 -71
  41. data/lib/unitsml/utility.rb +101 -111
  42. data/lib/unitsml/version.rb +1 -1
  43. data/lib/unitsml.rb +26 -6
  44. data/unitsml.gemspec +2 -1
  45. metadata +46 -3
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unitsml
4
+ module Unitsdb
5
+ class Units
6
+ attr_accessor :units
7
+
8
+ def find_by_id(u_id)
9
+ units.find { |unit| unit.id == u_id }
10
+ end
11
+
12
+ def find_by_name(u_name)
13
+ units.find do |unit|
14
+ unit.unit_symbols.find { |u_sym| u_sym.id == u_name }
15
+ end
16
+ end
17
+
18
+ def filtered
19
+ @filtered ||= units_symbol_ids.reject do |unit|
20
+ ((/\*|\^|\/|^1$/).match?(unit) || find_by_symbol_id(unit).prefixed)
21
+ end
22
+ end
23
+
24
+ def find_by_symbol_id(sym_id)
25
+ units_symbol_hash[sym_id]
26
+ end
27
+
28
+ def units_symbol_ids
29
+ units_symbol_hash.keys
30
+ end
31
+
32
+ def units_symbol_hash
33
+ @symbol_ids_hash ||= {}
34
+
35
+ if @symbol_ids_hash.empty?
36
+ units.each_with_object(@symbol_ids_hash) do |unit, object|
37
+ unit.unit_symbols.each { |unit_sym| object[unit_sym.id] = unit }
38
+ end
39
+ end
40
+ @symbol_ids_hash
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,96 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "yaml"
4
3
  module Unitsml
5
4
  module Unitsdb
6
5
  class << self
7
- def load_yaml(file_name)
6
+ def load_file(file_name)
8
7
  @@hash ||= {}
9
- @@hash[file_name] ||= YAML.load_file(valid_path(file_name))
10
- end
11
-
12
- def load_dimensions
13
- @@dim_file = load_yaml(:dimensions)
14
- end
15
-
16
- def load_units
17
- @@units_file = load_yaml(:units)
8
+ @@hash[file_name] ||= File.read(valid_path(file_name))
18
9
  end
19
10
 
20
11
  def units
21
- @@units ||= {}
22
- return @@units unless @@units.empty?
23
-
24
- load_units.each do |key, value|
25
- value["unit_symbols"]&.each do |symbol|
26
- @@units[symbol["id"]] = { id: key, fields: value } unless symbol["id"]&.empty?
27
- end
28
- end
29
- @@units
12
+ @@units_file ||= ::Unitsdb::Units.from_yaml(load_file((:units)))
30
13
  end
31
14
 
32
15
  def prefixes
33
- @@prefixes_array ||= prefixes_hash.keys.sort_by(&:length)
16
+ @@prefixes ||= ::Unitsdb::Prefixes.from_yaml(load_file(:prefixes))
34
17
  end
35
18
 
36
- def parsable_dimensions
37
- @@parsable_dimensions ||= {}
38
- return @@parsable_dimensions unless @@parsable_dimensions.empty?
39
-
40
- dimensions_hash.each do |key, value|
41
- value.each do |_, v|
42
- @@parsable_dimensions[find_id(v)] = { id: key, fields: value }
43
- end
44
- end
45
- @@parsable_dimensions
19
+ def dimensions
20
+ @@dim_file ||= ::Unitsdb::Dimensions.from_yaml(load_file(:dimensions))
46
21
  end
47
22
 
48
23
  def quantities
49
- @@quantities ||= load_yaml(:quantities)
50
- end
51
-
52
- def filtered_units
53
- @@filtered_units_array ||= units.keys.reject do |unit|
54
- ((/\*|\^|\/|^1$/).match?(unit) || units.dig(unit, :fields, "prefixed"))
55
- end
56
- end
57
-
58
- def prefixes_hash
59
- @@prefixes_hashes ||= prefixs_ids(load_yaml(:prefixes))
60
- end
61
-
62
- def dimensions_hash
63
- @@dimensions_hashs ||= insert_vectors(load_dimensions)
24
+ @@quantities ||= ::Unitsdb::Quantities.from_yaml(load_file((:quantities)))
64
25
  end
65
26
 
66
- def prefixs_ids(prefixe_hash, hash = {})
67
- prefixe_hash&.each do |key, value|
68
- symbol = value&.dig("symbol", "ascii")
69
- hash[symbol] = { id: key, fields: value } unless symbol&.empty?
70
- end
71
- hash
27
+ def prefixes_array
28
+ @@prefixes_array ||= prefixes.ascii_symbols.sort_by(&:length)
72
29
  end
73
30
 
74
- def find_id(value)
75
- return if value == true
76
- return unless value.is_a?(Hash)
77
-
78
- value&.dig("dim_symbols")&.map { |symbol| symbol&.dig("id") }&.first
79
- end
80
-
81
- def vector(dim_hash)
82
- Utility::DIMS_VECTOR.map { |h| dim_hash.dig(underscore(h), "powerNumerator") }.join(":")
83
- end
84
-
85
- def underscore(str)
86
- str.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
87
- end
31
+ def prefixes_by_size(size)
32
+ @@sized_prefixes ||= {}
33
+ return @@sized_prefixes[size] if @@sized_prefixes.key?(size)
88
34
 
89
- def insert_vectors(dims)
90
- dims.each do |key, value|
91
- value[:vector] = vector(value)
92
- value[:id] = key
93
- end
35
+ @@sized_prefixes[size] = prefixes_array.select { |p| p.size == size }
94
36
  end
95
37
 
96
38
  def valid_path(file_name)
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "ox"
4
- require "htmlentities"
3
+ require "unitsml/model/unit"
4
+ require "unitsml/model/prefix"
5
+ require "unitsml/model/quantity"
6
+ require "unitsml/model/dimension"
7
+
5
8
  module Unitsml
6
9
  module Utility
7
- Ox.default_options = { encoding: "UTF-8" }
8
-
9
- UNITSML_NS = "https://schema.unitsml.org/unitsml/1.0".freeze
10
10
  # Unit to dimension
11
11
  U2D = {
12
12
  "m" => { dimension: "Length", order: 1, symbol: "L" },
@@ -45,10 +45,12 @@ module Unitsml
45
45
  ].freeze
46
46
 
47
47
  class << self
48
- include Unitsml::Unitsdb
48
+ def unit_instance(unit)
49
+ Unitsdb.units.find_by_symbol_id(unit)
50
+ end
49
51
 
50
- def fields(unit)
51
- Unitsdb.units.dig(unit, :fields)
52
+ def quantity_instance(id)
53
+ Unitsdb.quantities.find_by_id(id)
52
54
  end
53
55
 
54
56
  def units2dimensions(units)
@@ -69,10 +71,9 @@ module Unitsml
69
71
  def dim_id(dims)
70
72
  return nil if dims.nil? || dims.empty?
71
73
 
72
- dimensions = Unitsdb.dimensions_hash.values
73
74
  dim_hash = dims.each_with_object({}) { |h, m| m[h[:dimension]] = h }
74
75
  dims_vector = DIMS_VECTOR.map { |h| dim_hash.dig(h, :exponent) }.join(":")
75
- id = dimensions.select { |d| d[:vector] == dims_vector }&.first&.dig(:id) and return id.to_s
76
+ id = Unitsdb.dimensions.find_by_vector(dims_vector)&.id and return id.to_s
76
77
  "D_" + dims.map do |d|
77
78
  (U2D.dig(d[:unit], :symbol) || Dim2D.dig(d[:id], :symbol)) +
78
79
  (d[:exponent] == 1 ? "" : float_to_display(d[:exponent]))
@@ -86,18 +87,18 @@ module Unitsml
86
87
  def decompose_unit(u)
87
88
  if u&.unit_name == "g" || u.system_type == "SI_base"
88
89
  { unit: u, prefix: u&.prefix }
89
- elsif !u.si_derived_bases
90
+ elsif u.si_derived_bases.empty?
90
91
  { unit: Unit.new("unknown") }
91
92
  else
92
- u.si_derived_bases.each_with_object([]) do |k, m|
93
- prefix = if !k["prefix"].nil? && !k["prefix"].empty?
94
- combine_prefixes(prefix_object(k["prefix"]), u.prefix)
93
+ u.si_derived_bases.each_with_object([]) do |k, object|
94
+ prefix = if !k.prefix.nil? && !k.prefix.empty?
95
+ combine_prefixes(prefix_object(k.prefix), u.prefix)
95
96
  else
96
97
  u.prefix
97
98
  end
98
- unit_name = Unitsdb.load_units.dig(k.dig("id"), "unit_symbols", 0, "id")
99
- exponent = (k["power"]&.to_i || 1) * (u.power_numerator&.to_f || 1)
100
- m << { prefix: prefix,
99
+ unit_name = Unitsdb.units.find_by_id(k.id).unit_symbols.first.id
100
+ exponent = (k.power&.to_i || 1) * (u.power_numerator&.to_f || 1)
101
+ object << { prefix: prefix,
101
102
  unit: Unit.new(unit_name, exponent, prefix: prefix),
102
103
  }
103
104
  end
@@ -120,9 +121,9 @@ module Unitsml
120
121
 
121
122
  def prefix_object(prefix)
122
123
  return prefix unless prefix.is_a?(String)
123
- return nil unless Unitsdb.prefixes.any?(prefix)
124
+ return nil unless Unitsdb.prefixes_array.any?(prefix)
124
125
 
125
- prefix.is_a?(String) ? Prefix.new(prefix) : prefix
126
+ Prefix.new(prefix)
126
127
  end
127
128
 
128
129
  def combine_prefixes(p1, p2)
@@ -131,7 +132,7 @@ module Unitsml
131
132
  return p2.symbolid if p1.nil?
132
133
  return "unknown" if p1.base != p2.base
133
134
 
134
- Unitsdb.prefixes_hash.each do |prefix_name, _|
135
+ Unitsdb.prefixes_array.each do |prefix_name|
135
136
  p = prefix_object(prefix_name)
136
137
  return p if p.base == p1.base && p.power == p1.power + p2.power
137
138
  end
@@ -139,15 +140,16 @@ module Unitsml
139
140
  "unknown"
140
141
  end
141
142
 
142
- def unit(units, formula, dims, norm_text, name)
143
- attributes = { xmlns: UNITSML_NS, "xml:id": unit_id(norm_text) }
144
- attributes[:dimensionURL] = "##{dim_id(dims)}" if dims
145
- unit_node = ox_element("Unit", attributes: attributes)
146
- nodes = Array(unitsystem(units))
147
- nodes += Array(unitname(units, norm_text, name))
148
- nodes += Array(unitsymbols(formula))
149
- nodes += Array(rootunits(units))
150
- Ox.dump(update_nodes(unit_node, nodes))
143
+ def unit(units, formula, dims, norm_text, name, options)
144
+ attributes = {
145
+ id: unit_id(norm_text),
146
+ system: unitsystem(units),
147
+ name: unitname(units, norm_text, name),
148
+ symbol: unitsymbols(formula, options),
149
+ root_units: rootunits(units),
150
+ }
151
+ attributes[:dimension_url] = "##{dim_id(dims)}" if dims
152
+ Model::Unit.new(attributes).to_xml
151
153
  .gsub("&lt;", "<")
152
154
  .gsub("&gt;", ">")
153
155
  .gsub("&amp;", "&")
@@ -156,8 +158,9 @@ module Unitsml
156
158
  end
157
159
 
158
160
  def unitname(units, text, name)
159
- name ||= Unitsdb.units[text] ? Unit.new(text).enumerated_name : text
160
- ox_element("UnitName", attributes: { "xml:lang": "en" }) << name
161
+ Model::Units::Name.new(
162
+ name: unit_instance(text)&.unit_name&.first || text
163
+ )
161
164
  end
162
165
 
163
166
  def postprocess_normtext(units)
@@ -168,47 +171,44 @@ module Unitsml
168
171
  unit.power_numerator && unit.power_numerator != "1" ? "^#{unit.power_numerator}" : ""
169
172
  end
170
173
 
171
- def unitsymbols(formula)
172
- [
173
- (ox_element("UnitSymbol", attributes: { type: "HTML" }) << formula.to_html),
174
- (ox_element("UnitSymbol", attributes: { type: "MathMl" }) << Ox.parse(formula.to_mathml)),
175
- ]
174
+ def unitsymbols(formula, options)
175
+ %w[HTML MathMl].map do |lang|
176
+ Model::Units::Symbol.new(type: lang, content: formula.public_send(:"to_#{lang.downcase}", options))
177
+ end
176
178
  end
177
179
 
178
180
  def unitsystem(units)
179
181
  ret = []
180
182
  if units.any? { |u| u.system_name != "SI" }
181
- ret << ox_element("UnitSystem", attributes: { name: "not_SI", type: "not_SI", "xml:lang": 'en-US' })
183
+ ret << Model::Units::System.new(name: "not_SI", type: "not_SI")
182
184
  end
183
185
  if units.any? { |u| u.system_name == "SI" }
184
186
  if units.size == 1
185
187
  base = units[0].system_type == "SI-base"
186
188
  base = true if units[0].unit_name == "g" && units[0]&.prefix_name == "k"
187
189
  end
188
- ret << ox_element("UnitSystem", attributes: { name: "SI", type: (base ? 'SI_base' : 'SI_derived'), "xml:lang": 'en-US' })
190
+ ret << Model::Units::System.new(name: "SI", type: (base ? 'SI_base' : 'SI_derived'))
189
191
  end
190
192
  ret
191
193
  end
192
194
 
193
195
  def dimension(norm_text)
194
- return unless fields(norm_text)&.dig("dimension_url")
195
-
196
- dim_id = fields(norm_text).dig("dimension_url").sub("#", '')
197
- dim_node = ox_element("Dimension", attributes: { xmlns: UNITSML_NS, "xml:id": dim_id })
198
- Ox.dump(
199
- update_nodes(
200
- dim_node,
201
- dimid2dimensions(dim_id)&.compact&.map { |u| dimension1(u) }
202
- )
203
- )
196
+ dim_url = unit_instance(norm_text)&.dimension_url
197
+ return unless dim_url
198
+
199
+ dim_id = dim_url.sub("#", '')
200
+ dim_attrs = { id: dim_id }
201
+ dimid2dimensions(dim_id)&.compact&.each { |u| dimension1(u, dim_attrs) }
202
+ Model::Dimension.new(dim_attrs).to_xml
204
203
  end
205
204
 
206
- def dimension1(dim)
207
- attributes = {
205
+ def dimension1(dim, dims_hash)
206
+ dim_name = dim[:dimension]
207
+ dim_klass = Model::DimensionQuantities.const_get(dim_name)
208
+ dims_hash[underscore(dim_name).to_sym] = dim_klass.new(
208
209
  symbol: dim[:symbol],
209
- powerNumerator: float_to_display(dim[:exponent])
210
- }
211
- ox_element(dim[:dimension], attributes: attributes)
210
+ power_numerator: float_to_display(dim[:exponent])
211
+ )
212
212
  end
213
213
 
214
214
  def float_to_display(float)
@@ -216,97 +216,79 @@ module Unitsml
216
216
  end
217
217
 
218
218
  def dimid2dimensions(normtext)
219
- dims ||= Unitsdb.load_dimensions[normtext]
220
- dims&.keys&.reject { |d| d.is_a?(Symbol) }&.map do |k|
221
- humanized = k.split("_").map(&:capitalize).join
219
+ dims = Unitsdb.dimensions.find_by_id(normtext)
220
+ dims&.processed_keys&.map do |processed_key|
221
+ humanized = processed_key.split("_").map(&:capitalize).join
222
222
  next unless DIMS_VECTOR.include?(humanized)
223
223
 
224
+ dim_quantity = dims.public_send(processed_key)
224
225
  {
225
226
  dimension: humanized,
226
- symbol: dims.dig(k, "symbol"),
227
- exponent: dims.dig(k, "powerNumerator")
227
+ symbol: dim_quantity.symbol,
228
+ exponent: dim_quantity.power_numerator,
228
229
  }
229
230
  end
230
231
  end
231
232
 
232
- def prefixes(units)
233
+ def prefixes(units, options)
233
234
  uniq_prefixes = units.map { |unit| unit.prefix }.compact.uniq {|d| d.prefix_name }
234
- uniq_prefixes.map do |p|
235
- prefix_attr = { xmlns: UNITSML_NS, prefixBase: p&.base, prefixPower: p&.power, "xml:id": p&.id }
236
- prefix_node = ox_element("Prefix", attributes: prefix_attr)
237
- contents = []
238
- contents << (ox_element("PrefixName", attributes: { "xml:lang": "en" }) << p&.name)
239
- contents << (ox_element("PrefixSymbol", attributes: { type: "ASCII" }) << p&.to_asciimath)
240
- contents << (ox_element("PrefixSymbol", attributes: { type: "unicode" }) << p&.to_unicode)
241
- contents << (ox_element("PrefixSymbol", attributes: { type: "LaTex" }) << p&.to_latex)
242
- contents << (ox_element("PrefixSymbol", attributes: { type: "HTML" }) << p&.to_html)
243
- Ox.dump(update_nodes(prefix_node, contents)).gsub("&amp;", "&")
235
+ uniq_prefixes.map do |prefix|
236
+ prefix_attrs = { prefix_base: prefix&.base, prefix_power: prefix&.power, id: prefix&.id }
237
+ type_and_methods = { ASCII: :to_asciimath, unicode: :to_unicode, LaTex: :to_latex, HTML: :to_html }
238
+ prefix_attrs[:name] = Model::Prefixes::Name.new(content: prefix&.name)
239
+ prefix_attrs[:symbol] = type_and_methods.map do |type, method_name|
240
+ Model::Prefixes::Symbol.new(
241
+ type: type,
242
+ content: prefix&.public_send(method_name, options),
243
+ )
244
+ end
245
+ Model::Prefix.new(prefix_attrs).to_xml.gsub("&amp;", "&")
244
246
  end.join("\n")
245
247
  end
246
248
 
247
249
  def rootunits(units)
248
250
  return if units.size == 1 && !units[0].prefix
249
251
 
250
- root_unit = ox_element("RootUnits")
251
- units.each do |u|
252
- attributes = { unit: u.enumerated_name }
253
- attributes[:prefix] = u.prefix_name if u.prefix
254
- u.power_numerator && u.power_numerator != "1" and
255
- attributes[:powerNumerator] = u.power_numerator
256
- root_unit << ox_element("EnumeratedRootUnit", attributes: attributes)
252
+ enum_root_units = units.map do |unit|
253
+ attributes = { unit: unit.enumerated_name }
254
+ attributes[:prefix] = unit.prefix_name if unit.prefix
255
+ unit.power_numerator && unit.power_numerator != "1" and
256
+ attributes[:power_numerator] = unit.power_numerator
257
+ Model::Units::EnumeratedRootUnit.new(attributes)
257
258
  end
258
- root_unit
259
+ Model::Units::RootUnits.new(enumerated_root_unit: enum_root_units)
259
260
  end
260
261
 
261
262
  def unit_id(text)
262
263
  norm_text = text
263
264
  text = text&.gsub(/[()]/, "")
264
- /-$/.match(text) and return Unitsdb.prefixes[text.sub(/-$/, "")][:id]
265
- unit_hash = Unitsdb.units[norm_text]
266
- "U_#{unit_hash ? unit_hash[:id]&.gsub(/'/, '_') : norm_text&.gsub(/\*/, '.')&.gsub(/\^/, '')}"
265
+ unit = unit_instance(norm_text)
266
+ "U_#{unit ? unit.id&.gsub(/'/, '_') : norm_text&.gsub(/\*/, '.')&.gsub(/\^/, '')}"
267
267
  end
268
268
 
269
269
  def dimension_components(dims)
270
270
  return if dims.nil? || dims.empty?
271
271
 
272
- attributes = { xmlns: UNITSML_NS, "xml:id": dim_id(dims) }
273
- dim_node = ox_element("Dimension", attributes: attributes)
274
- Ox.dump(update_nodes(dim_node, dims.map { |u| dimension1(u) }))
272
+ dim_attrs = { id: dim_id(dims) }
273
+ dims.map { |u| dimension1(u, dim_attrs) }
274
+ Model::Dimension.new(dim_attrs).to_xml
275
275
  end
276
276
 
277
277
  def quantity(normtext, quantity)
278
- units = Unitsdb.units
279
- quantity_references = units.dig(normtext, :fields, "quantity_reference")
280
- return unless units[normtext] && quantity_references.size == 1 ||
281
- Unitsdb.quantities[quantity]
282
-
283
- id = quantity || quantity_references&.first&.dig("url")
284
- attributes = { xmlns: UNITSML_NS, "xml:id": id.sub('#', '') }
285
- dim_url = units.dig(normtext, :fields, "dimension_url")
286
- dim_url and attributes[:dimensionURL] = "#{dim_url}"
287
- attributes[:quantityType] = "base"
288
- quantity_element = ox_element("Quantity", attributes: attributes)
289
- Ox.dump(update_nodes(quantity_element, quantity_name(id.sub('#', ''))))
278
+ unit = unit_instance(normtext)
279
+ return unless unit && unit.quantity_reference.size == 1 ||
280
+ quantity_instance(quantity)
281
+
282
+ id = (quantity || unit.quantity_reference&.first&.url).sub('#', '')
283
+ dim_url = unit.dimension_url
284
+ attributes = { id: id, name: quantity_name(id), dimension_url: dim_url }
285
+ Model::Quantity.new(attributes).to_xml
290
286
  end
291
287
 
292
288
  def quantity_name(id)
293
- ret = []
294
- Unitsdb.quantities[id]&.dig("quantity_name")&.each do |q|
295
- node = (ox_element("QuantityName", attributes: { "xml:lang": "en-US" }) << q)
296
- ret << node
289
+ quantity_instance(id)&.quantity_name&.map do |content|
290
+ Model::Quantities::Name.new(content: content)
297
291
  end
298
- ret
299
- end
300
-
301
- def ox_element(node, attributes: [])
302
- element = Ox::Element.new(node)
303
- attributes&.each { |attr_key, attr_value| element[attr_key] = attr_value }
304
- element
305
- end
306
-
307
- def update_nodes(element, nodes)
308
- nodes&.each { |node| element << node unless node.nil? }
309
- element
310
292
  end
311
293
 
312
294
  def string_to_html_entity(string)
@@ -321,6 +303,14 @@ module Unitsml
321
303
  entities = HTMLEntities.new
322
304
  entities.decode(string)
323
305
  end
306
+
307
+ def underscore(str)
308
+ str.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
309
+ end
310
+
311
+ def class_name(klass)
312
+ klass.name.split("::").last
313
+ end
324
314
  end
325
315
  end
326
316
  end
@@ -1,3 +1,3 @@
1
1
  module Unitsml
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.1"
3
3
  end
data/lib/unitsml.rb CHANGED
@@ -1,3 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unitsml
4
+ UNITSML_NS = "https://schema.unitsml.org/unitsml/1.0".freeze
5
+
6
+ def self.parse(string)
7
+ Unitsml::Parser.new(string).parse
8
+ end
9
+ end
10
+
1
11
  require "unitsml/error"
2
12
  require "unitsml/sqrt"
3
13
  require "unitsml/unit"
@@ -10,9 +20,19 @@ require "unitsml/unitsdb"
10
20
  require "unitsml/extender"
11
21
  require "unitsml/dimension"
12
22
  require "unitsml/transform"
13
-
14
- module Unitsml
15
- def self.parse(string)
16
- Unitsml::Parser.new(string).parse
17
- end
18
- end
23
+ require "unitsml/unitsdb/units"
24
+ require "unitsml/unitsdb/prefixes"
25
+ require "unitsml/unitsdb/dimension"
26
+ require "unitsml/unitsdb/dimensions"
27
+ require "unitsml/unitsdb/quantities"
28
+ require "unitsml/unitsdb/dimension_quantity"
29
+ require "unitsdb/config"
30
+ Unitsdb::Config.models = {
31
+ units: Unitsml::Unitsdb::Units,
32
+ prefixes: Unitsml::Unitsdb::Prefixes,
33
+ dimension: Unitsml::Unitsdb::Dimension,
34
+ dimensions: Unitsml::Unitsdb::Dimensions,
35
+ quantities: Unitsml::Unitsdb::Quantities,
36
+ dimension_quantity: Unitsml::Unitsdb::DimensionQuantity,
37
+ }
38
+ require "unitsdb"
data/unitsml.gemspec CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.require_paths = ["lib", "unitsdb/**/*.yaml"]
29
29
 
30
30
  spec.add_dependency "htmlentities"
31
- spec.add_dependency "ox"
31
+ spec.add_dependency "mml"
32
32
  spec.add_dependency "parslet"
33
+ spec.add_dependency "unitsdb"
33
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unitsml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-02-13 00:00:00.000000000 Z
11
+ date: 2025-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: htmlentities
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: ox
28
+ name: mml
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: unitsdb
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Gem-wrapper for working with unitsdb
56
70
  email:
57
71
  - open.source@ribose.com
@@ -59,6 +73,8 @@ executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
76
+ - ".github/workflows/dependent-repos.json"
77
+ - ".github/workflows/depenedent-gems.yml"
62
78
  - ".github/workflows/rake.yml"
63
79
  - ".github/workflows/release.yml"
64
80
  - ".gitignore"
@@ -78,6 +94,27 @@ files:
78
94
  - lib/unitsml/errors/plurimath_load_error.rb
79
95
  - lib/unitsml/extender.rb
80
96
  - lib/unitsml/formula.rb
97
+ - lib/unitsml/model/dimension.rb
98
+ - lib/unitsml/model/dimension_quantities/amount_of_substance.rb
99
+ - lib/unitsml/model/dimension_quantities/electric_current.rb
100
+ - lib/unitsml/model/dimension_quantities/length.rb
101
+ - lib/unitsml/model/dimension_quantities/luminous_intensity.rb
102
+ - lib/unitsml/model/dimension_quantities/mass.rb
103
+ - lib/unitsml/model/dimension_quantities/plane_angle.rb
104
+ - lib/unitsml/model/dimension_quantities/quantity.rb
105
+ - lib/unitsml/model/dimension_quantities/thermodynamic_temperature.rb
106
+ - lib/unitsml/model/dimension_quantities/time.rb
107
+ - lib/unitsml/model/prefix.rb
108
+ - lib/unitsml/model/prefixes/name.rb
109
+ - lib/unitsml/model/prefixes/symbol.rb
110
+ - lib/unitsml/model/quantities/name.rb
111
+ - lib/unitsml/model/quantity.rb
112
+ - lib/unitsml/model/unit.rb
113
+ - lib/unitsml/model/units/enumerated_root_unit.rb
114
+ - lib/unitsml/model/units/name.rb
115
+ - lib/unitsml/model/units/root_units.rb
116
+ - lib/unitsml/model/units/symbol.rb
117
+ - lib/unitsml/model/units/system.rb
81
118
  - lib/unitsml/parse.rb
82
119
  - lib/unitsml/parser.rb
83
120
  - lib/unitsml/prefix.rb
@@ -85,6 +122,12 @@ files:
85
122
  - lib/unitsml/transform.rb
86
123
  - lib/unitsml/unit.rb
87
124
  - lib/unitsml/unitsdb.rb
125
+ - lib/unitsml/unitsdb/dimension.rb
126
+ - lib/unitsml/unitsdb/dimension_quantity.rb
127
+ - lib/unitsml/unitsdb/dimensions.rb
128
+ - lib/unitsml/unitsdb/prefixes.rb
129
+ - lib/unitsml/unitsdb/quantities.rb
130
+ - lib/unitsml/unitsdb/units.rb
88
131
  - lib/unitsml/utility.rb
89
132
  - lib/unitsml/version.rb
90
133
  - unitsdb/dimensions.yaml