The Lucky 0.29 release brings us many more quality of life updates, bug fixes, and a few new features to really make your app solid.
Lucky 0.29.0 is now out, and a few apps in the wild have already upgraded!
This release mainly focused on quality of life. Lots of bugs have been fixed, and many UI/UX updates to round out and polish the overall feel of the framework. There are a few new features as well, so let’s cover some of the highlights.
See the UPGRADE_NOTES.
Or you can view the changes using LuckyDiff. This tool helps see what has changed between versions and will be included in upgrade notes from now on.
No software is without its share of bugs, but we’ve put a big focus on fixing many of the rough edges.
<input checked />VS
<input checked="true" />)
lucky devno longer clashes with Elixir development via the
Lucky tries to focus on the development experience by catching bugs and issues while you’re developing your application. Here’s a few items to make that nicer.
lucky routeslooks nicer, and provides extra flags to see which params are used in your actions.
mix-manifest.json. This makes using other asset bundlers (like Parcel) easier.
This is a large step forward in our goal to be a solid 1.0 framework. A new shard LuckyCache has been created that allows you to add caching at the application level. It’s a low-level cache you can use to do fragment cache on your pages, or cache specifc queries that you need access to, but don’t need to on every single request.
# example usage mobile_ad = LuckyCache.settings.storage.fetch("your_key", expires_in: 24.hours) do AppSettingsQuery.new.ad_banner("mobile").first end iframe(src: mobile_ad.source_url)
In addition, we’ve also added in Query Caching. The query cache can be enabled/disabled
config/database.cr by changing the
query_cache_enabled setting accordingly.
The query cache mechanism is designed to store your ModelQuery results in to memory over the duration of an HTTP request.
# this hits the database UserQuery.new.first # this is pulled from cache in-memory UserQuery.new.first
We’ve also made some improvements with validations. Each validation method
now returns a
Bool value if it succeeded or not.
before_save do if validate_required(code) run_super_complex_validation end end
There’s also a new validation method
validate_format_of. Use this validation
to test if an attribute meets a specific format.
before_save do validate_format_of pin, with: /^d+$/ end
As you may know, non-nilable attributes are automatically ran through
required validations. Since they can’t be nil, we need to ensure they
have a value. To go along with these default validations, we also have
a new macro called
default_validations macro allows you to specify your own custom
default validations that you need to run. These validations are ran
after all of the
before_save blocks have completed allowing you to
do any necessary setup before hand.
before_save do code.value ||= "1234" end default_validations do validate_required code end
In some instances, you may need to just skip all of the default validations
, including the ones Lucky runs for you. To do this, we’ve added the
macro. Place this in the operation you wish to skip those validations.
class SaveCode < Code::SaveOperation skip_default_validations # ... end
Lastly, the validations are all now compatible with I18n. You have many choices
for shards that can handle translations for you. Create a struct and inherit from
Avram::I18nBackend to override the defaults.
# config/i18n.cr struct I18n < Avram::I18nBackend def get(key : String | Symbol) : String # do your lookup here end end # config/database.cr Avram.configure do |settings| # ... settings.i18n_backend = I18n.new end
Read the PR for more details.
We want to acknowledge and thank the community members for sticking with the Lucky Framework. Lucky has set a goal to be a solid and stable choice for a Crystal based web-framework and in most cases, we feel we have hit the mark.
At this point we had hoped to be closer to the 1.0 release, but due to life outside of open source, that has been pushed back. The core team wants to be open and transparent about the state of things and keep everyone in the loop.
A discussion thread has been opened with more details on our release schedule. With this release, we’re now even closer to our goal. If you have any questions, please feel free to reach out any time.
Learn tips and tricks with LuckyCasts.
If you have any questions, or just want to chat, please join us on Discord.