unitsml 0.3.0 → 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 (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