rack-mount 0.6.0 → 0.6.1

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.
@@ -36,10 +36,10 @@ module Rack::Mount
36
36
  def process_key(requirements, method, requirement)
37
37
  if requirement.is_a?(Regexp)
38
38
  expression = Utils.parse_regexp(requirement)
39
- expression = expression.reject { |e| e.is_a?(Reginald::Anchor) }
40
39
 
41
- if expression.is_a?(Reginald::Expression) && expression.literal?
42
- return requirements[method] = expression.to_s
40
+ if expression.is_a?(Reginald::Expression) && expression.anchored_to_line?
41
+ expression = expression.reject { |e| e.is_a?(Reginald::Anchor) }
42
+ return requirements[method] = expression.to_s if expression.literal?
43
43
  end
44
44
  end
45
45
 
@@ -26,12 +26,17 @@ module Rack::Mount
26
26
  @has_significant_params
27
27
  end
28
28
 
29
- def generate(methods, params = {}, recall = {}, options = {})
30
- if methods.is_a?(Array)
31
- result = methods.map { |m| generate_method(m, params, recall, options) }
32
- return nil if result.all? { |e| e.nil? }
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?
33
38
  else
34
- result = generate_method(methods, params, recall, options)
39
+ result = generate_method(method, params, recall, options)
35
40
  end
36
41
 
37
42
  if result
@@ -51,7 +51,7 @@ module Rack::Mount
51
51
  only_path = params.delete(:only_path)
52
52
  recall = env[@parameters_key] || {}
53
53
 
54
- unless result = generate([:host, :path_info], named_route, params, recall,
54
+ unless result = generate(:all, named_route, params, recall,
55
55
  :parameterize => lambda { |name, param| Utils.escape_uri(param) })
56
56
  return
57
57
  end
@@ -67,16 +67,15 @@ module Rack::Mount
67
67
  end
68
68
  end
69
69
 
70
- req = @request_class.new(env)
71
- uri = only_path ? '' : "#{req.scheme}://#{parts[0] || req.host}"
72
- uri = "#{uri}#{req.script_name}#{parts[1]}"
73
- uri << "?#{Utils.build_nested_query(params)}" if params.any?
74
- uri
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
75
73
  end
76
74
 
77
75
  def generate(method, *args) #:nodoc:
78
76
  raise 'route set not finalized' unless @generation_graph
79
77
 
78
+ method = nil if method == :all
80
79
  named_route, params, recall, options = extract_params!(*args)
81
80
  merged = recall.merge(params)
82
81
  route = nil
@@ -176,6 +175,26 @@ module Rack::Mount
176
175
 
177
176
  [named_route, params.dup, recall.dup, options.dup]
178
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
179
198
  end
180
199
  end
181
200
  end
@@ -0,0 +1,33 @@
1
+ class Rack::Mount::StrexpParser
2
+ rule
3
+ target: expr { result = anchor ? "\\A#{val.join}\\Z" : "\\A#{val.join}" }
4
+
5
+ expr: expr token { result = val.join }
6
+ | token
7
+
8
+ token: PARAM {
9
+ name = val[0].to_sym
10
+ requirement = requirements[name]
11
+ result = REGEXP_NAMED_CAPTURE % [name, requirement]
12
+ }
13
+ | GLOB {
14
+ name = val[0].to_sym
15
+ result = REGEXP_NAMED_CAPTURE % [name, '.+']
16
+ }
17
+ | LPAREN expr RPAREN { result = "(?:#{val[1]})?" }
18
+ | CHAR { result = Regexp.escape(val[0]) }
19
+ end
20
+
21
+ ---- header ----
22
+ require 'rack/mount/utils'
23
+ require 'rack/mount/strexp/tokenizer'
24
+
25
+ ---- inner
26
+
27
+ if Reginald.regexp_supports_named_captures?
28
+ REGEXP_NAMED_CAPTURE = '(?<%s>%s)'.freeze
29
+ else
30
+ REGEXP_NAMED_CAPTURE = '(?:<%s>%s)'.freeze
31
+ end
32
+
33
+ attr_accessor :anchor, :requirements
@@ -0,0 +1,12 @@
1
+ class Rack::Mount::StrexpParser
2
+ macro
3
+ RESERVED \(|\)|:|\*
4
+ ALPHA_U [a-zA-Z_]
5
+ rule
6
+ \\({RESERVED}) { [:CHAR, @ss[1]] }
7
+ \:({ALPHA_U}\w*) { [:PARAM, @ss[1]] }
8
+ \*({ALPHA_U}\w*) { [:GLOB, @ss[1]] }
9
+ \( { [:LPAREN, text] }
10
+ \) { [:RPAREN, text] }
11
+ . { [:CHAR, text] }
12
+ end
@@ -41,6 +41,30 @@ module Reginald
41
41
  !ignorecase && all? { |e| e.literal? }
42
42
  end
43
43
 
44
+ def anchored?
45
+ anchored_to_start? && anchored_to_end?
46
+ end
47
+
48
+ def anchored_to_start?
49
+ first.is_a?(Anchor) && first == '\A'
50
+ end
51
+
52
+ def anchored_to_end?
53
+ last.is_a?(Anchor) && last == '\Z'
54
+ end
55
+
56
+ def anchored_to_line?
57
+ anchored_to_start_of_line? && anchored_to_end_of_line?
58
+ end
59
+
60
+ def anchored_to_start_of_line?
61
+ anchored_to_start? || (first.is_a?(Anchor) && first == '^')
62
+ end
63
+
64
+ def anchored_to_end_of_line?
65
+ anchored_to_end? || (last.is_a?(Anchor) && last == '$')
66
+ end
67
+
44
68
  def options
45
69
  flag = 0
46
70
  flag |= Regexp::MULTILINE if multiline
@@ -298,7 +298,7 @@ end
298
298
  def _reduce_3(val, _values, result)
299
299
  val[1].quantifier = val[2]
300
300
  result = Expression.reduce(val[0], val[1])
301
-
301
+
302
302
  result
303
303
  end
304
304
 
@@ -310,7 +310,7 @@ end
310
310
  def _reduce_5(val, _values, result)
311
311
  val[0].quantifier = val[1]
312
312
  result = val[0]
313
-
313
+
314
314
  result
315
315
  end
316
316
 
@@ -356,7 +356,7 @@ end
356
356
  def _reduce_15(val, _values, result)
357
357
  result = Group.new(val[1])
358
358
  result.index = @capture_index_stack.pop
359
-
359
+
360
360
  result
361
361
  end
362
362
 
@@ -368,14 +368,14 @@ def _reduce_16(val, _values, result)
368
368
  result.expression.ignorecase = options[:ignorecase];
369
369
  result.expression.extended = options[:extended];
370
370
  @options_stack.pop
371
-
371
+
372
372
  result
373
373
  end
374
374
 
375
375
  def _reduce_17(val, _values, result)
376
376
  result = Group.new(val[3]);
377
377
  result.capture = false;
378
-
378
+
379
379
  result
380
380
  end
381
381
 
@@ -383,7 +383,7 @@ def _reduce_18(val, _values, result)
383
383
  result = Group.new(val[3]);
384
384
  result.name = val[2];
385
385
  result.index = @capture_index_stack.pop
386
-
386
+
387
387
  result
388
388
  end
389
389
 
@@ -493,25 +493,25 @@ end
493
493
 
494
494
  def _reduce_44(val, _values, result)
495
495
  @options_stack << result = { val[1] => false, val[2] => false, val[3] => false }
496
-
496
+
497
497
  result
498
498
  end
499
499
 
500
500
  def _reduce_45(val, _values, result)
501
501
  @options_stack << result = { val[0] => true, val[2] => false, val[3] => false }
502
-
502
+
503
503
  result
504
504
  end
505
505
 
506
506
  def _reduce_46(val, _values, result)
507
507
  @options_stack << result = { val[0] => true, val[1] => true, val[3] => false }
508
-
508
+
509
509
  result
510
510
  end
511
511
 
512
512
  def _reduce_47(val, _values, result)
513
513
  @options_stack << result = { val[0] => true, val[1] => true, val[2] => true }
514
-
514
+
515
515
  result
516
516
  end
517
517
 
@@ -538,3 +538,4 @@ end
538
538
  end # module Reginald
539
539
 
540
540
  require 'reginald/tokenizer'
541
+
@@ -0,0 +1,3 @@
1
+ module Rack::Mount
2
+ Version = '0.6.1'
3
+ end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-mount
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 6
8
+ - 1
9
+ version: 0.6.1
5
10
  platform: ruby
6
11
  authors:
7
12
  - Joshua Peek
@@ -9,19 +14,10 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-02-19 00:00:00 -06:00
17
+ date: 2010-03-06 00:00:00 -06:00
13
18
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: rack
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 1.0.0
24
- version:
19
+ dependencies: []
20
+
25
21
  description: Stackable dynamic tree based Rack router
26
22
  email: josh@joshpeek.com
27
23
  executables: []
@@ -29,9 +25,10 @@ executables: []
29
25
  extensions: []
30
26
 
31
27
  extra_rdoc_files:
32
- - README.rdoc
33
28
  - LICENSE
29
+ - README.rdoc
34
30
  files:
31
+ - lib/rack/mount.rb
35
32
  - lib/rack/mount/analysis/frequency.rb
36
33
  - lib/rack/mount/analysis/histogram.rb
37
34
  - lib/rack/mount/analysis/splitting.rb
@@ -48,13 +45,16 @@ files:
48
45
  - lib/rack/mount/regexp_with_named_groups.rb
49
46
  - lib/rack/mount/route.rb
50
47
  - lib/rack/mount/route_set.rb
48
+ - lib/rack/mount/strexp.rb
51
49
  - lib/rack/mount/strexp/parser.rb
50
+ - lib/rack/mount/strexp/parser.y
52
51
  - lib/rack/mount/strexp/tokenizer.rb
53
- - lib/rack/mount/strexp.rb
52
+ - lib/rack/mount/strexp/tokenizer.rex
54
53
  - lib/rack/mount/utils.rb
55
54
  - lib/rack/mount/vendor/multimap/multimap.rb
56
55
  - lib/rack/mount/vendor/multimap/multiset.rb
57
56
  - lib/rack/mount/vendor/multimap/nested_multimap.rb
57
+ - lib/rack/mount/vendor/reginald/reginald.rb
58
58
  - lib/rack/mount/vendor/reginald/reginald/alternation.rb
59
59
  - lib/rack/mount/vendor/reginald/reginald/anchor.rb
60
60
  - lib/rack/mount/vendor/reginald/reginald/atom.rb
@@ -65,10 +65,7 @@ files:
65
65
  - lib/rack/mount/vendor/reginald/reginald/group.rb
66
66
  - lib/rack/mount/vendor/reginald/reginald/parser.rb
67
67
  - lib/rack/mount/vendor/reginald/reginald/tokenizer.rb
68
- - lib/rack/mount/vendor/reginald/reginald.rb
69
- - lib/rack/mount.rb
70
- - README.rdoc
71
- - LICENSE
68
+ - lib/rack/mount/version.rb
72
69
  has_rdoc: true
73
70
  homepage: http://github.com/josh/rack-mount
74
71
  licenses: []
@@ -82,18 +79,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
82
79
  requirements:
83
80
  - - ">="
84
81
  - !ruby/object:Gem::Version
82
+ segments:
83
+ - 0
85
84
  version: "0"
86
- version:
87
85
  required_rubygems_version: !ruby/object:Gem::Requirement
88
86
  requirements:
89
87
  - - ">="
90
88
  - !ruby/object:Gem::Version
89
+ segments:
90
+ - 0
91
91
  version: "0"
92
- version:
93
92
  requirements: []
94
93
 
95
94
  rubyforge_project:
96
- rubygems_version: 1.3.5
95
+ rubygems_version: 1.3.6
97
96
  signing_key:
98
97
  specification_version: 3
99
98
  summary: Stackable dynamic tree based Rack router