unit_measurements 5.9.0 → 5.11.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '08305aaf9558055931b73b625212941d80d625e042933de660624d1786af7bc9'
4
- data.tar.gz: 28b9f54eeb207abef81d9d908b040e1e1da4e7426c1f69d0be2332f3611c0d16
3
+ metadata.gz: ca26bc8965c93c692a72e788ab2577f2bad297909372a72d3cc2fec93a45b5bd
4
+ data.tar.gz: 581d716cb56cf59c89eeb69d01095c4c0c14054006dc6bb0822580e3d6750ffd
5
5
  SHA512:
6
- metadata.gz: b2e8e679fff2e9590c5c8a3f4a72da21ad58c216d0556154529b5e5ad9cab92f78f4dc2ec7c8f7297653755c5cadbd8e246546b7092b983b14c824ccd5acf3ff
7
- data.tar.gz: 006037a17c4b9616550757994f7e384b2344a3fc6651a05243cf19e4e326101bfdb90cb9075e070c54759c9a113d853a43157c1333994b0e4b088db3e2cfb504
6
+ metadata.gz: ed994225ecb853f8ce577e0b53a863b0f091980ee33f054b50f69d156ad0a7e393a4a59d962d665aa52fa6cdc077f19f42bc27d0b1d8e7413f359dbde8e6a9fb
7
+ data.tar.gz: 889e45c784390c89a46079067ca9493253e638b1117ee88c16c5ab2ed60db89a855a11bf487f2a6536b1729a2704983fbfcb5fa60959a2b8eed79dae4957d920
data/CHANGELOG.md CHANGED
@@ -1,3 +1,28 @@
1
+ ## [5.11.0](https://github.com/shivam091/unit_measurements/compare/v5.10.0...v5.11.0) - 2023-11-11
2
+
3
+ ### What's new
4
+
5
+ - Added `#systems` method to return unit systems within the unit group.
6
+ - Added `#ratio` method to calculate the ratio between two units.
7
+
8
+ ----------
9
+
10
+ ## [5.10.0](https://github.com/shivam091/unit_measurements/compare/v5.9.0...v5.10.0) - 2023-11-09
11
+
12
+ ### What's new
13
+
14
+ - Added new method `#to_fs` to format the measurement.
15
+ - Aliased arithmetic method `#**` to `#pow` and `#^`.
16
+ - Aliased arithmetic method `#-@` to `#inverse` and `#negate`.
17
+ - Added `UnitMeasurements::BlankQuantityError` error if tried to initialize the `Measurement` with a blank quantity.
18
+ - Added `UnitMeasurements::BlankUnitError` error if tried to initialize the `Measurement` with a blank unit.
19
+
20
+ ### What's deprecated
21
+
22
+ - `#format` method in favour of `#to_fs`.
23
+
24
+ ----------
25
+
1
26
  ## [5.9.0](https://github.com/shivam091/unit_measurements/compare/v5.8.0...v5.9.0) - 2023-11-08
2
27
 
3
28
  ### What's new
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- unit_measurements (5.9.0)
4
+ unit_measurements (5.11.0)
5
5
  activesupport (~> 7.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -95,6 +95,7 @@ UnitMeasurements::Length.new(1, "km")
95
95
 
96
96
  This gem allows you to convert among units of same unit group. You can convert measurement to other unit using `#convert_to`
97
97
  (aliased as `#to`, `#in`, and `#as`) or `#convert_to!` (aliased as `#to!`, `#in!`, and `#as!`) methods.
98
+ You can also chain call of `#convert_to` and `#convert_to!` methods.
98
99
 
99
100
  These methods provide `use_cache` parameter which defaults to `false` to indicate whether the caching of conversion factors should happen.
100
101
 
@@ -119,13 +120,6 @@ UnitMeasurements::Length.new(1, "cm").convert_to("primitive")
119
120
  #=> 0.01 m
120
121
  ```
121
122
 
122
- You can also chain call of `#convert_to` and `#convert_to!` methods as:
123
-
124
- ```ruby
125
- UnitMeasurements::Length.new(100, "m").convert_to("ft").convert_to!("in", use_cache: true)
126
- #=> 3937.00787401574071916010498688 in
127
- ```
128
-
129
123
  **Parse string without having to split out the quantity and source unit:**
130
124
 
131
125
  This method provides `use_cache` parameter which defaults to `false` to indicate whether the caching of conversion factors should happen.
@@ -185,6 +179,13 @@ UnitMeasurements::Length.parse("1:2 km to m")
185
179
  #=> 500.0 m
186
180
  ```
187
181
 
182
+ **Calculate the ratio between two units:**
183
+
184
+ ```ruby
185
+ UnitMeasurements::Length.ratio("in", "ft")
186
+ #=> "12.0 in/ft"
187
+ ```
188
+
188
189
  **Formatting measurement:**
189
190
 
190
191
  If you want to format the measurement to certain format, you can use `#to_fs` method.
@@ -198,7 +199,7 @@ UnitMeasurements::Length.new(100, "m").to("in").to_fs("%.4<quantity>f %<unit>s")
198
199
  You can check more about formatting along with their examples
199
200
  [here](https://shivam091.github.io/unit_measurements/UnitMeasurements/Formatter.html).
200
201
 
201
- **Extract the unit and the quantity from measurement:**
202
+ **Extract the quantity and the unit from measurement:**
202
203
 
203
204
  ```ruby
204
205
  length = UnitMeasurements::Length.new(1, "km")
@@ -208,6 +209,15 @@ length.unit
208
209
  #=> #<UnitMeasurements::Unit: km (kilometer, kilometers, kilometre, kilometres)>
209
210
  ```
210
211
 
212
+ Unit object can be interrogated for a range of attributes:
213
+
214
+ ```ruby
215
+ length.unit.aliases # Alternative names for the unit.
216
+ #=> #<Set: {"kilometer", "kilometers", "kilometre", "kilometres"}>
217
+ length.unit.conversion_factor # Conversion factor relative to primitive unit.
218
+ #=> 1000.0
219
+ ```
220
+
211
221
  **See primitive unit of the unit group:**
212
222
 
213
223
  ```ruby
@@ -236,6 +246,13 @@ UnitMeasurements::Length.unit_names_with_aliases
236
246
  #=> ["\"", "'", "feet", "foot", "ft", "in", "inch", "inches", "m", "meter", "meters", "metre", "metres", "mi", "mile", "miles", "yard", "yards", "yd"]
237
247
  ```
238
248
 
249
+ **See list of unit systems defined within the unit group:**
250
+
251
+ ```ruby
252
+ UnitMeasurements::Length.systems
253
+ #=> ["metric", "imperial", "us_customary", "astronomical"]
254
+ ```
255
+
239
256
  **See list of units within the unit system:**
240
257
 
241
258
  You can use `#units_for` or `#units_for!` methods to find units within the unit system.
@@ -134,6 +134,8 @@ module UnitMeasurements
134
134
  def **(other)
135
135
  arithmetic_operation(other, :**)
136
136
  end
137
+ alias_method :pow, :**
138
+ alias_method :^, :**
137
139
 
138
140
  # Negates the quantity of the measurement.
139
141
  #
@@ -151,6 +153,8 @@ module UnitMeasurements
151
153
  def -@
152
154
  self.class.new(-self.quantity, self.unit)
153
155
  end
156
+ alias_method :inverse, :-@
157
+ alias_method :negate, :-@
154
158
 
155
159
  # Checks whether the quantity of the measurement is nonzero.
156
160
  #
@@ -148,3 +148,5 @@ require "unit_measurements/errors/unit_error"
148
148
  require "unit_measurements/errors/parse_error"
149
149
  require "unit_measurements/errors/unit_already_defined_error"
150
150
  require "unit_measurements/errors/primitive_unit_already_set_error"
151
+ require "unit_measurements/errors/blank_quantity_error"
152
+ require "unit_measurements/errors/blank_unit_error"
@@ -55,7 +55,7 @@ module UnitMeasurements
55
55
  # @since 5.3.0
56
56
  def use_cache=(use_cache)
57
57
  unless [true, false].include?(use_cache)
58
- raise BaseError, "Configuration#use_cache= only accepts true or false, but received #{use_cache}"
58
+ raise ArgumentError, "Configuration#use_cache= only accepts true or false, but received #{use_cache}"
59
59
  end
60
60
 
61
61
  @use_cache = use_cache
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ module UnitMeasurements
6
+ # The +UnitMeasurements::BlankQuantityError+ class represents an error that
7
+ # occurs when trying to initialize the +Measurement+ with a blank quantity.
8
+ #
9
+ # @see BaseError
10
+ # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
11
+ # @since 5.10.0
12
+ class BlankQuantityError < BaseError
13
+ # Initializes a new +BlankQuantityError+ instance.
14
+ #
15
+ # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
16
+ # @since 5.10.0
17
+ def initialize
18
+ super("Quantity cannot be blank.")
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ module UnitMeasurements
6
+ # The +UnitMeasurements::BlankUnitError+ class represents an error that
7
+ # occurs when trying to initialize the +Measurement+ with a blank unit.
8
+ #
9
+ # @see BaseError
10
+ # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
11
+ # @since 5.10.0
12
+ class BlankUnitError < BaseError
13
+ # Initializes a new +BlankUnitError+ instance.
14
+ #
15
+ # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
16
+ # @since 5.10.0
17
+ def initialize
18
+ super("Unit cannot be blank.")
19
+ end
20
+ end
21
+ end
@@ -18,19 +18,27 @@ module UnitMeasurements
18
18
  # containing placeholders for +quantity+ and +unit+.
19
19
  DEFAULT_FORMAT = "%.2<quantity>f %<unit>s".freeze
20
20
 
21
+ # @deprecated This method has been deprecated in favour of {#to_fs}.
22
+ #
23
+ # This method is no longer recommended for use. Please use {#to_fs}
24
+ # instead.
25
+ def format(format = nil)
26
+ warn "DEPRECATION WARNING: The `format` method is deprecated and will be removed in upcoming release. Please use `to_fs` instead."
27
+ to_fs(format)
28
+ end
29
+
21
30
  # Formats measurement to certain formatted string specified by +format+.
22
- # If +format+ is not specified, it uses +DEFAULT_FORMAT+ for formatting the
31
+ # If +format+ is not specified, it uses {DEFAULT_FORMAT} for formatting the
23
32
  # measurement.
24
33
  #
25
- # The format method allows for customization of the output format of a
26
- # measurement. It uses format placeholders for +quantity+ and +unit+. If no
27
- # custom format is provided, it will use the +DEFAULT_FORMAT+.
34
+ # The {#to_fs} method allows for customization of the output format of a
35
+ # measurement. It uses format placeholders for +quantity+ and +unit+.
28
36
  #
29
37
  # @example
30
- # UnitMeasurements::Length.new(1, "m").to("in").format
38
+ # UnitMeasurements::Length.new(1, "m").to("in").to_fs
31
39
  # => "39.37 in"
32
40
  #
33
- # UnitMeasurements::Length.new(1, "m").to("in").format("%.4<quantity>f %<unit>s")
41
+ # UnitMeasurements::Length.new(1, "m").to("in").to_fs("%.4<quantity>f %<unit>s")
34
42
  # => "39.3701 in"
35
43
  #
36
44
  # @param [String, optional] format
@@ -41,10 +49,9 @@ module UnitMeasurements
41
49
  #
42
50
  # @see DEFAULT_FORMAT
43
51
  # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
44
- # @since 1.1.0
45
- def format(format = nil)
52
+ # @since 5.10.0
53
+ def to_fs(format = nil)
46
54
  kwargs = {quantity: quantity, unit: unit.to_s}
47
-
48
55
  (format || DEFAULT_FORMAT) % kwargs
49
56
  end
50
57
  end
@@ -64,7 +64,7 @@ module UnitMeasurements
64
64
  #
65
65
  # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
66
66
  # @since 1.6.0
67
- def floor(ndigits =0)
67
+ def floor(ndigits = 0)
68
68
  self.class.new(quantity.floor(ndigits), unit)
69
69
  end
70
70
 
@@ -84,7 +84,7 @@ module UnitMeasurements
84
84
  #
85
85
  # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
86
86
  # @since 1.6.0
87
- def ceil(ndigits =0)
87
+ def ceil(ndigits = 0)
88
88
  self.class.new(quantity.ceil(ndigits), unit)
89
89
  end
90
90
  end
@@ -104,14 +104,16 @@ module UnitMeasurements
104
104
  # @param [Numeric|String] quantity The quantity of the measurement.
105
105
  # @param [String|Unit] unit The unit of the measurement.
106
106
  #
107
- # @raise [BaseError] If +quantity+ or +unit+ is blank.
107
+ # @raise [BlankQuantityError] If +quantity+ is blank.
108
+ # @raise [BlankUnitError] If +unit+ is blank.
108
109
  #
109
- # @see BaseError
110
+ # @see BlankQuantityError
111
+ # @see BlankUnitError
110
112
  # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
111
113
  # @since 1.0.0
112
114
  def initialize(quantity, unit)
113
- raise BaseError, "Quantity cannot be blank." if quantity.blank?
114
- raise BaseError, "Unit cannot be blank." if unit.blank?
115
+ raise BlankQuantityError if quantity.blank?
116
+ raise BlankUnitError if unit.blank?
115
117
 
116
118
  @quantity = convert_quantity(quantity)
117
119
  @unit = unit_from_unit_or_name!(unit)
@@ -241,7 +243,7 @@ module UnitMeasurements
241
243
  def_delegators :unit_group, :primitive, :units, :cache_file, :unit_names,
242
244
  :unit_with_name_and_aliases, :unit_names_with_aliases,
243
245
  :unit_for, :unit_for!, :defined?, :unit_or_alias?, :[],
244
- :units_for, :units_for!
246
+ :units_for, :units_for!, :systems
245
247
 
246
248
  # Parses an input string and returns a +Measurement+ instance depending on
247
249
  # the input string. This method first normalizes the +input+ internally,
@@ -366,6 +368,40 @@ module UnitMeasurements
366
368
  cached.clear_cache
367
369
  end
368
370
 
371
+ # Calculates the ratio between two units.
372
+ #
373
+ # This method takes a source unit and a target unit, and returns the ratio
374
+ # between them as a string representation.
375
+ #
376
+ # @example Calculating the ratio between 'in' and 'ft':
377
+ # UnitMeasurements::Length.ratio("in", "ft")
378
+ # => "12.0 in/ft"
379
+ #
380
+ # UnitMeasurements::Length.ratio(UnitMeasurements::Length.unit_for("in"), "ft")
381
+ # => "12.0 in/ft"
382
+ #
383
+ # @param [Unit|String|Symbol] source_unit
384
+ # The source unit for the ratio calculation.
385
+ # @param [Unit|String|Symbol] target_unit
386
+ # The target unit for the ratio calculation.
387
+ #
388
+ # @return [String] The ratio between the source and target units.
389
+ #
390
+ # @raise [UnitError]
391
+ # If either the source unit or the target unit is not found in the unit group.
392
+ #
393
+ # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
394
+ # @since 5.11.0
395
+ def ratio(source_unit, target_unit)
396
+ source_unit = source_unit.is_a?(Unit) ? source_unit : unit_for!(source_unit)
397
+ target_unit = target_unit.is_a?(Unit) ? target_unit : unit_for!(target_unit)
398
+
399
+ source_quantity = 1
400
+ target_quantity = new(source_quantity, target_unit).convert_to(source_unit).quantity
401
+
402
+ "#{target_quantity} #{source_unit}/#{target_unit}"
403
+ end
404
+
369
405
  private
370
406
 
371
407
  # @private
@@ -247,6 +247,22 @@ module UnitMeasurements
247
247
  system_units
248
248
  end
249
249
 
250
+ # Returns an array of unit system names defined within the unit group.
251
+ #
252
+ # It scans through the units and compiles a list of unique system names.
253
+ #
254
+ # @example
255
+ # UnitMeasurements::Length.systems
256
+ # => ["metric", "imperial", "us_customary", "astronomical"]
257
+ #
258
+ # @return [Array<String>] An array of unit system names.
259
+ #
260
+ # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
261
+ # @since 5.11.0
262
+ def systems
263
+ units.map { _1.system }.uniq
264
+ end
265
+
250
266
  private
251
267
 
252
268
  # @private
@@ -4,5 +4,5 @@
4
4
 
5
5
  module UnitMeasurements
6
6
  # Current stable version.
7
- VERSION = "5.9.0"
7
+ VERSION = "5.11.0"
8
8
  end
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: 5.9.0
4
+ version: 5.11.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-11-08 00:00:00.000000000 Z
11
+ date: 2023-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -111,6 +111,8 @@ files:
111
111
  - lib/unit_measurements/comparison.rb
112
112
  - lib/unit_measurements/configuration.rb
113
113
  - lib/unit_measurements/conversion.rb
114
+ - lib/unit_measurements/errors/blank_quantity_error.rb
115
+ - lib/unit_measurements/errors/blank_unit_error.rb
114
116
  - lib/unit_measurements/errors/parse_error.rb
115
117
  - lib/unit_measurements/errors/primitive_unit_already_set_error.rb
116
118
  - lib/unit_measurements/errors/unit_already_defined_error.rb