mustermann19 0.3.1.2 → 0.4.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/README.md +6 -0
- data/Rakefile +2 -2
- data/lib/mustermann.rb +36 -13
- data/lib/mustermann/ast/boundaries.rb +48 -0
- data/lib/mustermann/ast/expander.rb +11 -7
- data/lib/mustermann/ast/node.rb +47 -9
- data/lib/mustermann/ast/parser.rb +25 -27
- data/lib/mustermann/ast/pattern.rb +18 -5
- data/lib/mustermann/ast/transformer.rb +54 -6
- data/lib/mustermann/ast/translator.rb +20 -0
- data/lib/mustermann/ast/tree_renderer.rb +2 -9
- data/lib/mustermann/express.rb +2 -0
- data/lib/mustermann/flask.rb +2 -0
- data/lib/mustermann/identity.rb +5 -3
- data/lib/mustermann/pattern.rb +7 -0
- data/lib/mustermann/pyramid.rb +2 -0
- data/lib/mustermann/rails.rb +32 -4
- data/lib/mustermann/rails/versions.rb +51 -0
- data/lib/mustermann/regexp.rb +1 -0
- data/lib/mustermann/regular.rb +2 -0
- data/lib/mustermann/shell.rb +2 -0
- data/lib/mustermann/simple.rb +1 -0
- data/lib/mustermann/sinatra.rb +5 -7
- data/lib/mustermann/string_scanner.rb +1 -1
- data/lib/mustermann/template.rb +4 -1
- data/lib/mustermann/uri_template.rb +1 -0
- data/lib/mustermann/version.rb +1 -1
- data/mustermann/README.md +838 -0
- data/mustermann/lib/mustermann/ast/compiler.rb +156 -0
- data/spec/ast_spec.rb +14 -0
- data/spec/mustermann_spec.rb +3 -2
- data/spec/rails_spec.rb +45 -0
- data/spec/shell_spec.rb +4 -2
- data/spec/sinatra_spec.rb +12 -5
- data/spec/support/match_matcher.rb +1 -1
- data/spec/support/pattern.rb +2 -2
- data/spec/template_spec.rb +5 -0
- metadata +37 -30
@@ -0,0 +1,156 @@
|
|
1
|
+
require 'mustermann/ast/translator'
|
2
|
+
|
3
|
+
module Mustermann
|
4
|
+
# @see Mustermann::AST::Pattern
|
5
|
+
module AST
|
6
|
+
# Regexp compilation logic.
|
7
|
+
# @!visibility private
|
8
|
+
class Compiler < Translator
|
9
|
+
raises CompileError
|
10
|
+
|
11
|
+
# Trivial compilations
|
12
|
+
translate(Array) { |**o| map { |e| t(e, **o) }.join }
|
13
|
+
translate(:node) { |**o| t(payload, **o) }
|
14
|
+
translate(:separator) { |**o| Regexp.escape(payload) }
|
15
|
+
translate(:optional) { |**o| "(?:%s)?" % t(payload, **o) }
|
16
|
+
translate(:char) { |**o| t.encoded(payload, **o) }
|
17
|
+
|
18
|
+
translate :union do |**options|
|
19
|
+
"(?:%s)" % payload.map { |e| "(?:%s)" % t(e, **options) }.join(?|)
|
20
|
+
end
|
21
|
+
|
22
|
+
translate :expression do |greedy: true, **options|
|
23
|
+
t(payload, allow_reserved: operator.allow_reserved, greedy: greedy && !operator.allow_reserved,
|
24
|
+
parametric: operator.parametric, separator: operator.separator, **options)
|
25
|
+
end
|
26
|
+
|
27
|
+
translate :with_look_ahead do |**options|
|
28
|
+
lookahead = each_leaf.inject("") do |ahead, element|
|
29
|
+
ahead + t(element, skip_optional: true, lookahead: ahead, greedy: false, no_captures: true, **options).to_s
|
30
|
+
end
|
31
|
+
lookahead << (at_end ? '$' : '/')
|
32
|
+
t(head, lookahead: lookahead, **options) + t(payload, **options)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Capture compilation is complex. :(
|
36
|
+
# @!visibility private
|
37
|
+
class Capture < NodeTranslator
|
38
|
+
register :capture
|
39
|
+
|
40
|
+
# @!visibility private
|
41
|
+
def translate(**options)
|
42
|
+
return pattern(options) if options[:no_captures]
|
43
|
+
"(?<#{name}>#{translate(no_captures: true, **options)})"
|
44
|
+
end
|
45
|
+
|
46
|
+
# @return [String] regexp without the named capture
|
47
|
+
# @!visibility private
|
48
|
+
def pattern(capture: nil, **options)
|
49
|
+
case capture
|
50
|
+
when Symbol then from_symbol(capture, **options)
|
51
|
+
when Array then from_array(capture, **options)
|
52
|
+
when Hash then from_hash(capture, **options)
|
53
|
+
when String then from_string(capture, **options)
|
54
|
+
when nil then from_nil(**options)
|
55
|
+
else capture
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
def qualified(string, greedy: true, **options) "#{string}#{qualifier || "+#{?? unless greedy}"}" end
|
61
|
+
def with_lookahead(string, lookahead: nil, **options) lookahead ? "(?:(?!#{lookahead})#{string})" : string end
|
62
|
+
def from_hash(hash, **options) pattern(capture: hash[name.to_sym], **options) end
|
63
|
+
def from_array(array, **options) Regexp.union(*array.map { |e| pattern(capture: e, **options) }) end
|
64
|
+
def from_symbol(symbol, **options) qualified(with_lookahead("[[:#{symbol}:]]", **options), **options) end
|
65
|
+
def from_string(string, **options) Regexp.new(string.chars.map { |c| t.encoded(c, **options) }.join) end
|
66
|
+
def from_nil(**options) qualified(with_lookahead(default(**options), **options), **options) end
|
67
|
+
def default(**options) constraint || "[^/\\?#]" end
|
68
|
+
end
|
69
|
+
|
70
|
+
# @!visibility private
|
71
|
+
class Splat < Capture
|
72
|
+
register :splat, :named_splat
|
73
|
+
# splats are always non-greedy
|
74
|
+
# @!visibility private
|
75
|
+
def pattern(**options)
|
76
|
+
constraint || ".*?"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# @!visibility private
|
81
|
+
class Variable < Capture
|
82
|
+
register :variable
|
83
|
+
|
84
|
+
# @!visibility private
|
85
|
+
def translate(**options)
|
86
|
+
return super(**options) if explode or not options[:parametric]
|
87
|
+
parametric super(parametric: false, **options)
|
88
|
+
end
|
89
|
+
|
90
|
+
# @!visibility private
|
91
|
+
def pattern(parametric: false, separator: nil, **options)
|
92
|
+
register_param(parametric: parametric, separator: separator, **options)
|
93
|
+
pattern = super(**options)
|
94
|
+
pattern = parametric(pattern) if parametric
|
95
|
+
pattern = "#{pattern}(?:#{Regexp.escape(separator)}#{pattern})*" if explode and separator
|
96
|
+
pattern
|
97
|
+
end
|
98
|
+
|
99
|
+
# @!visibility private
|
100
|
+
def parametric(string)
|
101
|
+
"#{Regexp.escape(name)}(?:=#{string})?"
|
102
|
+
end
|
103
|
+
|
104
|
+
# @!visibility private
|
105
|
+
def qualified(string, **options)
|
106
|
+
prefix ? "#{string}{1,#{prefix}}" : super(string, **options)
|
107
|
+
end
|
108
|
+
|
109
|
+
# @!visibility private
|
110
|
+
def default(allow_reserved: false, **options)
|
111
|
+
allow_reserved ? '[\w\-\.~%\:/\?#\[\]@\!\$\&\'\(\)\*\+,;=]' : '[\w\-\.~%]'
|
112
|
+
end
|
113
|
+
|
114
|
+
# @!visibility private
|
115
|
+
def register_param(parametric: false, split_params: nil, separator: nil, **options)
|
116
|
+
return unless explode and split_params
|
117
|
+
split_params[name] = { separator: separator, parametric: parametric }
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# @return [String] Regular expression for matching the given character in all representations
|
122
|
+
# @!visibility private
|
123
|
+
def encoded(char, uri_decode: true, space_matches_plus: true, **options)
|
124
|
+
return Regexp.escape(char) unless uri_decode
|
125
|
+
encoded = escape(char, escape: /./)
|
126
|
+
list = [escape(char), encoded.downcase, encoded.upcase].uniq.map { |c| Regexp.escape(c) }
|
127
|
+
if char == " "
|
128
|
+
list << encoded('+') if space_matches_plus
|
129
|
+
list << " "
|
130
|
+
end
|
131
|
+
"(?:%s)" % list.join("|")
|
132
|
+
end
|
133
|
+
|
134
|
+
# Compiles an AST to a regular expression.
|
135
|
+
# @param [Mustermann::AST::Node] ast the tree
|
136
|
+
# @return [Regexp] corresponding regular expression.
|
137
|
+
#
|
138
|
+
# @!visibility private
|
139
|
+
def self.compile(ast, **options)
|
140
|
+
new.compile(ast, **options)
|
141
|
+
end
|
142
|
+
|
143
|
+
# Compiles an AST to a regular expression.
|
144
|
+
# @param [Mustermann::AST::Node] ast the tree
|
145
|
+
# @return [Regexp] corresponding regular expression.
|
146
|
+
#
|
147
|
+
# @!visibility private
|
148
|
+
def compile(ast, except: nil, **options)
|
149
|
+
except &&= "(?!#{translate(except, no_captures: true, **options)}\\Z)"
|
150
|
+
Regexp.new("#{except}#{translate(ast, **options)}")
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
private_constant :Compiler
|
155
|
+
end
|
156
|
+
end
|
data/spec/ast_spec.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'support'
|
2
|
+
require 'mustermann/ast/node'
|
3
|
+
|
4
|
+
describe Mustermann::AST do
|
5
|
+
describe :type do
|
6
|
+
example { Mustermann::AST::Node[:char].type .should be == :char }
|
7
|
+
example { Mustermann::AST::Node[:char].new.type .should be == :char }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe :min_size do
|
11
|
+
example { Mustermann::AST::Node[:char].new.min_size.should be == 1 }
|
12
|
+
example { Mustermann::AST::Node[:node].new.min_size.should be == 0 }
|
13
|
+
end
|
14
|
+
end
|
data/spec/mustermann_spec.rb
CHANGED
@@ -15,7 +15,7 @@ describe Mustermann do
|
|
15
15
|
example { Mustermann.new('', type: :template) .should be_a(Mustermann::Template) }
|
16
16
|
|
17
17
|
example { expect { Mustermann.new('', foo: :bar) }.to raise_error(ArgumentError, "unsupported option :foo for Mustermann::Sinatra") }
|
18
|
-
example { expect { Mustermann.new('', type: :ast) }.to raise_error(ArgumentError,
|
18
|
+
example { expect { Mustermann.new('', type: :ast) }.to raise_error(ArgumentError, /unsupported type :ast/) }
|
19
19
|
end
|
20
20
|
|
21
21
|
context "pattern argument" do
|
@@ -59,7 +59,8 @@ describe Mustermann do
|
|
59
59
|
example { Mustermann[:simple] .should be == Mustermann::Simple }
|
60
60
|
example { Mustermann[:template] .should be == Mustermann::Template }
|
61
61
|
|
62
|
-
example { expect { Mustermann[:ast]
|
62
|
+
example { expect { Mustermann[:ast] }.to raise_error(ArgumentError, /unsupported type :ast/) }
|
63
|
+
example { expect { Mustermann[:expander] }.to raise_error(ArgumentError, "unsupported type :expander") }
|
63
64
|
end
|
64
65
|
|
65
66
|
describe :extend_object do
|
data/spec/rails_spec.rb
CHANGED
@@ -593,4 +593,49 @@ describe Mustermann::Rails do
|
|
593
593
|
example { pattern.peek_params("/foo bar") .should be_nil }
|
594
594
|
end
|
595
595
|
end
|
596
|
+
|
597
|
+
context 'version compatibility' do
|
598
|
+
context '2.3' do
|
599
|
+
pattern '(foo)', version: '2.3' do
|
600
|
+
it { should_not match("") }
|
601
|
+
it { should_not match("foo") }
|
602
|
+
it { should match("(foo)") }
|
603
|
+
end
|
604
|
+
|
605
|
+
pattern '\\:name', version: '2.3' do
|
606
|
+
it { should match('%5cfoo').capturing(name: 'foo') }
|
607
|
+
end
|
608
|
+
end
|
609
|
+
|
610
|
+
context '3.0' do
|
611
|
+
pattern '(foo)', version: '3.0' do
|
612
|
+
it { should match("") }
|
613
|
+
it { should match("foo") }
|
614
|
+
end
|
615
|
+
|
616
|
+
pattern '\\:name', version: '3.0' do
|
617
|
+
it { should match(':name') }
|
618
|
+
it { should_not match(':foo') }
|
619
|
+
end
|
620
|
+
end
|
621
|
+
|
622
|
+
context '3.2' do
|
623
|
+
pattern '\\:name', version: '3.2' do
|
624
|
+
it { should match('%5cfoo').capturing(name: 'foo') }
|
625
|
+
end
|
626
|
+
end
|
627
|
+
|
628
|
+
context '4.0' do
|
629
|
+
pattern '\\:name', version: '4.0' do
|
630
|
+
it { should match('foo').capturing(name: 'foo') }
|
631
|
+
end
|
632
|
+
end
|
633
|
+
|
634
|
+
context '4.2' do
|
635
|
+
pattern '\\:name', version: '4.2' do
|
636
|
+
it { should match(':name') }
|
637
|
+
it { should_not match(':foo') }
|
638
|
+
end
|
639
|
+
end
|
640
|
+
end
|
596
641
|
end
|
data/spec/shell_spec.rb
CHANGED
@@ -59,8 +59,10 @@ describe Mustermann::Shell do
|
|
59
59
|
it { should_not match('/foo/') }
|
60
60
|
end
|
61
61
|
|
62
|
-
|
63
|
-
|
62
|
+
unless defined?(JRUBY_VERSION)
|
63
|
+
pattern '/föö' do
|
64
|
+
it { should match("/f%C3%B6%C3%B6") }
|
65
|
+
end
|
64
66
|
end
|
65
67
|
|
66
68
|
pattern '/test$/' do
|
data/spec/sinatra_spec.rb
CHANGED
@@ -464,6 +464,18 @@ describe Mustermann::Sinatra do
|
|
464
464
|
it { should_not expand(a: 'foo', b: 'bar', c: 'baz') }
|
465
465
|
end
|
466
466
|
|
467
|
+
pattern "/:a/:b|:c" do
|
468
|
+
it { should match("foo") .capturing c: 'foo' }
|
469
|
+
it { should match("/foo/bar") .capturing a: 'foo', b: 'bar' }
|
470
|
+
|
471
|
+
it { should generate_template('/{a}/{b}') }
|
472
|
+
it { should generate_template('{c}') }
|
473
|
+
|
474
|
+
it { should expand(a: 'foo', b: 'bar') .to('/foo/bar') }
|
475
|
+
it { should expand(c: 'foo') .to('foo') }
|
476
|
+
it { should_not expand(a: 'foo', b: 'bar', c: 'baz') }
|
477
|
+
end
|
478
|
+
|
467
479
|
pattern '/:foo', capture: /\d+/ do
|
468
480
|
it { should match('/1') .capturing foo: '1' }
|
469
481
|
it { should match('/123') .capturing foo: '123' }
|
@@ -649,11 +661,6 @@ describe Mustermann::Sinatra do
|
|
649
661
|
to raise_error(Mustermann::ParseError, 'unexpected ? while parsing "foo??bar"')
|
650
662
|
end
|
651
663
|
|
652
|
-
example '| outside of group' do
|
653
|
-
expect { Mustermann::Sinatra.new('foo|bar') }.
|
654
|
-
to raise_error(Mustermann::ParseError, 'unexpected | while parsing "foo|bar"')
|
655
|
-
end
|
656
|
-
|
657
664
|
example 'dangling escape' do
|
658
665
|
expect { Mustermann::Sinatra.new('foo\\') }.
|
659
666
|
to raise_error(Mustermann::ParseError, 'unexpected end of string while parsing "foo\\\\"')
|
data/spec/support/pattern.rb
CHANGED
@@ -31,7 +31,7 @@ module Support
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def subject_for(pattern, *args)
|
34
|
-
instance = Timeout.timeout(1) { described_class.new(pattern, *args) }
|
34
|
+
instance = Timeout.timeout(defined?(JRUBY_VERSION) ? 3 : 1) { described_class.new(pattern, *args) }
|
35
35
|
proc { instance }
|
36
36
|
rescue Timeout::Error => error
|
37
37
|
proc { raise Timeout::Error, "could not compile #{pattern.inspect} in time", error.backtrace }
|
@@ -39,4 +39,4 @@ module Support
|
|
39
39
|
proc { raise error }
|
40
40
|
end
|
41
41
|
end
|
42
|
-
end
|
42
|
+
end
|
data/spec/template_spec.rb
CHANGED
@@ -561,6 +561,11 @@ describe Mustermann::Template do
|
|
561
561
|
end
|
562
562
|
|
563
563
|
context 'operator +' do
|
564
|
+
pattern '/{a}/{+b}' do
|
565
|
+
it { should match('/foo/bar/baz').capturing(a: 'foo', b: 'bar/baz') }
|
566
|
+
it { should expand(a: 'foo/bar', b: 'foo/bar').to('/foo%2Fbar/foo/bar') }
|
567
|
+
end
|
568
|
+
|
564
569
|
context 'prefix' do
|
565
570
|
pattern '{+a:3}/bar' do
|
566
571
|
it { should match('foo/bar') .capturing a: 'foo' }
|
metadata
CHANGED
@@ -1,158 +1,157 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mustermann19
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Konstantin Haase
|
8
8
|
- namusyaka
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-11-
|
12
|
+
date: 2014-11-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name: enumerable-lazy
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
16
|
requirements:
|
18
17
|
- - '>='
|
19
18
|
- !ruby/object:Gem::Version
|
20
19
|
version: '0'
|
21
|
-
|
20
|
+
name: enumerable-lazy
|
22
21
|
prerelease: false
|
22
|
+
type: :runtime
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - '>='
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name: rspec
|
30
29
|
requirement: !ruby/object:Gem::Requirement
|
31
30
|
requirements:
|
32
31
|
- - '>='
|
33
32
|
- !ruby/object:Gem::Version
|
34
33
|
version: '0'
|
35
|
-
|
34
|
+
name: rspec
|
36
35
|
prerelease: false
|
36
|
+
type: :development
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - '>='
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name: rspec-its
|
44
43
|
requirement: !ruby/object:Gem::Requirement
|
45
44
|
requirements:
|
46
45
|
- - '>='
|
47
46
|
- !ruby/object:Gem::Version
|
48
47
|
version: '0'
|
49
|
-
|
48
|
+
name: rspec-its
|
50
49
|
prerelease: false
|
50
|
+
type: :development
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - '>='
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name: addressable
|
58
57
|
requirement: !ruby/object:Gem::Requirement
|
59
58
|
requirements:
|
60
59
|
- - '>='
|
61
60
|
- !ruby/object:Gem::Version
|
62
61
|
version: '0'
|
63
|
-
|
62
|
+
name: addressable
|
64
63
|
prerelease: false
|
64
|
+
type: :development
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - '>='
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
|
-
name: sinatra
|
72
71
|
requirement: !ruby/object:Gem::Requirement
|
73
72
|
requirements:
|
74
73
|
- - ~>
|
75
74
|
- !ruby/object:Gem::Version
|
76
75
|
version: '1.4'
|
77
|
-
|
76
|
+
name: sinatra
|
78
77
|
prerelease: false
|
78
|
+
type: :development
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - ~>
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '1.4'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
|
-
name: rack-test
|
86
85
|
requirement: !ruby/object:Gem::Requirement
|
87
86
|
requirements:
|
88
87
|
- - '>='
|
89
88
|
- !ruby/object:Gem::Version
|
90
89
|
version: '0'
|
91
|
-
|
90
|
+
name: rack-test
|
92
91
|
prerelease: false
|
92
|
+
type: :development
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
95
|
- - '>='
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '0'
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
|
-
name: rake
|
100
99
|
requirement: !ruby/object:Gem::Requirement
|
101
100
|
requirements:
|
102
101
|
- - '>='
|
103
102
|
- !ruby/object:Gem::Version
|
104
103
|
version: '0'
|
105
|
-
|
104
|
+
name: rake
|
106
105
|
prerelease: false
|
106
|
+
type: :development
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
109
|
- - '>='
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
|
-
name: yard
|
114
113
|
requirement: !ruby/object:Gem::Requirement
|
115
114
|
requirements:
|
116
115
|
- - '>='
|
117
116
|
- !ruby/object:Gem::Version
|
118
117
|
version: '0'
|
119
|
-
|
118
|
+
name: yard
|
120
119
|
prerelease: false
|
120
|
+
type: :development
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
123
|
- - '>='
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0'
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
|
-
name: simplecov
|
128
127
|
requirement: !ruby/object:Gem::Requirement
|
129
128
|
requirements:
|
130
129
|
- - '>='
|
131
130
|
- !ruby/object:Gem::Version
|
132
131
|
version: '0'
|
133
|
-
|
132
|
+
name: simplecov
|
134
133
|
prerelease: false
|
134
|
+
type: :development
|
135
135
|
version_requirements: !ruby/object:Gem::Requirement
|
136
136
|
requirements:
|
137
137
|
- - '>='
|
138
138
|
- !ruby/object:Gem::Version
|
139
139
|
version: '0'
|
140
140
|
- !ruby/object:Gem::Dependency
|
141
|
-
name: coveralls
|
142
141
|
requirement: !ruby/object:Gem::Requirement
|
143
142
|
requirements:
|
144
143
|
- - '>='
|
145
144
|
- !ruby/object:Gem::Version
|
146
145
|
version: '0'
|
147
|
-
|
146
|
+
name: coveralls
|
148
147
|
prerelease: false
|
148
|
+
type: :development
|
149
149
|
version_requirements: !ruby/object:Gem::Requirement
|
150
150
|
requirements:
|
151
151
|
- - '>='
|
152
152
|
- !ruby/object:Gem::Version
|
153
153
|
version: '0'
|
154
|
-
description: library implementing patterns that behave like regular expressions for
|
155
|
-
use in Ruby 1.9
|
154
|
+
description: library implementing patterns that behave like regular expressions for use in Ruby 1.9
|
156
155
|
email: namusyaka@gmail.com
|
157
156
|
executables: []
|
158
157
|
extensions: []
|
@@ -172,6 +171,7 @@ files:
|
|
172
171
|
- bench/simple_vs_sinatra.rb
|
173
172
|
- bench/template_vs_addressable.rb
|
174
173
|
- lib/mustermann.rb
|
174
|
+
- lib/mustermann/ast/boundaries.rb
|
175
175
|
- lib/mustermann/ast/compiler.rb
|
176
176
|
- lib/mustermann/ast/expander.rb
|
177
177
|
- lib/mustermann/ast/node.rb
|
@@ -197,6 +197,8 @@ files:
|
|
197
197
|
- lib/mustermann/pattern_cache.rb
|
198
198
|
- lib/mustermann/pyramid.rb
|
199
199
|
- lib/mustermann/rails.rb
|
200
|
+
- lib/mustermann/rails/versions.rb
|
201
|
+
- lib/mustermann/regexp.rb
|
200
202
|
- lib/mustermann/regexp_based.rb
|
201
203
|
- lib/mustermann/regular.rb
|
202
204
|
- lib/mustermann/router.rb
|
@@ -209,8 +211,12 @@ files:
|
|
209
211
|
- lib/mustermann/string_scanner.rb
|
210
212
|
- lib/mustermann/template.rb
|
211
213
|
- lib/mustermann/to_pattern.rb
|
214
|
+
- lib/mustermann/uri_template.rb
|
212
215
|
- lib/mustermann/version.rb
|
213
216
|
- mustermann.gemspec
|
217
|
+
- mustermann/README.md
|
218
|
+
- mustermann/lib/mustermann/ast/compiler.rb
|
219
|
+
- spec/ast_spec.rb
|
214
220
|
- spec/composite_spec.rb
|
215
221
|
- spec/expander_spec.rb
|
216
222
|
- spec/express_spec.rb
|
@@ -246,7 +252,7 @@ homepage: https://github.com/namusyaka/mustermann
|
|
246
252
|
licenses:
|
247
253
|
- MIT
|
248
254
|
metadata: {}
|
249
|
-
post_install_message:
|
255
|
+
post_install_message:
|
250
256
|
rdoc_options: []
|
251
257
|
require_paths:
|
252
258
|
- lib
|
@@ -261,12 +267,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
261
267
|
- !ruby/object:Gem::Version
|
262
268
|
version: '0'
|
263
269
|
requirements: []
|
264
|
-
rubyforge_project:
|
265
|
-
rubygems_version: 2.
|
266
|
-
signing_key:
|
270
|
+
rubyforge_project:
|
271
|
+
rubygems_version: 2.1.9
|
272
|
+
signing_key:
|
267
273
|
specification_version: 4
|
268
274
|
summary: use patterns like regular expressions
|
269
275
|
test_files:
|
276
|
+
- spec/ast_spec.rb
|
270
277
|
- spec/composite_spec.rb
|
271
278
|
- spec/expander_spec.rb
|
272
279
|
- spec/express_spec.rb
|
@@ -298,4 +305,4 @@ test_files:
|
|
298
305
|
- spec/support/scan_matcher.rb
|
299
306
|
- spec/template_spec.rb
|
300
307
|
- spec/to_pattern_spec.rb
|
301
|
-
has_rdoc:
|
308
|
+
has_rdoc:
|