unextendable 0.1.6 → 0.1.7
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.rdoc +4 -0
- data/VERSION +1 -1
- data/lib/unextendable/module.rb +6 -0
- data/lib/unextendable/object.rb +5 -5
- data/lib/unextendable/version.rb +1 -1
- data/test/object_test.rb +33 -4
- metadata +47 -47
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
= Unextendable CHANGELOG
|
2
2
|
|
3
|
+
== Version 0.1.7 (August 15, 2012)
|
4
|
+
|
5
|
+
* Support (un-)extending private / protected methods. Thanks Stephan Kaag (@stephankaag) for contributing
|
6
|
+
|
3
7
|
== Version 0.1.6 (January 9, 2012)
|
4
8
|
|
5
9
|
* Being able to tackle 'BlankObject instances' when extending:
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.7
|
data/lib/unextendable/module.rb
CHANGED
data/lib/unextendable/object.rb
CHANGED
@@ -43,7 +43,7 @@ private
|
|
43
43
|
def wrap_unextendable_module(mod)
|
44
44
|
return unless (mod.class == Module) && mod.unextendable?
|
45
45
|
|
46
|
-
mod.
|
46
|
+
mod.my_methods.each do |method_name|
|
47
47
|
wrap_unextendable_method method_name
|
48
48
|
end
|
49
49
|
|
@@ -51,12 +51,12 @@ private
|
|
51
51
|
|
52
52
|
instance_eval <<-CODE
|
53
53
|
def respond_to?(symbol, include_private = false)
|
54
|
-
meta_class.extended_modules.any?{|x| x.
|
54
|
+
meta_class.extended_modules.any?{|x| x.my_methods(include_private).collect(&:to_s).include? symbol.to_s} ||
|
55
55
|
begin
|
56
56
|
if meta_class.method_procs.has_key? symbol.to_s
|
57
57
|
meta_class.method_procs[symbol.to_s].class == Proc
|
58
58
|
else
|
59
|
-
self.class.
|
59
|
+
self.class.my_methods(include_private).collect(&:to_s).include? symbol.to_s
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -68,7 +68,7 @@ private
|
|
68
68
|
def wrap_unextendable_method(method_name)
|
69
69
|
return if meta_class.method_procs.key? method_name.to_s
|
70
70
|
|
71
|
-
meta_class.method_procs[method_name.to_s] = respond_to?(method_name) ? method(method_name.to_s).to_proc : nil
|
71
|
+
meta_class.method_procs[method_name.to_s] = respond_to?(method_name, true) ? method(method_name.to_s).to_proc : nil
|
72
72
|
|
73
73
|
instance_eval <<-CODE
|
74
74
|
def #{method_name}(*args, &block)
|
@@ -91,7 +91,7 @@ private
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def method_for(method_name)
|
94
|
-
mod = meta_class.extended_modules.detect{|x| x.
|
94
|
+
mod = meta_class.extended_modules.detect{|x| x.my_methods.collect(&:to_s).include? method_name.to_s}
|
95
95
|
mod ? mod.instance_method(method_name).bind(self) : proc_for(method_name)
|
96
96
|
end
|
97
97
|
|
data/lib/unextendable/version.rb
CHANGED
data/test/object_test.rb
CHANGED
@@ -17,6 +17,10 @@ class ObjectTest < Test::Unit::TestCase
|
|
17
17
|
def name
|
18
18
|
"C"
|
19
19
|
end
|
20
|
+
private
|
21
|
+
def id
|
22
|
+
"C"
|
23
|
+
end
|
20
24
|
end
|
21
25
|
@c = C.new
|
22
26
|
@c.title = "Mr."
|
@@ -72,6 +76,14 @@ class ObjectTest < Test::Unit::TestCase
|
|
72
76
|
|
73
77
|
context "which are unextendable" do
|
74
78
|
setup do
|
79
|
+
module B
|
80
|
+
unextendable
|
81
|
+
public
|
82
|
+
def id
|
83
|
+
"B"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
75
87
|
module U
|
76
88
|
unextendable
|
77
89
|
def name
|
@@ -80,6 +92,10 @@ class ObjectTest < Test::Unit::TestCase
|
|
80
92
|
def foo
|
81
93
|
"bar"
|
82
94
|
end
|
95
|
+
private
|
96
|
+
def id
|
97
|
+
"U"
|
98
|
+
end
|
83
99
|
end
|
84
100
|
end
|
85
101
|
|
@@ -95,14 +111,14 @@ class ObjectTest < Test::Unit::TestCase
|
|
95
111
|
end
|
96
112
|
|
97
113
|
should "call wrap_unextendable_method" do
|
98
|
-
@c.expects(:wrap_unextendable_method).
|
114
|
+
@c.expects(:wrap_unextendable_method).times(3)
|
99
115
|
@c.extend U
|
100
116
|
end
|
101
117
|
|
102
118
|
should "add nil value as method proc when not responding to module method name" do
|
103
119
|
@c.extend U
|
104
120
|
assert_equal 1, @c.meta_class.method_procs.select{|k, v| v.nil?}.size
|
105
|
-
assert_equal
|
121
|
+
assert_equal 2, @c.meta_class.method_procs.select{|k, v| v.class == Proc}.size
|
106
122
|
end
|
107
123
|
|
108
124
|
should "add the module to extended_modules" do
|
@@ -114,7 +130,7 @@ class ObjectTest < Test::Unit::TestCase
|
|
114
130
|
should "add method proc to method_procs" do
|
115
131
|
assert @c.meta_class.send(:method_procs).empty?
|
116
132
|
@c.extend U
|
117
|
-
assert_equal
|
133
|
+
assert_equal 3, @c.meta_class.send(:method_procs).size
|
118
134
|
end
|
119
135
|
|
120
136
|
context "when calling an unextendable method" do
|
@@ -151,11 +167,24 @@ class ObjectTest < Test::Unit::TestCase
|
|
151
167
|
|
152
168
|
context "when unextending the module afterwards" do
|
153
169
|
should "remove the module from extended_modules" do
|
170
|
+
exception = assert_raises(NoMethodError) do
|
171
|
+
@c.id
|
172
|
+
end
|
173
|
+
assert_equal "private method `id' called for", exception.message[0..29]
|
174
|
+
assert_equal "C", @c.send(:id)
|
175
|
+
|
154
176
|
@c.extend U
|
155
177
|
assert @c.meta_class.extended_modules.include?(U)
|
178
|
+
assert_equal "private method `id' called for", exception.message[0..29]
|
179
|
+
assert_equal "U", @c.send(:id)
|
180
|
+
|
181
|
+
@c.extend B
|
182
|
+
assert_equal "B", @c.send(:id)
|
156
183
|
|
157
|
-
@c.unextend
|
184
|
+
@c.unextend
|
158
185
|
assert !@c.meta_class.extended_modules.include?(U)
|
186
|
+
assert_equal "private method `id' called for", exception.message[0..29]
|
187
|
+
assert_equal "C", @c.send(:id)
|
159
188
|
end
|
160
189
|
|
161
190
|
should "remove the module but when passed a block only when it passes" do
|
metadata
CHANGED
@@ -1,52 +1,49 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: unextendable
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.6
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 0.1.7
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Paul Engel
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
|
13
|
+
date: 2012-08-15 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
15
16
|
name: shoulda
|
16
|
-
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
19
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version:
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
22
24
|
type: :development
|
23
|
-
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
26
27
|
name: mocha
|
27
|
-
|
28
|
+
prerelease: false
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
30
|
none: false
|
29
|
-
requirements:
|
30
|
-
- -
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version:
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0"
|
33
35
|
type: :development
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
the State pattern within object instances using modules. In other words: I wanted
|
38
|
-
object instances to behave dependent on their state using modules. I really want
|
39
|
-
to use modules because they are commonly used to define a set of methods which you
|
40
|
-
can extend within an object instance. Unfortunately, you cannot just unexclude a
|
41
|
-
module. So after searching the web for solutions, I came across Mixology, evil-ruby
|
42
|
-
and StatePattern. But they slightly did not fit the picture. So after doing some
|
43
|
-
research, I came up with Unextendable.'
|
44
|
-
email:
|
36
|
+
version_requirements: *id002
|
37
|
+
description: "Unextendable originated from the thought of being able to implement the State pattern within object instances using modules. In other words: I wanted object instances to behave dependent on their state using modules. I really want to use modules because they are commonly used to define a set of methods which you can extend within an object instance. Unfortunately, you cannot just unexclude a module. So after searching the web for solutions, I came across Mixology, evil-ruby and StatePattern. But they slightly did not fit the picture. So after doing some research, I came up with Unextendable."
|
38
|
+
email:
|
45
39
|
- paul.engel@holder.nl
|
46
40
|
executables: []
|
41
|
+
|
47
42
|
extensions: []
|
43
|
+
|
48
44
|
extra_rdoc_files: []
|
49
|
-
|
45
|
+
|
46
|
+
files:
|
50
47
|
- .gitignore
|
51
48
|
- CHANGELOG.rdoc
|
52
49
|
- Gemfile
|
@@ -68,31 +65,34 @@ files:
|
|
68
65
|
- unextendable.gemspec
|
69
66
|
homepage: https://github.com/archan937/unextendable
|
70
67
|
licenses: []
|
68
|
+
|
71
69
|
post_install_message:
|
72
70
|
rdoc_options: []
|
73
|
-
|
71
|
+
|
72
|
+
require_paths:
|
74
73
|
- lib
|
75
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
75
|
none: false
|
77
|
-
requirements:
|
78
|
-
- -
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
version:
|
81
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: "0"
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
81
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version:
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: "0"
|
87
86
|
requirements: []
|
87
|
+
|
88
88
|
rubyforge_project: unextendable
|
89
|
-
rubygems_version: 1.8.
|
89
|
+
rubygems_version: 1.8.17
|
90
90
|
signing_key:
|
91
91
|
specification_version: 3
|
92
|
-
summary: A small gem making unextending extended module methods within object instances
|
93
|
-
|
94
|
-
test_files:
|
92
|
+
summary: A small gem making unextending extended module methods within object instances possible
|
93
|
+
test_files:
|
95
94
|
- test/blank_object_test.rb
|
96
95
|
- test/module_test.rb
|
97
96
|
- test/object_test.rb
|
98
97
|
- test/test_helper.rb
|
98
|
+
has_rdoc:
|