unit_measurements 5.14.0 → 5.15.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: d59abc6cd3128c515be37c2e7bcc40cbbaa73530a4a5ed1ce6d5e7093202e063
4
- data.tar.gz: 22091e2ce789b4a064fb0f06fb704805b69cc86601334ab4d9f8a7afe9c6a0fd
3
+ metadata.gz: 9e89ba7ff921595afff359baeafb673b3d1d08d65293aefb4efc3082b99bfad3
4
+ data.tar.gz: ce3695641b050fa395920124859257d2757707cbdda8b8cc42feaa64a75363bc
5
5
  SHA512:
6
- metadata.gz: 4e16e3e25e06d155664fab616cf4e3147d75cf4aef71c15c6312572418fd124d11436c402fbe7e83e984e483c737a073ad180947f0ee071fab170a59c8f880a4
7
- data.tar.gz: b6e6bd19810a115b48d7107859b82e21d8b5dc231455d8a995a9ea5157c44d38c53c287a15945a342f1b376fcfe80b539de29ad1be9ca112e5750ac866013cbc
6
+ metadata.gz: 8b4085c191ebe55c90a272c63ba47c0d54860af42278860f3e30096060a0ebfa34b20a5b81ee57c35327e3f3336617193bacfdab7b76be0361b75d4ebd665f75
7
+ data.tar.gz: a2fe5a6c2f58534a2a688bca5140927906e4c10035dd1e05a4c1b40686a61dc90e2afa1c5929b5a25041101c9327fbb5e6e2e1c937fe025e433bea21b3e99507
data/CHANGELOG.md CHANGED
@@ -1,8 +1,16 @@
1
+ ## [5.15.0](https://github.com/shivam091/unit_measurements/compare/v5.14.0...v5.15.0) - 2023-12-01
2
+
3
+ ### What's new
4
+
5
+ - Added `.define_conversion_methods` method to define conversion helper methods for units.
6
+
7
+ ----------
8
+
1
9
  ## [5.14.0](https://github.com/shivam091/unit_measurements/compare/v5.13.0...v5.14.0) - 2023-11-29
2
10
 
3
11
  ### What's new
4
12
 
5
- - Added `.define_numeric_methods` support to define numeric extension methods for units.
13
+ - Added `.define_numeric_methods` method to define numeric extension methods for units.
6
14
 
7
15
  ----------
8
16
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- unit_measurements (5.14.0)
4
+ unit_measurements (5.15.0)
5
5
  activesupport (~> 7.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -43,11 +43,12 @@ Users are advised to cross-verify conversions for their specific use cases._
43
43
 
44
44
  ## Minimum Requirements
45
45
 
46
- * Ruby 3.2.2+ (https://www.ruby-lang.org/en/downloads/branches/)
46
+ * Ruby 3.2.2+ ([Download Ruby](https://www.ruby-lang.org/en/downloads/branches/))
47
47
 
48
48
  ## Installation
49
49
 
50
- If using bundler, first add this line to your application's Gemfile:
50
+ To use `unit_measurements` in your Rails application, add the
51
+ following line to your Gemfile:
51
52
 
52
53
  ```ruby
53
54
  gem "unit_measurements"
@@ -269,8 +270,7 @@ UnitMeasurements::Length.units_for("metric")
269
270
  **Finding units within the unit group:**
270
271
 
271
272
  You can use `#unit_for` or `#unit_for!` (aliased as `#[]`) methods to find units
272
- within the unit group. `#unit_for!` method returns an error if a unit is not present
273
- in the unit group.
273
+ within the unit group. `#unit_for!` method returns an error if a unit system is not defined within the unit group.
274
274
 
275
275
  ```ruby
276
276
  UnitMeasurements::Length.unit_for("m")
@@ -484,13 +484,12 @@ Volume = UnitMeasurements::Volume
484
484
 
485
485
  ## Extras
486
486
 
487
- ### Numeric extension methods
487
+ ### Numeric methods
488
488
 
489
- The `.define_numeric_methods` method allows you to instantiate measurements in a
490
- manner similar to how `ActiveSupport::Duration` objects are created in Rails,
491
- providing a familiar syntax and functionality.
489
+ The `.define_numeric_methods` method allows you to define numeric methods that help you to initialize measurements in a
490
+ manner similar to how `ActiveSupport::Duration` objects are created in Rails, providing a familiar syntax and functionality.
492
491
 
493
- To define numeric extension methods for specific units within a unit group, use
492
+ To define numeric methods for specific units within the unit group, use
494
493
  the following syntax:
495
494
 
496
495
  ```ruby
@@ -500,21 +499,46 @@ UnitMeasurements::Length.define_numeric_methods("metre", "foot", "inch")
500
499
  This will enable the usage of these units as methods to instantiate and use measurements:
501
500
 
502
501
  ```ruby
503
- 1.m #=> Instantiate a measurement representing 1 metre.
504
- 5.feet #=> Instantiate a measurement representing 5 feet.
505
- 10.inches #=> Instantiate a measurement representing 10 inches.
506
- 1.foot == 12.inches #=> equality comparison between two measurements.
507
- 1.ft + 12.in #=> adds quantity of two measurements.
502
+ # Initialize a measurement
503
+ 1.m #=> 1 m
504
+ 5.feet #=> 5 ft
505
+ 10.inches #=> 10 in
506
+
507
+ # Usage
508
+ ## Equality comparison
509
+ 1.foot == 12.inches #=> true
510
+ ## Arithmetic operation
511
+ 1.ft + 12.in #=> 2.0 ft
512
+ ```
513
+
514
+ ### Conversion methods
515
+
516
+ The `.define_conversion_methods` method allows you to define conversion methods that
517
+ help you to easily convert measurements to a different unit.
518
+
519
+ To define conversion methods for specific units within the unit group, use the following syntax:
520
+
521
+ ```ruby
522
+ UnitMeasurements::Length.define_conversion_methods("metre", "foot", "inch")
523
+ ```
524
+
525
+ This will enable you to convert units as:
526
+
527
+ ```ruby
528
+ UnitMeasurements::Length.new(1, "ft").in_inches #=> 12.0 in
529
+ 12.in.in_foot #=> 1.0 ft
508
530
  ```
509
531
 
510
532
  ## Contributing
511
533
 
512
- 1. Fork it
513
- 2. Create your feature branch (`git checkout -b my-new-feature`)
534
+ Contributions to this project are welcomed! To contribute:
535
+
536
+ 1. Fork this repository
537
+ 2. Create a new branch (`git checkout -b my-new-feature`)
514
538
  3. Commit your changes (`git commit -am "Add some feature"`)
515
- 4. Push to the branch (`git push origin my-new-feature`)
516
- 5. Create new Pull Request
539
+ 4. Push the changes to your branch (`git push origin my-new-feature`)
540
+ 5. Create new **Pull Request**
517
541
 
518
542
  ## License
519
543
 
520
- Copyright 2023 [Harshal V. LADHE]((https://shivam091.github.io)), Released under the [MIT License](http://opensource.org/licenses/MIT).
544
+ Copyright 2023 [Harshal V. LADHE](https://shivam091.github.io), Released under the [MIT License](http://opensource.org/licenses/MIT).
@@ -152,6 +152,7 @@ end
152
152
 
153
153
  # The following requires load various components of the unit measurements library.
154
154
  require "unit_measurements/extras/numeric_methods"
155
+ require "unit_measurements/extras/conversion_methods"
155
156
 
156
157
  require "unit_measurements/configuration"
157
158
  require "unit_measurements/cache"
@@ -0,0 +1,87 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ module UnitMeasurements
6
+ # This module provides functionality to define conversion methods for a list
7
+ # of units within a unit group. If units are empty, it defaults to defining
8
+ # methods for all units in the unit group. These methods allow easy conversion
9
+ # between different units within a given unit group.
10
+ #
11
+ # This module is included in the +Measurement+ class to allow defining conversion
12
+ # methods for specified units.
13
+ #
14
+ # @see Measurement
15
+ #
16
+ # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
17
+ # @since 5.15.0
18
+ module ConversionMethods
19
+ # @scope class
20
+ # Defines conversion methods for specified +units+ within the unit group.
21
+ # If +units+ are empty, it defaults to defining methods for all units within
22
+ # the unit group.
23
+ #
24
+ # @example Define conversion methods for metres, centimetres, and millimetres:
25
+ # UnitMeasurements::Length.define_conversion_methods("metres", :cm, :mm)
26
+ #
27
+ # @example Define conversion methods for all units within the unit group:
28
+ # UnitMeasurements::Length.define_conversion_methods
29
+ #
30
+ # @param [Array<String|Symbol>, optional] units
31
+ # An array of units' names for which conversion methods need to be defined.
32
+ # If empty, methods will be defined for all units within the unit group.
33
+ #
34
+ # @return [Array<Unit>]
35
+ # An array of units for which the conversion methods were defined.
36
+ #
37
+ # @note
38
+ # This method defines a conversion methods specifically for units that contain
39
+ # alphabetic characters in their names.
40
+ #
41
+ # @see .define_conversion_method_for
42
+ # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
43
+ # @since 5.15.0
44
+ def define_conversion_methods(*units)
45
+ unit_group = self
46
+ units = units.empty? ? unit_group.units : units
47
+
48
+ units.inject([]) do |units, unit|
49
+ units << define_conversion_method_for(unit, unit_group)
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ # @private
56
+ # @scope class
57
+ # Defines conversion methods for a specific +unit+ within a +unit_group+.
58
+ # These methods are defined dynamically using +define_method+.
59
+ #
60
+ # @param [String|Symbol|Unit] unit
61
+ # The unit (or its name) for which the conversion methods need to be defined.
62
+ # @param [UnitGroup] unit_group The unit group to which the unit belongs.
63
+ #
64
+ # @return [Unit]
65
+ # The unit instance for which the conversion methods were defined.
66
+ #
67
+ # @see .define_conversion_methods
68
+ # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
69
+ # @since 5.15.0
70
+ def define_conversion_method_for(unit, unit_group)
71
+ unit = unit.is_a?(Unit) ? unit : unit_group.unit_for!(unit)
72
+
73
+ unit.names.each do |method_name|
74
+ # Check if the name contains alphabetic characters
75
+ next unless method_name =~ /^[a-zA-Z]+$/
76
+
77
+ define_method("in_#{method_name}") do |use_cache: false|
78
+ convert_to(unit, use_cache: use_cache)
79
+ end
80
+ alias_method "to_#{method_name}", "in_#{method_name}"
81
+ alias_method "as_#{method_name}", "in_#{method_name}"
82
+ end
83
+
84
+ unit
85
+ end
86
+ end
87
+ end
@@ -3,12 +3,12 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  module UnitMeasurements
6
- # This module provides methods to define +Numeric+ extension methods for a list
7
- # of units within a unit group. If units are empty, it defaults to defining
8
- # methods for all units in the unit group.
6
+ # This module provides methods to define +Numeric+ methods for a list of units
7
+ # within a unit group. If units are empty, it defaults to defining methods for
8
+ # all units in the unit group.
9
9
  #
10
10
  # This module is included in the +Measurement+ class to allow defining numeric
11
- # extension methods for specified units.
11
+ # methods for specified units.
12
12
  #
13
13
  # @see Measurement
14
14
  #
@@ -16,23 +16,27 @@ module UnitMeasurements
16
16
  # @since 5.14.0
17
17
  module NumericMethods
18
18
  # @scope class
19
- # Defines +Numeric+ extension methods for specified units within the unit
20
- # group. If units are empty, it defaults to defining methods for all units
21
- # within the unit group.
22
- #
23
- # @param [Array<String|Symbol>] units
24
- # An array of units' names for which numeric methods need to be defined.
25
- # If empty, methods will be defined for all units in the unit group.
26
- #
27
- # @return [Array<Unit>] An array of units for which methods are defined.
19
+ # Defines +Numeric+ methods for specified +units+ within the unit group. If
20
+ # +units+ are empty, it defaults to defining methods for all units within
21
+ # the unit group.
28
22
  #
29
23
  # @example Define numeric methods for metres, centimetres, and millimetres:
30
24
  # UnitMeasurements::Length.define_numeric_methods("metres", :cm, :mm)
31
25
  #
32
- # @example Define numeric methods for all units in the unit group:
26
+ # @example Define numeric methods for all units within the unit group:
33
27
  # UnitMeasurements::Length.define_numeric_methods
34
28
  #
35
- # @see #define_numeric_method_for
29
+ # @param [Array<String|Symbol>, optional] units
30
+ # An array of units' names for which numeric methods need to be defined.
31
+ # If empty, methods will be defined for all units within the unit group.
32
+ #
33
+ # @return [Array<Unit>] An array of units for which numeric methods were defined.
34
+ #
35
+ # @note
36
+ # This method defines a numeric methods specifically for units that contain
37
+ # alphabetic characters in their names.
38
+ #
39
+ # @see .define_numeric_method_for
36
40
  #
37
41
  # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
38
42
  # @since 5.14.0
@@ -49,17 +53,17 @@ module UnitMeasurements
49
53
 
50
54
  # @private
51
55
  # @scope class
52
- # This method defines a numeric method for a specific unit within a unit group.
53
- # The method is defined dynamically using +define_method+ and associates the
54
- # unit with the numeric value.
56
+ # Defines a numeric method for a specific +unit+ within a +unit_group+. The
57
+ # method is defined dynamically using +define_method+ and associates the unit
58
+ # with the numeric value.
55
59
  #
56
60
  # @param [String|Symbol|Unit] unit
57
- # The unit for which the numeric method is defined.
61
+ # The unit (or its name) for which the numeric method needs to be defined.
58
62
  # @param [UnitGroup] unit_group The unit group to which the unit belongs.
59
63
  #
60
64
  # @return [Unit] The unit instance for which the method was defined.
61
65
  #
62
- # @see #define_numeric_methods
66
+ # @see .define_numeric_methods
63
67
  #
64
68
  # @author {Harshal V. Ladhe}[https://shivam091.github.io/]
65
69
  # @since 5.14.0
@@ -34,6 +34,7 @@ module UnitMeasurements
34
34
  include Math
35
35
 
36
36
  extend NumericMethods
37
+ extend ConversionMethods
37
38
 
38
39
  # Regular expression to match conversion strings.
39
40
  #
@@ -4,5 +4,5 @@
4
4
 
5
5
  module UnitMeasurements
6
6
  # Current stable version.
7
- VERSION = "5.14.0"
7
+ VERSION = "5.15.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.14.0
4
+ version: 5.15.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-29 00:00:00.000000000 Z
11
+ date: 2023-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -118,6 +118,7 @@ files:
118
118
  - lib/unit_measurements/errors/primitive_unit_already_set_error.rb
119
119
  - lib/unit_measurements/errors/unit_already_defined_error.rb
120
120
  - lib/unit_measurements/errors/unit_error.rb
121
+ - lib/unit_measurements/extras/conversion_methods.rb
121
122
  - lib/unit_measurements/extras/numeric_methods.rb
122
123
  - lib/unit_measurements/formatter.rb
123
124
  - lib/unit_measurements/math.rb