mustermann-contrib 1.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +1239 -0
- data/examples/highlighting.rb +35 -0
- data/highlighting.png +0 -0
- data/irb.png +0 -0
- data/lib/mustermann/cake.rb +18 -0
- data/lib/mustermann/express.rb +37 -0
- data/lib/mustermann/file_utils.rb +217 -0
- data/lib/mustermann/file_utils/glob_pattern.rb +39 -0
- data/lib/mustermann/fileutils.rb +1 -0
- data/lib/mustermann/flask.rb +198 -0
- data/lib/mustermann/grape.rb +35 -0
- data/lib/mustermann/pyramid.rb +28 -0
- data/lib/mustermann/rails.rb +46 -0
- data/lib/mustermann/shell.rb +56 -0
- data/lib/mustermann/simple.rb +50 -0
- data/lib/mustermann/string_scanner.rb +313 -0
- data/lib/mustermann/strscan.rb +1 -0
- data/lib/mustermann/template.rb +62 -0
- data/lib/mustermann/uri_template.rb +1 -0
- data/lib/mustermann/versions.rb +46 -0
- data/lib/mustermann/visualizer.rb +38 -0
- data/lib/mustermann/visualizer/highlight.rb +137 -0
- data/lib/mustermann/visualizer/highlighter.rb +37 -0
- data/lib/mustermann/visualizer/highlighter/ad_hoc.rb +94 -0
- data/lib/mustermann/visualizer/highlighter/ast.rb +102 -0
- data/lib/mustermann/visualizer/highlighter/composite.rb +45 -0
- data/lib/mustermann/visualizer/highlighter/dummy.rb +18 -0
- data/lib/mustermann/visualizer/highlighter/regular.rb +104 -0
- data/lib/mustermann/visualizer/pattern_extension.rb +68 -0
- data/lib/mustermann/visualizer/renderer/ansi.rb +23 -0
- data/lib/mustermann/visualizer/renderer/generic.rb +46 -0
- data/lib/mustermann/visualizer/renderer/hansi_template.rb +34 -0
- data/lib/mustermann/visualizer/renderer/html.rb +50 -0
- data/lib/mustermann/visualizer/renderer/sexp.rb +37 -0
- data/lib/mustermann/visualizer/tree.rb +63 -0
- data/lib/mustermann/visualizer/tree_renderer.rb +78 -0
- data/mustermann-contrib.gemspec +19 -0
- data/spec/cake_spec.rb +90 -0
- data/spec/express_spec.rb +209 -0
- data/spec/file_utils_spec.rb +119 -0
- data/spec/flask_spec.rb +361 -0
- data/spec/flask_subclass_spec.rb +368 -0
- data/spec/grape_spec.rb +747 -0
- data/spec/pattern_extension_spec.rb +49 -0
- data/spec/pyramid_spec.rb +101 -0
- data/spec/rails_spec.rb +647 -0
- data/spec/shell_spec.rb +147 -0
- data/spec/simple_spec.rb +268 -0
- data/spec/string_scanner_spec.rb +271 -0
- data/spec/template_spec.rb +841 -0
- data/spec/visualizer_spec.rb +199 -0
- data/theme.png +0 -0
- data/tree.png +0 -0
- metadata +126 -0
@@ -0,0 +1,199 @@
|
|
1
|
+
require 'support'
|
2
|
+
require 'mustermann/visualizer'
|
3
|
+
|
4
|
+
describe Mustermann::Visualizer do
|
5
|
+
subject(:highlight) { Mustermann::Visualizer.highlight(pattern) }
|
6
|
+
before { Hansi.mode = 256 }
|
7
|
+
after { Hansi.mode = nil }
|
8
|
+
|
9
|
+
describe :highlight do
|
10
|
+
context :sinatra do
|
11
|
+
context "/a" do
|
12
|
+
let(:pattern) { Mustermann.new("/a") }
|
13
|
+
its(:to_ansi) { should be == "\e[0m\e[38;5;246m\e[38;5;246m\e[38;5;247m/\e[0m\e[38;5;246m\e[38;5;246m\e[38;5;246ma\e[0m" }
|
14
|
+
its(:to_html) { should be == '<span style="color: #839496;"><span style="color: #93a1a1;">/</span><span style="color: #839496;">a</span></span></span>' }
|
15
|
+
its(:to_sexp) { should be == '(root (separator /) (char a))' }
|
16
|
+
its(:to_pattern) { should be == pattern }
|
17
|
+
its(:to_s) { should be == "/a" }
|
18
|
+
its(:stylesheet) { should include(".mustermann_pattern .mustermann_illegal {\n color: #8b0000;") }
|
19
|
+
|
20
|
+
example do
|
21
|
+
highlight.to_html(css: false).should be ==
|
22
|
+
'<span class="mustermann_pattern"><span class="mustermann_root"><span class="mustermann_separator">/</span><span class="mustermann_char">a</span></span></span>'
|
23
|
+
end
|
24
|
+
|
25
|
+
example do
|
26
|
+
renderer = Mustermann::Visualizer::Renderer::Generic
|
27
|
+
result = highlight.render_with(renderer)
|
28
|
+
result.should be == pattern.to_s
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context '/:name' do
|
33
|
+
let(:pattern) { Mustermann.new("/:name") }
|
34
|
+
its(:to_sexp) { should be == "(root (separator /) (capture : (name name)))" }
|
35
|
+
end
|
36
|
+
|
37
|
+
context '/{name}' do
|
38
|
+
let(:pattern) { Mustermann.new("/{name}") }
|
39
|
+
its(:to_sexp) { should be == "(root (separator /) (capture { (name name) }))" }
|
40
|
+
end
|
41
|
+
|
42
|
+
context '/{+name}' do
|
43
|
+
let(:pattern) { Mustermann.new("/{+name}") }
|
44
|
+
its(:to_sexp) { should be == "(root (separator /) (named_splat {+ (name name) }))" }
|
45
|
+
end
|
46
|
+
|
47
|
+
context ':user(@:host)?' do
|
48
|
+
let(:pattern) { Mustermann.new(':user(@:host)?') }
|
49
|
+
its(:to_sexp) { should be == '(root (capture : (name user)) (optional (group "(" (char @) (capture : (name host)) ")") ?))' }
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'a b' do
|
53
|
+
let(:pattern) { Mustermann.new('a b') }
|
54
|
+
its(:to_sexp) { should be == '(root (char a) (char " ") (char b))' }
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'a|b' do
|
58
|
+
let(:pattern) { Mustermann.new('a|b') }
|
59
|
+
its(:to_sexp) { should be == '(root (union (char a) | (char b)))' }
|
60
|
+
end
|
61
|
+
|
62
|
+
context '(a|b)' do
|
63
|
+
let(:pattern) { Mustermann.new('(a|b)c') }
|
64
|
+
its(:to_sexp) { should be == '(root (union "(" (char a) | (char b) ")") (char c))' }
|
65
|
+
end
|
66
|
+
|
67
|
+
context '\:a' do
|
68
|
+
let(:pattern) { Mustermann.new('\:a') }
|
69
|
+
its(:to_sexp) { should be == '(root (escaped "\\\\" (escaped_char :)) (char a))' }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context :regexp do
|
74
|
+
context 'a' do
|
75
|
+
let(:pattern) { Mustermann.new('a', type: :regexp) }
|
76
|
+
its(:to_sexp) { should be == '(root (char a))' }
|
77
|
+
end
|
78
|
+
|
79
|
+
context '/(\d+)' do
|
80
|
+
let(:pattern) { Mustermann.new('/(\d+)', type: :regexp) }
|
81
|
+
its(:to_sexp) { should be == '(root (separator /) (capture "(" (special "\\\\d") (special +))))' }
|
82
|
+
end
|
83
|
+
|
84
|
+
context '\A' do
|
85
|
+
let(:pattern) { Mustermann.new('\A', type: :regexp, check_anchors: false) }
|
86
|
+
its(:to_sexp) { should be == '(root (illegal "\\\\A"))' }
|
87
|
+
end
|
88
|
+
|
89
|
+
context '(?<name>.)\g<name>' do
|
90
|
+
let(:pattern) { Mustermann.new('(?<name>.)\g<name>', type: :regexp) }
|
91
|
+
its(:to_sexp) { should be == '(root (capture "(?<" (name name) >(special .))) (special "\\\\g<name>"))' }
|
92
|
+
end
|
93
|
+
|
94
|
+
context '\p{Ll}' do
|
95
|
+
let(:pattern) { Mustermann.new('\p{Ll}', type: :regexp) }
|
96
|
+
its(:to_sexp) { should be == '(root (special "\\\\p{Ll}"))' }
|
97
|
+
end
|
98
|
+
|
99
|
+
context '\/' do
|
100
|
+
let(:pattern) { Mustermann.new('\/', type: :regexp) }
|
101
|
+
its(:to_sexp) { should be == '(root (separator /))' }
|
102
|
+
end
|
103
|
+
|
104
|
+
context '\[' do
|
105
|
+
let(:pattern) { Mustermann.new('\[', type: :regexp) }
|
106
|
+
its(:to_sexp) { should be == '(root (escaped "\\\\" (escaped_char [)))' }
|
107
|
+
end
|
108
|
+
|
109
|
+
context '^' do
|
110
|
+
let(:pattern) { Mustermann.new('^', type: :regexp, check_anchors: false) }
|
111
|
+
its(:to_sexp) { should be == '(root (illegal ^))' }
|
112
|
+
end
|
113
|
+
|
114
|
+
context '(?-mix:.)' do
|
115
|
+
let(:pattern) { Mustermann.new('(?-mix:.)', type: :regexp) }
|
116
|
+
its(:to_sexp) { should be == '(root (special "(?-mix:") (special .) (special ")"))' }
|
117
|
+
end
|
118
|
+
|
119
|
+
context '[a\d]' do
|
120
|
+
let(:pattern) { Mustermann.new('[a\d]', type: :regexp) }
|
121
|
+
its(:to_sexp) { should be == '(root (special [) (char a) (special "\\\\d") (special ]))' }
|
122
|
+
end
|
123
|
+
|
124
|
+
context '[^a-z]' do
|
125
|
+
let(:pattern) { Mustermann.new('[^a-z]', type: :regexp) }
|
126
|
+
its(:to_sexp) { should be == '(root (special [) (special ^) (char a) (special -) (char z) (special ]))' }
|
127
|
+
end
|
128
|
+
|
129
|
+
context '[[:digit:]]' do
|
130
|
+
let(:pattern) { Mustermann.new('[[:digit:]]', type: :regexp) }
|
131
|
+
its(:to_sexp) { should be == '(root (special [[:digit:]]))' }
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'a{1,}' do
|
135
|
+
let(:pattern) { Mustermann.new('a{1,}', type: :regexp) }
|
136
|
+
its(:to_sexp) { should be == "(root (char a) (special {1,}))" }
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context :template do
|
141
|
+
context '/{name}' do
|
142
|
+
let(:pattern) { Mustermann.new("/{+foo,bar*}", type: :template) }
|
143
|
+
its(:to_sexp) { should be == "(root (separator /) (expression {+ (variable (name foo)) , (variable (name bar) *) }))" }
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
context "custom AST based pattern" do
|
148
|
+
let(:my_type) { Class.new(Mustermann::AST::Pattern) { on('x') { |*| node(:char, "o") } }}
|
149
|
+
let(:pattern) { Mustermann.new("fxx", type: my_type) }
|
150
|
+
its(:to_sexp) { should be == "(root (char f) (escaped x) (escaped x))" }
|
151
|
+
end
|
152
|
+
|
153
|
+
context "without known highlighter" do
|
154
|
+
let(:pattern) { Mustermann::Pattern.new("foo") }
|
155
|
+
its(:to_sexp) { should be == "(root (unknown foo))" }
|
156
|
+
end
|
157
|
+
|
158
|
+
context :composite do
|
159
|
+
let(:pattern) { Mustermann.new(":a", ":b") ^ Mustermann.new(":c") }
|
160
|
+
its(:to_sexp) do
|
161
|
+
should be == '(composite (quote "(") (composite (type sinatra:) (quote "\\"") ' \
|
162
|
+
'(root (capture : (name a))) (quote "\\"") (quote " | ") (type sinatra:) (quote ' \
|
163
|
+
'"\\"") (root (capture : (name b))) (quote "\\"")) (quote ")") (quote " ^ ") (type ' \
|
164
|
+
'sinatra:) (quote "\\"") (root (capture : (name c))) (quote "\\""))'
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
describe :tree do
|
170
|
+
subject(:tree) { Mustermann::Visualizer.tree(pattern) }
|
171
|
+
|
172
|
+
context :sinatra do
|
173
|
+
context "/:a(@:b)" do
|
174
|
+
let(:pattern) { Mustermann.new("/:a(@:b)") }
|
175
|
+
let(:tree_data) do
|
176
|
+
<<-TREE.gsub(/^\s+/, '')
|
177
|
+
\e[38;5;61m\e[0m\e[38;5;100mroot\e[0m \e[0m\e[38;5;66m\"\e[0m\e[38;5;66m\e[38;5;242m\e[0m\e[38;5;66m\e[4m\e[38;5;100m/:a(@:b)\e[0m\e[38;5;66m\e[38;5;242m\e[0m\e[38;5;66m\" \e[0m
|
178
|
+
\e[38;5;61m└ \e[0m\e[38;5;166mpayload\e[0m
|
179
|
+
\e[38;5;61m ├ \e[0m\e[38;5;100mseparator\e[0m \e[0m\e[38;5;66m\"\e[0m\e[38;5;66m\e[38;5;242m\e[0m\e[38;5;66m\e[4m\e[38;5;100m/\e[0m\e[38;5;66m\e[38;5;242m:a(@:b)\e[0m\e[38;5;66m\" \e[0m
|
180
|
+
\e[38;5;61m ├ \e[0m\e[38;5;100mcapture\e[0m \e[0m\e[38;5;66m\"\e[0m\e[38;5;66m\e[38;5;242m/\e[0m\e[38;5;66m\e[4m\e[38;5;100m:a\e[0m\e[38;5;66m\e[38;5;242m(@:b)\e[0m\e[38;5;66m\" \e[0m
|
181
|
+
\e[38;5;61m └ \e[0m\e[38;5;100mgroup\e[0m \e[0m\e[38;5;66m\"\e[0m\e[38;5;66m\e[38;5;242m/:a\e[0m\e[38;5;66m\e[4m\e[38;5;100m(@:b)\e[0m\e[38;5;66m\e[38;5;242m\e[0m\e[38;5;66m\" \e[0m
|
182
|
+
\e[38;5;61m └ \e[0m\e[38;5;166mpayload\e[0m
|
183
|
+
\e[38;5;61m ├ \e[0m\e[38;5;100mchar\e[0m \e[0m\e[38;5;66m\"\e[0m\e[38;5;66m\e[38;5;242m/:a(\e[0m\e[38;5;66m\e[4m\e[38;5;100m@\e[0m\e[38;5;66m\e[38;5;242m:b)\e[0m\e[38;5;66m\" \e[0m
|
184
|
+
\e[38;5;61m └ \e[0m\e[38;5;100mcapture\e[0m \e[0m\e[38;5;66m\"\e[0m\e[38;5;66m\e[38;5;242m/:a(@\e[0m\e[38;5;66m\e[4m\e[38;5;100m:b\e[0m\e[38;5;66m\e[38;5;242m)\e[0m\e[38;5;66m\" \e[0m
|
185
|
+
TREE
|
186
|
+
end
|
187
|
+
its(:to_s) { should be == tree_data }
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
context :shell do
|
192
|
+
context "/**/*" do
|
193
|
+
let(:pattern) { Mustermann.new("/**/*", type: :shell) }
|
194
|
+
let(:tree_data) { "\e[38;5;61m\e[0m\e[38;5;100mpattern (not AST based)\e[0m \e[0m\e[38;5;66m\"\e[0m\e[38;5;66m\e[38;5;242m\e[0m\e[38;5;66m\e[4m\e[38;5;100m/**/*\e[0m\e[38;5;66m\e[38;5;242m\e[0m\e[38;5;66m\" \e[0m\n" }
|
195
|
+
its(:to_s) { should be == tree_data }
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
data/theme.png
ADDED
Binary file
|
data/tree.png
ADDED
Binary file
|
metadata
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mustermann-contrib
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.beta2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Konstantin Haase
|
8
|
+
- Zachary Scott
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2016-08-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: mustermann
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - '='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 1.0.0.beta2
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - '='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 1.0.0.beta2
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: hansi
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 0.2.0
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 0.2.0
|
42
|
+
description: Adds many plugins to Mustermman
|
43
|
+
email: mail@zzak.io
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- README.md
|
49
|
+
- examples/highlighting.rb
|
50
|
+
- highlighting.png
|
51
|
+
- irb.png
|
52
|
+
- lib/mustermann/cake.rb
|
53
|
+
- lib/mustermann/express.rb
|
54
|
+
- lib/mustermann/file_utils.rb
|
55
|
+
- lib/mustermann/file_utils/glob_pattern.rb
|
56
|
+
- lib/mustermann/fileutils.rb
|
57
|
+
- lib/mustermann/flask.rb
|
58
|
+
- lib/mustermann/grape.rb
|
59
|
+
- lib/mustermann/pyramid.rb
|
60
|
+
- lib/mustermann/rails.rb
|
61
|
+
- lib/mustermann/shell.rb
|
62
|
+
- lib/mustermann/simple.rb
|
63
|
+
- lib/mustermann/string_scanner.rb
|
64
|
+
- lib/mustermann/strscan.rb
|
65
|
+
- lib/mustermann/template.rb
|
66
|
+
- lib/mustermann/uri_template.rb
|
67
|
+
- lib/mustermann/versions.rb
|
68
|
+
- lib/mustermann/visualizer.rb
|
69
|
+
- lib/mustermann/visualizer/highlight.rb
|
70
|
+
- lib/mustermann/visualizer/highlighter.rb
|
71
|
+
- lib/mustermann/visualizer/highlighter/ad_hoc.rb
|
72
|
+
- lib/mustermann/visualizer/highlighter/ast.rb
|
73
|
+
- lib/mustermann/visualizer/highlighter/composite.rb
|
74
|
+
- lib/mustermann/visualizer/highlighter/dummy.rb
|
75
|
+
- lib/mustermann/visualizer/highlighter/regular.rb
|
76
|
+
- lib/mustermann/visualizer/pattern_extension.rb
|
77
|
+
- lib/mustermann/visualizer/renderer/ansi.rb
|
78
|
+
- lib/mustermann/visualizer/renderer/generic.rb
|
79
|
+
- lib/mustermann/visualizer/renderer/hansi_template.rb
|
80
|
+
- lib/mustermann/visualizer/renderer/html.rb
|
81
|
+
- lib/mustermann/visualizer/renderer/sexp.rb
|
82
|
+
- lib/mustermann/visualizer/tree.rb
|
83
|
+
- lib/mustermann/visualizer/tree_renderer.rb
|
84
|
+
- mustermann-contrib.gemspec
|
85
|
+
- spec/cake_spec.rb
|
86
|
+
- spec/express_spec.rb
|
87
|
+
- spec/file_utils_spec.rb
|
88
|
+
- spec/flask_spec.rb
|
89
|
+
- spec/flask_subclass_spec.rb
|
90
|
+
- spec/grape_spec.rb
|
91
|
+
- spec/pattern_extension_spec.rb
|
92
|
+
- spec/pyramid_spec.rb
|
93
|
+
- spec/rails_spec.rb
|
94
|
+
- spec/shell_spec.rb
|
95
|
+
- spec/simple_spec.rb
|
96
|
+
- spec/string_scanner_spec.rb
|
97
|
+
- spec/template_spec.rb
|
98
|
+
- spec/visualizer_spec.rb
|
99
|
+
- theme.png
|
100
|
+
- tree.png
|
101
|
+
homepage: https://github.com/sinatra/mustermann
|
102
|
+
licenses:
|
103
|
+
- MIT
|
104
|
+
metadata: {}
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options: []
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: 2.2.0
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 1.3.1
|
119
|
+
requirements: []
|
120
|
+
rubyforge_project:
|
121
|
+
rubygems_version: 2.5.1
|
122
|
+
signing_key:
|
123
|
+
specification_version: 4
|
124
|
+
summary: Collection of extensions for Mustermann
|
125
|
+
test_files: []
|
126
|
+
has_rdoc:
|