rack-mount 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. data/lib/rack/mount.rb +3 -13
  2. data/lib/rack/mount/analysis/frequency.rb +0 -2
  3. data/lib/rack/mount/analysis/splitting.rb +2 -2
  4. data/lib/rack/mount/code_generation.rb +113 -0
  5. data/lib/rack/mount/generatable_regexp.rb +1 -1
  6. data/lib/rack/mount/route.rb +69 -5
  7. data/lib/rack/mount/route_set.rb +289 -46
  8. data/lib/rack/mount/strexp.rb +53 -50
  9. data/lib/rack/mount/utils.rb +7 -7
  10. data/lib/rack/mount/vendor/reginald/reginald.rb +2 -1
  11. data/lib/rack/mount/vendor/reginald/reginald/alternation.rb +11 -1
  12. data/lib/rack/mount/vendor/reginald/reginald/atom.rb +17 -5
  13. data/lib/rack/mount/vendor/reginald/reginald/character.rb +11 -2
  14. data/lib/rack/mount/vendor/reginald/reginald/character_class.rb +8 -20
  15. data/lib/rack/mount/vendor/reginald/reginald/collection.rb +10 -6
  16. data/lib/rack/mount/vendor/reginald/reginald/expression.rb +30 -20
  17. data/lib/rack/mount/vendor/reginald/reginald/group.rb +22 -8
  18. data/lib/rack/mount/vendor/reginald/reginald/options.rb +47 -0
  19. data/lib/rack/mount/vendor/reginald/reginald/parser.rb +137 -273
  20. data/lib/rack/mount/vendor/reginald/reginald/tokenizer.rb +1 -1
  21. data/lib/rack/mount/vendor/reginald/reginald/version.rb +3 -0
  22. data/lib/rack/mount/version.rb +1 -1
  23. metadata +6 -10
  24. data/lib/rack/mount/exceptions.rb +0 -3
  25. data/lib/rack/mount/generation/route.rb +0 -59
  26. data/lib/rack/mount/generation/route_set.rb +0 -200
  27. data/lib/rack/mount/mixover.rb +0 -60
  28. data/lib/rack/mount/recognition/code_generation.rb +0 -124
  29. data/lib/rack/mount/recognition/route.rb +0 -62
  30. data/lib/rack/mount/recognition/route_set.rb +0 -121
@@ -140,7 +140,7 @@ class Parser < Racc::Parser
140
140
  action { [:NEGATE, text] }
141
141
 
142
142
  when (text = @ss.scan(/:(alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|punct|space|upper|word|xdigit):/))
143
- action { [@ss[1], text] }
143
+ action { [:CTYPE, text] }
144
144
 
145
145
  when (text = @ss.scan(/\\-/))
146
146
  action { [:CHAR, text] }
@@ -0,0 +1,3 @@
1
+ module Reginald
2
+ Version = '0.2.0'
3
+ end
@@ -1,3 +1,3 @@
1
1
  module Rack::Mount
2
- Version = '0.6.1'
2
+ Version = '0.6.2'
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 6
8
- - 1
9
- version: 0.6.1
8
+ - 2
9
+ version: 0.6.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Joshua Peek
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-06 00:00:00 -06:00
17
+ date: 2010-04-13 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -32,16 +32,10 @@ files:
32
32
  - lib/rack/mount/analysis/frequency.rb
33
33
  - lib/rack/mount/analysis/histogram.rb
34
34
  - lib/rack/mount/analysis/splitting.rb
35
- - lib/rack/mount/exceptions.rb
35
+ - lib/rack/mount/code_generation.rb
36
36
  - lib/rack/mount/generatable_regexp.rb
37
- - lib/rack/mount/generation/route.rb
38
- - lib/rack/mount/generation/route_set.rb
39
- - lib/rack/mount/mixover.rb
40
37
  - lib/rack/mount/multimap.rb
41
38
  - lib/rack/mount/prefix.rb
42
- - lib/rack/mount/recognition/code_generation.rb
43
- - lib/rack/mount/recognition/route.rb
44
- - lib/rack/mount/recognition/route_set.rb
45
39
  - lib/rack/mount/regexp_with_named_groups.rb
46
40
  - lib/rack/mount/route.rb
47
41
  - lib/rack/mount/route_set.rb
@@ -63,8 +57,10 @@ files:
63
57
  - lib/rack/mount/vendor/reginald/reginald/collection.rb
64
58
  - lib/rack/mount/vendor/reginald/reginald/expression.rb
65
59
  - lib/rack/mount/vendor/reginald/reginald/group.rb
60
+ - lib/rack/mount/vendor/reginald/reginald/options.rb
66
61
  - lib/rack/mount/vendor/reginald/reginald/parser.rb
67
62
  - lib/rack/mount/vendor/reginald/reginald/tokenizer.rb
63
+ - lib/rack/mount/vendor/reginald/reginald/version.rb
68
64
  - lib/rack/mount/version.rb
69
65
  has_rdoc: true
70
66
  homepage: http://github.com/josh/rack-mount
@@ -1,3 +0,0 @@
1
- module Rack::Mount
2
- class RoutingError < StandardError; end
3
- end
@@ -1,59 +0,0 @@
1
- require 'rack/mount/utils'
2
-
3
- module Rack::Mount
4
- module Generation
5
- module Route #:nodoc:
6
- def initialize(*args)
7
- super
8
-
9
- @has_significant_params = @conditions.any? { |method, condition|
10
- (condition.respond_to?(:required_params) && condition.required_params.any?) ||
11
- (condition.respond_to?(:required_defaults) && condition.required_defaults.any?)
12
- }
13
- end
14
-
15
- def generation_keys
16
- @conditions.inject({}) { |keys, (method, condition)|
17
- if condition.respond_to?(:required_defaults)
18
- keys.merge!(condition.required_defaults)
19
- else
20
- keys
21
- end
22
- }
23
- end
24
-
25
- def significant_params?
26
- @has_significant_params
27
- end
28
-
29
- def generate(method, params = {}, recall = {}, options = {})
30
- if method.nil?
31
- result = @conditions.inject({}) { |h, (method, condition)|
32
- if condition.respond_to?(:generate)
33
- h[method] = condition.generate(params, recall, options)
34
- end
35
- h
36
- }
37
- return nil if result.values.compact.empty?
38
- else
39
- result = generate_method(method, params, recall, options)
40
- end
41
-
42
- if result
43
- @defaults.each do |key, value|
44
- params.delete(key) if params[key] == value
45
- end
46
- end
47
-
48
- result
49
- end
50
-
51
- private
52
- def generate_method(method, params, recall, options)
53
- if condition = @conditions[method]
54
- condition.generate(params, recall, options)
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,200 +0,0 @@
1
- require 'rack/mount/utils'
2
- require 'forwardable'
3
-
4
- module Rack::Mount
5
- module Generation
6
- module RouteSet
7
- # Adds generation related concerns to RouteSet.new.
8
- def initialize(*args)
9
- @named_routes = {}
10
- @generation_key_analyzer = Analysis::Frequency.new
11
-
12
- super
13
- end
14
-
15
- # Adds generation aspects to RouteSet#add_route.
16
- def add_route(*args)
17
- route = super
18
- @named_routes[route.name] = route if route.name
19
- @generation_key_analyzer << route.generation_keys
20
- route
21
- end
22
-
23
- # Generates a url from Rack env and identifiers or significant keys.
24
- #
25
- # To generate a url by named route, pass the name in as a +Symbol+.
26
- # url(env, :dashboard) # => "/dashboard"
27
- #
28
- # Additional parameters can be passed in as a hash
29
- # url(env, :people, :id => "1") # => "/people/1"
30
- #
31
- # If no name route is given, it will fall back to a slower
32
- # generation search.
33
- # url(env, :controller => "people", :action => "show", :id => "1")
34
- # # => "/people/1"
35
- def url(env, *args)
36
- named_route, params = nil, {}
37
-
38
- case args.length
39
- when 2
40
- named_route, params = args[0], args[1].dup
41
- when 1
42
- if args[0].is_a?(Hash)
43
- params = args[0].dup
44
- else
45
- named_route = args[0]
46
- end
47
- else
48
- raise ArgumentError
49
- end
50
-
51
- only_path = params.delete(:only_path)
52
- recall = env[@parameters_key] || {}
53
-
54
- unless result = generate(:all, named_route, params, recall,
55
- :parameterize => lambda { |name, param| Utils.escape_uri(param) })
56
- return
57
- end
58
-
59
- parts, params = result
60
- return unless parts
61
-
62
- params.each do |k, v|
63
- if v
64
- params[k] = v
65
- else
66
- params.delete(k)
67
- end
68
- end
69
-
70
- req = stubbed_request_class.new(env)
71
- req._stubbed_values = parts.merge(:query_string => Utils.build_nested_query(params))
72
- only_path ? req.fullpath : req.url
73
- end
74
-
75
- def generate(method, *args) #:nodoc:
76
- raise 'route set not finalized' unless @generation_graph
77
-
78
- method = nil if method == :all
79
- named_route, params, recall, options = extract_params!(*args)
80
- merged = recall.merge(params)
81
- route = nil
82
-
83
- if named_route
84
- if route = @named_routes[named_route.to_sym]
85
- recall = route.defaults.merge(recall)
86
- url = route.generate(method, params, recall, options)
87
- [url, params]
88
- else
89
- raise RoutingError, "#{named_route} failed to generate from #{params.inspect}"
90
- end
91
- else
92
- keys = @generation_keys.map { |key|
93
- if k = merged[key]
94
- k.to_s
95
- else
96
- nil
97
- end
98
- }
99
- @generation_graph[*keys].each do |r|
100
- next unless r.significant_params?
101
- if url = r.generate(method, params, recall, options)
102
- return [url, params]
103
- end
104
- end
105
-
106
- raise RoutingError, "No route matches #{params.inspect}"
107
- end
108
- end
109
-
110
- def rehash #:nodoc:
111
- @generation_keys = build_generation_keys
112
- @generation_graph = build_generation_graph
113
-
114
- super
115
- end
116
-
117
- private
118
- def expire!
119
- @generation_keys = @generation_graph = nil
120
- @generation_key_analyzer.expire!
121
- super
122
- end
123
-
124
- def flush!
125
- @generation_key_analyzer = nil
126
- super
127
- end
128
-
129
- def build_generation_graph
130
- build_nested_route_set(@generation_keys) { |k, i|
131
- throw :skip unless @routes[i].significant_params?
132
-
133
- if k = @generation_key_analyzer.possible_keys[i][k]
134
- k.to_s
135
- else
136
- nil
137
- end
138
- }
139
- end
140
-
141
- def build_generation_keys
142
- @generation_key_analyzer.report
143
- end
144
-
145
- def extract_params!(*args)
146
- case args.length
147
- when 4
148
- named_route, params, recall, options = args
149
- when 3
150
- if args[0].is_a?(Hash)
151
- params, recall, options = args
152
- else
153
- named_route, params, recall = args
154
- end
155
- when 2
156
- if args[0].is_a?(Hash)
157
- params, recall = args
158
- else
159
- named_route, params = args
160
- end
161
- when 1
162
- if args[0].is_a?(Hash)
163
- params = args[0]
164
- else
165
- named_route = args[0]
166
- end
167
- else
168
- raise ArgumentError
169
- end
170
-
171
- named_route ||= nil
172
- params ||= {}
173
- recall ||= {}
174
- options ||= {}
175
-
176
- [named_route, params.dup, recall.dup, options.dup]
177
- end
178
-
179
- def instance_variables_to_serialize
180
- super - [:@stubbed_request_class]
181
- end
182
-
183
- def stubbed_request_class
184
- @stubbed_request_class ||= begin
185
- klass = Class.new(@request_class)
186
- klass.public_instance_methods.each do |method|
187
- next if method =~ /^__|object_id/
188
- klass.class_eval <<-RUBY
189
- def #{method}(*args, &block)
190
- @_stubbed_values[:#{method}] || super
191
- end
192
- RUBY
193
- end
194
- klass.class_eval { attr_accessor :_stubbed_values }
195
- klass
196
- end
197
- end
198
- end
199
- end
200
- end
@@ -1,60 +0,0 @@
1
- module Rack::Mount
2
- # A mixin that changes the behavior of +include+. Instead of modules
3
- # being chained as a superclass, they are mixed into the objects
4
- # metaclass. This allows mixins to be stacked ontop of the instance
5
- # methods.
6
- module Mixover
7
- def self.extended(klass)
8
- klass.instance_eval do
9
- @extended_modules = []
10
- end
11
- end
12
-
13
- module InstanceMethods #:nodoc:
14
- def dup
15
- obj = super
16
- included_modules = (class << self; included_modules; end) - (class << obj; included_modules; end)
17
- included_modules.reverse.each { |mod| obj.extend(mod) }
18
- obj
19
- end
20
- end
21
-
22
- # Replaces include with a lazy version.
23
- def include(*mod)
24
- extended_modules.push(*mod)
25
- end
26
-
27
- def extended_modules
28
- Thread.current[extended_modules_thread_local_key] || @extended_modules
29
- end
30
-
31
- def new(*args, &block) #:nodoc:
32
- obj = allocate
33
- obj.extend(InstanceMethods)
34
- extended_modules.each { |mod| obj.extend(mod) }
35
- obj.send(:initialize, *args, &block)
36
- obj
37
- end
38
-
39
- # Create a new class without an included module.
40
- def new_without_module(mod, *args, &block)
41
- (Thread.current[extended_modules_thread_local_key] = extended_modules.dup).delete(mod)
42
- new(*args, &block)
43
- ensure
44
- Thread.current[extended_modules_thread_local_key] = nil
45
- end
46
-
47
- # Create a new class temporarily with a module.
48
- def new_with_module(mod, *args, &block)
49
- (Thread.current[extended_modules_thread_local_key] = extended_modules.dup).push(*mod)
50
- new(*args, &block)
51
- ensure
52
- Thread.current[extended_modules_thread_local_key] = nil
53
- end
54
-
55
- private
56
- def extended_modules_thread_local_key
57
- "mixover_extended_modules_#{object_id}"
58
- end
59
- end
60
- end
@@ -1,124 +0,0 @@
1
- module Rack::Mount
2
- module Recognition
3
- module CodeGeneration #:nodoc:
4
- def initialize(*args)
5
- @optimized_recognize_defined = false
6
- super
7
- end
8
-
9
- def _expired_recognize(env) #:nodoc:
10
- raise 'route set not finalized'
11
- end
12
-
13
- def rehash
14
- super
15
- optimize_recognize!
16
- end
17
-
18
- private
19
- def instance_variables_to_serialize
20
- super - [:@optimized_recognize_defined]
21
- end
22
-
23
- def expire!
24
- if @optimized_recognize_defined
25
- remove_metaclass_method :recognize
26
-
27
- class << self
28
- alias_method :recognize, :_expired_recognize
29
- end
30
-
31
- @optimized_recognize_defined = false
32
- end
33
-
34
- super
35
- end
36
-
37
- def optimize_container_iterator(container)
38
- body = []
39
-
40
- container.each_with_index { |route, i|
41
- body << "route = self[#{i}]"
42
- body << 'matches = {}'
43
- body << 'params = route.defaults.dup'
44
-
45
- conditions = []
46
- route.conditions.each do |method, condition|
47
- b = []
48
- if condition.is_a?(Regexp)
49
- b << "if m = obj.#{method}.match(#{condition.inspect})"
50
- b << "matches[:#{method}] = m"
51
- if (named_captures = route.named_captures[method]) && named_captures.any?
52
- b << 'captures = m.captures'
53
- b << 'p = nil'
54
- b << named_captures.map { |k, j| "params[#{k.inspect}] = p if p = captures[#{j}]" }.join('; ')
55
- end
56
- else
57
- b << "if m = obj.#{method} == route.conditions[:#{method}]"
58
- end
59
- b << 'true'
60
- b << 'end'
61
- conditions << "(#{b.join('; ')})"
62
- end
63
-
64
- body << <<-RUBY
65
- if #{conditions.join(' && ')}
66
- yield route, matches, params
67
- end
68
- RUBY
69
- }
70
-
71
- container.instance_eval(<<-RUBY, __FILE__, __LINE__)
72
- def optimized_each(obj)
73
- #{body.join("\n")}
74
- nil
75
- end
76
- RUBY
77
- end
78
-
79
- def optimize_recognize!
80
- keys = @recognition_keys.map { |key|
81
- if key.respond_to?(:call_source)
82
- key.call_source(:cache, :obj)
83
- else
84
- "obj.#{key}"
85
- end
86
- }.join(', ')
87
-
88
- @optimized_recognize_defined = true
89
-
90
- remove_metaclass_method :recognize
91
-
92
- instance_eval(<<-RUBY, __FILE__, __LINE__)
93
- def recognize(obj)
94
- cache = {}
95
- container = @recognition_graph[#{keys}]
96
- optimize_container_iterator(container) unless container.respond_to?(:optimized_each)
97
-
98
- if block_given?
99
- container.optimized_each(obj) do |route, matches, params|
100
- yield route, matches, params
101
- end
102
- else
103
- container.optimized_each(obj) do |route, matches, params|
104
- return route, matches, params
105
- end
106
- end
107
-
108
- nil
109
- end
110
- RUBY
111
- end
112
-
113
- # method_defined? can't distinguish between instance
114
- # and meta methods. So we have to rescue if the method
115
- # has not been defined in the metaclass yet.
116
- def remove_metaclass_method(symbol)
117
- metaclass = class << self; self; end
118
- metaclass.send(:remove_method, symbol)
119
- rescue NameError => e
120
- nil
121
- end
122
- end
123
- end
124
- end