ruby-measurement 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. data/.travis.yml +4 -0
  2. data/CHANGELOG.md +21 -0
  3. data/README.md +2 -0
  4. data/Rakefile +3 -0
  5. data/lib/ruby-measurement/definitions/metric.rb +1 -0
  6. data/lib/ruby-measurement/definitions/metric/capacity.rb +12 -82
  7. data/lib/ruby-measurement/definitions/metric/volume.rb +82 -12
  8. data/lib/ruby-measurement/definitions/us_customary.rb +1 -0
  9. data/lib/ruby-measurement/definitions/us_customary/capacity.rb +29 -0
  10. data/lib/ruby-measurement/definitions/us_customary/length.rb +0 -20
  11. data/lib/ruby-measurement/definitions/us_customary/weight.rb +6 -6
  12. data/lib/ruby-measurement/measurement.rb +5 -14
  13. data/lib/ruby-measurement/unit.rb +52 -11
  14. data/lib/ruby-measurement/version.rb +1 -1
  15. data/ruby-measurement.gemspec +1 -0
  16. data/spec/ruby-measurement/definitions/metric/area_spec.rb +69 -0
  17. data/spec/ruby-measurement/definitions/metric/capacity_spec.rb +41 -0
  18. data/spec/ruby-measurement/definitions/metric/length_spec.rb +261 -0
  19. data/spec/ruby-measurement/definitions/metric/volume_spec.rb +261 -0
  20. data/spec/ruby-measurement/definitions/metric/weight_spec.rb +325 -0
  21. data/spec/ruby-measurement/definitions/us_customary/area_spec.rb +149 -0
  22. data/spec/ruby-measurement/definitions/us_customary/capacity_spec.rb +69 -0
  23. data/spec/ruby-measurement/definitions/us_customary/length_spec.rb +261 -0
  24. data/spec/ruby-measurement/definitions/us_customary/volume_spec.rb +201 -0
  25. data/spec/ruby-measurement/definitions/us_customary/weight_spec.rb +149 -0
  26. data/spec/ruby-measurement/measurement_spec.rb +342 -0
  27. data/spec/ruby-measurement/unit_builder_spec.rb +102 -0
  28. data/spec/ruby-measurement/unit_spec.rb +120 -0
  29. data/spec/spec_helper.rb +5 -0
  30. data/tasks/rspec.rake +6 -0
  31. metadata +48 -5
@@ -4,28 +4,36 @@ class Measurement
4
4
  class Unit
5
5
  attr_reader :name, :aliases, :conversions
6
6
 
7
- def initialize(name, &block)
7
+ @definitions = {}
8
+
9
+ def initialize(name)
8
10
  @name = name.to_s
9
11
  @aliases = Set.new
10
12
  @conversions = {}
11
-
12
- self.alias(name)
13
- block.call(self) if block_given?
13
+ add_alias(name)
14
14
  end
15
15
 
16
- def alias(*args)
17
- args.each { |arg| @aliases << arg.to_s }
16
+ def add_alias(*args)
17
+ args.each do |unit_alias|
18
+ @aliases << unit_alias.to_s
19
+ self.class[unit_alias] = self
20
+ end
18
21
  end
19
22
 
20
- def convert_to(name, &block)
21
- @conversions[name.to_s] = block
23
+ def add_conversion(unit_name, &block)
24
+ @conversions[unit_name.to_s] = block
22
25
  end
23
26
 
24
- def conversion(name)
25
- Measurement.unit(name).aliases.each do |a|
26
- conversion = @conversions[a.to_s]
27
+ def conversion(unit_name)
28
+ unit = self.class[unit_name]
29
+ return nil unless unit
30
+
31
+ unit.aliases.each do |unit_alias|
32
+ conversion = @conversions[unit_alias.to_s]
27
33
  return conversion if conversion
28
34
  end
35
+
36
+ nil
29
37
  end
30
38
 
31
39
  def inspect
@@ -39,5 +47,38 @@ class Measurement
39
47
  def ==(obj)
40
48
  obj.kind_of?(self.class) && hash == obj.hash
41
49
  end
50
+
51
+ def self.define(unit_name, &block)
52
+ Builder.new(unit_name, &block)
53
+ end
54
+
55
+ def self.[](unit_name)
56
+ @definitions[unit_name.to_s.downcase]
57
+ end
58
+
59
+ private
60
+
61
+ def self.[]=(unit_name, unit)
62
+ @definitions[unit_name.to_s.downcase] = unit
63
+ end
64
+
65
+ class Builder
66
+ def initialize(unit_name, &block)
67
+ @unit = Unit.new(unit_name)
68
+ block.call(self) if block_given?
69
+ end
70
+
71
+ def alias(*args)
72
+ @unit.add_alias(*args)
73
+ end
74
+
75
+ def convert_to(unit_name, &block)
76
+ @unit.add_conversion(unit_name, &block)
77
+ end
78
+
79
+ def to_unit
80
+ @unit
81
+ end
82
+ end
42
83
  end
43
84
  end
@@ -1,3 +1,3 @@
1
1
  class Measurement
2
- VERSION = '1.0.0'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -18,4 +18,5 @@ Gem::Specification.new do |gem|
18
18
  gem.require_path = 'lib'
19
19
 
20
20
  gem.add_development_dependency 'rake'
21
+ gem.add_development_dependency 'rspec'
21
22
  end
@@ -0,0 +1,69 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Measurement do
6
+ describe 'square kilometers' do
7
+ subject { Measurement.parse('10 km²') }
8
+
9
+ it 'converts to hectares' do
10
+ subject.convert_to(:ha).quantity.should eq 1_000
11
+ end
12
+
13
+ it 'converts to ares' do
14
+ subject.convert_to(:a).quantity.should eq 100_000
15
+ end
16
+
17
+ it 'converts to square centimeters' do
18
+ subject.convert_to(:cm2).quantity.should eq 100_000_000_000
19
+ end
20
+ end
21
+
22
+ describe 'hectares' do
23
+ subject { Measurement.parse('10 ha') }
24
+
25
+ it 'converts to square kilometers' do
26
+ subject.convert_to(:km2).quantity.should eq 0.1
27
+ end
28
+
29
+ it 'converts to ares' do
30
+ subject.convert_to(:a).quantity.should eq 1_000
31
+ end
32
+
33
+ it 'converts to square centimeters' do
34
+ subject.convert_to(:cm2).quantity.should eq 1_000_000_000
35
+ end
36
+ end
37
+
38
+ describe 'ares' do
39
+ subject { Measurement.parse('1000 a') }
40
+
41
+ it 'converts to square kilometers' do
42
+ subject.convert_to(:km2).quantity.should eq 0.1
43
+ end
44
+
45
+ it 'converts to hectares' do
46
+ subject.convert_to(:ha).quantity.should eq 10
47
+ end
48
+
49
+ it 'converts to square centimeters' do
50
+ subject.convert_to(:cm2).quantity.should eq 1_000_000_000
51
+ end
52
+ end
53
+
54
+ describe 'square centimeters' do
55
+ subject { Measurement.parse('10000000000 cm²') }
56
+
57
+ it 'converts to square kilometers' do
58
+ subject.convert_to(:km2).quantity.should eq 1
59
+ end
60
+
61
+ it 'converts to hectares' do
62
+ subject.convert_to(:ha).quantity.should eq 100
63
+ end
64
+
65
+ it 'converts to ares' do
66
+ subject.convert_to(:a).quantity.should eq 10_000
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Measurement do
6
+ describe 'cubic meters' do
7
+ subject { Measurement.parse('1 m³') }
8
+
9
+ it 'converts to cubic decimeters' do
10
+ subject.convert_to(:dm3).quantity.should eq 1_000
11
+ end
12
+
13
+ it 'converts to cubic centimeters' do
14
+ subject.convert_to(:cm3).quantity.should eq 1_000_000
15
+ end
16
+ end
17
+
18
+ describe 'cubic decimeters' do
19
+ subject { Measurement.parse('1000 dm³') }
20
+
21
+ it 'converts to cubic meters' do
22
+ subject.convert_to(:m3).quantity.should eq 1
23
+ end
24
+
25
+ it 'converts to cubic centimeters' do
26
+ subject.convert_to(:cm3).quantity.should eq 1_000_000
27
+ end
28
+ end
29
+
30
+ describe 'cubic centimeters' do
31
+ subject { Measurement.parse('1000000 cm³') }
32
+
33
+ it 'converts to cubic meters' do
34
+ subject.convert_to(:m3).quantity.should eq 1
35
+ end
36
+
37
+ it 'converts to cubic decimeters' do
38
+ subject.convert_to(:dm3).quantity.should eq 1_000
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,261 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Measurement do
6
+ describe 'kilometers' do
7
+ subject { Measurement.parse('1 km') }
8
+
9
+ it 'converts to hectometers' do
10
+ subject.convert_to(:hm).quantity.should eq 10
11
+ end
12
+
13
+ it 'converts to dekameters' do
14
+ subject.convert_to(:dam).quantity.should eq 100
15
+ end
16
+
17
+ it 'converts to meters' do
18
+ subject.convert_to(:m).quantity.should eq 1_000
19
+ end
20
+
21
+ it 'converts to decimeters' do
22
+ subject.convert_to(:dm).quantity.should eq 10_000
23
+ end
24
+
25
+ it 'converts to centimeters' do
26
+ subject.convert_to(:cm).quantity.should eq 100_000
27
+ end
28
+
29
+ it 'converts to millimeters' do
30
+ subject.convert_to(:mm).quantity.should eq 1_000_000
31
+ end
32
+
33
+ it 'converts to micrometers' do
34
+ subject.convert_to(:µm).quantity.should eq 10_000_000
35
+ end
36
+ end
37
+
38
+ describe 'hectometers' do
39
+ subject { Measurement.parse('10 hm') }
40
+
41
+ it 'converts to kilometers' do
42
+ subject.convert_to(:km).quantity.should eq 1
43
+ end
44
+
45
+ it 'converts to dekameters' do
46
+ subject.convert_to(:dam).quantity.should eq 100
47
+ end
48
+
49
+ it 'converts to meters' do
50
+ subject.convert_to(:m).quantity.should eq 1_000
51
+ end
52
+
53
+ it 'converts to decimeters' do
54
+ subject.convert_to(:dm).quantity.should eq 10_000
55
+ end
56
+
57
+ it 'converts to centimeters' do
58
+ subject.convert_to(:cm).quantity.should eq 100_000
59
+ end
60
+
61
+ it 'converts to millimeters' do
62
+ subject.convert_to(:mm).quantity.should eq 1_000_000
63
+ end
64
+
65
+ it 'converts to micrometers' do
66
+ subject.convert_to(:µm).quantity.should eq 10_000_000
67
+ end
68
+ end
69
+
70
+ describe 'dekameters' do
71
+ subject { Measurement.parse('100 dam') }
72
+
73
+ it 'converts to kilometers' do
74
+ subject.convert_to(:km).quantity.should eq 1
75
+ end
76
+
77
+ it 'converts to hectometers' do
78
+ subject.convert_to(:hm).quantity.should eq 10
79
+ end
80
+
81
+ it 'converts to meters' do
82
+ subject.convert_to(:m).quantity.should eq 1_000
83
+ end
84
+
85
+ it 'converts to decimeters' do
86
+ subject.convert_to(:dm).quantity.should eq 10_000
87
+ end
88
+
89
+ it 'converts to centimeters' do
90
+ subject.convert_to(:cm).quantity.should eq 100_000
91
+ end
92
+
93
+ it 'converts to millimeters' do
94
+ subject.convert_to(:mm).quantity.should eq 1_000_000
95
+ end
96
+
97
+ it 'converts to micrometers' do
98
+ subject.convert_to(:µm).quantity.should eq 10_000_000
99
+ end
100
+ end
101
+
102
+ describe 'meters' do
103
+ subject { Measurement.parse('1000 m') }
104
+
105
+ it 'converts to kilometers' do
106
+ subject.convert_to(:km).quantity.should eq 1
107
+ end
108
+
109
+ it 'converts to hectometers' do
110
+ subject.convert_to(:hm).quantity.should eq 10
111
+ end
112
+
113
+ it 'converts to dekameters' do
114
+ subject.convert_to(:dam).quantity.should eq 100
115
+ end
116
+
117
+ it 'converts to decimeters' do
118
+ subject.convert_to(:dm).quantity.should eq 10_000
119
+ end
120
+
121
+ it 'converts to centimeters' do
122
+ subject.convert_to(:cm).quantity.should eq 100_000
123
+ end
124
+
125
+ it 'converts to millimeters' do
126
+ subject.convert_to(:mm).quantity.should eq 1_000_000
127
+ end
128
+
129
+ it 'converts to micrometers' do
130
+ subject.convert_to(:µm).quantity.should eq 10_000_000
131
+ end
132
+ end
133
+
134
+ describe 'decimeters' do
135
+ subject { Measurement.parse('10000 dm') }
136
+
137
+ it 'converts to kilometers' do
138
+ subject.convert_to(:km).quantity.should eq 1
139
+ end
140
+
141
+ it 'converts to hectometers' do
142
+ subject.convert_to(:hm).quantity.should eq 10
143
+ end
144
+
145
+ it 'converts to dekameters' do
146
+ subject.convert_to(:dam).quantity.should eq 100
147
+ end
148
+
149
+ it 'converts to meters' do
150
+ subject.convert_to(:m).quantity.should eq 1_000
151
+ end
152
+
153
+ it 'converts to centimeters' do
154
+ subject.convert_to(:cm).quantity.should eq 100_000
155
+ end
156
+
157
+ it 'converts to millimeters' do
158
+ subject.convert_to(:mm).quantity.should eq 1_000_000
159
+ end
160
+
161
+ it 'converts to micrometers' do
162
+ subject.convert_to(:µm).quantity.should eq 10_000_000
163
+ end
164
+ end
165
+
166
+ describe 'centimeters' do
167
+ subject { Measurement.parse('100000 cm') }
168
+
169
+ it 'converts to kilometers' do
170
+ subject.convert_to(:km).quantity.should eq 1
171
+ end
172
+
173
+ it 'converts to hectoliters' do
174
+ subject.convert_to(:hm).quantity.should eq 10
175
+ end
176
+
177
+ it 'converts to dekameters' do
178
+ subject.convert_to(:dam).quantity.should eq 100
179
+ end
180
+
181
+ it 'converts to meters' do
182
+ subject.convert_to(:m).quantity.should eq 1_000
183
+ end
184
+
185
+ it 'converts to decimeters' do
186
+ subject.convert_to(:dm).quantity.should eq 10_000
187
+ end
188
+
189
+ it 'converts to millimeters' do
190
+ subject.convert_to(:mm).quantity.should eq 1_000_000
191
+ end
192
+
193
+ it 'converts to micrometers' do
194
+ subject.convert_to(:µm).quantity.should eq 10_000_000
195
+ end
196
+ end
197
+
198
+ describe 'millimeters' do
199
+ subject { Measurement.parse('1000000 mm') }
200
+
201
+ it 'converts to kilometers' do
202
+ subject.convert_to(:km).quantity.should eq 1
203
+ end
204
+
205
+ it 'converts to hectometers' do
206
+ subject.convert_to(:hm).quantity.should eq 10
207
+ end
208
+
209
+ it 'converts to dekameters' do
210
+ subject.convert_to(:dam).quantity.should eq 100
211
+ end
212
+
213
+ it 'converts to meters' do
214
+ subject.convert_to(:m).quantity.should eq 1_000
215
+ end
216
+
217
+ it 'converts to decimeters' do
218
+ subject.convert_to(:dm).quantity.should eq 10_000
219
+ end
220
+
221
+ it 'converts to centimeters' do
222
+ subject.convert_to(:cm).quantity.should eq 100_000
223
+ end
224
+
225
+ it 'converts to micrometers' do
226
+ subject.convert_to(:µm).quantity.should eq 10_000_000
227
+ end
228
+ end
229
+
230
+ describe 'micrometers' do
231
+ subject { Measurement.parse('10000000 µm') }
232
+
233
+ it 'converts to kilometers' do
234
+ subject.convert_to(:km).quantity.should eq 1
235
+ end
236
+
237
+ it 'converts to hectometers' do
238
+ subject.convert_to(:hm).quantity.should eq 10
239
+ end
240
+
241
+ it 'converts to dekameters' do
242
+ subject.convert_to(:dam).quantity.should eq 100
243
+ end
244
+
245
+ it 'converts to meters' do
246
+ subject.convert_to(:m).quantity.should eq 1_000
247
+ end
248
+
249
+ it 'converts to decimeters' do
250
+ subject.convert_to(:dm).quantity.should eq 10_000
251
+ end
252
+
253
+ it 'converts to centimeters' do
254
+ subject.convert_to(:cm).quantity.should eq 100_000
255
+ end
256
+
257
+ it 'converts to millimeters' do
258
+ subject.convert_to(:mm).quantity.should eq 1_000_000
259
+ end
260
+ end
261
+ end