remix 0.3.4-i386-mingw32 → 0.4.0-i386-mingw32

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 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/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/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/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-mingw32
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"