route_matcher 0.0.5 → 0.0.6

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 ADDED
@@ -0,0 +1,23 @@
1
+ # RouteMatcher
2
+ Your Rails 3 route helper for pretty URLs sharing the same dynamic path "part"
3
+
4
+ For example, have both routes on the same path part
5
+
6
+ # in config/routes.rb
7
+ ':brand' => 'brands#show' # /nike
8
+ ':brand_category' => 'brands#category' # /fashion
9
+
10
+ With rails 3 you can use constrains to seperate between them. But what if you those constrains are data driven? Then RouteMatcher may come in handy:
11
+
12
+ # in config/routes.rb
13
+ ':brand' => 'brands#show', constraints => RouteMatcher::UrlMatcher.new('brands') { Brand.map{|b| "/#{b.slug}" } }
14
+
15
+ # in brand.rb
16
+ after_save { RouteMatcher::UrlMatcher.mark_dirty('brands') }
17
+
18
+ * Matcher lazy loads, it prevents database calls at the start of the app (and rake tasks for example)
19
+ * It caches the allowed URLs in memory to prevent database calls on each request
20
+ * Uses a timestamp in Rails.cache for cache invalidation
21
+
22
+ ## Known issues
23
+ * If you have a multi process production environment (which is pretty likely), it will only work with a shared Rails cache, like memcache (cause of the timestamps)
data/lib/route_matcher.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "route_matcher/url_matcher"
2
+ require "route_matcher/param_matcher"
2
3
  require "route_matcher/version"
3
4
 
4
5
  module RouteMatcher
@@ -0,0 +1,39 @@
1
+ module RouteMatcher
2
+ class ParamMatcher
3
+ CACHE_KEY = "route_matcher_param_matcher_%s"
4
+
5
+ def initialize(name, &block)
6
+ @name, @block = name, block
7
+ Rails.cache.write(CACHE_KEY % @name, Time.now, :unless_exists => true)
8
+ end
9
+
10
+ def matches?(request)
11
+ reload if @timestamp != get_stamp
12
+
13
+ # make sure new parameters are made for the actual route
14
+ params = request.params
15
+ request.env["action_dispatch.request.parameters"] = nil
16
+
17
+ case @match_with
18
+ when Array
19
+ @match_with.any? {|m| m === params[@name] }
20
+ when String, Regexp
21
+ @match_with === params[@name]
22
+ end
23
+ end
24
+
25
+ def reload
26
+ @match_with = @block.call
27
+ @timestamp = get_stamp
28
+ end
29
+
30
+ def self.mark_dirty(name)
31
+ Rails.cache.write(CACHE_KEY % name, Time.now)
32
+ end
33
+
34
+ private
35
+ def get_stamp
36
+ Rails.cache.read(CACHE_KEY % @name)
37
+ end
38
+ end
39
+ end
@@ -1,7 +1,3 @@
1
- # TODO: This works only on a shared cache
2
- # like one development server or production with a memcacheserver
3
- # NOT on production with few mongrels and an in-memory-cache)
4
-
5
1
  module RouteMatcher
6
2
  class UrlMatcher
7
3
  CACHE_KEY = "route_matcher_url_matcher_%s"
@@ -1,3 +1,3 @@
1
1
  module RouteMatcher
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -8,10 +8,8 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["Raymond Vellener", "Jaap van der Plas"]
9
9
  s.email = ["raymond@brightin.nl", "jaap@brightin.nl"]
10
10
  s.homepage = "http://brightin.nl"
11
- s.summary = %q{ Constraint object to allow only certain url's }
12
- s.description = %q{ Constraint object to allow only certain url's }
13
-
14
- s.rubyforge_project = "route_matcher"
11
+ s.summary = %q{ Your Rails 3 route helper for pretty urls sharing the same dynamic path "part" }
12
+ s.description = %q{ Your Rails 3 route helper for pretty urls sharing the same dynamic path "part". For example, use brands names and brand categories directly after the domain: /nike, /adidas, but also /sports and /fashion }
15
13
 
16
14
  s.files = `git ls-files`.split("\n")
17
15
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: route_matcher
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 19
4
5
  prerelease:
5
- version: 0.0.5
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 6
10
+ version: 0.0.6
6
11
  platform: ruby
7
12
  authors:
8
13
  - Raymond Vellener
@@ -11,10 +16,11 @@ autorequire:
11
16
  bindir: bin
12
17
  cert_chain: []
13
18
 
14
- date: 2011-06-04 00:00:00 Z
19
+ date: 2011-06-05 00:00:00 +02:00
20
+ default_executable:
15
21
  dependencies: []
16
22
 
17
- description: " Constraint object to allow only certain url's "
23
+ description: " Your Rails 3 route helper for pretty urls sharing the same dynamic path \"part\". For example, use brands names and brand categories directly after the domain: /nike, /adidas, but also /sports and /fashion "
18
24
  email:
19
25
  - raymond@brightin.nl
20
26
  - jaap@brightin.nl
@@ -27,11 +33,14 @@ extra_rdoc_files: []
27
33
  files:
28
34
  - .gitignore
29
35
  - Gemfile
36
+ - README.md
30
37
  - Rakefile
31
38
  - lib/route_matcher.rb
39
+ - lib/route_matcher/param_matcher.rb
32
40
  - lib/route_matcher/url_matcher.rb
33
41
  - lib/route_matcher/version.rb
34
42
  - route_matcher.gemspec
43
+ has_rdoc: true
35
44
  homepage: http://brightin.nl
36
45
  licenses: []
37
46
 
@@ -45,19 +54,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
45
54
  requirements:
46
55
  - - ">="
47
56
  - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
48
60
  version: "0"
49
61
  required_rubygems_version: !ruby/object:Gem::Requirement
50
62
  none: false
51
63
  requirements:
52
64
  - - ">="
53
65
  - !ruby/object:Gem::Version
66
+ hash: 3
67
+ segments:
68
+ - 0
54
69
  version: "0"
55
70
  requirements: []
56
71
 
57
- rubyforge_project: route_matcher
58
- rubygems_version: 1.8.5
72
+ rubyforge_project:
73
+ rubygems_version: 1.4.2
59
74
  signing_key:
60
75
  specification_version: 3
61
- summary: Constraint object to allow only certain url's
76
+ summary: Your Rails 3 route helper for pretty urls sharing the same dynamic path "part"
62
77
  test_files: []
63
78