ruby-measurement 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/CI.yml +30 -0
  3. data/CHANGELOG.md +25 -10
  4. data/README.md +13 -7
  5. data/lib/ruby-measurement/core_ext/string.rb +2 -2
  6. data/lib/ruby-measurement/core_ext/symbol.rb +1 -1
  7. data/lib/ruby-measurement/measurement.rb +101 -42
  8. data/lib/ruby-measurement/unit.rb +34 -28
  9. data/lib/ruby-measurement/version.rb +1 -1
  10. data/ruby-measurement.gemspec +5 -4
  11. data/spec/ruby-measurement/core_ext/numeric_spec.rb +2 -2
  12. data/spec/ruby-measurement/core_ext/string_spec.rb +12 -12
  13. data/spec/ruby-measurement/core_ext/symbol_spec.rb +3 -3
  14. data/spec/ruby-measurement/definitions/metric/area_spec.rb +32 -32
  15. data/spec/ruby-measurement/definitions/metric/capacity_spec.rb +18 -18
  16. data/spec/ruby-measurement/definitions/metric/length_spec.rb +128 -128
  17. data/spec/ruby-measurement/definitions/metric/volume_spec.rb +128 -128
  18. data/spec/ruby-measurement/definitions/metric/weight_spec.rb +160 -160
  19. data/spec/ruby-measurement/definitions/us_customary/area_spec.rb +72 -72
  20. data/spec/ruby-measurement/definitions/us_customary/capacity_spec.rb +32 -32
  21. data/spec/ruby-measurement/definitions/us_customary/length_spec.rb +128 -128
  22. data/spec/ruby-measurement/definitions/us_customary/volume_spec.rb +98 -98
  23. data/spec/ruby-measurement/definitions/us_customary/weight_spec.rb +72 -72
  24. data/spec/ruby-measurement/measurement_spec.rb +238 -164
  25. data/spec/ruby-measurement/unit_builder_spec.rb +35 -35
  26. data/spec/ruby-measurement/unit_spec.rb +84 -41
  27. data/tasks/rspec.rake +1 -1
  28. metadata +29 -25
  29. data/.travis.yml +0 -4
@@ -1,101 +1,101 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Measurement::Unit::Builder do
4
- subject { Measurement::Unit::Builder.new(name, &block) }
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.should include 'hr'
18
- unit.aliases.should include 'hrs'
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.should_not include 'hr'
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.should be_a Measurement::Unit
35
- subject.to_unit.name.should eq 'hour'
36
- subject.to_unit.aliases.should eq %w(hour).to_set
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.should_not include 'hr'
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.should eq aliases.size + 1
50
- subject.to_unit.aliases.should include 'hr'
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.should_not include 'hr'
57
- subject.to_unit.aliases.should_not include 'hrs'
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.should eq 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'].should be nil
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.should_not include 'hr'
82
+ expect(subject.to_unit.aliases).to_not include 'hr'
83
83
  subject.convert_to(:min, &conversion)
84
- subject.to_unit.conversions['min'].should eq conversion
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'].should_not be nil
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.should_not include 'hr'
96
+ expect(subject.to_unit.aliases).to_not include 'hr'
97
97
  subject.convert_to(:min, &conversion)
98
- subject.to_unit.conversions['min'].should eq conversion
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 { Measurement::Unit.new(name) }
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.should eq 'hour'
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.should eq %w(hour hr hrs).to_set
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.should eq %w(hour hr hrs).to_set
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'].should be conversion
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'].should be conversion
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.should eq %w(hour).to_set
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
- Measurement::Unit.define(:min)
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).should_not be_nil
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).should be_nil
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.should eq subject.name
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.should eq subject.name
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 = Measurement::Unit.new(:hour)
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
- #(subject == other).should be_true
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 = Measurement::Unit.new(:hoooour)
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).should be_false
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 = Measurement::Unit.new(:hour)
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).should be_false
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 = Measurement::Unit.new(:hour)
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).should be_false
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).should be_false
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
@@ -2,5 +2,5 @@ require 'rspec/core/rake_task'
2
2
 
3
3
  desc 'Run all examples'
4
4
  RSpec::Core::RakeTask.new(:spec) do |t|
5
- t.rspec_opts = %w(--color)
5
+ t.rspec_opts = %w(--force-color)
6
6
  end
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.2.0
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: 2013-03-16 00:00:00.000000000 Z
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: &2160834380 !ruby/object:Gem::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: *2160834380
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: &2160833960 !ruby/object:Gem::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: *2160833960
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
- - .gitignore
43
- - .travis.yml
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
- post_install_message:
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
- rubyforge_project:
110
- rubygems_version: 1.8.10
111
- signing_key:
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