All Versions
118
Latest Version
Avg Release Cycle
46 days
Latest Release
684 days ago

Changelog History
Page 3

  • v0.34.0 Changes

    April 06, 2020

    Language changes

    • (breaking-change) Exhaustive case expression check added, for now it produces warnings. (#8424, #8962, thanks @asterite, @Sija)
    • Let Proc(T) be used as a Proc(Nil). (#8969, #8970, thanks @asterite)

    Standard library

    • (breaking-change) Replace Errno, WinError, IO::Timeout with RuntimeError, IO::TimeoutError, IO::Error, File::Error, Socket::Error, and subclasses. (#8885, thanks @waj)
    • (breaking-change) Replace Logger module in favor of Log module. (#8847, #8976, thanks @bcardiff)
    • (breaking-change) Move Adler32 and CRC32 to Digest. (#8881, thanks @bcardiff)
    • (breaking-change) Remove DL module. (#8882, thanks @bcardiff)
    • Enable more win32 specs. (#8683, #8822, thanks @straight-shoota)
    • 🚀 Make SemanticVersion::Prerelease comparable. (#8991, thanks @MakeNowJust)
    • 👉 Use flag?(:i386) instead of obsolete flag?(:i686). (#8863, thanks @bcardiff)
    • ✂ Remove Windows workaround using vsnprintf. (#8942, thanks @oprypin)
    • 🛠 Fixed docs broken link to ruby's prettyprint source. (#8915, thanks @matthin)
    • ⚡️ Update OptionParser example to exit on --help. (#8927, thanks @vlazar)

    Numeric

    • 🛠 Fixed Float32#to_s corner-case. (#8838, thanks @toddsundsted)
    • Fixed make Big*#to_u raise on negative values. (#8826, thanks @Sija)
    • Fixed BigDecimal#to_big_i regression. (#8790, thanks @Sija)
    • ➕ Add Complex#round. (#8819, thanks @miketheman)
    • Add Int#bit_length and BigInt#bit_length. (#8924, #8931, thanks @asterite)
    • 🛠 Fixed docs of Int#gcd. (#8894, thanks @nard-tech)

    Text

    • (breaking-change) Deprecate top-level with_color in favor of Colorize.with. (#8892, #8958, thanks @bcardiff, @oprypin)
    • ➕ Add overloads for String#ljust, String#rjust and String#center that take an IO. (#8923, thanks @asterite)
    • ➕ Add missing Regex#hash and Regex::MatchData#hash. (#8986, thanks @MakeNowJust)
    • ⬆️ Upgrade Unicode to 13.0.0. (#8906, thanks @Blacksmoke16)
    • ⏪ Revert deprecation of String#codepoint_at. (#8902, thanks @vlazar)
    • 🚚 Move Iconv to Crystal namespace. (#8890, thanks @bcardiff)

    Collections

    • 🛠 Fixed make Range#size raise on an open range. (#8829, thanks @Sija)
    • ➕ Add Enumerable#empty?. (#8960, thanks @Sija)
    • 🐎 (performance) Optimized Implementation of Array#fill for zero Values. (#8903, thanks @toddsundsted)
    • 🔨 Refactor Reflect to an Enumerable private definition. (#8884, thanks @bcardiff)

    Serialization

    • (breaking-change) Rename YAML::Builder.new with block to YAML::Builder.build. (#8896, thanks @straight-shoota)
    • ➕ Add XML.build_fragment. (#8813, thanks @straight-shoota)
    • ➕ Add CSV#rewind. (#8912, thanks @asterite)
    • Add Deque#from_json and Deque#to_json. (#8850, thanks @carlhoerberg)
    • 🏗 Call to IO#flush on CSV, INI, JSON, XML, and YAML builders. (#8876, thanks @asterite)
    • ➕ Add docs to Object.from_yaml. (#8800, thanks @wowinter13)

    Time

    • (breaking-change) Improve Time::Span initialization API with mandatory named arguments. (#8257, #8857, thanks @dnamsons, @bcardiff)
    • ➕ Add Time::Span#total_microseconds. (#8966, thanks @vlazar)

    Files

    • 🛠 Fixed multi-thread race condition by setting fd to -1 on closed File/Socket. (#8873, thanks @bcardiff)
    • 🛠 Fixed File.dirname with unicode chars. (#8911, thanks @asterite)
    • Add IO::Buffered#flush_on_newline back and set it to true for non-tty. (#8935, thanks @asterite)
    • Forward missing methods of IO::Hexdump to underlying IO. (#8908, thanks @carlhoerberg)

    Networking

    • (breaking-change) Correctly support WebSocket close codes. (#8975, #8981, thanks @RX14, @Sija)
    • 👉 Make HTTP::Client return empty body_io if content-length is zero. (#8503, thanks @asterite)
    • 🛠 Fixed UDP specs in the case of a local firewall. (#8817, thanks @RX14)
    • 🛠 Fixed MIME spec examples to not collide with actual registry. (#8795, thanks @straight-shoota)
    • 🛠 Fixed UNIXServer, and HTTP::WebSocket specs to ensure server is accepting before closing. (#8755, #8879, thanks @bcardiff)
    • ➕ Add type annotation to tls argument in HTTP. (#8678, thanks @j8r)
    • ➕ Add Location to HTTP::Request common header names. (#8992, thanks @mamantoha)

    Concurrency

    • ➕ Add docs on Future regarding exceptions. (#8860, thanks @rdp)
    • Disable occasionally failing Thread specs on musl. (#8801, thanks @straight-shoota)

    System

    • 🛠 Fixed typo on src/signal.cr. (#8805, thanks @lbguilherme)

    ⚙ Runtime

    • 🛠 Fixed exceptions not being inspectable when running binary from PATH. (#8807, thanks @willhbr)
    • 🚚 Move AtExitHandlers to Crystal namespace. (#8883, thanks @bcardiff)

    Compiler

    • (breaking-change) Drop disable_overflow compiler flag. (#8772, thanks @Sija)
    • 🛠 Fixed url in "can't infer block return type" error message. (#8869, thanks @nilium)
    • 🛠 Fixed typo in math interpreter error message. (#8941, thanks @j8r)
    • 0️⃣ Use CRYSTAL_OPTS environment variable as default compiler options. (#8900, thanks @bcardiff)
    • ⚠ Avoid using the default --exclude-warnings value if some is specified. (#8899, thanks @bcardiff)
    • 0️⃣ Honor LIBRARY_PATH as default library path, and allow linking with no explicit /usr/lib:/usr/local/lib paths. (#8948, thanks @bcardiff)
    • 🛠 Fix Windows LLVM globals codegen in non-single-module mode. (#8978, thanks @oprypin)
    • ➕ Add support for LLVM 10. (#8940, thanks @RX14)
    • ✂ Remove redundant calls to Object.to_s in interpolation in compiler's code. (#8947, thanks @veelenga)

    Language semantics

    • Type as NoReturn if calling method on abstract class with no concrete subclasses. (#8870, thanks @asterite)

    Tools

    • ➕ Add crystal init name validation. (#8737, thanks @straight-shoota)

    Doc generator

    • ⚠ Show warnings on docs command. (#8880, thanks @bcardiff)

    Others

    • CI improvements and housekeeping. (#8804, #8811, #8982, thanks @bcardiff, @oprypin)
    • ⚡️ Update to Shards 0.10.0. (#8988, thanks @bcardiff)
    • 🛠 Fix pretty_json sample. (#8816, thanks @asterite)
    • 🛠 Fix typos throughout the codebase. (#8971, thanks @Sija)
  • v0.33.0 Changes

    February 14, 2020

    Language changes

    Macros

    • ➕ Add TypeNode#name(generic_args : BoolLiteral) to return TypeNode's name with or without type vars. (#8483, thanks @Blacksmoke16)

    Standard library

    • (breaking-change) Remove several previously deprecated methods and modules: PartialComparable, Crypto::Bcrypt::Password#==, HTTP::Server::Response#respond_with_error, JSON::PullParser::Kind#==, Symbol#==(JSON::PullParser::Kind), JSON::Token#type, String#at, Time.new, Time.now, Time.utc_now, URI.escape, URI.unescape. (#8646, #8596, thanks @bcardiff, @Blacksmoke16)
    • 🛠 Fixed docs wording. (#8606, #8784, thanks @fxn)
    • ➕ Add Object#in?. (#8720, #8723, thanks @Sija)
    • 👍 Allow to create an enum from a symbol. (#8634, thanks @bew)
    • ➕ Add VaList#next for getting the next element in a variadic argument list. (#8535, #8688, thanks @ffwff, @RX14)
    • 🔨 Refactor ARGF implementation. (#8593, thanks @arcage)
    • 🛠 Fixed specs of Colorize on dumb terminal. (#8673, thanks @oprypin)
    • 🛠 Fixed some specs on Win32. (#8670, thanks @straight-shoota)

    Numeric

    Text

    • 🛠 Fixed \u0000 wrongly added on String#sub(Hash) replaces last char. (#8644, thanks @mimame)

    Collections

    • 🛠 Fixed Enumerable#zip to work with union types. (#8621, thanks @asterite)
    • 🛠 Fixed docs regarding Hash's initial_capacity. (#8569, thanks @r00ster91)

    Serialization

    • 👌 Improved JSON deserialization into union types. (#8689, thanks @KimBurgess)
    • 🛠 Fixed expected error message in libxml2 error spec. (#8699, thanks @straight-shoota)
    • 🛠 Fixed JSON::PullParser overflow handling. (#8698, thanks @KimBurgess)
    • 🛠 Fixed JSON::Any#dig?/YAML::Any#dig? on non-structure values. (#8745, thanks @Sija)

    Time

    Files

    • (breaking-change) Deprecate File::Info#owner, and File::Info#group; use owner_id, and group_id. (#8007, thanks @j8r)
    • 🛠 Fixed Path.new receiving Path as first argument. (#8753, thanks @straight-shoota)
    • 🛠 Fixed File.size and File.info to work with Path parameters. (#8625, thanks @snluu)
    • 🛠 Fixed Path specs when ENV["HOME"] is unset. (#8667, thanks @straight-shoota)
    • Refactor Dir.mkdir_p to use Path#each_parent and make it work on Win32. (#8668, thanks @straight-shoota)
    • 🛠 Fixed IO::MultiWriter specs to close file before reading/deleting it. (#8674, thanks @oprypin)

    Networking

    • 🛠 Fixed invalid call to libevent and race conditions on closed IO when resuming readable/writable event. (#8707, #8733, thanks @bcardiff)
    • 🛠 Fixed unexpected EOF in terminated SSL connection. (#8540, thanks @rdp)
    • 🛠 Fixed HTTP::Cookie to support Int64 max-age values. (#8759, thanks @asterite)
    • 👌 Improve error message for getaddrinfo failure. (#8498, thanks @rdp)
    • Make IO::SysCall#wait_readable and IO::SysCall#wait_writable public, yet :nodoc:. (#7366, thanks @stakach)
    • 🔨 Refactor StaticFileHandler to use Path. (#8672, thanks @straight-shoota)
    • ✂ Remove fixed date in spec. (#8640, thanks @bcardiff)
    • ✂ Remove non-portable error message in TCPServer spec. (#8702, thanks @straight-shoota)

    Crypto

    Concurrency

    System

    • Enable system module for Win32 in prelude. (#8661, thanks @straight-shoota)
    • Handle exceptions raised at __crystal_sigfault_handler. (#8743, thanks @waj)

    ⚙ Runtime

    • 🛠 Fixed wrongly collected exception object by the GC. Ensure LibUnwind::Exception struct is not atomic. (#8728, thanks @waj)
    • 🛠 Fixed reporting of non-statement rows in DWARF backtrace. (#8499, thanks @rdp)
    • ➕ Add top level exception handler. (#8735, #8791, thanks @waj)
    • Try to open stdio in non-blocking mode. (#8787, thanks @waj)
    • 👍 Allow Crystal::System.print_error to use printf like format. (#8786, thanks @bcardiff)

    Spec

    Compiler

    • (breaking-change) Drop support for previously deprecated comma separators in enums and other cleanups. (#8657, thanks @bcardiff)
    • (breaking-change) Drop uppercase F32 and F64 float number suffixes. (#8782, thanks @rhysd)
    • 🛠 Fixed memory corruption issues by using LLVM's memset and memcpy that matches target machine. (#8746, thanks @bcardiff)
    • 🛠 Fixed ICE when trying to add type inside annotation. (#8628, thanks @asterite)
    • 🛠 Fixed ICE on typeof in an unused block. (#8695, thanks @asterite)
    • 🛠 Fixed ICE in case of wrong target triple. (#8710, thanks @Sija)
    • 🛠 Fixed ICE when raising a macro exception with empty message. (#8654, thanks @jan-zajic)
    • 🛠 Fixed parser bug macro with "eenum" in it. (#8760, thanks @asterite)
    • 🔄 Change CRYSTAL_PATH to allow shards to override std-lib. (#8752, thanks @bcardiff)

    Language semantics

    • 🛠 Fixed missing virtualization of Proc pointer. (#8757, thanks @asterite)
    • 🛠 Fixed type of vars after begin/rescue if all rescue are unreachable. (#8758, thanks @asterite)
    • 🛠 Fixed visibility propagation to macro expansions in all cases. (#8762, #8796, thanks @asterite)

    Tools

    Formatter

    • 🛠 Fixed indent after comment inside indexer. (#8627, thanks @asterite)
    • 🛠 Fixed indent of comments at the end of a proc literal. (#8778, thanks @asterite)
    • 🛠 Fixed crash when formating comment after macro. (#8697, thanks @asterite)
    • 🛠 Fixed crash when formating exp.!. (#8768, thanks @asterite)
    • ✂ Removes unnecessary escape sequences. (#8619, thanks @RX14)

    Doc generator

    • (breaking-change) Deprecate ditto and nodoc in favor of :ditto: and :nodoc:. (#6362, thanks @j8r)
    • 📄 Skip creation of docs/ dir when not needed. (#8718, thanks @Sija)

    Others

  • v0.32.1 Changes

    December 18, 2019

    Standard library

    Collections

    • Fixed docs of Enumerable#each_cons_pair and Iterator#cons_pair. (#8585, thanks @arcage)

    Networking

    • 🛠 Fixed HTTP::WebSocket's on_close callback is called for all errors. (#8552, thanks @stakach)
    • 🛠 Fixed sporadic failure in specs with OpenSSL 1.1+. (#8582, thanks @rdp)

    Compiler

    Language semantics

    • Combine contiguous string literals before string interpolation. (#8581, thanks @asterite)
  • v0.32.0 Changes

    December 11, 2019

    Language changes

    • 👍 Allow boolean negation to be written also as a regular method call expr.!. (#8445, thanks @jan-zajic)

    Macros

    • ➕ Add TypeNode#class_vars to list class variables of a type in a macro. (#8405, thanks @jan-zajic)
    • ➕ Add TypeNode#includers to get an array of types a module is directly included in. (#8133, thanks @Blacksmoke16)
    • Add ArrayLiteral#map_with_index and TupleLiteral#map_with_index. (#8049, thanks @Blacksmoke16)
    • ➕ Add docs for ArrayLiteral#reduce. (#8379, thanks @jan-zajic)
    • ➕ Add lower: named argument to StringLiteral#camelcase. (#8429, thanks @Blacksmoke16)

    Standard library

    Numeric

    Text

    Collections

    • (breaking-change) Deprecate Enumerable#grep, use Enumerable#select. (#8452, thanks @j8r)
    • 🛠 Fixed Enumerable#minmax, #min, #max for partially comparable values. (#8490, thanks @TedTran2019)
    • 🛠 Fixed Hash#rehash. (#8450, thanks @asterite)
    • 🛠 Fixed Array range assignment index out of bounds. (#8347, thanks @asterite)
    • 🛠 Fixed endless ranged support for String#[]? and Array#[]?. (#8567, thanks @KarthikMAM)
    • Add Hash#compare_by_identity and Set#compare_by_identity. (#8451, thanks @asterite)
    • Add Enumerable#each_cons_pair and Iterator#cons_pair yielding a tuple. (#8332, thanks @straight-shoota)
    • Add offset argument to all map_with_index methods. (#8264, thanks @asterite)
    • 🐎 (performance) Optimized version of Tuple#to_a. (#8265, thanks @asterite)
    • ➕ Add docs to Hash.merge!(other : Hash, &). (#8380, thanks @jan-zajic)
    • ➕ Add docs to Hash.select. (#8391, thanks @jan-zajic)
    • ➕ Add docs and specs to Enumerable.reduce. (#8378, thanks @jan-zajic)

    Serialization

    • (breaking-change) Make XML::Reader#expand raise, introduce XML::Reader#expand? for former behavior. (#8186, thanks @Blacksmoke16)
    • 👍 Allow JSON.mapping & YAML.mapping converter attribute to be applied to Array and Hash. (#8156, thanks @rodrigopinto)
    • Add use_json_discriminator and use_yaml_discriminator to choose type based on property value. (#8406, thanks @asterite)
    • Remove return type self restriction from Object.from_json and Object.from_yaml. (#8489, thanks @straight-shoota)

    Files

    • (breaking-change) Remove expand home (~) by default in File.expand_path and Path#expand, now opt-in argument. (#7903, thanks @didactic-drunk)
    • Fixed bugs in Path regarding #dirname, #each_part, #each_parent. (#8415, thanks @jan-zajic)
    • 🛠 Fixed GZip::Reader and GZip::Writer to handle large data sizes. (#8421, thanks @straight-shoota)
    • 🛠 Fixed File::Info#same_file? by providing access to 64 bit inode numbers. (#8355, thanks @didactic-drunk)

    Networking

    • 🛠 Fixed HTTP::Response#mime_type returns nil on empty Content-Type header. (#8464, thanks @Sija)
    • 🛠 Fixed handling of unidirectional SSL servers hang. (#8481, thanks @rdp)
    • ➕ Add HTTP::Client#write_timeout. (#8507, thanks @Sija)
    • ⚡️ Updated mime type of .js files to text/javascript and include image/webp. (#8342, thanks @mamantoha)
    • 🔨 Refactor websocket protocol GUID string. (#8339, thanks @vlazar)

    Crypto

    • (breaking-change) Enforce single-line results of OpenSSL::DigestBase#base64digest via Base64.strict_encode. (#8215, thanks @j8r)

    Concurrency

    System

    ⚙ Runtime

    Spec

    • 🛠 Fixed --fail-fast behaviour. (#8453, thanks @asterite)
    • ➕ Add before, after, and around hooks. (#8302, thanks @asterite)
    • Restrict the type returned by should_not be_nil and others. (#8412, thanks @asterite)
    • ➕ Add ability to randomize specs via --order random|<seed-value>. (#8310, thanks @Fryguy)
    • ➕ Add specs for Spec filters. (#8242, thanks @Fryguy)
    • ➕ Add ability to tag specs. (#8068, thanks @Fryguy)

    Compiler

    • 🛠 Fixed musl libc detection (Alpine 3.10 regression bug). (#8330, thanks @straight-shoota)
    • 🛠 Fixed pragmas handling in macros. (#8256, thanks @asterite)
    • 🛠 Fixed parser crash for 'alias Foo?'. (#8282, thanks @oprypin)
    • 🛠 Fixed parser error on newline before closing parenthesis. (#8320, thanks @MakeNowJust)
    • 🛠 Fixed generic subtypes edge cases triggering no target defs error. (#8417, thanks @asterite)
    • 🛠 Fixed cleanup of local vars reachable by macros. (#8529, thanks @asterite)
    • ➕ Add support for LLVM 9. (#8358, thanks @RX14)
    • ➕ Add --mcmodel option to compiler. (#8363, thanks @ffwff)
    • Disallow instance_sizeof on union. (#8399, thanks @asterite)
    • ➕ Add mention to crystal <command> --help in help. (#3628, thanks @rdp)
    • 👌 Improve error message when a filename is misspelled. (#8500, thanks @rdp)
    • 👉 Show full path of locally compiled Crystal. (#8486, thanks @rdp)
    • Code cleanups. (#8460, thanks @veelenga)

    Language semantics

    • 🛠 Fixed method lookup priority when type alias of union is used. (#8258, thanks @asterite)
    • 🛠 Fixed visibility modifiers in virtual types. (#8562, thanks @asterite)
    • 🛠 Fixed sizeof(Bool). (#8273, thanks @asterite)

    Tools

    Formatter

    Doc generator

    Playground

    • Do not collapse whitespaces in playground sidebar. (#8528, thanks @hugopl)

    Others

  • v0.31.1 Changes

    September 30, 2019

    Standard library

    Numeric

    • 🛠 Fixed overflow in Random::Secure. (#8224, thanks @oprypin)

    Networking

    • ↪ Workaround IO::Evented#evented_write invalid IndexError error. (#8239, thanks @bcardiff)

    Concurrency

    • 👉 Use bdw-gc upstream patch for green threads support. (#8225, thanks @bcardiff)
    • 🔨 Refactor Channel to use records instead of tuples. (#8227, thanks @asterite)

    Spec

    Compiler

    • 🛠 Fix debug location information when emitting main code from module. (#8234, thanks @asterite)

    Language semantics

  • v0.31.0 Changes

    September 23, 2019

    Language changes

    • 👍 Allow non-captured block args with type restriction using & : T -> U. (#8117, thanks @asterite)

    Macros

    • Ensure @type is devirtualized inside macros. (#8149, thanks @asterite)

    Standard library

    • (breaking-change) Remove Markdown from the std-lib. (#8115, thanks @asterite)
    • (breaking-change) Deprecate OptionParser#parse!, use OptionParser#parse. (#8041, thanks @didactic-drunk)
    • 🛠 Fix example codes in multiple places. (#8194, thanks @maiha)

    Numeric

    • (breaking-change) Enable overflow by default. (#8170, thanks @bcardiff)
    • (breaking-change) Make / the arithmetic division for all types. (#8120, thanks @bcardiff)
    • Add BigDecimal# ** and BigRational#** (pow operator). (#7860, thanks @jwbuiter)
    • 👻 Avoid overflow exception in Number#round(digits, base). (#8204, thanks @bcardiff)
    • 🔨 Refactor Int#divisible_by? for clarity. (#8045, thanks @yxhuvud)

    Text

    • 🐎 (performance) Minor String#lchop? ASCII-only optimization. (#8052, thanks @r00ster91)

    Collections

    • 🐎 (performance) Array optimizations for small number of elements. (#8048, thanks @asterite)
    • 🐎 (performance) Optimize Array#*. (#8087, thanks @asterite)
    • 🐎 (performance) Hash now uses an open addressing algorithm. (#8017, #8182, thanks @asterite)
    • 🐎 (performance) Optimize Hash#to_a, Hash#keys and Hash#values. (#8042, thanks @asterite)
    • 🐎 (performance) Add Hash#put and optimize Set#add?. (#8116, thanks @asterite)
    • 🛠 Fixed Slice#== for some generic instantiations, add Slice#<=>. (#8074, thanks @asterite)
    • ➕ Add docs on idempotence and methods involving eager evaluation in Iterator. (#8053, thanks @KimBurgess)
    • ➕ Add Set#+. (#8121, thanks @sam0x17)
    • 🔨 Refactor Hash to use integer division instead of float division. (#8104, thanks @asterite)

    Serialization

    • (breaking-change) Rename XML::Type to XML::Node::Type, introduce XML::Reader::Type. (#8134, thanks @asterite)
    • 🛠 Fixed JSON and YAML parsing of NamedTuple with nilable fields. (#8109, thanks @asterite)
    • 🛠 Fixed YAML to emit unicode characters as such. (#8132, thanks @asterite)
    • 🛠 Fixed INI generation of empty sections. (#8106, thanks @j8r)

    Files

    • 🐎 (performance) Optimize Path#join by precomputing capacity if possible. (#8078, thanks @asterite)
    • 🐎 (performance) Optimize Path#join for the case of joining one single part. (#8082, thanks @asterite)
    • 🐎 (performance) Optimize Dir.glob. (#8081, thanks @asterite)
    • 🛠 Fixed File.basename off-by-one corner-case. (#8119, thanks @ysbaddaden)
    • 🛠 Fixed unneeded evaluation of Path.home on Path.expand. (#8128, thanks @asterite)
    • 🛠 Fixed Zip::Writer STORED compression. (#8142, thanks @asterite)
    • 🛠 Fixed missing check on ARGF if read_count is zero. (#8177, thanks @Blacksmoke16)

    Networking

    • (breaking-change) Replace HTTP::Server::Response#respond_with_error with #respond_with_status. (#6988, thanks @straight-shoota)
    • (breaking-change) Handle too long URIs and too large header fields in HTTP::Request.from_io and remove HTTP::Request::BadRequest. (#8013, thanks @straight-shoota)
    • 🆕 Fixed memory leak from SSL_new if ssl_accept fails. (#8088, thanks @rdp)
    • 🛠 Fixed WebSocket ipv6 hostname connection. (#8066, thanks @MrSorcus)
    • ➕ Add URI#query_params method. (#8090, thanks @rodrigopinto)
    • ➕ Add URI#resolve and URI#relativize. (#7716, thanks @straight-shoota)
    • ➕ Add #clear, #delete, and #size methods to HTTP::Cookies. (#8107, thanks @sam0x17)
    • 🔨 Refactor http/server_spec. (#8056, thanks @straight-shoota)
    • 🔨 Refactor UDP specs to use random port. (#8139, thanks @waj)

    Concurrency

    • Multithreading. (#8112, thanks @waj)
    • Delay releasing of fiber stack in multi-thread mode. (#8138, thanks @waj)
    • ⏱ Make Crystal::Scheduler.init_workers block until workers are ready. (#8145, thanks @bcardiff)
    • 👉 Make Crystal::ThreadLocalValue thread-safe. (#8168, thanks @waj)
    • Let exec_recursive use a thread-local data structure. (#8146, thanks @asterite)
    • ➕ Add explicit return types for some channel methods. (#8161, thanks @Blacksmoke16)
    • ✂ Remove the dedicated fiber to run the event loop. (#8173, thanks @waj)
    • 🛠 Fix corruption of thread linked list. (#8196, thanks @waj)
    • ↪ Workaround compile on win32 until fibers is implemented. (#8195, thanks @straight-shoota)

    System

    Spec

    Compiler

    Language semantics

    • 🛠 Fixed abstract def check regarding generic ancestor lookup. (#8098, thanks @asterite)
    • 🛠 Fixed missing virtualization of type arguments in Proc types. (#8159, thanks @asterite)
    • 🛠 Fixed incorrect typing after exception handler. (#8037, thanks @asterite)
    • 🛠 Fixed behaviour when a yield node can't be typed. (#8101, thanks @asterite)
    • 🛠 Fixed offsetof on reference types. (#8137, thanks @mcr431)
    • 👍 Allow rescue var to be closured. (#8143, thanks @asterite)
    • 🔨 Refactor class var and constant initialization. (#8067, #8091, thanks @waj)
    • ➕ Add runtime check for recursive initialization of class variables and constants. (#8172, thanks @waj)

    Tools

    Doc generator

    • 🛠 Fixed link to constructors of another class. (#8110, thanks @asterite)
    • 📄 Enable docs from previous def and/or ancestors to be inherited. (#6989, thanks @asterite)

    Others

  • v0.30.1 Changes

    August 12, 2019

    Standard library

    Numeric

    Networking

    • 🛠 Fixed TCP socket leaking after failed SSL connect in HTTP::Client#socket. (#8025, thanks @straight-shoota)
    • Honor normalized header names for HTTP requests. (#8061, thanks @asterite)

    Concurrency

    • 👍 Don't resume fibers directly from event loop callbacks (or support for libevent 2.1.11). (#8058, thanks @waj)

    Compiler

    Language semantics

    • Consider abstract method implementation in supertype for abstract method checks. (#8035, thanks @asterite)

    Tools

    Formatter

    • 🖐 Handle consecutive macro literals when subformatting. (#8034, thanks @asterite)
    • 🛠 Fixed crash when formatting syntax error inside macro. (#8055, thanks @asterite)

    Others

  • v0.30.0 Changes

    August 01, 2019

    Language changes

    Macros

    • ➕ Add args/named_args macro methods to Annotations. (#7694, thanks @Blacksmoke16)
    • Unify resolve and types macro methods API for Type and Path for convenience. (#7970, thanks @asterite)

    Standard library

    • (breaking-change) Remove UUID#to_slice in favor of UUID#bytes to fix dangling pointer issues. (#7901, thanks @ysbaddaden)
    • 🐎 (performance) Improve Box of reference types. (#8016, thanks @waj)
    • 🛠 Fixed initial seed of Random::ISAAC. (#7977, thanks @asterite)
    • 🛠 Fixed mem intrinsics for aarch64. (#7983, thanks @drujensen)
    • ➕ Add Benchmark.memory. (#7835, thanks @r00ster91)
    • 👍 Allow setting default capacity for StringPool. (#7899, thanks @carlhoerberg)
    • ➕ Add type restrictions to INI. (#7831, thanks @j8r)
    • 🛠 Fixed Logger docs. (#7898, thanks @dprobinson)
    • 🛠 Fix example codes in multiple places. (#8003, thanks @maiha)

    Numeric

    • 🛠 Fixed incorrect Int#% overflow. (#7980, thanks @asterite)
    • Fixed inconsistency between Float#to_s and BigFloat#to_s, always show .0 for whole numbers. (#7982, thanks @Lasvad)

    Text

    • 🛠 Fixed unicode alternate ranges generation. (#7924, thanks @asterite)

    Collections

    Serialization

    • (breaking-change) JSON: use enums instead of symbols. (#7966, thanks @asterite)
    • 🛠 Fixed YAML deserialization of String in a union type. (#7938, thanks @asterite)
    • 🏗 Validate element names in XML::Builder. (#7965, thanks @Blacksmoke16)
    • 👍 Allow numeric keys in JSON (ie: Hash(Int32, String).from_json). (#7944, thanks @asterite)
    • ➕ Add alias/merge methods to YAML::Builder and YAML::Nodes::Builder. (#7949, thanks @Blacksmoke16)

    Files

    Networking

    Crypto

    • Require openssl algorithm in pkcs5. (#7985, thanks @will)
    • 🛠 Fixed cipher expectation in OpenSSL::SSL::Socket spec. (#7871, thanks @j8r)

    Concurrency

    • 🛠 Fixed sysconf call on OpenBSD. (#7879, thanks @jcs)

    System

    Compiler

    Language semantics

    • 🛠 Fixed generic metaclass argument expansion. (#7916, thanks @asterite)
    • 🛠 Fixed top-level private const not being scoped. (#7907, thanks @asterite)
    • 🛠 Fixed enum overflow when declaring members. (#7881, thanks @asterite)
    • 🛠 Fixed annotation lookup on generic types. (#7891, thanks @asterite)

    Tools

    Formatter

    Doc generator

    Others

  • v0.29.0 Changes

    June 05, 2019

    Standard library

    • 🛠 Fix example codes in multiple places. (#7718, thanks @maiha)

    Macros

    Numeric

    • 🐎 (performance) Optimize String#to_u methods for the case of a negative number. (#7446, thanks @r00ster91)

    Text

    • (breaking-change) Deprecate String#at, use String#char_at. (#7633, thanks @j8r)
    • (breaking-change) Change String#to_i to parse octals with prefix 0o (but not 0 by default). (#7691, thanks @icy-arctic-fox)
    • (breaking-change) Restrict some String#to_i arguments to be Bool. (#7436, thanks @j8r)
    • ➕ Add downcase option to String#camelcase. (#7717, thanks @wontruefree)
    • ➕ Add support for unicode 12.0.0. (#7721, thanks @Blacksmoke16)
    • 🛠 Fix Unicode not showing up in the API docs. (#7720, thanks @r00ster91)

    Collections

    Serialization

    Time

    Files

    • (breaking-change) Rename File::DEVNULL to File::NULL. (#7778, thanks @r00ster91)
    • 🛠 Fix handling of files starting with ~ in Path#expand. (#7768, thanks @byroot)
    • 🛠 Fix Dir.glob(match_hidden: false) not hiding hidden files properly. (#7774, thanks @ayazhafiz)

    Networking

    Crypto

    • (breaking-change) Rename Crypto::Bcrypt::Password#== to #verify. (#7790, thanks @asterite)

    Concurrency

    • ➕ Add docs for Channel. (#7673, thanks @j8r)

    Compiler

    • (breaking-change) Fix require relative path resolution. (#7758, thanks @asterite)
    • (breaking-change) Disallow '!' or '?' at the end of the LHS in an assignment. (#7582, thanks @Maroo-b)
    • 👍 Allow running compiler_specs with specific flags. (#7837, thanks @bcardiff)
    • 🛠 Fix extend from generic types. (#7812, thanks @asterite)
    • Don't virtualize types in Union(...) and keep more accurate type information. (#7815, thanks @asterite)
    • 📇 Do not generate debug metadata for arguments of naked functions. (#7775, thanks @eyusupov)
    • 🗄 Detect deprecation on initialize methods and methods with named args. (#7724, thanks @bcardiff)
    • 🛠 Fix track of AST nodes location. (#7827, thanks @asterite)
    • 🛠 Fix offsetof not being usable with macros. (#7703, thanks @malte-v)
    • 👍 Allow parsing of call &.@ivar. (#7754, thanks @asterite)
    • Fix Def#to_s with **options and &block. (#7854, thanks @MakeNowJust)
    • Check pointerof inner expression for errors. (#7755, thanks @asterite)
    • 🛠 Fix some error messages. (#7833, thanks @asterite)
    • 👌 Improve wording of pointerof(self) parser error. (#7542, thanks @r00ster91)
    • 🛠 Fix typo. (#7828, thanks @RX14)

    Language semantics

    • (breaking-change) Fix new/initialize lookup regarding modules. (#7818, thanks @asterite)
    • (breaking-change) Don't precompute sizeof on abstract structs and modules. (#7801, thanks @asterite)
    • Consider macro calls in @ivar initializer. (#7750, thanks @asterite)
    • Give precedence to T.class over Class in method lookup. (#7759, thanks @asterite)
    • 0️⃣ Honor enum base type on non-default values. (#7776, thanks @asterite)
    • Avoid lookup of private def defined inside macro. (#7733, thanks @asterite)
    • 👌 Improve type flow of var in if with &&. (#7785, thanks @asterite)
    • 🛠 Fix handling of NoReturn in if. (#7792, thanks @asterite)
    • 👌 Improve edge issues with while and rescue. (#7806, thanks @asterite)
    • 👌 Improve error on macro call in proc pointer. (#7757, thanks @asterite)
    • 🛠 Fix error on named args forwarding. (#7756, thanks @asterite)
    • Check NoReturn type in named args. (#7761, thanks @asterite)
    • 🛠 Fix internal handling of unbound/abstract generic types. (#7781, thanks @asterite)
    • 🛠 Fix wrong cast to unbound generic type. (#7793, thanks @asterite)
    • 🛠 Fix subclass observer to handle edge case call over generic types. (#7735, thanks @asterite)
    • 🛠 Fix edge case of abstract struct with one subclass. (#7787, thanks @asterite)
    • 👉 Make automatic cast work with with ... yield. (#7746, thanks @asterite)

    Tools

    Formatter

    Others

  • v0.28.0 Changes

    April 17, 2019

    Language changes

    • (breaking-change) Enum declaration members can no longer be separated by a space, only by a newline, ; or ,, the latter being deprecated and reformatted to a newline. (#7607, #7618, thanks @asterite, and @j8r)
    • ➕ Add begin-less and end-less ranges: array[5..]. (#7179, thanks @asterite)
    • ➕ Add offsetof(Type, @ivar) expression. (#7589, thanks @malte-v)

    Macros

    • ➕ Add Type#annotations to list all annotations and not just the last of each kind. (#7326, thanks @Blacksmoke16)
    • ➕ Add ArrayLiteral#sort_by macro method. (#3947, thanks @jreinert)

    Standard library

    • (breaking-change) Allow creating None enum flag with Enum.from_value. (#6516, thanks @bew)
    • (breaking-change) Add deprecation message to PartialComparable. Its behaviour has been fully integrated into Comparable. (#7664, thanks @straight-shoota)
    • 🐎 (performance) Optimize dwarf line numbers decoding. (#7413, thanks @asterite)
    • 🛠 Fix Signal::CHLD.reset not clearing previous handler. (#7409, thanks @asterite)
    • ➕ Add lazy versions of Object.getter? and Object.property? macros. (#7322, thanks @Sija)
    • 👍 Allow returning other values than -1, 0 and 1 by Comparable#<=>. (#7277, thanks @r00ster91)
    • ➕ Add missing require statements to samples in the API docs. (#7564, thanks @Maroo-b)
    • 🛠 Fix example codes in multiple places. (#7569, thanks @maiha)
    • ➕ Add documentation for @[Flags] and @[Link] annotations. (#7665, thanks @bcardiff)
    • ➕ Add documentation for Bool. (#7651, thanks @wontruefree)
    • 🔨 Refactor to avoid usage of the thread-local $errno GLIBC_PRIVATE symbol. (#7496, thanks @felixvf)
    • 🔨 Refactor to have similar signatures accross the stdlib for #to_s and #inspect. (#7528, thanks @wontruefree)

    Numeric

    • (breaking-change) Add deprecation message to Int#/. It will return a Float in 0.29.0. Use Int#// for integer division. (#7639, thanks @bcardiff)
    • 🔄 Change Number#inspect to not show the type suffixes. (#7525, thanks @asterite)
    • Add Int#leading_zeros_count and Int#trailing_zeros_count. (#7520, thanks @Sija)
    • ➕ Add Big*#//, BigInt#&-ops and missing #floor, #ceil, #trunc. (#7638, thanks @bcardiff)
    • 👌 Improve OverflowError message. (#7375, thanks @r00ster91)

    Text

    • 🐎 (performance) Optimize String#compare in case of ASCII only. (#7352, thanks @r00ster91)
    • ➕ Add methods for human-readable formatting of numbers: Number#format, Number#humanize, and Int#humanize_bytes. (#6314, thanks @straight-shoota)
    • ➕ Add String#rchop? and String#lchop?. (#7328, thanks @j8r)
    • ➕ Add options argument to String#camelcase and String#underscore. (#7374, thanks @r00ster91)
    • ➕ Add docs to Unicode::CaseOptions. (#7513, thanks @r00ster91)
    • Improve specs and docs for String#each_line and IO#each_line. (#7419, thanks @straight-shoota)

    Collections

    • (breaking-change) Let Array#sort only use <=>, and let <=> return nil for partial comparability. (#6611, thanks @asterite)
    • (breaking-change) Drop Iterator#rewind. Implement #cycle by storing elements in an array. (#7440, thanks @asterite)
    • 🐎 (performance) Add Enumerable#each_cons support for Deque as a reuse buffer. (#7233, thanks @yxhuvud)
    • 🐎 (performance) Change Range#bsearch / 2 to >> 1 for faster performance. (#7531, thanks @Fryguy)
    • 🛠 Fix Slice#clone for non-primitive types and deep copy. (#7591, thanks @straight-shoota)
    • 🚚 Move Indexable#zip and Indexable#zip? to Enumerable and make it work with any number of Indexable or Iterable or Iterator. (#7453, thanks @asterite)
    • ➕ Add Slice#[](Range). (#7439, thanks @asterite)
    • ➕ Add nillable range fetching #[]?(Range) to Array and String. (#7338, thanks @j8r)
    • ➕ Add Set#add?. (#7495, thanks @Sija)
    • 👌 Improve documentation of Hash regarding ordering of items. (#7594, thanks @straight-shoota)

    Serialization

    • (breaking-change) Change return type of YAML#libyaml_version to SemanticVersion. (#7555, thanks @asterite)
    • 🛠 Fix support for libxml2 2.9.9. (#7477, thanks @asterite)
    • 🛠 Fix support for libyaml 0.2.2. (#7555, thanks @asterite)
    • ➕ Add BigDecimal.from_yaml. (#7398, thanks @Sija)

    Time

    • (breaking-change) Rename Time constructors. Deprecate Time.now to encourage usage Time.utc or Time.local (#5346, #7586, thanks @straight-shoota)
    • (breaking-change) Rename Time#add_span to Time#shift for changing a time instance by calendar units and handle other units. (#6598, thanks @straight-shoota)
    • (breaking-change) Change Time#date to return a Tuple of {year, month, day}. Use Time#at_beginning_of_day if a Time instance is wanted. (#5822, thanks @straight-shoota)
    • 🛠 Fix Windows monotonic time bug. (#7377, thanks @domgetter)
    • 🔨 Refactor Time methods. (#6581, thanks @straight-shoota)

    Files

    • (breaking-change) Remove IO#flush_on_newline and only sync on STDOUT/STDIN/STDERR when they are TTY devices. (#7470, thanks @asterite)
    • ➕ Add Path type. (#5635, thanks @straight-shoota)

    Networking

    (breaking-change) Move HTTP::Multipart to MIME::Multipart. (#7085, thanks @m1lt0n)

    (breaking-change) Stop parsing JSON in OAuth2 errors. (#7467, thanks @asterite)

    (breaking-change) Fix RequestProcessor connection reuse logic. (#7055, thanks @straight-shoota)

    (breaking-change) Replace HTTP.default_status_message_for(Int) with HTTP::Status.new(Int).description. (#7247, thanks @dwightwatson)

    (breaking-change) Fix issues in URI implementation. URI#opaque method is merged into URI#path, which no longer returns Nil. #parse/#to_s normalization and default port handling has changed. (#6323, thanks @straight-shoota)

    🛠 Fix write buffering in OpenSSL sockets. (#7460, thanks @carlhoerberg)

    🛠 Fix leaks in HTTP::Server #bind_* and specs. (#7197, thanks @straight-shoota)

    ➕ Add HTTP::Request#remote_address. (#7610, thanks @asterite)

    ➕ Add HTTP::Status and Response#status. (#7247, #7682, thanks @dwightwatson, and @bcardiff)

    ➕ Add support for OAuth 2.0 resource owner password credentials grant type. (#7424, thanks @Blacksmoke16)

    ➕ Add support for IIS date format in cookies. (#7405, thanks @Sija)

    Allow calls to IO::Syscall#wait_readable and IO::Syscall#wait_writable. (#7366, thanks @stakach)

    🛠 Fix spec of HTTP::Client to not write server response after timeout. (#7402, thanks @asterite)

    🛠 Fix spec of TCP::Server for musl. (#7484, thanks @straight-shoota)

    Crypto

    • (breaking-change) Use OpenSSL::Algorithm instead of symbols for digest/hexdigest. Expose LibCrypt's PKCS5_PBKDF2_HMAC. (#7264, thanks @mniak)

    Concurrency

    System

    Spec

    Compiler

    • 🐎 (performance) Avoid fork and spawn when --threads=1. (#7397, thanks @asterite)
    • 🛠 Fix exception type thrown on missing require. (#7386, thanks @asterite)
    • 🛠 Fix ICE when assigning a constant inside a multi-assign. (#7468, thanks @asterite)
    • 🛠 Fix parsing and behaviour of ->foo.[] and other operators . (#7334, thanks @asterite)
    • 🛠 Fix parsing bug in asm with 3 colons and a variable. (#7627, thanks @r00ster91)
    • 🗄 Opt-in detection of calls to @[Deprecated] methods. (#7596, #7626, #7661, thanks @bcardiff)
    • Add CRYSTAL_LIBRARY_PATH for lookup static libraries. (#7562, thanks @bcardiff)
    • 👌 Improve error messages by adding the scope (and with ... yield scope, if any) on undefined method error. (#7384, thanks @asterite)
    • Suggest next when trying to break from captured block . (#7406, thanks @r00ster91)
    • ➕ Add detection of linux environment in compiler config. (#7479, thanks @straight-shoota)
    • 👍 Pending leftovers to support // and &-ops in multiple places. (#7628, thanks @bcardiff)
    • 🔨 Refactor Crystal::Config.version to use read_file macro. (#7081, thanks @Sija)
    • Rewrite macro spec without executing a shell command. (#6962, thanks @asterite)
    • 🛠 Fix typo in internals. (#7592, thanks @toshokan)

    Language semantics

    • 🛠 Fix issues with as, as? and unions and empty types. (#7475, thanks @asterite)
    • 🛠 Fix method lookup when restrictions of instantiated and non-instantiated generic types are used. (#7537, thanks @bew)
    • 🛠 Fix method lookup when free vars and explicit types are used. (#7536, #7580, thanks @bew)
    • When declaring a protected initialize, define a protected new. (#7510, thanks @asterite)
    • 🛠 Fix named args type matching. (#7529, thanks @asterite)
    • 🔀 Merge procs with the same arguments type and Nil | T return type to Nil return type. (#7527, thanks @asterite)
    • 🛠 Fix passing recursive alias to proc. (#7568, thanks @asterite)

    Tools

    • Suggest the user to run the formatter in travis.yml. (#7138, thanks @KCErb)

    Formatter

    • 🛠 Fix formatting of 1\n.as(Int32). (#7347, thanks @asterite)
    • 🛠 Fix formatting of nested array elements. (#7450, thanks @MakeNowJust)
    • 🛠 Fix formatting of comments and enums. (#7605, thanks @asterite)
    • 🛠 Fix CLI handling of absolute paths input. (#7560, thanks @RX14)

    Doc generator

    Playground

    • 🔄 Change the font-weight used for better readability. (#7552, thanks @Maroo-b)

    Others