mustermann 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +429 -672
  3. data/lib/mustermann.rb +95 -20
  4. data/lib/mustermann/ast/boundaries.rb +44 -0
  5. data/lib/mustermann/ast/compiler.rb +13 -7
  6. data/lib/mustermann/ast/expander.rb +22 -12
  7. data/lib/mustermann/ast/node.rb +69 -5
  8. data/lib/mustermann/ast/param_scanner.rb +20 -0
  9. data/lib/mustermann/ast/parser.rb +138 -19
  10. data/lib/mustermann/ast/pattern.rb +59 -7
  11. data/lib/mustermann/ast/template_generator.rb +28 -0
  12. data/lib/mustermann/ast/transformer.rb +2 -2
  13. data/lib/mustermann/ast/translator.rb +20 -0
  14. data/lib/mustermann/ast/validation.rb +4 -3
  15. data/lib/mustermann/composite.rb +101 -0
  16. data/lib/mustermann/expander.rb +2 -2
  17. data/lib/mustermann/identity.rb +56 -0
  18. data/lib/mustermann/pattern.rb +185 -10
  19. data/lib/mustermann/pattern_cache.rb +49 -0
  20. data/lib/mustermann/regexp.rb +1 -0
  21. data/lib/mustermann/regexp_based.rb +18 -1
  22. data/lib/mustermann/regular.rb +4 -1
  23. data/lib/mustermann/simple_match.rb +5 -0
  24. data/lib/mustermann/sinatra.rb +22 -5
  25. data/lib/mustermann/to_pattern.rb +11 -6
  26. data/lib/mustermann/version.rb +1 -1
  27. data/mustermann.gemspec +1 -14
  28. data/spec/ast_spec.rb +14 -0
  29. data/spec/composite_spec.rb +147 -0
  30. data/spec/expander_spec.rb +15 -0
  31. data/spec/identity_spec.rb +44 -0
  32. data/spec/mustermann_spec.rb +17 -2
  33. data/spec/pattern_spec.rb +7 -3
  34. data/spec/regular_spec.rb +25 -0
  35. data/spec/sinatra_spec.rb +184 -9
  36. data/spec/to_pattern_spec.rb +49 -0
  37. metadata +15 -180
  38. data/.gitignore +0 -18
  39. data/.rspec +0 -2
  40. data/.travis.yml +0 -4
  41. data/.yardopts +0 -1
  42. data/Gemfile +0 -2
  43. data/LICENSE +0 -22
  44. data/Rakefile +0 -6
  45. data/internals.md +0 -64
  46. data/lib/mustermann/ast/tree_renderer.rb +0 -29
  47. data/lib/mustermann/rails.rb +0 -17
  48. data/lib/mustermann/shell.rb +0 -29
  49. data/lib/mustermann/simple.rb +0 -35
  50. data/lib/mustermann/template.rb +0 -47
  51. data/spec/rails_spec.rb +0 -521
  52. data/spec/shell_spec.rb +0 -108
  53. data/spec/simple_spec.rb +0 -236
  54. data/spec/support.rb +0 -5
  55. data/spec/support/coverage.rb +0 -16
  56. data/spec/support/env.rb +0 -16
  57. data/spec/support/expand_matcher.rb +0 -27
  58. data/spec/support/match_matcher.rb +0 -39
  59. data/spec/support/pattern.rb +0 -39
  60. data/spec/template_spec.rb +0 -814
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mustermann
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konstantin Haase
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-12 00:00:00.000000000 Z
11
+ date: 2014-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tool
@@ -24,220 +24,63 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.2'
27
- - !ruby/object:Gem::Dependency
28
- name: rspec
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec-its
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: addressable
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: sinatra
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.4'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.4'
83
- - !ruby/object:Gem::Dependency
84
- name: rack-test
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: yard
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: redcarpet
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- - !ruby/object:Gem::Dependency
140
- name: simplecov
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '0'
153
- - !ruby/object:Gem::Dependency
154
- name: coveralls
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - ">="
158
- - !ruby/object:Gem::Version
159
- version: '0'
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - ">="
165
- - !ruby/object:Gem::Version
166
- version: '0'
167
27
  description: library implementing patterns that behave like regular expressions
168
28
  email: konstantin.mailinglists@googlemail.com
169
29
  executables: []
170
30
  extensions: []
171
- extra_rdoc_files:
172
- - README.md
173
- - internals.md
31
+ extra_rdoc_files: []
174
32
  files:
175
- - ".gitignore"
176
- - ".rspec"
177
- - ".travis.yml"
178
- - ".yardopts"
179
- - Gemfile
180
- - LICENSE
181
33
  - README.md
182
- - Rakefile
183
34
  - bench/capturing.rb
184
35
  - bench/regexp.rb
185
36
  - bench/simple_vs_sinatra.rb
186
37
  - bench/template_vs_addressable.rb
187
- - internals.md
188
38
  - lib/mustermann.rb
39
+ - lib/mustermann/ast/boundaries.rb
189
40
  - lib/mustermann/ast/compiler.rb
190
41
  - lib/mustermann/ast/expander.rb
191
42
  - lib/mustermann/ast/node.rb
43
+ - lib/mustermann/ast/param_scanner.rb
192
44
  - lib/mustermann/ast/parser.rb
193
45
  - lib/mustermann/ast/pattern.rb
46
+ - lib/mustermann/ast/template_generator.rb
194
47
  - lib/mustermann/ast/transformer.rb
195
48
  - lib/mustermann/ast/translator.rb
196
- - lib/mustermann/ast/tree_renderer.rb
197
49
  - lib/mustermann/ast/validation.rb
198
50
  - lib/mustermann/caster.rb
51
+ - lib/mustermann/composite.rb
199
52
  - lib/mustermann/error.rb
200
53
  - lib/mustermann/expander.rb
201
54
  - lib/mustermann/extension.rb
202
55
  - lib/mustermann/identity.rb
203
56
  - lib/mustermann/mapper.rb
204
57
  - lib/mustermann/pattern.rb
205
- - lib/mustermann/rails.rb
58
+ - lib/mustermann/pattern_cache.rb
59
+ - lib/mustermann/regexp.rb
206
60
  - lib/mustermann/regexp_based.rb
207
61
  - lib/mustermann/regular.rb
208
62
  - lib/mustermann/router.rb
209
63
  - lib/mustermann/router/rack.rb
210
64
  - lib/mustermann/router/simple.rb
211
- - lib/mustermann/shell.rb
212
- - lib/mustermann/simple.rb
213
65
  - lib/mustermann/simple_match.rb
214
66
  - lib/mustermann/sinatra.rb
215
- - lib/mustermann/template.rb
216
67
  - lib/mustermann/to_pattern.rb
217
68
  - lib/mustermann/version.rb
218
69
  - mustermann.gemspec
70
+ - spec/ast_spec.rb
71
+ - spec/composite_spec.rb
219
72
  - spec/expander_spec.rb
220
73
  - spec/extension_spec.rb
221
74
  - spec/identity_spec.rb
222
75
  - spec/mapper_spec.rb
223
76
  - spec/mustermann_spec.rb
224
77
  - spec/pattern_spec.rb
225
- - spec/rails_spec.rb
226
78
  - spec/regexp_based_spec.rb
227
79
  - spec/regular_spec.rb
228
80
  - spec/router/rack_spec.rb
229
81
  - spec/router/simple_spec.rb
230
- - spec/shell_spec.rb
231
82
  - spec/simple_match_spec.rb
232
- - spec/simple_spec.rb
233
83
  - spec/sinatra_spec.rb
234
- - spec/support.rb
235
- - spec/support/coverage.rb
236
- - spec/support/env.rb
237
- - spec/support/expand_matcher.rb
238
- - spec/support/match_matcher.rb
239
- - spec/support/pattern.rb
240
- - spec/template_spec.rb
241
84
  - spec/to_pattern_spec.rb
242
85
  homepage: https://github.com/rkh/mustermann
243
86
  licenses:
@@ -251,7 +94,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
251
94
  requirements:
252
95
  - - ">="
253
96
  - !ruby/object:Gem::Version
254
- version: 2.0.0
97
+ version: 2.1.0
255
98
  required_rubygems_version: !ruby/object:Gem::Requirement
256
99
  requirements:
257
100
  - - ">="
@@ -259,32 +102,24 @@ required_rubygems_version: !ruby/object:Gem::Requirement
259
102
  version: '0'
260
103
  requirements: []
261
104
  rubyforge_project:
262
- rubygems_version: 2.2.2
105
+ rubygems_version: 2.4.3
263
106
  signing_key:
264
107
  specification_version: 4
265
108
  summary: use patterns like regular expressions
266
109
  test_files:
110
+ - spec/ast_spec.rb
111
+ - spec/composite_spec.rb
267
112
  - spec/expander_spec.rb
268
113
  - spec/extension_spec.rb
269
114
  - spec/identity_spec.rb
270
115
  - spec/mapper_spec.rb
271
116
  - spec/mustermann_spec.rb
272
117
  - spec/pattern_spec.rb
273
- - spec/rails_spec.rb
274
118
  - spec/regexp_based_spec.rb
275
119
  - spec/regular_spec.rb
276
120
  - spec/router/rack_spec.rb
277
121
  - spec/router/simple_spec.rb
278
- - spec/shell_spec.rb
279
122
  - spec/simple_match_spec.rb
280
- - spec/simple_spec.rb
281
123
  - spec/sinatra_spec.rb
282
- - spec/support.rb
283
- - spec/support/coverage.rb
284
- - spec/support/env.rb
285
- - spec/support/expand_matcher.rb
286
- - spec/support/match_matcher.rb
287
- - spec/support/pattern.rb
288
- - spec/template_spec.rb
289
124
  - spec/to_pattern_spec.rb
290
125
  has_rdoc:
data/.gitignore DELETED
@@ -1,18 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- .test_queue_stats
7
- .coverage
8
- Gemfile.lock
9
- InstalledFiles
10
- _yardoc
11
- doc/
12
- lib/bundler/man
13
- pkg
14
- rdoc
15
- spec/reports
16
- test/tmp
17
- test/version_tmp
18
- tmp
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --tty
@@ -1,4 +0,0 @@
1
- rvm:
2
- - 2.0.0
3
- - 2.1.2
4
- - ruby-head
data/.yardopts DELETED
@@ -1 +0,0 @@
1
- - README.md internals.md
data/Gemfile DELETED
@@ -1,2 +0,0 @@
1
- source 'https://rubygems.org'
2
- gemspec
data/LICENSE DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2013 Konstantin Haase
2
-
3
- Permission is hereby granted, free of charge, to any person
4
- obtaining a copy of this software and associated documentation
5
- files (the "Software"), to deal in the Software without
6
- restriction, including without limitation the rights to use,
7
- copy, modify, merge, publish, distribute, sublicense, and/or sell
8
- copies of the Software, and to permit persons to whom the
9
- Software is furnished to do so, subject to the following
10
- conditions:
11
-
12
- The above copyright notice and this permission notice shall be
13
- included in all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
- OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- ENV['JRUBY_OPTS'] = '--2.0 -X-C'
2
- ENV['RBXOPT'] = '-X20'
3
-
4
- task(:spec) { ruby '-w -S rspec' }
5
- task(:doc_stats) { ruby '-S yard stats' }
6
- task(default: [:spec, :doc_stats])
@@ -1,64 +0,0 @@
1
- # Internal API
2
-
3
- This document describes how to use [Mustermann](README.md)'s internal API.
4
-
5
- It is a secondary goal to keep the internal API as stable as possible, in a state where it would well be possible to interface with it.
6
- However, the internal API is not covered by Semantic Versioning. As a rule of thumb, no backwards incompatible changes should be introduced to the API in minor releases (starting from 1.0.0).
7
-
8
- Should the internal API gain widespread/production use, we might consider moving parts of it over into the public API.
9
-
10
- Here is a quick example of what you can do with this:
11
-
12
- ``` ruby
13
- require 'mustermann/ast/pattern'
14
-
15
- class MyPattern < Mustermann::AST::Pattern
16
- on("~") { |c| node(:capture, buffer[1]) if expect(/\{(\w+)\}/) }
17
- on("+") { |c| node(:named_splat, buffer[1]) if expect(/\{(\w+)\}/) }
18
- on("?") { |c| node(:optional, node(:capture, buffer[1])) if expect(/\{(\w+)\}/) }
19
- end
20
-
21
- pattern = MyPattern.new("/+{prefix}/~{page}/?{optional}")
22
- pattern.params("/a/") # => nil
23
- pattern.params("/a/b/") # => { "prefix" => "a", "page" => "b", "optional" => nil }
24
- pattern.params("/a/b/c") # => { "prefix" => "a", "page" => "b", "optional" => "c" }
25
- pattern.params("/a/b/c/") # => { "prefix" => "a/b", "page" => "c", "optional" => nil }
26
-
27
- pattern.expand(prefix: "a", page: "foo") # => "/a/foo/"
28
- pattern.expand(prefix: "a/b", page: "c/d") # => "/a/b/c%2Fd/"
29
-
30
- require 'mustermann'
31
- Mustermann.register(:my_pattern, MyPattern, load: false)
32
- Mustermann.new('/+{prefix}/~{page}/?{optional}', type: :my_pattern) # => #<MyPattern:"/+{prefix}/~{page}/?{optional}">
33
-
34
- require 'sinatra/base'
35
- class MyApp < Sinatra::Base
36
- register Mustermann
37
- set :pattern, type: :my_pattern
38
-
39
- get '/hello/~{name}' do
40
- "Hello #{params[:name].capitalize}!"
41
- end
42
- end
43
-
44
- require 'mustermann/ast/tree_renderer'
45
- ast = MyPattern::Parser.parse(pattern.to_s)
46
- puts Mustermann::AST::TreeRenderer.render(ast)
47
-
48
- ```
49
-
50
- ## Pattern Registration
51
-
52
- ...
53
-
54
- ## Build Your Own Pattern
55
-
56
- ...
57
-
58
- ## Patterns Based on Regular Expressions
59
-
60
- ...
61
-
62
- ## AST-Based Patterns
63
-
64
- ...
@@ -1,29 +0,0 @@
1
- require 'mustermann/ast/translator'
2
-
3
- module Mustermann
4
- module AST
5
- # Turns an AST into a human readable string.
6
- # @!visibility private
7
- class TreeRenderer < Translator
8
- # @example
9
- # Mustermann::AST::TreeRenderer.render Mustermann::Sinatra::Parser.parse('/foo')
10
- #
11
- # @!visibility private
12
- def self.render(ast)
13
- new.translate(ast)
14
- end
15
-
16
- translate(Object) { inspect }
17
- translate(Array) { map { |e| "\n" << t(e) }.join.gsub("\n", "\n ") }
18
- translate(:node) { "#{t.type(node)} #{t(payload)}" }
19
- translate(:with_look_ahead) { "#{t.type(node)} #{t(head)} #{t(payload)}" }
20
-
21
- # Turns a class name into a node identifier.
22
- #
23
- # @!visibility private
24
- def type(node)
25
- node.class.name[/[^:]+$/].split(/(?<=.)(?=[A-Z])/).map(&:downcase).join(?_)
26
- end
27
- end
28
- end
29
- end