mustermann 0.3.1 → 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.
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