dandy 0.6.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 (75) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +134 -0
  8. data/Rakefile +6 -0
  9. data/bin/console +7 -0
  10. data/bin/setup +8 -0
  11. data/dandy.gemspec +46 -0
  12. data/exe/dandy +5 -0
  13. data/lib/dandy.rb +6 -0
  14. data/lib/dandy/app.rb +93 -0
  15. data/lib/dandy/base/handle_errors.rb +16 -0
  16. data/lib/dandy/chain.rb +68 -0
  17. data/lib/dandy/chain_factory.rb +39 -0
  18. data/lib/dandy/config.rb +15 -0
  19. data/lib/dandy/errors/dandy_error.rb +4 -0
  20. data/lib/dandy/errors/syntax_error.rb +6 -0
  21. data/lib/dandy/errors/view_engine_error.rb +6 -0
  22. data/lib/dandy/extensions/hash.rb +18 -0
  23. data/lib/dandy/generators/cli.rb +58 -0
  24. data/lib/dandy/generators/templates/Gemfile +4 -0
  25. data/lib/dandy/generators/templates/actions/common/handle_errors.rb +2 -0
  26. data/lib/dandy/generators/templates/actions/welcome.tt +9 -0
  27. data/lib/dandy/generators/templates/app/app.rb +4 -0
  28. data/lib/dandy/generators/templates/app/app.routes +4 -0
  29. data/lib/dandy/generators/templates/config.ru +17 -0
  30. data/lib/dandy/generators/templates/silicon.yml +7 -0
  31. data/lib/dandy/generators/templates/views/show_welcome.json.jbuilder +1 -0
  32. data/lib/dandy/loaders/dependency_loader.rb +21 -0
  33. data/lib/dandy/loaders/template_loader.rb +20 -0
  34. data/lib/dandy/loaders/type_loader.rb +25 -0
  35. data/lib/dandy/request.rb +65 -0
  36. data/lib/dandy/routing/builder.rb +96 -0
  37. data/lib/dandy/routing/file_reader.rb +27 -0
  38. data/lib/dandy/routing/match.rb +12 -0
  39. data/lib/dandy/routing/matcher.rb +40 -0
  40. data/lib/dandy/routing/parser.rb +25 -0
  41. data/lib/dandy/routing/route.rb +23 -0
  42. data/lib/dandy/routing/routing.rb +11 -0
  43. data/lib/dandy/routing/syntax.rb +29 -0
  44. data/lib/dandy/routing/syntax/action.rb +30 -0
  45. data/lib/dandy/routing/syntax/actions.rb +15 -0
  46. data/lib/dandy/routing/syntax/after_section.rb +19 -0
  47. data/lib/dandy/routing/syntax/before_section.rb +18 -0
  48. data/lib/dandy/routing/syntax/catch_section.rb +15 -0
  49. data/lib/dandy/routing/syntax/command.rb +36 -0
  50. data/lib/dandy/routing/syntax/commands.rb +7 -0
  51. data/lib/dandy/routing/syntax/node.rb +47 -0
  52. data/lib/dandy/routing/syntax/nodes.rb +13 -0
  53. data/lib/dandy/routing/syntax/primitives/arrow.rb +4 -0
  54. data/lib/dandy/routing/syntax/primitives/back_arrow.rb +4 -0
  55. data/lib/dandy/routing/syntax/primitives/eol.rb +4 -0
  56. data/lib/dandy/routing/syntax/primitives/http_status.rb +13 -0
  57. data/lib/dandy/routing/syntax/primitives/http_verb.rb +4 -0
  58. data/lib/dandy/routing/syntax/primitives/indent.rb +4 -0
  59. data/lib/dandy/routing/syntax/primitives/parameter.rb +4 -0
  60. data/lib/dandy/routing/syntax/primitives/path.rb +5 -0
  61. data/lib/dandy/routing/syntax/primitives/result_name.rb +4 -0
  62. data/lib/dandy/routing/syntax/respond.rb +25 -0
  63. data/lib/dandy/routing/syntax/route.rb +25 -0
  64. data/lib/dandy/routing/syntax/sections.rb +19 -0
  65. data/lib/dandy/routing/syntax/tree_section.rb +11 -0
  66. data/lib/dandy/routing/syntax/view.rb +7 -0
  67. data/lib/dandy/routing/syntax_error_interpreter.rb +28 -0
  68. data/lib/dandy/routing/syntax_grammar.tt +99 -0
  69. data/lib/dandy/template_registry.rb +29 -0
  70. data/lib/dandy/version.rb +3 -0
  71. data/lib/dandy/view_builder.rb +18 -0
  72. data/lib/dandy/view_builder_registry.rb +21 -0
  73. data/lib/dandy/view_builders/json.rb +16 -0
  74. data/lib/dandy/view_factory.rb +21 -0
  75. metadata +288 -0
@@ -0,0 +1,4 @@
1
+ module Syntax
2
+ class ResultName < Treetop::Runtime::SyntaxNode
3
+ end
4
+ end
@@ -0,0 +1,25 @@
1
+ module Syntax
2
+ class Respond < Treetop::Runtime::SyntaxNode
3
+ attr_reader :view, :http_status
4
+
5
+ def parse
6
+ if elements.length > 0
7
+ elements[0].elements[1].elements.each do |element|
8
+ if element.is_a? View
9
+ @view = element.parse
10
+ end
11
+
12
+ if element.is_a? HttpStatus
13
+ @http_status = element.parse
14
+ end
15
+ end
16
+ end
17
+
18
+ self
19
+ end
20
+
21
+ def to_hash
22
+ {view: @view, http_status: @http_status}
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ module Syntax
2
+ class Route < Treetop::Runtime::SyntaxNode
3
+ attr_reader :node, :path, :parameter
4
+
5
+ def parse(node)
6
+ @node = node
7
+
8
+ elements.each do |element|
9
+ if element.is_a? Parameter
10
+ @parameter = element.text_value
11
+ end
12
+
13
+ if element.is_a? Path
14
+ @path = element.text_value
15
+ end
16
+ end
17
+
18
+ self
19
+ end
20
+
21
+ def to_hash
22
+ {path: @path, parameter: @parameter}
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,19 @@
1
+ module Syntax
2
+ class Sections < Treetop::Runtime::SyntaxNode
3
+ attr_reader :node, :catch
4
+
5
+ def parse
6
+ elements.each do |element|
7
+ if element.is_a? Node
8
+ @node = element.parse
9
+ end
10
+
11
+ if element.is_a? CatchSection
12
+ @catch = element.parse
13
+ end
14
+ end
15
+
16
+ self
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ module Syntax
2
+ class TreeSection < Treetop::Runtime::SyntaxNode
3
+ attr_reader :node
4
+
5
+ def parse
6
+ @node = elements[2].parse
7
+
8
+ self
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Syntax
2
+ class View < Treetop::Runtime::SyntaxNode
3
+ def parse
4
+ text_value.sub('<*', '')
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,28 @@
1
+ require 'dandy/errors/syntax_error'
2
+
3
+ module Dandy
4
+ module Routing
5
+ class SyntaxErrorInterpreter
6
+ def initialize(syntax_parser)
7
+ @syntax_parser = syntax_parser
8
+ end
9
+
10
+ def interpret
11
+ line_num = 1
12
+ (0..@syntax_parser.max_terminal_failure_index - 1).each {|i|
13
+ line_num += 1 if @syntax_parser.input[i] == ';'
14
+ }
15
+
16
+ message = "Syntax error in routes definition, line #{line_num}. Expected: "
17
+ expected = []
18
+ @syntax_parser.terminal_failures.each do |f|
19
+ item = f.expected_string
20
+ .gsub('^', '<space>/<tab>')
21
+ .gsub(';', '<new line>')
22
+ expected << item
23
+ end
24
+ message + expected.join(', ') + '.'
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,99 @@
1
+ grammar Syntax
2
+ rule sections
3
+ ':receive' eol node catch <Sections>
4
+ end
5
+
6
+ rule before
7
+ (indent ':before' commands eol+) 0..1 <BeforeSection>
8
+ end
9
+
10
+ rule after
11
+ (indent ':after' commands eol+) 0..1 <AfterSection>
12
+ end
13
+
14
+ rule catch
15
+ (':catch' command eol*) 0..1 <CatchSection>
16
+ end
17
+
18
+ rule node
19
+ indent route before after actions nodes <Node>
20
+ end
21
+
22
+ rule action
23
+ indent http_verb commands respond eol <Action>
24
+ end
25
+
26
+ rule route
27
+ (path / parameter) arrow eol <Route>
28
+ end
29
+
30
+ rule path
31
+ ('.' / ('/' [a-z0-9_\-]+)) 1..1 <Path>
32
+ end
33
+
34
+ rule http_verb
35
+ ('GET' / 'POST' / 'PUT' / 'PATCH' / 'DELETE') 1..1 <HttpVerb>
36
+ end
37
+
38
+ rule parameter
39
+ ('$' [a-z0-9_]+) 1..1 <Parameter>
40
+ end
41
+
42
+ rule command
43
+ (arrow result_name [a-z0-9_]+) 1..1 <Command>
44
+ end
45
+
46
+ rule result_name
47
+ ([a-z0-9_]+ '@') 0..1 <ResultName>
48
+ end
49
+
50
+ rule commands
51
+ command* <Commands>
52
+ end
53
+
54
+ rule actions
55
+ action* <Actions>
56
+ end
57
+
58
+ rule nodes
59
+ node* <Nodes>
60
+ end
61
+
62
+ rule view
63
+ (back_arrow [a-z] [a-z0-9_]* ('/' [a-z0-9_]*)*) 0..1 <View>
64
+ end
65
+
66
+ rule respond
67
+ (arrow (':respond' view http_status)) 0..1 <Respond>
68
+ end
69
+
70
+ rule http_status
71
+ ('=' (
72
+ '100' / '101' / '102' /
73
+ '200' / '201' / '202' / '203' / '204' / '205' / '206' / '207' / '208' / '226' /
74
+ '300' / '301' / '302' / '303' / '304' / '305' / '306' / '307' / '308' /
75
+ '400' / '401' / '402' / '403' / '404' / '405' / '406' / '407' / '408' /
76
+ '409' / '410' / '411' / '412' / '413' / '414' / '415' / '416' / '417' / '418' /
77
+ '421' / '422' / '423' / '424' / '426' / '428' / '429' / '431' / '444' / '449' / '451' /
78
+ '500' / '501' / '502' / '503' / '504' / '505' / '506' / '507' / '508' /
79
+ '509' / '510' / '511' / '520' / '521' / '522' / '523' / '524' / '525' / '526'
80
+ ) 1..1) 0..1
81
+ <HttpStatus>
82
+ end
83
+
84
+ rule arrow
85
+ ('*>' / '=>' / '=*') 1..1 <Arrow>
86
+ end
87
+
88
+ rule back_arrow
89
+ '<*' <BackArrow>
90
+ end
91
+
92
+ rule eol
93
+ ';'+ <Eol>
94
+ end
95
+
96
+ rule indent
97
+ '^'+ <Indent>
98
+ end
99
+ end
@@ -0,0 +1,29 @@
1
+ require 'dandy/errors/dandy_error'
2
+
3
+ module Dandy
4
+ class TemplateRegistry
5
+ def initialize(template_loader, dandy_config, dandy_env)
6
+ @template_loader = template_loader
7
+ @templates = template_loader.load_templates
8
+ @config = dandy_config
9
+ @dandy_env = dandy_env
10
+ end
11
+
12
+ def get(name, type)
13
+ if @dandy_env == 'development'
14
+ # every time reload templates in development mode
15
+ @templates = @template_loader.load_templates
16
+ end
17
+
18
+ directory = @config[:path][:views]
19
+ .sub(/^\//, '').sub(/(\/)+$/,'') # remove slash from start and end of the path
20
+
21
+ regex = /#{Regexp.escape(directory)}\/.*#{Regexp.escape(name)}\.#{Regexp.escape(type)}/
22
+ match = @templates.keys.find{|k| k.match(regex)}
23
+
24
+ raise Dandy::DandyError, "View \"#{name}\" of type \"#{type}\" not found" if match.nil?
25
+
26
+ @templates[match]
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,3 @@
1
+ module Dandy
2
+ VERSION = '0.6.0'.freeze
3
+ end
@@ -0,0 +1,18 @@
1
+ module Dandy
2
+ class ViewBuilder
3
+ def initialize(template, container)
4
+ @template = template
5
+ @container = container
6
+ @variables = template.scan(/@[a-z_][a-zA-Z_0-9]*/).uniq
7
+ end
8
+
9
+ def process
10
+ @variables.each do |variable|
11
+ value = @container.resolve(variable.sub('@', '').to_sym)
12
+ instance_variable_set variable, value
13
+ end
14
+
15
+ build
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ require 'dandy/view_builder'
2
+
3
+ module Dandy
4
+ class ViewBuilderRegistry
5
+ def initialize
6
+ @view_builders = {}
7
+ end
8
+
9
+ def add(view_builder, format)
10
+ unless view_builder < Dandy::ViewBuilder
11
+ raise Dandy::DandyError, 'view_builder parameter should be a Dandy::ViewBuilder'
12
+ end
13
+
14
+ @view_builders[format] = view_builder
15
+ end
16
+
17
+ def get(format)
18
+ @view_builders[format]
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ require 'jbuilder'
2
+ require 'dandy/view_builder'
3
+
4
+ module Dandy
5
+ module ViewBuilders
6
+ class Json < Dandy::ViewBuilder
7
+ def build
8
+ result = Jbuilder.new do |json|
9
+ eval(@template)
10
+ end
11
+
12
+ result.target!
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ require 'dandy/template_registry'
2
+ require 'dandy/view_builders/json'
3
+ require 'dandy/view_builder_registry'
4
+
5
+ module Dandy
6
+ class ViewFactory
7
+ def initialize(container, template_registry, view_builder_registry)
8
+ @container = container
9
+ @template_registry = template_registry
10
+ @view_builder_registry = view_builder_registry
11
+ end
12
+
13
+ def create(name, content_type)
14
+ type = content_type.split('/')[1]
15
+ template = @template_registry.get(name, type)
16
+ builder = @view_builder_registry.get(type)
17
+ view = builder.new(template, @container)
18
+ view.process
19
+ end
20
+ end
21
+ end
metadata ADDED
@@ -0,0 +1,288 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dandy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.0
5
+ platform: ruby
6
+ authors:
7
+ - Vladimir Kalinkin
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-04-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: hypo
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.8.5
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.8.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: rack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.0.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: thor
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.20.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.20.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: treetop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.6.8
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.6.8
69
+ - !ruby/object:Gem::Dependency
70
+ name: jbuilder
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.7.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.7.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack-parser
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.7.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.7.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: terminal-table
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.8.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.8.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: bundler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.15'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.15'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '10.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '10.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec-mocks
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.6'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.6'
167
+ - !ruby/object:Gem::Dependency
168
+ name: simplecov
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '0.15'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0.15'
181
+ description: The philosophy of Dandy is to provide minimalistic middleware between
182
+ your model and API client.
183
+ email:
184
+ - vova.kalinkin@gmail.com
185
+ executables:
186
+ - dandy
187
+ extensions: []
188
+ extra_rdoc_files: []
189
+ files:
190
+ - ".gitignore"
191
+ - ".rspec"
192
+ - ".travis.yml"
193
+ - Gemfile
194
+ - LICENSE.txt
195
+ - README.md
196
+ - Rakefile
197
+ - bin/console
198
+ - bin/setup
199
+ - dandy.gemspec
200
+ - exe/dandy
201
+ - lib/dandy.rb
202
+ - lib/dandy/app.rb
203
+ - lib/dandy/base/handle_errors.rb
204
+ - lib/dandy/chain.rb
205
+ - lib/dandy/chain_factory.rb
206
+ - lib/dandy/config.rb
207
+ - lib/dandy/errors/dandy_error.rb
208
+ - lib/dandy/errors/syntax_error.rb
209
+ - lib/dandy/errors/view_engine_error.rb
210
+ - lib/dandy/extensions/hash.rb
211
+ - lib/dandy/generators/cli.rb
212
+ - lib/dandy/generators/templates/Gemfile
213
+ - lib/dandy/generators/templates/actions/common/handle_errors.rb
214
+ - lib/dandy/generators/templates/actions/welcome.tt
215
+ - lib/dandy/generators/templates/app/app.rb
216
+ - lib/dandy/generators/templates/app/app.routes
217
+ - lib/dandy/generators/templates/config.ru
218
+ - lib/dandy/generators/templates/silicon.yml
219
+ - lib/dandy/generators/templates/views/show_welcome.json.jbuilder
220
+ - lib/dandy/loaders/dependency_loader.rb
221
+ - lib/dandy/loaders/template_loader.rb
222
+ - lib/dandy/loaders/type_loader.rb
223
+ - lib/dandy/request.rb
224
+ - lib/dandy/routing/builder.rb
225
+ - lib/dandy/routing/file_reader.rb
226
+ - lib/dandy/routing/match.rb
227
+ - lib/dandy/routing/matcher.rb
228
+ - lib/dandy/routing/parser.rb
229
+ - lib/dandy/routing/route.rb
230
+ - lib/dandy/routing/routing.rb
231
+ - lib/dandy/routing/syntax.rb
232
+ - lib/dandy/routing/syntax/action.rb
233
+ - lib/dandy/routing/syntax/actions.rb
234
+ - lib/dandy/routing/syntax/after_section.rb
235
+ - lib/dandy/routing/syntax/before_section.rb
236
+ - lib/dandy/routing/syntax/catch_section.rb
237
+ - lib/dandy/routing/syntax/command.rb
238
+ - lib/dandy/routing/syntax/commands.rb
239
+ - lib/dandy/routing/syntax/node.rb
240
+ - lib/dandy/routing/syntax/nodes.rb
241
+ - lib/dandy/routing/syntax/primitives/arrow.rb
242
+ - lib/dandy/routing/syntax/primitives/back_arrow.rb
243
+ - lib/dandy/routing/syntax/primitives/eol.rb
244
+ - lib/dandy/routing/syntax/primitives/http_status.rb
245
+ - lib/dandy/routing/syntax/primitives/http_verb.rb
246
+ - lib/dandy/routing/syntax/primitives/indent.rb
247
+ - lib/dandy/routing/syntax/primitives/parameter.rb
248
+ - lib/dandy/routing/syntax/primitives/path.rb
249
+ - lib/dandy/routing/syntax/primitives/result_name.rb
250
+ - lib/dandy/routing/syntax/respond.rb
251
+ - lib/dandy/routing/syntax/route.rb
252
+ - lib/dandy/routing/syntax/sections.rb
253
+ - lib/dandy/routing/syntax/tree_section.rb
254
+ - lib/dandy/routing/syntax/view.rb
255
+ - lib/dandy/routing/syntax_error_interpreter.rb
256
+ - lib/dandy/routing/syntax_grammar.tt
257
+ - lib/dandy/template_registry.rb
258
+ - lib/dandy/version.rb
259
+ - lib/dandy/view_builder.rb
260
+ - lib/dandy/view_builder_registry.rb
261
+ - lib/dandy/view_builders/json.rb
262
+ - lib/dandy/view_factory.rb
263
+ homepage: https://github.com/cylon-v/dandy
264
+ licenses:
265
+ - MIT
266
+ metadata:
267
+ allowed_push_host: https://rubygems.org
268
+ post_install_message:
269
+ rdoc_options: []
270
+ require_paths:
271
+ - lib
272
+ required_ruby_version: !ruby/object:Gem::Requirement
273
+ requirements:
274
+ - - ">="
275
+ - !ruby/object:Gem::Version
276
+ version: '0'
277
+ required_rubygems_version: !ruby/object:Gem::Requirement
278
+ requirements:
279
+ - - ">="
280
+ - !ruby/object:Gem::Version
281
+ version: '0'
282
+ requirements: []
283
+ rubyforge_project:
284
+ rubygems_version: 2.6.12
285
+ signing_key:
286
+ specification_version: 4
287
+ summary: Dandy is a minimalistic web API framework.
288
+ test_files: []