Crystal 0.26.1 has been released!
This release is mainly focused on regression bugs discovered on 0.26.0. There were 39 commits since 0.26.0 by 15 contributors.
Although we try to test as much as possible before each release. During 0.26.0 it was more difficult than usual because of some limitation to override nested dependencies. Luckily for this release dependencies are already updated and at the same time there was bit of work in test-ecosystem
to improve what is covered.
Let’s review some of the most relevant changes in this release. But don’t miss the rest of the release changelog with lots of valuable information.
Language changes
Make self
to be eager evaluated when including modules.
When referencing the current type as self
, for example when including a module, self
will now means the current lexical type. Before, and sine 0.22, the self
was resolved to the lowest type in the hierarchy.
Thanks to some other fixes included in 0.26.0, and the amount of metaprogramming in lucky_record we noticed that the change introduced in 0.22 broke the substitution principle. Luckily now it is fixed!
To understand this change let’s suppose we have a the following type hierarchy: Human < Mammal
, Cat < Mammal
. And we have a TalkTo
module defined as follows:
module TalkTo(T)
def talk_to(t : T)
puts "#{self} is talking to #{t}"
end
end
If we want to make all mammals be able to talk to each other then the following snippet will do:
abstract class Mammal
include TalkTo(self)
end
class Human < Mammal
end
class Cat < Mammal
end
sabrina = Human.new
salem = Cat.new
hilda = Human.new
Any instance instance of mammal will have a #talk_to(t : Mammal)
method. Hence sabrina.talk_to(salem)
would compile.
But if we need a less magical world we would need to include TalkTo(self)
in each of the classes that inherit Mammal. In order to add some programmer’s happiness, if we want to state that each concrete class should have a method talk_to
accepting only instance of the same class, then we need some metaprogramming.
abstract class Mammal
macro inherited
include TalkTo({{@type}})
end
end
With the last snippet sabrina.talk_to(salem)
would not compile. But sabrina.talk_to(hilda)
would.
Before this release the include TalkTo(self)
was the same as macro inherited; include TalkTo({{@type}}); end
. Read more at #6557.
Add accepts_block?
macro method to Def.
In macros you can iterate the methods defined in a type with @type.methods
. Sometimes you might need to know if the method can be called with a block in order to get the job done. From this release, inside macros, you can use #accepts_block?
to know that information. Read more at #6604
HTTP and Networking related changes
With the recent changes in the HTTP::Server
there was a security issue introduced that allows servers with self-signed certificates to crash if the client send wrong certificate information. Now the code is more resilient to issues related to establish the connection between peers. Read more at #6590.
In 0.26.0
a method #bind_ssl
and calls #bind
with a ssl://
scheme were added. This should have been #bind_tls
and tls://
. So in this release the ssl
are marked as deprecated and tls
were added. Web frameworks should not need updates regarding this changes until 0.27. Read more at #6533 and #6551.
Windows support progress
The spec framework of the std lib can now be used in Windows. Read more at #6497. In case you want to read even more about the ongoing efforts related to Windows, please read the wiki.
Other changes
There was some improvements regarding how STDIN
/STDOUT
/STDERR
are handled. The introduced changes should avoid breaking other programs that uses them at the same time. For example, when using pipe operator in bash. Read more at #6518.
Applying transformations in keys and values of a hash became even easier with Hash#transform_keys
and Hash#transform_values
. Read more at #4385.
Next step
Please update your Crystal and report any issues. If there are regression or blocking issues with 0.26.1, a 0.26.2 could be released earlier. But most likely we will be moving forward with 0.27.0 as next release.
The development is possible thanks to the community’s effort, 84codes’ support, and every BountySource supporter.