Skip to content
Branch: master
Find file Copy path
Find file Copy path
4 contributors

Users who have contributed to this file

@flash-gordon @solnic @Kukunin @GustavoCaso
243 lines (160 sloc) 8.15 KB

1.0.0 2019-04-23


  • valid? and === behave differently, === works the same way Class#=== does and valid? checks if the value can be coerced to the struct (flash-gordon)


  • now accepts an optional block that will be called on failed coercion. This behavior is consistent with dry-types 1.0. Note that .new doesn't take a block (flash-gordon)
    User = Dry::Struct(name: 'string')
    User.(1) { :oh_no }
    # => :oh_no

Compare v0.7.0...v1.0.0

0.7.0 2019-03-22


  • [BREAKING] Struct.input was renamed Struct.schema, hence Struct.schema returns an instance of Dry::Types::Hash::Schema rather than a Hash. Schemas are also implementing Enumerable but they iterate over key types. New API:
    User.schema.each do |key|
      puts "Key name: #{ }"
      puts "Key type: #{ key.type }"
    To get a type by its name use .key:
    User.schema.key(:id) # => #<Dry::Types::Hash::Key ...>
  • [BREAKING] transform_types now passes one argument to the block, an instance of the Key type. Combined with the new API from dry-types it simplifies declaring omittable keys:
    class StructWithOptionalKeys < Dry::Struct
      transform_types { |key| key.required(false) }
      # or simply
  • Dry::Stuct#new is now more efficient for partial updates (flash-gordon)
  • Ruby 2.3 is EOL and not officially supported. It may work but we don't test it.

Compare v0.6.0...v0.7.0

v0.6.0 2018-10-24


  • [BREAKING] Struct.attribute? in the old sense is deprecated, use has_attribute? as a replacement


  • Struct.attribute? is an easy way to define omittable attributes (flash-gordon):

    class User < Dry::Struct
      attribute  :name,  Types::Strict::String
      attribute? :email, Types::Strict::String
    # 'John') # => #<User name="John">


  • Struct#to_h recursively converts hash values to hashes, this was done to be consistent with current behavior for arrays (oeoeaio + ZimbiX)

Compare v0.5.1...v0.6.0

v0.5.1 2018-08-11


  • Constant resolution is now restricted to the current module when structs are automatically defined using the block syntax. This shouldn't break any existing code (piktur)


  • Pretty print extension (ojab)
     address=#<Test::Address city="NYC", zipcode="123">>

Compare v0.5.0...v0.5.1

v0.5.0 2018-05-03


  • 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 nils
  • 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


  • 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 for details (flash-gordon)

    Example: evaluate defaults on nil values

    class User < Dry::Struct
      transform_types do |type|
        type.constructor { |value| value.nil? ? Undefined : value  }
  • 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)

    User = Dry::Struct(name: 'strict.string') do
      attribute :email, 'strict.string'
  • Support for Struct.meta, note that .meta returns a new class (flash-gordon)

    class User < Dry::Struct
      attribute :name, Dry::Types['strict.string']
    UserWithMeta = User.meta(foo: :bar) 'Jade').class == '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)

      class User < Dry::Struct
        attribute :name, Types::Strict::String
        attribute :address do
          attribute :country, Types::Strict::String
          attribute :city, Types::Strict::String
        attribute :accounts, Types::Strict::Array do
          attribute :currency, Types::Strict::String
          attribute :balance, Types::Strict::Decimal
      # ^This automatically defines User::Address and User::Account


  • 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

v0.4.0 2017-11-04


  • Attribute readers don't override existing instance methods (solnic)
  • Struct#new uses raw attributes instead of method calls, this makes the behavior consistent with the change above (flash-gordon)
  • constructor_type now actively rejects :weak and :symbolized values (GustavoCaso)


  • Struct#new doesn't call .to_hash recursively (flash-gordon)

Compare v0.3.1...v0.4.0

v0.3.1 2017-06-30


  • Struct.constructor that makes dry-struct more aligned with dry-types; now you can have a struct with a custom constructor that will be called before calling the new method (v-kolesnikov)
  • Struct.attribute? and Struct.attribute_names for introspecting struct attributes (flash-gordon)
  • Struct#__new__ is a safe-to-use-in-gems alias for Struct#new (flash-gordon)

Compare v0.3.0...v0.3.1

v0.3.0 2017-05-05


  • Dry::Struct#new method to return new instance with applied changeset (Kukunin)


  • .[] and .call does not coerce subclass to superclass anymore (Kukunin)
  • Raise ArgumentError when attribute type is a string and no value provided is for new (GustavoCaso)


  • .new without arguments doesn't use nil as an input for non-default types anymore (flash-gordon)

Compare v0.2.1...v0.3.0

v0.2.1 2017-02-27


  • Fixed Dry::Struct::Value which appeared to be broken in the last release (flash-gordon)

Compare v0.2.0...v0.2.1

v0.2.0 2016-02-26


  • Struct attributes can be overridden in a subclass (flash-gordon)

Compare v0.1.1...v0.2.0

v0.1.1 2016-11-13


  • Make Dry::Struct act as a constrained type. This fixes the behavior of sum types containing structs (flash-gordon)

Compare v0.1.0...v0.1.1

v0.1.0 2016-09-21


  • :strict_with_defaults constructor type (backus)


  • [BREAKING] :strict was renamed to :permissive as it ignores missing keys (backus)
  • [BREAKING] :strict now raises on unexpected keys (backus)
  • Structs no longer auto-register themselves in the types container as they implement Type interface and we don't have to wrap them in Type::Definition (flash-gordon)

Compare v0.0.1...v0.1.0

v0.0.1 2016-07-17

Initial release of code imported from dry-types

You can’t perform that action at this time.