CHANGELOG.md in dry-struct-0.4.0 vs CHANGELOG.md in dry-struct-0.5.0

- old
+ new

@@ -1,4 +1,74 @@ +# v0.5.0 2018-05-03 + +## BREAKING CHANGES + +* `constructor_type` was removed, use `transform_types` and `transform_keys` as a replacement (see below) +* Default types are evaluated _only_ on missing values. Again, use `tranform_types` as a work around for `nil`s +* Values are now stored within a single instance variable names `@attributes`, this sped up struct creation and improved support for reserved attribute names such as `hash`, they don't get a getter but still can be read via `#[]` +* Ruby 2.3 is a minimal supported version + +## Added + +* `Dry::Struct.transform_types` accepts a block which is yielded on every type to add. Since types are `dry-types`' objects that come with a robust DSL it's rather simple to restore the behavior of `constructor_type`. See https://github.com/dry-rb/dry-struct/pull/64 for details (flash-gordon) + + Example: evaluate defaults on `nil` values + + ```ruby + class User < Dry::Struct + transform_types do |type| + type.constructor { |value| value.nil? ? Undefined : value } + end + end + ``` + +* `Data::Struct.transform_keys` accepts a block/proc that transforms keys of input hashes. The most obvious usage is simbolization but arbitrary transformations are allowed (flash-gordon) + +* `Dry.Struct` builds a struct by a hash of attribute names and types (citizen428) + + ```ruby + User = Dry::Struct(name: 'strict.string') do + attribute :email, 'strict.string' + end + ``` + +* Support for `Struct.meta`, note that `.meta` returns a _new class_ (flash-gordon) + + ```ruby + class User < Dry::Struct + attribute :name, Dry::Types['strict.string'] + end + + UserWithMeta = User.meta(foo: :bar) + + User.new(name: 'Jade').class == UserWithMeta.new(name: 'Jade').class # => false + ``` + +* `Struct.attribute` yields a block with definition for nested structs. It defines a nested constant for the new struct and supports arrays (AMHOL + flash-gordon) + + ```ruby + class User < Dry::Struct + attribute :name, Types::Strict::String + attribute :address do + attribute :country, Types::Strict::String + attribute :city, Types::Strict::String + end + attribute :accounts, Types::Strict::Array do + attribute :currency, Types::Strict::String + attribute :balance, Types::Strict::Decimal + end + end + + # ^This automatically defines User::Address and User::Account + ``` + +## Fixed + +* Adding a new attribute invalidates `attribute_names` (flash-gordon) +* Struct classes track subclasses and define attributes in them, now it doesn't matter whether you define attributes first and _then_ subclass or vice versa. Note this can lead to memory leaks in Rails environment when struct classes are reloaded (flash-gordon) + +[Compare v0.4.0...v0.5.0](https://github.com/dry-rb/dry-struct/compare/v0.4.0...v0.5.0) + # v0.4.0 2017-11-04 ## Changed * Attribute readers don't override existing instance methods (solnic)