Skip to content

Releases: disneystreaming/smithy4s

v0.16.5 : critical bug fixes

19 Oct 09:05
815426b
Compare
Choose a tag to compare

This release contains fixes of critical bugs that could lead to memory leaks in the user applications (depending on usage patterns).

The memory leak was introduced when we applied memoization in #455, which was an effort to reduce the memory footprint of Smithy4s on large APIs reusing the same datatypes all over the place. Unfortunately, we later realised that global memoization was unsafe, due to the instability of smithy4s.schema.Schema (a GADT that contains thunks and lambda, and therefore is unstable wrt hashCode/equality and only responds to referential equality). The memory leak would happen every time the Smithy4s-routing would be stored in a def that would re-execute on a per-request basis (which, really, was a user-side mistake, but it wouldn't be professional for us to leave a potential memory leak when the language doesn't give us the means to guarantee the user won't shoot themselves in the foot).

We didn't want to rollback the memoization, because a few applications we have internally at DisneyStreaming massively benefited from it, on the account of having large APIs with hundreds (if not thousand) datatypes. The memoization we had put in place has greatly helped the startup time of these applications, and their memory consumption, so just rolling back was not an option.

Instead, we've decided to take the time to apply a proper fix, and scope the memoization to the lifecycle of interpreters. This means that interpreters are responsible for instantiating their own Schema compilation cache, which gets GC'd when the interpreter is discarded.

Bug fixes

  • Changes the memoization mechanism that could lead to memory leaks. Now memoization requires the injection of a cache instance, which is locally instantiated by http4s interpreters.
  • Addresses a few bugs in the hint transformation function on schemas
  • Discourages the inspection of the alternative contained by Alt.WithValue, in favour of using the Alt.Dispatcher instance, which takes care of memoization for the implementor and offers a type-safe API. Alt.WithValue is only ever-used on the encoding side of codecs, and Alt.Dispatcher solves that exact problem in an arguably more elegant fashion.
  • Improve performance of erroring paths by memoizing the compilation of error schemas in the Http4s interpreter
  • Applies the hint mask transitively in JsonCodecs (instead of locally).

What's Changed

  • Fix hint transformations and adds a test suite by @Baccata in #524
  • Move to coursier/setup-action by @daddykotex in #528
  • Removing hint transformation in union's "total" function ... by @Baccata in #526
  • Apply hint mask transitively in json codecs by @kubukoz in #521
  • Amends the caching mechanism to avoid relying on global variables by @Baccata in #514

Full Changelog: v0.16.4...v0.16.5

v0.16.4

15 Oct 16:00
fa03651
Compare
Choose a tag to compare

Bug fixes, user-facing changes

Add missing config scopes in codegen by @kubukoz in #502

Fixes a bug where generating code in additional sbt configurations (e.g. Test) would break caching and result in redundant code generation.

Adding stuff that's generated under T.sources is problematic by @daddykotex in #507

Fixes an infinite loop caused by a bug in the Mill plugin.

protocol: support given import in refinements by @ahjohannessen in #508

Adds support for given (Scala 3 import syntax for givens) in Smithy4s refinements.

Add Server test for @httpRequestTests by @daddykotex in #510

Adds support for running server tests as part of the "compliance tests" feature initially started in 0.16.3.

Internal changes, library updates

New Contributors

Full Changelog: v0.16.3...v0.16.4

v0.16.3 - bug fixes, improvements

07 Oct 23:05
71fbf89
Compare
Choose a tag to compare

Bug fixes, user-facing changes

Generate tests from test traits by @daddykotex in #424

image

This is a huge improvement for Smithy4s and its participation in the Smithy ecosystem in general - now it is possible to test your implementation of a HTTP client against tests provided by the protocol implementation. It will be hugely helpful when we get to the implementation of @restJson1 support. If you're implementing support for a protocol, check out the docs for this feature.

Server-side support is in the plans - keep an eye out for future releases.

Add smithy4s models to upstream model validation by @Baccata in #462

This resolves an issue in sharing specifications where smithy4s's own Smithy models wouldn't be seen by the code generation process in some cases.

Decline: add native support by @kubukoz in #475

The Decline module now supports Scala Native.

Added ModelTransformer to flatten and merge all mixins in the model by @yisraelU in #463

This fixes an issue in the dynamic module, so that it correctly handles mixins and apply in the model .

Fix codegen resource outputs for Smithy files in subdirectories by @kubukoz in #485

Fixes an issue with generating sources from Smithy files located in sub-directories of the main Smithy input directory (regression from earlier 0.16.x releases). The PR introduced a regression but it's been since fixed in #495 by @kubukoz.

Remove stale generated resource directories by @kubukoz in #487

Fixes an issue where a module's codegen might break after changes in its dependencies.

Adds Service as class member to Client builder by @yisraelU in #477

Mostly useful for extending the client builder - the service member of the builder is now exposed as a field.

Opt out of local dependencies by @kubukoz in #491

Adds the ability to opt out of the feature introduced in #432 (smithy4s v0.16.1) If you don't want your module's dependencies to be compiled before you can generate code, you can make that so - check out the docs.

Fix unicode escapes in generated strings by @kubukoz in #499

Fixes an issue where some generated code wouldn't be runnable on Scala Native (namely, DynamoDB's AutoScalingRoleArn).

Bump up smithy version from 1.24.0 to 1.25.1 by @valydia in #478

Internal changes

Library updates

New Contributors

Full Changelog: v0.16.2...v0.16.3

v0.16.2 - more Scala Native support, fix AWS timestamp issue

27 Sep 00:36
e0626b4
Compare
Choose a tag to compare

In this release, we've added support for Scala Native in the http4s integration module, as well as the (still experimental) AWS modules. This is thanks to the work of @armanbilge et al. on bringing the Typelevel world closer to the Native world.

Additionally, a regression in timestamp formatting for AWS has been fixed (#471), so your JVM/JS/Native apps should be able to talk to (a subset of) AWS services again. Give it a try!

What's Changed

Full Changelog: v0.16.1...v0.16.2

v0.16.1: Sharing specs, Mill support & more

16 Sep 18:26
f0ecffb
Compare
Choose a tag to compare

NOTE: Use 0.16.1 not 0.16.0, the latter is a botched release that only contains a subset of the changes.

This release is huge! Thanks to all the contributors.

The 0.16.1 release breaks both source and binary compatibility.

At a high level, here are the changes you can look forward to in the release:

Support for the @httpResponseCode trait - #377

You can mark a member of your output structure with @httpResponseCode and expect smithy to use that value when rendering a http response, on the server, or to fill that value from the response status code, on the client.

Support for sharing specifications across modules (sbt or mill) (similar to how you depend on another module Scala code in sbt with the dependsOn setting) - #432

Multiple people came naturally to this kind of project setup where you have multiple module and you may want to have common code and specification live a given module that your other modules depends on. With this release, it's totally doable. See this page for more information

Mill support - #450

Now your mill modules can also use Smithy4s code generation. See this page for more information.

Decline integration is effect-agnostic - #429

Previous version use CommandIOApp which requires cats.effect. 0.16.1 version will allow you to use the effect system of your choice.

Builder pattern to create your clients - #447

New API looks like:

SimpleRestJsonBuilder(HelloWorldService)
    .client(client)
    .uri(Uri.unsafeFromString("http://localhost:9000"))
    .resource

More details below.

What's Changed

Full Changelog: v0.15.3...v0.16.1

v0.15.3 - bug fixes, customization for default rendering

08 Sep 14:11
024be74
Compare
Choose a tag to compare

This release brings several fixes to bugs we've found in the previous ones. Notable changes:

Allow customizing the rendering of default values (#414)

This adds the ability to change how default values appear in the generated sources. Take a look at the documentation for more!

Fixes to defaults in mixins - #423, #425

Fixes some issues that you could encounter in situations where you're generating code for a structure with default values inherited from a mixin.

Collision detection #412

Fixes some issues with code generation where a name conflicts with the Scala standard library.

Exhaustively capture the codegen input for cache invalidation #438

Helps avoid the issues where codegen wouldn't be triggered after the inputs are changed.

Other changes

Full Changelog: v0.15.2...v0.15.3

v0.15.2 - CLI module, bugfixes, dynamic module improvements

24 Aug 17:34
c9839db
Compare
Choose a tag to compare

This release adds a new module - decline - providing integration with the Decline library. It provides the ability to easily get a command line interface for any service implementation or client.

Additionally, the release fixes a couple bugs like #389, as well as adding support for Smithy 2.0 enum and intEnum shapes in the Dynamic module.

This release enables a previously disabled feature of the http4s clients&servers (as well as other code using the json module's codec support) - encoding intEnum as a JSON number.

Finally, MiMa checks have been enabled, so we'll track binary compatibility more seriously in future releases.

Full changelog

New Contributors

Full Changelog: v0.15.1...v0.15.2

v0.15.1 - Initialization bug fix

19 Aug 03:40
71d70db
Compare
Choose a tag to compare

Following the introduction of refinements a bug slipped in. It's a tricky one that only shows up at runtime, under some conditions. See #383 and related PR for more info.

What's Changed

Full Changelog: v0.15.0...v0.15.1

v0.15.0 : Smithy 2.0 support, custom type refinements

18 Aug 10:26
b96cc5b
Compare
Choose a tag to compare

The 0.15.0 release breaks both source and binary compatibility

This is a very exciting release for us, as it makes Smithy4s compatible with Smithy 2.0

Highlights

Adds support for smithy 2.0, which brings a number of very interesting features. In particular :

  • mixins, which allow to drastically DRY your specifications when multiple shapes share a number of elements
  • defaults, which allow to specify default values for the fields of your structure types
  • enums/int enums, which make enumerations a lot nicer to write/read in smithy

Adds support for custom refinements

This provides a mechanism for the user to plug some datatypes of their own in the generated code. These can be validated against
user-defined rules, via an implicit instance provided by the user (or a third party). Smithy4s forces this customisation to be driven by smithy traits, which allow specifications to retain a formally-indicative nature of the behaviour of APIs. These refinements are wired in all decoding logic exercised by smithy4s, which means they are taken into account whether the data is found in headers, query parameters, path parameters, or bodies of the http requests/responses.

See the documentation for more details.

Better collision avoidance in the rendered code

Some care has been put in the generated code to facilitate collision avoidance between what exists and what is generated, without relying on fully-qualified-names by default. Although there may still be edge cases, this approach means the generated code retains a reasonably pleasant-to-read nature, which we have found to be important to users.

Fixes

  • When the @jsonName trait is used on structure members, potential error messages should expose the correct expectations
  • Fixes an issue that would lead clients to decode error payloads as the wrong error type

What's Changed

Full Changelog: v0.14.2...v0.15.0

v0.14.2: more efficient parsing of json objects/arrays

19 Jul 11:16
75f4242
Compare
Choose a tag to compare

Highlights :

  • More efficient parsing of json objects/arrays. As usual, kudos to @plokhotnyuk for his amazing work on optimising the json parsing.
  • It's now easier to set up smithy4s in other SBT configurations than Compile. See here

What's Changed

Full Changelog: v0.14.1...v0.14.2