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.
- data/.travis.yml +4 -0
- data/CHANGELOG.md +21 -0
- data/README.md +2 -0
- data/Rakefile +3 -0
- data/lib/ruby-measurement/definitions/metric.rb +1 -0
- data/lib/ruby-measurement/definitions/metric/capacity.rb +12 -82
- data/lib/ruby-measurement/definitions/metric/volume.rb +82 -12
- data/lib/ruby-measurement/definitions/us_customary.rb +1 -0
- data/lib/ruby-measurement/definitions/us_customary/capacity.rb +29 -0
- data/lib/ruby-measurement/definitions/us_customary/length.rb +0 -20
- data/lib/ruby-measurement/definitions/us_customary/weight.rb +6 -6
- data/lib/ruby-measurement/measurement.rb +5 -14
- data/lib/ruby-measurement/unit.rb +52 -11
- data/lib/ruby-measurement/version.rb +1 -1
- data/ruby-measurement.gemspec +1 -0
- data/spec/ruby-measurement/definitions/metric/area_spec.rb +69 -0
- data/spec/ruby-measurement/definitions/metric/capacity_spec.rb +41 -0
- data/spec/ruby-measurement/definitions/metric/length_spec.rb +261 -0
- data/spec/ruby-measurement/definitions/metric/volume_spec.rb +261 -0
- data/spec/ruby-measurement/definitions/metric/weight_spec.rb +325 -0
- data/spec/ruby-measurement/definitions/us_customary/area_spec.rb +149 -0
- data/spec/ruby-measurement/definitions/us_customary/capacity_spec.rb +69 -0
- data/spec/ruby-measurement/definitions/us_customary/length_spec.rb +261 -0
- data/spec/ruby-measurement/definitions/us_customary/volume_spec.rb +201 -0
- data/spec/ruby-measurement/definitions/us_customary/weight_spec.rb +149 -0
- data/spec/ruby-measurement/measurement_spec.rb +342 -0
- data/spec/ruby-measurement/unit_builder_spec.rb +102 -0
- data/spec/ruby-measurement/unit_spec.rb +120 -0
- data/spec/spec_helper.rb +5 -0
- data/tasks/rspec.rake +6 -0
- metadata +48 -5
@@ -4,28 +4,36 @@ class Measurement
|
|
4
4
|
class Unit
|
5
5
|
attr_reader :name, :aliases, :conversions
|
6
6
|
|
7
|
-
|
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
|
17
|
-
args.each
|
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
|
21
|
-
@conversions[
|
23
|
+
def add_conversion(unit_name, &block)
|
24
|
+
@conversions[unit_name.to_s] = block
|
22
25
|
end
|
23
26
|
|
24
|
-
def conversion(
|
25
|
-
|
26
|
-
|
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
|
data/ruby-measurement.gemspec
CHANGED
@@ -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
|