rails_current 1.3.0 → 1.4.0

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/README.md CHANGED
@@ -13,34 +13,49 @@ DESCRIPTION
13
13
  --------------------------------
14
14
  SYNOPSIS
15
15
  --------------------------------
16
+
16
17
  most rails apps scatter a bunch of @current_foobar vars everywhere. don't do
17
18
  that. it's fugly. instead, do this.
18
19
 
20
+ declare the current_XXX variables you'll want tracked. you can pass a block
21
+ for lazy computation
22
+
19
23
  class ApplicationController
20
24
 
21
25
  Current(:user){ User.find session[:current_user }
22
26
  Current(:account)
23
27
 
24
- include Current
25
-
26
28
  end
27
29
 
28
- ...
30
+ you can now access the current state two ways
31
+
29
32
 
33
+ 1) globally from anywhere in your code base
34
+
30
35
 
31
- if current_user
36
+ if Current.user
32
37
 
33
38
  ...
34
39
 
35
40
  end
36
41
 
42
+ Current.user = User.find(id)
43
+
44
+ 2) or using the current_ methods that are added by including the Current
45
+ module into any class (ActionController::Base and ActionView::Base
46
+ automatically include it)
47
+
37
48
 
38
- self.current_account = Account.find(id)
49
+ if current_user
50
+
51
+ ...
52
+
53
+ end
39
54
 
55
+ self.current_user = User.find(id)
40
56
 
41
- etc.
42
57
 
43
- out of the box it's loaded with Current.controller
58
+ the Current module is cleared out before every request and is thread safe.
44
59
 
45
60
  --------------------------------
46
61
  INSTALL
data/lib/rails_current.rb CHANGED
@@ -4,7 +4,7 @@ require 'map'
4
4
 
5
5
  module Current
6
6
  def Current.version
7
- '1.3.0'
7
+ '1.4.0'
8
8
  end
9
9
 
10
10
  def Current.data
@@ -17,27 +17,45 @@ module Current
17
17
  end
18
18
 
19
19
  def Current.reset
20
- calls.keys.each{|name, block| undefine_attribute_method(name) }
21
- data.clear
22
- calls.clear
23
- self
20
+ attribute_names.each{|name| undefine_attribute_method(name)}
21
+ attribute_names.clear
22
+ generators.clear
23
+ clear
24
+ end
25
+
26
+ def Current.generators
27
+ @generators ||= Map.new
24
28
  end
25
29
 
26
30
  def Current.attribute(name, *args, &block)
27
- options = Map.options_for(args)
31
+ options = Map.options_for!(args)
28
32
 
29
33
  name = name.to_s
30
- default = options.has_key?(:default) ? options[:default] : args.shift
31
34
 
32
- block ||= proc{ default }
33
- calls[name] = block
35
+ attribute_names.push(name)
36
+ attribute_names.uniq!
37
+
38
+ if options.has_key?(:default)
39
+ default = options[:default]
40
+ if default.respond_to?(:call)
41
+ block ||= default
42
+ else
43
+ data[name] = default
44
+ end
45
+ end
46
+
47
+ if !args.empty?
48
+ value = args.shift
49
+ data[name] = value
50
+ end
51
+
52
+ if block
53
+ generators[name] = block
54
+ end
34
55
 
35
56
  define_attribute_method(name)
36
- self
37
- end
38
57
 
39
- def Current.calls
40
- @calls ||= Map.new
58
+ self
41
59
  end
42
60
 
43
61
  def Current.define_attribute_method(name)
@@ -47,7 +65,10 @@ module Current
47
65
  if data.has_key?(name)
48
66
  data[name]
49
67
  else
50
- data[name] = calls[name].call
68
+ if generator = generators[name]
69
+ value = generator.call
70
+ data[name] = value
71
+ end
51
72
  end
52
73
  end
53
74
 
@@ -77,11 +98,11 @@ module Current
77
98
  end
78
99
 
79
100
  def Current.attribute?(name)
80
- calls.has_key?(name)
101
+ attribute_names.include?(name.to_s)
81
102
  end
82
103
 
83
104
  def Current.attribute_names
84
- calls.keys
105
+ @attribute_names ||= []
85
106
  end
86
107
 
87
108
  def Current.attributes
@@ -93,7 +114,7 @@ module Current
93
114
  when /^(.*)[=]$/
94
115
  name = $1
95
116
  value = args.shift
96
- attribute(name){ value }
117
+ attribute(name, value)
97
118
  value
98
119
 
99
120
  when /^(.*)[?]$/
@@ -128,20 +149,33 @@ end
128
149
 
129
150
  if defined?(Rails)
130
151
 
152
+ ##
153
+ #
131
154
  module Current
132
155
  attribute(:controller)
133
156
  attribute(:user)
157
+ end
134
158
 
159
+ ##
160
+ #
161
+ module Current
135
162
  def Current.install_before_filter!
136
- ::ActionController::Base.module_eval do
137
- prepend_before_filter do |controller|
138
- Current.clear
139
- Current.controller = controller
163
+ if defined?(::ActionController::Base)
164
+ ::ActionController::Base.module_eval do
165
+ prepend_before_filter do |controller|
166
+ Current.clear
167
+ Current.controller = controller
168
+ end
169
+
170
+ include Current
171
+ helper{ include Current }
140
172
  end
141
- end if defined?(::ActionController::Base)
173
+ end
142
174
  end
143
175
  end
144
176
 
177
+ ##
178
+ #
145
179
  if defined?(Rails::Engine)
146
180
  class Engine < Rails::Engine
147
181
  config.before_initialize do
@@ -156,7 +190,6 @@ if defined?(Rails)
156
190
 
157
191
  end
158
192
 
159
-
160
193
  ::Rails_current = ::Current
161
194
 
162
195
  BEGIN {
@@ -3,7 +3,7 @@
3
3
 
4
4
  Gem::Specification::new do |spec|
5
5
  spec.name = "rails_current"
6
- spec.version = "1.3.0"
6
+ spec.version = "1.4.0"
7
7
  spec.platform = Gem::Platform::RUBY
8
8
  spec.summary = "rails_current"
9
9
  spec.description = "description: rails_current kicks the ass"
@@ -122,6 +122,21 @@ Testing Current do
122
122
  assert{ Current.bar == 'forty-two' }
123
123
  end
124
124
 
125
+ ##
126
+ #
127
+ test 'that dynamically added data clears cleverly' do
128
+ assert{ Current.foo = 42 }
129
+ assert{ Current.bar{ 42.0 } }
130
+
131
+ assert{ Current.foo == 42 }
132
+ assert{ Current.bar == 42.0 }
133
+
134
+ assert{ Current.clear }
135
+
136
+ assert{ Current.foo == nil }
137
+ assert{ Current.bar == 42.0 }
138
+ end
139
+
125
140
  ##
126
141
  #
127
142
  test 'that query methods on Current werky' do
@@ -132,21 +147,48 @@ Testing Current do
132
147
 
133
148
  ##
134
149
  #
135
- test 'that loading Current into a rails app creates Current.user and Current.controller' do
150
+ test 'that loading Current into an old skool rails app creates Current.user and Current.controller' do
136
151
  mock_rails! do
137
152
  assert{ Current.attributes =~ {:user => nil, :controller => nil} }
153
+
154
+ assert do
155
+ Current.user = :user
156
+ Current.controller = :controller
157
+ end
158
+
159
+ assert{ ActionController::Base.new.current_user == :user }
160
+ assert{ ActionController::Base.new.current_controller == :controller }
161
+
162
+ assert{ ActionView::Base.new.current_user == :user }
163
+ assert{ ActionView::Base.new.current_controller == :controller }
138
164
  end
165
+ end
139
166
 
167
+ ##
168
+ #
169
+ test 'that loading Current into a new skool rails app creates Current.user and Current.controller' do
140
170
  mock_rails_engine! do
141
171
  assert{ Current.attributes =~ {:user => nil, :controller => nil} }
172
+
142
173
  assert{ $before_initialize_called }
143
- assert{ $before_filter_called }
174
+ assert{ $prepend_before_filter_called }
175
+
176
+ assert do
177
+ Current.user = :user
178
+ Current.controller = :controller
179
+ end
180
+
181
+ assert{ ActionController::Base.new.current_user == :user }
182
+ assert{ ActionController::Base.new.current_controller == :controller }
183
+
184
+ assert{ ActionView::Base.new.current_user == :user }
185
+ assert{ ActionView::Base.new.current_controller == :controller }
144
186
  end
145
187
  end
146
188
 
147
189
  ##
148
190
  #
149
- teardown do
191
+ setup do
150
192
  assert{ Current.reset }
151
193
  end
152
194
 
@@ -156,6 +198,25 @@ private
156
198
  Object.module_eval <<-__
157
199
  module Rails
158
200
  end
201
+
202
+ module ActionController
203
+ class Base
204
+ def Base.prepend_before_filter(*args, &block)
205
+ block.call
206
+ ensure
207
+ $prepend_before_filter_called = true
208
+ end
209
+
210
+ def Base.helper(&block)
211
+ ActionView::Base.module_eval(&block)
212
+ end
213
+ end
214
+ end
215
+
216
+ module ActionView
217
+ class Base
218
+ end
219
+ end
159
220
  __
160
221
  $load.call()
161
222
  yield
@@ -182,13 +243,28 @@ private
182
243
 
183
244
  module ActionController
184
245
  class Base
185
- def Base.before_filter(*args, &block)
186
- block.call()
246
+ def Base.prepend_before_filter(*args, &block)
247
+ block.call
187
248
  ensure
188
- $before_filter_called = true
249
+ $prepend_before_filter_called = true
250
+ end
251
+
252
+ def Base.helper(&block)
253
+ ActionView::Base.module_eval(&block)
189
254
  end
190
255
  end
191
256
  end
257
+
258
+ module ActionView
259
+ class Base
260
+ end
261
+ end
262
+
263
+ module ActiveSupport
264
+ def ActiveSupport.on_load(*args, &block)
265
+ block.call()
266
+ end
267
+ end
192
268
  __
193
269
  $load.call()
194
270
  yield
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_current
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-13 00:00:00.000000000 Z
12
+ date: 2012-01-15 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'description: rails_current kicks the ass'
15
15
  email: ara.t.howard@gmail.com