remix 0.3.4-i386-mswin32 → 0.4.0-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ 11/11/201 version 0.4.0
2
+ * added temp_include and temp_extend, and threadsafe variants
3
+ temp_include_safe etc
1
4
  27/10/2010 version 0.2.5
2
5
  * added tests
3
6
  * reversed order of arguments for #include_at
data/README.markdown CHANGED
@@ -79,7 +79,7 @@ Remix is one of a series of experimental libraries that mess with
79
79
  the internals of Ruby to bring new and interesting functionality to
80
80
  the language, see also:
81
81
 
82
- * [Real Include](http://github.com/banister/real_include) - Brings in
82
+ * [Include Complete](http://github.com/banister/include_complete) - Brings in
83
83
  module singleton classes during an include. No more ugly ClassMethods and included() hook hacks.
84
84
  * [Object2module](http://github.com/banister/object2module) - Convert Classes and Objects to Modules so they can be extended/included
85
85
  * [Prepend](http://github.com/banister/prepend) - Prepends modules in front of a class; so method lookup starts with the module
data/Rakefile CHANGED
@@ -28,8 +28,9 @@ task :test do
28
28
  sh "bacon -k #{direc}/test/test.rb"
29
29
  end
30
30
 
31
+
31
32
  [:mingw32, :mswin32].each do |v|
32
- task v do
33
+ namespace v do
33
34
  spec = Gem::Specification.new do |s|
34
35
  apply_spec_defaults(s)
35
36
  s.platform = "i386-#{v}"
@@ -40,12 +41,10 @@ end
40
41
  pkg.need_zip = false
41
42
  pkg.need_tar = false
42
43
  end
43
-
44
- Rake::Task[:gem].invoke
45
44
  end
46
45
  end
47
46
 
48
- task :ruby do
47
+ namespace :ruby do
49
48
  spec = Gem::Specification.new do |s|
50
49
  apply_spec_defaults(s)
51
50
  s.platform = Gem::Platform::RUBY
@@ -56,7 +55,5 @@ task :ruby do
56
55
  pkg.need_zip = false
57
56
  pkg.need_tar = false
58
57
  end
59
-
60
- Rake::Task[:gem].invoke
61
58
  end
62
59
 
data/ext/remix/remix.c CHANGED
@@ -121,7 +121,7 @@ get_source_module(VALUE mod)
121
121
  }
122
122
 
123
123
  static VALUE
124
- retrieve_before_mod(VALUE m, VALUE before)
124
+ retrieve_imod_before_mod(VALUE m, VALUE before)
125
125
  {
126
126
  Validate_Type(before);
127
127
 
@@ -137,7 +137,7 @@ retrieve_before_mod(VALUE m, VALUE before)
137
137
  }
138
138
 
139
139
  static VALUE
140
- retrieve_mod(VALUE m, VALUE after)
140
+ retrieve_imod_for_mod(VALUE m, VALUE after)
141
141
  {
142
142
  Validate_Type(after);
143
143
 
@@ -161,7 +161,7 @@ rb_module_move_up(VALUE self, VALUE mod)
161
161
  if (self == mod)
162
162
  return self;
163
163
 
164
- VALUE included_mod = retrieve_mod(self, mod);
164
+ VALUE included_mod = retrieve_imod_for_mod(self, mod);
165
165
  if (RCLASS_SUPER(included_mod) == rb_cObject || RCLASS_SUPER(included_mod) == 0)
166
166
  return self;
167
167
 
@@ -178,7 +178,7 @@ rb_module_move_down(VALUE self, VALUE mod)
178
178
  if (self == mod)
179
179
  return self;
180
180
 
181
- VALUE before_included_mod = retrieve_before_mod(self, mod);
181
+ VALUE before_included_mod = retrieve_imod_before_mod(self, mod);
182
182
  if (before_included_mod == self)
183
183
  return self;
184
184
 
@@ -193,9 +193,9 @@ rb_include_at_top(VALUE self, VALUE mod)
193
193
  rb_prepare_for_remix(self);
194
194
 
195
195
  if (TYPE(self) == T_MODULE)
196
- rb_include_module(retrieve_before_mod(self, Qfalse), mod);
196
+ rb_include_module(retrieve_imod_before_mod(self, Qfalse), mod);
197
197
  else
198
- rb_include_module(retrieve_before_mod(self, rb_cObject), mod);
198
+ rb_include_module(retrieve_imod_before_mod(self, rb_cObject), mod);
199
199
 
200
200
  return self;
201
201
  }
@@ -204,7 +204,7 @@ VALUE
204
204
  rb_include_after(VALUE self, VALUE after, VALUE mod)
205
205
  {
206
206
  rb_prepare_for_remix(self);
207
- rb_include_module(retrieve_mod(self, after), mod);
207
+ rb_include_module(retrieve_imod_for_mod(self, after), mod);
208
208
  return self;
209
209
  }
210
210
 
@@ -216,7 +216,7 @@ rb_include_before(VALUE self, VALUE before, VALUE mod)
216
216
  if (before == self)
217
217
  rb_raise(rb_eRuntimeError, "Prepend not supported yet!");
218
218
 
219
- rb_include_module(retrieve_before_mod(self, before), mod);
219
+ rb_include_module(retrieve_imod_before_mod(self, before), mod);
220
220
  return self;
221
221
  }
222
222
 
@@ -250,10 +250,10 @@ rb_swap_modules(VALUE self, VALUE mod1, VALUE mod2)
250
250
 
251
251
  if (mod1 == rb_cObject || mod2 == rb_cObject) rb_raise(rb_eRuntimeError, "can't swap Object");
252
252
 
253
- included_mod1 = retrieve_mod(self, mod1);
254
- included_mod2 = retrieve_mod(self, mod2);
255
- before_mod1 = retrieve_before_mod(self, mod1);
256
- before_mod2 = retrieve_before_mod(self, mod2);
253
+ included_mod1 = retrieve_imod_for_mod(self, mod1);
254
+ included_mod2 = retrieve_imod_for_mod(self, mod2);
255
+ before_mod1 = retrieve_imod_before_mod(self, mod1);
256
+ before_mod2 = retrieve_imod_before_mod(self, mod2);
257
257
 
258
258
  SWAP(RCLASS_SUPER(before_mod1), RCLASS_SUPER(before_mod2));
259
259
  SWAP(RCLASS_SUPER(included_mod1), RCLASS_SUPER(included_mod2));
@@ -310,8 +310,8 @@ rb_uninclude(int argc, VALUE * argv, VALUE self)
310
310
  if (!RTEST(rb_classmod_include_p(self, mod1)))
311
311
  rb_raise(rb_eArgError, "Module not found");
312
312
 
313
- VALUE before = retrieve_before_mod(self, mod1);
314
- VALUE included_mod = retrieve_mod(self, mod1);
313
+ VALUE before = retrieve_imod_before_mod(self, mod1);
314
+ VALUE included_mod = retrieve_imod_for_mod(self, mod1);
315
315
 
316
316
  if (mod1 == rb_cObject) rb_raise(rb_eRuntimeError, "can't delete Object");
317
317
 
@@ -333,7 +333,7 @@ rb_replace_module(VALUE self, VALUE mod1, VALUE mod2)
333
333
  if (rb_classmod_include_p(self, mod2))
334
334
  return rb_swap_modules(self, mod1, mod2);
335
335
 
336
- VALUE before = retrieve_before_mod(self, mod1);
336
+ VALUE before = retrieve_imod_before_mod(self, mod1);
337
337
  rb_uninclude(1, &mod1, self);
338
338
  rb_include_module(before, mod2);
339
339
  return self;
data/lib/1.8/remix.so CHANGED
Binary file
data/lib/1.9/remix.so CHANGED
Binary file
data/lib/remix.rb CHANGED
@@ -29,6 +29,40 @@ end
29
29
 
30
30
  module Remix::ObjectExtensions
31
31
 
32
+ # Temporarily extends a module for the duration of a block.
33
+ # Module will be unextended at end of block.
34
+ # @param [Module] mod Module to be temporarily extended
35
+ def temp_extend(mod, &block)
36
+ begin
37
+ extend(mod)
38
+ yield
39
+ ensure
40
+ unextend(mod, true)
41
+ end
42
+ end
43
+
44
+ # Temporarily extends a module for the duration of a block in a
45
+ # thread-safe manner.
46
+ # Module will be unextended at end of block.
47
+ # @param [Module] mod Module to be temporarily extended
48
+ def temp_extend_safe(mod, &block)
49
+ safe_code = proc do
50
+ begin
51
+ extend(mod)
52
+ yield
53
+ ensure
54
+ unextend(mod, true)
55
+ end
56
+ end
57
+
58
+ if !Thread.current[:__exclusive__]
59
+ Thread.exclusive { Thread.current[:__exclusive__] = true; safe_code.call }
60
+ Thread.current[:__exclusive__] = false
61
+ else
62
+ safe_code.call
63
+ end
64
+ end
65
+
32
66
  # Like `include_at()` but for the singleton class
33
67
  # @see Remix::ModuleExtensions#include_at
34
68
  def extend_at(index, mod)
@@ -87,6 +121,44 @@ module Remix::ObjectExtensions
87
121
  end
88
122
  end
89
123
 
124
+ module Remix::ModuleExtensions
125
+
126
+ # Temporarily includes a module for the duration of a block.
127
+ # Module will be unincluded at end of block.
128
+ # @param [Module] mod Module to be temporarily included
129
+ def temp_include(mod, &block)
130
+ begin
131
+ include(mod)
132
+ yield
133
+ ensure
134
+ uninclude(mod, true)
135
+ end
136
+ end
137
+
138
+ # Temporarily includes a module for the duration of a block in a
139
+ # thread-safe manner.
140
+ # Module will be unincluded at end of block.
141
+ # @param [Module] mod Module to be temporarily included
142
+ def temp_include_safe(mod, &block)
143
+ safe_code = proc do
144
+ begin
145
+ include(mod)
146
+ yield
147
+ ensure
148
+ uninclude(mod, true)
149
+ end
150
+ end
151
+
152
+ if !Thread.current[:__exclusive__]
153
+ Thread.exclusive { Thread.current[:__exclusive__] = true; safe_code.call }
154
+ Thread.current[:__exclusive__] = false
155
+ else
156
+ safe_code.call
157
+ end
158
+ end
159
+ end
160
+
161
+
90
162
  # bring extend-based methods into Object
91
163
  class Object
92
164
  include Remix::ObjectExtensions
data/lib/remix/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Remix
2
- VERSION = "0.3.4"
2
+ VERSION = "0.4.0"
3
3
  end
4
4
 
data/test/test.rb CHANGED
@@ -8,12 +8,13 @@ class Module
8
8
  end
9
9
 
10
10
  puts "testing Remix version #{Remix::VERSION}..."
11
+ puts "Ruby version: #{RUBY_VERSION}"
11
12
 
12
13
  describe 'Test basic remix functionality' do
13
14
  before do
14
- A = Module.new
15
+ A = Module.new { def hello; :hello; end }
15
16
  B = Module.new
16
- C = Module.new
17
+ C = Module.new
17
18
  J = Module.new
18
19
 
19
20
  M = Module.new
@@ -45,6 +46,26 @@ describe 'Test basic remix functionality' do
45
46
  end
46
47
  end
47
48
 
49
+ describe 'temp_extend' do
50
+ it 'should temporarily extend the module for the duration of a block' do
51
+ lambda { B.hello }.should.raise NoMethodError
52
+ B.temp_extend(A) do
53
+ B.hello.should == :hello
54
+ end
55
+ lambda { B.hello }.should.raise NoMethodError
56
+ end
57
+ end
58
+
59
+ describe 'temp_extend_safe' do
60
+ it 'should temporarily extend the module for the duration of a block in a threadsafe manner' do
61
+ lambda { B.hello }.should.raise NoMethodError
62
+ B.temp_extend_safe(A) do
63
+ B.hello.should == :hello
64
+ end
65
+ lambda { B.hello }.should.raise NoMethodError
66
+ end
67
+ end
68
+
48
69
  describe 'unextend' do
49
70
  it 'should unextend the module' do
50
71
  C.include A, B
@@ -89,6 +110,26 @@ describe 'Test basic remix functionality' do
89
110
  end
90
111
  end
91
112
 
113
+ describe 'temp_include' do
114
+ it 'should temporarily include the module for the duration of a block' do
115
+ lambda { "john".hello }.should.raise NoMethodError
116
+ String.temp_include(A) do
117
+ "john".hello.should == :hello
118
+ end
119
+ lambda { "john".hello }.should.raise NoMethodError
120
+ end
121
+ end
122
+
123
+ describe 'temp_include_safe' do
124
+ it 'should temporarily include the module for the duration of a block in a threadsafe manner' do
125
+ lambda { "john".hello }.should.raise NoMethodError
126
+ String.temp_include_safe(A) do
127
+ "john".hello.should == :hello
128
+ end
129
+ lambda { "john".hello }.should.raise NoMethodError
130
+ end
131
+ end
132
+
92
133
  describe 'include_before' do
93
134
  it 'should insert module into correct position' do
94
135
  M.include_before B, C
@@ -9,6 +9,7 @@ class Module
9
9
  end
10
10
 
11
11
  puts "testing Remix version #{Remix::VERSION} with Object2module version #{Object2module::VERSION}..."
12
+ puts "Ruby version: #{RUBY_VERSION}"
12
13
 
13
14
  describe Remix do
14
15
  before do
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remix
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 15
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 3
8
8
  - 4
9
- version: 0.3.4
9
+ - 0
10
+ version: 0.4.0
10
11
  platform: i386-mswin32
11
12
  authors:
12
13
  - John Mair (banisterfiend)
@@ -14,7 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-11-01 00:00:00 +13:00
18
+ date: 2010-11-11 00:00:00 +13:00
18
19
  default_executable:
19
20
  dependencies: []
20
21
 
@@ -54,6 +55,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
55
  requirements:
55
56
  - - ">="
56
57
  - !ruby/object:Gem::Version
58
+ hash: 3
57
59
  segments:
58
60
  - 0
59
61
  version: "0"
@@ -62,6 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
64
  requirements:
63
65
  - - ">="
64
66
  - !ruby/object:Gem::Version
67
+ hash: 3
65
68
  segments:
66
69
  - 0
67
70
  version: "0"