## crystal-lang/crystal — v0.24.1…v1.17.1

_5884+ commits._

### Features
- **Add debug locations to metaclass nodes and `typeof` (#15971)** (26ec4fb)
- **Add file name to file-private generic instance metaclass types during codegen (#15974)** (d23f466)
- **Add location info to `MacroVar` nodes (#15947)** (7498b3c)
- **Add `Thread::Local(T)` (#15616)** (8fda88f)
- **Add `Time::Location#{to,from}_{json,yaml}` (#15939)** (e4d6a1d)
- **Add documentation for `Crypto::Bcrypt::Password#to_s` (#15935)** (abf9cb4)
- **Support `{% elsif %}` when stringifying `MacroIf` nodes (#15928)** (08940fc)
- **Add `XML CI` workflow (#15923)** (edc2cc6)
- **Add `Struct.pre_initialize` (#15896)** (23d92eb)
- **Support `elsif` when stringifying `If` nodes (#15918)** (f66114d)
- **Add `Colorize.default_enabled?` (#15912)** (a50c2da)
- **Add ameba (#15875)** (46a5f13)
- **Support POSIX TZ strings in TZif databases (#15863)** (4a6169b)
- **Add file name to file-private virtual types during codegen (#15897)** (5acf3d4)
- **Support Windows system time zone transitions in all years (#15891)** (21114e4)
- **Add trailing newlines (#15870)** (5ccf2ff)
- **Add `truncate_at_null` parameter to `String.new(Bytes)` and `.from_utf16` (#15887)** (bff5068)
- **Add `Path.from_json_object_key` (#15877)** (360032d)
- **Support arbitrary `IO`s in `Spec::CLI` (#15882)** (148e1b3)
- **Add build steps for `spec/std/data/zoneinfo.zip` (#15831)** (631c7e6)
- **Add links to language specification in docs for pseudo methods (#15864)** (7f49024)
- **Add `String#ensure_suffix` and `String#ensure_prefix` (#15782)** (1f5f366)
- **Support `--x86-asm-syntax` for emitting Intel style assembly (#15612)** (d7ff4b6)
- **Add specialized implementations for `Float#infinite?` and `#nan?` (#15813)** (463eca1)
- **Add `Float::Primitive#sign_bit` (#15830)** (55a7cc4)
- **Support pretty printing of `XML` types (#15833)** (600a7d9)
- **Add `YAML::Builder#start_document(*, implicit_start_indicator)` (#15835)** (05ac71c)
- **Support POSIX TZ environment variable strings (#15792)** (d733333)
- **Add `Crystal::System.wstr_literal` on Windows (#15747)** (b7c8760)
- **Add `BigRational#to_i` (#15809)** (752c525)
- **Add support for IPv6 scoped addresses (RFC4007) (#15263)** (92048a8)
- **[CI] Add CI workflow for MinGW-w64 ARM64 builds (#15794)** (03db7b1)
- **Support LLVM 21.0 (development branch) (#15771)** (655e7e4)
- **Support debug info of 128-bit enum members (#15770)** (445ef91)
- **Add fallback if `__crystal_raise_cast_failed` is missing (#15762) (#15769)** (3c0d450)
- **Add fallback if `__crystal_raise_cast_failed` is missing (#15762)** (1887c81)
- **Add type restrictions to `Digest` (#15696)** (f6062f2)
- **Add extra `Digest.update` overloads for `Bytes` (#15736)** (5402259)
- **Add `Crystal::EventLoop::FileDescriptor#open` (#15750)** (2bcadcd)
- **Add end locations for `Case`, `Asm`, and `Select` (#15452)** (4fa328c)
- **Add test for `HTTP::Request` with resource string `//` (#15546)** (93c54bd)

### Fixes
- **Fix unclosed codeblock in `__crystal_pseudo_alignof` docs (#15945)** (a1837ab)
- **Fix: XML::TextReader must keep IO object reference (#15933)** (a356267)
- **Fix libxml manual memory management (#15906)** (7f0f956)
- **Fix IANA time zone names for Windows system time zones (#15914)** (7487b31)
- **Fix: thread specs must test Thread, not Fiber::ExecutionContext::Isolated (#15909)** (63650d7)
- **Fix interpreter guard clauses for signal handling (#15892)** (c5af983)
- **Fix typos and add `typos` integration (#15873)** (5660920)
- **Fix: race condition in `Fiber::ExecutionContext::Isolated#wait` (#15872)** (3c74705)
- **Makefile: Fix target location for `install_docs` (#15853)** (9a89f47)
- **Fix Lint/LiteralInCondition: replace condition literals with nilable cast (#15844)** (d0866a4)
- **Fix duplicate keys in hash literals (#15843)** (b677e0b)
- **Fix Lint/LiteralInInterpolation: formatter specs with string interpolation (#15842)** (870c204)
- **Fix `Time::Location::InvalidTZDataError` dropping default message (#15824)** (03c56c4)
- **Fix `Float32#abs` for signed zeros (#15814)** (ab30482)
- **Fix stringification of `Not` as call receiver (#15801)** (f74f2c5)
- **Fix `BigFloat#format` not compiling (#15796)** (ba34749)
- **Fix calling `Fiber::ExecutionContext#enqueue` from bare thread (#15767)** (7a24a48)
- **Fix `scripts/release-update.sh` idempotent previous CHANGELOG entry (#15731)** (f6be44b)
- **Fix `Crystal::EventLoop::LibEvent` and `FiberExecutionContext`  integration (#15743) (#15759)** (4b59abc)
- **Fix `Array#|` for different item types (#15756)** (c0e04e3)
- **Fix raise on manual fiber resume from sleep (#15744)** (20f67be)
- **Fix cleanup of one-to-many assignment with untyped RHS (#15755)** (2c58875)
- **Fix Crystal::EventLoop::LibEvent and FiberExecutionContext integration (#15743)** (6341b57)
- **Fix `Path#relative_to` for non-normalized anchor (#15737)** (48f3c1e)

### Backend
- **Changelog for 1.17.1 (#16009)** (19be240)
- **Revert "Handle doc locations when file is in parent directory (#15898)" (#15996)** (43b7b49)
- **Fixup changelog for 1.17.0 [fixup #15900] (#15983)** (d2c705b)
- **Changelog for 1.17.0 (#15900)** (04ca57e)
- **Improve docs for `Socket` and `IO::FileDescriptor` handles (#15977)** (983e59d)
- **Allow-list Crystal's funding.json from the project (#15969)** (c2e3aef)
- **Clear debug location of top-level implicit return (#15972)** (e6638ef)
- **Update cygwin/cygwin-install-action action to v6 (#15965)** (b07157e)
- **Rename execution contexts + improve their docs (#15936)** (7738038)
- **Improve docs for `OpenSSL::Cipher` (#15964)** (c5f8858)
- **Clarify docs in regards to what `be_nil` expectation does (#15954)** (523bb2f)
- **Update korthout/backport-action action to v3.2.1 (#15949)** (f8877f8)
- **Update typos 1.34.0 (#15950)** (d0e6be2)
- **Let the event loop decide the blocking mode of `File` (#15930)** (1ca6be6)
- **Extract `XML::Document` from `XML::Node` (#15920)** (1edc082)
- **Remove forgotten debug `puts` call (#15942)** (036ed25)
- **Replace type-id function with lookup table (#15904)** (e35977c)
- **Better handle coverage reporting of `MacroIf` nodes with _only_ `MacroLiteral` bodies (#15938)** (8096f04)
- **Set `IO::Stapled.pipe` blocking args to nil, same as `IO.pipe` (#15925)** (20924bb)
- **Macro code coverage tool (#15738)** (34875ff)
- **Update library versions for MSVC CI (#15921)** (33f016f)
- **Allow expressions after non-trailing `if` `MacroExpression` (#15917)** (cb264e3)
- **Stringify `MacroIf` `unless` nodes (#15919)** (d55093f)
- **Update GH Actions (#15668)** (a296201)
- **XML: modernize API when available & workaround issues with legacy versions (#15899)** (4505f4f)
- **Simplify codegen of mixed-type checked integer addition and subtraction (#15878)** (cd78c4b)
- **Handle doc locations when file is in parent directory (#15898)** (be7f0af)
- **Improve docs for `String#lines` and `#each_line` (#15894)** (649915d)
- **Prevent leaking memory when `exec_recursive`'s block raises (#15893)** (268c7cb)
- **Improve whitespace handling in `Time::Format` (#15890)** (8be0116)
- **Make `Colorize.on_tty_only!` the default behavior (#15881)** (4581c8e)
- **Require `NO_COLOR` to be non-empty (#15880)** (dd9d7ef)
- **Improve error message for `pointerof` (#15876)** (2973cd2)
- **Turn `SystemError.from_errno` into a macro (#15874)** (cefe508)
- **Do not consider type in `Crystal::Var#==` (#15884)** (70431fb)
- **Replace some lookup hashes in `Spec` with exhaustive cases (#15879)** (cd2dd0e)
- **Replace `is_a?` calls with convenient alternatives (#15860)** (b987c1f)
- **Simplify specs for string comparison (#15868)** (5820021)
- **Remove trailing whitespace (#15869)** (fdcb4cb)
- **Use `be_nil` and `be_true`/`be_false` everywhere in specs (#15867)** (652d9a9)
- **Move most POSIX TZ string functionality to a module (#15866)** (d5c8962)
- **Use full path to Inno Setup on MSVC CI (#15861)** (31a9906)
- **Remove useless condition literal (#15859)** (96bf61e)
- **Ensure unary `Float32#-` and `Float64#-` flip sign bit (#15857)** (4a073fa)
- **[CI] Set up Inno Setup explicitly on MSVC CI (#15851)** (08e6b24)
- **Replace some `not_nil!` calls with bang methods (#15847)** (da8429f)
- **Remove shadowed method arguments (#15846)** (f923607)
- **Remove unused code (#15845)** (544a786)
- **Apply performance improvement suggestions from ameba (#15839)** (2acc806)
- **Expose error message from libyaml on emitter errors (#15841)** (9a8507a)
- **Suspend Windows processes until job objects are set up (#15850)** (a45a78d)
- **Skip `src/termios.cr` on Windows (#15852)** (be3f7a2)
- **Update Windows zone names using local database (#15837)** (f03affd)
- **Optimize slice literal codegen on LLVM 21 (#15803)** (730db20)
- **Improve the TZif database file parser (#15825)** (3398137)
- **Refactor `IO.pipe` blocking mode (#15823)** (d9aac36)
- **Do not print adjacent nodes in `Thread::LinkedList#inspect` (#15829)** (a45132a)
- **Pick TCP and UDP local ports differently in socket specs (#15828)** (f1b70b6)
- **Avoid calling `chars.size` on `String`s (#15822)** (c16d805)
- **Replace some uses of `sprintf` with justification methods (#15821)** (e02660e)
- **Cleanup parser specs (#15446)** (b33ad7f)
- **Combine the decimal number printing implementations (#15815)** (9d6c342)
- **Expose `HTTP::Request#uri` (#15816)** (d4088a5)
- **Simplify `Crystal::System::Fiber::RESERVED_STACK_SIZE` initializer on Windows (#15820)** (9e68a1d)
- **Refactor `Socket` blocking mode (#15804)** (ef2b8fe)
- **Use `CMAKE_MSVC_RUNTIME_LIBRARY` for the MSVC PCRE2 static library (#15802)** (bc46ac2)
- **Preserve precision when passing `BigDecimal` or `BigFloat` to `sprintf` `%i` (#15808)** (a95371c)
- **Use `Slice` literals in `Crypto::Bcrypt` (#15781)** (7d4f904)
- **Drop the static LLVM libraries on Windows MSVC CI (#15797)** (900621a)
- **Never output exponent in `BigDecimal#format` (#15795)** (a0279f0)
- **Update previous Crystal release 1.16.3 (#15773)** (3128c35)
- **Merge remote-tracking branch 'release/1.16' into master** (ecfff94)
- **Use `UInt64` to track iteration count during warm-up calculation in `Benchmark::IPS` (#15780)** (fc444b6)
- **`Crystal::EventLoop::FileDescriptor#open` now sets the non/blocking flag (#15754)** (3d1ffcc)
- **Allow `LLVM_VERSION` override inside `Makefile` (#15765)** (8b71775)
- **Changelog for 1.16.3 (#15758)** (3f369d2)
- **Drop `to_a` in expectations with `Slice` (#15735)** (534d41a)
- **Split `StaticFileHandler#call` into structured components (#15678)** (505ebed)
- **Use slice literals for `String::CHAR_TO_DIGIT` and `CHAR_TO_DIGIT62` (#15745)** (2b36079)
- **Ask system to decide non-blocking `IO::FileDescriptor` (win32) (#15753)** (cb04e18)
- **Remove type binding on `T` for `Pointer(T)#value=` (#15751) (#15757)** (bdc1607)
- **Update Windows zone names (#15728)** (d0a57a3)
- **Document `Crystal::Macros::StringLiteral#to_utf16` (#15748)** (d62c9bf)
- **Do not use private linkage for slice literal buffers (#15746)** (abd6980)
- **Remove type binding on `T` for `Pointer(T)#value=` (#15751)** (319d7e7)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/crystal-lang/crystal?utm_source=github-action)._