ruby-measurement 1.0.0 → 1.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.
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