remix 0.4.7 → 0.4.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/CHANGELOG +4 -0
  2. data/lib/remix.rb +53 -5
  3. data/lib/remix/version.rb +1 -1
  4. metadata +2 -5
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ 15/11/2010 version 0.4.8
2
+ * all extend-based methods now return self
3
+ * added documentation on blocks (@yield)
4
+ * threadsafe temp_* methods now return value of block
1
5
  12/11/2010 version 0.4.6
2
6
  * fixed segfault in replace_module when trying to replace root module
3
7
  12/11/2010 version 0.4.5
@@ -20,6 +20,7 @@ rescue LoadError => e
20
20
  end
21
21
 
22
22
  module Kernel
23
+
23
24
  # Define a `singleton_class` method for the 1.8 kids
24
25
  # @return [Class] The singleton class of the receiver
25
26
  def singleton_class
@@ -32,6 +33,7 @@ module Remix
32
33
  # Wraps a block of code so that `before` and `after` lambdas are invoked
33
34
  # prior to and after the block.
34
35
  # @return [Object] The return value of the block
36
+ # @yield the block to wrap
35
37
  def self.wrap_with_hooks(before, after, &block)
36
38
  before.call if before
37
39
  yield
@@ -44,6 +46,8 @@ module Remix
44
46
  # Temporarily extends a module for the duration of a block.
45
47
  # Module will be unextended at end of block.
46
48
  # @param [Module] mod Module to be temporarily extended
49
+ # @return [Object] The value of the block
50
+ # @yield The block that will acquire the functionality.
47
51
  # @example
48
52
  # module M
49
53
  # def hello
@@ -53,7 +57,7 @@ module Remix
53
57
  #
54
58
  # o = Object.new
55
59
  # o.temp_extend(M) do
56
- # puts hello #=> "hello"
60
+ # puts o.hello #=> "hello"
57
61
  # end
58
62
  #
59
63
  # o.hello #=> NoMethodError
@@ -71,7 +75,11 @@ module Remix
71
75
  # Temporarily extends a module for the duration of a block in a
72
76
  # thread-safe manner.
73
77
  # Module will be unextended at end of block.
78
+ # **DO NOT** wait on other threads in this block as it will result
79
+ # in deadlock. `Thread.exclusive` is used.
74
80
  # @param [Module] mod Module to be temporarily extended
81
+ # @return [Object] The value of the block
82
+ # @yield The block that will acquire the functionality.
75
83
  def temp_extend_safe(mod, options={}, &block)
76
84
  safe_code = proc do
77
85
  Remix.wrap_with_hooks(options[:before], options[:after]) do
@@ -85,74 +93,101 @@ module Remix
85
93
  end
86
94
 
87
95
  if !Thread.current[:__exclusive__]
88
- Thread.exclusive { Thread.current[:__exclusive__] = true; safe_code.call }
89
- Thread.current[:__exclusive__] = false
96
+ value = nil
97
+
98
+ Thread.exclusive do
99
+ Thread.current[:__exclusive__] = true
100
+ value = safe_code.call
101
+ Thread.current[:__exclusive__] = false
102
+ end
103
+
104
+ value
90
105
  else
91
106
  safe_code.call
92
107
  end
93
108
  end
94
109
 
95
110
  # Like `include_at()` but for the singleton class
111
+ # @return [Object] The receiver
96
112
  # @see Remix::ModuleExtensions#include_at
97
113
  def extend_at(index, mod)
98
114
  singleton_class.include_at(index, mod)
115
+ self
99
116
  end
100
117
 
101
118
  # Like `include_below()` but for the singleton class
119
+ # @return [Object] The receiver
102
120
  # @see Remix::ModuleExtensions#include_below
103
121
  def extend_below(mod1, mod2)
104
122
  singleton_class.include_below(mod1, mod2)
123
+ self
105
124
  end
106
125
  alias_method :extend_before, :extend_below
107
126
 
108
127
  # Like `include_above()` but for the singleton class
128
+ # @return [Object] The receiver
109
129
  # @see Remix::ModuleExtensions#include_above
110
130
  def extend_above(mod1, mod2)
111
131
  singleton_class.include_above(mod1, mod2)
132
+ self
112
133
  end
113
134
  alias_method :extend_after, :extend_above
114
135
 
115
136
  # Like `uninclude()` but for the singleton class
137
+ # @return [Object] The receiver
116
138
  # @see Remix::ModuleExtensions#uninclude
117
139
  def unextend(mod, recurse = false)
118
140
  singleton_class.uninclude(mod, recurse)
141
+ self
119
142
  end
120
143
  alias_method :remove_extended_module, :unextend
121
144
 
122
145
  # Like `include_at_top()` but for the singleton class
146
+ # @return [Object] The receiver
123
147
  # @see Remix::ModuleExtensions#include_at_top
124
148
  def extend_at_top(mod)
125
149
  singleton_class.include_at_top(mod)
150
+ self
126
151
  end
127
152
 
128
153
  # Like `swap_modules()` but for the singleton class
154
+ # @return [Object] The receiver
129
155
  # @see Remix::ModuleExtensions#swap_modules
130
156
  def swap_extended_modules(mod1, mod2)
131
157
  singleton_class.swap_modules(mod1, mod2)
158
+ self
132
159
  end
133
160
 
134
161
  # Like `module_move_up()` but for the singleton class
162
+ # @return [Object] The receiver
135
163
  # @see Remix::ModuleExtensions#module_move_up
136
164
  def extended_module_move_up(mod)
137
165
  singleton_class.module_move_up(mod)
166
+ self
138
167
  end
139
168
 
140
169
  # Like `module_move_down()` but for the singleton class
170
+ # @return [Object] The receiver
141
171
  # @see Remix::ModuleExtensions#module_move_down
142
172
  def extended_module_move_down(mod)
143
173
  singleton_class.module_move_down(mod)
174
+ self
144
175
  end
145
176
 
146
177
  # Like `replace_module()` but for the singleton class
178
+ # @return [Object] The receiver
147
179
  # @see Remix::ModuleExtensions#replace_module
148
180
  def replace_extended_module(mod1, mod2)
149
181
  singleton_class.replace_module(mod1, mod2)
182
+ self
150
183
  end
151
184
 
152
185
  # Like `ready_remix()` on `Module` but for the singleton class
186
+ # @return [Object] The receiver
153
187
  # @see Remix::ModuleExtensions#ready_remix
154
188
  def ready_remix()
155
189
  singleton_class.ready_remix
190
+ self
156
191
  end
157
192
  end
158
193
 
@@ -161,6 +196,8 @@ module Remix
161
196
  # Temporarily includes a module for the duration of a block.
162
197
  # Module will be unincluded at end of block.
163
198
  # @param [Module] mod Module to be temporarily included
199
+ # @return [Object] The value of the block
200
+ # @yield The block that will acquire the functionality.
164
201
  # @example
165
202
  # module M
166
203
  # def hello
@@ -187,7 +224,11 @@ module Remix
187
224
  # Temporarily includes a module for the duration of a block in a
188
225
  # thread-safe manner.
189
226
  # Module will be unincluded at end of block.
227
+ # *DO NOT* wait on other threads in this block as it will result
228
+ # in deadlock. `Thread.exclusive` is used.
190
229
  # @param [Module] mod Module to be temporarily included
230
+ # @return [Object] The value of the block
231
+ # @yield The block that will acquire the functionality.
191
232
  def temp_include_safe(mod, options={}, &block)
192
233
  safe_code = proc do
193
234
  Remix.wrap_with_hooks(options[:before], options[:after]) do
@@ -201,8 +242,15 @@ module Remix
201
242
  end
202
243
 
203
244
  if !Thread.current[:__exclusive__]
204
- Thread.exclusive { Thread.current[:__exclusive__] = true; safe_code.call }
205
- Thread.current[:__exclusive__] = false
245
+ value = nil
246
+
247
+ Thread.exclusive do
248
+ Thread.current[:__exclusive__] = true
249
+ value = safe_code.call
250
+ Thread.current[:__exclusive__] = false
251
+ end
252
+
253
+ value
206
254
  else
207
255
  safe_code.call
208
256
  end
@@ -1,4 +1,4 @@
1
1
  module Remix
2
- VERSION = "0.4.7"
2
+ VERSION = "0.4.8"
3
3
  end
4
4
 
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remix
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 4
9
- - 7
10
- version: 0.4.7
8
+ - 8
9
+ version: 0.4.8
11
10
  platform: ruby
12
11
  authors:
13
12
  - John Mair (banisterfiend)
@@ -53,7 +52,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
53
52
  requirements:
54
53
  - - ">="
55
54
  - !ruby/object:Gem::Version
56
- hash: 3
57
55
  segments:
58
56
  - 0
59
57
  version: "0"
@@ -62,7 +60,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
60
  requirements:
63
61
  - - ">="
64
62
  - !ruby/object:Gem::Version
65
- hash: 3
66
63
  segments:
67
64
  - 0
68
65
  version: "0"