remix 0.3.0-i386-mingw32 → 0.3.4-i386-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +42 -17
- data/ext/remix/remix.c +19 -12
- data/lib/1.8/remix.so +0 -0
- data/lib/1.9/remix.so +0 -0
- data/lib/remix/version.rb +1 -1
- data/test/test.rb +4 -1
- data/test/test_with_object2module.rb +162 -0
- metadata +6 -5
data/Rakefile
CHANGED
@@ -1,16 +1,15 @@
|
|
1
|
-
|
1
|
+
dlext = Config::CONFIG['DLEXT']
|
2
|
+
direc = File.dirname(__FILE__)
|
2
3
|
|
3
4
|
require 'rake/clean'
|
4
5
|
require 'rake/gempackagetask'
|
6
|
+
require "#{direc}/lib/remix/version"
|
5
7
|
|
6
|
-
require 'lib/remix/version'
|
7
8
|
|
8
|
-
|
9
|
+
CLEAN.include("ext/**/*.#{dlext}", "ext/**/*.log", "ext/**/*.o", "ext/**/*~", "ext/**/*#*", "ext/**/*.obj", "ext/**/*.def", "ext/**/*.pdb")
|
10
|
+
CLOBBER.include("**/*.#{dlext}", "**/*~", "**/*#*", "**/*.log", "**/*.o")
|
9
11
|
|
10
|
-
|
11
|
-
CLOBBER.include("**/*.#{$dlext}", "**/*~", "**/*#*", "**/*.log", "**/*.o")
|
12
|
-
|
13
|
-
specification = Gem::Specification.new do |s|
|
12
|
+
def apply_spec_defaults(s)
|
14
13
|
s.name = "remix"
|
15
14
|
s.summary = "Ruby modules re-mixed and remastered"
|
16
15
|
s.version = Remix::VERSION
|
@@ -19,19 +18,45 @@ specification = Gem::Specification.new do |s|
|
|
19
18
|
s.email = 'jrmair@gmail.com'
|
20
19
|
s.description = s.summary
|
21
20
|
s.require_path = 'lib'
|
22
|
-
#s.platform = Gem::Platform::RUBY
|
23
|
-
s.platform = 'i386-mingw32'
|
24
21
|
s.homepage = "http://banisterfiend.wordpress.com"
|
25
22
|
s.has_rdoc = 'yard'
|
23
|
+
s.files = FileList["ext/**/extconf.rb", "ext/**/*.h", "ext/**/*.c", "lib/**/*.rb",
|
24
|
+
"test/*.rb", "CHANGELOG", "README.markdown", "Rakefile"].to_a
|
25
|
+
end
|
26
|
+
|
27
|
+
task :test do
|
28
|
+
sh "bacon -k #{direc}/test/test.rb"
|
29
|
+
end
|
26
30
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
[:mingw32, :mswin32].each do |v|
|
32
|
+
task v do
|
33
|
+
spec = Gem::Specification.new do |s|
|
34
|
+
apply_spec_defaults(s)
|
35
|
+
s.platform = "i386-#{v}"
|
36
|
+
s.files += FileList["lib/**/*.#{dlext}"].to_a
|
37
|
+
end
|
38
|
+
|
39
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
40
|
+
pkg.need_zip = false
|
41
|
+
pkg.need_tar = false
|
42
|
+
end
|
43
|
+
|
44
|
+
Rake::Task[:gem].invoke
|
45
|
+
end
|
32
46
|
end
|
33
47
|
|
34
|
-
|
35
|
-
|
36
|
-
|
48
|
+
task :ruby do
|
49
|
+
spec = Gem::Specification.new do |s|
|
50
|
+
apply_spec_defaults(s)
|
51
|
+
s.platform = Gem::Platform::RUBY
|
52
|
+
s.extensions = ["ext/remix/extconf.rb"]
|
53
|
+
end
|
54
|
+
|
55
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
56
|
+
pkg.need_zip = false
|
57
|
+
pkg.need_tar = false
|
58
|
+
end
|
59
|
+
|
60
|
+
Rake::Task[:gem].invoke
|
37
61
|
end
|
62
|
+
|
data/ext/remix/remix.c
CHANGED
@@ -14,16 +14,19 @@ VALUE rb_swap_modules(VALUE self, VALUE mod1, VALUE mod2);
|
|
14
14
|
rb_raise(rb_eTypeError, "Must be a Module or Class type."); \
|
15
15
|
} while(0)
|
16
16
|
|
17
|
+
#define Validate_Type(klass) \
|
18
|
+
do { \
|
19
|
+
if (TYPE(klass) != T_OBJECT && TYPE(klass) != T_CLASS && TYPE(klass) != T_MODULE && TYPE(klass) != T_ICLASS && \
|
20
|
+
TYPE(klass) != T_FALSE) \
|
21
|
+
rb_raise(rb_eTypeError, "Must be a T_MODULE, T_CLASS, T_ICLASS, T_OBJECT, or T_FALSE type."); \
|
22
|
+
} while(0)
|
23
|
+
|
17
24
|
/* a modified version of include_class_new from class.c */
|
18
25
|
static VALUE
|
19
26
|
j_class_new(VALUE module, VALUE sup)
|
20
27
|
{
|
21
28
|
VALUE klass = create_class(T_ICLASS, rb_cClass);
|
22
29
|
|
23
|
-
if (TYPE(module) == T_ICLASS) {
|
24
|
-
// klass = module;
|
25
|
-
}
|
26
|
-
|
27
30
|
if (!RCLASS_IV_TBL(module)) {
|
28
31
|
RCLASS_IV_TBL(module) = (struct st_table *)st_init_numtable();
|
29
32
|
}
|
@@ -106,8 +109,11 @@ get_source_module(VALUE mod)
|
|
106
109
|
case T_MODULE:
|
107
110
|
return mod;
|
108
111
|
break;
|
112
|
+
case T_OBJECT:
|
113
|
+
return rb_singleton_class(mod);
|
114
|
+
break;
|
109
115
|
default:
|
110
|
-
|
116
|
+
Validate_Type(mod);
|
111
117
|
}
|
112
118
|
|
113
119
|
/* never reached */
|
@@ -117,9 +123,8 @@ get_source_module(VALUE mod)
|
|
117
123
|
static VALUE
|
118
124
|
retrieve_before_mod(VALUE m, VALUE before)
|
119
125
|
{
|
120
|
-
|
121
|
-
|
122
|
-
|
126
|
+
Validate_Type(before);
|
127
|
+
|
123
128
|
VALUE k = get_source_module(RCLASS_SUPER(m));
|
124
129
|
while(k != before && m != 0 && m != rb_cObject) {
|
125
130
|
m = RCLASS_SUPER(m);
|
@@ -134,9 +139,8 @@ retrieve_before_mod(VALUE m, VALUE before)
|
|
134
139
|
static VALUE
|
135
140
|
retrieve_mod(VALUE m, VALUE after)
|
136
141
|
{
|
137
|
-
|
138
|
-
|
139
|
-
|
142
|
+
Validate_Type(after);
|
143
|
+
|
140
144
|
VALUE k = get_source_module(m);
|
141
145
|
while(k != after && m != 0 && m != rb_cObject) {
|
142
146
|
m = RCLASS_SUPER(m);
|
@@ -277,7 +281,7 @@ rb_classmod_include_p(VALUE mod, VALUE mod2)
|
|
277
281
|
{
|
278
282
|
VALUE p;
|
279
283
|
|
280
|
-
Enforce_Classmod(
|
284
|
+
Enforce_Classmod(mod);
|
281
285
|
|
282
286
|
for (p = RCLASS_SUPER(mod); p; p = RCLASS_SUPER(p)) {
|
283
287
|
if (BUILTIN_TYPE(p) == T_ICLASS) {
|
@@ -300,6 +304,9 @@ rb_uninclude(int argc, VALUE * argv, VALUE self)
|
|
300
304
|
VALUE mod1, recurse = Qfalse;
|
301
305
|
rb_scan_args(argc, argv, "11", &mod1, &recurse);
|
302
306
|
|
307
|
+
if (TYPE(mod1) == T_OBJECT)
|
308
|
+
mod1 = rb_singleton_class(mod1);
|
309
|
+
|
303
310
|
if (!RTEST(rb_classmod_include_p(self, mod1)))
|
304
311
|
rb_raise(rb_eArgError, "Module not found");
|
305
312
|
|
data/lib/1.8/remix.so
CHANGED
Binary file
|
data/lib/1.9/remix.so
CHANGED
Binary file
|
data/lib/remix/version.rb
CHANGED
data/test/test.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
|
+
direc = File.dirname(__FILE__)
|
1
2
|
require 'rubygems'
|
2
|
-
require
|
3
|
+
require "#{direc}/../lib/remix"
|
3
4
|
require 'bacon'
|
4
5
|
|
5
6
|
class Module
|
6
7
|
public :include, :remove_const
|
7
8
|
end
|
8
9
|
|
10
|
+
puts "testing Remix version #{Remix::VERSION}..."
|
11
|
+
|
9
12
|
describe 'Test basic remix functionality' do
|
10
13
|
before do
|
11
14
|
A = Module.new
|
@@ -0,0 +1,162 @@
|
|
1
|
+
direc = File.dirname(__FILE__)
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bacon'
|
4
|
+
require 'object2module'
|
5
|
+
require "#{direc}/../lib/remix"
|
6
|
+
|
7
|
+
class Module
|
8
|
+
public :include, :remove_const
|
9
|
+
end
|
10
|
+
|
11
|
+
puts "testing Remix version #{Remix::VERSION} with Object2module version #{Object2module::VERSION}..."
|
12
|
+
|
13
|
+
describe Remix do
|
14
|
+
before do
|
15
|
+
class A
|
16
|
+
def hello
|
17
|
+
:a
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class B
|
22
|
+
def hello
|
23
|
+
:b
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module M
|
28
|
+
def m
|
29
|
+
:m
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
O = Object.new
|
34
|
+
class << O
|
35
|
+
def o
|
36
|
+
:o
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
C = Class.new
|
41
|
+
end
|
42
|
+
|
43
|
+
after do
|
44
|
+
Object.remove_const(:A)
|
45
|
+
Object.remove_const(:B)
|
46
|
+
Object.remove_const(:C)
|
47
|
+
Object.remove_const(:M)
|
48
|
+
Object.remove_const(:O)
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 'gen_include' do
|
52
|
+
it 'includes two classes and swaps them' do
|
53
|
+
C.gen_include A
|
54
|
+
C.gen_include B
|
55
|
+
C.new.hello.should == :b
|
56
|
+
C.swap_modules A, B
|
57
|
+
C.new.hello.should == :a
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'includes a class into a class and swaps them' do
|
61
|
+
A.gen_include B
|
62
|
+
C.gen_include A
|
63
|
+
C.new.hello.should == :a
|
64
|
+
C.swap_modules A, B
|
65
|
+
C.new.hello.should == :b
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'unincludes a gen_included class' do
|
69
|
+
C.gen_include A
|
70
|
+
C.new.hello.should == :a
|
71
|
+
C.uninclude A
|
72
|
+
lambda { C.new.hello }.should.raise NameError
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'recursively unincludes a gen_included class' do
|
76
|
+
A.gen_include B
|
77
|
+
C.gen_include A
|
78
|
+
C.new.hello.should == :a
|
79
|
+
C.ancestors.should[0..2] == [C, A, B]
|
80
|
+
C.uninclude A, true
|
81
|
+
C.ancestors.should[0..1] == [C, Object]
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'unincludes a singleton class' do
|
85
|
+
o = Object.new
|
86
|
+
class << o
|
87
|
+
def hello
|
88
|
+
:o
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
C.gen_include o
|
93
|
+
C.new.hello.should == :o
|
94
|
+
C.uninclude C.ancestors[1]
|
95
|
+
lambda { C.new.hello }.should.raise NameError
|
96
|
+
C.ancestors[1].should == Object
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe 'gen_extend' do
|
101
|
+
it 'extends two classes into an object and swaps them' do
|
102
|
+
o = Object.new
|
103
|
+
o.gen_extend A, B
|
104
|
+
o.hello.should == :a
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'unextends a class from an object' do
|
108
|
+
o = Object.new
|
109
|
+
o.gen_extend A
|
110
|
+
o.hello.should == :a
|
111
|
+
o.singleton_class.ancestors[0].should == A
|
112
|
+
o.unextend A
|
113
|
+
lambda { o.hello }.should.raise NameError
|
114
|
+
o.singleton_class.ancestors[0].should == Object
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'recursively unextends a class from an object' do
|
118
|
+
o = Object.new
|
119
|
+
A.gen_include B
|
120
|
+
o.gen_extend A
|
121
|
+
o.singleton_class.ancestors[0..2].should == [A, B, Object]
|
122
|
+
o.unextend A, true
|
123
|
+
o.singleton_class.ancestors.first.should == Object
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'unextends an object by object (not by singleton)' do
|
127
|
+
o = Object.new
|
128
|
+
def o.hello
|
129
|
+
:o
|
130
|
+
end
|
131
|
+
|
132
|
+
n = Object.new
|
133
|
+
n.gen_extend o
|
134
|
+
n.hello.should == :o
|
135
|
+
n.unextend o
|
136
|
+
lambda { n.hello }.should.raise NameError
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
it 'recursively unextends a singleton class gen_extended into another singleton class' do
|
141
|
+
o = Object.new
|
142
|
+
def o.hello
|
143
|
+
:o
|
144
|
+
end
|
145
|
+
|
146
|
+
n = Object.new
|
147
|
+
def n.hello
|
148
|
+
:n
|
149
|
+
end
|
150
|
+
|
151
|
+
n.gen_extend o
|
152
|
+
|
153
|
+
v = Object.new
|
154
|
+
v.gen_extend n
|
155
|
+
|
156
|
+
v.hello.should == :n
|
157
|
+
v.unextend n.singleton_class, true
|
158
|
+
lambda { v.hello }.should.raise NameError
|
159
|
+
v.singleton_class.ancestors.first.should == Object
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
8
|
+
- 4
|
9
|
+
version: 0.3.4
|
10
10
|
platform: i386-mingw32
|
11
11
|
authors:
|
12
12
|
- John Mair (banisterfiend)
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-11-01 00:00:00 +13:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -27,8 +27,6 @@ extensions: []
|
|
27
27
|
extra_rdoc_files: []
|
28
28
|
|
29
29
|
files:
|
30
|
-
- lib/1.9/remix.so
|
31
|
-
- lib/1.8/remix.so
|
32
30
|
- ext/remix/extconf.rb
|
33
31
|
- ext/remix/compat.h
|
34
32
|
- ext/remix/remix.c
|
@@ -36,9 +34,12 @@ files:
|
|
36
34
|
- lib/remix/version.rb
|
37
35
|
- lib/remix.rb
|
38
36
|
- test/test.rb
|
37
|
+
- test/test_with_object2module.rb
|
39
38
|
- CHANGELOG
|
40
39
|
- README.markdown
|
41
40
|
- Rakefile
|
41
|
+
- lib/1.8/remix.so
|
42
|
+
- lib/1.9/remix.so
|
42
43
|
has_rdoc: yard
|
43
44
|
homepage: http://banisterfiend.wordpress.com
|
44
45
|
licenses: []
|