ruby_ext 0.4.11 → 0.4.12
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/Rakefile +6 -6
- data/lib/rake_ext.rb +10 -5
- data/lib/rake_ext/project.rb +31 -16
- data/lib/rspec_ext.rb +82 -19
- data/lib/ruby_ext.rb +1 -52
- data/lib/ruby_ext/core.rb +24 -0
- data/lib/ruby_ext/{array.rb → core/array.rb} +4 -2
- data/lib/ruby_ext/core/basic_object.rb +8 -0
- data/lib/ruby_ext/core/class.rb +0 -0
- data/lib/ruby_ext/{deep_clone.rb → core/deep_clone.rb} +3 -4
- data/lib/ruby_ext/core/enumerable.rb +17 -0
- data/lib/ruby_ext/{file.rb → core/file.rb} +5 -2
- data/lib/ruby_ext/core/hash.rb +23 -0
- data/lib/ruby_ext/{kernel.rb → core/kernel.rb} +0 -0
- data/lib/ruby_ext/{micelaneous.rb → core/micelaneous.rb} +0 -0
- data/lib/ruby_ext/{module.rb → core/module.rb} +13 -2
- data/lib/ruby_ext/{multiple_inheritance.rb → core/multiple_inheritance.rb} +30 -14
- data/lib/ruby_ext/{must.rb → core/must.rb} +30 -27
- data/lib/ruby_ext/{not_defined.rb → core/not_defined.rb} +0 -0
- data/lib/ruby_ext/{object.rb → core/object.rb} +0 -0
- data/lib/ruby_ext/{open_object.rb → core/open_object.rb} +21 -16
- data/lib/ruby_ext/{string.rb → core/string.rb} +27 -0
- data/lib/ruby_ext/{symbol.rb → core/symbol.rb} +0 -0
- data/lib/ruby_ext/fixes.rb +6 -0
- data/lib/ruby_ext/gems.rb +0 -1
- data/lib/ruby_ext/more.rb +11 -0
- data/lib/ruby_ext/more/declarative_cache.rb +96 -0
- data/lib/ruby_ext/more/micelaneous.rb +7 -0
- data/lib/ruby_ext/{observable2.rb → more/observable2.rb} +0 -0
- data/lib/ruby_ext/{open_constructor.rb → more/open_constructor.rb} +2 -2
- data/lib/ruby_ext/more/safe_hash.rb +214 -0
- data/lib/ruby_ext/{synchronize.rb → more/synchronize.rb} +5 -5
- data/lib/ruby_ext/{tuple.rb → more/tuple.rb} +0 -0
- data/lib/yaml_fix.rb +9 -0
- data/readme.md +46 -42
- data/spec/core/array_spec.rb +7 -0
- data/spec/{deep_clone_spec.rb → core/deep_clone_spec.rb} +2 -3
- data/spec/core/enumerable.rb +9 -0
- data/spec/{kernel_spec.rb → core/kernel_spec.rb} +4 -6
- data/spec/{kernel_spec → core/kernel_spec}/TheNamespace/ClassA.rb +0 -0
- data/spec/{kernel_spec → core/kernel_spec}/another_class.rb +0 -0
- data/spec/{kernel_spec → core/kernel_spec}/the_namespace/class_b.rb +0 -0
- data/spec/{module_spec.rb → core/module_spec.rb} +2 -4
- data/spec/{multiple_inheritance_spec.rb → core/multiple_inheritance_spec.rb} +28 -12
- data/spec/core/must_spec.rb +32 -0
- data/spec/{open_object_spec.rb → core/open_object_spec.rb} +6 -7
- data/spec/core/spec_helper.rb +2 -0
- data/spec/{declarative_cache_spec.rb → more/declarative_cache_spec.rb} +35 -8
- data/spec/{observable2_spec.rb → more/observable2_spec.rb} +3 -4
- data/spec/{open_constructor_spec.rb → more/open_constructor_spec.rb} +6 -7
- data/spec/more/safe_hash_spec.rb +133 -0
- data/spec/more/spec_helper.rb +2 -0
- data/spec/{synchronize_spec.rb → more/synchronize_spec.rb} +2 -3
- metadata +67 -100
- data/lib/ruby_ext/basic_object.rb +0 -22
- data/lib/ruby_ext/class.rb +0 -11
- data/lib/ruby_ext/declarative_cache.rb +0 -85
- data/lib/ruby_ext/extra_blank_slate.rb +0 -17
- data/lib/ruby_ext/hash.rb +0 -15
- data/lib/ruby_ext/prepare_arguments.rb +0 -105
- data/lib/ruby_ext/prototype_inheritance.rb +0 -110
- data/lib/ruby_ext/should.rb +0 -166
- data/lib/rubyopt.rb +0 -7
- data/spec/_prototype_inheritance_spec.rb +0 -190
- data/spec/array_spec.rb +0 -8
- data/spec/must_spec.rb +0 -29
- data/spec/prepare_arguments_spec.rb +0 -46
- data/spec/should_spec.rb +0 -24
- data/spec/spec_helper.rb +0 -19
@@ -1,110 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Fix for ruby's broken include.
|
3
|
-
# Included modules doesn't propagated to it's children.
|
4
|
-
#
|
5
|
-
# Test case:
|
6
|
-
# module A; end
|
7
|
-
# module B
|
8
|
-
# include A
|
9
|
-
# end
|
10
|
-
#
|
11
|
-
# module Plugin; end
|
12
|
-
# A.send(:include, Plugin)
|
13
|
-
#
|
14
|
-
# p "Ancestors of A: " + A.ancestors.join(', ') # => "Ancestors of A: A, Plugin"
|
15
|
-
# p "Ancestors of B: " + B.ancestors.join(', ') # => "Ancestors of B: B, A" << NO PLUGIN!
|
16
|
-
#
|
17
|
-
class Module
|
18
|
-
def directly_included_by
|
19
|
-
@directly_included_by ||= Set.new
|
20
|
-
end
|
21
|
-
|
22
|
-
def fixed_include mod
|
23
|
-
unless mod.directly_included_by.include? self
|
24
|
-
mod.directly_included_by.add self
|
25
|
-
end
|
26
|
-
|
27
|
-
include mod
|
28
|
-
directly_included_by.each do |child|
|
29
|
-
child.fixed_include self
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
#
|
36
|
-
# Prototypes
|
37
|
-
#
|
38
|
-
class Class
|
39
|
-
def prototype
|
40
|
-
unless @prototype
|
41
|
-
unless const_defined? :Prototype
|
42
|
-
class_eval "module Prototype; end", __FILE__, __LINE__
|
43
|
-
end
|
44
|
-
@prototype = const_get :Prototype
|
45
|
-
|
46
|
-
fixed_include @prototype
|
47
|
-
end
|
48
|
-
@prototype
|
49
|
-
end
|
50
|
-
|
51
|
-
def class_prototype
|
52
|
-
unless @class_prototype
|
53
|
-
unless const_defined? :ClassPrototype
|
54
|
-
class_eval "module ClassPrototype; end", __FILE__, __LINE__
|
55
|
-
end
|
56
|
-
@class_prototype = const_get :ClassPrototype
|
57
|
-
|
58
|
-
(class << self; self end).fixed_include @class_prototype
|
59
|
-
end
|
60
|
-
@class_prototype
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
#
|
66
|
-
# Inheritance logic
|
67
|
-
#
|
68
|
-
class Class
|
69
|
-
def define_instance_methods &block
|
70
|
-
prototype.class_eval &block
|
71
|
-
# self.include prototype
|
72
|
-
end
|
73
|
-
|
74
|
-
def define_class_methods &block
|
75
|
-
self.class_prototype.class_eval &block
|
76
|
-
# self.extend self.class.prototype
|
77
|
-
end
|
78
|
-
|
79
|
-
def inherit *classes
|
80
|
-
classes.each do |klass|
|
81
|
-
raise "You can inherit classes only ('#{klass}')!" unless klass.class == Class
|
82
|
-
|
83
|
-
prototype.fixed_include klass.prototype
|
84
|
-
# self.include prototype
|
85
|
-
|
86
|
-
class_prototype.fixed_include klass.class_prototype
|
87
|
-
# (class << self; self end).include class_prototype
|
88
|
-
|
89
|
-
# callback
|
90
|
-
klass.inherited self if klass.respond_to? :inherited
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
|
96
|
-
#
|
97
|
-
# Sugar
|
98
|
-
#
|
99
|
-
Class.class_eval do
|
100
|
-
alias_method :instance_methods_without_prototype, :instance_methods
|
101
|
-
def instance_methods *args, &block
|
102
|
-
if block
|
103
|
-
define_instance_methods &block
|
104
|
-
else
|
105
|
-
instance_methods_without_prototype
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
alias_method :class_methods, :define_class_methods
|
110
|
-
end
|
data/lib/ruby_ext/should.rb
DELETED
@@ -1,166 +0,0 @@
|
|
1
|
-
class AssertionError < StandardError; end
|
2
|
-
|
3
|
-
Object.class_eval do
|
4
|
-
def should_be! method
|
5
|
-
unless self.send("#{method}?") == true
|
6
|
-
raise AssertionError, "
|
7
|
-
ASSERTION FAILED (#{caller[0]}):
|
8
|
-
#{self.inspect} should be #{method}
|
9
|
-
", caller
|
10
|
-
end
|
11
|
-
|
12
|
-
return self
|
13
|
-
end
|
14
|
-
alias_method :should_have!, :should_be!
|
15
|
-
|
16
|
-
def should_not_be! method
|
17
|
-
unless self.send("#{method}?") == false
|
18
|
-
raise AssertionError, "
|
19
|
-
ASSERTION FAILED (#{caller[0]}):
|
20
|
-
#{self.inspect} should not be #{method}
|
21
|
-
", caller
|
22
|
-
end
|
23
|
-
|
24
|
-
return self
|
25
|
-
end
|
26
|
-
alias_method :should_not_have!, :should_not_be!
|
27
|
-
|
28
|
-
def should! cmd, arg = NotDefined
|
29
|
-
result = case cmd
|
30
|
-
when :be_never_called then
|
31
|
-
false
|
32
|
-
|
33
|
-
when :be_nil then
|
34
|
-
self.equal? nil
|
35
|
-
|
36
|
-
when :be_a
|
37
|
-
if arg.class == Array
|
38
|
-
arg.any?{|klass| self.is_a? klass}
|
39
|
-
else
|
40
|
-
self.is_a? arg
|
41
|
-
end
|
42
|
-
|
43
|
-
when :be_an
|
44
|
-
if arg.class == Array
|
45
|
-
arg.any?{|klass| self.is_a? klass}
|
46
|
-
else
|
47
|
-
self.is_a? arg
|
48
|
-
end
|
49
|
-
|
50
|
-
when :be
|
51
|
-
if arg.class == Array
|
52
|
-
arg.any?{|klass| self.respond_to :is?, klass}
|
53
|
-
else
|
54
|
-
self.respond_to :is?, arg
|
55
|
-
end
|
56
|
-
|
57
|
-
when :include then
|
58
|
-
self.include? arg
|
59
|
-
|
60
|
-
when :be_in then
|
61
|
-
arg.include? self
|
62
|
-
|
63
|
-
when :be_true then
|
64
|
-
self
|
65
|
-
|
66
|
-
when :be_false then
|
67
|
-
!self
|
68
|
-
|
69
|
-
when :be_empty then
|
70
|
-
self.empty?
|
71
|
-
|
72
|
-
else
|
73
|
-
if arg.equal? NotDefined
|
74
|
-
self.send cmd
|
75
|
-
else
|
76
|
-
self.send cmd, arg
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
unless result
|
81
|
-
unless arg.equal? NotDefined
|
82
|
-
raise AssertionError, "
|
83
|
-
ASSERTION FAILED (#{caller[0]}):
|
84
|
-
#{self.inspect} should #{cmd} #{arg.inspect}
|
85
|
-
", caller
|
86
|
-
else
|
87
|
-
raise AssertionError, "
|
88
|
-
ASSERTION FAILED (#{caller[0]}):
|
89
|
-
#{self.inspect} should #{cmd}
|
90
|
-
", caller
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
return self
|
95
|
-
end
|
96
|
-
|
97
|
-
def should_not! cmd, arg = NotDefined
|
98
|
-
result =
|
99
|
-
case cmd
|
100
|
-
when :be_never_called then
|
101
|
-
false
|
102
|
-
|
103
|
-
when :be_nil then
|
104
|
-
self.equal? nil
|
105
|
-
|
106
|
-
when :be_a
|
107
|
-
if arg.class == Array
|
108
|
-
arg.any?{|klass| self.is_a? klass}
|
109
|
-
else
|
110
|
-
self.is_a? arg
|
111
|
-
end
|
112
|
-
|
113
|
-
when :be_an
|
114
|
-
if arg.class == Array
|
115
|
-
arg.any?{|klass| self.is_a? klass}
|
116
|
-
else
|
117
|
-
self.is_a? arg
|
118
|
-
end
|
119
|
-
|
120
|
-
when :be
|
121
|
-
if arg.class == Array
|
122
|
-
arg.any?{|klass| self.respond_to :is?, klass}
|
123
|
-
else
|
124
|
-
self.respond_to :is?, arg
|
125
|
-
end
|
126
|
-
|
127
|
-
when :include then
|
128
|
-
self.include? arg
|
129
|
-
|
130
|
-
when :be_in then
|
131
|
-
arg.include? self
|
132
|
-
|
133
|
-
when :be_true then
|
134
|
-
self
|
135
|
-
|
136
|
-
when :be_false then
|
137
|
-
!self
|
138
|
-
|
139
|
-
when :be_empty then
|
140
|
-
self.empty?
|
141
|
-
|
142
|
-
else
|
143
|
-
if arg.equal? NotDefined
|
144
|
-
self.send cmd
|
145
|
-
else
|
146
|
-
self.send cmd, arg
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
if result
|
151
|
-
unless arg.equal? NotDefined
|
152
|
-
raise AssertionError, "
|
153
|
-
ASSERTION FAILED (#{caller[0]}):
|
154
|
-
#{self.inspect} should not #{cmd} #{arg.inspect}
|
155
|
-
", caller
|
156
|
-
else
|
157
|
-
raise AssertionError, "
|
158
|
-
ASSERTION FAILED (#{caller[0]}):
|
159
|
-
#{self.inspect} should not #{cmd}
|
160
|
-
", caller
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
return self
|
165
|
-
end
|
166
|
-
end
|
data/lib/rubyopt.rb
DELETED
@@ -1,190 +0,0 @@
|
|
1
|
-
require "#{File.dirname __FILE__}/helper"
|
2
|
-
require "ruby_ext/prototype_inheritance"
|
3
|
-
|
4
|
-
describe "Prototype Inheritance" do
|
5
|
-
after :each do
|
6
|
-
remove_constants %w(A B C)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should define and override methods" do
|
10
|
-
class A
|
11
|
-
instance_methods do
|
12
|
-
def instance_method
|
13
|
-
'first version'
|
14
|
-
end
|
15
|
-
end
|
16
|
-
class_methods do
|
17
|
-
def class_method
|
18
|
-
'first version'
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
A.new.instance_method.should == "first version"
|
24
|
-
A.class_method.should == "first version"
|
25
|
-
|
26
|
-
|
27
|
-
A.instance_methods do
|
28
|
-
def instance_method
|
29
|
-
'second version'
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
A.class_methods do
|
34
|
-
def class_method
|
35
|
-
'second version'
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
A.new.instance_method.should == "second version"
|
40
|
-
A.class_method.should == "second version"
|
41
|
-
end
|
42
|
-
|
43
|
-
it "showcase" do
|
44
|
-
class A
|
45
|
-
instance_methods do
|
46
|
-
def a; end
|
47
|
-
|
48
|
-
def overrided_method
|
49
|
-
'a version'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
class_methods do
|
54
|
-
def class_a; end
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.inherited target
|
58
|
-
target.prototype.send :attr_accessor, :some_accessor
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
class B
|
63
|
-
instance_methods do
|
64
|
-
def b; end
|
65
|
-
|
66
|
-
def overrided_method
|
67
|
-
'b version'
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
class_methods do
|
72
|
-
def class_b; end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
class C
|
77
|
-
inherit A, B
|
78
|
-
end
|
79
|
-
|
80
|
-
c = C.new
|
81
|
-
c.should respond_to(:a)
|
82
|
-
c.should respond_to(:b)
|
83
|
-
c.should respond_to(:some_accessor)
|
84
|
-
|
85
|
-
C.should respond_to(:class_a)
|
86
|
-
C.should respond_to(:class_b)
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should inherit all ancestors class methods (and take order into account by overriding)" do
|
90
|
-
class A
|
91
|
-
instance_methods do
|
92
|
-
def a; end
|
93
|
-
|
94
|
-
def overrided
|
95
|
-
'a'
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
class_methods do
|
100
|
-
def class_a; end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
class B
|
105
|
-
inherit A
|
106
|
-
|
107
|
-
instance_methods do
|
108
|
-
def b; end
|
109
|
-
|
110
|
-
def overrided
|
111
|
-
'b'
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
class_methods do
|
116
|
-
def class_b; end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
class C
|
121
|
-
inherit B
|
122
|
-
end
|
123
|
-
|
124
|
-
c = C.new
|
125
|
-
c.should respond_to(:a)
|
126
|
-
c.should respond_to(:b)
|
127
|
-
c.overrided.should == 'b'
|
128
|
-
|
129
|
-
C.should respond_to(:class_a)
|
130
|
-
C.should respond_to(:class_b)
|
131
|
-
|
132
|
-
C.instance_methods do
|
133
|
-
def overrided
|
134
|
-
'c'
|
135
|
-
end
|
136
|
-
end
|
137
|
-
c = C.new
|
138
|
-
c.overrided.should == 'c'
|
139
|
-
end
|
140
|
-
|
141
|
-
it "shouldn't redefine ancestors class methods (from error)" do
|
142
|
-
class A
|
143
|
-
class_methods do
|
144
|
-
def class_method; end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
class B
|
149
|
-
inherit A
|
150
|
-
|
151
|
-
class_methods do
|
152
|
-
def class_method2; end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
A.should_not respond_to(:class_method2)
|
157
|
-
end
|
158
|
-
|
159
|
-
it "methods defined on base class after inheritance must be propagated to all descendants" do
|
160
|
-
class A; end
|
161
|
-
|
162
|
-
class B
|
163
|
-
inherit A
|
164
|
-
end
|
165
|
-
|
166
|
-
B.instance_methods.should_not include('method_added_after_inheritance')
|
167
|
-
A.prototype.send(:define_method, :method_added_after_inheritance){}
|
168
|
-
A.instance_methods.should include('method_added_after_inheritance')
|
169
|
-
B.instance_methods.should include('method_added_after_inheritance')
|
170
|
-
end
|
171
|
-
|
172
|
-
it "classes included in base class after inheritance must be propagated to all descendants" do
|
173
|
-
class A; end
|
174
|
-
|
175
|
-
class B
|
176
|
-
inherit A
|
177
|
-
end
|
178
|
-
|
179
|
-
class C
|
180
|
-
instance_methods do
|
181
|
-
def module_added_after_inheritance; end
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
A.instance_methods.should_not include('module_added_after_inheritance')
|
186
|
-
A.inherit C
|
187
|
-
A.instance_methods.should include('module_added_after_inheritance')
|
188
|
-
B.instance_methods.should include('module_added_after_inheritance')
|
189
|
-
end
|
190
|
-
end
|