ruby-units 2.0.1 → 2.1.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.txt +3 -0
- data/README.md +48 -1
- data/{Rakefile.rb → Rakefile} +0 -0
- data/VERSION +1 -1
- data/lib/ruby_units/cache.rb +17 -16
- data/lib/ruby_units/configuration.rb +41 -0
- data/lib/ruby_units/date.rb +3 -3
- data/lib/ruby_units/definition.rb +22 -24
- data/lib/ruby_units/math.rb +30 -34
- data/lib/ruby_units/namespaced.rb +1 -0
- data/lib/ruby_units/string.rb +3 -4
- data/lib/ruby_units/time.rb +9 -10
- data/lib/ruby_units/unit.rb +778 -765
- data/lib/ruby_units/unit_definitions/base.rb +42 -45
- data/lib/ruby_units/unit_definitions/prefix.rb +30 -30
- data/lib/ruby_units/unit_definitions/standard.rb +138 -135
- data/lib/ruby_units/version.rb +1 -1
- data/ruby-units.gemspec +34 -27
- metadata +34 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e6acf899cc64a4b47d9bed66ea695ee59e3d26b
|
4
|
+
data.tar.gz: 6c04d8f9069b6944cb0ca0f32adf74a722b9036d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 594ca11e51bcd2090f715ff431059045ec981cf758f9b72771faa8978d1dee8ac3677dc4b78b3552dc9786ffa3c62ee7f377569213dd6b43b5245a4b8ffc3f36
|
7
|
+
data.tar.gz: 8ce5144320bb529a3b4c6eea632e17a424997f458a1efd18b4a6fa6ec5ceb9c7dd2fbf4f93ce349e528cb745327c118690518370cda3327aa3ecabb50b7c4e5d
|
data/CHANGELOG.txt
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
Change Log for Ruby-units
|
2
2
|
=========================
|
3
|
+
2016-12-28 2.1.0 * add support for ruby 2.4.0
|
4
|
+
* allow configuration for optional separator on output
|
5
|
+
* Fix issue #105 -- change 'grad' to 'gon'
|
3
6
|
2015-11-07 2.0.0 * remove support for ruby versions less than 2.0
|
4
7
|
* remove `.unit` and `.u` from String
|
5
8
|
* remove `.unit` from Date
|
data/README.md
CHANGED
@@ -118,6 +118,7 @@ Unit.new('1.5 mm').to_s("%0.2f") # "1.50 mm". Enter any valid format
|
|
118
118
|
Unit.new('1.5 mm').to_s("in") # converts to inches before printing
|
119
119
|
Unit.new("2 m").to_s(:ft) # returns 6'7"
|
120
120
|
Unit.new("100 kg").to_s(:lbs) # returns 220 lbs, 7 oz
|
121
|
+
Unit.new("100 kg").to_s(:stone) # returns 15 stone, 10 lb
|
121
122
|
```
|
122
123
|
|
123
124
|
Time Helpers
|
@@ -228,9 +229,21 @@ Unit.redefine!("cup") do |cup|
|
|
228
229
|
end
|
229
230
|
```
|
230
231
|
|
232
|
+
### Useful methods
|
233
|
+
|
234
|
+
1. `scalar` will return the numeric portion of the unit without the attached units
|
235
|
+
2. `base_scalar` will return the scalar in base units (SI)
|
236
|
+
3. `units` will return the name of the units (without the scalar)
|
237
|
+
4. `base` will return the unit converted to base units (SI)
|
238
|
+
|
239
|
+
### Storing in a database
|
240
|
+
|
241
|
+
Units can be stored in a database as either the string representation or in two separate columns defining the scalar and the units.
|
242
|
+
Note that if sorting by units is desired you will want to ensure that you are storing the scalars in a consistent unit (i.e, the base units).
|
243
|
+
|
231
244
|
### Namespaced Class
|
232
245
|
|
233
|
-
Sometimes the default class 'Unit' may conflict with other gems or applications. Internally ruby-units defines itself using the RubyUnits namespace. The actual class of a unit is the RubyUnits::Unit. For simplicity and backwards
|
246
|
+
Sometimes the default class 'Unit' may conflict with other gems or applications. Internally ruby-units defines itself using the RubyUnits namespace. The actual class of a unit is the RubyUnits::Unit. For simplicity and backwards compatibility, the '::Unit' class is defined as an alias to '::RubyUnits::Unit'.
|
234
247
|
|
235
248
|
To load ruby-units without this alias...
|
236
249
|
|
@@ -245,3 +258,37 @@ gem 'ruby-units', require: 'ruby_units/namespaced'
|
|
245
258
|
```
|
246
259
|
|
247
260
|
Note: when using the namespaced version, the Unit.new('unit string') helper will not be defined.
|
261
|
+
|
262
|
+
### Configuration
|
263
|
+
|
264
|
+
Configuration options can be set like:
|
265
|
+
|
266
|
+
```
|
267
|
+
RubyUnits.configure do |config|
|
268
|
+
config.separator = false
|
269
|
+
end
|
270
|
+
```
|
271
|
+
|
272
|
+
Currently there is only one configuration you can set:
|
273
|
+
|
274
|
+
1. separator (true/false): should a space be used to separate the scalar from the unit part during output.
|
275
|
+
|
276
|
+
|
277
|
+
### NOTES
|
278
|
+
|
279
|
+
#### Mathn
|
280
|
+
|
281
|
+
Note that the current implementation of ruby-units requires 'mathn' from the ruby standard library.
|
282
|
+
This tends to change the behavior of integer math in ways that many people do not expect, and can be the source
|
283
|
+
of numerous bugs and odd behaviors. If you encounter what appears to be a bug in your code that seems to be related
|
284
|
+
|
285
|
+
to the use of ruby-units, try to reproduce the bug by just including 'mathn' by itself.
|
286
|
+
|
287
|
+
If you identify a bug in a gem or code that uses mathn, please file a bug report or create a pull request to fix it.
|
288
|
+
|
289
|
+
#### Performance vs. Accuracy
|
290
|
+
|
291
|
+
Ruby units was originally intended to provide a robust and accurate way to do arbitrary unit conversions.
|
292
|
+
In some cases, these conversions can result in the creation and garbage collection of a lot of intermediate objects during
|
293
|
+
calculations. This in turn can have a negative impact on performance. The design of ruby-units has emphasized accuracy
|
294
|
+
over speed. YMMV if you are doing a lot of math involving units.
|
data/{Rakefile.rb → Rakefile}
RENAMED
File without changes
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0
|
1
|
+
2.1.0
|
data/lib/ruby_units/cache.rb
CHANGED
@@ -1,20 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
key
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
module RubyUnits
|
2
|
+
class Unit < Numeric
|
3
|
+
@@cached_units = {}
|
4
|
+
|
5
|
+
class Cache
|
6
|
+
def self.get(key = nil)
|
7
|
+
key.nil? ? @@cached_units : @@cached_units[key]
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.set(key, value)
|
11
|
+
@@cached_units[key] = value
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
def self.clear
|
15
|
+
@@cached_units = {}
|
16
|
+
@@base_unit_cache = {}
|
17
|
+
Unit.new(1)
|
18
|
+
end
|
17
19
|
end
|
18
|
-
|
19
20
|
end
|
20
21
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# allow for optional configuration of RubyUnits
|
2
|
+
#
|
3
|
+
# Usage:
|
4
|
+
#
|
5
|
+
# RubyUnits.configure do |config|
|
6
|
+
# config.separator = false
|
7
|
+
# end
|
8
|
+
module RubyUnits
|
9
|
+
class << self
|
10
|
+
attr_writer :configuration
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.configuration
|
14
|
+
@configuration ||= Configuration.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.reset
|
18
|
+
@configuration = Configuration.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.configure
|
22
|
+
yield configuration
|
23
|
+
end
|
24
|
+
|
25
|
+
# holds actual configuration values for RubyUnits
|
26
|
+
class Configuration
|
27
|
+
# used to separate the scalar from the unit when generating output.
|
28
|
+
# set to nil to prevent adding a space to the string representation of a unit
|
29
|
+
# separators other than ' ' and '' may work, but you may encounter problems
|
30
|
+
attr_reader :separator
|
31
|
+
|
32
|
+
def initialize
|
33
|
+
self.separator = true
|
34
|
+
end
|
35
|
+
|
36
|
+
def separator=(value)
|
37
|
+
raise ArgumentError, "configuration 'separator' may only be true or false" unless value.class == TrueClass || value.class == FalseClass
|
38
|
+
@separator = value ? ' ' : nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/ruby_units/date.rb
CHANGED
@@ -3,7 +3,7 @@ require 'date'
|
|
3
3
|
# Allow date objects to do offsets by a time unit
|
4
4
|
# Date.today + Unit.new("1 week") => gives today+1 week
|
5
5
|
class Date
|
6
|
-
|
6
|
+
alias unit_date_add +
|
7
7
|
# @param [Object] other
|
8
8
|
# @return [Unit]
|
9
9
|
def +(other)
|
@@ -16,7 +16,7 @@ class Date
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
alias unit_date_sub -
|
20
20
|
# @param [Object] other
|
21
21
|
# @return [Unit]
|
22
22
|
def -(other)
|
@@ -46,7 +46,7 @@ class Date
|
|
46
46
|
end
|
47
47
|
# :nocov_19:
|
48
48
|
|
49
|
-
|
49
|
+
alias units_datetime_inspect inspect
|
50
50
|
# @deprecated
|
51
51
|
def inspect(dump = false)
|
52
52
|
return units_datetime_inspect if dump
|
@@ -1,8 +1,6 @@
|
|
1
1
|
class RubyUnits::Unit < Numeric
|
2
|
-
|
3
2
|
# Handle the definition of units
|
4
3
|
class Definition
|
5
|
-
|
6
4
|
# @return [Array]
|
7
5
|
attr_writer :aliases
|
8
6
|
|
@@ -30,14 +28,14 @@ class RubyUnits::Unit < Numeric
|
|
30
28
|
# unit.definition = RubyUnits::Unit.new("7/4 inches")
|
31
29
|
# end
|
32
30
|
#
|
33
|
-
def initialize(
|
31
|
+
def initialize(name, definition = [])
|
34
32
|
yield self if block_given?
|
35
|
-
self.name ||=
|
36
|
-
@aliases ||= (
|
37
|
-
@scalar ||=
|
38
|
-
@kind ||=
|
39
|
-
@numerator ||=
|
40
|
-
@denominator ||=
|
33
|
+
self.name ||= name.gsub(/[<>]/, '')
|
34
|
+
@aliases ||= (definition[0] || [name])
|
35
|
+
@scalar ||= definition[1]
|
36
|
+
@kind ||= definition[2]
|
37
|
+
@numerator ||= definition[3] || RubyUnits::Unit::UNITY_ARRAY
|
38
|
+
@denominator ||= definition[4] || RubyUnits::Unit::UNITY_ARRAY
|
41
39
|
@display_name ||= @aliases.first
|
42
40
|
end
|
43
41
|
|
@@ -46,14 +44,14 @@ class RubyUnits::Unit < Numeric
|
|
46
44
|
# @return [String, nil]
|
47
45
|
# @todo refactor Unit and Unit::Definition so we don't need to wrap units with angle brackets
|
48
46
|
def name
|
49
|
-
"<#{@name}>" if
|
47
|
+
"<#{@name}>" if defined?(@name) && @name
|
50
48
|
end
|
51
49
|
|
52
50
|
# set the name, strip off '<' and '>'
|
53
51
|
# @param [String]
|
54
52
|
# @return [String]
|
55
|
-
def name=(
|
56
|
-
@name =
|
53
|
+
def name=(name_value)
|
54
|
+
@name = name_value.gsub(/[<>]/, '')
|
57
55
|
end
|
58
56
|
|
59
57
|
# alias array must contain the name of the unit and entries must be unique
|
@@ -66,35 +64,35 @@ class RubyUnits::Unit < Numeric
|
|
66
64
|
# @param [Unit] unit
|
67
65
|
# @return [Unit::Definition]
|
68
66
|
def definition=(unit)
|
69
|
-
|
70
|
-
@scalar
|
71
|
-
@kind
|
72
|
-
@numerator
|
73
|
-
@denominator
|
67
|
+
base = unit.to_base
|
68
|
+
@scalar = base.scalar
|
69
|
+
@kind = base.kind
|
70
|
+
@numerator = base.numerator
|
71
|
+
@denominator = base.denominator
|
74
72
|
self
|
75
73
|
end
|
76
74
|
|
77
75
|
# is this definition for a prefix?
|
78
76
|
# @return [Boolean]
|
79
77
|
def prefix?
|
80
|
-
|
78
|
+
kind == :prefix
|
81
79
|
end
|
82
80
|
|
83
81
|
# Is this definition the unity definition?
|
84
82
|
# @return [Boolean]
|
85
83
|
def unity?
|
86
|
-
|
84
|
+
prefix? && scalar == 1
|
87
85
|
end
|
88
86
|
|
89
87
|
# is this a base unit?
|
90
88
|
# units are base units if the scalar is one, and the unit is defined in terms of itself.
|
91
89
|
# @return [Boolean]
|
92
90
|
def base?
|
93
|
-
(
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
91
|
+
(denominator == RubyUnits::Unit::UNITY_ARRAY) &&
|
92
|
+
(numerator != RubyUnits::Unit::UNITY_ARRAY) &&
|
93
|
+
(numerator.size == 1) &&
|
94
|
+
(scalar == 1) &&
|
95
|
+
(numerator.first == self.name)
|
98
96
|
end
|
99
97
|
end
|
100
98
|
end
|
data/lib/ruby_units/math.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
require 'mathn'
|
2
2
|
|
3
|
-
# Math will convert unit objects to radians and then attempt to use the value for
|
4
|
-
# trigonometric functions.
|
3
|
+
# Math will convert unit objects to radians and then attempt to use the value for
|
4
|
+
# trigonometric functions.
|
5
5
|
module Math
|
6
|
-
|
7
|
-
alias :unit_sqrt :sqrt
|
6
|
+
alias unit_sqrt sqrt
|
8
7
|
# @return [Numeric]
|
9
8
|
def sqrt(n)
|
10
|
-
if RubyUnits::Unit
|
11
|
-
(n**
|
9
|
+
if n.is_a?(RubyUnits::Unit)
|
10
|
+
(n**Rational(1, 2)).to_unit
|
12
11
|
else
|
13
12
|
unit_sqrt(n)
|
14
13
|
end
|
@@ -19,12 +18,12 @@ module Math
|
|
19
18
|
module_function :sqrt
|
20
19
|
|
21
20
|
#:nocov:
|
22
|
-
if
|
23
|
-
alias
|
21
|
+
if respond_to?(:cbrt)
|
22
|
+
alias unit_cbrt cbrt
|
24
23
|
# @return [Numeric]
|
25
24
|
def cbrt(n)
|
26
25
|
if RubyUnits::Unit === n
|
27
|
-
(n**
|
26
|
+
(n**Rational(1, 3)).to_unit
|
28
27
|
else
|
29
28
|
unit_cbrt(n)
|
30
29
|
end
|
@@ -35,18 +34,18 @@ module Math
|
|
35
34
|
module_function :cbrt
|
36
35
|
end
|
37
36
|
#:nocov:
|
38
|
-
|
39
|
-
alias
|
37
|
+
|
38
|
+
alias unit_sin sin
|
40
39
|
# @return [Numeric]
|
41
40
|
def sin(n)
|
42
|
-
|
41
|
+
RubyUnits::Unit === n ? unit_sin(n.convert_to('radian').scalar) : unit_sin(n)
|
43
42
|
end
|
44
43
|
# @return [Numeric]
|
45
44
|
module_function :unit_sin
|
46
45
|
# @return [Numeric]
|
47
46
|
module_function :sin
|
48
47
|
|
49
|
-
alias
|
48
|
+
alias unit_cos cos
|
50
49
|
# @return [Numeric]
|
51
50
|
def cos(n)
|
52
51
|
RubyUnits::Unit === n ? unit_cos(n.convert_to('radian').scalar) : unit_cos(n)
|
@@ -55,8 +54,8 @@ module Math
|
|
55
54
|
module_function :unit_cos
|
56
55
|
# @return [Numeric]
|
57
56
|
module_function :cos
|
58
|
-
|
59
|
-
alias
|
57
|
+
|
58
|
+
alias unit_sinh sinh
|
60
59
|
# @return [Numeric]
|
61
60
|
def sinh(n)
|
62
61
|
RubyUnits::Unit === n ? unit_sinh(n.convert_to('radian').scalar) : unit_sinh(n)
|
@@ -66,7 +65,7 @@ module Math
|
|
66
65
|
# @return [Numeric]
|
67
66
|
module_function :sinh
|
68
67
|
|
69
|
-
alias
|
68
|
+
alias unit_cosh cosh
|
70
69
|
# @return [Numeric]
|
71
70
|
def cosh(n)
|
72
71
|
RubyUnits::Unit === n ? unit_cosh(n.convert_to('radian').scalar) : unit_cosh(n)
|
@@ -76,17 +75,17 @@ module Math
|
|
76
75
|
# @return [Numeric]
|
77
76
|
module_function :cosh
|
78
77
|
|
79
|
-
alias
|
78
|
+
alias unit_tan tan
|
80
79
|
# @return [Numeric]
|
81
80
|
def tan(n)
|
82
|
-
|
81
|
+
RubyUnits::Unit === n ? unit_tan(n.convert_to('radian').scalar) : unit_tan(n)
|
83
82
|
end
|
84
83
|
# @return [Numeric]
|
85
84
|
module_function :tan
|
86
85
|
# @return [Numeric]
|
87
86
|
module_function :unit_tan
|
88
87
|
|
89
|
-
alias
|
88
|
+
alias unit_tanh tanh
|
90
89
|
# @return [Numeric]
|
91
90
|
def tanh(n)
|
92
91
|
RubyUnits::Unit === n ? unit_tanh(n.convert_to('radian').scalar) : unit_tanh(n)
|
@@ -96,36 +95,33 @@ module Math
|
|
96
95
|
# @return [Numeric]
|
97
96
|
module_function :tanh
|
98
97
|
|
99
|
-
alias
|
98
|
+
alias unit_hypot hypot
|
100
99
|
# Convert parameters to consistent units and perform the function
|
101
100
|
# @return [Numeric]
|
102
|
-
def hypot(x,y)
|
101
|
+
def hypot(x, y)
|
103
102
|
if RubyUnits::Unit === x && RubyUnits::Unit === y
|
104
|
-
(x**2 + y**2)**(1/2)
|
103
|
+
(x**2 + y**2)**(1 / 2)
|
105
104
|
else
|
106
|
-
unit_hypot(x,y)
|
105
|
+
unit_hypot(x, y)
|
107
106
|
end
|
108
107
|
end
|
109
108
|
# @return [Numeric]
|
110
109
|
module_function :unit_hypot
|
111
110
|
# @return [Numeric]
|
112
111
|
module_function :hypot
|
113
|
-
|
114
|
-
alias
|
115
|
-
# @return [Numeric]
|
116
|
-
def atan2(x,y)
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
when (x.is_a?(RubyUnits::Unit) && y.is_a?(RubyUnits::Unit)) && (x =~ y)
|
121
|
-
Math::unit_atan2(x.base_scalar, y.base_scalar)
|
112
|
+
|
113
|
+
alias unit_atan2 atan2
|
114
|
+
# @return [Numeric]
|
115
|
+
def atan2(x, y)
|
116
|
+
raise ArgumentError, 'Incompatible RubyUnits::Units' if (x.is_a?(RubyUnits::Unit) && y.is_a?(RubyUnits::Unit)) && !x.compatible?(y)
|
117
|
+
if (x.is_a?(RubyUnits::Unit) && y.is_a?(RubyUnits::Unit)) && x.compatible?(y)
|
118
|
+
Math.unit_atan2(x.base_scalar, y.base_scalar)
|
122
119
|
else
|
123
|
-
Math
|
120
|
+
Math.unit_atan2(x, y)
|
124
121
|
end
|
125
122
|
end
|
126
123
|
# @return [Numeric]
|
127
124
|
module_function :unit_atan2
|
128
125
|
# @return [Numeric]
|
129
126
|
module_function :atan2
|
130
|
-
|
131
127
|
end
|
@@ -3,6 +3,7 @@ $LOAD_PATH << File.dirname(__FILE__)
|
|
3
3
|
|
4
4
|
# require_relative this file to avoid creating an class alias from Unit to RubyUnits::Unit
|
5
5
|
require_relative 'version'
|
6
|
+
require_relative 'configuration'
|
6
7
|
require_relative 'definition'
|
7
8
|
require_relative 'cache'
|
8
9
|
require_relative 'array'
|
data/lib/ruby_units/string.rb
CHANGED
@@ -6,19 +6,18 @@ class String
|
|
6
6
|
other ? RubyUnits::Unit.new(self).convert_to(other) : RubyUnits::Unit.new(self)
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
alias original_format %
|
10
10
|
# format unit output using formating codes
|
11
11
|
# @example '%0.2f' % '1 mm'.to_unit => '1.00 mm'
|
12
12
|
# @return [String]
|
13
13
|
def format_with_unit(*other)
|
14
|
-
|
15
|
-
when other.first.is_a?(RubyUnits::Unit)
|
14
|
+
if other.first.is_a?(RubyUnits::Unit)
|
16
15
|
other.first.to_s(self)
|
17
16
|
else
|
18
17
|
original_format(*other)
|
19
18
|
end
|
20
19
|
end
|
21
|
-
|
20
|
+
alias % format_with_unit
|
22
21
|
|
23
22
|
# @param (see RubyUnits::Unit#convert_to)
|
24
23
|
# @return (see RubyUnits::Unit#convert_to)
|
data/lib/ruby_units/time.rb
CHANGED
@@ -5,7 +5,6 @@ require 'time'
|
|
5
5
|
# is in years, decades, or centuries. This leads to less precise values, but ones that match the
|
6
6
|
# calendar better.
|
7
7
|
class Time
|
8
|
-
|
9
8
|
class << self
|
10
9
|
alias unit_time_at at
|
11
10
|
end
|
@@ -15,15 +14,15 @@ class Time
|
|
15
14
|
# @param [Time] arg
|
16
15
|
# @param [Integer] ms
|
17
16
|
# @return [RubyUnits::Unit, Time]
|
18
|
-
def self.at(arg, ms=nil)
|
17
|
+
def self.at(arg, ms = nil)
|
19
18
|
case arg
|
20
19
|
when Time
|
21
20
|
unit_time_at(arg)
|
22
21
|
when RubyUnits::Unit
|
23
22
|
if ms
|
24
|
-
unit_time_at(arg.convert_to(
|
23
|
+
unit_time_at(arg.convert_to('s').scalar, ms)
|
25
24
|
else
|
26
|
-
unit_time_at(arg.convert_to(
|
25
|
+
unit_time_at(arg.convert_to('s').scalar)
|
27
26
|
end
|
28
27
|
else
|
29
28
|
ms.nil? ? unit_time_at(arg) : unit_time_at(arg, ms)
|
@@ -41,16 +40,16 @@ class Time
|
|
41
40
|
# :nocov_19:
|
42
41
|
end
|
43
42
|
|
44
|
-
alias
|
43
|
+
alias unit_add +
|
45
44
|
# @return [RubyUnits::Unit, Time]
|
46
45
|
def +(other)
|
47
46
|
case other
|
48
47
|
when RubyUnits::Unit
|
49
|
-
other = other.convert_to('d').round.convert_to('s') if
|
48
|
+
other = other.convert_to('d').round.convert_to('s') if %w(y decade century).include? other.units
|
50
49
|
begin
|
51
50
|
unit_add(other.convert_to('s').scalar)
|
52
51
|
rescue RangeError
|
53
|
-
|
52
|
+
to_datetime + other
|
54
53
|
end
|
55
54
|
else
|
56
55
|
unit_add(other)
|
@@ -64,17 +63,17 @@ class Time
|
|
64
63
|
Time.now + duration.to_unit
|
65
64
|
end
|
66
65
|
|
67
|
-
alias
|
66
|
+
alias unit_sub -
|
68
67
|
|
69
68
|
# @return [RubyUnits::Unit, Time]
|
70
69
|
def -(other)
|
71
70
|
case other
|
72
71
|
when RubyUnits::Unit
|
73
|
-
other = other.convert_to('d').round.convert_to('s') if
|
72
|
+
other = other.convert_to('d').round.convert_to('s') if %w(y decade century).include? other.units
|
74
73
|
begin
|
75
74
|
unit_sub(other.convert_to('s').scalar)
|
76
75
|
rescue RangeError
|
77
|
-
|
76
|
+
send(:to_datetime) - other
|
78
77
|
end
|
79
78
|
else
|
80
79
|
unit_sub(other)
|