object2module 0.4.0-i386-mswin32 → 0.4.2-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown ADDED
@@ -0,0 +1,75 @@
1
+ Object2module
2
+ =============
3
+
4
+ (C) John Mair (banisterfiend) 2010
5
+
6
+ _Enables Classes and Objects to be mixed into ancestor chains_
7
+
8
+ Using Object2module you can treat classes and object (their singletons, anyway) as if they were modules and include or extend them into ancestor chains.
9
+
10
+ Object2module provides the `gen_include` and `gen_extend` methods which are generalizations of the traditional `include` and `extend`.
11
+
12
+ * Install the [gem](https://rubygems.org/gems/object2module): `gem install object2module`
13
+ * Read the [documentation](http://rdoc.info/github/banister/object2module/master/file/README.markdown)
14
+ * See the [source code](http://github.com/banister/object2module)
15
+
16
+ example: gen_include()
17
+ --------------------------
18
+
19
+ Using `gen_include` we can include a class into another class:
20
+
21
+
22
+ class C
23
+ def hello
24
+ :hello
25
+ end
26
+ end
27
+
28
+ class D
29
+ gen_include C
30
+ end
31
+
32
+ D.new.hello #=> :hello
33
+ D.ancestors #=> [D, C, Object, ...]
34
+
35
+ example: gen_extend()
36
+ --------------------
37
+
38
+ `gen_extend` lets us mix objects into objects:
39
+
40
+ o = Object.new
41
+ class << o
42
+ def bye
43
+ :bye
44
+ end
45
+ end
46
+
47
+ n = Object.new
48
+ n.gen_extend o
49
+ n.bye #=> :bye
50
+
51
+ How it works
52
+ --------------
53
+
54
+ Object2module simply removes the check for `T_MODULE` from `rb_include_module()`
55
+
56
+ Companion Libraries
57
+ --------------------
58
+
59
+ Remix is one of a series of experimental libraries that mess with
60
+ the internals of Ruby to bring new and interesting functionality to
61
+ the language, see also:
62
+
63
+ * [Remix](http://github.com/banister/remix) - Makes ancestor chains read/write
64
+ * [Real Include](http://github.com/banister/real_include) - Brings in
65
+ module singleton classes during an include. No more ugly ClassMethods and included() hook hacks.
66
+ * [Prepend](http://github.com/banister/prepend) - Prepends modules in front of a class; so method lookup starts with the module
67
+ * [GenEval](http://github.com/banister/gen_eval) - A strange new breed of instance_eval
68
+
69
+ Contact
70
+ -------
71
+
72
+ Problems or questions contact me at [github](http://github.com/banister)
73
+
74
+
75
+
data/Rakefile CHANGED
@@ -1,7 +1,6 @@
1
1
  # Rakefile added by John Mair (banisterfiend)
2
2
 
3
3
  require 'rake/gempackagetask'
4
- require 'rake/rdoctask'
5
4
  require 'rake/clean'
6
5
  require './lib/object2module/version.rb'
7
6
 
@@ -11,7 +10,6 @@ direc = File.dirname(__FILE__)
11
10
  CLEAN.include("ext/**/*.#{dlext}", "ext/**/.log", "ext/**/.o", "ext/**/*~", "ext/**/*#*", "ext/**/.obj", "ext/**/.def", "ext/**/.pdb")
12
11
  CLOBBER.include("**/*.#{dlext}", "**/*~", "**/*#*", "**/*.log", "**/*.o", "doc/**")
13
12
 
14
-
15
13
  def apply_spec_defaults(s)
16
14
  s.name = "object2module"
17
15
  s.summary = "object2module enables ruby classes and objects to be used as modules"
@@ -19,13 +17,12 @@ def apply_spec_defaults(s)
19
17
  s.version = Object2module::VERSION
20
18
  s.author = "John Mair (banisterfiend)"
21
19
  s.email = 'jrmair@gmail.com'
22
- s.has_rdoc = true
20
+ s.has_rdoc = 'yard'
23
21
  s.date = Time.now.strftime '%Y-%m-%d'
24
22
  s.require_path = 'lib'
25
23
  s.homepage = "http://banisterfiend.wordpress.com"
26
24
  end
27
25
 
28
-
29
26
  task :test do
30
27
  sh "bacon -k #{direc}/test/test.rb"
31
28
  end
@@ -35,7 +32,7 @@ end
35
32
  spec = Gem::Specification.new do |s|
36
33
  apply_spec_defaults(s)
37
34
  s.platform = "i386-#{v}"
38
- s.files = FileList["Rakefile", "README", "LICENSE",
35
+ s.files = FileList["Rakefile", "README.markdown", "LICENSE",
39
36
  "lib/object2module.rb", "lib/1.8/object2module.#{dlext}",
40
37
  "lib/1.9/object2module.#{dlext}", "lib/object2module/version.rb", "test/*.rb"].to_a
41
38
  end
@@ -53,7 +50,7 @@ task :ruby do
53
50
  spec = Gem::Specification.new do |s|
54
51
  apply_spec_defaults(s)
55
52
  s.platform = Gem::Platform::RUBY
56
- s.files = FileList["Rakefile", "README", "LICENSE",
53
+ s.files = FileList["Rakefile", "README.markdown", "LICENSE",
57
54
  "lib/object2module.rb","lib/object2module/version.rb",
58
55
  "test/*.rb", "ext/**/extconf.rb", "ext/**/*.h", "ext/**/*.c"].to_a
59
56
  s.extensions = ["ext/object2module/extconf.rb"]
@@ -67,7 +64,3 @@ task :ruby do
67
64
  Rake::Task[:gem].invoke
68
65
  end
69
66
 
70
- Rake::RDocTask.new do |rd|
71
- rd.main = "README.rdoc"
72
- rd.rdoc_files.include("README.rdoc", "lib/object2module.rb")
73
- end
Binary file
Binary file
data/lib/object2module.rb CHANGED
@@ -28,7 +28,7 @@ class Object
28
28
  def __gen_extend_or_include__(extend_or_include, *objs) #:nodoc:
29
29
  raise ArgumentError, "wrong number of arguments (at least 1)" if objs.empty?
30
30
 
31
- objs.each { |mod|
31
+ objs.reverse.each { |mod|
32
32
  send(extend_or_include, mod)
33
33
  }
34
34
 
@@ -1,3 +1,3 @@
1
1
  module Object2module
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.2"
3
3
  end
@@ -0,0 +1,147 @@
1
+ direc = File.dirname(__FILE__)
2
+ require 'rubygems'
3
+ require 'bacon'
4
+ require 'remix'
5
+ require "#{direc}/../lib/object2module"
6
+
7
+
8
+ class Module
9
+ public :include, :remove_const
10
+ end
11
+
12
+ describe Object2module do
13
+ before do
14
+ class A
15
+ def hello
16
+ :a
17
+ end
18
+ end
19
+
20
+ class B
21
+ def hello
22
+ :b
23
+ end
24
+ end
25
+
26
+ module M
27
+ def m
28
+ :m
29
+ end
30
+ end
31
+
32
+ O = Object.new
33
+ class << O
34
+ def o
35
+ :o
36
+ end
37
+ end
38
+
39
+ C = Class.new
40
+ end
41
+
42
+ after do
43
+ Object.remove_const(:A)
44
+ Object.remove_const(:B)
45
+ Object.remove_const(:C)
46
+ Object.remove_const(:M)
47
+ Object.remove_const(:O)
48
+ end
49
+
50
+ describe 'gen_include' do
51
+ it 'includes two classes and swaps them' do
52
+ C.gen_include A
53
+ C.gen_include B
54
+ C.new.hello.should == :b
55
+ C.swap_modules A, B
56
+ C.new.hello.should == :a
57
+ end
58
+
59
+ it 'includes a class into a class and swaps them' do
60
+ A.gen_include B
61
+ C.gen_include A
62
+ C.new.hello.should == :a
63
+ C.swap_modules A, B
64
+ C.new.hello.should == :b
65
+ end
66
+
67
+ it 'unincludes a gen_included class' do
68
+ C.gen_include A
69
+ C.new.hello.should == :a
70
+ C.uninclude A
71
+ lambda { C.new.hello }.should.raise NameError
72
+ end
73
+
74
+ it 'recursively unincludes a gen_included class' do
75
+ A.gen_include B
76
+ C.gen_include A
77
+ C.new.hello.should == :a
78
+ C.ancestors.should[0..2] == [C, A, B]
79
+ C.uninclude A, true
80
+ C.ancestors.should[0..1] == [C, Object]
81
+ end
82
+
83
+ it 'unincludes a singleton class' do
84
+ o = Object.new
85
+ class << o
86
+ def hello
87
+ :o
88
+ end
89
+ end
90
+
91
+ C.gen_include o
92
+ C.new.hello.should == :o
93
+ C.uninclude C.ancestors[1]
94
+ lambda { C.new.hello }.should.raise NameError
95
+ C.ancestors[1].should == Object
96
+ end
97
+ end
98
+
99
+ describe 'gen_extend' do
100
+ it 'extends two classes into an object and swaps them' do
101
+ o = Object.new
102
+ o.gen_extend A, B
103
+ o.hello.should == :a
104
+ end
105
+
106
+ it 'unextends a class from an object' do
107
+ o = Object.new
108
+ o.gen_extend A
109
+ o.hello.should == :a
110
+ o.singleton_class.ancestors[0].should == A
111
+ o.unextend A
112
+ lambda { o.hello }.should.raise NameError
113
+ o.singleton_class.ancestors[0].should == Object
114
+ end
115
+
116
+ it 'recursively unextends a class from an object' do
117
+ o = Object.new
118
+ A.gen_include B
119
+ o.gen_extend A
120
+ o.singleton_class.ancestors[0..2].should == [A, B, Object]
121
+ o.unextend A, true
122
+ o.singleton_class.ancestors.first.should == Object
123
+ end
124
+
125
+ it 'recursively unextends a singleton class gen_extended into another singleton class' do
126
+ o = Object.new
127
+ def o.hello
128
+ :o
129
+ end
130
+
131
+ n = Object.new
132
+ def n.hello
133
+ :n
134
+ end
135
+
136
+ n.gen_extend o
137
+
138
+ v = Object.new
139
+ v.gen_extend n
140
+
141
+ v.hello.should == :n
142
+ v.unextend n.singleton_class, true
143
+ lambda { v.hello }.should.raise NameError
144
+ v.singleton_class.ancestors.first.should == Object
145
+ end
146
+ end
147
+ end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: object2module
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 11
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 4
8
- - 0
9
- version: 0.4.0
9
+ - 2
10
+ version: 0.4.2
10
11
  platform: i386-mswin32
11
12
  authors:
12
13
  - John Mair (banisterfiend)
@@ -28,7 +29,7 @@ extra_rdoc_files: []
28
29
 
29
30
  files:
30
31
  - Rakefile
31
- - README
32
+ - README.markdown
32
33
  - LICENSE
33
34
  - lib/object2module.rb
34
35
  - lib/1.8/object2module.so
@@ -36,7 +37,8 @@ files:
36
37
  - lib/object2module/version.rb
37
38
  - test/test.rb
38
39
  - test/test_stress.rb
39
- has_rdoc: true
40
+ - test/test_with_remix.rb
41
+ has_rdoc: yard
40
42
  homepage: http://banisterfiend.wordpress.com
41
43
  licenses: []
42
44
 
@@ -50,6 +52,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
50
52
  requirements:
51
53
  - - ">="
52
54
  - !ruby/object:Gem::Version
55
+ hash: 3
53
56
  segments:
54
57
  - 0
55
58
  version: "0"
@@ -58,6 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
61
  requirements:
59
62
  - - ">="
60
63
  - !ruby/object:Gem::Version
64
+ hash: 3
61
65
  segments:
62
66
  - 0
63
67
  version: "0"
data/README DELETED
@@ -1,18 +0,0 @@
1
- # Object2module
2
-
3
- - converts a Class (or the Singleton of an Object) to a Module
4
- - Includes gen\_extend and gen\_include methods: generalizations
5
- of Object#extend and Module#include that work with Objects and
6
- Classes as well as Modules
7
-
8
- How it works:
9
-
10
- - First creates an IClass for the Class in question and sets the
11
- T\_MODULE flag
12
- - Recursively converts superclasses of the Class to IClasses
13
- creating a modulified version of the Class's inheritance chain
14
- - gen\_include/gen\_extend automatically call #to\_module on the
15
- Class/Object before inclusion/extension.
16
-
17
-
18
-