rack-mount 0.3.1 → 0.3.2

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.
@@ -35,8 +35,8 @@ module Rack::Mount
35
35
 
36
36
  def process_key(requirements, method, requirement)
37
37
  if requirement.is_a?(Regexp)
38
- expression = Utils.parse_regexp(requirement)
39
- expression.reject! { |e| e.is_a?(Reginald::Anchor) }
38
+ expression = parse_regexp(requirement)
39
+ expression = expression.reject { |e| e.is_a?(Reginald::Anchor) }
40
40
 
41
41
  if expression.is_a?(Reginald::Expression) && expression.literal?
42
42
  return requirements[method] = expression.to_s
@@ -53,6 +53,12 @@ module Rack::Mount
53
53
  @key_frequency.select_upper
54
54
  end
55
55
  end
56
+
57
+ private
58
+ def parse_regexp(regexp)
59
+ @parse_regexp_cache ||= {}
60
+ @parse_regexp_cache[regexp] ||= Utils.parse_regexp(regexp).freeze
61
+ end
56
62
  end
57
63
  end
58
64
  end
@@ -57,7 +57,7 @@ module Rack::Mount
57
57
  def analyze_capture_boundaries(regexp, boundaries) #:nodoc:
58
58
  return boundaries unless regexp.is_a?(Regexp)
59
59
 
60
- parts = Utils.parse_regexp(regexp)
60
+ parts = parse_regexp(regexp)
61
61
  parts.each_with_index do |part, index|
62
62
  if part.is_a?(Reginald::Group)
63
63
  if index > 0
@@ -88,8 +88,7 @@ module Rack::Mount
88
88
  def generate_split_keys(regexp, separators) #:nodoc:
89
89
  segments = []
90
90
  buf = nil
91
- casefold = regexp.casefold?
92
- parts = Utils.parse_regexp(regexp)
91
+ parts = parse_regexp(regexp)
93
92
  parts.each_with_index do |part, index|
94
93
  case part
95
94
  when Reginald::Anchor
@@ -151,7 +150,7 @@ module Rack::Mount
151
150
  end
152
151
 
153
152
  def join_buffer(parts, regexp)
154
- if parts.literal? && !regexp.casefold?
153
+ if parts.literal?
155
154
  parts.to_s
156
155
  else
157
156
  parts.to_regexp
@@ -1,13 +1,7 @@
1
1
  module Rack::Mount
2
- begin
3
- eval('/(?<foo>.*)/').named_captures
4
-
5
- class RegexpWithNamedGroups < Regexp
6
- def self.supports_named_captures?
7
- true
8
- end
9
- end
10
- rescue SyntaxError, NoMethodError
2
+ if Reginald.regexp_supports_named_captures?
3
+ RegexpWithNamedGroups = Regexp
4
+ else
11
5
  require 'strscan'
12
6
 
13
7
  # A wrapper that adds shim named capture support to older
@@ -24,10 +18,6 @@ module Rack::Mount
24
18
  #
25
19
  # /(?:<foo>[a-z]+)/
26
20
  class RegexpWithNamedGroups < Regexp
27
- def self.supports_named_captures?
28
- false
29
- end
30
-
31
21
  def self.new(regexp) #:nodoc:
32
22
  if regexp.is_a?(RegexpWithNamedGroups)
33
23
  regexp
@@ -13,7 +13,7 @@ module Rack
13
13
  class StrexpParser < Racc::Parser
14
14
 
15
15
 
16
- if RegexpWithNamedGroups.supports_named_captures?
16
+ if Reginald.regexp_supports_named_captures?
17
17
  REGEXP_NAMED_CAPTURE = '(?<%s>%s)'.freeze
18
18
  else
19
19
  REGEXP_NAMED_CAPTURE = '(?:<%s>%s)'.freeze
@@ -23,32 +23,32 @@ attr_accessor :requirements
23
23
  ##### State transition tables begin ###
24
24
 
25
25
  racc_action_table = [
26
- 4, 5, 6, 11, 7, 4, 5, 6, 12, 7,
27
- 4, 5, 6, 8, 7, 4, 5, 6, nil, 7 ]
26
+ 1, 2, 3, 9, 4, 1, 2, 3, 12, 4,
27
+ 1, 2, 3, 11, 4, 1, 2, 3, nil, 4 ]
28
28
 
29
29
  racc_action_check = [
30
- 0, 0, 0, 8, 0, 10, 10, 10, 10, 10,
31
- 2, 2, 2, 1, 2, 6, 6, 6, nil, 6 ]
30
+ 0, 0, 0, 5, 0, 3, 3, 3, 9, 3,
31
+ 8, 8, 8, 8, 8, 6, 6, 6, nil, 6 ]
32
32
 
33
33
  racc_action_pointer = [
34
- -2, 13, 8, nil, nil, nil, 13, nil, 3, nil,
35
- 3, nil, nil ]
34
+ -2, nil, nil, 3, nil, 3, 13, nil, 8, 8,
35
+ nil, nil, nil ]
36
36
 
37
37
  racc_action_default = [
38
- -8, -8, -1, -3, -4, -5, -8, -7, -8, -2,
39
- -8, 13, -6 ]
38
+ -8, -4, -5, -8, -7, -8, -1, -3, -8, -8,
39
+ -2, -6, 13 ]
40
40
 
41
41
  racc_goto_table = [
42
- 9, 2, 1, nil, nil, nil, nil, 10, 9 ]
42
+ 6, 5, 10, 8, 10 ]
43
43
 
44
44
  racc_goto_check = [
45
- 3, 2, 1, nil, nil, nil, nil, 2, 3 ]
45
+ 2, 1, 3, 2, 3 ]
46
46
 
47
47
  racc_goto_pointer = [
48
- nil, 2, 1, -2 ]
48
+ nil, 1, 0, -4 ]
49
49
 
50
50
  racc_goto_default = [
51
- nil, nil, nil, 3 ]
51
+ nil, nil, nil, 7 ]
52
52
 
53
53
  racc_reduce_table = [
54
54
  0, 0, :racc_error,
@@ -105,7 +105,7 @@ module Rack::Mount
105
105
 
106
106
  expression = Reginald.parse(regexp)
107
107
 
108
- unless RegexpWithNamedGroups.supports_named_captures?
108
+ unless Reginald.regexp_supports_named_captures?
109
109
  tag_captures = Proc.new do |group|
110
110
  group.each do |child|
111
111
  if child.is_a?(Reginald::Group)
@@ -1,5 +1,5 @@
1
1
  module Reginald
2
- class Alternation < Array
2
+ class Alternation < Collection
3
3
  def self.reduce(alternation_or_expression, expression)
4
4
  if alternation_or_expression.first.is_a?(Alternation)
5
5
  alternation_or_expression = alternation_or_expression.first
@@ -22,29 +22,16 @@ module Reginald
22
22
  false
23
23
  end
24
24
 
25
- def to_s
26
- map { |e| e.to_s }.join('|')
25
+ def options
26
+ 0
27
27
  end
28
28
 
29
- def to_regexp
30
- Regexp.compile("\\A#{to_s}\\Z")
29
+ def to_s(parent = false)
30
+ map { |e| e.to_s(parent) }.join('|')
31
31
  end
32
32
 
33
33
  def inspect
34
34
  to_s.inspect
35
35
  end
36
-
37
- def match(char)
38
- to_regexp.match(char)
39
- end
40
-
41
- def include?(char)
42
- any? { |e| e.include?(char) }
43
- end
44
-
45
- def freeze
46
- each { |e| e.freeze }
47
- super
48
- end
49
36
  end
50
37
  end
@@ -1,10 +1,21 @@
1
1
  module Reginald
2
2
  class Atom < Struct.new(:value)
3
+ attr_accessor :ignorecase
4
+
5
+ def initialize(*args)
6
+ @ignorecase = nil
7
+ super
8
+ end
9
+
3
10
  def literal?
4
11
  false
5
12
  end
6
13
 
7
- def to_s
14
+ def casefold?
15
+ ignorecase ? true : false
16
+ end
17
+
18
+ def to_s(parent = false)
8
19
  "#{value}"
9
20
  end
10
21
 
@@ -12,6 +23,21 @@ module Reginald
12
23
  "#<#{self.class.to_s.sub('Reginald::', '')} #{to_s.inspect}>"
13
24
  end
14
25
 
26
+ def ==(other)
27
+ case other
28
+ when String
29
+ other == to_s
30
+ else
31
+ eql?(other)
32
+ end
33
+ end
34
+
35
+ def eql?(other)
36
+ other.instance_of?(self.class) &&
37
+ self.value.eql?(other.value) &&
38
+ (!!self.ignorecase).eql?(!!other.ignorecase)
39
+ end
40
+
15
41
  def freeze
16
42
  value.freeze
17
43
  super
@@ -3,15 +3,19 @@ module Reginald
3
3
  attr_accessor :quantifier
4
4
 
5
5
  def literal?
6
- quantifier.nil?
6
+ quantifier.nil? && !ignorecase
7
7
  end
8
8
 
9
- def to_s
10
- "#{value}#{quantifier}"
9
+ def to_s(parent = false)
10
+ if !parent && ignorecase
11
+ "(?i-mx:#{value})#{quantifier}"
12
+ else
13
+ "#{value}#{quantifier}"
14
+ end
11
15
  end
12
16
 
13
17
  def to_regexp
14
- Regexp.compile("\\A#{to_s}\\Z")
18
+ Regexp.compile("\\A#{to_s(true)}\\Z", ignorecase)
15
19
  end
16
20
 
17
21
  def match(char)
@@ -19,22 +23,15 @@ module Reginald
19
23
  end
20
24
 
21
25
  def include?(char)
22
- value == char
23
- end
24
-
25
- def ==(other)
26
- case other
27
- when String
28
- other == to_s
26
+ if ignorecase
27
+ value.downcase == char.downcase
29
28
  else
30
- eql?(other)
29
+ value == char
31
30
  end
32
31
  end
33
32
 
34
33
  def eql?(other)
35
- other.is_a?(self.class) &&
36
- value.eql?(other.value) &&
37
- quantifier.eql?(other.quantifier)
34
+ super && quantifier.eql?(other.quantifier)
38
35
  end
39
36
 
40
37
  def freeze
@@ -15,6 +15,12 @@ module Reginald
15
15
  WORD = new(':word:').freeze
16
16
  XDIGIT = new(':xdigit:').freeze
17
17
 
18
+ def ignorecase=(ignorecase)
19
+ if to_s !~ /\A\[:.*:\]\Z/
20
+ super
21
+ end
22
+ end
23
+
18
24
  attr_accessor :negate
19
25
 
20
26
  def negated?
@@ -25,11 +31,19 @@ module Reginald
25
31
  false
26
32
  end
27
33
 
28
- def to_s
29
- if value == '.' || value =~ /^\\[dDsSwW]$/
30
- super
34
+ def bracketed?
35
+ value != '.' && value !~ /^\\[dDsSwW]$/
36
+ end
37
+
38
+ def to_s(parent = false)
39
+ if bracketed?
40
+ if !parent && ignorecase
41
+ "(?i-mx:[#{negate && '^'}#{value}])#{quantifier}"
42
+ else
43
+ "[#{negate && '^'}#{value}]#{quantifier}"
44
+ end
31
45
  else
32
- "[#{negate && '^'}#{value}]#{quantifier}"
46
+ super
33
47
  end
34
48
  end
35
49
 
@@ -39,9 +53,7 @@ module Reginald
39
53
  end
40
54
 
41
55
  def eql?(other)
42
- other.is_a?(self.class) &&
43
- negate == other.negate &&
44
- super
56
+ super && negate == other.negate
45
57
  end
46
58
 
47
59
  def freeze
@@ -0,0 +1,40 @@
1
+ module Reginald
2
+ class Collection < Array
3
+ def ignorecase=(ignorecase)
4
+ each { |e| e.ignorecase = ignorecase }
5
+ ignorecase
6
+ end
7
+
8
+ def to_regexp
9
+ Regexp.compile("\\A#{to_s(true)}\\Z", options)
10
+ end
11
+
12
+ def match(char)
13
+ to_regexp.match(char)
14
+ end
15
+
16
+ def include?(char)
17
+ any? { |e| e.include?(char) }
18
+ end
19
+
20
+ def ==(other)
21
+ case other
22
+ when String
23
+ other == to_s
24
+ when Array
25
+ super
26
+ else
27
+ eql?(other)
28
+ end
29
+ end
30
+
31
+ def eql?(other)
32
+ other.instance_of?(self.class) && super
33
+ end
34
+
35
+ def freeze
36
+ each { |e| e.freeze }
37
+ super
38
+ end
39
+ end
40
+ end
@@ -1,6 +1,7 @@
1
1
  module Reginald
2
- class Expression < Array
3
- attr_accessor :multiline, :ignorecase, :extended
2
+ class Expression < Collection
3
+ attr_reader :ignorecase
4
+ attr_accessor :multiline, :extended
4
5
 
5
6
  def self.reduce(expression_or_atom, atom = nil)
6
7
  if expression_or_atom.is_a?(Expression)
@@ -14,7 +15,7 @@ module Reginald
14
15
  end
15
16
 
16
17
  def initialize(*args)
17
- @multiline = @ignorecase = @extended = false
18
+ @multiline = @ignorecase = @extended = nil
18
19
 
19
20
  if args.length == 1 && args.first.instance_of?(Array)
20
21
  super(args.first)
@@ -24,8 +25,17 @@ module Reginald
24
25
  end
25
26
  end
26
27
 
28
+ def ignorecase=(ignorecase)
29
+ if @ignorecase.nil?
30
+ super
31
+ @ignorecase = ignorecase
32
+ else
33
+ false
34
+ end
35
+ end
36
+
27
37
  def literal?
28
- ignorecase == false && all? { |e| e.literal? }
38
+ !ignorecase && all? { |e| e.literal? }
29
39
  end
30
40
 
31
41
  def options
@@ -36,13 +46,16 @@ module Reginald
36
46
  flag
37
47
  end
38
48
 
39
- def to_s_without_options
40
- map { |e| e.to_s }.join
49
+ def options=(flag)
50
+ self.multiline = flag & Regexp::MULTILINE != 0
51
+ self.ignorecase = flag & Regexp::IGNORECASE != 0
52
+ self.extended = flag & Regexp::EXTENDED != 0
53
+ nil
41
54
  end
42
55
 
43
- def to_s
44
- if options == 0
45
- to_s_without_options
56
+ def to_s(parent = false)
57
+ if parent || options == 0
58
+ map { |e| e.to_s(parent) }.join
46
59
  else
47
60
  with, without = [], []
48
61
  multiline ? (with << 'm') : (without << 'm')
@@ -52,51 +65,23 @@ module Reginald
52
65
  with = with.join
53
66
  without = without.any? ? "-#{without.join}" : ''
54
67
 
55
- "(?#{with}#{without}:#{to_s_without_options})"
68
+ "(?#{with}#{without}:#{map { |e| e.to_s(true) }.join})"
56
69
  end
57
70
  end
58
71
 
59
- def to_regexp
60
- Regexp.compile("\\A#{to_s_without_options}\\Z", options)
61
- end
62
-
63
72
  def inspect
64
73
  "#<Expression #{to_s.inspect}>"
65
74
  end
66
75
 
67
- def match(char)
68
- to_regexp.match(char)
69
- end
70
-
71
- def include?(char)
72
- any? { |e| e.include?(char) }
73
- end
74
-
75
76
  def casefold?
76
77
  ignorecase
77
78
  end
78
79
 
79
- def ==(other)
80
- case other
81
- when String
82
- other == to_s
83
- when Array
84
- super
85
- else
86
- eql?(other)
87
- end
88
- end
89
-
90
80
  def eql?(other)
91
- other.is_a?(self.class) && super &&
92
- self.multiline == other.multiline &&
93
- self.ignorecase == other.ignorecase &&
94
- self.extended == other.extended
95
- end
96
-
97
- def freeze
98
- each { |e| e.freeze }
99
- super
81
+ super &&
82
+ !!self.multiline == !!other.multiline &&
83
+ !!self.ignorecase == !!other.ignorecase &&
84
+ !!self.extended == !!other.extended
100
85
  end
101
86
  end
102
87
  end
@@ -7,13 +7,17 @@ module Reginald
7
7
  super
8
8
  end
9
9
 
10
+ def ignorecase=(ignorecase)
11
+ expression.ignorecase = ignorecase
12
+ end
13
+
10
14
  def literal?
11
15
  quantifier.nil? && expression.literal?
12
16
  end
13
17
 
14
- def to_s
18
+ def to_s(parent = false)
15
19
  if expression.options == 0
16
- "(#{capture ? '' : '?:'}#{expression.to_s_without_options})#{quantifier}"
20
+ "(#{capture ? '' : '?:'}#{expression.to_s(parent)})#{quantifier}"
17
21
  elsif capture == false
18
22
  "#{expression.to_s}#{quantifier}"
19
23
  else
@@ -8,150 +8,207 @@ require 'racc/parser.rb'
8
8
  module Reginald
9
9
  class Parser < Racc::Parser
10
10
 
11
- attr_accessor :capture_index
12
- attr_accessor :capture_index_stack
11
+ def self.parse_regexp(regexp)
12
+ parser = new
13
+ parser.options_stack << {
14
+ :multiline => (regexp.options & Regexp::MULTILINE != 0),
15
+ :ignorecase => (regexp.options & Regexp::IGNORECASE != 0),
16
+ :extended => (regexp.options & Regexp::EXTENDED != 0)
17
+ }
18
+
19
+ expression = parser.scan_str(regexp.source)
20
+ expression.options = regexp.options
21
+ expression
22
+ end
23
+
24
+ attr_accessor :options_stack
25
+
26
+ def initialize
27
+ @capture_index = 0
28
+ @capture_index_stack = []
29
+ @options_stack = []
30
+ end
13
31
 
14
32
  ##### State transition tables begin ###
15
33
 
16
34
  racc_action_table = [
17
- 1, 17, 18, 18, 7, 8, 10, 11, 46, 18,
18
- 1, 43, 2, 4, 7, 8, 10, 11, 58, 45,
19
- 1, 53, 2, 4, 7, 8, 10, 11, 47, 18,
20
- 1, 61, 2, 4, 7, 8, 10, 11, 59, 18,
21
- 1, 27, 2, 4, 7, 8, 10, 11, 62, 15,
22
- 1, 34, 2, 4, 7, 8, 10, 11, 31, 25,
23
- 1, nil, 2, 4, 7, 8, 10, 11, nil, nil,
24
- 1, nil, 2, 4, 7, 8, 10, 11, 40, 41,
25
- 29, nil, 2, 4, 30, 20, 42, 35, 37, 39,
26
- 21, 22, 24, 20, 49, 35, 37, 39, 21, 22,
27
- 24, 13, nil, 14, 44, nil, 15, nil, 30, 56,
28
- 35, 37, 39, 35, 37, 39, 35, 37, 39, 35,
29
- 37, 39, 35, 37, 39, 35, 37, 39, 35, 37,
30
- 39 ]
35
+ 22, 62, 32, 26, 66, 32, 32, 52, 54, 31,
36
+ 71, 32, 61, 72, 59, 28, 30, 14, 16, 18,
37
+ 19, 20, 21, 23, 24, 25, 27, 29, 13, 51,
38
+ 53, 55, 57, 3, 32, 77, 5, 7, 9, 11,
39
+ 41, 39, 79, 3, 2, 4, 5, 7, 9, 11,
40
+ 53, 55, 57, 3, 2, 4, 5, 7, 9, 11,
41
+ 53, 55, 57, 3, 2, 4, 5, 7, 9, 11,
42
+ 53, 55, 57, 3, 2, 4, 5, 7, 9, 11,
43
+ 53, 55, 57, 3, 2, 4, 5, 7, 9, 11,
44
+ 53, 55, 57, 3, 2, 4, 5, 7, 9, 11,
45
+ 53, 55, 57, 3, 2, 4, 5, 7, 9, 11,
46
+ 46, 34, 47, 26, 2, 4, 35, 36, 37, 34,
47
+ 67, 53, 55, 57, 35, 36, 37, 42, 43, 60,
48
+ 43, 44, 50, 44, 75, 53, 55, 57, 69 ]
31
49
 
32
50
  racc_action_check = [
33
- 0, 3, 26, 3, 0, 0, 0, 0, 34, 50,
34
- 47, 26, 0, 0, 47, 47, 47, 47, 50, 34,
35
- 41, 46, 47, 47, 41, 41, 41, 41, 36, 51,
36
- 5, 53, 41, 41, 5, 5, 5, 5, 51, 54,
37
- 32, 13, 5, 5, 32, 32, 32, 32, 54, 14,
38
- 11, 24, 32, 32, 11, 11, 11, 11, 17, 11,
39
- 18, nil, 11, 11, 18, 18, 18, 18, nil, nil,
40
- 40, nil, 18, 18, 40, 40, 40, 40, 25, 25,
41
- 16, nil, 40, 40, 16, 19, 25, 25, 25, 25,
42
- 19, 19, 19, 6, 38, 38, 38, 38, 6, 6,
43
- 6, 1, nil, 1, 28, nil, 1, nil, 28, 48,
44
- 48, 48, 48, 52, 52, 52, 56, 56, 56, 57,
45
- 57, 57, 60, 60, 60, 49, 49, 49, 42, 42,
46
- 42 ]
51
+ 3, 50, 64, 3, 56, 65, 40, 39, 39, 6,
52
+ 64, 6, 50, 65, 40, 3, 3, 3, 3, 3,
53
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 39,
54
+ 39, 39, 39, 11, 73, 69, 11, 11, 11, 11,
55
+ 15, 11, 73, 8, 11, 11, 8, 8, 8, 8,
56
+ 70, 70, 70, 54, 8, 8, 54, 54, 54, 54,
57
+ 67, 67, 67, 66, 54, 54, 66, 66, 66, 66,
58
+ 63, 63, 63, 52, 66, 66, 52, 52, 52, 52,
59
+ 51, 51, 51, 32, 52, 52, 32, 32, 32, 32,
60
+ 74, 74, 74, 48, 32, 32, 48, 48, 48, 48,
61
+ 75, 75, 75, 0, 48, 48, 0, 0, 0, 0,
62
+ 22, 10, 31, 22, 0, 0, 10, 10, 10, 33,
63
+ 58, 58, 58, 58, 33, 33, 33, 17, 17, 45,
64
+ 45, 17, 37, 45, 68, 68, 68, 68, 62 ]
47
65
 
48
66
  racc_action_pointer = [
49
- -3, 97, nil, 1, nil, 27, 81, nil, nil, nil,
50
- nil, 47, nil, 36, 40, nil, 75, 58, 57, 73,
51
- nil, nil, nil, nil, 42, 65, 0, nil, 99, nil,
52
- nil, nil, 37, nil, -1, nil, 15, nil, 73, nil,
53
- 67, 17, 106, nil, nil, nil, 12, 7, 88, 103,
54
- 7, 27, 91, 11, 37, nil, 94, 97, nil, nil,
55
- 100, nil, nil, nil, nil, nil ]
67
+ 100, nil, nil, -5, nil, nil, 9, nil, 40, nil,
68
+ 100, 30, nil, nil, nil, 36, nil, 123, nil, nil,
69
+ nil, nil, 105, nil, nil, nil, nil, nil, nil, nil,
70
+ nil, 112, 80, 108, nil, nil, nil, 124, nil, -5,
71
+ 4, nil, nil, nil, nil, 125, nil, nil, 90, nil,
72
+ -7, 45, 70, nil, 50, nil, -8, nil, 86, nil,
73
+ nil, nil, 130, 35, 0, 3, 60, 25, 100, 16,
74
+ 15, nil, nil, 32, 55, 65, nil, nil, nil, nil,
75
+ nil, nil ]
56
76
 
57
77
  racc_action_default = [
58
- -35, -35, -21, -35, -22, -2, -6, -11, -12, -7,
59
- -14, -35, -13, -35, -35, -16, -35, -35, -35, -4,
60
- -25, -23, -24, -5, -35, -35, -35, -8, -35, -9,
61
- -15, 66, -1, -3, -35, -32, -35, -33, -35, -34,
62
- -35, -35, -35, -17, -10, -27, -35, -35, -35, -35,
63
- -35, -35, -35, -35, -35, -31, -35, -35, -19, -20,
64
- -35, -26, -18, -30, -29, -28 ]
78
+ -51, -13, -19, -51, -20, -11, -51, -12, -2, -14,
79
+ -6, -51, -7, -43, -32, -51, -33, -51, -34, -35,
80
+ -36, -37, -29, -38, -39, -40, -28, -41, -30, -42,
81
+ -31, -51, -51, -4, -23, -21, -22, -51, -5, -51,
82
+ -51, -8, -9, -27, -26, -51, -29, 82, -1, -3,
83
+ -51, -51, -51, -48, -51, -49, -51, -50, -51, -15,
84
+ -10, -25, -51, -51, -51, -51, -51, -51, -51, -51,
85
+ -51, -17, -18, -51, -51, -51, -47, -24, -44, -16,
86
+ -45, -46 ]
65
87
 
66
88
  racc_goto_table = [
67
- 3, 38, 19, 16, 23, 36, 32, nil, nil, nil,
68
- nil, 26, nil, nil, 48, nil, 28, 33, 52, nil,
69
- nil, nil, nil, nil, 55, 57, nil, nil, 60, 19,
70
- nil, nil, 63, 64, nil, nil, 65, nil, nil, nil,
71
- 50, 51, nil, nil, nil, nil, nil, 54 ]
89
+ 6, 33, 58, 17, 38, 48, 56, 15, nil, nil,
90
+ nil, 40, nil, nil, 63, nil, nil, nil, nil, nil,
91
+ nil, 68, 45, nil, nil, nil, 70, 49, nil, nil,
92
+ 74, 76, nil, 78, nil, nil, nil, 80, 81, nil,
93
+ nil, 33, nil, nil, nil, nil, nil, nil, nil, nil,
94
+ nil, nil, 64, nil, 65, nil, nil, nil, nil, nil,
95
+ nil, nil, nil, nil, nil, nil, 73 ]
72
96
 
73
97
  racc_goto_check = [
74
- 1, 9, 3, 6, 4, 8, 2, nil, nil, nil,
75
- nil, 1, nil, nil, 9, nil, 6, 4, 9, nil,
76
- nil, nil, nil, nil, 9, 9, nil, nil, 9, 3,
77
- nil, nil, 9, 9, nil, nil, 9, nil, nil, nil,
78
- 1, 1, nil, nil, nil, nil, nil, 1 ]
98
+ 1, 3, 10, 7, 4, 2, 9, 6, nil, nil,
99
+ nil, 1, nil, nil, 10, nil, nil, nil, nil, nil,
100
+ nil, 10, 7, nil, nil, nil, 10, 4, nil, nil,
101
+ 10, 10, nil, 10, nil, nil, nil, 10, 10, nil,
102
+ nil, 3, nil, nil, nil, nil, nil, nil, nil, nil,
103
+ nil, nil, 1, nil, 1, nil, nil, nil, nil, nil,
104
+ nil, nil, nil, nil, nil, nil, 1 ]
79
105
 
80
106
  racc_goto_pointer = [
81
- nil, 0, -12, -3, -2, nil, 2, nil, -20, -24 ]
107
+ nil, 0, -27, -7, -6, nil, 4, 0, nil, -33,
108
+ -37 ]
82
109
 
83
110
  racc_goto_default = [
84
- nil, nil, 5, 6, nil, 9, nil, 12, nil, nil ]
111
+ nil, nil, 8, 10, nil, 12, nil, nil, 1, nil,
112
+ nil ]
85
113
 
86
114
  racc_reduce_table = [
87
115
  0, 0, :racc_error,
88
- 3, 26, :_reduce_1,
89
- 1, 26, :_reduce_2,
90
- 3, 27, :_reduce_3,
91
- 2, 27, :_reduce_4,
92
- 2, 27, :_reduce_5,
93
- 1, 27, :_reduce_none,
94
- 1, 28, :_reduce_none,
95
- 3, 28, :_reduce_8,
96
- 3, 28, :_reduce_9,
97
- 4, 28, :_reduce_10,
98
- 1, 28, :_reduce_11,
99
- 1, 28, :_reduce_12,
100
- 1, 28, :_reduce_13,
101
- 1, 28, :_reduce_14,
102
- 2, 31, :_reduce_15,
103
- 1, 31, :_reduce_none,
104
- 3, 30, :_reduce_17,
105
- 6, 30, :_reduce_18,
106
- 5, 30, :_reduce_19,
107
- 5, 30, :_reduce_20,
108
- 1, 32, :_reduce_none,
109
- 1, 32, :_reduce_none,
110
- 1, 29, :_reduce_none,
111
- 1, 29, :_reduce_none,
112
- 1, 29, :_reduce_none,
113
- 5, 29, :_reduce_26,
114
- 3, 29, :_reduce_27,
115
- 4, 33, :_reduce_28,
116
- 4, 33, :_reduce_29,
117
- 4, 33, :_reduce_30,
118
- 3, 33, :_reduce_31,
119
- 1, 34, :_reduce_32,
120
- 1, 34, :_reduce_33,
121
- 1, 34, :_reduce_34 ]
122
-
123
- racc_reduce_n = 35
124
-
125
- racc_shift_n = 66
116
+ 3, 39, :_reduce_1,
117
+ 1, 39, :_reduce_2,
118
+ 3, 40, :_reduce_3,
119
+ 2, 40, :_reduce_4,
120
+ 2, 40, :_reduce_5,
121
+ 1, 40, :_reduce_none,
122
+ 1, 41, :_reduce_none,
123
+ 3, 41, :_reduce_8,
124
+ 3, 41, :_reduce_9,
125
+ 4, 41, :_reduce_10,
126
+ 1, 41, :_reduce_11,
127
+ 1, 41, :_reduce_12,
128
+ 1, 41, :_reduce_13,
129
+ 1, 41, :_reduce_14,
130
+ 3, 43, :_reduce_15,
131
+ 6, 43, :_reduce_16,
132
+ 5, 43, :_reduce_17,
133
+ 5, 43, :_reduce_18,
134
+ 1, 46, :_reduce_none,
135
+ 1, 46, :_reduce_none,
136
+ 1, 42, :_reduce_none,
137
+ 1, 42, :_reduce_none,
138
+ 1, 42, :_reduce_none,
139
+ 5, 42, :_reduce_24,
140
+ 3, 42, :_reduce_25,
141
+ 2, 45, :_reduce_26,
142
+ 2, 45, :_reduce_27,
143
+ 1, 45, :_reduce_none,
144
+ 1, 45, :_reduce_none,
145
+ 1, 44, :_reduce_30,
146
+ 1, 44, :_reduce_31,
147
+ 1, 44, :_reduce_32,
148
+ 1, 44, :_reduce_33,
149
+ 1, 44, :_reduce_34,
150
+ 1, 44, :_reduce_35,
151
+ 1, 44, :_reduce_36,
152
+ 1, 44, :_reduce_37,
153
+ 1, 44, :_reduce_38,
154
+ 1, 44, :_reduce_39,
155
+ 1, 44, :_reduce_40,
156
+ 1, 44, :_reduce_41,
157
+ 1, 44, :_reduce_42,
158
+ 1, 44, :_reduce_43,
159
+ 4, 47, :_reduce_44,
160
+ 4, 47, :_reduce_45,
161
+ 4, 47, :_reduce_46,
162
+ 3, 47, :_reduce_47,
163
+ 1, 48, :_reduce_48,
164
+ 1, 48, :_reduce_49,
165
+ 1, 48, :_reduce_50 ]
166
+
167
+ racc_reduce_n = 51
168
+
169
+ racc_shift_n = 82
126
170
 
127
171
  racc_token_table = {
128
172
  false => 0,
129
173
  :error => 1,
130
174
  :BAR => 2,
131
175
  :LBRACK => 3,
132
- :LC_CTYPE => 4,
133
- :RBRACK => 5,
134
- :NEGATE => 6,
135
- :CCLASS => 7,
136
- :DOT => 8,
137
- :CHAR => 9,
138
- :LPAREN => 10,
139
- :RPAREN => 11,
140
- :QMARK => 12,
141
- :COLON => 13,
142
- :NAME => 14,
143
- :L_ANCHOR => 15,
144
- :R_ANCHOR => 16,
145
- :STAR => 17,
146
- :PLUS => 18,
147
- :LCURLY => 19,
148
- :RCURLY => 20,
149
- :MINUS => 21,
150
- :MULTILINE => 22,
151
- :IGNORECASE => 23,
152
- :EXTENDED => 24 }
153
-
154
- racc_nt_base = 25
176
+ :RBRACK => 4,
177
+ :NEGATE => 5,
178
+ :CCLASS => 6,
179
+ :DOT => 7,
180
+ :CHAR => 8,
181
+ :LPAREN => 9,
182
+ :RPAREN => 10,
183
+ :QMARK => 11,
184
+ :COLON => 12,
185
+ :NAME => 13,
186
+ :L_ANCHOR => 14,
187
+ :R_ANCHOR => 15,
188
+ :STAR => 16,
189
+ :PLUS => 17,
190
+ :LCURLY => 18,
191
+ :RCURLY => 19,
192
+ "alnum" => 20,
193
+ "alpha" => 21,
194
+ "ascii" => 22,
195
+ "blank" => 23,
196
+ "cntrl" => 24,
197
+ "digit" => 25,
198
+ "graph" => 26,
199
+ "lower" => 27,
200
+ "print" => 28,
201
+ "punct" => 29,
202
+ "space" => 30,
203
+ "upper" => 31,
204
+ "word" => 32,
205
+ "xdigit" => 33,
206
+ :MINUS => 34,
207
+ :MULTILINE => 35,
208
+ :IGNORECASE => 36,
209
+ :EXTENDED => 37 }
210
+
211
+ racc_nt_base = 38
155
212
 
156
213
  racc_use_result_var = true
157
214
 
@@ -176,7 +233,6 @@ Racc_token_to_s_table = [
176
233
  "error",
177
234
  "BAR",
178
235
  "LBRACK",
179
- "LC_CTYPE",
180
236
  "RBRACK",
181
237
  "NEGATE",
182
238
  "CCLASS",
@@ -193,6 +249,20 @@ Racc_token_to_s_table = [
193
249
  "PLUS",
194
250
  "LCURLY",
195
251
  "RCURLY",
252
+ "\"alnum\"",
253
+ "\"alpha\"",
254
+ "\"ascii\"",
255
+ "\"blank\"",
256
+ "\"cntrl\"",
257
+ "\"digit\"",
258
+ "\"graph\"",
259
+ "\"lower\"",
260
+ "\"print\"",
261
+ "\"punct\"",
262
+ "\"space\"",
263
+ "\"upper\"",
264
+ "\"word\"",
265
+ "\"xdigit\"",
196
266
  "MINUS",
197
267
  "MULTILINE",
198
268
  "IGNORECASE",
@@ -203,6 +273,7 @@ Racc_token_to_s_table = [
203
273
  "atom",
204
274
  "quantifier",
205
275
  "group",
276
+ "ctype",
206
277
  "bracket_expression",
207
278
  "anchor",
208
279
  "options",
@@ -263,7 +334,7 @@ def _reduce_10(val, _values, result)
263
334
  end
264
335
 
265
336
  def _reduce_11(val, _values, result)
266
- result = val[0]
337
+ result = CharacterClass.new(val[0])
267
338
  result
268
339
  end
269
340
 
@@ -283,38 +354,32 @@ def _reduce_14(val, _values, result)
283
354
  end
284
355
 
285
356
  def _reduce_15(val, _values, result)
286
- result = val.join
287
- result
288
- end
289
-
290
- # reduce 16 omitted
291
-
292
- def _reduce_17(val, _values, result)
293
357
  result = Group.new(val[1])
294
358
  result.index = @capture_index_stack.pop
295
359
 
296
360
  result
297
361
  end
298
362
 
299
- def _reduce_18(val, _values, result)
363
+ def _reduce_16(val, _values, result)
300
364
  result = Group.new(val[4]);
301
365
  result.capture = false;
302
366
  options = val[2];
303
- result.expression.multiline = options[:multiline];
367
+ result.expression.multiline = options[:multiline];
304
368
  result.expression.ignorecase = options[:ignorecase];
305
- result.expression.extended = options[:extended];
369
+ result.expression.extended = options[:extended];
370
+ @options_stack.pop
306
371
 
307
372
  result
308
373
  end
309
374
 
310
- def _reduce_19(val, _values, result)
375
+ def _reduce_17(val, _values, result)
311
376
  result = Group.new(val[3]);
312
377
  result.capture = false;
313
378
 
314
379
  result
315
380
  end
316
381
 
317
- def _reduce_20(val, _values, result)
382
+ def _reduce_18(val, _values, result)
318
383
  result = Group.new(val[3]);
319
384
  result.name = val[2];
320
385
  result.index = @capture_index_stack.pop
@@ -322,15 +387,25 @@ def _reduce_20(val, _values, result)
322
387
  result
323
388
  end
324
389
 
390
+ # reduce 19 omitted
391
+
392
+ # reduce 20 omitted
393
+
325
394
  # reduce 21 omitted
326
395
 
327
396
  # reduce 22 omitted
328
397
 
329
398
  # reduce 23 omitted
330
399
 
331
- # reduce 24 omitted
400
+ def _reduce_24(val, _values, result)
401
+ result = val.join
402
+ result
403
+ end
332
404
 
333
- # reduce 25 omitted
405
+ def _reduce_25(val, _values, result)
406
+ result = val.join
407
+ result
408
+ end
334
409
 
335
410
  def _reduce_26(val, _values, result)
336
411
  result = val.join
@@ -342,37 +417,115 @@ def _reduce_27(val, _values, result)
342
417
  result
343
418
  end
344
419
 
345
- def _reduce_28(val, _values, result)
346
- result = { val[1] => false, val[2] => false, val[3] => false }
420
+ # reduce 28 omitted
421
+
422
+ # reduce 29 omitted
423
+
424
+ def _reduce_30(val, _values, result)
425
+ result = CharacterClass::ALNUM
347
426
  result
348
427
  end
349
428
 
350
- def _reduce_29(val, _values, result)
351
- result = { val[0] => true, val[2] => false, val[3] => false }
429
+ def _reduce_31(val, _values, result)
430
+ result = CharacterClass::ALPHA
352
431
  result
353
432
  end
354
433
 
355
- def _reduce_30(val, _values, result)
356
- result = { val[0] => true, val[1] => true, val[3] => false }
434
+ def _reduce_32(val, _values, result)
435
+ result = CharacterClass::ASCII
357
436
  result
358
437
  end
359
438
 
360
- def _reduce_31(val, _values, result)
361
- result = { val[0] => true, val[1] => true, val[2] => true }
439
+ def _reduce_33(val, _values, result)
440
+ result = CharacterClass::BLANK
362
441
  result
363
442
  end
364
443
 
365
- def _reduce_32(val, _values, result)
444
+ def _reduce_34(val, _values, result)
445
+ result = CharacterClass::CNTRL
446
+ result
447
+ end
448
+
449
+ def _reduce_35(val, _values, result)
450
+ result = CharacterClass::DIGIT
451
+ result
452
+ end
453
+
454
+ def _reduce_36(val, _values, result)
455
+ result = CharacterClass::GRAPH
456
+ result
457
+ end
458
+
459
+ def _reduce_37(val, _values, result)
460
+ result = CharacterClass::LOWER
461
+ result
462
+ end
463
+
464
+ def _reduce_38(val, _values, result)
465
+ result = CharacterClass::PRINT
466
+ result
467
+ end
468
+
469
+ def _reduce_39(val, _values, result)
470
+ result = CharacterClass::PUNCT
471
+ result
472
+ end
473
+
474
+ def _reduce_40(val, _values, result)
475
+ result = CharacterClass::SPACE
476
+ result
477
+ end
478
+
479
+ def _reduce_41(val, _values, result)
480
+ result = CharacterClass::UPPER
481
+ result
482
+ end
483
+
484
+ def _reduce_42(val, _values, result)
485
+ result = CharacterClass::WORD
486
+ result
487
+ end
488
+
489
+ def _reduce_43(val, _values, result)
490
+ result = CharacterClass::XDIGIT
491
+ result
492
+ end
493
+
494
+ def _reduce_44(val, _values, result)
495
+ @options_stack << result = { val[1] => false, val[2] => false, val[3] => false }
496
+
497
+ result
498
+ end
499
+
500
+ def _reduce_45(val, _values, result)
501
+ @options_stack << result = { val[0] => true, val[2] => false, val[3] => false }
502
+
503
+ result
504
+ end
505
+
506
+ def _reduce_46(val, _values, result)
507
+ @options_stack << result = { val[0] => true, val[1] => true, val[3] => false }
508
+
509
+ result
510
+ end
511
+
512
+ def _reduce_47(val, _values, result)
513
+ @options_stack << result = { val[0] => true, val[1] => true, val[2] => true }
514
+
515
+ result
516
+ end
517
+
518
+ def _reduce_48(val, _values, result)
366
519
  result = :multiline
367
520
  result
368
521
  end
369
522
 
370
- def _reduce_33(val, _values, result)
523
+ def _reduce_49(val, _values, result)
371
524
  result = :ignorecase
372
525
  result
373
526
  end
374
527
 
375
- def _reduce_34(val, _values, result)
528
+ def _reduce_50(val, _values, result)
376
529
  result = :extended
377
530
  result
378
531
  end
@@ -51,23 +51,8 @@ class Parser < Racc::Parser
51
51
  token = case @state
52
52
  when nil
53
53
  case
54
- when (text = @ss.scan(/\\d/))
55
- action { [:CCLASS, CharacterClass.new('\d')] }
56
-
57
- when (text = @ss.scan(/\\D/))
58
- action { [:CCLASS, CharacterClass.new('\D')] }
59
-
60
- when (text = @ss.scan(/\\s/))
61
- action { [:CCLASS, CharacterClass.new('\s')] }
62
-
63
- when (text = @ss.scan(/\\S/))
64
- action { [:CCLASS, CharacterClass.new('\S')] }
65
-
66
- when (text = @ss.scan(/\\w/))
67
- action { [:CCLASS, CharacterClass.new('\w')] }
68
-
69
- when (text = @ss.scan(/\\W/))
70
- action { [:CCLASS, CharacterClass.new('\W')] }
54
+ when (text = @ss.scan(/\\[dDsSwW]/))
55
+ action { [:CCLASS, text] }
71
56
 
72
57
  when (text = @ss.scan(/\^/))
73
58
  action { [:L_ANCHOR, text] }
@@ -120,6 +105,27 @@ class Parser < Racc::Parser
120
105
  when (text = @ss.scan(/\*/))
121
106
  action { [:STAR, text] }
122
107
 
108
+ when (text = @ss.scan(/\#/))
109
+ action {
110
+ if @options_stack[-1][:extended]
111
+ @state = :COMMENT;
112
+ next_token
113
+ else
114
+ [:CHAR, text]
115
+ end
116
+ }
117
+
118
+
119
+ when (text = @ss.scan(/\s|\n/))
120
+ action {
121
+ if @options_stack[-1][:extended]
122
+ next_token
123
+ else
124
+ [:CHAR, text]
125
+ end
126
+ }
127
+
128
+
123
129
  when (text = @ss.scan(/\\(.)/))
124
130
  action { [:CHAR, @ss[1]] }
125
131
 
@@ -139,53 +145,14 @@ class Parser < Racc::Parser
139
145
  when (text = @ss.scan(/\^/))
140
146
  action { [:NEGATE, text] }
141
147
 
142
- when (text = @ss.scan(/:alnum:/))
143
- action { [:LC_CTYPE, CharacterClass::ALNUM] }
144
-
145
- when (text = @ss.scan(/:alpha:/))
146
- action { [:LC_CTYPE, CharacterClass::ALPHA] }
147
-
148
- when (text = @ss.scan(/:ascii:/))
149
- action { [:LC_CTYPE, CharacterClass::ASCII] }
150
-
151
- when (text = @ss.scan(/:blank:/))
152
- action { [:LC_CTYPE, CharacterClass::BLANK] }
153
-
154
- when (text = @ss.scan(/:cntrl:/))
155
- action { [:LC_CTYPE, CharacterClass::CNTRL] }
156
-
157
- when (text = @ss.scan(/:digit:/))
158
- action { [:LC_CTYPE, CharacterClass::DIGIT] }
159
-
160
- when (text = @ss.scan(/:graph:/))
161
- action { [:LC_CTYPE, CharacterClass::GRAPH] }
162
-
163
- when (text = @ss.scan(/:lower:/))
164
- action { [:LC_CTYPE, CharacterClass::LOWER] }
165
-
166
- when (text = @ss.scan(/:print:/))
167
- action { [:LC_CTYPE, CharacterClass::PRINT] }
168
-
169
- when (text = @ss.scan(/:punct:/))
170
- action { [:LC_CTYPE, CharacterClass::PUNCT] }
171
-
172
- when (text = @ss.scan(/:space:/))
173
- action { [:LC_CTYPE, CharacterClass::SPACE] }
174
-
175
- when (text = @ss.scan(/:upper:/))
176
- action { [:LC_CTYPE, CharacterClass::UPPER] }
177
-
178
- when (text = @ss.scan(/:word;/))
179
- action { [:LC_CTYPE, CharacterClass::WORD] }
180
-
181
- when (text = @ss.scan(/:xdigit:/))
182
- action { [:LC_CTYPE, CharacterClass::XDIGIT] }
148
+ when (text = @ss.scan(/:(alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|punct|space|upper|word|xdigit):/))
149
+ action { [@ss[1], text] }
183
150
 
184
151
  when (text = @ss.scan(/\\(.)/))
185
152
  action { [:CHAR, @ss[1]] }
186
153
 
187
154
  when (text = @ss.scan(/./))
188
- action { [:CHAR, text] }
155
+ action { [:CHAR, text] }
189
156
 
190
157
  else
191
158
  text = @ss.string[@ss.pos .. -1]
@@ -227,6 +194,19 @@ class Parser < Racc::Parser
227
194
  raise ScanError, "can not match: '" + text + "'"
228
195
  end # if
229
196
 
197
+ when :COMMENT
198
+ case
199
+ when (text = @ss.scan(/\n/))
200
+ action { @state = nil; next_token }
201
+
202
+ when (text = @ss.scan(/./))
203
+ action { next_token }
204
+
205
+ else
206
+ text = @ss.string[@ss.pos .. -1]
207
+ raise ScanError, "can not match: '" + text + "'"
208
+ end # if
209
+
230
210
  else
231
211
  raise ScanError, "undefined state: '" + state.to_s + "'"
232
212
  end # case state
@@ -4,6 +4,7 @@ module Reginald
4
4
  autoload :Atom, 'reginald/atom'
5
5
  autoload :Character, 'reginald/character'
6
6
  autoload :CharacterClass, 'reginald/character_class'
7
+ autoload :Collection, 'reginald/collection'
7
8
  autoload :Expression, 'reginald/expression'
8
9
  autoload :Group, 'reginald/group'
9
10
  autoload :Parser, 'reginald/parser'
@@ -22,37 +23,13 @@ module Reginald
22
23
  end
23
24
 
24
25
  def parse(regexp)
25
- regexp = strip_extended_whitespace_and_comments(regexp)
26
-
27
- parser = Parser.new
28
- parser.capture_index = 0
29
- parser.capture_index_stack = []
30
- expression = parser.scan_str(regexp.source)
31
-
32
- expression.ignorecase = regexp.casefold?
33
-
34
- expression
26
+ Parser.parse_regexp(regexp)
35
27
  end
36
28
 
37
29
  def compile(source)
38
30
  regexp = Regexp.compile(source)
39
31
  expression = parse(regexp)
40
- Regexp.compile(expression.to_s_without_options, expression.options)
32
+ Regexp.compile(expression.to_s(true), expression.options)
41
33
  end
42
-
43
- private
44
- # TODO: The parser should be aware of extended expressions
45
- # instead of having to sanitize them before.
46
- def strip_extended_whitespace_and_comments(regexp)
47
- if regexp.options & Regexp::EXTENDED != 0
48
- source = regexp.source
49
- source.gsub!(/#.+$/, '')
50
- source.gsub!(/\s+/, '')
51
- source.gsub!(/\\\//, '/')
52
- regexp = Regexp.compile(source)
53
- else
54
- regexp
55
- end
56
- end
57
34
  end
58
35
  end
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.1
4
+ version: 0.3.2
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-03 00:00:00 -06:00
12
+ date: 2009-12-05 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -60,6 +60,7 @@ files:
60
60
  - lib/rack/mount/vendor/reginald/reginald/atom.rb
61
61
  - lib/rack/mount/vendor/reginald/reginald/character.rb
62
62
  - lib/rack/mount/vendor/reginald/reginald/character_class.rb
63
+ - lib/rack/mount/vendor/reginald/reginald/collection.rb
63
64
  - lib/rack/mount/vendor/reginald/reginald/expression.rb
64
65
  - lib/rack/mount/vendor/reginald/reginald/group.rb
65
66
  - lib/rack/mount/vendor/reginald/reginald/parser.rb