unit_measurements 1.4.0 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b4606afee8a816cd36066634a4d6e8e23448548eb51d90d984c5230996f4e12c
4
- data.tar.gz: ab4a36000579a4c3aa33f766a883bbd80c3fc1a485dcef6b12725316154db094
3
+ metadata.gz: aac3030ed1c46bb4bdfe831bc9bedb29ad2a8b0e28595ba4726b2a3ff5e24791
4
+ data.tar.gz: 9179c7b41ef7e84b6864ef98ccb45210ab34b2488830aa3de5552659b7f39039
5
5
  SHA512:
6
- metadata.gz: ffb38111aa3c731166a453fd9f217a2a49a6bffc1db9962c8853af470dcdbf998d51834db785fe5863d2d3d8738cd86ac87d9a1f17ecd98990230683734774e6
7
- data.tar.gz: c5e40fbf843746bac311e1e33071dc41b9b936551760f9aa488acd708b54b2ce8c6e26fb83d197f466acda14788f94fc67fd5013d0c5179116be2914f5e5bd25
6
+ metadata.gz: 5435fba092be97c1c8407b917857c1990db07d1aa1729653ecf14519d98dcec2a4c5e5ad0c4997586eb2f72b17d1099506068aa99eb592ee35ddd8da4a2f8ba7
7
+ data.tar.gz: 5938944868b729168d49d1f5e7e888029931bb17237fd72c66980bf6b47d7fe58f8eefdd94f1927652d9b5d1e3e480e8df746f5c7607995390ea7caeec186634
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## [1.5.1](https://github.com/shivam091/unit_measurements/compare/v1.5.0...v1.5.1) - 2023-08-18
2
+
3
+ ### What's updated
4
+
5
+ - Added extra blank line between method code and last code statement (considered as return).
6
+
7
+ ----------
8
+
9
+ ## [1.5.0](https://github.com/shivam091/unit_measurements/compare/v1.4.0...v1.5.0) - 2023-08-18
10
+
11
+ ### What's fixed
12
+
13
+ - Fixed precision in `Measurement#quantity` method.
14
+
15
+ ----------
16
+
1
17
  ## [1.4.0](https://github.com/shivam091/unit_measurements/compare/v1.3.0...v1.4.0) - 2023-08-17
2
18
 
3
19
  ### What's new
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- unit_measurements (1.4.0)
4
+ unit_measurements (1.5.1)
5
5
  activesupport (~> 7.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -79,14 +79,14 @@ You can use `#convert_to` as:
79
79
 
80
80
  ```ruby
81
81
  UnitMeasurements::Weight.new(1, :kg).convert_to(:g)
82
- #=> 1000 g
82
+ #=> 1000.0 g
83
83
  ```
84
84
 
85
85
  If you want to modify measurement object itself, you can use `#convert_to!` method as:
86
86
 
87
87
  ```ruby
88
88
  UnitMeasurements::Weight.new(1, :kg).convert_to!(:g)
89
- #=> 1000 g
89
+ #=> 1000.0 g
90
90
  ```
91
91
 
92
92
  You can also chain call of `#convert_to` and `#convert_to!` methods as:
@@ -100,18 +100,18 @@ UnitMeasurements::Weight.new(1, :kg).convert_to(:g).convert_to(:t).convert_to!(:
100
100
 
101
101
  ```ruby
102
102
  UnitMeasurements::Weight.parse("1 kg")
103
- #=> 1 kg
103
+ #=> 1.0 kg
104
104
  ```
105
105
 
106
106
  **Parse string that mentions quantity, source unit, and target unit:**
107
107
 
108
108
  ```ruby
109
109
  UnitMeasurements::Weight.parse("1 kg to g")
110
- #=> 1000 g
110
+ #=> 1000.0 g
111
111
  UnitMeasurements::Weight.parse("1 kg as g")
112
- #=> 1000 g
112
+ #=> 1000.0 g
113
113
  UnitMeasurements::Weight.parse("1 kg in g")
114
- #=> 1000 g
114
+ #=> 1000.0 g
115
115
  ```
116
116
 
117
117
  **Parse rational numbers, source unit, and (or) target unit:**
@@ -144,58 +144,58 @@ UnitMeasurements::Weight.parse("2+3i kg to g")
144
144
 
145
145
  ```ruby
146
146
  UnitMeasurements::Weight.new(BigDecimal(2), :kg).convert_to(:g)
147
- #=> 2000 g
147
+ #=> 2000.0 g
148
148
  UnitMeasurements::Weight.new(0.2e1, :kg).convert_to(:g)
149
- #=> 2000 g
149
+ #=> 2000.0 g
150
150
  UnitMeasurements::Weight.parse("0.2e1 kg").convert_to(:g)
151
- #=> 2000 g
151
+ #=> 2000.0 g
152
152
  UnitMeasurements::Weight.parse("0.2e1 kg to g")
153
- #=> 2000 g
153
+ #=> 2000.0 g
154
154
  ```
155
155
 
156
156
  **Parse ratios, source unit, and (or) target unit:**
157
157
 
158
158
  ```ruby
159
159
  UnitMeasurements::Weight.new("1:2", :kg).convert_to(:g)
160
- #=> 500 g
160
+ #=> 500.0 g
161
161
  UnitMeasurements::Weight.parse("1:2 kg").convert_to(:g)
162
- #=> 500 g
162
+ #=> 500.0 g
163
163
  UnitMeasurements::Weight.parse("1:2 kg to g")
164
- #=> 500 g
164
+ #=> 500.0 g
165
165
  ```
166
166
 
167
167
  **Parse fractional notations, source unit, and (or) target unit:**
168
168
 
169
169
  ```ruby
170
170
  UnitMeasurements::Weight.new("1/2", :kg).convert_to(:g)
171
- #=> 500 g
171
+ #=> 500.0 g
172
172
  UnitMeasurements::Weight.parse("1/2 kg").convert_to(:g)
173
- #=> 500 g
173
+ #=> 500.0 g
174
174
  UnitMeasurements::Weight.parse("1/2 kg to g")
175
- #=> 500 g
175
+ #=> 500.0 g
176
176
  UnitMeasurements::Weight.new("½", :kg).convert_to(:g)
177
- #=> 500 g
177
+ #=> 500.0 g
178
178
  UnitMeasurements::Weight.parse("½ kg").convert_to(:g)
179
- #=> 500 g
179
+ #=> 500.0 g
180
180
  UnitMeasurements::Weight.parse("½ kg to g")
181
- #=> 500 g
181
+ #=> 500.0 g
182
182
  ```
183
183
 
184
184
  **Parse mixed fractional notations, source unit, and (or) target unit:**
185
185
 
186
186
  ```ruby
187
187
  UnitMeasurements::Weight.new("2 1/2", :kg).convert_to(:g)
188
- #=> 2500 g
188
+ #=> 2500.0 g
189
189
  UnitMeasurements::Weight.parse("2 1/2 kg").convert_to(:g)
190
- #=> 2500 g
190
+ #=> 2500.0 g
191
191
  UnitMeasurements::Weight.parse("2 1/2 kg to g")
192
- #=> 2500 g
192
+ #=> 2500.0 g
193
193
  UnitMeasurements::Weight.new("2 ½", :kg).convert_to(:g)
194
- #=> 2500 g
194
+ #=> 2500.0 g
195
195
  UnitMeasurements::Weight.parse("2 ½ kg").convert_to(:g)
196
- #=> 2500 g
196
+ #=> 2500.0 g
197
197
  UnitMeasurements::Weight.parse("2 ½ kg to g")
198
- #=> 2500 g
198
+ #=> 2500.0 g
199
199
  ```
200
200
 
201
201
  Supported special characters for fractional notations are `¼`, `½`, `¾`, `⅓`, `⅔`, `⅕`, `⅖`, `⅗`, `⅘`, `⅙`, `⅚`, `⅐`, `⅛`, `⅜`, `⅝`, `⅞`, `⅑`, `⅒`, `↉`, `⁄`.
@@ -204,17 +204,17 @@ Supported special characters for fractional notations are `¼`, `½`, `¾`, `⅓
204
204
 
205
205
  ```ruby
206
206
  UnitMeasurements::Weight.new("2e+2", :kg).convert_to(:g)
207
- #=> 200000 g
207
+ #=> 200000.0 g
208
208
  UnitMeasurements::Weight.parse("2e² kg").convert_to(:g)
209
- #=> 200000 g
209
+ #=> 200000.0 g
210
210
  UnitMeasurements::Weight.parse("2e+2 kg to g")
211
- #=> 200000 g
211
+ #=> 200000.0 g
212
212
  UnitMeasurements::Weight.new("2e⁺²", :kg).convert_to(:g)
213
- #=> 200000 g
213
+ #=> 200000.0 g
214
214
  UnitMeasurements::Weight.parse("2e⁺2 kg").convert_to(:g)
215
- #=> 200000 g
215
+ #=> 200000.0 g
216
216
  UnitMeasurements::Weight.parse("2e⁻² kg to g")
217
- #=> 20 g
217
+ #=> 20.0 g
218
218
  ```
219
219
 
220
220
  Supported special characters for exponents are `⁰`, `¹`, `²`, `³`, `⁴`, `⁵`, `⁶`, `⁷`, `⁸`, `⁹`, `⁺`, `⁻`.
@@ -236,9 +236,9 @@ UnitMeasurements::Weight.parse("2 kg").to(:st).format("%.4<quantity>f")
236
236
  **Extract the unit and the quantity from measurement:**
237
237
 
238
238
  ```ruby
239
- weight = UnitMeasurements::Weight.new(1.0, :kg)
239
+ weight = UnitMeasurements::Weight.new(1, :kg)
240
240
  weight.quantity
241
- #=> 0.1e1
241
+ #=> 1
242
242
  weight.unit
243
243
  #=> #<UnitMeasurements::Unit: kg (kilogram, kilogramme, kilogrammes, kilograms)>
244
244
  ```
@@ -307,7 +307,6 @@ UnitMeasurements::Weight.unit_or_alias?(:gramme)
307
307
 
308
308
  You have ability to compare the measurements with the same or different units within the same unit group.
309
309
  For example, comparing weight with weight will work, comparing a weight with a area would fail.
310
- Allowed comparisons are `==`, `!=`, `>`, `>=`, `<`, and `<=`.
311
310
 
312
311
  ```ruby
313
312
  UnitMeasurements::Weight.new(1, "kg") == UnitMeasurements::Weight.new(1, :kg)
@@ -320,12 +319,16 @@ UnitMeasurements::Weight.parse("1 kg") <= UnitMeasurements::Weight.parse("0.5 kg
320
319
  #=> false
321
320
  UnitMeasurements::Weight.parse("1 kg") >= UnitMeasurements::Weight.parse("0.5 kg")
322
321
  #=> true
322
+ UnitMeasurements::Length.new(1, :ft).between?(UnitMeasurements::Length.new(12, :in), UnitMeasurements::Length.new(24, :in))
323
+ #=> true
324
+ UnitMeasurements::Length.new(1, :ft).clamp(UnitMeasurements::Length.new(13, :in), UnitMeasurements::Length.new(24, :in))
325
+ #=> 13 in
323
326
  ```
324
327
 
325
328
  ### Arithmetic
326
329
 
327
- You have the ability to perform arithmetic operations on measurements with the same or
328
- different units within the same unit group. You can perform arithmetic operations on
330
+ You have ability to perform arithmetic operations on measurements with the same or
331
+ different units within a same unit group. You can perform arithmetic operations on
329
332
  measurement by either other compatible measurement or number.
330
333
 
331
334
  **Methods:**
@@ -68,6 +68,7 @@ module UnitMeasurements
68
68
 
69
69
  def arithmetic_operation(other, operator)
70
70
  other, _ = coerce(other)
71
+
71
72
  self.class.new(self.quantity.public_send(operator, other.convert_to(self.unit).quantity), self.unit)
72
73
  end
73
74
  end
@@ -8,6 +8,7 @@ module UnitMeasurements
8
8
 
9
9
  def initialize(string)
10
10
  @string = string
11
+
11
12
  super("Unable to parse: '#{string}'.")
12
13
  end
13
14
  end
@@ -8,6 +8,7 @@ module UnitMeasurements
8
8
 
9
9
  def initialize(unit)
10
10
  @unit = unit
11
+
11
12
  super("Unit already defined: '#{unit}'.")
12
13
  end
13
14
  end
@@ -8,6 +8,7 @@ module UnitMeasurements
8
8
 
9
9
  def initialize(unit)
10
10
  @unit = unit
11
+
11
12
  super("Invalid unit: '#{unit}'.")
12
13
  end
13
14
  end
@@ -22,6 +22,7 @@ module UnitMeasurements
22
22
  # @return [String]
23
23
  def format(format = nil)
24
24
  kwargs = {quantity: quantity, unit: unit.to_s}
25
+
25
26
  (format || DEFAULT_FORMAT) % kwargs
26
27
  end
27
28
  end
@@ -26,6 +26,7 @@ module UnitMeasurements
26
26
  return self if target_unit == unit
27
27
 
28
28
  conversion_factor = (unit.conversion_factor / target_unit.conversion_factor)
29
+
29
30
  self.class.new((quantity * conversion_factor), target_unit)
30
31
  end
31
32
  alias_method :to, :convert_to
@@ -33,6 +34,7 @@ module UnitMeasurements
33
34
  def convert_to!(target_unit)
34
35
  measurement = convert_to(target_unit)
35
36
  @quantity, @unit = measurement.quantity, measurement.unit
37
+
36
38
  self
37
39
  end
38
40
  alias_method :to!, :convert_to!
@@ -44,7 +46,16 @@ module UnitMeasurements
44
46
  end
45
47
 
46
48
  def to_s
47
- "#{humanized_quantity} #{unit.to_s}"
49
+ "#{quantity} #{unit}"
50
+ end
51
+
52
+ def quantity
53
+ case @quantity
54
+ when Rational
55
+ @quantity.denominator == 1 ? @quantity.numerator : @quantity
56
+ else
57
+ @quantity
58
+ end
48
59
  end
49
60
 
50
61
  class << self
@@ -61,6 +72,7 @@ module UnitMeasurements
61
72
  def parse(input)
62
73
  input = Normalizer.normalize(input)
63
74
  source, target = input.match(CONVERSION_STRING_REGEXP)&.captures
75
+
64
76
  target ? _parse(source).convert_to(target) : _parse(source)
65
77
  end
66
78
 
@@ -68,6 +80,7 @@ module UnitMeasurements
68
80
 
69
81
  def _parse(string)
70
82
  quantity, unit = Parser.parse(string)
83
+
71
84
  new(quantity, unit)
72
85
  end
73
86
  end
@@ -83,6 +96,7 @@ module UnitMeasurements
83
96
  when String
84
97
  quantity = Normalizer.normalize(quantity)
85
98
  quantity, _ = Parser.parse(quantity)
99
+
86
100
  quantity
87
101
  else
88
102
  quantity
@@ -92,15 +106,5 @@ module UnitMeasurements
92
106
  def unit_from_unit_or_name!(value)
93
107
  value.is_a?(Unit) ? value : self.class.unit_group.unit_for!(value)
94
108
  end
95
-
96
- def humanized_quantity
97
- case quantity
98
- when Complex
99
- quantity
100
- when Numeric
101
- num = quantity.to_r
102
- num.denominator == 1 ? num.numerator.to_s : num.to_f.to_s
103
- end
104
- end
105
109
  end
106
110
  end
@@ -37,17 +37,20 @@ module UnitMeasurements
37
37
  end
38
38
  si_units << build_unit("#{short_prefix}#{name}", value: "#{multiplier} #{name}", aliases: si_aliases)
39
39
  end
40
+
40
41
  si_units
41
42
  end
42
43
 
43
44
  def build_unit(name, value:, aliases:)
44
45
  unit = Unit.new(name, value: value, aliases: aliases)
45
46
  check_for_duplicate_unit_names!(unit)
47
+
46
48
  unit
47
49
  end
48
50
 
49
51
  def check_for_duplicate_unit_names!(unit)
50
52
  names = @units.flat_map(&:names)
53
+
51
54
  if names.any? { |name| unit.names.include?(name) }
52
55
  raise UnitAlreadyDefinedError.new(unit.name)
53
56
  end
@@ -3,5 +3,5 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  module UnitMeasurements
6
- VERSION = "1.4.0"
6
+ VERSION = "1.5.1"
7
7
  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: 1.4.0
4
+ version: 1.5.1
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-17 00:00:00.000000000 Z
11
+ date: 2023-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport