classx 0.0.1 → 0.0.2
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/ChangeLog +408 -2
- data/README +2 -2
- data/Rakefile +4 -3
- data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-block_rb.html +1 -1
- data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-callbacks_rb.html +1 -1
- data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-change_rb.html +1 -1
- data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-hunk_rb.html +1 -1
- data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs_rb.html +1 -1
- data/doc/output/coverage/-Library-Ruby-Gems-gems-rcov-0_8_1_2_0-lib-rcov_rb.html +1 -1
- data/doc/output/coverage/index.html +37 -172
- data/doc/output/coverage/lib-classx-attribute_rb.html +788 -0
- data/doc/output/coverage/{-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-drb-invokemethod_rb.html → lib-classx-attributes_rb.html} +96 -47
- data/doc/output/coverage/lib-classx-validate_rb.html +36 -36
- data/doc/output/coverage/lib-classx_rb.html +74 -151
- data/example/commandable.rb +28 -0
- data/lib/classx.rb +35 -112
- data/lib/classx/attribute.rb +178 -0
- data/lib/classx/attributes.rb +80 -8
- data/lib/classx/commandable.rb +38 -0
- data/lib/classx/validate.rb +1 -1
- data/spec/classx/default_option_spec.rb +140 -0
- data/spec/classx/handles_spec.rb +44 -0
- data/spec/classx/with_coerce.rb +79 -0
- data/spec/classx/with_extend.rb +25 -0
- data/spec/classx/with_include.rb +25 -0
- data/spec/classx/with_multiple_class_spec.rb +23 -0
- data/spec/classx/without_accessor_spec.rb +26 -0
- data/spec/classx/without_anyoption_spec.rb +23 -0
- data/spec/classx/writable_option_spec.rb +73 -0
- data/spec/classx_attributes_spec.rb +30 -0
- data/tasks/basic_config.rake +5 -1
- metadata +22 -15
- data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-drb-drb_rb.html +0 -2373
- data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-drb-eq_rb.html +0 -626
- data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-forwardable_rb.html +0 -828
- data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-pp_rb.html +0 -1257
- data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-prettyprint_rb.html +0 -1506
- data/doc/output/coverage/-System-Library-Frameworks-Ruby_framework-Versions-1_8-usr-lib-ruby-1_8-timeout_rb.html +0 -715
- data/lib/classx.rb.new +0 -102
- data/spec/classx_spec.rb +0 -261
data/lib/classx/commandable.rb
CHANGED
@@ -1,8 +1,46 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
|
3
|
+
$ClassXCommandableMappingOf = {}
|
4
|
+
|
3
5
|
class ClassX
|
4
6
|
module Commandable
|
7
|
+
class MissingCoerceMapping < Exception; end
|
8
|
+
|
5
9
|
def from_argv argv=ARGV.dup
|
10
|
+
OptionParser.new do |opt|
|
11
|
+
begin
|
12
|
+
opt.banner = "#{$0} [options]"
|
13
|
+
value_of = {}
|
14
|
+
attribute_of.each do |key, val|
|
15
|
+
|
16
|
+
val_format = val.value_class ? val.value_class : "VAL"
|
17
|
+
if val.optional?
|
18
|
+
val_format = "[ #{val_format} ]"
|
19
|
+
end
|
20
|
+
|
21
|
+
if val.value_class
|
22
|
+
begin
|
23
|
+
opt.on("--#{key} #{val_format}", val.value_class, val.desc) {|v| value_of[key] = v }
|
24
|
+
rescue Exception => e
|
25
|
+
if $ClassXCommandableMappingOf[val.value_class]
|
26
|
+
opt.on("--#{key} #{val_format}", $ClassXCommandableMappingOf[val.value_class], val.desc) {|v| value_of[key] = v }
|
27
|
+
else
|
28
|
+
raise MissingCoerceMapping, "missing coerce rule. please specify $ClassXCommandableMappingOf"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
else
|
32
|
+
opt.on("--#{key} #{val_format}") {|v| value_of[key] = v }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
opt.on('-h', '--help', 'show this document') {|v| raise OptionParser::ParseError }
|
37
|
+
opt.parse!(argv)
|
38
|
+
return new(value_of)
|
39
|
+
rescue ClassX::AttrRequiredError, OptionParser::ParseError => e
|
40
|
+
warn opt
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
end
|
6
44
|
end
|
7
45
|
end
|
8
46
|
end
|
data/lib/classx/validate.rb
CHANGED
@@ -28,7 +28,7 @@ module ClassX::Validate
|
|
28
28
|
uniq_key = caller[0]
|
29
29
|
unless @@__validate_cached[uniq_key]
|
30
30
|
@@__validate_cached[uniq_key] = Class.new(ClassX)
|
31
|
-
@@__validate_cached[uniq_key].class_eval
|
31
|
+
@@__validate_cached[uniq_key].class_eval(&block)
|
32
32
|
end
|
33
33
|
@@__validate_cached[uniq_key].new hash
|
34
34
|
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require 'classx'
|
3
|
+
|
4
|
+
describe ClassX do
|
5
|
+
describe '#has' do
|
6
|
+
describe 'with :default option' do
|
7
|
+
describe 'when value is Proc' do
|
8
|
+
before do
|
9
|
+
@class = Class.new(ClassX)
|
10
|
+
@class.class_eval do
|
11
|
+
has :x, :default => proc { Object.new }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should have any value when instanciate' do
|
16
|
+
@class.new.x.should_not be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should have difference of object_id between some instance' do
|
20
|
+
@class.new.x.should_not equal(@class.new.x)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "can use self as Proc's argument" do
|
24
|
+
@class.class_eval do
|
25
|
+
has :y, :default => proc {|mine| mine.x }, :lazy => true
|
26
|
+
has :z, :default => proc {|mine| mine.y }, :lazy => true
|
27
|
+
end
|
28
|
+
|
29
|
+
instance = @class.new
|
30
|
+
instance.y.should equal(instance.x)
|
31
|
+
instance.z.should equal(instance.y)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'when value is not Proc' do
|
36
|
+
before do
|
37
|
+
@class = Class.new(ClassX)
|
38
|
+
@class.class_eval do
|
39
|
+
has :x, :default => []
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should have any value when instanciate' do
|
44
|
+
@class.new.x.should == []
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should have the same object_id between some instance' do
|
48
|
+
@class.new.x.should equal(@class.new.x)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe 'with :optional is false' do
|
54
|
+
before do
|
55
|
+
@class = Class.new(ClassX)
|
56
|
+
@class.class_eval do
|
57
|
+
has :x, :optional => false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should raise AttrRequiredError without value" do
|
62
|
+
lambda { @class.new }.should raise_error(ClassX::AttrRequiredError)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should not raise AttrRequiredError with value" do
|
66
|
+
lambda { @class.new(:x => Object.new) }.should_not raise_error(ClassX::AttrRequiredError)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should not raise AttrRequiredError with key as String' do
|
70
|
+
lambda { @class.new('x' => Object.new) }.should_not raise_error(ClassX::AttrRequiredError)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe ':optional is false and with :default option' do
|
75
|
+
it 'should raise ClassX::RequiredAttrShouldNotHaveDefault' do
|
76
|
+
lambda {
|
77
|
+
klass = Class.new(ClassX)
|
78
|
+
klass.class_eval do
|
79
|
+
has :x, :optional => false, :default => 1
|
80
|
+
end
|
81
|
+
}.should raise_error(ClassX::RequiredAttrShouldNotHaveDefault)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe 'declare attribute without :optional and :default option' do
|
86
|
+
before do
|
87
|
+
@class = Class.new(ClassX)
|
88
|
+
@class.class_eval do
|
89
|
+
has :x, :kind_of => Integer
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should be required attribute' do
|
94
|
+
lambda { @class.new }.should raise_error(ClassX::AttrRequiredError)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe ':optional is true and without :default option' do
|
99
|
+
before do
|
100
|
+
@class = Class.new(ClassX)
|
101
|
+
@class.class_eval do
|
102
|
+
has :x, :optional => true, :kind_of => Integer
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should be required attribute' do
|
107
|
+
lambda { @class.new }.should_not raise_error(ClassX::AttrRequiredError)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe 'with :optional is true' do
|
112
|
+
describe 'without :writable option' do
|
113
|
+
before do
|
114
|
+
@class = Class.new(ClassX)
|
115
|
+
@class.class_eval do
|
116
|
+
has :x, :optional => true
|
117
|
+
end
|
118
|
+
end
|
119
|
+
it 'should not raise AttrRequiredError' do
|
120
|
+
lambda { @class.new }.should_not raise_error(ClassX::AttrRequiredError)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe 'not attribute param exist in #initialize argument' do
|
126
|
+
before do
|
127
|
+
@class = Class.new(ClassX)
|
128
|
+
@class.class_eval do
|
129
|
+
has :x
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# TODO: I'll change it to be able to choosee wheather check this strictly or not.
|
134
|
+
# In many case, lack argument cause any problem. On the other hand, extra argument does not cause any problem, I think.
|
135
|
+
it 'should be ignored' do
|
136
|
+
lambda { @class.new(:x => 10, :y => 20 ) }.should_not raise_error(Exception)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require 'classx'
|
3
|
+
|
4
|
+
describe ClassX do
|
5
|
+
describe '#has' do
|
6
|
+
describe 'with handles option as Hash' do
|
7
|
+
before do
|
8
|
+
@class1 = Class.new(ClassX)
|
9
|
+
@class1.class_eval do
|
10
|
+
has :x, :handles => { :x_inspect => :inspect }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should respond_to x_inspect method' do
|
15
|
+
obj = Object.new
|
16
|
+
@class1.new(:x => obj).should be_respond_to(:x_inspect)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should delegate method to value' do
|
20
|
+
obj = Object.new
|
21
|
+
@class1.new(:x => obj).x_inspect.should == obj.inspect
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'with handles option as Array' do
|
26
|
+
before do
|
27
|
+
@class1 = Class.new(ClassX)
|
28
|
+
@class1.class_eval do
|
29
|
+
has :x, :handles => [ :length ]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should respond_to item name method' do
|
34
|
+
obj = [1, 2, 3]
|
35
|
+
@class1.new(:x => obj).should be_respond_to(:length)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should delegate method to the same item name' do
|
39
|
+
obj = [1, 2, 3]
|
40
|
+
@class1.new(:x => obj).length.should == obj.length
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require 'classx'
|
3
|
+
|
4
|
+
describe ClassX do
|
5
|
+
describe '#has' do
|
6
|
+
describe 'with coece' do
|
7
|
+
describe 'when Array is value' do
|
8
|
+
before do
|
9
|
+
@class = Class.new(ClassX)
|
10
|
+
@class.class_eval do
|
11
|
+
has :x, :isa => Integer, :coerce => [
|
12
|
+
{ proc {|val| val.respond_to? :to_i } => proc {|val| val.to_i } },
|
13
|
+
{ proc {|val| val.respond_to? :to_s } => proc {|val| val.to_s } },
|
14
|
+
]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'attrubute :x should convert Str to Integer' do
|
19
|
+
lambda { @class.new(:x => "10") }.should_not raise_error(Exception)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'attrubute :x should not convert Object to Integer' do
|
23
|
+
lambda { @class.new(:x => Object.new ) }.should raise_error(ClassX::InvalidAttrArgument)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'when Proc is key' do
|
28
|
+
before do
|
29
|
+
@class = Class.new(ClassX)
|
30
|
+
@class.class_eval do
|
31
|
+
has :x, :isa => Integer, :coerce => { proc {|val| val.respond_to? :to_i } => proc {|val| val.to_i } }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'attrubute :x should convert Str to Integer' do
|
36
|
+
lambda { @class.new(:x => "10") }.should_not raise_error(Exception)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'attrubute :x should not convert Object to Integer' do
|
40
|
+
lambda { @class.new(:x => Object.new ) }.should raise_error(ClassX::InvalidAttrArgument)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'when Symbol is key' do
|
45
|
+
before do
|
46
|
+
@class = Class.new(ClassX)
|
47
|
+
@class.class_eval do
|
48
|
+
has :x, :isa => Integer, :coerce => { :to_i => proc {|val| val.to_i } }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'attrubute :x should convert Str to Integer' do
|
53
|
+
lambda { @class.new(:x => "10") }.should_not raise_error(Exception)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'attrubute :x should not convert Object to Integer' do
|
57
|
+
lambda { @class.new(:x => Object.new ) }.should raise_error(ClassX::InvalidAttrArgument)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe 'when Module or Class is key' do
|
62
|
+
before do
|
63
|
+
@class = Class.new(ClassX)
|
64
|
+
@class.class_eval do
|
65
|
+
has :x, :isa => Integer, :coerce => { String => proc {|val| val.to_i } }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'attrubute :x should convert Str to Integer' do
|
70
|
+
lambda { @class.new(:x => "10") }.should_not raise_error(Exception)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'attrubute :x should not convert Object to Integer' do
|
74
|
+
lambda { @class.new(:x => Object.new ) }.should raise_error(ClassX::InvalidAttrArgument)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require 'classx'
|
3
|
+
|
4
|
+
describe ClassX do
|
5
|
+
describe '#has' do
|
6
|
+
describe 'with extend' do
|
7
|
+
before do
|
8
|
+
@class = Class.new(ClassX)
|
9
|
+
mod = Module.new
|
10
|
+
mod.module_eval do
|
11
|
+
define_method :test do
|
12
|
+
:test
|
13
|
+
end
|
14
|
+
end
|
15
|
+
@class.class_eval do
|
16
|
+
has :x, :extend => mod
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'attrubute :x should have test class method' do
|
21
|
+
@class.new(:x => 10).attribute_of['x'].class.test.should == :test
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require 'classx'
|
3
|
+
|
4
|
+
describe ClassX do
|
5
|
+
describe '#has' do
|
6
|
+
describe 'with include' do
|
7
|
+
before do
|
8
|
+
@class = Class.new(ClassX)
|
9
|
+
mod = Module.new
|
10
|
+
mod.module_eval do
|
11
|
+
define_method :test do
|
12
|
+
:test
|
13
|
+
end
|
14
|
+
end
|
15
|
+
@class.class_eval do
|
16
|
+
has :x, :include => mod
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'attrubute :x should have #test method' do
|
21
|
+
@class.new(:x => 10).attribute_of['x'].test.should == :test
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require 'classx'
|
3
|
+
|
4
|
+
describe ClassX do
|
5
|
+
describe '#has' do
|
6
|
+
describe 'with multiple class' do
|
7
|
+
before do
|
8
|
+
@class1 = Class.new(ClassX)
|
9
|
+
@class1.class_eval do
|
10
|
+
has :x
|
11
|
+
end
|
12
|
+
@class2 = Class.new(ClassX)
|
13
|
+
@class2.class_eval do
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should not raise AttrRequiredError when initialized anothor class' do
|
18
|
+
lambda { @class2.new }.should_not raise_error(ClassX::AttrRequiredError)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require 'classx'
|
3
|
+
|
4
|
+
describe ClassX do
|
5
|
+
describe '#has' do
|
6
|
+
describe 'without accessor' do
|
7
|
+
before do
|
8
|
+
@class = Class.new(ClassX)
|
9
|
+
@class.class_eval do
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should not raise_error' do
|
14
|
+
lambda { @class.new }.should_not raise_error(Exception)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should raise ArgumentError when recieved not kind of Hash instance as initialize argument' do
|
18
|
+
lambda { @class.new([]) }.should raise_error(ArgumentError)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should have empty attributes' do
|
22
|
+
@class.attribute_of.keys.should be_empty
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
require 'classx'
|
3
|
+
|
4
|
+
describe ClassX do
|
5
|
+
describe '#has' do
|
6
|
+
describe 'without any option' do
|
7
|
+
before do
|
8
|
+
@class = Class.new(ClassX)
|
9
|
+
@class.class_eval do
|
10
|
+
has :x
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should required :x on initialize' do
|
15
|
+
lambda { @class.new }.should raise_error(ClassX::AttrRequiredError)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should define #x= private method to class' do
|
19
|
+
@class.private_instance_methods.map {|meth| meth.to_s }.should be_include("x=")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|