unextendable 0.1.5 → 0.1.6
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 +6 -0
- data/VERSION +1 -1
- data/lib/unextendable/object.rb +13 -9
- data/lib/unextendable/version.rb +1 -1
- data/test/blank_object_test.rb +52 -0
- data/test/{object_instance_test.rb → object_test.rb} +1 -1
- metadata +51 -50
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
= Unextendable CHANGELOG
|
2
2
|
|
3
|
+
== Version 0.1.6 (January 9, 2012)
|
4
|
+
|
5
|
+
* Being able to tackle 'BlankObject instances' when extending:
|
6
|
+
A 'BlankObject class' is considered not to have meta_class and unextend defined, but does respond to extend (e.g. Liquid::Strainer)
|
7
|
+
See also: http://rubydoc.info/gems/liquid/2.3.0/Liquid/Strainer
|
8
|
+
|
3
9
|
== Version 0.1.5 (July 1, 2011)
|
4
10
|
|
5
11
|
* Fixed bug: respond_to? did not return true for a non-overridden instance method after extending an unextendable module
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.6
|
data/lib/unextendable/object.rb
CHANGED
@@ -12,20 +12,24 @@ class Object
|
|
12
12
|
|
13
13
|
def extend(*modules)
|
14
14
|
modules.each do |mod|
|
15
|
-
|
16
|
-
|
15
|
+
if respond_to?(:meta_class)
|
16
|
+
wrap_unextendable_module mod if mod.unextendable?
|
17
|
+
add_extended_module mod
|
18
|
+
end
|
17
19
|
super(mod)
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
23
|
def unextend(*modules, &block)
|
22
|
-
if
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
if respond_to?(:meta_class)
|
25
|
+
if modules.empty?
|
26
|
+
meta_class.extended_modules.delete_if do |mod|
|
27
|
+
unextend? mod, &block
|
28
|
+
end
|
29
|
+
else
|
30
|
+
modules.each do |mod|
|
31
|
+
meta_class.extended_modules.delete mod if unextend? mod, &block
|
32
|
+
end
|
29
33
|
end
|
30
34
|
end
|
31
35
|
end
|
data/lib/unextendable/version.rb
CHANGED
@@ -0,0 +1,52 @@
|
|
1
|
+
require File.expand_path("../test_helper", __FILE__)
|
2
|
+
|
3
|
+
class BlankObjectTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
# ==================================================================================================================================
|
6
|
+
# A BlankObject class is considered not to have meta_class and unextend defined, but does respond to extend (e.g. Liquid::Strainer)
|
7
|
+
# See also: http://rubydoc.info/gems/liquid/2.3.0/Liquid/Strainer
|
8
|
+
# ==================================================================================================================================
|
9
|
+
|
10
|
+
context "A blank object instance" do
|
11
|
+
setup do
|
12
|
+
module Hi
|
13
|
+
unextendable
|
14
|
+
def say_hi
|
15
|
+
"Hi!"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
class BlankObject
|
19
|
+
def meta_class
|
20
|
+
raise NoMethodError
|
21
|
+
end
|
22
|
+
def unextend
|
23
|
+
raise NoMethodError
|
24
|
+
end
|
25
|
+
def respond_to?(symbol, include_private = false)
|
26
|
+
return false if %w(meta_class unextend).include? symbol.to_s
|
27
|
+
super
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
should "have extend defined" do
|
33
|
+
assert BlankObject.new.extend(Hi)
|
34
|
+
end
|
35
|
+
|
36
|
+
should "not have meta_class and unextend defined" do
|
37
|
+
assert_raises NoMethodError do
|
38
|
+
BlankObject.new.meta_class
|
39
|
+
end
|
40
|
+
assert_raises NoMethodError do
|
41
|
+
BlankObject.new.unextend
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
should "be extendable" do
|
46
|
+
b = BlankObject.new
|
47
|
+
b.extend Hi
|
48
|
+
assert_equal "Hi!", b.say_hi
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
metadata
CHANGED
@@ -1,50 +1,52 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: unextendable
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.6
|
4
5
|
prerelease:
|
5
|
-
version: 0.1.5
|
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
|
-
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-01-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
17
15
|
name: shoulda
|
18
|
-
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2152388140 !ruby/object:Gem::Requirement
|
20
17
|
none: false
|
21
|
-
requirements:
|
22
|
-
- -
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
25
22
|
type: :development
|
26
|
-
version_requirements: *id001
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: mocha
|
29
23
|
prerelease: false
|
30
|
-
|
24
|
+
version_requirements: *2152388140
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: mocha
|
27
|
+
requirement: &2152384460 !ruby/object:Gem::Requirement
|
31
28
|
none: false
|
32
|
-
requirements:
|
33
|
-
- -
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version:
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
36
33
|
type: :development
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2152384460
|
36
|
+
description: ! 'Unextendable originated from the thought of being able to implement
|
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:
|
40
45
|
- paul.engel@holder.nl
|
41
46
|
executables: []
|
42
|
-
|
43
47
|
extensions: []
|
44
|
-
|
45
48
|
extra_rdoc_files: []
|
46
|
-
|
47
|
-
files:
|
49
|
+
files:
|
48
50
|
- .gitignore
|
49
51
|
- CHANGELOG.rdoc
|
50
52
|
- Gemfile
|
@@ -59,39 +61,38 @@ files:
|
|
59
61
|
- lib/unextendable/version.rb
|
60
62
|
- script/console
|
61
63
|
- script/definitions.rb
|
64
|
+
- test/blank_object_test.rb
|
62
65
|
- test/module_test.rb
|
63
|
-
- test/
|
66
|
+
- test/object_test.rb
|
64
67
|
- test/test_helper.rb
|
65
68
|
- unextendable.gemspec
|
66
|
-
has_rdoc: true
|
67
69
|
homepage: https://github.com/archan937/unextendable
|
68
70
|
licenses: []
|
69
|
-
|
70
71
|
post_install_message:
|
71
72
|
rdoc_options: []
|
72
|
-
|
73
|
-
require_paths:
|
73
|
+
require_paths:
|
74
74
|
- lib
|
75
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
76
|
none: false
|
77
|
-
requirements:
|
78
|
-
- -
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
version:
|
81
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ! '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
82
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version:
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
87
|
requirements: []
|
88
|
-
|
89
88
|
rubyforge_project: unextendable
|
90
|
-
rubygems_version: 1.
|
89
|
+
rubygems_version: 1.8.10
|
91
90
|
signing_key:
|
92
91
|
specification_version: 3
|
93
|
-
summary: A small gem making unextending extended module methods within object instances
|
94
|
-
|
92
|
+
summary: A small gem making unextending extended module methods within object instances
|
93
|
+
possible
|
94
|
+
test_files:
|
95
|
+
- test/blank_object_test.rb
|
95
96
|
- test/module_test.rb
|
96
|
-
- test/
|
97
|
+
- test/object_test.rb
|
97
98
|
- test/test_helper.rb
|