rack-mount 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -54,6 +54,10 @@ module Rack::Mount
54
54
  end
55
55
  end
56
56
 
57
+ def expire!
58
+ @possible_keys = @report = nil
59
+ end
60
+
57
61
  private
58
62
  def parse_regexp(regexp)
59
63
  @parse_regexp_cache ||= {}
@@ -98,6 +98,7 @@ module Rack::Mount
98
98
  private
99
99
  def expire!
100
100
  @generation_keys = @generation_graph = nil
101
+ @generation_key_analyzer.expire!
101
102
  super
102
103
  end
103
104
 
@@ -1,6 +1,11 @@
1
1
  module Rack::Mount
2
2
  module Recognition
3
3
  module CodeGeneration #:nodoc:
4
+ def initialize(*args)
5
+ @optimized_recognize_defined = false
6
+ super
7
+ end
8
+
4
9
  def _expired_recognize(env) #:nodoc:
5
10
  raise 'route set not finalized'
6
11
  end
@@ -11,11 +16,19 @@ module Rack::Mount
11
16
  end
12
17
 
13
18
  private
19
+ def instance_variables_to_serialize
20
+ super - [:@optimized_recognize_defined]
21
+ end
22
+
14
23
  def expire!
15
- remove_metaclass_method :recognize
24
+ if @optimized_recognize_defined
25
+ remove_metaclass_method :recognize
26
+
27
+ class << self
28
+ alias_method :recognize, :_expired_recognize
29
+ end
16
30
 
17
- class << self
18
- alias_method :recognize, :_expired_recognize
31
+ @optimized_recognize_defined = false
19
32
  end
20
33
 
21
34
  super
@@ -64,10 +77,12 @@ module Rack::Mount
64
77
  end
65
78
  }.join(', ')
66
79
 
80
+ @optimized_recognize_defined = true
81
+
67
82
  remove_metaclass_method :recognize
68
83
 
69
84
  instance_eval(<<-RUBY, __FILE__, __LINE__)
70
- def recognize(obj, &block)
85
+ def recognize(obj)
71
86
  cache = {}
72
87
  container = @recognition_graph[#{keys}]
73
88
  optimize_container_iterator(container) unless container.respond_to?(:optimized_each)
@@ -45,7 +45,8 @@ module Rack::Mount
45
45
  nil
46
46
  end
47
47
 
48
- EXPECT = 'Expect'.freeze
48
+ X_CASCADE = 'X-Cascade'.freeze
49
+ PASS = 'pass'.freeze
49
50
  PATH_INFO = 'PATH_INFO'.freeze
50
51
 
51
52
  # Rack compatible recognition and dispatching method. Routes are
@@ -57,11 +58,9 @@ module Rack::Mount
57
58
  def call(env)
58
59
  raise 'route set not finalized' unless @recognition_graph
59
60
 
60
- set_expectation = env[EXPECT] != '100-continue'
61
- env[EXPECT] = '100-continue' if set_expectation
62
-
63
61
  env[PATH_INFO] = Utils.normalize_path(env[PATH_INFO])
64
62
 
63
+ request = nil
65
64
  req = @request_class.new(env)
66
65
  recognize(req) do |route, params|
67
66
  # TODO: We only want to unescape params from uri related methods
@@ -69,12 +68,10 @@ module Rack::Mount
69
68
 
70
69
  env[@parameters_key] = params
71
70
  result = route.app.call(env)
72
- return result unless result[0].to_i == 417
71
+ return result unless result[1][X_CASCADE] == PASS
73
72
  end
74
73
 
75
- set_expectation ? [404, {'Content-Type' => 'text/html'}, ['Not Found']] : [417, {'Content-Type' => 'text/html'}, ['Expectation failed']]
76
- ensure
77
- env.delete(EXPECT) if set_expectation
74
+ request || [404, {'Content-Type' => 'text/html', 'X-Cascade' => 'pass'}, ['Not Found']]
78
75
  end
79
76
 
80
77
  def rehash #:nodoc:
@@ -84,22 +81,15 @@ module Rack::Mount
84
81
  super
85
82
  end
86
83
 
87
- def valid_conditions #:nodoc:
88
- @valid_conditions ||= begin
89
- conditions = @request_class.instance_methods(false)
90
- conditions.map! { |m| m.to_sym }
91
- conditions.freeze
92
- end
93
- end
94
-
95
84
  private
96
85
  def expire!
97
86
  @recognition_keys = @recognition_graph = nil
87
+ @recognition_key_analyzer.expire!
98
88
  super
99
89
  end
100
90
 
101
91
  def flush!
102
- @recognition_key_analyzer = @valid_conditions = nil
92
+ @recognition_key_analyzer = nil
103
93
  super
104
94
  end
105
95
 
@@ -27,9 +27,7 @@ module Rack::Mount
27
27
  # Symbol identifier for the route used with named route generations
28
28
  attr_reader :name
29
29
 
30
- def initialize(set, app, conditions, defaults, name)
31
- @set = set
32
-
30
+ def initialize(app, conditions, defaults, name)
33
31
  unless app.respond_to?(:call)
34
32
  raise ArgumentError, 'app must be a valid rack application' \
35
33
  ' and respond to call'
@@ -39,19 +37,11 @@ module Rack::Mount
39
37
  @name = name ? name.to_sym : nil
40
38
  @defaults = (defaults || {}).freeze
41
39
 
42
- unless conditions.is_a?(Hash)
43
- raise ArgumentError, 'conditions must be a Hash'
44
- end
45
40
  @conditions = {}
46
41
 
47
42
  conditions.each do |method, pattern|
48
43
  next unless method && pattern
49
44
 
50
- unless @set.valid_conditions.include?(method)
51
- raise ArgumentError, 'conditions may only include ' +
52
- @set.valid_conditions.inspect
53
- end
54
-
55
45
  pattern = Regexp.compile("\\A#{Regexp.escape(pattern)}\\Z") if pattern.is_a?(String)
56
46
  pattern = Utils.normalize_extended_expression(pattern)
57
47
 
@@ -24,6 +24,12 @@ module Rack::Mount
24
24
  # - <tt>Recognition::RouteSet.new</tt>
25
25
  def initialize(options = {}, &block)
26
26
  @request_class = options.delete(:request_class) || Rack::Request
27
+ @valid_conditions = begin
28
+ conditions = @request_class.instance_methods(false)
29
+ conditions.map! { |m| m.to_sym }
30
+ conditions
31
+ end
32
+
27
33
  @routes = []
28
34
  expire!
29
35
 
@@ -43,7 +49,8 @@ module Rack::Mount
43
49
  # <tt>name</tt>:: Symbol identifier for the route used with named
44
50
  # route generations
45
51
  def add_route(app, conditions = {}, defaults = {}, name = nil)
46
- route = Route.new(self, app, conditions, defaults, name)
52
+ validate_conditions!(conditions)
53
+ route = Route.new(app, conditions, defaults, name)
47
54
  @routes << route
48
55
  expire!
49
56
  route
@@ -86,11 +93,55 @@ module Rack::Mount
86
93
  super
87
94
  end
88
95
 
96
+ def marshal_dump #:nodoc:
97
+ hash = {}
98
+
99
+ instance_variables_to_serialize.each do |ivar|
100
+ hash[ivar] = instance_variable_get(ivar)
101
+ end
102
+
103
+ if graph = hash[:@recognition_graph]
104
+ hash[:@recognition_graph] = graph.dup
105
+ end
106
+
107
+ included_modules = (class << self; included_modules; end)
108
+ included_modules.reject! { |mod| mod == Kernel }
109
+ hash[:included_modules] = included_modules
110
+
111
+ hash
112
+ end
113
+
114
+ def marshal_load(hash) #:nodoc:
115
+ hash.delete(:included_modules).reverse.each { |mod| extend(mod) }
116
+
117
+ hash.each do |ivar, value|
118
+ instance_variable_set(ivar, value)
119
+ end
120
+ end
121
+
89
122
  private
90
123
  def expire! #:nodoc:
91
124
  end
92
125
 
93
126
  def flush! #:nodoc:
127
+ @valid_conditions = nil
128
+ end
129
+
130
+ def instance_variables_to_serialize
131
+ instance_variables.map { |ivar| ivar.to_sym }
132
+ end
133
+
134
+ def validate_conditions!(conditions)
135
+ unless conditions.is_a?(Hash)
136
+ raise ArgumentError, 'conditions must be a Hash'
137
+ end
138
+
139
+ unless conditions.all? { |method, pattern|
140
+ @valid_conditions.include?(method)
141
+ }
142
+ raise ArgumentError, 'conditions may only include ' +
143
+ @valid_conditions.inspect
144
+ end
94
145
  end
95
146
 
96
147
  # An internal helper method for constructing a nested set from
@@ -6,6 +6,7 @@
6
6
 
7
7
  require 'racc/parser.rb'
8
8
 
9
+ require 'rack/mount/utils'
9
10
  require 'rack/mount/strexp/tokenizer'
10
11
 
11
12
  module Rack
@@ -529,6 +529,32 @@ class Multimap
529
529
  @hash.values_at(*keys)
530
530
  end
531
531
 
532
+ def marshal_dump #:nodoc:
533
+ @hash
534
+ end
535
+
536
+ def marshal_load(hash) #:nodoc:
537
+ @hash = hash
538
+ end
539
+
540
+ def to_yaml(opts = {}) #:nodoc:
541
+ YAML::quick_emit(self, opts) do |out|
542
+ out.map(taguri, to_yaml_style) do |map|
543
+ @hash.each do |k, v|
544
+ map.add(k, v)
545
+ end
546
+ map.add('__default__', @hash.default)
547
+ end
548
+ end
549
+ end
550
+
551
+ def yaml_initialize(tag, val) #:nodoc:
552
+ default = val.delete('__default__')
553
+ @hash = val
554
+ @hash.default = default
555
+ self
556
+ end
557
+
532
558
  protected
533
559
  def _internal_hash #:nodoc:
534
560
  @hash
@@ -159,4 +159,27 @@ class Multiset < Set
159
159
  superset?(set) && subset?(set)
160
160
  end
161
161
  alias_method :==, :eql?
162
+
163
+ def marshal_dump #:nodoc:
164
+ @hash
165
+ end
166
+
167
+ def marshal_load(hash) #:nodoc:
168
+ @hash = hash
169
+ end
170
+
171
+ def to_yaml(opts = {}) #:nodoc:
172
+ YAML::quick_emit(self, opts) do |out|
173
+ out.map(taguri, to_yaml_style) do |map|
174
+ @hash.each do |k, v|
175
+ map.add(k, v)
176
+ end
177
+ end
178
+ end
179
+ end
180
+
181
+ def yaml_initialize(tag, val) #:nodoc:
182
+ @hash = val
183
+ self
184
+ end
162
185
  end
@@ -54,16 +54,10 @@ class Parser < Racc::Parser
54
54
  when (text = @ss.scan(/\\[dDsSwW]/))
55
55
  action { [:CCLASS, text] }
56
56
 
57
- when (text = @ss.scan(/\^/))
58
- action { [:L_ANCHOR, text] }
59
-
60
- when (text = @ss.scan(/\\A/))
57
+ when (text = @ss.scan(/\^|\\A/))
61
58
  action { [:L_ANCHOR, text] }
62
59
 
63
- when (text = @ss.scan(/\$/))
64
- action { [:R_ANCHOR, text] }
65
-
66
- when (text = @ss.scan(/\\Z/))
60
+ when (text = @ss.scan(/\$|\\Z/))
67
61
  action { [:R_ANCHOR, text] }
68
62
 
69
63
  when (text = @ss.scan(/<(\w+)>/))
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-mount
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Peek
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-22 00:00:00 -06:00
12
+ date: 2009-12-24 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency