ruby-measurement 1.2.0 → 1.3.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 +7 -0
- data/.github/workflows/CI.yml +30 -0
- data/CHANGELOG.md +25 -10
- data/README.md +13 -7
- data/lib/ruby-measurement/core_ext/string.rb +2 -2
- data/lib/ruby-measurement/core_ext/symbol.rb +1 -1
- data/lib/ruby-measurement/measurement.rb +101 -42
- data/lib/ruby-measurement/unit.rb +34 -28
- data/lib/ruby-measurement/version.rb +1 -1
- data/ruby-measurement.gemspec +5 -4
- data/spec/ruby-measurement/core_ext/numeric_spec.rb +2 -2
- data/spec/ruby-measurement/core_ext/string_spec.rb +12 -12
- data/spec/ruby-measurement/core_ext/symbol_spec.rb +3 -3
- data/spec/ruby-measurement/definitions/metric/area_spec.rb +32 -32
- data/spec/ruby-measurement/definitions/metric/capacity_spec.rb +18 -18
- data/spec/ruby-measurement/definitions/metric/length_spec.rb +128 -128
- data/spec/ruby-measurement/definitions/metric/volume_spec.rb +128 -128
- data/spec/ruby-measurement/definitions/metric/weight_spec.rb +160 -160
- data/spec/ruby-measurement/definitions/us_customary/area_spec.rb +72 -72
- data/spec/ruby-measurement/definitions/us_customary/capacity_spec.rb +32 -32
- data/spec/ruby-measurement/definitions/us_customary/length_spec.rb +128 -128
- data/spec/ruby-measurement/definitions/us_customary/volume_spec.rb +98 -98
- data/spec/ruby-measurement/definitions/us_customary/weight_spec.rb +72 -72
- data/spec/ruby-measurement/measurement_spec.rb +238 -164
- data/spec/ruby-measurement/unit_builder_spec.rb +35 -35
- data/spec/ruby-measurement/unit_spec.rb +84 -41
- data/tasks/rspec.rake +1 -1
- metadata +29 -25
- data/.travis.yml +0 -4
@@ -1,101 +1,101 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Measurement::Unit::Builder do
|
4
|
-
subject {
|
5
|
-
|
3
|
+
RSpec.describe Measurement::Unit::Builder do
|
4
|
+
subject { described_class.new(name, &block) }
|
5
|
+
|
6
6
|
let(:name) { :hour }
|
7
7
|
let(:block) { proc {} }
|
8
|
-
|
8
|
+
|
9
9
|
describe '.new' do
|
10
10
|
describe 'with a block' do
|
11
11
|
let(:block) do
|
12
12
|
proc { |unit| unit.alias :hr, :hrs }
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
it 'should evaluate the block' do
|
16
16
|
unit = subject.to_unit
|
17
|
-
unit.aliases.
|
18
|
-
unit.aliases.
|
17
|
+
expect(unit.aliases).to include 'hr'
|
18
|
+
expect(unit.aliases).to include 'hrs'
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
describe 'without a block' do
|
23
23
|
let(:block) { nil }
|
24
|
-
|
24
|
+
|
25
25
|
it 'should not evaluate the block' do
|
26
26
|
unit = subject.to_unit
|
27
|
-
unit.aliases.
|
27
|
+
expect(unit.aliases).to_not include 'hr'
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
describe '#to_unit' do
|
33
33
|
it 'should return a matching unit' do
|
34
|
-
subject.to_unit.
|
35
|
-
subject.to_unit.name.
|
36
|
-
subject.to_unit.aliases.
|
34
|
+
expect(subject.to_unit).to be_a Measurement::Unit
|
35
|
+
expect(subject.to_unit.name).to eq 'hour'
|
36
|
+
expect(subject.to_unit.aliases).to eq %w(hour).to_set
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
describe '#alias' do
|
41
41
|
describe 'with a new alias' do
|
42
42
|
before do
|
43
|
-
subject.to_unit.aliases.
|
43
|
+
expect(subject.to_unit.aliases).to_not include 'hr'
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
it 'should append the new alias' do
|
47
47
|
aliases = subject.to_unit.aliases.dup
|
48
48
|
subject.alias :hr
|
49
|
-
subject.to_unit.aliases.size.
|
50
|
-
subject.to_unit.aliases.
|
49
|
+
expect(subject.to_unit.aliases.size).to eq aliases.size + 1
|
50
|
+
expect(subject.to_unit.aliases).to include 'hr'
|
51
51
|
end
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
describe 'with multiple new aliases' do
|
55
55
|
before do
|
56
|
-
subject.to_unit.aliases.
|
57
|
-
subject.to_unit.aliases.
|
56
|
+
expect(subject.to_unit.aliases).to_not include 'hr'
|
57
|
+
expect(subject.to_unit.aliases).to_not include 'hrs'
|
58
58
|
end
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
describe 'with an existing alias' do
|
62
62
|
before do
|
63
63
|
subject.alias :hour
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
it 'should not affect the list of aliases' do
|
67
67
|
aliases = subject.to_unit.aliases.dup
|
68
68
|
subject.alias :hour
|
69
|
-
subject.to_unit.aliases.
|
69
|
+
expect(subject.to_unit.aliases).to eq aliases
|
70
70
|
end
|
71
71
|
end
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
describe '#convert_to' do
|
75
75
|
describe 'with a new target alias' do
|
76
76
|
before do
|
77
|
-
subject.to_unit.conversions['min'].
|
77
|
+
expect(subject.to_unit.conversions['min']).to be_nil
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
it 'should add the conversion' do
|
81
81
|
conversion = proc { |value| value * 60.0 }
|
82
|
-
subject.to_unit.aliases.
|
82
|
+
expect(subject.to_unit.aliases).to_not include 'hr'
|
83
83
|
subject.convert_to(:min, &conversion)
|
84
|
-
subject.to_unit.conversions['min'].
|
84
|
+
expect(subject.to_unit.conversions['min']).to eq conversion
|
85
85
|
end
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
describe 'with an existing target alias' do
|
89
89
|
before do
|
90
90
|
subject.convert_to(:min) { |value| value + 3 }
|
91
|
-
subject.to_unit.conversions['min'].
|
91
|
+
expect(subject.to_unit.conversions['min']).to_not be_nil
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
it 'should replace the conversion' do
|
95
95
|
conversion = proc { |value| value * 60.0 }
|
96
|
-
subject.to_unit.aliases.
|
96
|
+
expect(subject.to_unit.aliases).to_not include 'hr'
|
97
97
|
subject.convert_to(:min, &conversion)
|
98
|
-
subject.to_unit.conversions['min'].
|
98
|
+
expect(subject.to_unit.conversions['min']).to eq conversion
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
@@ -1,119 +1,162 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Measurement::Unit do
|
4
|
-
subject {
|
5
|
-
|
3
|
+
RSpec.describe Measurement::Unit do
|
4
|
+
subject { described_class.new(name) }
|
5
|
+
|
6
6
|
let(:name) { :hour }
|
7
|
-
|
7
|
+
|
8
8
|
describe '#name' do
|
9
9
|
it 'returns the name' do
|
10
|
-
subject.name.
|
10
|
+
expect(subject.name).to eq 'hour'
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
describe '#add_alias' do
|
15
15
|
it 'adds new aliases' do
|
16
16
|
subject.add_alias :hr, :hrs
|
17
|
-
subject.aliases.
|
17
|
+
expect(subject.aliases).to eq %w(hour hr hrs).to_set
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
it 'does not add aliases that already exist' do
|
21
21
|
subject.add_alias :hr, :hrs
|
22
22
|
expect { subject.add_alias :hr, :hrs }.to_not raise_error
|
23
|
-
subject.aliases.
|
23
|
+
expect(subject.aliases).to eq %w(hour hr hrs).to_set
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
describe '#add_conversion' do
|
28
28
|
before do
|
29
29
|
subject.add_conversion(:sec) { |value| value * 3600.0 }
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
it 'adds new conversions' do
|
33
33
|
conversion = proc { |value| value * 60.0 }
|
34
34
|
subject.add_conversion(:min, &conversion)
|
35
|
-
subject.conversions['min'].
|
35
|
+
expect(subject.conversions['min']).to be conversion
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
it 'replaces existing conversions' do
|
39
39
|
conversion = proc { |value| value * 60.0 }
|
40
40
|
subject.add_conversion(:sec, &conversion)
|
41
|
-
subject.conversions['sec'].
|
41
|
+
expect(subject.conversions['sec']).to be conversion
|
42
42
|
end
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
describe '#aliases' do
|
46
46
|
it 'returns the set of aliases' do
|
47
|
-
subject.aliases.
|
47
|
+
expect(subject.aliases).to eq %w(hour).to_set
|
48
48
|
end
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
describe '#conversion' do
|
52
52
|
before do
|
53
|
-
|
53
|
+
described_class.define(:min)
|
54
54
|
subject.add_conversion(:min) { |value| value * 60.0 }
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
it 'returns conversion if it exists' do
|
58
|
-
subject.conversion(:min).
|
58
|
+
expect(subject.conversion(:min)).to_not be_nil
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
it 'returns nil if it does not exist' do
|
62
|
-
subject.conversion(:sec).
|
62
|
+
expect(subject.conversion(:sec)).to be_nil
|
63
63
|
end
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
describe '#inspect' do
|
67
67
|
it 'returns name' do
|
68
|
-
subject.inspect.
|
68
|
+
expect(subject.inspect).to eq subject.name
|
69
69
|
end
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
describe '#to_s' do
|
73
73
|
it 'returns name' do
|
74
|
-
subject.inspect.
|
74
|
+
expect(subject.inspect).to eq subject.name
|
75
75
|
end
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
describe '#==' do
|
79
79
|
before do
|
80
80
|
subject.add_alias(:hours, :hr, :hrs)
|
81
81
|
subject.add_conversion(:min) { |value| value * 60.0 }
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
describe 'other object is a Unit' do
|
85
85
|
it 'returns true when name, aliases, and conversions match' do
|
86
|
-
other =
|
86
|
+
other = described_class.new(:hour)
|
87
87
|
other.add_alias(:hours, :hr, :hrs)
|
88
88
|
other.add_conversion(:min) { |value| value * 60.0 }
|
89
|
-
|
89
|
+
expect(subject == other).to be true
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
92
|
it "returns false when the name doesn't match" do
|
93
|
-
other =
|
93
|
+
other = described_class.new(:hoooour)
|
94
94
|
other.add_alias(:hours, :hr, :hrs)
|
95
95
|
other.add_conversion(:min) { |value| value * 60.0 }
|
96
|
-
(subject == other).
|
96
|
+
expect(subject == other).to be false
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
it "returns false when the aliases don't match" do
|
100
|
-
other =
|
100
|
+
other = described_class.new(:hour)
|
101
101
|
other.add_alias(:hoooours, :hr, :hrs)
|
102
102
|
other.add_conversion(:min) { |value| value * 60.0 }
|
103
|
-
(subject == other).
|
103
|
+
expect(subject == other).to be false
|
104
104
|
end
|
105
|
-
|
105
|
+
|
106
106
|
it "returns false when the conversions don't match" do
|
107
|
-
other =
|
107
|
+
other = described_class.new(:hour)
|
108
108
|
other.add_alias(:hours, :hr, :hrs)
|
109
109
|
other.add_conversion(:min) { |value| value * 60000.0 }
|
110
|
-
(subject == other).
|
110
|
+
expect(subject == other).to be false
|
111
111
|
end
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
describe 'other object is not a Unit' do
|
115
115
|
it 'returns false' do
|
116
|
-
(subject == :hour).
|
116
|
+
expect(subject == :hour).to be false
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe '.names' do
|
122
|
+
subject { described_class }
|
123
|
+
|
124
|
+
it 'returns all defined unit names' do
|
125
|
+
unit_names = subject.names
|
126
|
+
expect(unit_names).to be_an Array
|
127
|
+
expect(unit_names).to include 'count'
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '.define' do
|
132
|
+
subject { described_class }
|
133
|
+
|
134
|
+
it 'returns a unit builder' do
|
135
|
+
builder = subject.define(:count)
|
136
|
+
expect(builder).to be_a Measurement::Unit::Builder
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'accepts a block' do
|
140
|
+
builder = subject.define(:count) { |b| b.alias :ct }
|
141
|
+
expect(builder).to be_a Measurement::Unit::Builder
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
describe '.[]' do
|
146
|
+
subject { described_class }
|
147
|
+
|
148
|
+
describe 'for a unit name that is defined' do
|
149
|
+
it 'returns the unit' do
|
150
|
+
unit = subject[:dozen]
|
151
|
+
expect(unit).to be_a described_class
|
152
|
+
expect(unit.name).to eq 'doz'
|
153
|
+
expect(unit.aliases).to eq %w(doz dozen).to_set
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
describe 'for a unit name that is not defined' do
|
158
|
+
it 'returns nil' do
|
159
|
+
expect(subject[:potato]).to be nil
|
117
160
|
end
|
118
161
|
end
|
119
162
|
end
|
data/tasks/rspec.rake
CHANGED
metadata
CHANGED
@@ -1,46 +1,51 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-measurement
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Matt Huggins
|
9
|
-
autorequire:
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2021-08-01 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
25
27
|
- !ruby/object:Gem::Dependency
|
26
28
|
name: rspec
|
27
|
-
requirement:
|
28
|
-
none: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
|
-
- -
|
31
|
+
- - "~>"
|
31
32
|
- !ruby/object:Gem::Version
|
32
|
-
version: '0'
|
33
|
+
version: '3.0'
|
33
34
|
type: :development
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
36
41
|
description: Simple gem for calculating and converting measurements
|
37
42
|
email: matt.huggins@gmail.com
|
38
43
|
executables: []
|
39
44
|
extensions: []
|
40
45
|
extra_rdoc_files: []
|
41
46
|
files:
|
42
|
-
- .
|
43
|
-
- .
|
47
|
+
- ".github/workflows/CI.yml"
|
48
|
+
- ".gitignore"
|
44
49
|
- CHANGELOG.md
|
45
50
|
- Gemfile
|
46
51
|
- LICENSE.txt
|
@@ -88,28 +93,27 @@ files:
|
|
88
93
|
- tasks/debug.rake
|
89
94
|
- tasks/rspec.rake
|
90
95
|
homepage: https://github.com/mhuggins/ruby-measurement
|
91
|
-
licenses:
|
92
|
-
|
96
|
+
licenses:
|
97
|
+
- MIT
|
98
|
+
metadata: {}
|
99
|
+
post_install_message:
|
93
100
|
rdoc_options: []
|
94
101
|
require_paths:
|
95
102
|
- lib
|
96
103
|
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
104
|
requirements:
|
99
|
-
- -
|
105
|
+
- - ">="
|
100
106
|
- !ruby/object:Gem::Version
|
101
107
|
version: '0'
|
102
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
|
-
none: false
|
104
109
|
requirements:
|
105
|
-
- -
|
110
|
+
- - ">="
|
106
111
|
- !ruby/object:Gem::Version
|
107
112
|
version: '0'
|
108
113
|
requirements: []
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
specification_version: 3
|
114
|
+
rubygems_version: 3.2.3
|
115
|
+
signing_key:
|
116
|
+
specification_version: 4
|
113
117
|
summary: Simple gem for calculating and converting measurements
|
114
118
|
test_files:
|
115
119
|
- spec/ruby-measurement/core_ext/numeric_spec.rb
|