unitsml 0.2.9 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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