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 +4 -4
- data/CHANGELOG.md +9 -1
- data/Gemfile.lock +1 -1
- data/README.md +43 -19
- data/lib/unit_measurements/base.rb +1 -0
- data/lib/unit_measurements/extras/conversion_methods.rb +87 -0
- data/lib/unit_measurements/extras/numeric_methods.rb +24 -20
- data/lib/unit_measurements/measurement.rb +1 -0
- data/lib/unit_measurements/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e89ba7ff921595afff359baeafb673b3d1d08d65293aefb4efc3082b99bfad3
|
4
|
+
data.tar.gz: ce3695641b050fa395920124859257d2757707cbdda8b8cc42feaa64a75363bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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`
|
13
|
+
- Added `.define_numeric_methods` method to define numeric extension methods for units.
|
6
14
|
|
7
15
|
----------
|
8
16
|
|
data/Gemfile.lock
CHANGED
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
|
-
|
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
|
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
|
487
|
+
### Numeric methods
|
488
488
|
|
489
|
-
The `.define_numeric_methods` method allows you to
|
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
|
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
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
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
|
-
|
513
|
-
|
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
|
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](
|
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+
|
7
|
-
#
|
8
|
-
#
|
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
|
-
#
|
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+
|
20
|
-
#
|
21
|
-
#
|
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
|
26
|
+
# @example Define numeric methods for all units within the unit group:
|
33
27
|
# UnitMeasurements::Length.define_numeric_methods
|
34
28
|
#
|
35
|
-
# @
|
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
|
-
#
|
53
|
-
#
|
54
|
-
#
|
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
|
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
|
66
|
+
# @see .define_numeric_methods
|
63
67
|
#
|
64
68
|
# @author {Harshal V. Ladhe}[https://shivam091.github.io/]
|
65
69
|
# @since 5.14.0
|
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.
|
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
|
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
|