unitsml 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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 -109
  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,14 @@
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
10
  Ox.default_options = { encoding: "UTF-8" }
8
11
 
9
- UNITSML_NS = "https://schema.unitsml.org/unitsml/1.0".freeze
10
12
  # Unit to dimension
11
13
  U2D = {
12
14
  "m" => { dimension: "Length", order: 1, symbol: "L" },
@@ -45,10 +47,12 @@ module Unitsml
45
47
  ].freeze
46
48
 
47
49
  class << self
48
- include Unitsml::Unitsdb
50
+ def unit_instance(unit)
51
+ Unitsdb.units.find_by_symbol_id(unit)
52
+ end
49
53
 
50
- def fields(unit)
51
- Unitsdb.units.dig(unit, :fields)
54
+ def quantity_instance(id)
55
+ Unitsdb.quantities.find_by_id(id)
52
56
  end
53
57
 
54
58
  def units2dimensions(units)
@@ -69,10 +73,9 @@ module Unitsml
69
73
  def dim_id(dims)
70
74
  return nil if dims.nil? || dims.empty?
71
75
 
72
- dimensions = Unitsdb.dimensions_hash.values
73
76
  dim_hash = dims.each_with_object({}) { |h, m| m[h[:dimension]] = h }
74
77
  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
78
+ id = Unitsdb.dimensions.find_by_vector(dims_vector)&.id and return id.to_s
76
79
  "D_" + dims.map do |d|
77
80
  (U2D.dig(d[:unit], :symbol) || Dim2D.dig(d[:id], :symbol)) +
78
81
  (d[:exponent] == 1 ? "" : float_to_display(d[:exponent]))
@@ -86,18 +89,18 @@ module Unitsml
86
89
  def decompose_unit(u)
87
90
  if u&.unit_name == "g" || u.system_type == "SI_base"
88
91
  { unit: u, prefix: u&.prefix }
89
- elsif !u.si_derived_bases
92
+ elsif u.si_derived_bases.empty?
90
93
  { unit: Unit.new("unknown") }
91
94
  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)
95
+ u.si_derived_bases.each_with_object([]) do |k, object|
96
+ prefix = if !k.prefix.nil? && !k.prefix.empty?
97
+ combine_prefixes(prefix_object(k.prefix), u.prefix)
95
98
  else
96
99
  u.prefix
97
100
  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,
101
+ unit_name = Unitsdb.units.find_by_id(k.id).unit_symbols.first.id
102
+ exponent = (k.power&.to_i || 1) * (u.power_numerator&.to_f || 1)
103
+ object << { prefix: prefix,
101
104
  unit: Unit.new(unit_name, exponent, prefix: prefix),
102
105
  }
103
106
  end
@@ -120,9 +123,9 @@ module Unitsml
120
123
 
121
124
  def prefix_object(prefix)
122
125
  return prefix unless prefix.is_a?(String)
123
- return nil unless Unitsdb.prefixes.any?(prefix)
126
+ return nil unless Unitsdb.prefixes_array.any?(prefix)
124
127
 
125
- prefix.is_a?(String) ? Prefix.new(prefix) : prefix
128
+ Prefix.new(prefix)
126
129
  end
127
130
 
128
131
  def combine_prefixes(p1, p2)
@@ -131,7 +134,7 @@ module Unitsml
131
134
  return p2.symbolid if p1.nil?
132
135
  return "unknown" if p1.base != p2.base
133
136
 
134
- Unitsdb.prefixes_hash.each do |prefix_name, _|
137
+ Unitsdb.prefixes_array.each do |prefix_name|
135
138
  p = prefix_object(prefix_name)
136
139
  return p if p.base == p1.base && p.power == p1.power + p2.power
137
140
  end
@@ -139,15 +142,16 @@ module Unitsml
139
142
  "unknown"
140
143
  end
141
144
 
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))
145
+ def unit(units, formula, dims, norm_text, name, options)
146
+ attributes = {
147
+ id: unit_id(norm_text),
148
+ system: unitsystem(units),
149
+ name: unitname(units, norm_text, name),
150
+ symbol: unitsymbols(formula, options),
151
+ root_units: rootunits(units),
152
+ }
153
+ attributes[:dimension_url] = "##{dim_id(dims)}" if dims
154
+ Model::Unit.new(attributes).to_xml
151
155
  .gsub("&lt;", "<")
152
156
  .gsub("&gt;", ">")
153
157
  .gsub("&amp;", "&")
@@ -156,8 +160,9 @@ module Unitsml
156
160
  end
157
161
 
158
162
  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
163
+ Model::Units::Name.new(
164
+ name: unit_instance(text)&.unit_name&.first || text
165
+ )
161
166
  end
162
167
 
163
168
  def postprocess_normtext(units)
@@ -168,47 +173,44 @@ module Unitsml
168
173
  unit.power_numerator && unit.power_numerator != "1" ? "^#{unit.power_numerator}" : ""
169
174
  end
170
175
 
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
- ]
176
+ def unitsymbols(formula, options)
177
+ %w[HTML MathMl].map do |lang|
178
+ Model::Units::Symbol.new(type: lang, content: formula.public_send(:"to_#{lang.downcase}", options))
179
+ end
176
180
  end
177
181
 
178
182
  def unitsystem(units)
179
183
  ret = []
180
184
  if units.any? { |u| u.system_name != "SI" }
181
- ret << ox_element("UnitSystem", attributes: { name: "not_SI", type: "not_SI", "xml:lang": 'en-US' })
185
+ ret << Model::Units::System.new(name: "not_SI", type: "not_SI")
182
186
  end
183
187
  if units.any? { |u| u.system_name == "SI" }
184
188
  if units.size == 1
185
189
  base = units[0].system_type == "SI-base"
186
190
  base = true if units[0].unit_name == "g" && units[0]&.prefix_name == "k"
187
191
  end
188
- ret << ox_element("UnitSystem", attributes: { name: "SI", type: (base ? 'SI_base' : 'SI_derived'), "xml:lang": 'en-US' })
192
+ ret << Model::Units::System.new(name: "SI", type: (base ? 'SI_base' : 'SI_derived'))
189
193
  end
190
194
  ret
191
195
  end
192
196
 
193
197
  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
- )
198
+ dim_url = unit_instance(norm_text)&.dimension_url
199
+ return unless dim_url
200
+
201
+ dim_id = dim_url.sub("#", '')
202
+ dim_attrs = { id: dim_id }
203
+ dimid2dimensions(dim_id)&.compact&.each { |u| dimension1(u, dim_attrs) }
204
+ Model::Dimension.new(dim_attrs).to_xml
204
205
  end
205
206
 
206
- def dimension1(dim)
207
- attributes = {
207
+ def dimension1(dim, dims_hash)
208
+ dim_name = dim[:dimension]
209
+ dim_klass = Model::DimensionQuantities.const_get(dim_name)
210
+ dims_hash[underscore(dim_name).to_sym] = dim_klass.new(
208
211
  symbol: dim[:symbol],
209
- powerNumerator: float_to_display(dim[:exponent])
210
- }
211
- ox_element(dim[:dimension], attributes: attributes)
212
+ power_numerator: float_to_display(dim[:exponent])
213
+ )
212
214
  end
213
215
 
214
216
  def float_to_display(float)
@@ -216,97 +218,79 @@ module Unitsml
216
218
  end
217
219
 
218
220
  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
221
+ dims = Unitsdb.dimensions.find_by_id(normtext)
222
+ dims&.processed_keys&.map do |processed_key|
223
+ humanized = processed_key.split("_").map(&:capitalize).join
222
224
  next unless DIMS_VECTOR.include?(humanized)
223
225
 
226
+ dim_quantity = dims.public_send(processed_key)
224
227
  {
225
228
  dimension: humanized,
226
- symbol: dims.dig(k, "symbol"),
227
- exponent: dims.dig(k, "powerNumerator")
229
+ symbol: dim_quantity.symbol,
230
+ exponent: dim_quantity.power_numerator,
228
231
  }
229
232
  end
230
233
  end
231
234
 
232
- def prefixes(units)
235
+ def prefixes(units, options)
233
236
  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;", "&")
237
+ uniq_prefixes.map do |prefix|
238
+ prefix_attrs = { prefix_base: prefix&.base, prefix_power: prefix&.power, id: prefix&.id }
239
+ type_and_methods = { ASCII: :to_asciimath, unicode: :to_unicode, LaTex: :to_latex, HTML: :to_html }
240
+ prefix_attrs[:name] = Model::Prefixes::Name.new(content: prefix&.name)
241
+ prefix_attrs[:symbol] = type_and_methods.map do |type, method_name|
242
+ Model::Prefixes::Symbol.new(
243
+ type: type,
244
+ content: prefix&.public_send(method_name, options),
245
+ )
246
+ end
247
+ Model::Prefix.new(prefix_attrs).to_xml.gsub("&amp;", "&")
244
248
  end.join("\n")
245
249
  end
246
250
 
247
251
  def rootunits(units)
248
252
  return if units.size == 1 && !units[0].prefix
249
253
 
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)
254
+ enum_root_units = units.map do |unit|
255
+ attributes = { unit: unit.enumerated_name }
256
+ attributes[:prefix] = unit.prefix_name if unit.prefix
257
+ unit.power_numerator && unit.power_numerator != "1" and
258
+ attributes[:power_numerator] = unit.power_numerator
259
+ Model::Units::EnumeratedRootUnit.new(attributes)
257
260
  end
258
- root_unit
261
+ Model::Units::RootUnits.new(enumerated_root_unit: enum_root_units)
259
262
  end
260
263
 
261
264
  def unit_id(text)
262
265
  norm_text = text
263
266
  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(/\^/, '')}"
267
+ unit = unit_instance(norm_text)
268
+ "U_#{unit ? unit.id&.gsub(/'/, '_') : norm_text&.gsub(/\*/, '.')&.gsub(/\^/, '')}"
267
269
  end
268
270
 
269
271
  def dimension_components(dims)
270
272
  return if dims.nil? || dims.empty?
271
273
 
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) }))
274
+ dim_attrs = { id: dim_id(dims) }
275
+ dims.map { |u| dimension1(u, dim_attrs) }
276
+ Model::Dimension.new(dim_attrs).to_xml
275
277
  end
276
278
 
277
279
  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('#', ''))))
280
+ unit = unit_instance(normtext)
281
+ return unless unit && unit.quantity_reference.size == 1 ||
282
+ quantity_instance(quantity)
283
+
284
+ id = (quantity || unit.quantity_reference&.first&.url).sub('#', '')
285
+ dim_url = unit.dimension_url
286
+ attributes = { id: id, name: quantity_name(id), dimension_url: dim_url }
287
+ Model::Quantity.new(attributes).to_xml
290
288
  end
291
289
 
292
290
  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
291
+ quantity_instance(id)&.quantity_name&.map do |content|
292
+ Model::Quantities::Name.new(content: content)
297
293
  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
294
  end
311
295
 
312
296
  def string_to_html_entity(string)
@@ -321,6 +305,14 @@ module Unitsml
321
305
  entities = HTMLEntities.new
322
306
  entities.decode(string)
323
307
  end
308
+
309
+ def underscore(str)
310
+ str.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
311
+ end
312
+
313
+ def class_name(klass)
314
+ klass.name.split("::").last
315
+ end
324
316
  end
325
317
  end
326
318
  end
@@ -1,3 +1,3 @@
1
1
  module Unitsml
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
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.0
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-20 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