measure 0.1.0 → 0.2.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/CHANGES +12 -0
- data/COPYING +379 -370
- data/COPYING.LIB +79 -78
- data/ChangeLog +67 -0
- data/Rakefile +5 -3
- data/TODO +8 -3
- data/lib/measure.rb +114 -48
- data/lib/measure/length.rb +57 -51
- data/lib/measure/support.rb +13 -3
- data/lib/measure/version.rb +1 -1
- data/lib/measure/weight.rb +43 -0
- data/spec/measure_spec.rb +147 -35
- metadata +6 -4
data/lib/measure/length.rb
CHANGED
@@ -6,54 +6,60 @@
|
|
6
6
|
|
7
7
|
require 'measure'
|
8
8
|
|
9
|
-
Measure
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
9
|
+
class Measure
|
10
|
+
{
|
11
|
+
:m => :meter,
|
12
|
+
:km => :kilo_meter,
|
13
|
+
:cm => :centi_meter,
|
14
|
+
:mm => :milli_meter,
|
15
|
+
:um => :micro_meter,
|
16
|
+
:nm => :nano_meter,
|
17
|
+
:in => :inch,
|
18
|
+
:ft => :feet,
|
19
|
+
:yd => :yard,
|
20
|
+
}.each do |a, u|
|
21
|
+
def_unit u, :length unless has_unit? u
|
22
|
+
def_alias a, u
|
23
|
+
end
|
24
|
+
|
25
|
+
def_conversion :m, :cm => 100, :mm => 1000, :um => 1000000, :nm => 1000000000
|
26
|
+
def_conversion :km, :m => 1000
|
27
|
+
def_conversion :cm, :mm => 10
|
28
|
+
def_conversion :mm, :um => 1000
|
29
|
+
def_conversion :um, :nm => 1000
|
30
|
+
def_conversion :in, :m => 0.254, :cm => 2.54, :mm => 25.4
|
31
|
+
def_conversion :ft, :in => 12
|
32
|
+
def_conversion :yd, :in => 36, :ft => 3
|
33
|
+
|
34
|
+
# for Physics
|
35
|
+
|
36
|
+
{
|
37
|
+
:aa => :angstrom,
|
38
|
+
:AU => :astronomical_unit,
|
39
|
+
:au => :astronomical_unit,
|
40
|
+
:ly => :light_year,
|
41
|
+
}.each do |a, u|
|
42
|
+
def_unit u, :length unless has_unit? u
|
43
|
+
def_alias a, u
|
44
|
+
end
|
45
|
+
|
46
|
+
def_conversion :m, :angstrom => 10000000000
|
47
|
+
def_conversion :AU, :m => 149_597_870_691
|
48
|
+
def_conversion :light_year, :m => 9_460_730_472_580_800
|
49
|
+
|
50
|
+
# for DTP
|
51
|
+
|
52
|
+
{
|
53
|
+
:pt => :point,
|
54
|
+
:didot_point => :point,
|
55
|
+
:dp => :didot_point,
|
56
|
+
:bp => :big_point,
|
57
|
+
:pc => :pica,
|
58
|
+
}.each do |a, u|
|
59
|
+
def_unit u, :length unless has_unit? u
|
60
|
+
def_alias a, u
|
61
|
+
end
|
62
|
+
|
63
|
+
def_conversion :in, :pt => 72.27, :bp => 72.0
|
64
|
+
def_conversion :pc, :pt => 12
|
65
|
+
end
|
data/lib/measure/support.rb
CHANGED
@@ -22,7 +22,7 @@ module MeasureSupport
|
|
22
22
|
|
23
23
|
def method_missing(name, *args)
|
24
24
|
if MeasureSupport.enable?
|
25
|
-
return Measure.new(self, name) if Measure.
|
25
|
+
return Measure.new(self, name) if Measure.has_unit?(name)
|
26
26
|
end
|
27
27
|
return measure_support_saved_method_missing(name, *args)
|
28
28
|
end
|
@@ -31,7 +31,7 @@ module MeasureSupport
|
|
31
31
|
end
|
32
32
|
|
33
33
|
class << Measure
|
34
|
-
def
|
34
|
+
def short_form
|
35
35
|
begin
|
36
36
|
MeasureSupport.enable
|
37
37
|
return yield
|
@@ -40,7 +40,17 @@ class << Measure
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
|
43
|
+
def enable_short_form
|
44
|
+
MeasureSupport.enable
|
45
|
+
end
|
46
|
+
|
47
|
+
def disable_short_form
|
48
|
+
MeasureSupport.disable
|
49
|
+
end
|
50
|
+
|
51
|
+
def short_form_available?
|
52
|
+
MeasureSupport.enable?
|
53
|
+
end
|
44
54
|
end
|
45
55
|
|
46
56
|
class Integer
|
data/lib/measure/version.rb
CHANGED
@@ -0,0 +1,43 @@
|
|
1
|
+
# = Definitions of the weight dimension units
|
2
|
+
#
|
3
|
+
# Author:: Kenta Murata
|
4
|
+
# Copyright:: Copyright (C) 2008 Kenta Murata
|
5
|
+
# License:: LGPL version 3.0
|
6
|
+
|
7
|
+
require 'measure'
|
8
|
+
|
9
|
+
class Measure
|
10
|
+
{
|
11
|
+
:kg => :kilo_gram,
|
12
|
+
:g => :gram,
|
13
|
+
:t => :ton,
|
14
|
+
:mg => :milli_gram,
|
15
|
+
:ug => :micro_gram,
|
16
|
+
:gr => :grain,
|
17
|
+
:oz => :ounce,
|
18
|
+
:oz_av => :ounce,
|
19
|
+
:oz_tr => :troy_ounce,
|
20
|
+
:toz => :troy_ounce,
|
21
|
+
:lb => :pound,
|
22
|
+
:lb_av => :pound,
|
23
|
+
:lb_tr => :troy_pound,
|
24
|
+
:kin => :catty,
|
25
|
+
:ryo => :tael,
|
26
|
+
}.each do |a, u|
|
27
|
+
def_unit u, :weight unless has_unit? u
|
28
|
+
def_alias a, u
|
29
|
+
end
|
30
|
+
|
31
|
+
def_conversion :kg, :g => 1_000, :mg => 1_000_000, :ug => 1_000_000_000
|
32
|
+
def_conversion :t, :kg => 1_000
|
33
|
+
def_conversion :gr, :mg => 64.79891
|
34
|
+
def_conversion :oz_av, :gr => 437.5
|
35
|
+
def_conversion :oz_tr, :gr => 480, :g => 31.1034768
|
36
|
+
def_conversion :lb_av, :gr => 7000, :oz => 16, :kg => 0.45359237
|
37
|
+
def_conversion :lb_tr, :gr => 5760, :oz => 12, :kg => 0.3732417216, :lb_av => 144.0/175.0
|
38
|
+
|
39
|
+
def_unit :momme, :weight
|
40
|
+
def_conversion :momme, :g => 3.75
|
41
|
+
def_conversion :kin, :momme => 160
|
42
|
+
def_conversion :kin, :ryo => 16
|
43
|
+
end
|
data/spec/measure_spec.rb
CHANGED
@@ -1,36 +1,141 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
2
|
require 'measure'
|
3
3
|
|
4
|
-
describe Measure do
|
4
|
+
describe Measure, 'with five pre-defined units in order to unit management' do
|
5
5
|
before :each do
|
6
|
+
# Pre-define the following conversion scheme
|
7
|
+
#
|
8
|
+
# 2 5 10
|
9
|
+
# a <--- b ---> c <--- d
|
10
|
+
# |
|
11
|
+
# `----> e
|
12
|
+
# 10
|
13
|
+
#
|
14
|
+
Measure.define_unit :a, :test
|
15
|
+
Measure.define_unit :b, :test
|
16
|
+
Measure.define_unit :c, :test
|
17
|
+
Measure.define_unit :d, :test
|
18
|
+
Measure.define_unit :e, :test
|
19
|
+
Measure.define_conversion :b, :a => 2
|
20
|
+
Measure.define_conversion :b, :c => 5
|
21
|
+
Measure.define_conversion :b, :e => 10
|
22
|
+
Measure.define_conversion :d, :c => 10
|
6
23
|
end
|
7
24
|
|
8
|
-
it 'has
|
9
|
-
Measure.num_units.should
|
10
|
-
Measure.units.should be_empty
|
25
|
+
it 'has five units' do
|
26
|
+
Measure.num_units.should == 5
|
11
27
|
end
|
12
28
|
|
13
|
-
it 'has
|
14
|
-
Measure.
|
15
|
-
Measure.should have_unit
|
16
|
-
Measure.should
|
29
|
+
it 'has defined units and has not undefined units' do
|
30
|
+
Measure.should have_unit(:a)
|
31
|
+
Measure.should have_unit(:b)
|
32
|
+
Measure.should have_unit(:c)
|
33
|
+
Measure.should have_unit(:d)
|
34
|
+
Measure.should have_unit(:e)
|
35
|
+
Measure.should_not have_unit(:f)
|
36
|
+
Measure.should_not have_unit(:g)
|
37
|
+
Measure.should_not have_unit(:h)
|
17
38
|
end
|
18
39
|
|
19
|
-
it '
|
20
|
-
Measure.define_unit :
|
21
|
-
|
22
|
-
Measure.num_units.should == 2
|
40
|
+
it 'can define an unit which has not been defined yet' do
|
41
|
+
lambda { Measure.define_unit :f, :test }.
|
42
|
+
should_not raise_error(Exception)
|
23
43
|
end
|
24
44
|
|
25
|
-
it '
|
26
|
-
|
27
|
-
Measure.
|
28
|
-
lambda { Measure.
|
45
|
+
it 'can undefine a unit which has been already defined' do
|
46
|
+
Measure.define_unit :f, :test
|
47
|
+
Measure.should have_unit(:f)
|
48
|
+
lambda { Measure.undefine_unit :f }.
|
49
|
+
should_not raise_error(Exception)
|
50
|
+
Measure.should_not have_unit(:f)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'raises UnitRedefinitionError' +
|
54
|
+
' when an unit is about to be redefined as a different dimension' do
|
55
|
+
lambda { Measure.define_unit :a, :other }.
|
56
|
+
should raise_error(Measure::UnitRedefinitionError)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'does not raise UnitRedefinitionError' +
|
60
|
+
' when an unit is about to be redefined as a same dimension' do
|
61
|
+
lambda { Measure.define_unit :a, :test }.
|
29
62
|
should_not raise_error(Measure::UnitRedefinitionError)
|
30
|
-
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'can define and undefine aliases' do
|
66
|
+
lambda { Measure.define_alias :alias_a, :a }.
|
67
|
+
should_not raise_error(Exception)
|
68
|
+
Measure.should have_unit(:alias_a)
|
69
|
+
lambda { Measure.undefine_unit :alias_a }.
|
70
|
+
should_not raise_error(Exception)
|
71
|
+
Measure.should_not have_unit(:alias_a)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'raises UnitRedefinitionError when the unit is redefined as an alias' do
|
75
|
+
lambda { Measure.define_alias :b, :a }.
|
31
76
|
should raise_error(Measure::UnitRedefinitionError)
|
32
77
|
end
|
33
78
|
|
79
|
+
it 'can define a scheme of conversion from an alias' do
|
80
|
+
Measure.define_alias :alias_a, :a
|
81
|
+
lambda { Measure.define_conversion :alias_a, :b => 10 }.
|
82
|
+
should_not raise_error(Exception)
|
83
|
+
Measure.should be_direct_compatible(:alias_a, :b)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'can convert between two connected units' +
|
87
|
+
' through multiple direct conversions' do
|
88
|
+
Measure.find_conversion_route(:a, :d).should_not be_nil
|
89
|
+
Measure.find_conversion_route(:d, :e).should_not be_nil
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'can define conversion by a Proc' do
|
93
|
+
Measure.define_unit :f, :test
|
94
|
+
lambda { Measure.define_conversion :f, :a => lambda {|x| x + 2 } }.
|
95
|
+
should_not raise_error(Exception)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'can not convert commutatively by a Proc ' do
|
99
|
+
Measure.define_unit :f, :test
|
100
|
+
lambda { Measure.define_conversion :f, :a => lambda {|x| x + 2 } }.
|
101
|
+
should_not raise_error(Exception)
|
102
|
+
Measure.should be_direct_compatible(:f, :a)
|
103
|
+
Measure.should_not be_direct_compatible(:a, :f)
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'can not find conversion route include inverse of a Proc ' do
|
107
|
+
Measure.define_unit :f, :test
|
108
|
+
lambda { Measure.define_conversion :f, :a => lambda {|x| x + 2 } }.
|
109
|
+
should_not raise_error(Exception)
|
110
|
+
#
|
111
|
+
# 2 5 10
|
112
|
+
# f ===> a <--- b ---> c <--- d
|
113
|
+
# |
|
114
|
+
# `----> e
|
115
|
+
# 10
|
116
|
+
#
|
117
|
+
# ===> : incommutative conversion
|
118
|
+
Measure.should be_direct_compatible(:f, :a)
|
119
|
+
Measure.should_not be_direct_compatible(:a, :f)
|
120
|
+
Measure.find_conversion_route(:f, :d).should_not be_nil
|
121
|
+
Measure.find_conversion_route(:d, :f).should be_nil
|
122
|
+
end
|
123
|
+
|
124
|
+
after :each do
|
125
|
+
Measure.clear_units
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe Measure, 'with no pre-defined units' do
|
130
|
+
before :each do
|
131
|
+
Measure.clear_units
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'has no units when nothing is defined' do
|
135
|
+
Measure.num_units.should be_equal(0)
|
136
|
+
Measure.units.should be_empty
|
137
|
+
end
|
138
|
+
|
34
139
|
it 'returns length units when call units(:length)' do
|
35
140
|
length_units = [:meter, :feet, :inch]
|
36
141
|
length_units.each {|u| Measure.define_unit u, :length }
|
@@ -51,8 +156,8 @@ describe Measure do
|
|
51
156
|
Measure.define_unit :meter, :length
|
52
157
|
Measure.define_unit :inch, :length
|
53
158
|
Measure.define_conversion :meter, :inch => 0.254
|
54
|
-
Measure.
|
55
|
-
Measure.
|
159
|
+
Measure.should be_direct_compatible(:meter, :inch)
|
160
|
+
Measure.should be_direct_compatible(:inch, :meter)
|
56
161
|
end
|
57
162
|
|
58
163
|
it 'can convert meter to centimeter after define_conversion(:meter, :centimeter => 100)' do
|
@@ -68,21 +173,6 @@ describe Measure do
|
|
68
173
|
Measure(1, :meter).to_s.should == '1 [meter]'
|
69
174
|
end
|
70
175
|
|
71
|
-
it 'can define aliases' do
|
72
|
-
Measure.define_unit :meter, :length
|
73
|
-
Measure.define_alias :m, :meter
|
74
|
-
Measure.should be_defined :m
|
75
|
-
Measure.dimension(:m).should == :length
|
76
|
-
|
77
|
-
Measure.define_unit :centimeter, :length
|
78
|
-
lambda { Measure.define_alias :centimeter, :meter }.
|
79
|
-
should raise_error(Measure::UnitRedefinitionError)
|
80
|
-
|
81
|
-
Measure.define_conversion :meter, :centimeter => 100
|
82
|
-
lambda { Measure(1, :m).as_centimeter }.
|
83
|
-
should_not raise_error(StandardError)
|
84
|
-
end
|
85
|
-
|
86
176
|
it 'can perform multi-hop conversion' do
|
87
177
|
Measure.define_unit :millimeter, :length
|
88
178
|
Measure.define_unit :inch, :length
|
@@ -92,8 +182,30 @@ describe Measure do
|
|
92
182
|
Measure(1, :feet).as_millimeter.should be_close(Measure(12.0 * 25.4, :millimeter), 1e-9)
|
93
183
|
end
|
94
184
|
|
185
|
+
it 'can convert by a Proc' do
|
186
|
+
Measure.define_unit :deg_c, :temperature
|
187
|
+
Measure.define_unit :deg_f, :temperature
|
188
|
+
Measure.define_conversion :deg_f, :deg_c => lambda {|x| 5.0*(x - 32)/9.0 }
|
189
|
+
Measure.define_conversion :deg_c, :deg_f => lambda {|x| 9.0*x/5.0 + 32 }
|
190
|
+
Measure.should be_direct_compatible(:deg_f, :deg_c)
|
191
|
+
Measure.should be_direct_compatible(:deg_c, :deg_f)
|
192
|
+
lambda { Measure(40, :deg_c).as_deg_f }.should_not raise_error(Exception)
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'coerce a Number to a Measure with unit 1' do
|
196
|
+
Measure.define_unit :a, :test
|
197
|
+
Measure(1, :a).coerce(10)[0].unit.should == 1
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'can multiply any units by unit 1' do
|
201
|
+
Measure.define_unit :a, :test
|
202
|
+
lambda { Measure(1, :a) * Measure(1, 1) }.
|
203
|
+
should_not raise_error(Exception)
|
204
|
+
lambda { Measure(1, 1) * Measure(1, :a) }.
|
205
|
+
should_not raise_error(Exception)
|
206
|
+
end
|
207
|
+
|
95
208
|
after :each do
|
96
|
-
Measure.clear_units
|
97
209
|
end
|
98
210
|
end
|
99
211
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: measure
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenta Murata
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-06-13 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -22,6 +22,7 @@ extensions: []
|
|
22
22
|
extra_rdoc_files:
|
23
23
|
- README
|
24
24
|
- CHANGES
|
25
|
+
- COPYING
|
25
26
|
- COPYING.LIB
|
26
27
|
files:
|
27
28
|
- ChangeLog
|
@@ -34,6 +35,7 @@ files:
|
|
34
35
|
- lib/measure/length.rb
|
35
36
|
- lib/measure/support.rb
|
36
37
|
- lib/measure/version.rb
|
38
|
+
- lib/measure/weight.rb
|
37
39
|
- lib/measure.rb
|
38
40
|
- spec/measure_spec.rb
|
39
41
|
- spec/spec.opts
|
@@ -65,9 +67,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
67
|
requirements: []
|
66
68
|
|
67
69
|
rubyforge_project: measure
|
68
|
-
rubygems_version: 1.
|
70
|
+
rubygems_version: 1.3.1
|
69
71
|
signing_key:
|
70
72
|
specification_version: 2
|
71
|
-
summary: measure version 0.
|
73
|
+
summary: measure version 0.2.0
|
72
74
|
test_files: []
|
73
75
|
|