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 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.5
1
+ 0.1.6
@@ -12,20 +12,24 @@ class Object
12
12
 
13
13
  def extend(*modules)
14
14
  modules.each do |mod|
15
- wrap_unextendable_module mod if mod.unextendable?
16
- add_extended_module mod
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 modules.empty?
23
- meta_class.extended_modules.delete_if do |mod|
24
- unextend? mod, &block
25
- end
26
- else
27
- modules.each do |mod|
28
- meta_class.extended_modules.delete mod if unextend? mod, &block
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
@@ -1,7 +1,7 @@
1
1
  module Unextendable
2
2
  MAJOR = 0
3
3
  MINOR = 1
4
- TINY = 5
4
+ TINY = 6
5
5
 
6
6
  VERSION = [MAJOR, MINOR, TINY].join(".")
7
7
  end
@@ -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
@@ -1,6 +1,6 @@
1
1
  require File.expand_path("../test_helper", __FILE__)
2
2
 
3
- class ObjectInstanceTest < Test::Unit::TestCase
3
+ class ObjectTest < Test::Unit::TestCase
4
4
 
5
5
  context "An object instance" do
6
6
  setup do
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
- date: 2011-07-01 00:00:00 +02:00
14
- default_executable:
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
- prerelease: false
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: "0"
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
- requirement: &id002 !ruby/object:Gem::Requirement
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: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
36
33
  type: :development
37
- version_requirements: *id002
38
- 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."
39
- email:
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/object_instance_test.rb
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: "0"
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: "0"
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
87
  requirements: []
88
-
89
88
  rubyforge_project: unextendable
90
- rubygems_version: 1.6.2
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 possible
94
- test_files:
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/object_instance_test.rb
97
+ - test/object_test.rb
97
98
  - test/test_helper.rb