unit_measurements 3.8.0 → 4.0.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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -2
  3. data/Gemfile.lock +1 -1
  4. data/README.md +68 -80
  5. data/lib/unit_measurements/arithmetic.rb +4 -4
  6. data/lib/unit_measurements/base.rb +2 -3
  7. data/lib/unit_measurements/comparison.rb +2 -1
  8. data/lib/unit_measurements/conversion.rb +5 -5
  9. data/lib/unit_measurements/errors/primitive_unit_already_set_error.rb +11 -0
  10. data/lib/unit_measurements/formatter.rb +2 -2
  11. data/lib/unit_measurements/math.rb +5 -5
  12. data/lib/unit_measurements/measurement.rb +5 -11
  13. data/lib/unit_measurements/normalizer.rb +21 -28
  14. data/lib/unit_measurements/unit.rb +8 -5
  15. data/lib/unit_measurements/unit_group.rb +41 -7
  16. data/lib/unit_measurements/unit_group_builder.rb +10 -27
  17. data/lib/unit_measurements/unit_groups/acceleration.rb +8 -6
  18. data/lib/unit_measurements/unit_groups/all.rb +6 -6
  19. data/lib/unit_measurements/unit_groups/amount_of_substance.rb +4 -4
  20. data/lib/unit_measurements/unit_groups/angular_acceleration.rb +5 -5
  21. data/lib/unit_measurements/unit_groups/angular_velocity.rb +14 -14
  22. data/lib/unit_measurements/unit_groups/area.rb +8 -10
  23. data/lib/unit_measurements/unit_groups/density.rb +7 -8
  24. data/lib/unit_measurements/unit_groups/electric_charge.rb +7 -9
  25. data/lib/unit_measurements/unit_groups/electric_conductance.rb +18 -0
  26. data/lib/unit_measurements/unit_groups/electric_current.rb +6 -8
  27. data/lib/unit_measurements/unit_groups/electric_potential.rb +19 -0
  28. data/lib/unit_measurements/unit_groups/electrical_capacitance.rb +18 -0
  29. data/lib/unit_measurements/unit_groups/electrical_elastance.rb +13 -0
  30. data/lib/unit_measurements/unit_groups/electrical_inductance.rb +18 -0
  31. data/lib/unit_measurements/unit_groups/electrical_resistance.rb +19 -0
  32. data/lib/unit_measurements/unit_groups/force.rb +9 -11
  33. data/lib/unit_measurements/unit_groups/length.rb +7 -9
  34. data/lib/unit_measurements/unit_groups/luminous_intensity.rb +4 -4
  35. data/lib/unit_measurements/unit_groups/magnetic_field.rb +4 -4
  36. data/lib/unit_measurements/unit_groups/magnetic_flux.rb +6 -7
  37. data/lib/unit_measurements/unit_groups/magnetic_induction.rb +4 -6
  38. data/lib/unit_measurements/unit_groups/plane_angle.rb +11 -10
  39. data/lib/unit_measurements/unit_groups/quantity.rb +7 -5
  40. data/lib/unit_measurements/unit_groups/solid_angle.rb +7 -7
  41. data/lib/unit_measurements/unit_groups/sound_level.rb +4 -4
  42. data/lib/unit_measurements/unit_groups/temperature.rb +4 -4
  43. data/lib/unit_measurements/unit_groups/time.rb +13 -12
  44. data/lib/unit_measurements/unit_groups/velocity.rb +12 -16
  45. data/lib/unit_measurements/unit_groups/volume.rb +12 -14
  46. data/lib/unit_measurements/unit_groups/weight.rb +5 -5
  47. data/lib/unit_measurements/version.rb +1 -1
  48. data/units.md +72 -72
  49. metadata +9 -10
  50. data/lib/unit_measurements/unit_groups/capacitance.rb +0 -19
  51. data/lib/unit_measurements/unit_groups/conductance.rb +0 -19
  52. data/lib/unit_measurements/unit_groups/elastance.rb +0 -12
  53. data/lib/unit_measurements/unit_groups/inductance.rb +0 -19
  54. data/lib/unit_measurements/unit_groups/resistance.rb +0 -20
  55. data/lib/unit_measurements/unit_groups/voltage.rb +0 -21
  56. data/lib/unit_measurements/unit_methods.rb +0 -45
  57. data/lib/unit_measurements/unit_system.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1f5b33a4d36085c2a15c637a565132cfa411810b29272bac86e079892a7c8ee
4
- data.tar.gz: db220a3d6272793892f82d1bcb3a8ecea8e499792230403318ce18566fc5afa0
3
+ metadata.gz: df02b48d8940d23d2ef2462c58fbdfdd63c5d5d7fbfade71a40a7ddb1508f7b0
4
+ data.tar.gz: d3773e766bd46d8fdc4c3375bfd195506082d6125aaea66f48dd23891a009ae6
5
5
  SHA512:
6
- metadata.gz: 7cfa24b914b602f492657014bacdd4ebb445c412aa06a99b73adb43c5e5f7c92213677c7b7487d7750f20e1877d83a5385cd57b1c29217993d774c40893ad7a6
7
- data.tar.gz: c5f3e296d5c475889350139ef26830983d9515394ee8885854df32cfc6c27ec4f4ccb22e676637df557dbb827d6ecec04ebf3bbe7d7e9418fc1107b6258d4a68
6
+ metadata.gz: ec6a76228693aff998a8ea032a0f8f03732ee137a55ac9a29708b2f346919a5f134463ce117ffefa3374c0b7f2fe13ad5ff699b4f68f7c03703903d2c1b6f94f
7
+ data.tar.gz: e7de3fa4e74ed1e426b19dcec1e7a08d3f3cebf72b608f841a4a4a95302006a4da4b4b4e8421646f6c1a0345419cb0febe079fd0c033fe02a93f0b4dd498f84a
data/CHANGELOG.md CHANGED
@@ -1,4 +1,28 @@
1
- ## [3.8.0](https://github.com/shivam091/unit_measurements/compare/v3.7.0...v3.8.0) - 2023-10-02
1
+ ## [4.0.0](https://github.com/shivam091/unit_measurements/compare/v3.8.0...v4.0.0) - 2023-10-04
2
+
3
+ ### What's new
4
+
5
+ - Added support to set `primitive` unit for each unit group.
6
+ - Added support to set `system` in `Unit` metadata.
7
+ - Added `UnitMeasurements::PrimitiveUnitAlreadySetError` error if `primitive` unit is defined more than one time in the unit group.
8
+
9
+ ### What's changed
10
+
11
+ - Renamed `Voltage` unit group class to `ElectricPotential`.
12
+ - Renamed `Conductance` unit group class to `ElectricConductance`.
13
+ - Renamed `Resistance` unit group class to `ElectricalResistance`.
14
+ - Renamed `Elastance` unit group class to `ElectricalElastance`.
15
+ - Renamed `Capacitance` unit group class to `ElectricalCapacitance`.
16
+ - Renamed `Inductance` unit group class to `ElectricalInductance`.
17
+
18
+ ### What's removed
19
+
20
+ - Removed support to build `UnitSystem` instances for each system within the unit group.
21
+ - Removed support to set `primitive` unit for each unit system within the unit group.
22
+
23
+ ----------
24
+
25
+ ## [3.8.0](https://github.com/shivam091/unit_measurements/compare/v3.7.0...v3.8.0) - 2023-10-03
2
26
 
3
27
  ### What's new
4
28
 
@@ -7,7 +31,7 @@
7
31
 
8
32
  ----------
9
33
 
10
- ## [3.7.0](https://github.com/shivam091/unit_measurements/compare/v3.6.0...v3.7.0) - 2023-10-01
34
+ ## [3.7.0](https://github.com/shivam091/unit_measurements/compare/v3.6.0...v3.7.0) - 2023-10-02
11
35
 
12
36
  ### What's new
13
37
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- unit_measurements (3.8.0)
4
+ unit_measurements (4.0.0)
5
5
  activesupport (~> 7.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -64,7 +64,7 @@ viz., `UnitMeasurements::Weight`, `UnitMeasurements::Length`, etc.
64
64
  **Initialize a measurement:**
65
65
 
66
66
  ```ruby
67
- UnitMeasurements::Length.new(1, :km)
67
+ UnitMeasurements::Length.new(1, "km")
68
68
  #=> 1 km
69
69
  ```
70
70
 
@@ -76,21 +76,21 @@ This gem allows you to convert among units of same unit group. You can convert m
76
76
  You can use `#convert_to` as:
77
77
 
78
78
  ```ruby
79
- UnitMeasurements::Length.new(1, :km).convert_to(:m)
79
+ UnitMeasurements::Length.new(1, "km").convert_to("m")
80
80
  #=> 1000.0 m
81
81
  ```
82
82
 
83
83
  If you want to modify measurement object itself, you can use `#convert_to!` method as:
84
84
 
85
85
  ```ruby
86
- UnitMeasurements::Length.new(1, :km).convert_to!(:m)
86
+ UnitMeasurements::Length.new(1, "km").convert_to!("m")
87
87
  #=> 1000.0 m
88
88
  ```
89
89
 
90
90
  You can also chain call of `#convert_to` and `#convert_to!` methods as:
91
91
 
92
92
  ```ruby
93
- UnitMeasurements::Length.new(100, :m).convert_to(:ft).convert_to!(:in)
93
+ UnitMeasurements::Length.new(100, "m").convert_to("ft").convert_to!("in")
94
94
  #=> 3937.00787401574071916010498688 in
95
95
  ```
96
96
 
@@ -113,11 +113,11 @@ UnitMeasurements::Length.parse("1 km to m")
113
113
  **Parse scientific numbers, source unit, and (or) target unit:**
114
114
 
115
115
  ```ruby
116
- UnitMeasurements::Length.new(BigDecimal(2), :km).convert_to(:m)
116
+ UnitMeasurements::Length.new(BigDecimal(2), "km").convert_to("m")
117
117
  #=> 20000.0 m
118
- UnitMeasurements::Length.new("2e+2", :km).convert_to(:m)
118
+ UnitMeasurements::Length.new("2e+2", "km").convert_to("m")
119
119
  #=> 200000.0 m
120
- UnitMeasurements::Length.parse("2e² km").convert_to(:m)
120
+ UnitMeasurements::Length.parse("2e² km").convert_to("m")
121
121
  #=> 200000.0 m
122
122
  UnitMeasurements::Length.parse("2e+2 km to m")
123
123
  #=> 200000.0 m
@@ -130,11 +130,11 @@ Supported special characters for exponents are `⁰`, `¹`, `²`, `³`, `⁴`, `
130
130
  **Parse complex numbers, source unit, and (or) target unit:**
131
131
 
132
132
  ```ruby
133
- UnitMeasurements::Length.new(Complex(2, 3), :km).convert_to(:m)
133
+ UnitMeasurements::Length.new(Complex(2, 3), "km").convert_to("m")
134
134
  #=> 2000.0+3000.0i m
135
- UnitMeasurements::Length.new("2+3i", :km).convert_to(:m)
135
+ UnitMeasurements::Length.new("2+3i", "km").convert_to("m")
136
136
  #=> 2000.0+3000.0i m
137
- UnitMeasurements::Length.parse("2+3i km").convert_to(:m)
137
+ UnitMeasurements::Length.parse("2+3i km").convert_to("m")
138
138
  #=> 2000.0+3000.0i m
139
139
  UnitMeasurements::Length.parse("2+3i km to m")
140
140
  #=> 2000.0+3000.0i m
@@ -143,19 +143,19 @@ UnitMeasurements::Length.parse("2+3i km to m")
143
143
  **Parse fractional/mixed fractional numbers, source unit, and (or) target unit:**
144
144
 
145
145
  ```ruby
146
- UnitMeasurements::Length.new(Rational(2, 3), :km).convert_to(:m)
146
+ UnitMeasurements::Length.new(Rational(2, 3), "km").convert_to("m")
147
147
  #=> 666.666666666667 m
148
- UnitMeasurements::Length.new("2/3", :km).convert_to(:m)
148
+ UnitMeasurements::Length.new("2/3", "km").convert_to("m")
149
149
  #=> 666.666666666667 m
150
- UnitMeasurements::Length.new("½", :km).convert_to(:m)
150
+ UnitMeasurements::Length.new("½", "km").convert_to("m")
151
151
  #=> 500.0 m
152
- UnitMeasurements::Length.parse("2 ½ km").convert_to(:m)
152
+ UnitMeasurements::Length.parse("2 ½ km").convert_to("m")
153
153
  #=> 2500.0 m
154
- UnitMeasurements::Length.parse("2/3 km").convert_to(:m)
154
+ UnitMeasurements::Length.parse("2/3 km").convert_to("m")
155
155
  #=> 666.666666666667 m
156
156
  UnitMeasurements::Length.parse("2/3 km to m")
157
157
  #=> 666.666666666667 m
158
- UnitMeasurements::Length.parse("2 1/2 km").convert_to(:m)
158
+ UnitMeasurements::Length.parse("2 1/2 km").convert_to("m")
159
159
  #=> 2500.0 m
160
160
  UnitMeasurements::Length.parse("2 ½ km to m")
161
161
  #=> 2500.0 m
@@ -166,9 +166,9 @@ Supported special characters for fractional notations are `¼`, `½`, `¾`, `⅓
166
166
  **Parse ratios, source unit, and (or) target unit:**
167
167
 
168
168
  ```ruby
169
- UnitMeasurements::Length.new("1:2", :km).convert_to(:m)
169
+ UnitMeasurements::Length.new("1:2", "km").convert_to("m")
170
170
  #=> 500.0 m
171
- UnitMeasurements::Length.parse("1:2 km").convert_to(:m)
171
+ UnitMeasurements::Length.parse("1:2 km").convert_to("m")
172
172
  #=> 500.0 m
173
173
  UnitMeasurements::Length.parse("1:2 km to m")
174
174
  #=> 500.0 m
@@ -180,112 +180,99 @@ If you want to format measurement to certain format, you can use `#format` metho
180
180
  If format is not specified, it defaults to `"%.2<value>f %<unit>s"`.
181
181
 
182
182
  ```ruby
183
- UnitMeasurements::Length.new(100, :m).to(:in).format
183
+ UnitMeasurements::Length.new(100, "m").to("in").format
184
184
  #=> "3937.01 in"
185
- UnitMeasurements::Length.new(100, :m).to(:in).format("%.4<quantity>f %<unit>s")
185
+ UnitMeasurements::Length.new(100, "m").to("in").format("%.4<quantity>f %<unit>s")
186
186
  #=> "3937.0079 in"
187
- UnitMeasurements::Length.new(100, :m).to(:in).format("%.4<quantity>f")
187
+ UnitMeasurements::Length.new(100, "m").to("in").format("%.4<quantity>f")
188
188
  #=> "3937.0079"
189
189
  ```
190
190
 
191
191
  **Extract the unit and the quantity from measurement:**
192
192
 
193
193
  ```ruby
194
- length = UnitMeasurements::Length.new(1, :km)
194
+ length = UnitMeasurements::Length.new(1, "km")
195
195
  length.quantity
196
196
  #=> 1
197
197
  length.unit
198
198
  #=> #<UnitMeasurements::Unit: km (kilometer, kilometers, kilometre, kilometres)>
199
199
  ```
200
200
 
201
- **See all unit systems defined in the unit group:**
201
+ **See primitive unit of the unit group:**
202
202
 
203
203
  ```ruby
204
- UnitMeasurements::Length.systems
205
- #=> [#<UnitMeasurements::UnitSystem:0x00007fa1a46d11c0 @name=:metric, @primitive=#<UnitMeasurements::Unit: m (meter, meters, metre, metres)>, @units=[]>, ...]
206
- ```
207
-
208
- **Finding unit system within the unit group:**
209
-
210
- ```ruby
211
- UnitMeasurements::Length.system_for(:imperial)
212
- #=> #<UnitMeasurements::UnitSystem:0x00007f87a348e680
213
- # @name=:imperial,
214
- # @primitive=#<UnitMeasurements::Unit: in (", inch, inches)>,
215
- # @units=[#<UnitMeasurements::Unit: in (", inch, inches)>, #<UnitMeasurements::Unit: ft (', feet, foot)>, ...]>
204
+ UnitMeasurements::Length.primitive
205
+ #=> #<UnitMeasurements::Unit: m (meter, meters, metre, metres)>
216
206
  ```
217
207
 
218
- **_Note: The `UnitMeasurements::UnitGroup` and `UnitMeasurements::UnitSystem` instances share the same set of methods for unit handling.
219
- You can use these methods interchangeably between the two classes._**
220
-
221
- **See all units of the unit group/unit system:**
208
+ **See all units of the unit group:**
222
209
 
223
210
  ```ruby
224
211
  UnitMeasurements::Length.units
225
212
  #=> [#<UnitMeasurements::Unit: m (meter, meters, metre, metres)>, ..., ...]
226
213
  ```
227
214
 
228
- **See names of all valid units of the unit group/unit system:**
215
+ **See names of all valid units of the unit group:**
229
216
 
230
217
  ```ruby
231
218
  UnitMeasurements::Length.unit_names
232
219
  #=> ["m", "km", "mi", "ft", "in", "yd", ...]
233
220
  ```
234
221
 
235
- **See all valid units of the unit group/unit system along with their aliases:**
222
+ **See all valid units of the unit group along with their aliases:**
236
223
 
237
224
  ```ruby
238
225
  UnitMeasurements::Length.unit_names_with_aliases
239
226
  #=> ["g", "meter", "metre", "meters", "metres", "km", "kilometer", "kilometre", "kilometers", "kilometres", "in", "inch", "inches", "yd", "yard", "yards", ...]
240
227
  ```
241
228
 
242
- **Finding units within the unit group/unit system:**
229
+ **Finding units within the unit group:**
243
230
 
244
231
  You can use `#unit_for` or `#unit_for!` (aliased as `#[]`) to find units within
245
232
  the unit group. `#unit_for!` method returns error if a unit is not present in the
246
233
  unit group.
247
234
 
248
235
  ```ruby
249
- UnitMeasurements::Length.unit_for(:m)
236
+ UnitMeasurements::Length.unit_for("m")
250
237
  #=> #<UnitMeasurements::Unit: m (meter, meters, metre, metres)>
251
- UnitMeasurements::Length.unit_for(:z)
238
+ UnitMeasurements::Length.unit_for("z")
252
239
  #=> nil
253
- UnitMeasurements::Length.unit_for!(:m)
240
+ UnitMeasurements::Length.unit_for!("m")
254
241
  #=> #<UnitMeasurements::Unit: m (meter, meters, metre, metres)>
255
- UnitMeasurements::Length.unit_for!(:z)
242
+ UnitMeasurements::Length.unit_for!("z")
256
243
  #=> Invalid unit: 'z'. (UnitMeasurements::UnitError)
257
244
  ```
258
245
 
259
- **Finding whether the unit is defined within the unit group/unit system:**
246
+ **Finding whether the unit is defined within the unit group:**
260
247
 
261
248
  ```ruby
262
- UnitMeasurements::Length.defined?(:m)
249
+ UnitMeasurements::Length.defined?("m")
263
250
  #=> true
264
- UnitMeasurements::Length.defined?(:metre)
251
+ UnitMeasurements::Length.defined?("metre")
265
252
  #=> false
266
253
  ```
267
254
 
268
- **Check if the unit is a valid unit or alias within the unit group/unit system:**
255
+ **Check if the unit is a valid unit or alias within the unit group:**
269
256
 
270
257
  ```ruby
271
- UnitMeasurements::Length.unit_or_alias?(:m)
258
+ UnitMeasurements::Length.unit_or_alias?("m")
272
259
  #=> true
273
- UnitMeasurements::Length.unit_or_alias?(:metre)
260
+ UnitMeasurements::Length.unit_or_alias?("metre")
274
261
  #=> true
275
262
  ```
276
263
 
277
264
  ### Comparisons
278
265
 
279
266
  You have ability to compare the measurements with the same or different units within the same unit group.
280
- For example, comparing weight with weight will work, comparing a weight with a area would fail.
267
+ For example, comparing length with length will work, comparing a length with a area would fail.
281
268
  Supported comparisons and methods are `==`, `!=`, `<`, `>`, `<=`, `>=`, `between?`, and `clamp`.
282
269
 
283
270
  ```ruby
284
- UnitMeasurements::Length.new(1, "km") == UnitMeasurements::Length.new(1, :km)
271
+ UnitMeasurements::Length.new(1, "km") == UnitMeasurements::Length.new(1, "km")
285
272
  #=> true
286
273
  UnitMeasurements::Length.parse("1 km") <= UnitMeasurements::Length.parse("0.5 km")
287
274
  #=> false
288
- UnitMeasurements::Length.new(1, :ft).between?(UnitMeasurements::Length.new(12, :in), UnitMeasurements::Length.new(24, :in))
275
+ UnitMeasurements::Length.new(1, "ft").between?(UnitMeasurements::Length.new(12, "in"), UnitMeasurements::Length.new(24, "in"))
289
276
  #=> true
290
277
  ```
291
278
 
@@ -303,13 +290,13 @@ In cases of different units, the left hand side takes precedence:
303
290
  4. `#/` - Divides the measurement quantity by other measurement quantity or number.
304
291
 
305
292
  ```ruby
306
- UnitMeasurements::Length.new(1, :km) + UnitMeasurements::Length.new(1, :m)
293
+ UnitMeasurements::Length.new(1, "km") + UnitMeasurements::Length.new(1, "m")
307
294
  #=> 1.001 km
308
- UnitMeasurements::Length.new(2, :km) - 1
295
+ UnitMeasurements::Length.new(2, "km") - 1
309
296
  #=> 1 km
310
- UnitMeasurements::Length.new(2, :km) * 2
297
+ UnitMeasurements::Length.new(2, "km") * 2
311
298
  #=> 4 km
312
- UnitMeasurements::Length.new(4, :km) / UnitMeasurements::Length.new(2, :km)
299
+ UnitMeasurements::Length.new(4, "km") / UnitMeasurements::Length.new(2, "km")
313
300
  #=> 2 km
314
301
  ```
315
302
 
@@ -324,13 +311,13 @@ You can perform mathematical operations on the measurements.
324
311
  4. `#ceil` - Rounds quantity of the measurement to next higher integer.
325
312
 
326
313
  ```ruby
327
- UnitMeasurements::Length.new(1, :m).to(:in).round(4)
314
+ UnitMeasurements::Length.new(1, "m").to("in").round(4)
328
315
  #=> 39.3701 in
329
- UnitMeasurements::Length.new(-17.625, :m).abs
316
+ UnitMeasurements::Length.new(-17.625, "m").abs
330
317
  #=> 17.625 m
331
- UnitMeasurements::Length.new(17.625, :m).floor
318
+ UnitMeasurements::Length.new(17.625, "m").floor
332
319
  #=> 17 m
333
- UnitMeasurements::Length.new(17.625, :m).ceil
320
+ UnitMeasurements::Length.new(17.625, "m").ceil
334
321
  #=> 18 m
335
322
  ```
336
323
 
@@ -340,15 +327,15 @@ You can convert measurement quantity directly to other numeric types viz.
340
327
  `Integer`, `BigDecimal`, `Rational`, `Complex`, and `Float`.
341
328
 
342
329
  ```ruby
343
- UnitMeasurements::Length.new(2.25567, :km).to_i
330
+ UnitMeasurements::Length.new(2.25567, "km").to_i
344
331
  #=> 2 km
345
- UnitMeasurements::Length.new(2.25567, :km).to_f
332
+ UnitMeasurements::Length.new(2.25567, "km").to_f
346
333
  #=> 2.25567 km
347
- UnitMeasurements::Length.new(2.25567, :km).to_r
334
+ UnitMeasurements::Length.new(2.25567, "km").to_r
348
335
  #=> 225567/100000 km
349
- UnitMeasurements::Length.new(2.25567, :km).to_d
336
+ UnitMeasurements::Length.new(2.25567, "km").to_d
350
337
  #=> 2.25567 km
351
- UnitMeasurements::Length.new(2.25567, :km).to_c
338
+ UnitMeasurements::Length.new(2.25567, "km").to_c
352
339
  #=> 2.25567+0i km
353
340
  ```
354
341
 
@@ -356,10 +343,10 @@ UnitMeasurements::Length.new(2.25567, :km).to_c
356
343
 
357
344
  The **`UnitMeasurements::Unit`** class is used to represent the units for a measurement.
358
345
 
359
- ### SI units support
346
+ ### Support for SI decimal prefixes
360
347
 
361
- There is support for SI units through the use of `si_unit` method.
362
- Units declared through it will have automatic support for all SI prefixes:
348
+ There is support for SI decimal prefixes through the use of `si_unit` method.
349
+ Units declared through it will have automatic support for all decimal prefixes:
363
350
 
364
351
  | Multiplying Factor | SI Prefix | Scientific Notation |
365
352
  | ----------------------------------------- | ---------- | ------------------- |
@@ -430,25 +417,26 @@ gem "unit_measurements", require: ["unit_measurements/base", "unit_measurements/
430
417
  ### Building new unit groups
431
418
 
432
419
  This library provides simpler way to build your own unit groups. To build new unit group,
433
- use `UnitMeasurements.build` method in order to define units and unit systems within it:
420
+ use `UnitMeasurements.build` method in order to define units within it:
434
421
 
435
- For convenience, you also have ability to group units by the unit system and set primitive unit for each unit system using `system` and `primitive` methods.
422
+ For convenience, you also have ability to group units by the unit system using `system` method
423
+ and set primitive unit for each unit group using `primitive` method.
436
424
 
437
425
  ```ruby
438
426
  UnitMeasurements::Time = UnitMeasurements.build do
439
- # Group units by the unit system name.
440
- system :metric do
441
- # Set primitive unit for the unit system.
442
- primitive :s
427
+ # Set primitive unit for the unit group.
428
+ primitive "s"
443
429
 
430
+ # Group units by the unit system.
431
+ system :metric do
444
432
  # Add a SI unit to the unit group.
445
- si_unit :s, aliases: [:second, :seconds]
433
+ si_unit "s", aliases: ["second", "seconds"]
446
434
 
447
435
  # Add units to the group, along with their conversion multipliers.
448
- unit :min, value: "60 s", aliases: [:hour, :hours]
436
+ unit "min", value: "60 s", aliases: ["hour", "hours"]
449
437
 
450
438
  # You can also specify unit value as an array.
451
- unit :h, value: [60, :min], aliases: [:day, :days]
439
+ unit :h, value: [60, "min"], aliases: ["day", "days"]
452
440
  end
453
441
  end
454
442
  ```
@@ -9,7 +9,7 @@ module UnitMeasurements
9
9
  # @param [Numeric or Measurement] other
10
10
  #
11
11
  # @example
12
- # UnitMeasurements::Weight.new(1, :kg) + UnitMeasurements::Weight.new(1, :g)
12
+ # UnitMeasurements::Weight.new(1, "kg") + UnitMeasurements::Weight.new(1, "g")
13
13
  # => 1.001 kg
14
14
  #
15
15
  # @return [Measurement]
@@ -22,7 +22,7 @@ module UnitMeasurements
22
22
  # @param [Numeric or Measurement] other
23
23
  #
24
24
  # @example
25
- # UnitMeasurements::Weight.new(2, :kg) - 1
25
+ # UnitMeasurements::Weight.new(2, "kg") - 1
26
26
  # => 1 kg
27
27
  #
28
28
  # @return [Measurement]
@@ -35,7 +35,7 @@ module UnitMeasurements
35
35
  # @param [Numeric or Measurement] other
36
36
  #
37
37
  # @example
38
- # UnitMeasurements::Weight.new(2, :kg) * 2
38
+ # UnitMeasurements::Weight.new(2, "kg") * 2
39
39
  # => 4 kg
40
40
  #
41
41
  # @return [Measurement]
@@ -48,7 +48,7 @@ module UnitMeasurements
48
48
  # @param [Numeric or Measurement] other
49
49
  #
50
50
  # @example
51
- # UnitMeasurements::Weight.new(4, :kg) / UnitMeasurements::Weight.new(2, :kg)
51
+ # UnitMeasurements::Weight.new(4, "kg") / UnitMeasurements::Weight.new(2, "kg")
52
52
  # => 2 kg
53
53
  #
54
54
  # @return [Measurement]
@@ -24,8 +24,6 @@ end
24
24
 
25
25
  require "unit_measurements/unit_group_builder"
26
26
  require "unit_measurements/unit"
27
- require "unit_measurements/unit_methods"
28
- require "unit_measurements/unit_system"
29
27
  require "unit_measurements/unit_group"
30
28
  require "unit_measurements/arithmetic"
31
29
  require "unit_measurements/comparison"
@@ -37,5 +35,6 @@ require "unit_measurements/formatter"
37
35
  require "unit_measurements/measurement"
38
36
 
39
37
  require "unit_measurements/errors/unit_error"
40
- require "unit_measurements/errors/unit_already_defined_error"
41
38
  require "unit_measurements/errors/parse_error"
39
+ require "unit_measurements/errors/unit_already_defined_error"
40
+ require "unit_measurements/errors/primitive_unit_already_set_error"
@@ -6,7 +6,8 @@ module UnitMeasurements
6
6
  module Comparison
7
7
  include Comparable
8
8
 
9
- # Compares the quantities of two measurements within the same unit group.
9
+ # Implements +Comparable+ methods on the quantities of two measurements of
10
+ # the same unit group.
10
11
  #
11
12
  # @example
12
13
  # UnitMeasurements::Weight.new(1, "kg") == UnitMeasurements::Weight.new(1, :kg)
@@ -7,7 +7,7 @@ module UnitMeasurements
7
7
  # Converts quantity of the measurement to +Integer+.
8
8
  #
9
9
  # @example
10
- # UnitMeasurements::Weight.new(2.25567, :kg).to_i
10
+ # UnitMeasurements::Weight.new(2.25567, "kg").to_i
11
11
  # => 2 kg
12
12
  #
13
13
  # @return [Measurement]
@@ -18,7 +18,7 @@ module UnitMeasurements
18
18
  # Converts quantity of the measurement to +Float+.
19
19
  #
20
20
  # @example
21
- # UnitMeasurements::Weight.new(2.25567, :kg).to_f
21
+ # UnitMeasurements::Weight.new(2.25567, "kg").to_f
22
22
  # => 2.25567 kg
23
23
  #
24
24
  # @return [Measurement]
@@ -29,7 +29,7 @@ module UnitMeasurements
29
29
  # Converts quantity of the measurement to +Rational+.
30
30
  #
31
31
  # @example
32
- # UnitMeasurements::Weight.new(2.25567, :kg).to_r
32
+ # UnitMeasurements::Weight.new(2.25567, "kg").to_r
33
33
  # => 225567/100000 kg
34
34
  #
35
35
  # @return [Measurement]
@@ -40,7 +40,7 @@ module UnitMeasurements
40
40
  # Converts quantity of the measurement to +Complex+.
41
41
  #
42
42
  # @example
43
- # UnitMeasurements::Weight.new(2.25567, :kg).to_c
43
+ # UnitMeasurements::Weight.new(2.25567, "kg").to_c
44
44
  # => 2.25567+0i kg
45
45
  #
46
46
  # @return [Measurement]
@@ -51,7 +51,7 @@ module UnitMeasurements
51
51
  # Converts quantity of the measurement to +BigDecimal+.
52
52
  #
53
53
  # @example
54
- # UnitMeasurements::Weight.new(2.25567, :kg).to_d
54
+ # UnitMeasurements::Weight.new(2.25567, "kg").to_d
55
55
  # => 2.25567 kg
56
56
  #
57
57
  # @return [Measurement]
@@ -0,0 +1,11 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ module UnitMeasurements
6
+ class PrimitiveUnitAlreadySetError < BaseError
7
+ def initialize
8
+ super("The primitive unit is already set for the unit group.")
9
+ end
10
+ end
11
+ end
@@ -12,9 +12,9 @@ module UnitMeasurements
12
12
  # formatting the measurement
13
13
  #
14
14
  # @example
15
- # UnitMeasurements::Weight.parse("2 kg").to(:st).format
15
+ # UnitMeasurements::Weight.parse("2 kg").to("st").format
16
16
  # => "0.31 st"
17
- # UnitMeasurements::Weight.parse("2 kg").to(:st).format("%.4<quantity>f %<unit>s")
17
+ # UnitMeasurements::Weight.parse("2 kg").to("st").format("%.4<quantity>f %<unit>s")
18
18
  # => "0.3149 st"
19
19
  #
20
20
  # @param [String] format
@@ -5,10 +5,10 @@
5
5
  module UnitMeasurements
6
6
  module Math
7
7
  # Rounds quantity of the measurement. If `ndigits` is not specified,
8
- # quantity is rounded to `Integer`.
8
+ # quantity is rounded to +Integer+.
9
9
  #
10
10
  # @example
11
- # UnitMeasurements::Weight.new(1, :g).convert_to(:st).round(4)
11
+ # UnitMeasurements::Weight.new(1, "g").convert_to("st").round(4)
12
12
  # => 0.0002 st
13
13
  #
14
14
  # @param [Integer] ndigits
@@ -21,7 +21,7 @@ module UnitMeasurements
21
21
  # Returns absolute value of the measurement quantity.
22
22
  #
23
23
  # @example
24
- # UnitMeasurements::Length.new(-17.625, :m).abs
24
+ # UnitMeasurements::Length.new(-17.625, "m").abs
25
25
  # => 17.625 m
26
26
  #
27
27
  # @return [Measurement]
@@ -32,7 +32,7 @@ module UnitMeasurements
32
32
  # Rounds quantity of the measurement to next lower integer.
33
33
  #
34
34
  # @example
35
- # UnitMeasurements::Length.new(17.625, :m).floor
35
+ # UnitMeasurements::Length.new(17.625, "m").floor
36
36
  # => 17 m
37
37
  #
38
38
  # @return [Measurement]
@@ -43,7 +43,7 @@ module UnitMeasurements
43
43
  # Rounds quantity of the measurement to next higher integer.
44
44
  #
45
45
  # @example
46
- # UnitMeasurements::Length.new(17.625, :m).ceil
46
+ # UnitMeasurements::Length.new(17.625, "m").ceil
47
47
  # => 18 m
48
48
  #
49
49
  # @return [Measurement]
@@ -31,9 +31,7 @@ module UnitMeasurements
31
31
 
32
32
  self.class.new((quantity * conversion_factor), target_unit)
33
33
  end
34
- alias_method :to, :convert_to
35
- alias_method :in, :convert_to
36
- alias_method :as, :convert_to
34
+ [:to, :in, :as].each { |method_alias| alias_method method_alias, :convert_to }
37
35
 
38
36
  def convert_to!(target_unit)
39
37
  measurement = convert_to(target_unit)
@@ -41,14 +39,10 @@ module UnitMeasurements
41
39
 
42
40
  self
43
41
  end
44
- alias_method :to!, :convert_to!
45
- alias_method :in!, :convert_to!
46
- alias_method :as!, :convert_to!
42
+ [:to!, :in!, :as!].each { |method_alias| alias_method method_alias, :convert_to! }
47
43
 
48
44
  def inspect(dump: false)
49
- return super() if dump
50
-
51
- to_s
45
+ dump ? super() : to_s
52
46
  end
53
47
 
54
48
  def to_s
@@ -71,9 +65,9 @@ module UnitMeasurements
71
65
  raise BaseError, "`Measurement` does not have a `unit_group` object. You cannot directly use `Measurement`. Instead, build a new unit group by calling `UnitMeasurements.build`."
72
66
  end
73
67
 
74
- def_delegators :unit_group, :units, :unit_names, :unit_with_name_and_aliases,
68
+ def_delegators :unit_group, :primitive, :units, :unit_names, :unit_with_name_and_aliases,
75
69
  :unit_names_with_aliases, :unit_for, :unit_for!, :defined?,
76
- :unit_or_alias?, :[], :systems, :system_for
70
+ :unit_or_alias?, :[]
77
71
 
78
72
  def parse(input)
79
73
  input = Normalizer.normalize(input)