unit_measurements 3.2.0 → 3.3.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +63 -24
  5. data/lib/unit_measurements/base.rb +2 -0
  6. data/lib/unit_measurements/measurement.rb +1 -1
  7. data/lib/unit_measurements/unit_group.rb +7 -38
  8. data/lib/unit_measurements/unit_group_builder.rb +32 -2
  9. data/lib/unit_measurements/unit_groups/acceleration.rb +13 -3
  10. data/lib/unit_measurements/unit_groups/all.rb +4 -2
  11. data/lib/unit_measurements/unit_groups/amount_of_substance.rb +5 -1
  12. data/lib/unit_measurements/unit_groups/angular_acceleration.rb +6 -2
  13. data/lib/unit_measurements/unit_groups/angular_velocity.rb +25 -0
  14. data/lib/unit_measurements/unit_groups/area.rb +14 -6
  15. data/lib/unit_measurements/unit_groups/density.rb +9 -5
  16. data/lib/unit_measurements/unit_groups/electric_charge.rb +20 -0
  17. data/lib/unit_measurements/unit_groups/electric_current.rb +12 -4
  18. data/lib/unit_measurements/unit_groups/force.rb +26 -8
  19. data/lib/unit_measurements/unit_groups/length.rb +13 -5
  20. data/lib/unit_measurements/unit_groups/luminous_intensity.rb +5 -1
  21. data/lib/unit_measurements/unit_groups/plane_angle.rb +6 -2
  22. data/lib/unit_measurements/unit_groups/solid_angle.rb +5 -1
  23. data/lib/unit_measurements/unit_groups/sound_level.rb +5 -1
  24. data/lib/unit_measurements/unit_groups/temperature.rb +8 -2
  25. data/lib/unit_measurements/unit_groups/time.rb +6 -2
  26. data/lib/unit_measurements/unit_groups/velocity.rb +23 -10
  27. data/lib/unit_measurements/unit_groups/voltage.rb +13 -5
  28. data/lib/unit_measurements/unit_groups/volume.rb +18 -10
  29. data/lib/unit_measurements/unit_groups/weight.rb +7 -3
  30. data/lib/unit_measurements/unit_methods.rb +45 -0
  31. data/lib/unit_measurements/unit_system.rb +29 -0
  32. data/lib/unit_measurements/version.rb +1 -1
  33. data/units.md +32 -1
  34. metadata +6 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73c4d379f4412abab14612cf06d48747d0f22141b714b16ad2c10a13f6f17be2
4
- data.tar.gz: f76fa7c8c2daf6eb0fcf51b710b5236cbc606d97a6644b5c51c67215d9e2420d
3
+ metadata.gz: 6c50e2f3f71c84f00b3b65de4e636b9497a9212cb923bc2d984d98dbb1d705f9
4
+ data.tar.gz: '079c32f6cd5bfbe6e1c6579274cefcf416ab4387808e32b837aa4f07028585fc'
5
5
  SHA512:
6
- metadata.gz: 409878f8f87f8d5ea2eb9a9e55f7032a80d0c3d9f0be15e830791ca48ab5a007b9678b0d56bc224cc06103d1b60560f62efeacae35246cb6240e101fd9034405
7
- data.tar.gz: a0b6b7230fb277ffb960f0f96575e742bc6fb3a4b3d9c976df8ad9bb4b2071c75106be487ee96fe84bea966070cdb5fe89c2a36a8e58ecce78ff85ba2278d3dc
6
+ metadata.gz: 96d7edaf7d57d86a087eb55c77202e30d465ce745440068d6f3f17e2cf9c83acbda65fedc6630033ee5e77af0a19c6d6dd101d9370aebe73a0990afc795c121c
7
+ data.tar.gz: 82cffad83e21aed77c6a8c5da32eab913ea548e55f350a2aeb2371bb4b905e6f2d715488c6c78ca888a94a21d695915035aff6493a4573192279d88ef0cf66fc
data/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ ## [3.4.0](https://github.com/shivam091/unit_measurements/compare/v3.3.0...v3.4.0) - 2023-08-29
2
+
3
+ ### What's new
4
+
5
+ - Added ability to group units by `unit system`.
6
+ - Added ability to set `primitive` unit for each unit system.
7
+ - Added method `primitive?` to check whether the unit is primitive or not.
8
+ - Added method `system_for` to find unit system by name.
9
+
10
+ ### What's changed
11
+
12
+ - Grouped units in system and set primitive unit for those systems.
13
+
14
+ ----------
15
+
16
+ ## [3.3.0](https://github.com/shivam091/unit_measurements/compare/v3.2.0...v3.3.0) - 2023-08-28
17
+
18
+ ### What's new
19
+
20
+ - Added unit group for `electric charge` units.
21
+ - Added unit group for `angular velocity` units.
22
+
23
+ ----------
24
+
1
25
  ## [3.2.0](https://github.com/shivam091/unit_measurements/compare/v3.1.0...v3.2.0) - 2023-08-27
2
26
 
3
27
  ### What's new
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- unit_measurements (3.2.0)
4
+ unit_measurements (3.3.0)
5
5
  activesupport (~> 7.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -9,7 +9,7 @@ A library that encapsulate measurements and their units in Ruby.
9
9
  [![Test Coverage](https://api.codeclimate.com/v1/badges/b8aec9bffa356d108784/test_coverage)](https://codeclimate.com/github/shivam091/unit_measurements/test_coverage)
10
10
  [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/shivam091/unit_measurements/blob/main/LICENSE.md)
11
11
 
12
- **Harshal V. Ladhe, M.Sc. Computer Science.**
12
+ **Harshal V. Ladhe, Master of Computer Science.**
13
13
 
14
14
  ## Introduction
15
15
 
@@ -251,28 +251,51 @@ UnitMeasurements::Weight.name
251
251
  #=> weight
252
252
  ```
253
253
 
254
- **See all units of the unit group:**
254
+ **See all unit systems defined in the unit group:**
255
+
256
+ ```ruby
257
+ UnitMeasurements::Length.systems
258
+ #=> [#<UnitMeasurements::UnitSystem:0x00007fa1a46d11c0 @name=:metric, @primitive=#<UnitMeasurements::Unit: m (meter, meters, metre, metres)>, @units=[]>]
259
+ ```
260
+
261
+ **Finding unit system within the unit group:**
262
+
263
+ ```ruby
264
+ UnitMeasurements::Length.system_for(:imperial)
265
+ #=> #<UnitMeasurements::UnitSystem:0x00007f87a348e680
266
+ # @name=:imperial,
267
+ # @primitive=#<UnitMeasurements::Unit: in (", inch, inches)>,
268
+ # @units=[#<UnitMeasurements::Unit: in (", inch, inches)>, #<UnitMeasurements::Unit: ft (', feet, foot)>, ...]>
269
+ ```
270
+
271
+ **See all units of the unit group/unit system:**
255
272
 
256
273
  ```ruby
257
274
  UnitMeasurements::Weight.units
258
275
  #=> [#<UnitMeasurements::Unit: g (gram, gramme, grammes, grams)>, ..., ...]
276
+ UnitMeasurements::Length.system_for(:imperial).units
277
+ #=> [#<UnitMeasurements::Unit: in (", inch, inches)>, #<UnitMeasurements::Unit: ft (', feet, foot)>, ...]
259
278
  ```
260
279
 
261
- **See names of all valid units of the unit group:**
280
+ **See names of all valid units of the unit group/unit system:**
262
281
 
263
282
  ```ruby
264
283
  UnitMeasurements::Weight.unit_names
265
284
  #=> ["g", "kg", "lb", "oz", ...]
285
+ UnitMeasurements::Length.system_for(:imperial).unit_names
286
+ #=> ["ft", "in", "mi", "yd"]
266
287
  ```
267
288
 
268
- **See all valid units of the unit group along with their aliases:**
289
+ **See all valid units of the unit group/unit system along with their aliases:**
269
290
 
270
291
  ```ruby
271
292
  UnitMeasurements::Weight.unit_names_with_aliases
272
293
  #=> ["g", "gram", "gramme", "grammes", "grams", "kg", "kilogram", "kilogramme", "kilogrammes", "kilograms", "lb", "ounce", "ounces", "oz", "pound", "pounds", ...]
294
+ UnitMeasurements::Length.system_for(:imperial).unit_names_with_aliases
295
+ #=> ["feet", "foot", "ft", "in", "inch", "inches", "mi", "mile", "miles", "yard", "yards", "yd"]
273
296
  ```
274
297
 
275
- **Finding units within the unit group:**
298
+ **Finding units within the unit group/unit system:**
276
299
 
277
300
  You can use `#unit_for` or `#unit_for!` (aliased as `#[]`) to find units within
278
301
  the unit group. `#unit_for!` method returns error if a unit is not present in the
@@ -287,28 +310,43 @@ UnitMeasurements::Weight.unit_for!(:g)
287
310
  #=> #<UnitMeasurements::Unit: g (gram, gramme, grammes, grams)>
288
311
  UnitMeasurements::Weight.unit_for!(:z)
289
312
  #=> Invalid unit: 'z'. (UnitMeasurements::UnitError)
313
+
314
+ UnitMeasurements::Length.system_for(:imperial).unit_for(:in)
315
+ #=> #<UnitMeasurements::Unit: in (", inch, inches)>
316
+ UnitMeasurements::Length.system_for(:imperial).unit_for(:m)
317
+ #=> nil
318
+ UnitMeasurements::Length.system_for(:imperial).unit_for!(:in)
319
+ #=> #<UnitMeasurements::Unit: in (", inch, inches)>
320
+ UnitMeasurements::Length.system_for(:imperial).unit_for!(:m)
321
+ #=> Invalid unit: 'm'. (UnitMeasurements::UnitError)
290
322
  ```
291
323
 
292
- **Finding whether the unit is defined within the unit group:**
324
+ **Finding whether the unit is defined within the unit group/unit system:**
293
325
 
294
326
  ```ruby
295
327
  UnitMeasurements::Weight.defined?(:g)
296
328
  #=> true
297
- UnitMeasurements::Weight.defined?(:kg)
298
- #=> true
299
329
  UnitMeasurements::Weight.defined?(:gramme)
300
330
  #=> false
331
+
332
+ UnitMeasurements::Length.system_for(:metric).defined?(:m)
333
+ #=> true
334
+ UnitMeasurements::Length.system_for(:metric).defined?(:in)
335
+ #=> false
301
336
  ```
302
337
 
303
- **Check if the unit is a valid unit or alias within the unit group:**
338
+ **Check if the unit is a valid unit or alias within the unit group/unit system:**
304
339
 
305
340
  ```ruby
306
341
  UnitMeasurements::Weight.unit_or_alias?(:g)
307
342
  #=> true
308
- UnitMeasurements::Weight.unit_or_alias?(:kg)
309
- #=> true
310
343
  UnitMeasurements::Weight.unit_or_alias?(:gramme)
311
344
  #=> true
345
+
346
+ UnitMeasurements::Length.system_for(:metric).unit_or_alias?(:m)
347
+ #=> true
348
+ UnitMeasurements::Length.system_for(:metric).unit_or_alias?(:metre)
349
+ #=> true
312
350
  ```
313
351
 
314
352
  ### Comparisons
@@ -338,6 +376,7 @@ UnitMeasurements::Length.new(1, :ft).clamp(UnitMeasurements::Length.new(13, :in)
338
376
  You have ability to perform arithmetic operations on measurements with the same or
339
377
  different units within a same unit group. You can perform arithmetic operations on
340
378
  measurement by either other compatible measurement or number.
379
+ In cases of different units, the left hand side takes precedence:
341
380
 
342
381
  **Methods:**
343
382
  1. `#+` - Adds the other measurement quantity or number to the measurement.
@@ -480,24 +519,24 @@ use `UnitMeasurements.build` in order to define units within it:
480
519
  If the unit is supporting [si prefixes](#si-units-support), you can use `si_unit` method to build it.
481
520
  If you build unit using `si_unit`, the unit will be added along with all SI prefixes for it.
482
521
 
522
+ 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.
523
+
483
524
  ```ruby
484
525
  UnitMeasurements::Time = UnitMeasurements.build do
485
- unit :s, aliases: [:second, :seconds]
486
-
487
- # Add units to the group, along with their conversion multipliers.
488
- unit :min, value: "60 s", aliases: [:hour, :hours]
526
+ # Group units by the unit system name.
527
+ system :metric do
528
+ # Set primitive unit for the unit system.
529
+ primitive :s
489
530
 
490
- # You can also specify unit value as an array.
491
- unit :h, value: [60, :min], aliases: [:day, :days]
492
- end
493
- ```
531
+ # Add a SI unit to the unit group
532
+ si_unit :s, aliases: [:second, :seconds]
494
533
 
495
- ```ruby
496
- UnitMeasurements::Time = UnitMeasurements.build do
497
- # Add a SI unit to the unit group
498
- si_unit :s, aliases: [:second, :seconds]
534
+ # Add units to the group, along with their conversion multipliers.
535
+ unit :min, value: "60 s", aliases: [:hour, :hours]
499
536
 
500
- unit :min, value: "60 s", aliases: [:minute, :minutes]
537
+ # You can also specify unit value as an array.
538
+ unit :h, value: [60, :min], aliases: [:day, :days]
539
+ end
501
540
  end
502
541
  ```
503
542
 
@@ -24,6 +24,8 @@ 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"
27
29
  require "unit_measurements/unit_group"
28
30
  require "unit_measurements/arithmetic"
29
31
  require "unit_measurements/comparison"
@@ -73,7 +73,7 @@ module UnitMeasurements
73
73
 
74
74
  def_delegators :unit_group, :units, :unit_names, :unit_with_name_and_aliases,
75
75
  :unit_names_with_aliases, :unit_for, :unit_for!, :defined?,
76
- :unit_or_alias?, :[]
76
+ :unit_or_alias?, :[], :systems, :system_for
77
77
 
78
78
  def parse(input)
79
79
  input = Normalizer.normalize(input)
@@ -4,48 +4,17 @@
4
4
 
5
5
  module UnitMeasurements
6
6
  class UnitGroup
7
- attr_reader :units
7
+ include UnitMethods
8
8
 
9
- def initialize(units)
10
- @units = units.map { |unit| unit.with(unit_group: self) }
11
- end
12
-
13
- def unit_for(name)
14
- unit_name_to_unit(name)
15
- end
16
-
17
- def unit_for!(name)
18
- unit = unit_for(name)
19
- raise UnitError, name unless unit
20
- unit
21
- end
22
- alias_method :[], :unit_for!
23
-
24
- def unit_with_name_and_aliases
25
- units.each_with_object({}) do |unit, hash|
26
- unit.names.each { |name| hash[name.to_s] = unit }
27
- end
28
- end
9
+ attr_reader :units, :systems
29
10
 
30
- def unit_names
31
- units.map(&:name).sort
32
- end
33
-
34
- def unit_names_with_aliases
35
- units.flat_map(&:names).sort
36
- end
37
-
38
- def unit_name_to_unit(name)
39
- unit_with_name_and_aliases[name.to_s]
40
- end
41
-
42
- def defined?(name)
43
- unit = unit_for(name)
44
- unit ? unit.name == name.to_s : false
11
+ def initialize(units, systems)
12
+ @units = units.map { |unit| unit.with(unit_group: self) }
13
+ @systems = systems
45
14
  end
46
15
 
47
- def unit_or_alias?(name)
48
- !!unit_for(name)
16
+ def system_for(system_name)
17
+ @systems.find { |system| system.name.to_s == system_name.to_s }
49
18
  end
50
19
  end
51
20
  end
@@ -7,7 +7,7 @@ module UnitMeasurements
7
7
  attr_reader :units
8
8
 
9
9
  def initialize
10
- @units = []
10
+ @units, @systems = [], []
11
11
  end
12
12
 
13
13
  def unit(name, value: 1.0, aliases: [])
@@ -19,7 +19,19 @@ module UnitMeasurements
19
19
  end
20
20
 
21
21
  def build
22
- UnitGroup.new(@units)
22
+ UnitGroup.new(@units, @systems)
23
+ end
24
+
25
+ def system(system_name, &block)
26
+ @current_system = find_or_create_system(system_name)
27
+ instance_eval(&block) if block_given?
28
+ @current_system.set_primitive(@current_primitive) if @current_primitive
29
+ ensure
30
+ @current_primitive, @current_system = nil, nil
31
+ end
32
+
33
+ def primitive(primitive)
34
+ @current_primitive = primitive
23
35
  end
24
36
 
25
37
  private
@@ -40,6 +52,7 @@ module UnitMeasurements
40
52
  def build_unit(name, value:, aliases:)
41
53
  unit = Unit.new(name, value: value, aliases: aliases)
42
54
  check_for_duplicate_unit_names!(unit)
55
+ add_unit_to_system(unit)
43
56
 
44
57
  unit
45
58
  end
@@ -51,5 +64,22 @@ module UnitMeasurements
51
64
  raise UnitAlreadyDefinedError.new(unit.name)
52
65
  end
53
66
  end
67
+
68
+ def find_system(name)
69
+ @systems.find { |system| system.name.to_s == name.to_s }
70
+ end
71
+
72
+ def find_or_create_system(system_name)
73
+ system = find_system(system_name)
74
+ unless system
75
+ system = UnitSystem.new(system_name)
76
+ @systems << system
77
+ end
78
+ system
79
+ end
80
+
81
+ def add_unit_to_system(unit)
82
+ @current_system.add_unit(unit) if @current_system
83
+ end
54
84
  end
55
85
  end
@@ -3,9 +3,19 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::Acceleration = UnitMeasurements.build do
6
- si_unit :"m/s²", aliases: [:"m/s^2", :"m·s⁻²", :"meter per second squared", :"meters per second squared", :"metre per second squared", :"metres per second squared"]
6
+ system :metric do
7
+ primitive :"m/s²"
8
+
9
+ si_unit :"m/s²", aliases: [:"m/s^2", :"m·s⁻²", :"meter per second squared", :"meters per second squared", :"metre per second squared", :"metres per second squared"]
10
+ end
11
+
12
+ system :imperial do
13
+ unit :"in/s²", value: "0.0254 m/s²", aliases: [:"in/s^2", :"in·s⁻²", :"inch per second squared", :"inches per second squared"]
14
+ end
15
+
16
+ system :foot_pound_second do
17
+ unit :"ft/s²", value: "0.3048 m/s²", aliases: [:"ft/s^2", :"ft·s⁻²", :"foot per second squared", :"feet per second squared"]
18
+ end
7
19
 
8
- unit :"in/s²", value: "0.0254 m/s²", aliases: [:"in/s^2", :"in·s⁻²", :"inch per second squared", :"inches per second squared"]
9
- unit :"ft/s²", value: "0.3048 m/s²", aliases: [:"ft/s^2", :"ft·s⁻²", :"foot per second squared", :"feet per second squared"]
10
20
  unit :"Kn/s", value: "0.5144444 m/s²", aliases: [:"knot per second", :"knots per second"]
11
21
  end
@@ -17,11 +17,13 @@ require_relative "weight"
17
17
  require_relative "area"
18
18
  require_relative "volume"
19
19
  require_relative "density"
20
- require_relative "force"
21
- require_relative "voltage"
22
20
  require_relative "velocity"
23
21
  require_relative "acceleration"
22
+ require_relative "angular_velocity"
24
23
  require_relative "angular_acceleration"
24
+ require_relative "force"
25
+ require_relative "voltage"
26
+ require_relative "electric_charge"
25
27
 
26
28
  ## Other units
27
29
 
@@ -3,7 +3,11 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::AmountOfSubstance = UnitMeasurements.build do
6
- si_unit :mol, aliases: [:mole, :moles]
6
+ system :cgs do
7
+ primitive :mol
8
+
9
+ si_unit :mol, aliases: [:mole, :moles]
10
+ end
7
11
 
8
12
  unit :NA, value: "1.6605389210322e-24 mol", aliases: [:"avogadro constant"]
9
13
  end
@@ -3,8 +3,12 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::AngularAcceleration = UnitMeasurements.build do
6
- si_unit :"rad/s²", aliases: [:"rad/s^2", :"rad·s⁻²", :"radian per second squared", :"radians per second squared"]
6
+ system :metric do
7
+ primitive :"rad/s²"
8
+
9
+ si_unit :"rad/s²", aliases: [:"rad/s^2", :"rad·s⁻²", :"radian per second squared", :"radians per second squared"]
10
+ unit :"gon/s²", value: [(Math::PI / 200), :"rad/s²"], aliases: [:"gon/s^2", :"ᵍ/s²", :"gon·s⁻²", :"gradian per second squared", :"gradians per second squared"]
11
+ end
7
12
 
8
13
  unit :"deg/s²", value: [(Math::PI / 180), :"rad/s²"], aliases: [:"deg/s^2", :"°/s²", :"deg·s⁻²", :"degree per second squared", :"degrees per second squared"]
9
- unit :"gon/s²", value: [(Math::PI / 200), :"rad/s²"], aliases: [:"gon/s^2", :"ᵍ/s²", :"gon·s⁻²", :"gradian per second squared", :"gradians per second squared"]
10
14
  end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ UnitMeasurements::AngularVelocity = UnitMeasurements.build do
6
+ system :metric do
7
+ primitive :"rad/s"
8
+
9
+ unit :"rad/s", aliases: [:"rad·s⁻¹", :"radian per second", :"radians per second"]
10
+ unit :"rad/min", value: "1/60 rad/s", aliases: [:"rad·min⁻¹", :"radian per minute", :"radians per minute"]
11
+ unit :"rad/h", value: "1/60 rad/min", aliases: [:"rad·h⁻¹", :"radian per hour", :"radians per hour"]
12
+
13
+ unit :"gon/s", value: [(Math::PI / 200), :"rad/s"], aliases: [:"ᵍ/s", :"gon·s⁻¹", :"gradian per second", :"gradians per second"]
14
+ unit :"gon/min", value: "1/60 gon/s", aliases: [:"ᵍ/min", :"gon·min⁻¹", :"gradian per minute", :"gradians per minute"]
15
+ unit :"gon/h", value: "1/60 gon/min", aliases: [:"ᵍ/h", :"gon·h⁻¹", :"gradian per hour", :"gradians per hour"]
16
+ end
17
+
18
+ unit :"deg/s", value: [(Math::PI / 180), :"rad/s"], aliases: [:"°/s", :"deg·s⁻¹", :"degree per second", :"degrees per second"]
19
+ unit :"deg/min", value: "1/60 deg/s", aliases: [:"°/min", :"deg·min⁻¹", :"degree per minute", :"degrees per minute"]
20
+ unit :"deg/h", value: "1/60 deg/min", aliases: [:"°/h", :"deg·h⁻¹", :"degree per hour", :"degrees per hour"]
21
+
22
+ unit :"rev/s", value: "360 deg/s", aliases: [:"rev·s⁻¹", :"revolution per second", :"revolutions per second"]
23
+ unit :"rev/min", value: "1/60 rev/s", aliases: [:"rev·min⁻¹", :"revolution per minute", :"revolutions per minute"]
24
+ unit :"rev/h", value: "1/60 rev/min", aliases: [:"rev·h⁻¹", :"revolution per hour", :"revolutions per hour"]
25
+ end
@@ -3,11 +3,19 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::Area = UnitMeasurements.build do
6
- unit :m², aliases: [:"m^2", :"sq m", :"square meter", :"square meters", :"square metre", :"square metres"]
6
+ system :metric do
7
+ primitive :m²
7
8
 
8
- unit :km², value: "1e+6 m²", aliases: [:"km^2", :"sq km", :"square kilometer", :"square kilometers", :"square kilometre", :"square kilometres"]
9
- unit :in², value: "0.00064516 m²", aliases: [:"in^2", :"sq in", :"square inch", :"square inches"]
10
- unit :ft², value: "144 in²", aliases: [:"ft^2", :"sq ft", :"square foot", :"square feet"]
11
- unit :yd², value: "9 ft²", aliases: [:"yd^2", :"sq yd", :"square yard", :"square yards"]
12
- unit :mi², value: "3097600 yd²", aliases: [:"mi^2", :"sq mi", :"square mile", :"square miles"]
9
+ unit :m², aliases: [:"m^2", :"sq m", :"square meter", :"square meters", :"square metre", :"square metres"]
10
+ unit :km², value: "1e+6 m²", aliases: [:"km^2", :"sq km", :"square kilometer", :"square kilometers", :"square kilometre", :"square kilometres"]
11
+ end
12
+
13
+ system :imperial do
14
+ primitive :in²
15
+
16
+ unit :in², value: "0.00064516 m²", aliases: [:"in^2", :"sq in", :"square inch", :"square inches"]
17
+ unit :ft², value: "144 in²", aliases: [:"ft^2", :"sq ft", :"square foot", :"square feet"]
18
+ unit :yd², value: "9 ft²", aliases: [:"yd^2", :"sq yd", :"square yard", :"square yards"]
19
+ unit :mi², value: "3097600 yd²", aliases: [:"mi^2", :"sq mi", :"square mile", :"square miles"]
20
+ end
13
21
  end
@@ -3,11 +3,15 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::Density = UnitMeasurements.build do
6
- unit :"g/m³", aliases: [:"g/m^3", :"g·m⁻³", :"gram per cubic meter", :"grams per cubic meter", :"gramme per cubic metre", :"grammes per cubic metre"]
6
+ system :metric do
7
+ primitive :"g/m³"
7
8
 
8
- unit :"g/l", value: "1 kg/m³", aliases: [:"g·l⁻¹", :"gram per liter", :"grams per liter", :"gramme per litre", :"grammes per litre"]
9
- unit :"g/ml", value: "1000 g/l", aliases: [:"g·ml⁻¹", :"gram per milliliter", :"grams per milliliter", :"gramme per millilitre", :"grammes per millilitre"]
9
+ unit :"g/", aliases: [:"g/m^3", :"g·m⁻³", :"gram per cubic meter", :"grams per cubic meter", :"gramme per cubic metre", :"grammes per cubic metre"]
10
10
 
11
- unit :"kg/", value: "1000 g/m³", aliases: [:"kg/m^3", :"kg·m⁻³", :"kilogram per cubic meter", :"kilograms per cubic meter", :"kilogramme per cubic metre", :"kilogrammes per cubic metre"]
12
- unit :"kg/l", value: "1e+6 g/", aliases: [:"kg·l⁻¹", :"kilogram per liter", :"kilograms per liter", :"kilogramme per litre", :"kilogrammes per litre"]
11
+ unit :"g/l", value: "1 kg/m³", aliases: [:"g·l⁻¹", :"gram per liter", :"grams per liter", :"gramme per litre", :"grammes per litre"]
12
+ unit :"g/ml", value: "1000 g/l", aliases: [:"g·ml⁻¹", :"gram per milliliter", :"grams per milliliter", :"gramme per millilitre", :"grammes per millilitre"]
13
+
14
+ unit :"kg/m³", value: "1000 g/m³", aliases: [:"kg/m^3", :"kg·m⁻³", :"kilogram per cubic meter", :"kilograms per cubic meter", :"kilogramme per cubic metre", :"kilogrammes per cubic metre"]
15
+ unit :"kg/l", value: "1e+6 g/m³", aliases: [:"kg·l⁻¹", :"kilogram per liter", :"kilograms per liter", :"kilogramme per litre", :"kilogrammes per litre"]
16
+ end
13
17
  end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ UnitMeasurements::ElectricCharge = UnitMeasurements.build do
6
+ system :metric do
7
+ primitive :C
8
+
9
+ si_unit :C, aliases: [:coulomb, :coulombs]
10
+ end
11
+
12
+ system :centimetre_gram_second do
13
+ primitive :statC
14
+
15
+ unit :Fr, value: "3.335641e-10 C", aliases: [:franklin, :franklins]
16
+ unit :Fd, value: "96485.3377164 C", aliases: [:faraday, :faradays]
17
+ unit :abC, value: "10 C", aliases: [:abcoulomb, :abcoulombs]
18
+ unit :statC, value: "3.335641e-10 C", aliases: [:statcoulomb, :statcoulombs]
19
+ end
20
+ end
@@ -3,9 +3,17 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::ElectricCurrent = UnitMeasurements.build do
6
- si_unit :A, aliases: [:amp, :ampere, :amperes]
6
+ system :metric do
7
+ primitive :A
7
8
 
8
- unit :abA, value: "10 A", aliases: [:abampere, :abamperes]
9
- unit :Bi, value: "10 A", aliases: [:biot, :biots]
10
- unit :statA, value: "3.33564e-10 A", aliases: [:statampere, :statamperes]
9
+ si_unit :A, aliases: [:amp, :ampere, :amperes]
10
+ end
11
+
12
+ system :centimetre_gram_second do
13
+ primitive :abA
14
+
15
+ unit :Bi, value: "10 A", aliases: [:biot, :biots]
16
+ unit :abA, value: "10 A", aliases: [:abampere, :abamperes]
17
+ unit :statA, value: "3.33564e-10 A", aliases: [:statampere, :statamperes]
18
+ end
11
19
  end
@@ -3,12 +3,30 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::Force = UnitMeasurements.build do
6
- si_unit :N, aliases: [:newton, :newtons] # kg·m·s⁻²
7
-
8
- unit :tf, value: "8896.443230521 N", aliases: [:"tonne-force"]
9
- unit :dyn, value: "1e-5 N", aliases: [:dyne, :dynes]
10
- unit :kgf, value: "9.80665 N", aliases: [:"kilogram-force", :"kilogramme-force"]
11
- unit :ozf, value: "0.27801385095378125 N", aliases: [:"ounce-force"]
12
- unit :lbf, value: "4.4482216152605 N", aliases: [:"pound-force"]
13
- unit :pdl, value: "0.138254954376 N", aliases: [:poundal, :poundals]
6
+ system :metric do
7
+ primitive :N
8
+
9
+ si_unit :N, aliases: [:newton, :newtons]
10
+ unit :kgf, value: "9.80665 N", aliases: [:"kilogram-force", :"kilogramme-force"]
11
+ end
12
+
13
+ system :centimetre_gram_second do
14
+ unit :dyn, value: "1e-5 N", aliases: [:dyne, :dynes]
15
+ end
16
+
17
+ system :metre_tonne_second do
18
+ unit :tf, value: "8896.443230521 N", aliases: [:"tonne-force"]
19
+ end
20
+
21
+ system :avoirdupois do
22
+ unit :ozf, value: "0.27801385095378125 N", aliases: [:"ounce-force"]
23
+ end
24
+
25
+ system :english_engineering do
26
+ unit :lbf, value: "4.4482216152605 N", aliases: [:"pound-force"]
27
+ end
28
+
29
+ system :foot_pound_second do
30
+ unit :pdl, value: "0.138254954376 N", aliases: [:poundal, :poundals]
31
+ end
14
32
  end
@@ -3,10 +3,18 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::Length = UnitMeasurements.build do
6
- si_unit :m, aliases: [:meter, :metre, :meters, :metres]
6
+ system :metric do
7
+ primitive :m
7
8
 
8
- unit :in, value: "25.4 mm", aliases: [:'"', :inch, :inches]
9
- unit :ft, value: "12 in", aliases: [:"'", :foot, :feet]
10
- unit :yd, value: "3 ft", aliases: [:yard, :yards]
11
- unit :mi, value: "1760 yd", aliases: [:mile, :miles]
9
+ si_unit :m, aliases: [:meter, :metre, :meters, :metres]
10
+ end
11
+
12
+ system :imperial do
13
+ primitive :in
14
+
15
+ unit :in, value: "25.4 mm", aliases: [:'"', :inch, :inches]
16
+ unit :ft, value: "12 in", aliases: [:"'", :foot, :feet]
17
+ unit :yd, value: "3 ft", aliases: [:yard, :yards]
18
+ unit :mi, value: "1760 yd", aliases: [:mile, :miles]
19
+ end
12
20
  end
@@ -3,7 +3,11 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::LuminousIntensity = UnitMeasurements.build do
6
- si_unit :cd, aliases: [:candela, :candelas]
6
+ system :metric do
7
+ primitive :cd
8
+
9
+ si_unit :cd, aliases: [:candela, :candelas]
10
+ end
7
11
 
8
12
  unit :hk, value: "0.92 cd", aliases: [:hefnerkerze]
9
13
  end
@@ -3,10 +3,14 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::PlaneAngle = UnitMeasurements.build do
6
- si_unit :rad, aliases: [:radian, :radians]
6
+ system :metric do
7
+ primitive :rad
8
+
9
+ si_unit :rad, aliases: [:radian, :radians]
10
+ unit :gon, value: [(Math::PI / 200), :rad], aliases: [:ᵍ, :grad, :gradian, :gradians] # (π / 200) rad
11
+ end
7
12
 
8
13
  unit :deg, value: [(Math::PI / 180), :rad], aliases: [:°, :degree, :degrees] # (π / 180) rad
9
- unit :gon, value: [(Math::PI / 200), :rad], aliases: [:ᵍ, :grad, :gradian, :gradians] # (π / 200) rad
10
14
  unit :cir, value: [360, :deg], aliases: [:circle, :circles] # (2 * π) rad
11
15
  unit :mil, value: [Rational(1, 6400), :cir], aliases: [:mils] # ((2 * π) / 6400) rad
12
16
  unit :rev, value: [1, :cir], aliases: [:revolution, :revolutions] # (2 * π) rad
@@ -3,7 +3,11 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::SolidAngle = UnitMeasurements.build do
6
- si_unit :sr, aliases: [:steradian, :steradians]
6
+ system :metric do
7
+ primitive :sr
8
+
9
+ si_unit :sr, aliases: [:steradian, :steradians]
10
+ end
7
11
 
8
12
  unit :sp, value: [(4 * Math::PI), :sr], aliases: [:spat, :spats] # (4 * π) sr
9
13
  unit :deg², value: [((Math::PI / 180) ** 2), :sr], aliases: [:"(°)²", :"sq °", :"square degree", :"square degrees"] # (π / 180)² sr
@@ -3,7 +3,11 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::SoundLevel = UnitMeasurements.build do
6
- si_unit :B, aliases: [:bel, :bels]
6
+ system :metric do
7
+ primitive :dB
8
+
9
+ si_unit :B, aliases: [:bel, :bels]
10
+ end
7
11
 
8
12
  unit :Np, value: [(20 / Math.log(10)), :dB], aliases: [:neper, :nepers] # (20 / ln(10)) dB
9
13
  end
@@ -3,7 +3,13 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::Temperature = UnitMeasurements.build do
6
- si_unit :K, aliases: [:kelvin, :kelvins]
6
+ system :metric do
7
+ primitive :K
7
8
 
8
- unit :°R, value: "5/9 K", aliases: [:R, :°Ra, :Ra, :rankine]
9
+ si_unit :K, aliases: [:kelvin, :kelvins]
10
+ end
11
+
12
+ system :english_engineering do
13
+ unit :°R, value: "5/9 K", aliases: [:R, :°Ra, :Ra, :rankine]
14
+ end
9
15
  end
@@ -3,7 +3,12 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::Time = UnitMeasurements.build do
6
- si_unit :s, aliases: [:sec, :second, :seconds]
6
+ system :metric do
7
+ primitive :s
8
+
9
+ si_unit :s, aliases: [:sec, :second, :seconds]
10
+ unit :min, value: "60 s", aliases: [:minute, :minutes]
11
+ end
7
12
 
8
13
  unit :h, value: "60 min", aliases: [:hr, :hour, :hours]
9
14
  unit :d, value: "24 h", aliases: [:day, :days]
@@ -11,7 +16,6 @@ UnitMeasurements::Time = UnitMeasurements.build do
11
16
  unit :fn, value: "2 wk", aliases: [:"4tnite", :fortnight, :fortnights]
12
17
  unit :mo, value: "30.4167 d", aliases: [:month, :months]
13
18
  unit :yr, value: "365 d", aliases: [:y, :year, :years]
14
- unit :min, value: "60 s", aliases: [:minute, :minutes]
15
19
  unit :qtr, value: "3 mo", aliases: [:quarter, :quarters]
16
20
  unit :dec, value: "10 y", aliases: [:decade, :decades]
17
21
  unit :cent, value: "10 dec", aliases: [:century, :centuries]
@@ -3,18 +3,31 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::Velocity = UnitMeasurements.build do
6
- unit :"m/s", aliases: [:"m·s⁻¹", :"meter per second", :"meters per second", :"metre per second", :"metres per second"]
6
+ system :metric do
7
+ primitive :"m/s"
7
8
 
8
- unit :"m/min", value: "1/60 m/s", aliases: [:"m·min⁻¹", :"meter per minute", :"meters per minute", :"metre per minute", :"metres per minute"]
9
- unit :"m/h", value: "1/60 m/min", aliases: [:"m·h⁻¹", :"meter per hour", :"meters per hour", :"metre per hour", :"metres per hour"]
9
+ unit :"m/s", aliases: [:"m·s⁻¹", :"meter per second", :"meters per second", :"metre per second", :"metres per second"]
10
+ unit :"m/min", value: "1/60 m/s", aliases: [:"m·min⁻¹", :"meter per minute", :"meters per minute", :"metre per minute", :"metres per minute"]
11
+ unit :"m/h", value: "1/60 m/min", aliases: [:"m·h⁻¹", :"meter per hour", :"meters per hour", :"metre per hour", :"metres per hour"]
12
+ end
10
13
 
11
- unit :"in/s", value: "0.0254 m/s", aliases: [:"in·s⁻¹", :"inch per second", :"inches per second"]
12
- unit :"in/min", value: "1/60 in/s", aliases: [:"in·min⁻¹", :"inch per minute", :"inches per minute"]
13
- unit :"in/h", value: "1/60 in/min", aliases: [:"in·h⁻¹", :"inch per hour", :"inches per hour"]
14
+ system :imperial do
15
+ primitive :"in/s"
14
16
 
15
- unit :"ft/s", value: "12 in/s", aliases: [:"ft·s⁻¹", :"foot per second", :"feet per second"]
16
- unit :"ft/min", value: "1/60 ft/s", aliases: [:"ft·min⁻¹", :"foot per minute", :"feet per minute"]
17
- unit :"ft/h", value: "1/60 ft/min", aliases: [:"ft·h⁻¹", :"foot per hour", :"feet per hour"]
17
+ unit :"in/s", value: "0.0254 m/s", aliases: [:"in·s⁻¹", :"inch per second", :"inches per second"]
18
+ unit :"in/min", value: "1/60 in/s", aliases: [:"in·min⁻¹", :"inch per minute", :"inches per minute"]
19
+ unit :"in/h", value: "1/60 in/min", aliases: [:"in·h⁻¹", :"inch per hour", :"inches per hour"]
20
+ end
18
21
 
19
- unit :Kn, value: "0.514773 m/s", aliases: [:kt, :knot, :knots]
22
+ system :foot_pound_second do
23
+ primitive :"ft/s"
24
+
25
+ unit :"ft/s", value: "12 in/s", aliases: [:"ft·s⁻¹", :"foot per second", :"feet per second"]
26
+ unit :"ft/min", value: "1/60 ft/s", aliases: [:"ft·min⁻¹", :"foot per minute", :"feet per minute"]
27
+ unit :"ft/h", value: "1/60 ft/min", aliases: [:"ft·h⁻¹", :"foot per hour", :"feet per hour"]
28
+ end
29
+
30
+ system :meteorology_aviation_maritime do
31
+ unit :Kn, value: "0.514773 m/s", aliases: [:kt, :knot, :knots]
32
+ end
20
33
  end
@@ -3,11 +3,19 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::Voltage = UnitMeasurements.build do
6
- si_unit :V, aliases: [:volt, :volts]
6
+ system :metric do
7
+ primitive :V
7
8
 
8
- unit :abV, value: "1e-8 V", aliases: [:abvolt, :abvolts]
9
- unit :statV, value: "299.792458 V", aliases: [:statvolt, :statvolts]
9
+ si_unit :V, aliases: [:volt, :volts]
10
10
 
11
- unit :"W/A", value: "1 V", aliases: [:"W·A⁻¹", :"watt per ampere", :"watts per ampere"]
12
- unit :"J/C", value: "1 V", aliases: [:"J·C⁻¹", :"joule per coulomb", :"joules per coulomb"]
11
+ unit :"W/A", value: "1 V", aliases: [:"W·A⁻¹", :"watt per ampere", :"watts per ampere"]
12
+ unit :"J/C", value: "1 V", aliases: [:"J·C⁻¹", :"joule per coulomb", :"joules per coulomb"]
13
+ end
14
+
15
+ system :centimetre_gram_second do
16
+ primitive :statV
17
+
18
+ unit :abV, value: "1e-8 V", aliases: [:abvolt, :abvolts]
19
+ unit :statV, value: "299.792458 V", aliases: [:statvolt, :statvolts]
20
+ end
13
21
  end
@@ -3,16 +3,24 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::Volume = UnitMeasurements.build do
6
- si_unit :l, aliases: [:liter, :litre, :liters, :litres]
6
+ system :metric do
7
+ primitive :m³
7
8
 
8
- unit :m³, value: "1000 l", aliases: [:"m^3", :"cu m", :"cubic meter", :"cubic meters", :"cubic metre", :"cubic metres"]
9
- unit :mm³, value: "1e-9 m³", aliases: [:"mm^3", :"cu mm", :"cubic millimeter", :"cubic millimeters", :"cubic millimetre", :"cubic millimetres"]
10
- unit :cm³, value: "1e-6 m³", aliases: [:"cm^3", :"cu cm", :"cubic centimeter", :"cubic centimeters", :"cubic centimetre", :"cubic centimetres"]
11
- unit :dm³, value: "1 l", aliases: [:"dm^3", :"cu dm", :"cubic decimeter", :"cubic decimeters", :"cubic decimetre", :"cubic decimetres"]
12
- unit :km³, value: "1e+9 m³", aliases: [:"km^3", :"cu km", :"cubic kilometer", :"cubic kilometers", :"cubic kilometre", :"cubic kilometres"]
9
+ si_unit :l, aliases: [:liter, :litre, :liters, :litres]
13
10
 
14
- unit :in³, value: "16.387064 ml", aliases: [:"in^3", :"cu in", :"cubic inch", :"cubic inches"]
15
- unit :ft³, value: "1728 in³", aliases: [:"ft^3", :"cu ft", :"cubic foot", :"cubic feet"]
16
- unit :yd³, value: "27 ft³", aliases: [:"yd^3", :"cu yd", :"cubic yard", :"cubic yards"]
17
- unit :mi³, value: "5451776000 yd³", aliases: [:"mi^3", :"cu mi", :"cubic mile", :"cubic miles"]
11
+ unit :m³, value: "1000 l", aliases: [:"m^3", :"cu m", :"cubic meter", :"cubic meters", :"cubic metre", :"cubic metres"]
12
+ unit :mm³, value: "1e-9 m³", aliases: [:"mm^3", :"cu mm", :"cubic millimeter", :"cubic millimeters", :"cubic millimetre", :"cubic millimetres"]
13
+ unit :cm³, value: "1e-6 m³", aliases: [:"cm^3", :"cu cm", :"cubic centimeter", :"cubic centimeters", :"cubic centimetre", :"cubic centimetres"]
14
+ unit :dm³, value: "1 l", aliases: [:"dm^3", :"cu dm", :"cubic decimeter", :"cubic decimeters", :"cubic decimetre", :"cubic decimetres"]
15
+ unit :km³, value: "1e+9 m³", aliases: [:"km^3", :"cu km", :"cubic kilometer", :"cubic kilometers", :"cubic kilometre", :"cubic kilometres"]
16
+ end
17
+
18
+ system :imperial do
19
+ primitive :in³
20
+
21
+ unit :in³, value: "16.387064 ml", aliases: [:"in^3", :"cu in", :"cubic inch", :"cubic inches"]
22
+ unit :ft³, value: "1728 in³", aliases: [:"ft^3", :"cu ft", :"cubic foot", :"cubic feet"]
23
+ unit :yd³, value: "27 ft³", aliases: [:"yd^3", :"cu yd", :"cubic yard", :"cubic yards"]
24
+ unit :mi³, value: "5451776000 yd³", aliases: [:"mi^3", :"cu mi", :"cubic mile", :"cubic miles"]
25
+ end
18
26
  end
@@ -3,8 +3,12 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  UnitMeasurements::Weight = UnitMeasurements.build do
6
- si_unit :g, aliases: [:gram, :grams, :gramme, :grammes]
6
+ system :metric do
7
+ primitive :kg
7
8
 
8
- unit :q, value: "100 kg", aliases: [:quintal, :quintals]
9
- unit :t, value: "10 q", aliases: [:tonne, :tonnes, :"metric tonne", :"metric tonnes"]
9
+ si_unit :g, aliases: [:gram, :grams, :gramme, :grammes]
10
+
11
+ unit :q, value: "100 kg", aliases: [:quintal, :quintals]
12
+ unit :t, value: "1000 kg", aliases: [:tonne, :tonnes, :"metric tonne", :"metric tonnes"]
13
+ end
10
14
  end
@@ -0,0 +1,45 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ module UnitMeasurements
6
+ module UnitMethods
7
+ def unit_for(name)
8
+ unit_name_to_unit(name)
9
+ end
10
+
11
+ def unit_for!(name)
12
+ unit = unit_for(name)
13
+ raise UnitError, name unless unit
14
+ unit
15
+ end
16
+ alias_method :[], :unit_for!
17
+
18
+ def unit_with_name_and_aliases
19
+ units.each_with_object({}) do |unit, hash|
20
+ unit.names.each { |name| hash[name.to_s] = unit }
21
+ end
22
+ end
23
+
24
+ def unit_names
25
+ units.map(&:name).sort
26
+ end
27
+
28
+ def unit_names_with_aliases
29
+ units.flat_map(&:names).sort
30
+ end
31
+
32
+ def unit_name_to_unit(name)
33
+ unit_with_name_and_aliases[name.to_s]
34
+ end
35
+
36
+ def defined?(name)
37
+ unit = unit_for(name)
38
+ unit ? unit.name == name.to_s : false
39
+ end
40
+
41
+ def unit_or_alias?(name)
42
+ !!unit_for(name)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ module UnitMeasurements
6
+ class UnitSystem
7
+ include UnitMethods
8
+
9
+ attr_reader :name, :primitive, :units
10
+
11
+ def initialize(name)
12
+ @name = name
13
+ @primitive = nil
14
+ @units = []
15
+ end
16
+
17
+ def add_unit(unit)
18
+ @units << unit
19
+ end
20
+
21
+ def set_primitive(primitive)
22
+ @primitive = unit_for!(primitive)
23
+ end
24
+
25
+ def primitive?(unit)
26
+ @primitive.to_s == (unit.is_a?(Unit) ? unit.name : unit)
27
+ end
28
+ end
29
+ end
@@ -3,5 +3,5 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  module UnitMeasurements
6
- VERSION = "3.2.0"
6
+ VERSION = "3.3.0"
7
7
  end
data/units.md CHANGED
@@ -231,7 +231,26 @@ These units are defined in `UnitMeasurements::Acceleration`.
231
231
  | 3 | ft/s² | ft/s^2, ft·s⁻², foot per second squared, feet per second squared |
232
232
  | 4 | Kn/s | knot per second, knots per second |
233
233
 
234
- ## 19. Angular acceleration
234
+ ## 19. Angular velocity
235
+
236
+ These units are defined in `UnitMeasurements::AngularVelocity`.
237
+
238
+ | # | Name | Aliases |
239
+ |:--|:--|:--|
240
+ | 1 | rad/s | rad·s⁻¹, radian per second, radians per second |
241
+ | 2 | rad/min | rad·min⁻¹, radian per minute, radians per minute |
242
+ | 3 | rad/h | rad·h⁻¹, radian per hour, radians per hour |
243
+ | 4 | deg/s | °/s, deg·s⁻¹, degree per second, degrees per second |
244
+ | 5 | deg/min | °/min, deg·min⁻¹, degree per minute, degrees per minute |
245
+ | 6 | deg/h | °/h, deg·h⁻¹, degree per hour, degrees per hour |
246
+ | 7 | rev/s | rev·s⁻¹, revolution per second, revolutions per second |
247
+ | 8 | rev/min | rev·min⁻¹, revolution per minute, revolutions per minute |
248
+ | 9 | rev/h | rev·h⁻¹, revolution per hour, revolutions per hour |
249
+ | 10 | gon/s | ᵍ/s, gon·s⁻¹, gradian per second, gradians per second |
250
+ | 11 | gon/min | ᵍ/min, gon·min⁻¹, gradian per minute, gradians per minute |
251
+ | 12 | gon/h | ᵍ/h, gon·h⁻¹, gradian per hour, gradians per hour |
252
+
253
+ ## 20. Angular acceleration
235
254
 
236
255
  These units are defined in `UnitMeasurements::AngularAcceleration`.
237
256
 
@@ -240,3 +259,15 @@ These units are defined in `UnitMeasurements::AngularAcceleration`.
240
259
  | 1 | rad/s² | rad/s^2, rad·s⁻², radian per second squared, radians per second squared |
241
260
  | 2 | deg/s² | deg/s^2, °/s², deg·s⁻², degree per second squared, degrees per second squared |
242
261
  | 3 | gon/s² | gon/s^2, ᵍ/s², gon·s⁻², gradian per second squared, gradians per second squared |
262
+
263
+ ## 21. Electric charge
264
+
265
+ These units are defined in `UnitMeasurements::ElectricCharge`.
266
+
267
+ | # | Name | Aliases |
268
+ |:--|:--|:--|
269
+ | 1 | C* | coulomb, coulombs |
270
+ | 2 | abC | abcoulomb, abcoulombs |
271
+ | 3 | statC | statcoulomb, statcoulombs |
272
+ | 4 | Fr | franklin, franklins |
273
+ | 5 | Fd | faraday, faradays |
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unit_measurements
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harshal LADHE
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-09-27 00:00:00.000000000 Z
11
+ date: 2023-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -122,8 +122,10 @@ files:
122
122
  - lib/unit_measurements/unit_groups/all.rb
123
123
  - lib/unit_measurements/unit_groups/amount_of_substance.rb
124
124
  - lib/unit_measurements/unit_groups/angular_acceleration.rb
125
+ - lib/unit_measurements/unit_groups/angular_velocity.rb
125
126
  - lib/unit_measurements/unit_groups/area.rb
126
127
  - lib/unit_measurements/unit_groups/density.rb
128
+ - lib/unit_measurements/unit_groups/electric_charge.rb
127
129
  - lib/unit_measurements/unit_groups/electric_current.rb
128
130
  - lib/unit_measurements/unit_groups/force.rb
129
131
  - lib/unit_measurements/unit_groups/length.rb
@@ -138,6 +140,8 @@ files:
138
140
  - lib/unit_measurements/unit_groups/voltage.rb
139
141
  - lib/unit_measurements/unit_groups/volume.rb
140
142
  - lib/unit_measurements/unit_groups/weight.rb
143
+ - lib/unit_measurements/unit_methods.rb
144
+ - lib/unit_measurements/unit_system.rb
141
145
  - lib/unit_measurements/version.rb
142
146
  - unit_measurements.gemspec
143
147
  - units.md