2024-06-15: Version 2.01
[New Features]
- PSGI-compatible applications can now be mounted directly by using 'psgi' route flag
- Added Kelp::Util::adapt_psgi function (used by the new 'psgi' route flag)
- Added a bunch of new methods with suffix '_param' to Kelp::Request, which work like 'param' but fetch from specific place
- Methods with prefix 'raw_' were added to Kelp::Request, returning encoded request data (see "Bug fixes" below)
- Added charset_encode, charset_decode, is_production methods to Kelp
- Added charset, charset_encode, charset_decode methods to Kelp::Request
- Added set_charset method to Kelp::Response
- Module::Template now inserts an 'app' parameter to render variables unless 'app' is already provided
[Changes]
- 'render' method will now assume you passed a json-encoded string if content type is json and body is not a reference
- Kelp::Test no longer uses HTTP::Cookies, implements a much slimmer cookie jar with the same interface
* The new cookie jar only stores key/value pairs without any special data for cookies like domains, paths or expiration dates
- Kelp::Test now has a new import flag: '-utf8'
* Importing with this flag will automatically set Test::More to encode wide characters on output
- Repeatedly fetching parameters from json request with the param method is now much faster
- Documentation improvements
[Bug fixes]
- Route destination will no longer be executed if a response was already rendered by a previous one
* Rendering a response in a bridge will work the same as if the bridge returned a false value
* If more than one normal routes were matched, they will be run until one of them renders or returns a defined value
* Delayed responses will no longer override a previously rendered normal response
* The destination will still be run if the render happened inside 'before_dispatch' hook
- A template named '0' will now be properly rendered
- An 'app' object available in Kelp::Response template is now a properly reblessed controller
[Deprecations]
- Scalar context behavior of the param method called without arguments on json request is now deprecated
* this is done in effort to make param method easier to use and harder to misuse
[Backward-Incompatible Changes]
- Request data will now be properly decoded using either charset from Content-Type or application charset
* Request paths, query parameters and body are automatically decoded
* Headers, cookies and sessions are unaffected (session encoding must be configured on the middleware level)
* Please use methods with prefix 'raw_' from Kelp::Request to access encoded request data if needed
* Not decoding input was a bug which needed to be fixed, but the application was already encoding the response correctly
- JSON module now registers a second, separate encoder for internal purposes
* The extra encoder will be created with the same options as the normal one, but without utf8
* It will not react to runtime changes in config of the main encoder
* Decodes and encodes will happen using the extra encoder and decode/encode to application's charset
- Kelp::Exception no longer renders its body attribute, but instead logs it if it is present
* Throwing Kelp::Exception now produces error template or plaintext response with proper HTTP status string
* Log will happen at 'error' level, while regular errors are going to 'critical'
* Status 500 exceptions will behave the same as errors - print their body on non-production
- Application main handler now clears all headers when an error or exception is caught
* This fixes a class of bugs where content encoding of the error page was mismatching the rendered error
[Tweaks]
- 'kelp' template has been adjusted to match framework looks
- Added a homepage on GitHub
- Kelp now has a logo and is developed by the Kelp-framework organization on GitHub
2024-06-10: Version 2.00
[New Features]
- Added a return value to 'add' method from Kelp::Routes,
* it can be used to call add again, adding a child and making the parent a bridge
- Added new placeholder to routes: >slurpy (a mix of optional + wildcard)
- Added before_dispatch hook in Kelp
- Added Kelp::Util, which contains some general utilities (previously as private code in Kelp::Routes)
- Added has_name and dest methods to Kelp::Routes::Pattern
- Kelp::Generator has a new filename shortcut: DOT (dotfiles support)
[Changes]
- Kelp::Routes module overhaul
* Handles reblessing the app into a controller class by itself, with rebless => 1
* Kelp::Routes::Controller is no longer required, but will be kept for backward compatibility
* Resolves all of its checks at application build time (not during the request dispatching)
* Does stricter validation of routing configuration
* Route building errors can now be turned into exceptions (rather than just being skipped), with fatal => 1
* Easier to subclass due to new overridable methods: format_to and load_destination
* More performant at runtime, especially for deeply nested trees with many bridges
- Removed safe_param configuration field, since param method is now safe by default
- Improved the quality of configuration generated by the 'kelp' template
[Backward-Incompatible Changes]
- Disable unsafe param calls (cgi_param may be used instead if necessary)
- Routes with invalid destinations will no longer be added and yield HTTP status 404 instead of 500
- Some specific extensions of Kelp::Routes may no longer work correctly due to stricter build-time route checks
[Bug fixes]
- Instances created with new_anon now have correct default 'base' for routes
- Fixed bridge behavior in some cases by removing duplicated slashes from non-regex pattern
- Fixed unnamed wildcard not being honored in non-regex patterns as documented
- Fixed ?placeholder possibly matching other routes, for example '/not/?here' matching '/nothing'
- Fixed *placeholder not honoring rules from checks while matching a pattern
- Optional capture groups in custom-regex routes no longer produce a warning when not matched
- Kelp::Generator now ignores empty lines in index files
[Examples]
- Added an example script for benchmarking router matching and dispatching speeds in ex/router_bench.pl
2024-06-02: Version 1.07
[Changes]
- Kelp::Routes now uses a dedicated method to build a pattern object
2022-05-09: Version 1.06
[Changes]
- Removed broken homepage link
2021-01-21: Version 1.05
[New Features]
- Added HTTP exceptions through Kelp::Exception
[New Documentation]
- Added Kelp::Generator
[Changes]
- Kelp::Module::JSON now uses JSON::MaybeXS
- POD fixes and improvements
2021-01-18: Version 1.04
[New Features]
- Added new_anon constructor, allowing for multiple instances of an app
- Added safe_param configuration - see Kelp::Request::param
- Added Kelp::Generator, allowing for pluggable generation templates and custom generation scripts
- Rewrote the CLI script using Kelp::Generator
- Added a welcome HTML page to generated application listing registered routes and config
[New Documentation]
- Cookbook: template layouts
- Cookbook: deploying
[Changes]
- List context Kelp::Request::param call with parameter now is deprecated without safe_param
- Kelp::Module::JSON will now prefer Cpanel::JSON::XS before other options
- Kelp script now requires --type=less for a Kelp::Less app, instead of --less
- All of Kelp file slurping is now done using Path::Tiny
- POD fixes and improvements
[Bug fixes]
- exception thrown during response JSON encoding with no explicit content_type will now show correct error cause
2021-01-11: Version 1.03
[New Features]
- Kelp::Request now holds the name of a route
- Kelp script can now use tabs for indentation with --tabs flag
[New Documentation]
- Added Kelp::Manual - moved from old Kelp POD
- Added Kelp::Manual::Cookbook
[Changes]
- POD fixes
2018-01-08: Version 1.02
[Bug fixes]
- clean namespace inside import, fix for Path::Tiny
2017-12-29: Version 1.01
No changes. Stable version.
2016-11-08: Version 0.9091
[Changes]
- Change bridge error respose. Bridges will return 403 Forbidden (Konstantin Yakunin)
- attr can be ether scalar, undef or CODEref but not HASHREF or ARRAYREF (Nikolay Mishin)
- POD (Nikolay Mishin)
2015-08-10: Version 0.9071
[Bug Fixes]
- Bridges will correctly return 401 (instead of 500) when non existing location is accessed (Konstantin Yakunin)
- Undefined value warning fixed. (Ben Hengst)
- Correct handle errors on deployment and silence STDERR in Stack Trace tests (Konstantin Yakunin)
[New Features]
- New attributes request_obj and response_obj used to specify the name of the request and response classes. (Ben Hengst)
2015-04-02: Version 0.9051
[Bug Fixes]
- Stringify 500 errors avoiding the JSON-ification of returned structures and blessed objects. (basiliscos)
- Increate the level of Test::Bulder in Kelp::Test, providing more relevant messages upon error. (basiliscos)
- POD typos corrected
[New Features]
- Add json_content method to Kelp::Test, allowing for the testing of the returned JSON structure.
- Abstract the initialization of the Config and Routes modules
- More POD and examples added (roy-tate, Christian Froemmel, Perlover)
2014-12-14: Version 0.9021
[Bug Fixes]
- POD fixes
[New features]
- Session now accepts hashref, which also allows for the destruction
of the enitire session.
- Add "include" function to config files, making it possible to include
other file into the configuration.
2014-08-08: Version 0.9015
[Bug Fixes]
- Fix a typo causing a fatal error in Routes::Controller
- Fix debug and error keywords in Kelp::Less
- Remove an explicit return undef, per Perl::Critic
[New Features and Improvements]
- Allow for route methods outside of base class
It is now possible to add a route that lives outside of the base class
by prefixing it with '+'. This works for both Perl and camelized
strings.
- Add config keyword to Kelp::Less
- Virtualize the logger instantiation
Add a _logger function in Module::Logger, which creates the logger
instance, making it easier to subclass the Logger module.
Add a Logger::Simple module, which dumps everything to STDERR
This module is convenient to use during development with Kelp::Less.
- Update bin/Kelp
* bin/Kelp --less <name> will now create a psgi file with the specified name
(previously it would always create app.psgi).
* Existing files will not be overwritten, unless --force specified.
- Simplify Less application boilerplate
Add a Config subclass with simplified configuration that will be used by
default by any Kelp::Less application. This configuration will not load
any modules or middleware, leaving it up to the user to manually load
any modules needed.
Additionally, bin/Kelp --less <name> will now only generate the psgi
application, and not any other folders, views, templates etc.
- Downgrade confess to croak and croak to die
Kelp::Response used confess and croak excessively. Both changed to die,
so that the user can control how much stack trace they want via the
'long_error' attribute or the KELP_LONG_ERROR env variable.
2014-07-12: Version 0.9012
[New features]
- Add access to the application instance from the config files
- Kelp.pm methods 'requiest' and 'response' renamed to 'build_request' and 'build_response', in order
to minimize cofusion. NOTE: If your application is overriding any of those, make sure to rename them too.
- Replace explicit UTF-8 encoding with $app->charset
- Rename pattern attribute 'via' to 'method'. 'via' will still work as a shortcut to 'method', so
this will not break backwards compatibility.
[Fixes]
- POD fixes
[Other]
- Using Pod::Markdown::Github to generate README.md from Kelp.pm
2014-05-30: Version 0.9001
[Bug Fixes:]
- Curly braces get stripped from pattern checks
- Remove HTTP_X headers from Kelp::Request (security hole)
[New features]
- Allow for extending Kelp::Routes and using custom routers (Maurice Aubrey)
- Create Kelp::Routes::Controller, which reblesses the web app into a controller class (Maurice Aubrey)
- Set env KELP_CONFIG_WARN to warn for missing config files
- Set rendered to true when redirecting (Julio Fraire)
- Add request_ok method to Kelp::Test
- Config module optionally registers _cfg method, to help manipulate the configuration.
- Add a cookie jar to Kelp::Test
2014-03-31: Version 0.4602
Replace $json->property with $json->get_utf8 in order to maintain compatibility across different JSON implementations
2014-03-27: Version 0.4601
If no placeholders in route, param array should be empty (Maurice Aubrey)
Move route cache to a CHI-like interface, in order to allow for custom cache modules
Don't double encode JSON repsonse (Ruslan Zakirov)
2014-03-02: Version 0.4570
Allow attributes to set undef values
do not append default template extension if ext() is undef
Added POD
Added tests
2013-11-19: Version 0.4560
Allow for fully qualified Kelp module names
Config merge sigils will now only work for ARRAY
POD and typo fixes
2013-11-11: Version 0.4550
Flip nginx env vars.
Change param to accept no JSON content or non-hash JSON
Make Kelp::Test::request only load the PSGI app once
POD and comments typo fixes
2013-08-14: Version 0.4501
Minor fixes
Add render_binary
Add missing header_like
POD changes
2013-07-05: Version 0.4011
Removed modules_disable and middleware_disable, and added the ability to add and remove elements in an array by adding a '+' or '-' in front of the key name.
2013-07-02: Version 0.4001
Added modules_disable and middleware_disable arrays in config
Added a REMOTE_USER fallback for nginx
Added loaded_modules attribute to Kelp
Fixed utf8 encoding for OSX
Added a session convenience method
PSGI creation remodeled to leverage the StackTrace middleware
Introduced render_error method in Kelp::Response, which will look for error templates (404, 500, etc)
2013-06-13: Version 0.3101
Remove dependency of Template, replace it with Template::Tiny.
Reason being that Template does not pass its tests under Perl 5.18.
Use Kelp::Module::Template::Toolkit (available on CPAN) if your code
depends on Template.
2013-05-25: Version 0.3001
Fix typo in test paths
Bridges accessed directly will now return 401 - Unathorized
Introduce "panic" and "finalize" methods
Add "long_error" attribute
Rename "before_render" to "before_finalize"
Change all _croak statements to return panic, improving the natural flow of the route logic
2013-05-14: Version 0.2191
Add arguments to load_module
Fix tests and small issues
2013-05-05: Version 0.2190
Add property for partial rendering
Address an issue with nginx and headers
Add more pod
2013-05-02: Version 0.2182
Fix issue with content-type params
Set explicit utf8 encoding for module Template
Replace wizardly Perl code with Class::Inspector
2013-04-20: Version 0.2181
Fix test failing under Perl 5.10
2013-04-19: Version 0.218
Add auto load class when adding a route.
2013-04-17: Version 0.217
Fix Github issue #1
Revamp the Template module to allow for more standard subclassing
Remove Config::Hash from test units
2013-04-16: Version 0.21
Allow for using templates w/o extension.
Allow for subclassing the templates module.
Implement testing of a Less app, via the psgi attribute.
2013-04-13: Version 0.2
Complete rewrite of the Config module, allow for subclassing of it.
Write more tests.
Write more POD.
2013-04-12: Version 0.1
First upload to CPAN