unit_measurements 1.0.0 → 1.2.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 +16 -0
- data/Gemfile.lock +1 -1
- data/README.md +17 -0
- data/lib/unit_measurements/base.rb +1 -0
- data/lib/unit_measurements/errors/parse_error.rb +1 -1
- data/lib/unit_measurements/errors/unit_already_defined_error.rb +1 -1
- data/lib/unit_measurements/errors/unit_error.rb +1 -1
- data/lib/unit_measurements/formatter.rb +28 -0
- data/lib/unit_measurements/measurement.rb +3 -2
- data/lib/unit_measurements/unit.rb +17 -7
- data/lib/unit_measurements/version.rb +1 -1
- data/lib/unit_measurements.rb +4 -0
- 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: 330be281aba063532010cf47f1e0065c35390510749002f368ff3139a22e6b5c
|
4
|
+
data.tar.gz: 26a8aa9db580205a117b11a8b653a5c609d1972be7b3eb76e2b91ec20f02b7be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d67ddc3a66baec5ce04878b046541dd7b9f3d8da65a18fcf84179f4178c467b3e2276f1a236e22caac9d170815d6529be842fdac2ac45aed79e48b32d136de7
|
7
|
+
data.tar.gz: 331afbfc4616fd9cbccf13ed6c3d01266ba6fd49e9fe4ae06c9f8ed311210a77381056d0037415b4fc4c48477a5fcda48d2d64397c8df3888bcacf1b965c79c8
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
## [1.2.0](https://github.com/shivam091/unit_measurements/compare/v1.1.0...v1.2.0) - 2023-08-15
|
2
|
+
|
3
|
+
### What's new
|
4
|
+
|
5
|
+
- Added support to specify unit value as an `array` of number and unit. viz.,
|
6
|
+
|
7
|
+
----------
|
8
|
+
|
9
|
+
## [1.1.0](https://github.com/shivam091/unit_measurements/compare/v1.0.0...v1.1.0) - 2023-08-14
|
10
|
+
|
11
|
+
### What's new
|
12
|
+
|
13
|
+
- Added `#format` method to format quantity of the measurement.
|
14
|
+
|
15
|
+
----------
|
16
|
+
|
1
17
|
## [1.0.0](https://github.com/shivam091/unit_measurements/compare/v0.1.0...v1.0.0) - 2023-09-14
|
2
18
|
|
3
19
|
### What's new
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -219,6 +219,20 @@ UnitMeasurements::Weight.parse("2e⁻² kg to g")
|
|
219
219
|
|
220
220
|
Supported special characters for exponents are `⁰`, `¹`, `²`, `³`, `⁴`, `⁵`, `⁶`, `⁷`, `⁸`, `⁹`, `⁺`, `⁻`.
|
221
221
|
|
222
|
+
**Formatting measurement:**
|
223
|
+
|
224
|
+
If you want to format measurement to certain format, you can use `#format` method.
|
225
|
+
If format is not specified, it defaults to `"%.2<value>f %<unit>s"`.
|
226
|
+
|
227
|
+
```ruby
|
228
|
+
UnitMeasurements::Weight.parse("2 kg").to(:st).format
|
229
|
+
#=> "0.31 st"
|
230
|
+
UnitMeasurements::Weight.parse("2 kg").to(:st).format("%.4<quantity>f %<unit>s")
|
231
|
+
#=> "0.3149 st"
|
232
|
+
UnitMeasurements::Weight.parse("2 kg").to(:st).format("%.4<quantity>f")
|
233
|
+
#=> "0.3149"
|
234
|
+
```
|
235
|
+
|
222
236
|
**Extract the unit and the quantity from measurement:**
|
223
237
|
|
224
238
|
```ruby
|
@@ -385,6 +399,9 @@ UnitMeasurements::Time = UnitMeasurements.build do
|
|
385
399
|
# You can also specify conversion string if it's converted against a unit other
|
386
400
|
# than the unit group's base unit.
|
387
401
|
unit :h, value: "60 min", aliases: [:hour, :hours]
|
402
|
+
|
403
|
+
# You can also specify unit value as an array.
|
404
|
+
unit :d, value: [24, :h], aliases: [:day, :days]
|
388
405
|
end
|
389
406
|
```
|
390
407
|
|
@@ -27,6 +27,7 @@ require "unit_measurements/unit"
|
|
27
27
|
require "unit_measurements/unit_group"
|
28
28
|
require "unit_measurements/normalizer"
|
29
29
|
require "unit_measurements/parser"
|
30
|
+
require "unit_measurements/formatter"
|
30
31
|
require "unit_measurements/measurement"
|
31
32
|
|
32
33
|
require "unit_measurements/errors/unit_error"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# -*- frozen_string_literal: true -*-
|
3
|
+
# -*- warn_indent: true -*-
|
4
|
+
|
5
|
+
module UnitMeasurements
|
6
|
+
module Formatter
|
7
|
+
# The default format for formatting measurements.
|
8
|
+
DEFAULT_FORMAT = "%.2<quantity>f %<unit>s".freeze
|
9
|
+
|
10
|
+
# Formats measurement to certain formatted string specified by +format+.
|
11
|
+
# If +format+ is not specified, it uses +DEFAULT_FORMAT+ for
|
12
|
+
# formatting the measurement
|
13
|
+
#
|
14
|
+
# @example
|
15
|
+
# UnitMeasurements::Weight.parse("2 kg").to(:st).format
|
16
|
+
# => "0.31 st"
|
17
|
+
# UnitMeasurements::Weight.parse("2 kg").to(:st).format("%.4<quantity>f %<unit>s")
|
18
|
+
# => "0.3149 st"
|
19
|
+
#
|
20
|
+
# @param [String] format
|
21
|
+
#
|
22
|
+
# @return [String]
|
23
|
+
def format(format = nil)
|
24
|
+
kwargs = {quantity: quantity, unit: unit.to_s}
|
25
|
+
(format || DEFAULT_FORMAT) % kwargs
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -4,13 +4,14 @@
|
|
4
4
|
|
5
5
|
module UnitMeasurements
|
6
6
|
class Measurement
|
7
|
+
include Formatter
|
7
8
|
CONVERSION_STRING_REGEXP = /(.+?)\s?(?:\s+(?:in|to|as)\s+(.+)|\z)/i.freeze
|
8
9
|
|
9
10
|
attr_reader :quantity, :unit
|
10
11
|
|
11
12
|
def initialize(quantity, unit)
|
12
|
-
raise
|
13
|
-
raise
|
13
|
+
raise BaseError, "Quantity cannot be blank." if quantity.blank?
|
14
|
+
raise BaseError, "Unit cannot be blank." if unit.blank?
|
14
15
|
|
15
16
|
@quantity = convert_quantity(quantity)
|
16
17
|
@unit = unit_from_unit_or_name!(unit)
|
@@ -38,13 +38,11 @@ module UnitMeasurements
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def conversion_factor
|
41
|
-
if value.is_a?(
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
value
|
47
|
-
end
|
41
|
+
return value if value.is_a?(Numeric)
|
42
|
+
|
43
|
+
measurement_value, measurement_unit = parse_value(value)
|
44
|
+
conversion_factor = unit_group.unit_for!(measurement_unit).conversion_factor
|
45
|
+
conversion_factor * measurement_value
|
48
46
|
end
|
49
47
|
|
50
48
|
private
|
@@ -75,5 +73,17 @@ module UnitMeasurements
|
|
75
73
|
["R", %w(ronna), 1e+27],
|
76
74
|
["Q", %w(quetta), 1e+30]
|
77
75
|
].map(&:freeze).freeze
|
76
|
+
|
77
|
+
def parse_value(tokens)
|
78
|
+
case tokens
|
79
|
+
when String
|
80
|
+
tokens = Parser.parse(value)
|
81
|
+
when Array
|
82
|
+
raise BaseError, "Cannot parse [number, unit] formatted tokens from #{tokens}." unless tokens.size == 2
|
83
|
+
else
|
84
|
+
raise BaseError, "Value of the unit must be defined as string or array, but received #{tokens}"
|
85
|
+
end
|
86
|
+
[tokens[0].to_r, tokens[1].freeze]
|
87
|
+
end
|
78
88
|
end
|
79
89
|
end
|
data/lib/unit_measurements.rb
CHANGED
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
|
+
version: 1.2.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-
|
11
|
+
date: 2023-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -107,6 +107,7 @@ files:
|
|
107
107
|
- lib/unit_measurements/errors/parse_error.rb
|
108
108
|
- lib/unit_measurements/errors/unit_already_defined_error.rb
|
109
109
|
- lib/unit_measurements/errors/unit_error.rb
|
110
|
+
- lib/unit_measurements/formatter.rb
|
110
111
|
- lib/unit_measurements/measurement.rb
|
111
112
|
- lib/unit_measurements/normalizer.rb
|
112
113
|
- lib/unit_measurements/parser.rb
|