action_interceptor 0.1.2 → 0.2.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.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YTU1MDgzOGZiM2E5N2U1YzA5ZDQzNGUwYzA4NmY2ODYxY2Y4MDQ2Mw==
5
- data.tar.gz: !binary |-
6
- Mjc2YjgzZTBiYzk0YjRiY2E2ZTY1Zjg1YmQwNGU4NjllYWY3MjlmNQ==
2
+ SHA1:
3
+ metadata.gz: 04669ca4f3feb14833aa912c88dff4787e3c4c1e
4
+ data.tar.gz: 63cb94be3b6dc259fb9ea5c9db942aa59549c436
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NWUzNmZiMmRkZmI2NTM5YTdkNmEyZDU2NzM1ZGI0NmE5NGNlZjc1MzE4ZDY4
10
- NTdmMzI5MGRhMDZlYTM3OWI2ZTMwNTZlMDEyMDAyYTdjNDVkNmFmMTY0ODYz
11
- ZTY4NDAwYWZjMTY3MTEzNGE5ZjczMDFiNjQ2YzA4ZjI5NGZmNDM=
12
- data.tar.gz: !binary |-
13
- M2IzOWJkZTMzMjgxMzZmYzY0YzRkNTM3ZjNhODNiYWI3YjNhODYyYjk4YzZh
14
- MTNlODg2MDFiNTk2YmY4YzQyZjg5Mzc4YmIzYmEzODEwY2NlOTdiYzc1YTNl
15
- ODc4NjVhMWRkOWZjMDgyOTMzY2NmYzAyNWFmYzVmOGY4ZjM2YzE=
6
+ metadata.gz: 175943387c1c16fa25aa2c5a827dd130a56eadb4706bdb72d3228cd48127e49e5c59ed3c10dc9ce1f87dd947c9cebefa7ebb034d3ceb3927bd8e95a905ab48b0
7
+ data.tar.gz: f56f418f2136734120cd716df80d6a3d41a830a59723b3273d6e64839bd808fac43c21f648195ca2f10ce76750d6db5dadc922efe7f739a563b7c46fb88112df
@@ -5,21 +5,30 @@ module ActionInterceptor
5
5
  module Controller
6
6
 
7
7
  def self.included(base)
8
- base.class_attribute :is_interceptor, :interceptor_filters
8
+ base.class_attribute :is_interceptor, :use_interceptor,
9
+ :interceptor_filters
9
10
  base.is_interceptor = false
11
+ base.use_interceptor = false
10
12
  base.interceptor_filters = {}
13
+
14
+ base.before_filter :delete_intercepted_url
15
+
16
+ base.helper_method :current_page?, :current_url, :current_url_hash
17
+
11
18
  base.extend(ClassMethods)
12
19
  end
13
20
 
14
- def current_url
15
- "#{request.protocol}#{request.host_with_port}#{request.fullpath}"
16
- end
21
+ protected
17
22
 
18
23
  def current_page?(url)
19
24
  # Blank is the current page
20
25
  url.blank? || URI(url).path == request.path
21
26
  end
22
27
 
28
+ def current_url
29
+ "#{request.protocol}#{request.host_with_port}#{request.fullpath}"
30
+ end
31
+
23
32
  def current_url_hash
24
33
  return @current_url_hash if @current_url_hash
25
34
 
@@ -31,15 +40,48 @@ module ActionInterceptor
31
40
  @current_url_hash = {key => url}
32
41
  end
33
42
 
34
- # Executes the given block as if it was an interceptor
43
+ def url_for(options = {})
44
+ url = super
45
+ return url unless self.use_interceptor
46
+
47
+ @intercepted_url_hash ||= self.is_interceptor ? intercepted_url_hash : \
48
+ current_url_hash
49
+
50
+ uri = URI(url)
51
+ new_query = URI.decode_www_form(uri.query || '') + \
52
+ @intercepted_url_hash.to_a
53
+ uri.query = URI.encode_www_form(new_query)
54
+ uri.to_s
55
+ end
56
+
57
+ # Executes the given block as if it was inside an interceptor
35
58
  def with_interceptor(&block)
36
- @previous_default_url_options ||= default_url_options
59
+ previous_use_interceptor = self.use_interceptor
60
+
61
+ begin
62
+ # Send the referer with intercepted requests
63
+ # So we don't rely on the user's browser to do it for us
64
+ self.use_interceptor = true
65
+
66
+ # Execute the block as if it was defined in this controller
67
+ instance_exec &block
68
+ rescue LocalJumpError => e
69
+ # Silently ignore `return` errors in the block
70
+ # and return the given value
71
+ e.exit_value
72
+ ensure
73
+ self.use_interceptor = previous_use_interceptor
74
+ end
75
+ end
76
+
77
+ # Executes the given block as if it was not inside an interceptor
78
+ def without_interceptor(&block)
79
+ previous_use_interceptor = self.use_interceptor
37
80
 
38
81
  begin
39
82
  # Send the referer with intercepted requests
40
83
  # So we don't rely on the user's browser to do it for us
41
- self.default_url_options = @previous_default_url_options
42
- .merge(current_url_hash)
84
+ self.use_interceptor = false
43
85
 
44
86
  # Execute the block as if it was defined in this controller
45
87
  instance_exec &block
@@ -48,10 +90,14 @@ module ActionInterceptor
48
90
  # and return the given value
49
91
  e.exit_value
50
92
  ensure
51
- self.default_url_options = @previous_default_url_options
93
+ self.use_interceptor = previous_use_interceptor
52
94
  end
53
95
  end
54
96
 
97
+ def delete_intercepted_url
98
+ session.delete(ActionInterceptor.intercepted_url_key)
99
+ end
100
+
55
101
  module ClassMethods
56
102
 
57
103
  def interceptor(*interceptor_names, &block)
@@ -85,18 +131,20 @@ module ActionInterceptor
85
131
  end
86
132
 
87
133
  def acts_as_interceptor(options = {})
88
- return if is_interceptor
89
134
  self.is_interceptor = true
135
+ self.use_interceptor = options[:override_url_options].nil? ? \
136
+ ActionInterceptor.override_url_options : \
137
+ options[:override_url_options]
90
138
 
91
- @override_url_options = options[:override_url_options].nil? ? \
92
- ActionInterceptor.override_url_options : \
93
- options[:override_url_options]
94
-
95
- class_eval do
139
+ class_exec do
96
140
 
97
141
  attr_writer :intercepted_url
98
142
 
99
- helper_method :intercepted_url
143
+ skip_before_filter :delete_intercepted_url
144
+
145
+ helper_method :intercepted_url, :intercepted_url_hash
146
+
147
+ protected
100
148
 
101
149
  def intercepted_url
102
150
  return @intercepted_url if @intercepted_url
@@ -127,30 +175,6 @@ module ActionInterceptor
127
175
  @intercepted_url_hash = {key => url}
128
176
  end
129
177
 
130
- alias_method :url_options_without_interceptor, :url_options
131
-
132
- def url_options_with_interceptor
133
- return @url_options_with_interceptor \
134
- if @url_options_with_interceptor
135
-
136
- @url_options_with_interceptor = intercepted_url_hash.merge(
137
- url_options_without_interceptor)
138
- end
139
-
140
- alias_method :url_options, :url_options_with_interceptor \
141
- if @override_url_options.nil? || @override_url_options
142
-
143
- def without_interceptor(&block)
144
- previous_url_options = url_options_with_interceptor
145
-
146
- begin
147
- @url_options_with_interceptor = url_options_without_interceptor
148
- instance_exec &block
149
- ensure
150
- @url_options_with_interceptor = previous_url_options
151
- end
152
- end
153
-
154
178
  def redirect_back(options = {})
155
179
  url = intercepted_url
156
180
 
@@ -1,4 +1,5 @@
1
1
  require 'action_interceptor/controller'
2
+ require 'action_interceptor/view'
2
3
 
3
4
  module ActionInterceptor
4
5
  class Engine < ::Rails::Engine
@@ -1,4 +1,4 @@
1
1
  module ActionInterceptor
2
- VERSION = '0.1.2'
2
+ VERSION = '0.2.0'
3
3
  end
4
4
 
@@ -0,0 +1,63 @@
1
+ module ActionInterceptor
2
+ module View
3
+
4
+ # Can't reuse url_for from controller
5
+ # because the view's super method is different
6
+ def url_for(options = {})
7
+ url = super
8
+ return url unless controller.use_interceptor
9
+
10
+ @intercepted_url_hash ||= controller.is_interceptor ? \
11
+ intercepted_url_hash : current_url_hash
12
+
13
+ uri = URI(url)
14
+ new_query = URI.decode_www_form(uri.query || '') + \
15
+ @intercepted_url_hash.to_a
16
+ uri.query = URI.encode_www_form(new_query)
17
+ uri.to_s
18
+ end
19
+
20
+ # Executes the given block as if it was inside an interceptor
21
+ def with_interceptor(&block)
22
+ previous_use_interceptor = controller.use_interceptor
23
+
24
+ begin
25
+ # Send the referer with intercepted requests
26
+ # So we don't rely on the user's browser to do it for us
27
+ controller.use_interceptor = true
28
+
29
+ # Execute the block as if it was defined in this controller
30
+ instance_exec &block
31
+ rescue LocalJumpError => e
32
+ # Silently ignore `return` errors in the block
33
+ # and return the given value
34
+ e.exit_value
35
+ ensure
36
+ controller.use_interceptor = previous_use_interceptor
37
+ end
38
+ end
39
+
40
+ # Executes the given block as if it was not inside an interceptor
41
+ def without_interceptor(&block)
42
+ previous_use_interceptor = controller.use_interceptor
43
+
44
+ begin
45
+ # Send the referer with intercepted requests
46
+ # So we don't rely on the user's browser to do it for us
47
+ controller.use_interceptor = false
48
+
49
+ # Execute the block as if it was defined in this controller
50
+ instance_exec &block
51
+ rescue LocalJumpError => e
52
+ # Silently ignore `return` errors in the block
53
+ # and return the given value
54
+ e.exit_value
55
+ ensure
56
+ controller.use_interceptor = previous_use_interceptor
57
+ end
58
+ end
59
+
60
+ end
61
+ end
62
+
63
+ ActionView::Base.send :include, ActionInterceptor::View
@@ -5,6 +5,7 @@ module ActionInterceptor
5
5
 
6
6
  it 'modifies ActionController::Base' do
7
7
  expect(ActionController::Base).to respond_to(:is_interceptor)
8
+ expect(ActionController::Base).to respond_to(:use_interceptor)
8
9
  expect(ActionController::Base).to respond_to(:interceptor_filters)
9
10
  expect(ActionController::Base.is_interceptor).to be_false
10
11
  expect(ActionController::Base.interceptor_filters).to be_a(Hash)
@@ -13,24 +14,29 @@ module ActionInterceptor
13
14
  expect(ActionController::Base).to respond_to(:skip_interceptor)
14
15
  expect(ActionController::Base).to respond_to(:acts_as_interceptor)
15
16
 
16
- expect(ActionController::Base.new).to respond_to(:current_page?)
17
- expect(ActionController::Base.new).to respond_to(:current_url)
18
- expect(ActionController::Base.new).to respond_to(:current_url_hash)
19
- expect(ActionController::Base.new).to respond_to(:with_interceptor)
17
+ expect(ActionController::Base.new.respond_to?(
18
+ :current_page?, true)).to be_true
19
+ expect(ActionController::Base.new.respond_to?(
20
+ :current_url, true)).to be_true
21
+ expect(ActionController::Base.new.respond_to?(
22
+ :current_url_hash, true)).to be_true
23
+ expect(ActionController::Base.new.respond_to?(
24
+ :with_interceptor, true)).to be_true
25
+ expect(ActionController::Base.new.respond_to?(
26
+ :without_interceptor, true)).to be_true
20
27
  end
21
28
 
22
29
  it 'modifies classes that act_as_interceptor' do
23
30
  expect(RegistrationsController.is_interceptor).to be_true
24
31
 
25
- expect(RegistrationsController.new).to respond_to(:intercepted_url)
26
- expect(RegistrationsController.new).to respond_to(:intercepted_url=)
27
- expect(RegistrationsController.new).to respond_to(:intercepted_url_hash)
28
- expect(RegistrationsController.new).to(
29
- respond_to(:url_options_without_interceptor))
30
- expect(RegistrationsController.new).to(
31
- respond_to(:url_options_with_interceptor))
32
- expect(RegistrationsController.new).to respond_to(:without_interceptor)
33
- expect(RegistrationsController.new).to respond_to(:redirect_back)
32
+ expect(RegistrationsController.new.respond_to?(
33
+ :intercepted_url, true)).to be_true
34
+ expect(RegistrationsController.new.respond_to?(
35
+ :intercepted_url=, true)).to be_true
36
+ expect(RegistrationsController.new.respond_to?(
37
+ :intercepted_url_hash, true)).to be_true
38
+ expect(RegistrationsController.new.respond_to?(
39
+ :redirect_back, true)).to be_true
34
40
  end
35
41
 
36
42
  it 'registers and skips before_filters' do
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ module ActionInterceptor
4
+ describe View do
5
+
6
+ it 'modifies ActionView::Base' do
7
+ expect(ActionView::Base.new).to respond_to(:with_interceptor)
8
+ expect(ActionView::Base.new).to respond_to(:without_interceptor)
9
+ end
10
+
11
+ end
12
+ end
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_interceptor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dante Soares
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-31 00:00:00.000000000 Z
11
+ date: 2014-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: sqlite3
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec-rails
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: Action Interceptor provides controllers that require users to perform
@@ -71,6 +71,7 @@ files:
71
71
  - lib/action_interceptor/engine.rb
72
72
  - lib/action_interceptor/undefined_interceptor.rb
73
73
  - lib/action_interceptor/version.rb
74
+ - lib/action_interceptor/view.rb
74
75
  - lib/tasks/action_interceptor_tasks.rake
75
76
  - spec/dummy/README.md
76
77
  - spec/dummy/Rakefile
@@ -110,6 +111,7 @@ files:
110
111
  - spec/dummy/public/favicon.ico
111
112
  - spec/lib/action_interceptor/controller_spec.rb
112
113
  - spec/lib/action_interceptor/encryptor_spec.rb
114
+ - spec/lib/action_interceptor/view_spec.rb
113
115
  - spec/lib/action_interceptor_spec.rb
114
116
  - spec/spec_helper.rb
115
117
  homepage: http://github.com/openstax/action_interceptor
@@ -122,12 +124,12 @@ require_paths:
122
124
  - lib
123
125
  required_ruby_version: !ruby/object:Gem::Requirement
124
126
  requirements:
125
- - - ! '>='
127
+ - - ">="
126
128
  - !ruby/object:Gem::Version
127
129
  version: '0'
128
130
  required_rubygems_version: !ruby/object:Gem::Requirement
129
131
  requirements:
130
- - - ! '>='
132
+ - - ">="
131
133
  - !ruby/object:Gem::Version
132
134
  version: '0'
133
135
  requirements: []
@@ -175,5 +177,6 @@ test_files:
175
177
  - spec/dummy/README.md
176
178
  - spec/lib/action_interceptor/controller_spec.rb
177
179
  - spec/lib/action_interceptor/encryptor_spec.rb
180
+ - spec/lib/action_interceptor/view_spec.rb
178
181
  - spec/lib/action_interceptor_spec.rb
179
182
  - spec/spec_helper.rb