hanami-controller 1.3.3 → 2.0.0.alpha1
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 +4 -4
- data/CHANGELOG.md +46 -7
- data/README.md +295 -537
- data/hanami-controller.gemspec +3 -3
- data/lib/hanami/action.rb +653 -38
- data/lib/hanami/action/base_params.rb +2 -2
- data/lib/hanami/action/cache.rb +1 -139
- data/lib/hanami/action/cache/cache_control.rb +4 -4
- data/lib/hanami/action/cache/conditional_get.rb +4 -5
- data/lib/hanami/action/cache/directives.rb +1 -1
- data/lib/hanami/action/cache/expires.rb +3 -3
- data/lib/hanami/action/cookie_jar.rb +3 -3
- data/lib/hanami/action/cookies.rb +3 -62
- data/lib/hanami/action/flash.rb +2 -2
- data/lib/hanami/action/glue.rb +5 -31
- data/lib/hanami/action/halt.rb +12 -0
- data/lib/hanami/action/mime.rb +77 -491
- data/lib/hanami/action/params.rb +3 -3
- data/lib/hanami/action/rack/file.rb +1 -1
- data/lib/hanami/action/request.rb +30 -20
- data/lib/hanami/action/response.rb +174 -0
- data/lib/hanami/action/session.rb +8 -117
- data/lib/hanami/action/validatable.rb +2 -2
- data/lib/hanami/controller.rb +0 -210
- data/lib/hanami/controller/configuration.rb +51 -506
- data/lib/hanami/controller/version.rb +1 -1
- metadata +12 -21
- data/lib/hanami/action/callable.rb +0 -92
- data/lib/hanami/action/callbacks.rb +0 -214
- data/lib/hanami/action/configurable.rb +0 -50
- data/lib/hanami/action/exposable.rb +0 -126
- data/lib/hanami/action/exposable/guard.rb +0 -104
- data/lib/hanami/action/head.rb +0 -121
- data/lib/hanami/action/rack.rb +0 -411
- data/lib/hanami/action/rack/callable.rb +0 -47
- data/lib/hanami/action/rack/errors.rb +0 -53
- data/lib/hanami/action/redirect.rb +0 -59
- data/lib/hanami/action/throwable.rb +0 -169
@@ -1,47 +0,0 @@
|
|
1
|
-
module Hanami
|
2
|
-
module Action
|
3
|
-
module Rack
|
4
|
-
module Callable
|
5
|
-
# Callable module for actions. With this module, actions with middlewares
|
6
|
-
# will be able to work with rack builder.
|
7
|
-
#
|
8
|
-
# @param env [Hash] the full Rack env or the params. This value may vary,
|
9
|
-
# see the examples below.
|
10
|
-
#
|
11
|
-
# @since 0.4.0
|
12
|
-
# @api private
|
13
|
-
#
|
14
|
-
# @see Hanami::Action::Rack::ClassMethods#rack_builder
|
15
|
-
# @see Hanami::Action::Rack::ClassMethods#use
|
16
|
-
#
|
17
|
-
# @example
|
18
|
-
# require 'hanami/controller'
|
19
|
-
#
|
20
|
-
# class MyMiddleware
|
21
|
-
# def initialize(app)
|
22
|
-
# @app = app
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
# def call(env)
|
26
|
-
# #...
|
27
|
-
# end
|
28
|
-
# end
|
29
|
-
#
|
30
|
-
# class Show
|
31
|
-
# include Hanami::Action
|
32
|
-
# use MyMiddleware
|
33
|
-
#
|
34
|
-
# def call(params)
|
35
|
-
# # ...
|
36
|
-
# puts params # => { id: 23 } extracted from Rack env
|
37
|
-
# end
|
38
|
-
# end
|
39
|
-
#
|
40
|
-
# Show.respond_to?(:call) # => true
|
41
|
-
def call(env)
|
42
|
-
rack_builder.call(env)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Hanami
|
4
|
-
module Action
|
5
|
-
module Rack
|
6
|
-
# This module provides method to set exceptions to Rack env:
|
7
|
-
#
|
8
|
-
# * `rack.errors` - IO for errors, as requested by Rack SPEC
|
9
|
-
# * `rack.exception` - De-facto standard for Ruby exception tracking SaaS
|
10
|
-
#
|
11
|
-
# @see http://www.rubydoc.info/github/rack/rack/file/SPEC#The_Error_Stream
|
12
|
-
# @see https://github.com/hanami/controller/issues/133
|
13
|
-
#
|
14
|
-
# @since 1.3.3
|
15
|
-
# @api private
|
16
|
-
module Errors
|
17
|
-
# @since 1.3.3
|
18
|
-
# @api private
|
19
|
-
RACK_ERRORS = "rack.errors"
|
20
|
-
|
21
|
-
# @since 1.3.3
|
22
|
-
# @api private
|
23
|
-
RACK_EXCEPTION = "rack.exception"
|
24
|
-
|
25
|
-
# Set exception in Rack env
|
26
|
-
#
|
27
|
-
# @param env [Hash] the Rack environment
|
28
|
-
# @param exception [Exception] the exception to set
|
29
|
-
#
|
30
|
-
# @since 1.3.3
|
31
|
-
# @api private
|
32
|
-
def self.set(env, exception)
|
33
|
-
env[RACK_EXCEPTION] = exception
|
34
|
-
|
35
|
-
return unless errors = env[RACK_ERRORS] # rubocop:disable Lint/AssignmentInCondition
|
36
|
-
|
37
|
-
errors.write(_dump_exception(exception))
|
38
|
-
errors.flush
|
39
|
-
end
|
40
|
-
|
41
|
-
# Format exception info with name and backtrace
|
42
|
-
#
|
43
|
-
# @param exception [Exception]
|
44
|
-
#
|
45
|
-
# @since 1.3.3
|
46
|
-
# @api private
|
47
|
-
def self._dump_exception(exception)
|
48
|
-
[[exception.class, exception.message].compact.join(": "), *exception.backtrace].join("\n\t")
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
module Hanami
|
2
|
-
module Action
|
3
|
-
# HTTP redirect API
|
4
|
-
#
|
5
|
-
# @since 0.1.0
|
6
|
-
module Redirect
|
7
|
-
# The HTTP header for redirects
|
8
|
-
#
|
9
|
-
# @since 0.2.0
|
10
|
-
# @api private
|
11
|
-
LOCATION = 'Location'.freeze
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
# Redirect to the given URL and halt the request
|
16
|
-
#
|
17
|
-
# @param url [String] the destination URL
|
18
|
-
# @param status [Fixnum] the http code
|
19
|
-
#
|
20
|
-
# @since 0.1.0
|
21
|
-
#
|
22
|
-
# @see Hanami::Action::Throwable#halt
|
23
|
-
#
|
24
|
-
# @example With default status code (302)
|
25
|
-
# require 'hanami/controller'
|
26
|
-
#
|
27
|
-
# class Create
|
28
|
-
# include Hanami::Action
|
29
|
-
#
|
30
|
-
# def call(params)
|
31
|
-
# # ...
|
32
|
-
# redirect_to 'http://example.com/articles/23'
|
33
|
-
# end
|
34
|
-
# end
|
35
|
-
#
|
36
|
-
# action = Create.new
|
37
|
-
# action.call({}) # => [302, {'Location' => '/articles/23'}, '']
|
38
|
-
#
|
39
|
-
# @example With custom status code
|
40
|
-
# require 'hanami/controller'
|
41
|
-
#
|
42
|
-
# class Create
|
43
|
-
# include Hanami::Action
|
44
|
-
#
|
45
|
-
# def call(params)
|
46
|
-
# # ...
|
47
|
-
# redirect_to 'http://example.com/articles/23', status: 301
|
48
|
-
# end
|
49
|
-
# end
|
50
|
-
#
|
51
|
-
# action = Create.new
|
52
|
-
# action.call({}) # => [301, {'Location' => '/articles/23'}, '']
|
53
|
-
def redirect_to(url, status: 302)
|
54
|
-
headers[LOCATION] = ::String.new(url)
|
55
|
-
halt(status)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,169 +0,0 @@
|
|
1
|
-
require 'hanami/utils/class_attribute'
|
2
|
-
require 'hanami/http/status'
|
3
|
-
require 'hanami/action/rack/errors'
|
4
|
-
|
5
|
-
module Hanami
|
6
|
-
module Action
|
7
|
-
# Throw API
|
8
|
-
#
|
9
|
-
# @since 0.1.0
|
10
|
-
#
|
11
|
-
# @see Hanami::Action::Throwable::ClassMethods#handle_exception
|
12
|
-
# @see Hanami::Action::Throwable#halt
|
13
|
-
# @see Hanami::Action::Throwable#status
|
14
|
-
module Throwable
|
15
|
-
# @since 0.1.0
|
16
|
-
# @api private
|
17
|
-
def self.included(base)
|
18
|
-
base.extend ClassMethods
|
19
|
-
end
|
20
|
-
|
21
|
-
# Throw API class methods
|
22
|
-
#
|
23
|
-
# @since 0.1.0
|
24
|
-
# @api private
|
25
|
-
module ClassMethods
|
26
|
-
private
|
27
|
-
|
28
|
-
# Handle the given exception with an HTTP status code.
|
29
|
-
#
|
30
|
-
# When the exception is raise during #call execution, it will be
|
31
|
-
# translated into the associated HTTP status.
|
32
|
-
#
|
33
|
-
# This is a fine grained control, for a global configuration see
|
34
|
-
# Hanami::Action.handled_exceptions
|
35
|
-
#
|
36
|
-
# @param exception [Hash] the exception class must be the key and the
|
37
|
-
# HTTP status the value of the hash
|
38
|
-
#
|
39
|
-
# @since 0.1.0
|
40
|
-
#
|
41
|
-
# @see Hanami::Action.handled_exceptions
|
42
|
-
#
|
43
|
-
# @example
|
44
|
-
# require 'hanami/controller'
|
45
|
-
#
|
46
|
-
# class Show
|
47
|
-
# include Hanami::Action
|
48
|
-
# handle_exception RecordNotFound => 404
|
49
|
-
#
|
50
|
-
# def call(params)
|
51
|
-
# # ...
|
52
|
-
# raise RecordNotFound.new
|
53
|
-
# end
|
54
|
-
# end
|
55
|
-
#
|
56
|
-
# Show.new.call({id: 1}) # => [404, {}, ['Not Found']]
|
57
|
-
def handle_exception(exception)
|
58
|
-
configuration.handle_exception(exception)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
protected
|
63
|
-
|
64
|
-
# Halt the action execution with the given HTTP status code and message.
|
65
|
-
#
|
66
|
-
# When used, the execution of a callback or of an action is interrupted
|
67
|
-
# and the control returns to the framework, that decides how to handle
|
68
|
-
# the event.
|
69
|
-
#
|
70
|
-
# If a message is provided, it sets the response body with the message.
|
71
|
-
# Otherwise, it sets the response body with the default message associated
|
72
|
-
# to the code (eg 404 will set `"Not Found"`).
|
73
|
-
#
|
74
|
-
# @param code [Fixnum] a valid HTTP status code
|
75
|
-
# @param message [String] the response body
|
76
|
-
#
|
77
|
-
# @since 0.2.0
|
78
|
-
#
|
79
|
-
# @see Hanami::Controller#handled_exceptions
|
80
|
-
# @see Hanami::Action::Throwable#handle_exception
|
81
|
-
# @see Hanami::Http::Status:ALL
|
82
|
-
#
|
83
|
-
# @example Basic usage
|
84
|
-
# require 'hanami/controller'
|
85
|
-
#
|
86
|
-
# class Show
|
87
|
-
# def call(params)
|
88
|
-
# halt 404
|
89
|
-
# end
|
90
|
-
# end
|
91
|
-
#
|
92
|
-
# # => [404, {}, ["Not Found"]]
|
93
|
-
#
|
94
|
-
# @example Custom message
|
95
|
-
# require 'hanami/controller'
|
96
|
-
#
|
97
|
-
# class Show
|
98
|
-
# def call(params)
|
99
|
-
# halt 404, "This is not the droid you're looking for."
|
100
|
-
# end
|
101
|
-
# end
|
102
|
-
#
|
103
|
-
# # => [404, {}, ["This is not the droid you're looking for."]]
|
104
|
-
def halt(code, message = nil)
|
105
|
-
message ||= Http::Status.message_for(code)
|
106
|
-
status(code, message)
|
107
|
-
|
108
|
-
throw :halt
|
109
|
-
end
|
110
|
-
|
111
|
-
# Sets the given code and message for the response
|
112
|
-
#
|
113
|
-
# @param code [Fixnum] a valid HTTP status code
|
114
|
-
# @param message [String] the response body
|
115
|
-
#
|
116
|
-
# @since 0.1.0
|
117
|
-
# @see Hanami::Http::Status:ALL
|
118
|
-
def status(code, message)
|
119
|
-
self.status = code
|
120
|
-
self.body = message
|
121
|
-
end
|
122
|
-
|
123
|
-
private
|
124
|
-
# @since 0.1.0
|
125
|
-
# @api private
|
126
|
-
def _rescue
|
127
|
-
catch :halt do
|
128
|
-
begin
|
129
|
-
yield
|
130
|
-
rescue => exception
|
131
|
-
_reference_in_rack_errors(exception)
|
132
|
-
_handle_exception(exception)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
# @since 0.2.0
|
138
|
-
# @api private
|
139
|
-
def _reference_in_rack_errors(exception)
|
140
|
-
return if configuration.handled_exception?(exception)
|
141
|
-
|
142
|
-
Hanami::Action::Rack::Errors.set(@_env, exception)
|
143
|
-
end
|
144
|
-
|
145
|
-
# @since 0.1.0
|
146
|
-
# @api private
|
147
|
-
def _handle_exception(exception)
|
148
|
-
raise unless configuration.handle_exceptions
|
149
|
-
|
150
|
-
instance_exec(
|
151
|
-
exception,
|
152
|
-
&_exception_handler(exception)
|
153
|
-
)
|
154
|
-
end
|
155
|
-
|
156
|
-
# @since 0.3.0
|
157
|
-
# @api private
|
158
|
-
def _exception_handler(exception)
|
159
|
-
handler = configuration.exception_handler(exception)
|
160
|
-
|
161
|
-
if respond_to?(handler.to_s, true)
|
162
|
-
method(handler)
|
163
|
-
else
|
164
|
-
->(ex) { halt handler }
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|