Complete, fast and testable actions for Rack
- [Luca Guidi] Official support for Ruby: MRI 2.4
- [Marcello Rocha & Luca Guidi] Avoid MIME type conflicts for
Action#format
detection - [Matias H. Leidemer & Luca Guidi] Ensure
Flash
to return only fresh data - [Luca Guidi] Ensure
session
keys to be accessed as symbols in action unit tests
- [Anton Davydov & Luca Guidi] Make it work only with Rack 2.0
- [Thorbjørn Hermansen] Don't pollute Rack env's
rack.exception
key if an exception is handled - [Luca Guidi] Add
flash
to the default exposures
- [Marion Duprey] Allow
BaseParams#get
to read (nested) arrays
- [Russell Cloak] Respect custom formats when referenced by HTTP
Accept
- [Kyle Chong] Don't symbolize raw params
- [Luca Guidi] Let
BaseParams#get
to accept a list of keys (symbols) instead of string with dot notation (params.get(:customer, :address, :city)
instead ofparams.get('customer.address.city')
)
- [Kyle Chong] Introduced
parsed_request_body
for action - [Luca Guidi] Introduced
Hanami::Action::BaseParams#each
- [Ayleen McCann] Use default content type when
HTTP_ACCEPT
is*/*
- [Kyle Chong] Don't stringify uploaded files
- [Kyle Chong] Don't stringify params values when not necessary
- [akhramov & Luca Guidi] Raise
Hanami::Controller::IllegalExposureError
when try to expose reserved words:params
, andflash
.
- [Luca Guidi] Introduced
Hanami::Action::Params#error_messages
which returns a flat collection of full error messages
- [Luca Guidi] Params are deeply symbolized
- [Artem Nistratov] Send only changed cookies in HTTP response
- [Luca Guidi] Drop support for Ruby 2.0 and 2.1. Official support for JRuby 9.0.5.0+.
- [Luca Guidi] Param validations now require you to add
hanami-validations
inGemfile
. - [Luca Guidi] Removed "indifferent access" for params. Since now on, only symbols are allowed.
- [Luca Guidi] Params are immutable
- [Luca Guidi] Params validations syntax has changed
- [Luca Guidi]
Hanami::Action::Params#errors
now returns a Hash. Keys are symbols representing invalid params, while values are arrays of strings with a message of the failure. - [Vasilis Spilka] Made
Hanami::Action::Session#errors
public
- [Anatolii Didukh] Optimise memory usage by freezing MIME types constant
- [Luca Guidi] Renamed the project
- [Alfonso Uceda] Ensure
rack.session
cookie to not be sent twice when bothLotus::Action::Cookies
andRack::Session::Cookie
are used together
- [Luca Guidi] Reference a raised exception in Rack env's
rack.exception
. Compatibility with exception reporting SaaS.
- [Cainã Costa] Ensure Rack environment to be always available for sessions unit tests
- [Luca Guidi] Ensure superclass exceptions to not shadow subclasses during exception handling (eg.
CustomError
handler will take precedence overStandardError
)
- [Luca Guidi] Removed
Lotus::Controller::Configuration#default_format
- [Cainã Costa] Made
Lotus::Action#session
a public method for improved unit testing - [Karim Tarek] Introduced
Lotus::Controller::Error
and let all the framework exceptions to inherit from it.
- [Luca Guidi] Allow to force custom headers for responses that according to RFC shouldn't include them (eg 204). Override
#keep_response_header?(header)
in action
- [Theo Felippe] Added configuration entries:
#default_request_format
anddefault_response_format
. - [Wellington Santos] Error handling to take account of inherited exceptions.
- [Theo Felippe] Deprecated
#default_format
in favor of:#default_request_format
.
- [Luca Guidi] Security protection against Cross Site Request Forgery (CSRF).
- [Matthew Bellantoni] Ensure nested params to be correctly coerced to Hash.
- [Alfonso Uceda Pompa & Luca Guidi] Introduced
Lotus::Action#send_file
- [Alfonso Uceda Pompa] Set automatically
Expires
option for cookies when it's missing butMax-Age
is present. Compatibility with old browsers.
- [Luca Guidi] Ensure
Lotus::Action::Params#to_h
to return::Hash
at the top level
- [Luca Guidi] Ensure proper automatic
Content-Type
working well with Internet Explorer. - [Luca Guidi] Ensure
Lotus::Action#redirect_to
to return::String
for Rack servers compatibility.
- [Alfonso Uceda Pompa] Prevent
Content-Type
andContent-Lenght
to be sent when status code requires no body (eg.204
). This is for compatibility withRack::Lint
, not with RFC 2016. - [Luca Guidi] Ensure
Lotus::Action::Params#to_h
to return::Hash
- [Erol Fornoles]
Action.use
now accepts a block - [Alfonso Uceda Pompa] Introduced
Lotus::Controller::Configuration#cookies
as default cookie options. - [Alfonso Uceda Pompa] Introduced
Lotus::Controller::Configuration#default_headers
as default HTTP headers to return in all the responses. - [Luca Guidi] Introduced
Lotus::Action::Params#get
as a safe API to access nested params.
- [Alfonso Uceda Pompa]
redirect_to
now is a flow control method: it terminates the execution of an action, including the callbacks.
- [Alfonso Uceda Pompa] Callbacks: introduced
append_before
(alias ofbefore
),append_after
(alias ofafter
),prepend_before
andprepend_after
. - [Alfonso Uceda Pompa] Introduced
Lotus::Action::Params#raw
which returns unfiltered data as it comes from an HTTP request. - [Alfonso Uceda Pompa]
Lotus::Action::Rack.use
now fully supports Rack middleware, by mounting an internalRack::Builder
instance. - [Simone Carletti]
Lotus::Action::Throwable#halt
now accepts an optional message. If missing it falls back to the corresponding HTTP status message. - [Steve Hodgkiss] Nested params validation
- [Luca Guidi] Ensure HEAD requests will return empty body
- [Stefano Verna] Ensure HTTP status codes with empty body won't send body and non-entity headers.
- [Luca Guidi] Only dump exceptions in
rack.errors
if handling is turned off, or the raised exception is not managed. - [Luca Guidi] Ensure params will return coerced values
- [Lasse Skindstad Ebert] Introduced
Action#request
which returns an instance aRack::Request
compliant object:Lotus::Action::Request
.
- [Steve Hodgkiss] Ensure params to return coerced values
- [Luca Guidi] Introduced
Action#request_id
as unique identifier for an incoming HTTP request - [Luca Guidi] Introduced
Lotus::Controller.load!
as loading framework entry point - [Kir Shatrov] Allow to define a default charset (
default_charset
configuration) - [Kir Shatrov] Automatic content type with charset (eg
Content-Type: text/html; charset=utf-8
) - [Michał Krzyżanowski] Allow to specify custom exception handlers: procs or methods (
exception_handler
configuration) - [Karl Freeman & Lucas Souza] Introduced HTTP caching (
Cache-Control
,Last-Modified
, ETAG, Conditional GET, expires) - [Satoshi Amemiya] Introduced
Action::Params#to_h
and#to_hash
- [Luca Guidi] Added
#params
and#errors
as default exposures - [Luca Guidi] Introduced complete params validations
- [Luca Guidi & Matthew Bellantoni] Allow to whitelist params
- [Luca Guidi & Matthew Bellantoni] Allow to define custom classes for params via
Action.params
- [Krzysztof Zalewski] Introduced
Action#format
as query method to introspect the requested mime type - [Luca Guidi] Official support for Ruby 2.2
- [Trung Lê] Renamed
Configuration#modules
to#prepare
- [Luca Guidi] Update HTTP status codes to IETF RFC 7231
- [Luca Guidi] When
Lotus::Controller
is included, don't inject code - [Luca Guidi] Removed
Controller.action
as a DSL to define actions - [Krzysztof Zalewski] Removed
Action#content_type
in favor of#format=
which accepts a symbol (eg.:json
) - [Fuad Saud] Reduce method visibility where possible (Ruby
private
andprotected
)
- [Luca Guidi] Don't let exposures definition to override existing methods
- [Luca Guidi] Introduced
Controller.configure
andController.duplicate
- [Luca Guidi] Introduced
Action.use
, that let to use a Rack middleware as a before callback – [Luca Guidi] Allow to define a default mime type when the request isAccept: */*
(default_format
configuration) – [Luca Guidi] Allow to register custom mime types and associate them to a symbol (format
configuration) - [Luca Guidi] Introduced
Configuration#handle_exceptions
to associate exceptions to HTTP statuses - [Damir Zekic] Allow developers to toggle exception handling (
handle_exceptions
configuration) - [Luca Guidi] Introduced
Controller::Configuration
- [Luca Guidi] Official support for Ruby 2.1
- [Luca Guidi]
Lotus::Action::Params
doesn't inherit fromLotus::Utils::Hash
anymore - [Luca Guidi]
Lotus::Action::CookieJar
doesn't inherit fromLotus::Utils::Hash
anymore - [Luca Guidi] Make HTTP status messages compliant with IANA and Rack
- [Damir Zekic] Moved
#throw
override logic into#halt
, which keeps the same semantic
- [Krzysztof Zalewski] Reference exception in
rack.errors
- [Luca Guidi] Introduced
Action.accept
to whitelist accepted mime types - [Luca Guidi] Introduced
Action#accept?
as a query method for the current request - [Luca Guidi] Allow to whitelist handled exceptions and associate them to an HTTP status
- [Luca Guidi] Automatic
Content-Type
- [Luca Guidi] Use
throw
as a control flow which understands HTTP status - [Luca Guidi] Introduced opt-in support for HTTP/Rack cookies
- [Luca Guidi] Introduced opt-in support for HTTP/Rack sessions
- [Luca Guidi] Introduced HTTP redirect API
- [Luca Guidi] Introduced callbacks for actions: before and after
- [Luca Guidi] Introduced exceptions handling with HTTP statuses
- [Luca Guidi] Introduced exposures
- [Luca Guidi] Introduced basic actions compatible with Rack
- [Luca Guidi] Official support for Ruby 2.0