routing-filter 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -21,8 +21,8 @@ ActionDispatch::Routing::RouteSet.class_eval do
21
21
  end
22
22
  alias_method_chain :recognize_path, :filtering
23
23
 
24
- def generate_with_filtering(*args)
25
- @set.filters.run(:around_generate, args.first, &lambda{ generate_without_filtering(*args) })
24
+ def generate_with_filtering(options, recall = {}, extras = false)
25
+ @set.filters.run(:around_generate, options, &lambda{ generate_without_filtering(options, recall, extras) })
26
26
  end
27
27
  alias_method_chain :generate, :filtering
28
28
 
@@ -38,7 +38,7 @@ require 'rack/mount/code_generation'
38
38
 
39
39
  Rack::Mount::RouteSet.class_eval do
40
40
  def filters
41
- @filters ||= RoutingFilter::Chain.new
41
+ @filters || RoutingFilter::Chain.new.tap { |f| @filters = f unless frozen? }
42
42
  end
43
43
  end
44
44
 
@@ -56,12 +56,13 @@ Rack::Mount::CodeGeneration.class_eval do
56
56
  # note: if you overly and unnecessarily use blocks in your lowlevel libraries you make it fricking
57
57
  # hard for your users to hook in anywhere
58
58
  def recognize_with_filtering(request, &block)
59
- route, matches, params = nil
60
- filters.run(:around_recognize, request.env['PATH_INFO'], {}) do |path, env|
61
- recognize_without_filtering(request) { |r, m, p| route, matches, params = r, m, p }
62
- params
59
+ path, route, matches, params = request.env['PATH_INFO'], nil, nil, nil
60
+ filters.run(:around_recognize, path, {}) do
61
+ path.replace('/') if path.empty?
62
+ route, matches, params = recognize_without_filtering(request)
63
+ params || {}
63
64
  end
64
- block.call(route, matches, params)
65
+ block.call(route, matches, params) if route
65
66
  end
66
67
  end
67
68
 
@@ -6,11 +6,11 @@ module RoutingFilter
6
6
  end
7
7
 
8
8
  def run(method, *args, &final)
9
- RoutingFilter.active? ? first.run(method, *args, &final) : final.call
9
+ active? ? first.run(method, *args, &final) : final.call
10
10
  end
11
11
 
12
12
  def active?
13
- RoutingFilter.active && !empty?
13
+ RoutingFilter.active? && !empty?
14
14
  end
15
15
  end
16
16
  end
@@ -1,7 +1,7 @@
1
1
  module RoutingFilter
2
2
  class Filter
3
3
  attr_accessor :next, :previous, :options
4
-
4
+
5
5
  def initialize(options = {})
6
6
  @options = options
7
7
  end
@@ -15,5 +15,22 @@ module RoutingFilter
15
15
  _prev = previous ? lambda { previous.run_reverse(method, *args, &block) } : block
16
16
  RoutingFilter.active? ? send(method, *args, &_prev) : _prev.call(*args)
17
17
  end
18
+
19
+ protected
20
+
21
+ def extract_segment!(pattern, path)
22
+ path.sub!(pattern, '')
23
+ $1
24
+ end
25
+
26
+ def prepend_segment!(result, segment)
27
+ url = result.is_a?(Array) ? result.first : result
28
+ url.sub!(%r(^(http.?://[^/]*)?(.*))) { "#{$1}/#{segment}#{$2 == '/' ? '' : $2}" }
29
+ end
30
+
31
+ def append_segment!(result, segment)
32
+ url = result.is_a?(Array) ? result.first : result
33
+ url.sub!(%r(/?($|\?))) { "/#{segment}#{$1}" }
34
+ end
18
35
  end
19
36
  end
@@ -1,12 +1,12 @@
1
- # The Locale filter extracts segments matching /:locale from the beginning of
1
+ # The Locale filter extracts segments matching /:locale from the beginning of
2
2
  # the recognized path and exposes the page parameter as params[:page]. When a
3
3
  # path is generated the filter adds the segments to the path accordingly if
4
4
  # the page parameter is passed to the url helper.
5
- #
5
+ #
6
6
  # incoming url: /de/products/page/1
7
7
  # filtered url: /de/products
8
8
  # params: params[:locale] = 'de'
9
- #
9
+ #
10
10
  # You can install the filter like this:
11
11
  #
12
12
  # # in config/routes.rb
@@ -14,7 +14,7 @@
14
14
  # filter :locale
15
15
  # end
16
16
  #
17
- # To make your named_route helpers or url_for add the pagination segments you
17
+ # To make your named_route helpers or url_for add the pagination segments you
18
18
  # can use:
19
19
  #
20
20
  # products_path(:locale => 'de')
@@ -46,29 +46,24 @@ module RoutingFilter
46
46
  end
47
47
 
48
48
  def around_recognize(path, env, &block)
49
- locale = extract_locale!(path) # remove the locale from the beginning of the path
50
- yield.tap do |params| # invoke the given block (calls more filters and finally routing)
51
- params[:locale] = locale if locale # set recognized locale to the resulting params hash
49
+ locale = extract_segment!(self.class.locales_pattern, path) # remove the locale from the beginning of the path
50
+ yield.tap do |params| # invoke the given block (calls more filters and finally routing)
51
+ params[:locale] = locale if locale # set recognized locale to the resulting params hash
52
52
  end
53
53
  end
54
54
 
55
- def around_generate(*args, &block)
56
- locale = args.extract_options!.delete(:locale) # extract the passed :locale option
57
- locale = I18n.locale if locale.nil? # default to I18n.locale when locale is nil (could also be false)
58
- locale = nil unless valid_locale?(locale) # reset to no locale when locale is not valid
55
+ def around_generate(params, &block)
56
+ locale = params.delete(:locale) # extract the passed :locale option
57
+ locale = I18n.locale if locale.nil? # default to I18n.locale when locale is nil (could also be false)
58
+ locale = nil unless valid_locale?(locale) # reset to no locale when locale is not valid
59
59
 
60
60
  yield.tap do |result|
61
- prepend_locale!(result, locale) if prepend_locale?(locale)
61
+ prepend_segment!(result, locale) if prepend_locale?(locale)
62
62
  end
63
63
  end
64
64
 
65
65
  protected
66
66
 
67
- def extract_locale!(path)
68
- path.sub!(self.class.locales_pattern, '')
69
- $1
70
- end
71
-
72
67
  def valid_locale?(locale)
73
68
  locale && self.class.locales.include?(locale.to_sym)
74
69
  end
@@ -80,10 +75,5 @@ module RoutingFilter
80
75
  def prepend_locale?(locale)
81
76
  locale && (self.class.include_default_locale? || !default_locale?(locale))
82
77
  end
83
-
84
- def prepend_locale!(result, locale)
85
- url = result.is_a?(Array) ? result.first : result
86
- url.sub!(%r(^(http.?://[^/]*)?(.*))) { "#{$1}/#{locale}#{$2}" }
87
- end
88
78
  end
89
79
  end
@@ -1,12 +1,12 @@
1
- # The Pagination filter extracts segments matching /page/:page from the end of
1
+ # The Pagination filter extracts segments matching /page/:page from the end of
2
2
  # the recognized url and exposes the page parameter as params[:page]. When a
3
3
  # url is generated the filter adds the segments to the url accordingly if the
4
4
  # page parameter is passed to the url helper.
5
- #
5
+ #
6
6
  # incoming url: /products/page/1
7
7
  # filtered url: /products
8
8
  # params: params[:page] = 1
9
- #
9
+ #
10
10
  # You can install the filter like this:
11
11
  #
12
12
  # # in config/routes.rb
@@ -14,7 +14,7 @@
14
14
  # filter :pagination
15
15
  # end
16
16
  #
17
- # To make your named_route helpers or url_for add the pagination segments you
17
+ # To make your named_route helpers or url_for add the pagination segments you
18
18
  # can use:
19
19
  #
20
20
  # products_path(:page => 1)
@@ -22,30 +22,26 @@
22
22
 
23
23
  module RoutingFilter
24
24
  class Pagination < Filter
25
+ PAGINATION_SEGMENT = %r(/page/([\d]+)/?$)
26
+
25
27
  def around_recognize(path, env, &block)
26
- page = extract_page!(path)
28
+ page = extract_segment!(PAGINATION_SEGMENT, path)
27
29
  yield(path, env).tap do |params|
28
30
  params[:page] = page.to_i if page
29
31
  end
30
32
  end
31
33
 
32
- def around_generate(*args, &block)
33
- page = args.extract_options!.delete(:page)
34
+ def around_generate(params, &block)
35
+ page = params.delete(:page)
34
36
  yield.tap do |result|
35
- append_page!(result, page) if page && page.to_i != 1
37
+ append_segment!(result, "page/#{page}") if append_page?(page)
36
38
  end
37
39
  end
38
40
 
39
41
  protected
40
42
 
41
- def extract_page!(path)
42
- path.sub! %r(/page/([\d]+)/?$), ''
43
- $1
44
- end
45
-
46
- def append_page!(result, page)
47
- url = result.is_a?(Array) ? result.first : result
48
- url.sub!(/($|\?)/) { "/page/#{page}#{$1}" }
43
+ def append_page?(page)
44
+ page && page.to_i != 1
49
45
  end
50
46
  end
51
47
  end
@@ -21,32 +21,20 @@
21
21
 
22
22
  module RoutingFilter
23
23
  class Uuid < Filter
24
- UUID_SEGMENT = %r(^/?([a-z\d]{8}\-[a-z\d]{4}\-[a-z\d]{4}\-[a-z\d]{4}\-[a-z\d]{12})/)
24
+ UUID_SEGMENT = %r(^/?([a-z\d]{8}\-[a-z\d]{4}\-[a-z\d]{4}\-[a-z\d]{4}\-[a-z\d]{12})/?)
25
25
 
26
26
  def around_recognize(path, env, &block)
27
- uuid = extract_uuid!(path)
27
+ uuid = extract_segment!(UUID_SEGMENT, path)
28
28
  yield.tap do |params|
29
29
  params[:uuid] = uuid if uuid
30
30
  end
31
31
  end
32
32
 
33
- def around_generate(*args, &block)
34
- uuid = args.extract_options!.delete(:uuid)
33
+ def around_generate(params, &block)
34
+ uuid = params.delete(:uuid)
35
35
  yield.tap do |result|
36
- prepend_uuid!(result, uuid) if uuid
36
+ prepend_segment!(result, uuid) if uuid
37
37
  end
38
38
  end
39
-
40
- protected
41
-
42
- def extract_uuid!(path)
43
- path.sub!(UUID_SEGMENT, '/')
44
- $1
45
- end
46
-
47
- def prepend_uuid!(result, uuid)
48
- url = result.is_a?(Array) ? result.first : result
49
- url.sub!(%r(^(http.?://[^/]*)?(.*))) { "#{$1}/#{uuid}#{$2}" }
50
- end
51
39
  end
52
40
  end
@@ -1,3 +1,3 @@
1
1
  module RoutingFilter
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.4'
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: routing-filter
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 3
10
- version: 0.1.3
9
+ - 4
10
+ version: 0.1.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sven Fuchs