unit_measurements 3.2.0 → 3.3.0

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