unit_measurements 3.8.0 → 4.0.0

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