Skip to content

Releases: dry-rb/dry-struct

v1.1.1

13 Oct 11:21
v1.1.1
e1fc3f0
Compare
Choose a tag to compare

1.1.1 2019-10-13

Changed

  • Pattern matching syntax is simplified with deconstruct_keys (k-tsj)

    User = Dry.Struct(name: 'string', email: 'string')
    
    user = User.new(name: 'John Doe', email: '[email protected]')
    
    case user
    in User(name: 'John Doe', email:)
      puts email
    else
      puts 'Not John'
    end

    See more examples in the specs.

Compare v1.1.0...v1.1.1

v1.1.0

07 Oct 09:35
v1.1.0
66fb7cc
Compare
Choose a tag to compare

1.1.0 2019-10-07

Added

  • Experimental support for pattern matching 🎉 (flash-gordon)

    User = Dry.Struct(name: 'string', email: 'string')
    
    user = User.new(name: 'John Doe', email: '[email protected]')
    
    case user
    in User({ name: 'John Doe', email: })
      puts email
    else
      puts 'Not John'
    end

    See more examples in the specs.

Compare v1.0.0...v1.1.0

v1.0.0

07 Oct 09:34
v1.0.0
d8af8b9
Compare
Choose a tag to compare

1.0.0 2019-04-23

Changed

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

Added

  • Struct.call 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

v0.7.0

22 Mar 13:55
v0.7.0
c8e7409
Compare
Choose a tag to compare

0.7.0 2019-03-22

Changed

  • [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: #{ key.name }"
      puts "Key type: #{ key.type }"
    end
    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
      transform_types(&:omittable)
    end
  • 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

22 Mar 13:54
v0.6.0
5069d4b
Compare
Choose a tag to compare

v0.6.0 2018-10-24

Changed

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

Added

  • 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
    end
    # User.new(name: 'John') # => #<User name="John">

Fixed

  • 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

11 Aug 11:47
v0.5.1
146c3cd
Compare
Choose a tag to compare

v0.5.1 2018-08-11

Fixed

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

Added

  • Pretty print extension (ojab)
    Dry::Struct.load_extensions(:pretty_print)
    PP.pp(user)
    #<Test::User
     name="Jane",
     age=21,
     address=#<Test::Address city="NYC", zipcode="123">>

Compare v0.5.0...v0.5.1

v0.5.0

03 May 15:18
v0.5.0
cf953e1
Compare
Choose a tag to compare

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

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 #64 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  }
      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)

    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)

    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)

      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

v0.4.0

04 Nov 17:31
v0.4.0
f333867
Compare
Choose a tag to compare

v0.4.0 2017-11-04

Changed

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

Fixed

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

Compare v0.3.1...v0.4.0

v0.3.1

30 Jun 10:06
v0.3.1
71dca07
Compare
Choose a tag to compare

Added

  • 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

05 May 21:50
v0.3.0
843c4b0
Compare
Choose a tag to compare

Added

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

Fixed

  • .[] 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)

Changed

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

Compare v0.2.1...v0.3.0