unitsml 0.6.0 → 0.6.2

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +0 -3
  3. data/.rubocop_todo.yml +97 -412
  4. data/Gemfile +15 -14
  5. data/Rakefile +2 -2
  6. data/bin/console +3 -3
  7. data/lib/unitsml/dimension.rb +3 -3
  8. data/lib/unitsml/errors.rb +2 -2
  9. data/lib/unitsml/extender.rb +9 -9
  10. data/lib/unitsml/fenced.rb +3 -3
  11. data/lib/unitsml/formula.rb +29 -20
  12. data/lib/unitsml/intermediate_exp_rules.rb +30 -20
  13. data/lib/unitsml/model/dimension.rb +1 -1
  14. data/lib/unitsml/model/dimension_quantities.rb +8 -4
  15. data/lib/unitsml/model/prefix.rb +1 -1
  16. data/lib/unitsml/model/prefixes/name.rb +2 -2
  17. data/lib/unitsml/model/prefixes/symbol.rb +1 -1
  18. data/lib/unitsml/model/quantities/name.rb +2 -2
  19. data/lib/unitsml/model/quantity.rb +2 -2
  20. data/lib/unitsml/model/unit.rb +1 -1
  21. data/lib/unitsml/model/units/name.rb +2 -2
  22. data/lib/unitsml/model/units/root_units.rb +1 -1
  23. data/lib/unitsml/model/units/symbol.rb +4 -2
  24. data/lib/unitsml/model/units/system.rb +2 -2
  25. data/lib/unitsml/model/units.rb +5 -5
  26. data/lib/unitsml/namespace.rb +2 -2
  27. data/lib/unitsml/number.rb +11 -11
  28. data/lib/unitsml/parse.rb +30 -19
  29. data/lib/unitsml/parser.rb +11 -11
  30. data/lib/unitsml/prefix.rb +6 -4
  31. data/lib/unitsml/transform.rb +26 -26
  32. data/lib/unitsml/unit.rb +8 -6
  33. data/lib/unitsml/unitsdb/dimension.rb +24 -12
  34. data/lib/unitsml/unitsdb/dimensions.rb +4 -0
  35. data/lib/unitsml/unitsdb/prefix_reference.rb +3 -1
  36. data/lib/unitsml/unitsdb/si_derived_base.rb +14 -0
  37. data/lib/unitsml/unitsdb/unit.rb +11 -3
  38. data/lib/unitsml/unitsdb/units.rb +4 -0
  39. data/lib/unitsml/unitsdb.rb +9 -19
  40. data/lib/unitsml/utility.rb +81 -70
  41. data/lib/unitsml/version.rb +1 -1
  42. data/lib/unitsml.rb +31 -31
  43. data/unitsml.gemspec +22 -19
  44. metadata +6 -23
  45. data/unitsdb/Gemfile +0 -6
  46. data/unitsdb/LICENSE.md +0 -53
  47. data/unitsdb/README.adoc +0 -1253
  48. data/unitsdb/RELEASE-NOTES.adoc +0 -269
  49. data/unitsdb/dimensions.yaml +0 -1864
  50. data/unitsdb/prefixes.yaml +0 -874
  51. data/unitsdb/quantities.yaml +0 -3715
  52. data/unitsdb/scales.yaml +0 -97
  53. data/unitsdb/schemas/README.md +0 -159
  54. data/unitsdb/schemas/dimensions-schema.yaml +0 -153
  55. data/unitsdb/schemas/prefixes-schema.yaml +0 -155
  56. data/unitsdb/schemas/quantities-schema.yaml +0 -117
  57. data/unitsdb/schemas/scales-schema.yaml +0 -106
  58. data/unitsdb/schemas/unit_systems-schema.yaml +0 -116
  59. data/unitsdb/schemas/units-schema.yaml +0 -215
  60. data/unitsdb/spec/units_spec.rb +0 -22
  61. data/unitsdb/unit_systems.yaml +0 -78
  62. data/unitsdb/units.yaml +0 -14052
  63. data/unitsdb/validate_schemas.rb +0 -203
data/lib/unitsml/parse.rb CHANGED
@@ -1,50 +1,61 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'parslet'
3
+ require "parslet"
4
4
 
5
5
  module Unitsml
6
6
  class Parse < Parslet::Parser
7
7
  include IntermediateExpRules
8
8
 
9
- rule(:sqrt) { str('sqrt') }
10
- rule(:power) { str('^') >> slashed_number_int_exp.as(:power_numerator) }
11
- rule(:hyphen) { str('-') }
9
+ rule(:sqrt) { str("sqrt") }
10
+ rule(:power) { str("^") >> slashed_number_int_exp.as(:power_numerator) }
11
+ rule(:hyphen) { str("-") }
12
12
  rule(:number) { hyphen.maybe >> match(/[0-9]/).repeat(1) }
13
13
  rule(:spaces) { match(/\s/).repeat(1) }
14
14
  rule(:spaces?) { spaces.maybe }
15
15
 
16
- rule(:extender) { (forward_slashes | str('*')).as(:extender) }
17
- rule(:sequence) { single_letter_prefixes >> units | double_letter_prefixes >> units | units }
16
+ rule(:extender) { (forward_slashes | str("*")).as(:extender) }
17
+ rule(:sequence) do
18
+ (single_letter_prefixes >> units) | (double_letter_prefixes >> units) | units
19
+ end
18
20
 
19
- rule(:opening_paren) { str('(') }
20
- rule(:closing_paren) { str(')') }
21
+ rule(:opening_paren) { str("(") }
22
+ rule(:closing_paren) { str(")") }
21
23
  rule(:unit_and_power) { units >> power.maybe }
22
- rule(:slashed_number) { (number >> (forward_slashes >> number).maybe).as(:integer) }
23
- rule(:forward_slashes) { str('//') | str('/') }
24
- rule(:dimension_rules) { (sqrt_dimensions | powered_dimensions) >> extended_dimension_rules.maybe }
24
+ rule(:slashed_number) do
25
+ (number >> (forward_slashes >> number).maybe).as(:integer)
26
+ end
27
+ rule(:forward_slashes) { str("//") | str("/") }
28
+ rule(:dimension_rules) do
29
+ (sqrt_dimensions | powered_dimensions) >> extended_dimension_rules.maybe
30
+ end
25
31
  rule(:powered_dimensions) { dimensions >> power.maybe }
26
32
 
27
33
  rule(:units) do
28
- @@filtered_units ||= arr_to_expression(::Unitsml::Unitsdb.units.filtered, 'unit')
34
+ @@filtered_units ||= arr_to_expression(::Unitsml::Unitsdb.units.filtered,
35
+ "unit")
29
36
  end
30
37
 
31
38
  rule(:single_letter_prefixes) do
32
- @@prefixes1 ||= arr_to_expression(::Unitsml::Unitsdb.prefixes_by_size(1), 'prefix')
39
+ @@prefixes1 ||= arr_to_expression(::Unitsml::Unitsdb.prefixes_by_size(1),
40
+ "prefix")
33
41
  end
34
42
 
35
43
  rule(:double_letter_prefixes) do
36
- @@prefixes2 ||= arr_to_expression(::Unitsml::Unitsdb.prefixes_by_size(2), 'prefix')
44
+ @@prefixes2 ||= arr_to_expression(::Unitsml::Unitsdb.prefixes_by_size(2),
45
+ "prefix")
37
46
  end
38
47
 
39
48
  rule(:dimensions) do
40
- @@dimensions ||= arr_to_expression(::Unitsml::Unitsdb.dimensions.parsables.keys, 'dimension')
49
+ @@dimensions ||= arr_to_expression(
50
+ ::Unitsml::Unitsdb.dimensions.parsables.keys, "dimension"
51
+ )
41
52
  end
42
53
 
43
54
  rule(:prefixes_units) do
44
55
  (sqrt_sequence >> extended_prefixed_units.maybe) |
45
- (str('1').as(:unit) >> extended_prefixed_units.maybe) |
56
+ (str("1").as(:unit) >> extended_prefixed_units.maybe) |
46
57
  (unit_and_power >> extended_prefixed_units) |
47
- unit_and_power >> (any.absent? | (extender | opening_paren | closing_paren | spaces).present?) |
58
+ (unit_and_power >> (any.absent? | (extender | opening_paren | closing_paren | spaces).present?)) |
48
59
  (double_letter_prefixes >> unit_and_power >> extended_prefixed_units) |
49
60
  (double_letter_prefixes >> unit_and_power) |
50
61
  (single_letter_prefixes >> unit_and_power >> extended_prefixed_units) |
@@ -54,8 +65,8 @@ module Unitsml
54
65
  rule(:expression) do
55
66
  prefixes_units_int_exp |
56
67
  dimension_rules_int_exp |
57
- single_letter_prefixes >> hyphen |
58
- double_letter_prefixes >> hyphen
68
+ (single_letter_prefixes >> hyphen) |
69
+ (double_letter_prefixes >> hyphen)
59
70
  end
60
71
 
61
72
  root :expression
@@ -8,7 +8,7 @@ module Unitsml
8
8
  @regexp = /(quantity|name|symbol|multiplier):\s*/
9
9
  @text = extract_equation(text)
10
10
  @orig_text = @text
11
- @text = @text.gsub('', '-')
11
+ @text = @text.gsub("", "-")
12
12
  post_extras
13
13
  end
14
14
 
@@ -21,10 +21,10 @@ module Unitsml
21
21
  explicit_value: @extras_hash,
22
22
  root: true,
23
23
  orig_text: @orig_text,
24
- norm_text: text
24
+ norm_text: text,
25
25
  )
26
26
  update_units_exponents(formula.value, false)
27
- formula.value.first.only_instance = true if text.end_with?('-')
27
+ formula.value.first.only_instance = true if text.end_with?("-")
28
28
  formula
29
29
  end
30
30
 
@@ -33,7 +33,7 @@ module Unitsml
33
33
  if object.is_a?(Sqrt)
34
34
  object = object.value
35
35
  if object.respond_to?(:power_numerator)
36
- object.power_numerator = Number.new('0.5')
36
+ object.power_numerator = Number.new("0.5")
37
37
  else
38
38
  update_units_exponents([object], inverse, true)
39
39
  end
@@ -41,12 +41,12 @@ module Unitsml
41
41
 
42
42
  case object
43
43
  when Unit
44
- next object.power_numerator = Number.new('0.5') if sqrt
44
+ next object.power_numerator = Number.new("0.5") if sqrt
45
45
  next unless inverse
46
46
 
47
47
  inverse ? object.inverse_power_numerator : object.power_numerator
48
- when Dimension then object.power_numerator = Number.new('0.5') if sqrt
49
- when Extender then inverse = !inverse if ['/', '//'].any?(object.symbol)
48
+ when Dimension then object.power_numerator = Number.new("0.5") if sqrt
49
+ when Extender then inverse = !inverse if ["/", "//"].any?(object.symbol)
50
50
  when Formula then update_units_exponents(object.value, inverse)
51
51
  when Fenced then update_units_exponents([object.value], inverse, sqrt)
52
52
  end
@@ -57,7 +57,7 @@ module Unitsml
57
57
  return nil unless @regexp.match?(text)
58
58
 
59
59
  @extras_hash = {}
60
- texts_array = text&.split(',')&.map(&:strip)
60
+ texts_array = text&.split(",")&.map(&:strip)
61
61
  @text = texts_array&.shift
62
62
  texts_array&.map { |text| parse_extras(text) }
63
63
  end
@@ -65,16 +65,16 @@ module Unitsml
65
65
  def parse_extras(text)
66
66
  return nil unless @regexp.match?(text)
67
67
 
68
- key, _, value = text&.partition(':')
68
+ key, _, value = text&.partition(":")
69
69
  @extras_hash[key&.to_sym] ||= value&.strip
70
70
  end
71
71
 
72
72
  private
73
73
 
74
74
  def extract_equation(text)
75
- return text unless text&.start_with?('unitsml(')
75
+ return text unless text&.start_with?("unitsml(")
76
76
 
77
- text.delete_prefix('unitsml(').delete_suffix(')')
77
+ text.delete_prefix("unitsml(").delete_suffix(")")
78
78
  end
79
79
  end
80
80
  end
@@ -20,11 +20,13 @@ module Unitsml
20
20
  end
21
21
 
22
22
  def id
23
- @id ||= prefix_instance.identifiers.find { |prefix| prefix.type == 'nist' }&.id
23
+ @id ||= prefix_instance.identifiers.find do |prefix|
24
+ prefix.type == "nist"
25
+ end&.id
24
26
  end
25
27
 
26
28
  def name
27
- @name ||= prefix_instance.names.find { |name| name.lang == 'en' }.value
29
+ @name ||= prefix_instance.names.find { |name| name.lang == "en" }.value
28
30
  end
29
31
 
30
32
  def prefix_symbols
@@ -34,8 +36,8 @@ module Unitsml
34
36
  def to_mathml(_)
35
37
  symbol = Utility.string_to_html_entity(
36
38
  Utility.html_entity_to_unicode(
37
- prefix_symbols.html
38
- )
39
+ prefix_symbols.html,
40
+ ),
39
41
  )
40
42
  return symbol unless only_instance
41
43
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'parslet'
3
+ require "parslet"
4
4
  module Unitsml
5
5
  class Transform < Parslet::Transform
6
6
  rule(sqrt: simple(:sqrt)) { Sqrt.new(sqrt) }
@@ -24,7 +24,7 @@ module Unitsml
24
24
  rule(first_int_exp_set: simple(:first_set),
25
25
  second_int_exp_set: simple(:second_set)) do
26
26
  Formula.new(
27
- [Utility.set_to_fence(first_set), Utility.set_to_fence(second_set)]
27
+ [Utility.set_to_fence(first_set), Utility.set_to_fence(second_set)],
28
28
  )
29
29
  end
30
30
 
@@ -33,8 +33,8 @@ module Unitsml
33
33
  Formula.new(
34
34
  [
35
35
  first_set,
36
- second_set
37
- ]
36
+ second_set,
37
+ ],
38
38
  )
39
39
  end
40
40
 
@@ -43,8 +43,8 @@ module Unitsml
43
43
  Formula.new(
44
44
  [
45
45
  first_set,
46
- Utility.set_to_fence(second_set)
47
- ]
46
+ Utility.set_to_fence(second_set),
47
+ ],
48
48
  )
49
49
  end
50
50
 
@@ -76,8 +76,8 @@ module Unitsml
76
76
  [
77
77
  first_set,
78
78
  Extender.new(extender.to_s),
79
- second_set
80
- ]
79
+ second_set,
80
+ ],
81
81
  )
82
82
  end
83
83
 
@@ -88,8 +88,8 @@ module Unitsml
88
88
  [
89
89
  implicit_extended,
90
90
  Extender.new(extender.to_s),
91
- sequence
92
- ]
91
+ sequence,
92
+ ],
93
93
  )
94
94
  end
95
95
 
@@ -100,8 +100,8 @@ module Unitsml
100
100
  [
101
101
  int_exp,
102
102
  Extender.new(extender.to_s),
103
- sequence
104
- ]
103
+ sequence,
104
+ ],
105
105
  )
106
106
  end
107
107
 
@@ -112,8 +112,8 @@ module Unitsml
112
112
  [
113
113
  Unit.new(unit.to_s),
114
114
  Extender.new(extender.to_s),
115
- sequence
116
- ]
115
+ sequence,
116
+ ],
117
117
  )
118
118
  end
119
119
 
@@ -124,8 +124,8 @@ module Unitsml
124
124
  [
125
125
  Dimension.new(dimension.to_s),
126
126
  Extender.new(extender.to_s),
127
- sequence
128
- ]
127
+ sequence,
128
+ ],
129
129
  )
130
130
  end
131
131
 
@@ -135,7 +135,7 @@ module Unitsml
135
135
  Fenced.new(
136
136
  open_paren.to_s,
137
137
  int_exp,
138
- close_paren.to_s
138
+ close_paren.to_s,
139
139
  )
140
140
  end
141
141
 
@@ -145,7 +145,7 @@ module Unitsml
145
145
  Fenced.new(
146
146
  open_paren.to_s,
147
147
  Number.new(integer.to_s),
148
- close_paren.to_s
148
+ close_paren.to_s,
149
149
  )
150
150
  end
151
151
 
@@ -157,8 +157,8 @@ module Unitsml
157
157
  [
158
158
  Unit.new(unit.to_s, power_numerator),
159
159
  Extender.new(ext.to_s),
160
- sequence
161
- ]
160
+ sequence,
161
+ ],
162
162
  )
163
163
  end
164
164
 
@@ -170,8 +170,8 @@ module Unitsml
170
170
  [
171
171
  Dimension.new(dimension.to_s, power_numerator),
172
172
  Extender.new(ext.to_s),
173
- sequence
174
- ]
173
+ sequence,
174
+ ],
175
175
  )
176
176
  end
177
177
 
@@ -183,8 +183,8 @@ module Unitsml
183
183
  [
184
184
  Unit.new(unit.to_s, prefix: Prefix.new(prefix.to_s)),
185
185
  Extender.new(ext.to_s),
186
- sequence
187
- ]
186
+ sequence,
187
+ ],
188
188
  )
189
189
  end
190
190
 
@@ -197,8 +197,8 @@ module Unitsml
197
197
  [
198
198
  Unit.new(unit.to_s, power_numerator, prefix: Prefix.new(prefix.to_s)),
199
199
  Extender.new(ext.to_s),
200
- sequence
201
- ]
200
+ sequence,
201
+ ],
202
202
  )
203
203
  end
204
204
  end
data/lib/unitsml/unit.rb CHANGED
@@ -4,7 +4,8 @@ module Unitsml
4
4
  class Unit
5
5
  attr_accessor :unit_name, :power_numerator, :prefix
6
6
 
7
- SI_UNIT_SYSTEM = %w[si_base si_derived_special si_derived_non_special].freeze
7
+ SI_UNIT_SYSTEM = %w[si_base si_derived_special
8
+ si_derived_non_special].freeze
8
9
 
9
10
  def initialize(unit_name,
10
11
  power_numerator = nil,
@@ -41,7 +42,7 @@ module Unitsml
41
42
  if power_numerator
42
43
  value = msup_tag(
43
44
  { method_name: tag_name, value: value },
44
- options
45
+ options,
45
46
  )
46
47
  tag_name = :msup
47
48
  end
@@ -77,7 +78,7 @@ module Unitsml
77
78
  end
78
79
 
79
80
  def enumerated_name
80
- unit_instance.names.find { |name| name.lang == 'en' }&.value
81
+ unit_instance.names.find { |name| name.lang == "en" }&.value
81
82
  end
82
83
 
83
84
  def prefix_name
@@ -108,7 +109,7 @@ module Unitsml
108
109
  if power_numerator
109
110
  power_numerator.update_negative_sign
110
111
  else
111
- @power_numerator = Number.new('-1')
112
+ @power_numerator = Number.new("-1")
112
113
  end
113
114
  end
114
115
 
@@ -118,7 +119,7 @@ module Unitsml
118
119
  return unless power_numerator
119
120
 
120
121
  exp = power_numerator.raw_value
121
- "^#{exp}" if exp != '1'
122
+ "^#{exp}" if exp != "1"
122
123
  end
123
124
 
124
125
  def system_reference
@@ -132,7 +133,8 @@ module Unitsml
132
133
  [value, power_numerator.to_mathml(options)].flatten.each do |record|
133
134
  values = msup.public_send("#{record[:method_name]}_value") || []
134
135
  values += [record[:value]]
135
- msup.element_order << Lutaml::Xml::Element.new('Element', record[:method_name].to_s)
136
+ msup.element_order << Lutaml::Xml::Element.new("Element",
137
+ record[:method_name].to_s)
136
138
  msup.public_send("#{record[:method_name]}_value=", values)
137
139
  end
138
140
  msup
@@ -9,46 +9,50 @@ module Unitsml
9
9
  :vector
10
10
 
11
11
  def initialize(attrs)
12
- super
13
12
  @parsables = {}
14
13
  @processed_keys = []
15
14
  @parsable = false
15
+ super
16
16
  end
17
17
 
18
18
  def length=(value)
19
- quantities_common_code(:length, value)
19
+ quantities_common_code(:length, wrap_dimension_value(value))
20
20
  end
21
21
 
22
22
  def mass=(value)
23
- quantities_common_code(:mass, value)
23
+ quantities_common_code(:mass, wrap_dimension_value(value))
24
24
  end
25
25
 
26
26
  def time=(value)
27
- quantities_common_code(:time, value)
27
+ quantities_common_code(:time, wrap_dimension_value(value))
28
28
  end
29
29
 
30
30
  def thermodynamic_temperature=(value)
31
- quantities_common_code(:thermodynamic_temperature, value)
31
+ quantities_common_code(:thermodynamic_temperature,
32
+ wrap_dimension_value(value))
32
33
  end
33
34
 
34
35
  def amount_of_substance=(value)
35
- quantities_common_code(:amount_of_substance, value)
36
+ quantities_common_code(:amount_of_substance,
37
+ wrap_dimension_value(value))
36
38
  end
37
39
 
38
40
  def luminous_intensity=(value)
39
- quantities_common_code(:luminous_intensity, value)
41
+ quantities_common_code(:luminous_intensity, wrap_dimension_value(value))
40
42
  end
41
43
 
42
44
  def plane_angle=(value)
43
- quantities_common_code(:plane_angle, value)
45
+ quantities_common_code(:plane_angle, wrap_dimension_value(value))
44
46
  end
45
47
 
46
48
  def electric_current=(value)
47
- quantities_common_code(:electric_current, value)
49
+ quantities_common_code(:electric_current, wrap_dimension_value(value))
48
50
  end
49
51
 
50
52
  def dim_symbols
51
- processed_keys.map { |vec| public_send(vec)&.dim_symbols&.map(&:id) }.flatten.compact
53
+ processed_keys.map do |vec|
54
+ public_send(vec)&.dim_symbols&.map(&:id)
55
+ end.flatten.compact
52
56
  end
53
57
 
54
58
  def processed_symbol
@@ -58,11 +62,11 @@ module Unitsml
58
62
  def set_vector
59
63
  @set_vector ||= Utility::DIMS_VECTOR.map do |h|
60
64
  public_send(Utility.underscore(h))&.power
61
- end.join(':')
65
+ end.join(":")
62
66
  end
63
67
 
64
68
  def id
65
- identifiers.find { |id| id.type == 'nist' }&.id
69
+ identifiers.find { |id| id.type == "nist" }&.id
66
70
  end
67
71
 
68
72
  private
@@ -77,6 +81,14 @@ module Unitsml
77
81
  @parsable = true
78
82
  value.dim_symbols_ids(@parsables, id)
79
83
  end
84
+
85
+ def wrap_dimension_value(value)
86
+ return value if value.is_a?(DimensionQuantity)
87
+ return DimensionQuantity.new(value.to_hash) if value.is_a?(::Unitsdb::DimensionDetails)
88
+ return DimensionQuantity.new(value) if value.is_a?(Hash)
89
+
90
+ value
91
+ end
80
92
  end
81
93
  end
82
94
  end
@@ -3,6 +3,10 @@
3
3
  module Unitsml
4
4
  module Unitsdb
5
5
  class Dimensions < ::Unitsdb::Dimensions
6
+ def dimensions=(value)
7
+ super(value.map { |d| Dimension.new(d.to_hash) })
8
+ end
9
+
6
10
  def find_by_vector(vector)
7
11
  dimensions.each(&:set_vector)
8
12
  dimensions.find { |dim| dim.set_vector == vector }
@@ -16,7 +16,9 @@ module Unitsml
16
16
  end
17
17
 
18
18
  def prefix
19
- @prefix ||= Unitsdb.prefixes.find_by_id(id)
19
+ @prefix ||= ::Unitsdb.database.prefixes.find do |p|
20
+ p.identifiers.any? { |i| i.id == id }
21
+ end
20
22
  end
21
23
  end
22
24
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unitsml
4
+ module Unitsdb
5
+ class SiDerivedBase < ::Unitsdb::SiDerivedBase
6
+ def prefix_reference=(value)
7
+ return super if value.nil?
8
+ return super if value.is_a?(PrefixReference)
9
+
10
+ super(PrefixReference.new(value.to_hash))
11
+ end
12
+ end
13
+ end
14
+ end
@@ -3,18 +3,26 @@
3
3
  module Unitsml
4
4
  module Unitsdb
5
5
  class Unit < ::Unitsdb::Unit
6
+ def si_derived_bases=(value)
7
+ return super if value.nil?
8
+
9
+ super(value.map do |s|
10
+ SiDerivedBase.new(s.to_hash)
11
+ end)
12
+ end
13
+
6
14
  def dimension_url
7
15
  quantity_id = quantity_references[0].id
8
- quantity = Unitsdb.quantities.find_by_id(quantity_id)
16
+ quantity = Unitsml::Unitsdb.quantities.find_by_id(quantity_id)
9
17
  quantity.dimension_reference.id
10
18
  end
11
19
 
12
20
  def en_name
13
- names.find { |name| name.lang == 'en' }&.value
21
+ names.find { |name| name.lang == "en" }&.value
14
22
  end
15
23
 
16
24
  def nist_id
17
- identifiers.find { |id| id.type == 'nist' }&.id
25
+ identifiers.find { |id| id.type == "nist" }&.id
18
26
  end
19
27
  end
20
28
  end
@@ -3,6 +3,10 @@
3
3
  module Unitsml
4
4
  module Unitsdb
5
5
  class Units < ::Unitsdb::Units
6
+ def units=(value)
7
+ super(value.map { |u| Unit.new(u.to_hash) })
8
+ end
9
+
6
10
  def find_by_id(u_id)
7
11
  find(u_id, :id, :identifiers)
8
12
  end
@@ -10,44 +10,34 @@ module Unitsml
10
10
  autoload :Quantities, "#{__dir__}/unitsdb/quantities"
11
11
  autoload :PrefixReference, "#{__dir__}/unitsdb/prefix_reference"
12
12
  autoload :DimensionQuantity, "#{__dir__}/unitsdb/dimension_quantity"
13
+ autoload :SiDerivedBase, "#{__dir__}/unitsdb/si_derived_base"
13
14
 
14
15
  class << self
15
- def load_file(file_name)
16
- @@hash ||= {}
17
- @@hash[file_name] ||= File.read(valid_path(file_name))
18
- end
19
-
20
16
  def units
21
- @@units_file ||= Unitsml.get_class_from_register(:unitsdb_units).from_yaml(load_file(:units))
17
+ Units.new(units: ::Unitsdb.database.units)
22
18
  end
23
19
 
24
20
  def prefixes
25
- @@prefixes ||= Unitsml.get_class_from_register(:unitsdb_prefixes).from_yaml(load_file(:prefixes))
21
+ Prefixes.new(prefixes: ::Unitsdb.database.prefixes)
26
22
  end
27
23
 
28
24
  def dimensions
29
- @@dim_file ||= Unitsml.get_class_from_register(:unitsdb_dimensions).from_yaml(load_file(:dimensions))
25
+ Dimensions.new(dimensions: ::Unitsdb.database.dimensions)
30
26
  end
31
27
 
32
28
  def quantities
33
- @@quantities ||= Unitsml.get_class_from_register(:unitsdb_quantities).from_yaml(load_file(:quantities))
29
+ Quantities.new(quantities: ::Unitsdb.database.quantities)
34
30
  end
35
31
 
36
32
  def prefixes_array
37
- @@prefixes_array ||= prefixes.ascii_symbols.sort_by(&:length)
33
+ @prefixes_array ||= prefixes.ascii_symbols.sort_by(&:length)
38
34
  end
39
35
 
40
36
  def prefixes_by_size(size)
41
- @@sized_prefixes ||= {}
42
- return @@sized_prefixes[size] if @@sized_prefixes.key?(size)
43
-
44
- @@sized_prefixes[size] = prefixes_array.select { |p| p.size == size }
45
- end
37
+ @sized_prefixes ||= {}
38
+ return @sized_prefixes[size] if @sized_prefixes.key?(size)
46
39
 
47
- def valid_path(file_name)
48
- File.expand_path(
49
- File.join(__dir__, '..', '..', 'unitsdb', "#{file_name}.yaml")
50
- )
40
+ @sized_prefixes[size] = prefixes_array.select { |p| p.size == size }
51
41
  end
52
42
  end
53
43
  end