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.
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