dandy 0.12.0 → 1.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 47781859a32ae38be5a82a4548ee099ce2c745ea
4
- data.tar.gz: b8488633a66da4c980fb3532df442713ae35747c
2
+ SHA256:
3
+ metadata.gz: 10c1d06be946e67fdc9c9e2dd27e37015aa5c315006f153364f6a729eecadc8c
4
+ data.tar.gz: eb3055e8a23b44e78661f7ae89896bb96748fb71bb2dbd9122f5f9f6a4271a94
5
5
  SHA512:
6
- metadata.gz: b9ca968a3acd135a2656309c9ca2dd28d4c426b82a7d1b683c502201eeddd2f66772e74e75dfbbb8c1fdd03f50e81323842034e85b59d303da4441bc1a189eb5
7
- data.tar.gz: 7e802942e16d29e0de61a6c501bc62be98d5b1588028f2f1692894d2c633d6822de706d9a693c9d54dce750b317ca9b6aae5b5725f2161db87b8f26b00f0377f
6
+ metadata.gz: 40389e9152244e5949e539d18caa4fd35604286721d327543bc2e20765d078e4888f2da0225bd052f54ec0e817e4cef7b50b5cf1092afdd09e5aed9364da66e3
7
+ data.tar.gz: d6966b353e974d10a755677b84a1a5943a59cf2335eeec2a396203df118a03161fec03bd7f72b63a83467595d92ab019aac30c1d82412a9b5017e553bd8e43ae
@@ -1,5 +1,5 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.4.1
5
- before_install: gem install bundler -v 1.15.4
4
+ - 2.6
5
+ before_install: gem install bundler
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Dandy is a minimalistic web API framework. Its main idea is to implement an approach
4
4
  from Clean Architecture principles - "web is just a delivery mechanism".
5
- Dandy is build on top of IoC container Hypo and forces to use dependency injection
5
+ Dandy is build on top of IoC container [Hypo](https://github.com/cylon-v/hypo) and forces to use dependency injection
6
6
  approach everywhere.
7
7
 
8
8
  ## Basic Concepts
@@ -109,13 +109,14 @@ or just
109
109
  $ rackup -p 8000 config.ru
110
110
  ```
111
111
 
112
- 4. Using a browser, go to http://localhost:8000 and you'll see:
112
+ 4. Run curl command `curl http://localhost:8000 -H "Accept: application/json"` and you'll see:
113
113
 
114
114
  ```json
115
115
  {"message": "Welcome to dandy-app!"}
116
116
  ```
117
+ Please take attention - HTTP header "Accept: application/json" is a mandatory.
117
118
 
118
- 5. Investigate example application code, it will explain most of Dandy aspects.
119
+ 5. Investigate example application code, it explains most of Dandy aspects.
119
120
  6. For more details visit our [Wiki](https://github.com/cylon-v/dandy/wiki).
120
121
 
121
122
  ## Development
@@ -30,8 +30,8 @@ Gem::Specification.new do |spec|
30
30
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
31
  spec.require_paths = ['lib']
32
32
 
33
- spec.add_dependency 'hypo', '~> 0.9.0'
34
- spec.add_dependency 'rack', '~> 2.0.3'
33
+ spec.add_dependency 'hypo', '~> 1.0.0'
34
+ spec.add_dependency 'rack', '~> 2.2.3'
35
35
  spec.add_dependency 'thor', '~> 0.20.0'
36
36
  spec.add_dependency 'treetop', '~> 1.6.8'
37
37
  spec.add_dependency 'jbuilder', '~> 2.7.0'
@@ -40,8 +40,8 @@ Gem::Specification.new do |spec|
40
40
  spec.add_dependency 'awrence', '~> 1.0.0'
41
41
  spec.add_dependency 'plissken', '~> 1.2.0'
42
42
 
43
- spec.add_development_dependency 'bundler', '~> 1.15'
44
- spec.add_development_dependency 'rake', '~> 10.0'
43
+ spec.add_development_dependency 'bundler', '~> 2.1'
44
+ spec.add_development_dependency 'rake', '~> 13.0'
45
45
  spec.add_development_dependency 'rspec', '~> 3.0'
46
46
  spec.add_development_dependency 'rspec-mocks', '~> 3.6'
47
47
  spec.add_development_dependency 'simplecov', '~> 0.15'
@@ -9,9 +9,9 @@ require 'dandy/request'
9
9
  require 'dandy/template_registry'
10
10
  require 'dandy/view_builder_registry'
11
11
  require 'dandy/view_factory'
12
- require 'dandy/chain_factory'
13
12
  require 'dandy/view_builders/json'
14
13
  require 'dandy/routing/routing'
14
+ require 'dandy/safe_executor'
15
15
 
16
16
  module Dandy
17
17
  class App
@@ -27,7 +27,7 @@ module Dandy
27
27
  end
28
28
 
29
29
  def call(env)
30
- request = Request.new(@route_matcher, @container, @chain_factory, @view_factory)
30
+ request = Request.new(@route_matcher, @container, @safe_executor)
31
31
  request.handle(env)
32
32
  end
33
33
 
@@ -46,7 +46,8 @@ module Dandy
46
46
  def register_dependencies
47
47
  instances = {
48
48
  config_file_path: 'dandy.yml',
49
- dandy_env: ENV['DANDY_ENV'] || 'development'
49
+ dandy_env: ENV['DANDY_ENV'] || 'development',
50
+ env: ENV
50
51
  }
51
52
 
52
53
  instances.keys.each do |name|
@@ -61,12 +62,12 @@ module Dandy
61
62
  template_registry: TemplateRegistry,
62
63
  view_builder_registry: ViewBuilderRegistry,
63
64
  view_factory: ViewFactory,
64
- chain_factory: ChainFactory,
65
65
  file_reader: Routing::FileReader,
66
66
  syntax_parser: SyntaxParser,
67
67
  syntax_error_interpreter: Routing::SyntaxErrorInterpreter,
68
68
  routes_builder: Routing::Builder,
69
- route_parser: Routing::Parser
69
+ route_parser: Routing::Parser,
70
+ safe_executor: SafeExecutor
70
71
  }
71
72
 
72
73
  singletons.keys.each do |name|
@@ -76,11 +77,12 @@ module Dandy
76
77
  end
77
78
 
78
79
  def load_basic_dependencies
79
- @chain_factory = @container.resolve(:chain_factory)
80
+ @dandy_config = @container.resolve(:dandy_config)
80
81
  @view_factory = @container.resolve(:view_factory)
81
82
  @dependency_loader = @container.resolve(:dependency_loader)
82
83
  @view_builder_registry = @container.resolve(:view_builder_registry)
83
84
  @route_parser = @container.resolve(:route_parser)
85
+ @safe_executor = @container.resolve(:safe_executor)
84
86
 
85
87
  @dependency_loader.load_components
86
88
  end
@@ -2,46 +2,23 @@ require 'timeout'
2
2
 
3
3
  module Dandy
4
4
  class Chain
5
- def initialize(container, dandy_config, commands, last_command, catch_command = nil)
6
- @commands = commands
7
- @last_command = last_command
5
+ def initialize(container, dandy_config)
8
6
  @container = container
9
- @catch_command = catch_command
10
7
  @async_timeout = dandy_config[:action][:async_timeout]
11
8
  end
12
9
 
13
- def execute
14
- if @catch_command.nil?
15
- run_commands
16
- else
17
- begin
18
- run_commands
19
- rescue Exception => error
20
- @container
21
- .register_instance(error, :dandy_error)
22
- .using_lifetime(:scope)
23
- .bound_to(:dandy_request)
24
-
25
- action = @container.resolve(@catch_command.name.to_sym)
26
- action.call
27
- end
28
- end
29
- end
30
-
31
- private
32
-
33
- def run_commands
10
+ def run_commands(commands, last_command)
34
11
  threads = []
35
12
  Thread.abort_on_exception = true
36
13
 
37
14
  result = nil
38
- @commands.each_with_index do |command, index|
15
+ commands.each_with_index do |command, index|
39
16
  if command.sequential?
40
17
  # all previous parallel commands should be done before the current sequential
41
18
  threads.each {|t| t.join}
42
19
  threads = []
43
20
 
44
- if @last_command && (command.name == @last_command.name)
21
+ if last_command && (command.name == last_command.name)
45
22
  result = run_command(command)
46
23
  else
47
24
  run_command(command)
@@ -49,7 +26,7 @@ module Dandy
49
26
  else
50
27
  thread = Thread.new {
51
28
  Timeout::timeout(@async_timeout) {
52
- if @last_command && (command.name == @last_command.name)
29
+ if last_command && (command.name == last_command.name)
53
30
  result = run_command(command)
54
31
  else
55
32
  run_command(command)
@@ -60,7 +37,7 @@ module Dandy
60
37
  end
61
38
 
62
39
  # if it's last item in chain then wait until parallel commands are done
63
- if index == @commands.length - 1
40
+ if index == commands.length - 1
64
41
  threads.each {|t| t.join}
65
42
  end
66
43
  end
@@ -68,6 +45,8 @@ module Dandy
68
45
  result
69
46
  end
70
47
 
48
+ private
49
+
71
50
  def run_command(command)
72
51
  if command.entity?
73
52
  entity = @container.resolve(command.entity_name.to_sym)
@@ -19,16 +19,19 @@ module Dandy
19
19
  copy_file 'templates/Gemfile_jet_set', "#{name}/Gemfile"
20
20
  copy_file 'templates/db/mapping.rb', "#{name}/db/mapping.rb"
21
21
  copy_file 'templates/actions/common/open_db_session.rb', "#{name}/app/actions/common/open_db_session.rb"
22
+ copy_file 'templates/actions/common/close_db_session.rb', "#{name}/app/actions/common/close_db_session.rb"
23
+ copy_file 'templates/actions/common/handle_errors_jet_set.rb', "#{name}/app/actions/common/handle_errors.rb"
24
+ copy_file 'templates/app/app.jet_set.routes', "#{name}/app/app.routes"
22
25
  else
23
26
  copy_file 'templates/app/app.rb', "#{name}/app/app.rb"
24
27
  copy_file 'templates/Gemfile', "#{name}/Gemfile"
28
+ copy_file 'templates/actions/common/handle_errors.rb', "#{name}/app/actions/common/handle_errors.rb"
29
+ copy_file 'templates/app/app.routes', "#{name}/app/app.routes"
25
30
  end
26
31
 
27
- copy_file 'templates/app/app.routes', "#{name}/app/app.routes"
28
32
  copy_file 'templates/dandy.yml', "#{name}/dandy.yml"
29
33
  copy_file 'templates/config.ru', "#{name}/config.ru"
30
34
  copy_file 'templates/views/show_welcome.json.jbuilder', "#{name}/app/views/show_welcome.json.jbuilder"
31
- copy_file 'templates/actions/common/handle_errors.rb', "#{name}/app/actions/common/handle_errors.rb"
32
35
  template 'templates/actions/welcome.tt', "#{name}/app/actions/welcome.rb", {app_name: name}
33
36
 
34
37
  if options[:jet_set]
@@ -0,0 +1,12 @@
1
+ require 'sequel'
2
+ require 'jet_set'
3
+
4
+ class CloseDbSession
5
+ def initialize(sequel)
6
+ @sequel = sequel
7
+ end
8
+
9
+ def call
10
+ @sequel.disconnect
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ class HandleErrors < Dandy::HandleErrors
2
+ def initialize(container, dandy_error, sequel)
3
+ super(container, dandy_error)
4
+
5
+ @sequel = sequel
6
+ end
7
+
8
+ def call
9
+ @sequel.disconnect
10
+
11
+ # implement your own error handling logic here.
12
+ # by default let's print the error to standard output
13
+ puts @dandy_error.message
14
+ puts @dandy_error.backtrace
15
+
16
+ # use preferred HTTP status code for different cases
17
+ # i.e. set_http_status(403) for authorization issue
18
+ set_http_status(500)
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ :receive
2
+ .->
3
+ :before -> common/open_db_session
4
+ :after -> common/close_db_session
5
+
6
+ GET -> message@welcome -> :respond <- show_welcome
7
+ :catch -> common/handle_errors
@@ -9,8 +9,8 @@ module Dandy
9
9
  @directories.each do |directory|
10
10
  dir = File.join(directory, '**/*')
11
11
  files = Dir.glob(dir).reject {|file_path| File.directory?(file_path)}
12
-
13
- files.each do |file|
12
+ test_patterns = %w(_spec.rb .spec.rb _test.rb .test.rb)
13
+ files.select {|f| !f.end_with?(*test_patterns)}.each do |file|
14
14
  path = File.join(Dir.pwd, file)
15
15
  require path
16
16
  file_name = File.basename(file).gsub(File.extname(file), '')
@@ -1,21 +1,19 @@
1
1
  require 'json'
2
+ require 'awrence'
3
+ require 'plissken'
2
4
  require 'rack/multipart'
3
5
  require 'dandy/extensions/hash'
4
- require 'dandy/chain_factory'
5
6
  require 'dandy/view_factory'
6
- require 'awrence'
7
- require 'plissken'
8
-
7
+ require 'dandy/chain'
9
8
 
10
9
  module Dandy
11
10
  class Request
12
11
  include Hypo::Scope
13
12
 
14
- def initialize(route_matcher, container, chain_factory, view_factory)
13
+ def initialize(route_matcher, container, safe_executor)
15
14
  @container = container
16
15
  @route_matcher = route_matcher
17
- @chain_factory = chain_factory
18
- @view_factory = view_factory
16
+ @safe_executor = safe_executor
19
17
  end
20
18
 
21
19
  def handle(rack_env)
@@ -31,42 +29,38 @@ module Dandy
31
29
  .collect {|k, v| [k.split('_').collect(&:capitalize).join('-'), v]}
32
30
  .flatten
33
31
  ]
34
- register_params(headers, :dandy_headers)
32
+
33
+ register_context(headers, :dandy_headers)
35
34
 
36
35
  if match.nil?
37
36
  result = [404, {'Content-Type' => headers['Accept']}, []]
37
+ release
38
38
  else
39
+ status = match.route.http_status || default_http_status(match.route.http_verb)
40
+ register_params(match.params)
41
+ register_status(status)
42
+
39
43
  query = Rack::Utils.parse_nested_query(rack_env['QUERY_STRING']).to_snake_keys.symbolize_keys
40
- register_params(query, :dandy_query)
44
+ register_context(query, :dandy_query)
41
45
 
42
46
  data = rack_env['rack.parser.result'] ? rack_env['rack.parser.result'].to_snake_keys.deep_symbolize_keys! : {}
43
- register_params(data, :dandy_data)
47
+ register_context(data, :dandy_data)
44
48
 
45
49
  multipart = Rack::Multipart.parse_multipart(rack_env) || {}
46
- register_params(multipart.values, :dandy_files)
47
-
48
- chain = @chain_factory.create(match)
49
- chain_result = chain.execute
50
-
51
- if match.route.view
52
- body = @view_factory.create(match.route.view, headers['Accept'], {keys_format: headers['Keys-Format'] || 'snake'})
53
- else
54
- if chain_result.is_a?(String)
55
- body = chain_result
56
- else # generate JSON when nothing other is requested
57
- if headers['Keys-Format'] == 'camel' && chain_result
58
- chain_result = chain_result.to_camelback_keys
59
- end
60
-
61
- body = JSON.generate(chain_result)
62
- end
50
+ register_context(multipart.values, :dandy_files)
51
+
52
+ body = @safe_executor.execute(match.route, headers)
53
+
54
+ begin
55
+ release
56
+ rescue Exception => error
57
+ body = @safe_executor.handle_error(match.route, headers, error)
63
58
  end
64
59
 
65
60
  status = @container.resolve(:dandy_status)
66
- result = [status, {'Content-Type' => headers['Accept']}, [body]]
61
+ result = [status, {'Content-Type' => 'application/json'}, [body]]
67
62
  end
68
63
 
69
- release
70
64
 
71
65
  result
72
66
  end
@@ -80,12 +74,32 @@ module Dandy
80
74
  .bound_to(self)
81
75
  end
82
76
 
83
- def register_params(params, name)
77
+ def register_context(params, name)
84
78
  unless params.nil?
85
79
  @container.register_instance(params, name)
86
80
  .using_lifetime(:scope)
87
81
  .bound_to(:dandy_request)
88
82
  end
89
83
  end
84
+
85
+ def register_params(params)
86
+ params.keys.each do |key|
87
+ @container
88
+ .register_instance(params[key], key.to_sym)
89
+ .using_lifetime(:scope)
90
+ .bound_to(:dandy_request)
91
+ end
92
+ end
93
+
94
+ def register_status(status)
95
+ @container
96
+ .register_instance(status, :dandy_status)
97
+ .using_lifetime(:scope)
98
+ .bound_to(:dandy_request)
99
+ end
100
+
101
+ def default_http_status(http_verb)
102
+ http_verb == 'POST' ? 201 : 200
103
+ end
90
104
  end
91
105
  end
@@ -0,0 +1,11 @@
1
+ module Dandy
2
+ class Response
3
+ def self.format(result, headers)
4
+ if headers['Keys-Format'] == 'camel' && result
5
+ result = result.to_camelback_keys
6
+ end
7
+
8
+ JSON.generate(result)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,39 @@
1
+ require 'dandy/response'
2
+
3
+ module Dandy
4
+ class SafeExecutor
5
+ def initialize(container, dandy_config, view_factory)
6
+ @container = container
7
+ @dandy_config = dandy_config
8
+ @view_factory = view_factory
9
+ end
10
+
11
+ def execute(route, headers)
12
+ chain = Chain.new(@container, @dandy_config)
13
+
14
+ begin
15
+ result = chain.run_commands(route.commands, route.last_command)
16
+ if route.view
17
+ result = @view_factory.create(route.view, headers['Accept'], {keys_format: headers['Keys-Format'] || 'snake'})
18
+ end
19
+
20
+ body = result.is_a?(String) ? result : Response.format(result, headers)
21
+ rescue Exception => error
22
+ p error
23
+ body = handle_error(route, headers, error)
24
+ end
25
+
26
+ body
27
+ end
28
+
29
+ def handle_error(route, headers, error)
30
+ @container
31
+ .register_instance(error, :dandy_error)
32
+ .using_lifetime(:scope)
33
+ .bound_to(:dandy_request)
34
+
35
+ action = @container.resolve(route.catch.name.to_sym)
36
+ Response.format(action.call, headers)
37
+ end
38
+ end
39
+ end
@@ -1,3 +1,3 @@
1
1
  module Dandy
2
- VERSION = '0.12.0'.freeze
2
+ VERSION = '1.0.3'
3
3
  end
@@ -12,8 +12,14 @@ module Dandy
12
12
 
13
13
  def create(name, content_type, options = {})
14
14
  type = content_type ? content_type.split('/')[1] : 'json'
15
- template = @template_registry.get(name, type)
16
15
  builder = @view_builder_registry.get(type)
16
+
17
+ if builder.nil?
18
+ type = 'json'
19
+ builder = @view_builder_registry.get(type)
20
+ end
21
+
22
+ template = @template_registry.get(name, type)
17
23
  view = builder.new(template, @container, options)
18
24
  view.process
19
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dandy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Kalinkin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-20 00:00:00.000000000 Z
11
+ date: 2020-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hypo
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.9.0
19
+ version: 1.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.9.0
26
+ version: 1.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rack
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.0.3
33
+ version: 2.2.3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 2.0.3
40
+ version: 2.2.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: thor
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -142,28 +142,28 @@ dependencies:
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '1.15'
145
+ version: '2.1'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '1.15'
152
+ version: '2.1'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: rake
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: '10.0'
159
+ version: '13.0'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: '10.0'
166
+ version: '13.0'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: rspec
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -230,7 +230,6 @@ files:
230
230
  - lib/dandy/app.rb
231
231
  - lib/dandy/base/handle_errors.rb
232
232
  - lib/dandy/chain.rb
233
- - lib/dandy/chain_factory.rb
234
233
  - lib/dandy/config.rb
235
234
  - lib/dandy/errors/dandy_error.rb
236
235
  - lib/dandy/errors/syntax_error.rb
@@ -240,9 +239,12 @@ files:
240
239
  - lib/dandy/generators/templates/.gitignore
241
240
  - lib/dandy/generators/templates/Gemfile
242
241
  - lib/dandy/generators/templates/Gemfile_jet_set
242
+ - lib/dandy/generators/templates/actions/common/close_db_session.rb
243
243
  - lib/dandy/generators/templates/actions/common/handle_errors.rb
244
+ - lib/dandy/generators/templates/actions/common/handle_errors_jet_set.rb
244
245
  - lib/dandy/generators/templates/actions/common/open_db_session.rb
245
246
  - lib/dandy/generators/templates/actions/welcome.tt
247
+ - lib/dandy/generators/templates/app/app.jet_set.routes
246
248
  - lib/dandy/generators/templates/app/app.rb
247
249
  - lib/dandy/generators/templates/app/app.routes
248
250
  - lib/dandy/generators/templates/app/app_jet_set.rb
@@ -254,6 +256,7 @@ files:
254
256
  - lib/dandy/loaders/template_loader.rb
255
257
  - lib/dandy/loaders/type_loader.rb
256
258
  - lib/dandy/request.rb
259
+ - lib/dandy/response.rb
257
260
  - lib/dandy/routing/builder.rb
258
261
  - lib/dandy/routing/file_reader.rb
259
262
  - lib/dandy/routing/match.rb
@@ -288,6 +291,7 @@ files:
288
291
  - lib/dandy/routing/syntax/view.rb
289
292
  - lib/dandy/routing/syntax_error_interpreter.rb
290
293
  - lib/dandy/routing/syntax_grammar.tt
294
+ - lib/dandy/safe_executor.rb
291
295
  - lib/dandy/template_registry.rb
292
296
  - lib/dandy/version.rb
293
297
  - lib/dandy/view_builder.rb
@@ -314,8 +318,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
314
318
  - !ruby/object:Gem::Version
315
319
  version: '0'
316
320
  requirements: []
317
- rubyforge_project:
318
- rubygems_version: 2.6.12
321
+ rubygems_version: 3.1.2
319
322
  signing_key:
320
323
  specification_version: 4
321
324
  summary: Dandy is a minimalistic web API framework.
@@ -1,39 +0,0 @@
1
- require 'dandy/chain'
2
-
3
- module Dandy
4
- class ChainFactory
5
- def initialize(container, dandy_config)
6
- @container = container
7
- @dandy_config = dandy_config
8
- end
9
-
10
- def create(match)
11
- status = match.route.http_status || default_http_status(match.route.http_verb)
12
- register_params(match.params)
13
- register_status(status)
14
- Chain.new(@container, @dandy_config, match.route.commands, match.route.last_command, match.route.catch)
15
- end
16
-
17
- private
18
-
19
- def register_params(params)
20
- params.keys.each do |key|
21
- @container
22
- .register_instance(params[key], key.to_sym)
23
- .using_lifetime(:scope)
24
- .bound_to(:dandy_request)
25
- end
26
- end
27
-
28
- def register_status(status)
29
- @container
30
- .register_instance(status, :dandy_status)
31
- .using_lifetime(:scope)
32
- .bound_to(:dandy_request)
33
- end
34
-
35
- def default_http_status(http_verb)
36
- http_verb == 'POST' ? 201 : 200
37
- end
38
- end
39
- end