unitsml 0.2.9 → 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 (47) 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 +10 -1
  5. data/lib/unitsml/dimension.rb +47 -38
  6. data/lib/unitsml/error.rb +8 -0
  7. data/lib/unitsml/errors/plurimath_load_error.rb +19 -0
  8. data/lib/unitsml/extender.rb +24 -10
  9. data/lib/unitsml/formula.rb +87 -55
  10. data/lib/unitsml/model/dimension.rb +42 -0
  11. data/lib/unitsml/model/dimension_quantities/amount_of_substance.rb +10 -0
  12. data/lib/unitsml/model/dimension_quantities/electric_current.rb +10 -0
  13. data/lib/unitsml/model/dimension_quantities/length.rb +10 -0
  14. data/lib/unitsml/model/dimension_quantities/luminous_intensity.rb +10 -0
  15. data/lib/unitsml/model/dimension_quantities/mass.rb +10 -0
  16. data/lib/unitsml/model/dimension_quantities/plane_angle.rb +10 -0
  17. data/lib/unitsml/model/dimension_quantities/quantity.rb +17 -0
  18. data/lib/unitsml/model/dimension_quantities/thermodynamic_temperature.rb +10 -0
  19. data/lib/unitsml/model/dimension_quantities/time.rb +10 -0
  20. data/lib/unitsml/model/prefix.rb +28 -0
  21. data/lib/unitsml/model/prefixes/name.rb +19 -0
  22. data/lib/unitsml/model/prefixes/symbol.rb +19 -0
  23. data/lib/unitsml/model/quantities/name.rb +19 -0
  24. data/lib/unitsml/model/quantity.rb +24 -0
  25. data/lib/unitsml/model/unit.rb +31 -0
  26. data/lib/unitsml/model/units/enumerated_root_unit.rb +19 -0
  27. data/lib/unitsml/model/units/name.rb +19 -0
  28. data/lib/unitsml/model/units/root_units.rb +17 -0
  29. data/lib/unitsml/model/units/symbol.rb +26 -0
  30. data/lib/unitsml/model/units/system.rb +21 -0
  31. data/lib/unitsml/parse.rb +5 -7
  32. data/lib/unitsml/parser.rb +3 -3
  33. data/lib/unitsml/prefix.rb +21 -21
  34. data/lib/unitsml/sqrt.rb +10 -10
  35. data/lib/unitsml/unit.rb +35 -35
  36. data/lib/unitsml/unitsdb/dimension.rb +88 -0
  37. data/lib/unitsml/unitsdb/dimension_quantity.rb +15 -0
  38. data/lib/unitsml/unitsdb/dimensions.rb +38 -0
  39. data/lib/unitsml/unitsdb/prefixes.rb +22 -0
  40. data/lib/unitsml/unitsdb/quantities.rb +13 -0
  41. data/lib/unitsml/unitsdb/units.rb +44 -0
  42. data/lib/unitsml/unitsdb.rb +13 -71
  43. data/lib/unitsml/utility.rb +102 -108
  44. data/lib/unitsml/version.rb +1 -1
  45. data/lib/unitsml.rb +27 -6
  46. data/unitsml.gemspec +3 -8
  47. metadata +42 -81
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unitsml
4
+ module Unitsdb
5
+ class Quantities
6
+ attr_accessor :quantities
7
+
8
+ def find_by_id(q_id)
9
+ quantities.find { |quantity| quantity.id == q_id }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -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,10 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "ox"
3
+ require "unitsml/model/unit"
4
+ require "unitsml/model/prefix"
5
+ require "unitsml/model/quantity"
6
+ require "unitsml/model/dimension"
7
+
4
8
  module Unitsml
5
9
  module Utility
10
+ Ox.default_options = { encoding: "UTF-8" }
6
11
 
7
- UNITSML_NS = "https://schema.unitsml.org/unitsml/1.0".freeze
8
12
  # Unit to dimension
9
13
  U2D = {
10
14
  "m" => { dimension: "Length", order: 1, symbol: "L" },
@@ -43,10 +47,12 @@ module Unitsml
43
47
  ].freeze
44
48
 
45
49
  class << self
46
- include Unitsml::Unitsdb
50
+ def unit_instance(unit)
51
+ Unitsdb.units.find_by_symbol_id(unit)
52
+ end
47
53
 
48
- def fields(unit)
49
- Unitsdb.units.dig(unit, :fields)
54
+ def quantity_instance(id)
55
+ Unitsdb.quantities.find_by_id(id)
50
56
  end
51
57
 
52
58
  def units2dimensions(units)
@@ -67,10 +73,9 @@ module Unitsml
67
73
  def dim_id(dims)
68
74
  return nil if dims.nil? || dims.empty?
69
75
 
70
- dimensions = Unitsdb.dimensions_hash.values
71
76
  dim_hash = dims.each_with_object({}) { |h, m| m[h[:dimension]] = h }
72
77
  dims_vector = DIMS_VECTOR.map { |h| dim_hash.dig(h, :exponent) }.join(":")
73
- 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
74
79
  "D_" + dims.map do |d|
75
80
  (U2D.dig(d[:unit], :symbol) || Dim2D.dig(d[:id], :symbol)) +
76
81
  (d[:exponent] == 1 ? "" : float_to_display(d[:exponent]))
@@ -84,18 +89,18 @@ module Unitsml
84
89
  def decompose_unit(u)
85
90
  if u&.unit_name == "g" || u.system_type == "SI_base"
86
91
  { unit: u, prefix: u&.prefix }
87
- elsif !u.si_derived_bases
92
+ elsif u.si_derived_bases.empty?
88
93
  { unit: Unit.new("unknown") }
89
94
  else
90
- u.si_derived_bases.each_with_object([]) do |k, m|
91
- prefix = if !k["prefix"].nil? && !k["prefix"].empty?
92
- 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)
93
98
  else
94
99
  u.prefix
95
100
  end
96
- unit_name = Unitsdb.load_units.dig(k.dig("id"), "unit_symbols", 0, "id")
97
- exponent = (k["power"]&.to_i || 1) * (u.power_numerator&.to_f || 1)
98
- 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,
99
104
  unit: Unit.new(unit_name, exponent, prefix: prefix),
100
105
  }
101
106
  end
@@ -118,9 +123,9 @@ module Unitsml
118
123
 
119
124
  def prefix_object(prefix)
120
125
  return prefix unless prefix.is_a?(String)
121
- return nil unless Unitsdb.prefixes.any?(prefix)
126
+ return nil unless Unitsdb.prefixes_array.any?(prefix)
122
127
 
123
- prefix.is_a?(String) ? Prefix.new(prefix) : prefix
128
+ Prefix.new(prefix)
124
129
  end
125
130
 
126
131
  def combine_prefixes(p1, p2)
@@ -129,7 +134,7 @@ module Unitsml
129
134
  return p2.symbolid if p1.nil?
130
135
  return "unknown" if p1.base != p2.base
131
136
 
132
- Unitsdb.prefixes_hash.each do |prefix_name, _|
137
+ Unitsdb.prefixes_array.each do |prefix_name|
133
138
  p = prefix_object(prefix_name)
134
139
  return p if p.base == p1.base && p.power == p1.power + p2.power
135
140
  end
@@ -137,15 +142,16 @@ module Unitsml
137
142
  "unknown"
138
143
  end
139
144
 
140
- def unit(units, formula, dims, norm_text, name)
141
- attributes = { xmlns: UNITSML_NS, "xml:id": unit_id(norm_text) }
142
- attributes[:dimensionURL] = "##{dim_id(dims)}" if dims
143
- unit_node = ox_element("Unit", attributes: attributes)
144
- nodes = Array(unitsystem(units))
145
- nodes += Array(unitname(units, norm_text, name))
146
- nodes += Array(unitsymbols(formula))
147
- nodes += Array(rootunits(units))
148
- 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
149
155
  .gsub("&lt;", "<")
150
156
  .gsub("&gt;", ">")
151
157
  .gsub("&amp;", "&")
@@ -154,8 +160,9 @@ module Unitsml
154
160
  end
155
161
 
156
162
  def unitname(units, text, name)
157
- name ||= Unitsdb.units[text] ? Unit.new(text).enumerated_name : text
158
- ox_element("UnitName", attributes: { "xml:lang": "en" }) << name
163
+ Model::Units::Name.new(
164
+ name: unit_instance(text)&.unit_name&.first || text
165
+ )
159
166
  end
160
167
 
161
168
  def postprocess_normtext(units)
@@ -166,47 +173,44 @@ module Unitsml
166
173
  unit.power_numerator && unit.power_numerator != "1" ? "^#{unit.power_numerator}" : ""
167
174
  end
168
175
 
169
- def unitsymbols(formula)
170
- [
171
- (ox_element("UnitSymbol", attributes: { type: "HTML" }) << formula.to_html),
172
- (ox_element("UnitSymbol", attributes: { type: "MathMl" }) << Ox.parse(formula.to_mathml)),
173
- ]
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
174
180
  end
175
181
 
176
182
  def unitsystem(units)
177
183
  ret = []
178
184
  if units.any? { |u| u.system_name != "SI" }
179
- 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")
180
186
  end
181
187
  if units.any? { |u| u.system_name == "SI" }
182
188
  if units.size == 1
183
189
  base = units[0].system_type == "SI-base"
184
190
  base = true if units[0].unit_name == "g" && units[0]&.prefix_name == "k"
185
191
  end
186
- 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'))
187
193
  end
188
194
  ret
189
195
  end
190
196
 
191
197
  def dimension(norm_text)
192
- return unless fields(norm_text)&.dig("dimension_url")
193
-
194
- dim_id = fields(norm_text).dig("dimension_url").sub("#", '')
195
- dim_node = ox_element("Dimension", attributes: { xmlns: UNITSML_NS, "xml:id": dim_id })
196
- Ox.dump(
197
- update_nodes(
198
- dim_node,
199
- dimid2dimensions(dim_id)&.compact&.map { |u| dimension1(u) }
200
- )
201
- )
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
202
205
  end
203
206
 
204
- def dimension1(dim)
205
- 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(
206
211
  symbol: dim[:symbol],
207
- powerNumerator: float_to_display(dim[:exponent])
208
- }
209
- ox_element(dim[:dimension], attributes: attributes)
212
+ power_numerator: float_to_display(dim[:exponent])
213
+ )
210
214
  end
211
215
 
212
216
  def float_to_display(float)
@@ -214,97 +218,79 @@ module Unitsml
214
218
  end
215
219
 
216
220
  def dimid2dimensions(normtext)
217
- dims ||= Unitsdb.load_dimensions[normtext]
218
- dims&.keys&.reject { |d| d.is_a?(Symbol) }&.map do |k|
219
- 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
220
224
  next unless DIMS_VECTOR.include?(humanized)
221
225
 
226
+ dim_quantity = dims.public_send(processed_key)
222
227
  {
223
228
  dimension: humanized,
224
- symbol: dims.dig(k, "symbol"),
225
- exponent: dims.dig(k, "powerNumerator")
229
+ symbol: dim_quantity.symbol,
230
+ exponent: dim_quantity.power_numerator,
226
231
  }
227
232
  end
228
233
  end
229
234
 
230
- def prefixes(units)
235
+ def prefixes(units, options)
231
236
  uniq_prefixes = units.map { |unit| unit.prefix }.compact.uniq {|d| d.prefix_name }
232
- uniq_prefixes.map do |p|
233
- prefix_attr = { xmlns: UNITSML_NS, prefixBase: p&.base, prefixPower: p&.power, "xml:id": p&.id }
234
- prefix_node = ox_element("Prefix", attributes: prefix_attr)
235
- contents = []
236
- contents << (ox_element("PrefixName", attributes: { "xml:lang": "en" }) << p&.name)
237
- contents << (ox_element("PrefixSymbol", attributes: { type: "ASCII" }) << p&.to_asciimath)
238
- contents << (ox_element("PrefixSymbol", attributes: { type: "unicode" }) << p&.to_unicode)
239
- contents << (ox_element("PrefixSymbol", attributes: { type: "LaTex" }) << p&.to_latex)
240
- contents << (ox_element("PrefixSymbol", attributes: { type: "HTML" }) << p&.to_html)
241
- 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;", "&")
242
248
  end.join("\n")
243
249
  end
244
250
 
245
251
  def rootunits(units)
246
252
  return if units.size == 1 && !units[0].prefix
247
253
 
248
- root_unit = ox_element("RootUnits")
249
- units.each do |u|
250
- attributes = { unit: u.enumerated_name }
251
- attributes[:prefix] = u.prefix_name if u.prefix
252
- u.power_numerator && u.power_numerator != "1" and
253
- attributes[:powerNumerator] = u.power_numerator
254
- 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)
255
260
  end
256
- root_unit
261
+ Model::Units::RootUnits.new(enumerated_root_unit: enum_root_units)
257
262
  end
258
263
 
259
264
  def unit_id(text)
260
265
  norm_text = text
261
266
  text = text&.gsub(/[()]/, "")
262
- /-$/.match(text) and return Unitsdb.prefixes[text.sub(/-$/, "")][:id]
263
- unit_hash = Unitsdb.units[norm_text]
264
- "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(/\^/, '')}"
265
269
  end
266
270
 
267
271
  def dimension_components(dims)
268
272
  return if dims.nil? || dims.empty?
269
273
 
270
- attributes = { xmlns: UNITSML_NS, "xml:id": dim_id(dims) }
271
- dim_node = ox_element("Dimension", attributes: attributes)
272
- 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
273
277
  end
274
278
 
275
279
  def quantity(normtext, quantity)
276
- units = Unitsdb.units
277
- quantity_references = units.dig(normtext, :fields, "quantity_reference")
278
- return unless units[normtext] && quantity_references.size == 1 ||
279
- Unitsdb.quantities[quantity]
280
-
281
- id = quantity || quantity_references&.first&.dig("url")
282
- attributes = { xmlns: UNITSML_NS, "xml:id": id.sub('#', '') }
283
- dim_url = units.dig(normtext, :fields, "dimension_url")
284
- dim_url and attributes[:dimensionURL] = "#{dim_url}"
285
- attributes[:quantityType] = "base"
286
- quantity_element = ox_element("Quantity", attributes: attributes)
287
- 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
288
288
  end
289
289
 
290
290
  def quantity_name(id)
291
- ret = []
292
- Unitsdb.quantities[id]&.dig("quantity_name")&.each do |q|
293
- node = (ox_element("QuantityName", attributes: { "xml:lang": "en-US" }) << q)
294
- ret << node
291
+ quantity_instance(id)&.quantity_name&.map do |content|
292
+ Model::Quantities::Name.new(content: content)
295
293
  end
296
- ret
297
- end
298
-
299
- def ox_element(node, attributes: [])
300
- element = Ox::Element.new(node)
301
- attributes&.each { |attr_key, attr_value| element[attr_key] = attr_value }
302
- element
303
- end
304
-
305
- def update_nodes(element, nodes)
306
- nodes&.each { |node| element << node unless node.nil? }
307
- element
308
294
  end
309
295
 
310
296
  def string_to_html_entity(string)
@@ -319,6 +305,14 @@ module Unitsml
319
305
  entities = HTMLEntities.new
320
306
  entities.decode(string)
321
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
322
316
  end
323
317
  end
324
318
  end
@@ -1,3 +1,3 @@
1
1
  module Unitsml
2
- VERSION = "0.2.9"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/unitsml.rb CHANGED
@@ -1,3 +1,14 @@
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
+
11
+ require "unitsml/error"
1
12
  require "unitsml/sqrt"
2
13
  require "unitsml/unit"
3
14
  require "unitsml/parse"
@@ -9,9 +20,19 @@ require "unitsml/unitsdb"
9
20
  require "unitsml/extender"
10
21
  require "unitsml/dimension"
11
22
  require "unitsml/transform"
12
-
13
- module Unitsml
14
- def self.parse(string)
15
- Unitsml::Parser.new(string).parse
16
- end
17
- 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,12 +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 "plurimath", "~> 0.8.4"
32
- spec.add_development_dependency "byebug"
33
- spec.add_development_dependency "equivalent-xml"
34
- spec.add_development_dependency "pry", "~> 0.12.2"
35
- spec.add_development_dependency "rake", "~> 12.0"
36
- spec.add_development_dependency "rspec", "~> 3.6"
37
- spec.add_development_dependency "rubocop", "= 0.54.0"
38
- spec.add_development_dependency "simplecov", "~> 0.15"
31
+ spec.add_dependency "mml"
32
+ spec.add_dependency "parslet"
33
+ spec.add_dependency "unitsdb"
39
34
  end