dry-rb / dry-types

Flexible type system for Ruby with coercions and constraints
https://dry-rb.org/gems/dry-types
MIT License
861 stars 134 forks source link

Undefined method after upgrading dependencies. #451

Closed coding-red-panda closed 1 year ago

coding-red-panda commented 1 year ago

Describe the bug

Upgraded dry-core and dry-logic during some maintenance, dry-types remained the same, but suddenly the entire framework stopped working because of the following error:

Failure/Error: require 'dry-types'

NoMethodError:
  undefined method `build' for Dry::Logic::Rule::Predicate:Class

            Logic::Rule::Predicate.build(
                                  ^^^^^^

To Reproduce

Expected behavior

Expect that dry-types still works as expected. The fix was to manually require dry-logic before dry-types

My environment

flash-gordon commented 1 year ago

You'll need to upgrade dry-core to 1.0+.

coding-red-panda commented 1 year ago

You'll need to upgrade dry-core to 1.0+.

neither dry-types or dry-struct has that as a requirement, which are the two gems I am using. If they pull in dry-logic and dry-core, shouldn't they set the requirement then to >= 1.0 instead of ~> 0.9, >= 0.9 ?

This is from the Gemfile.lock:

    dry-container (0.11.0)
      concurrent-ruby (~> 1.0)
    dry-core (0.9.1)
      concurrent-ruby (~> 1.0)
      zeitwerk (~> 2.6)
    dry-inflector (0.3.0)
    dry-logic (1.3.0)
      concurrent-ruby (~> 1.0)
      dry-core (~> 0.9, >= 0.9)
      zeitwerk (~> 2.6)
    dry-struct (1.4.0)
      dry-core (~> 0.5, >= 0.5)
      dry-types (~> 1.5)
      ice_nine (~> 0.11)
    dry-types (1.5.1)
      concurrent-ruby (~> 1.0)
      dry-container (~> 0.3)
      dry-core (~> 0.5, >= 0.5)
      dry-inflector (~> 0.1, >= 0.1.2)
      dry-logic (~> 1.0, >= 1.0.2)

And this is the .gemspec:

  spec.add_dependency 'dry-struct', '~> 1.4.0'
  spec.add_dependency 'dry-types', '~> 1.5.1'

Bundle Info

 olivar@Arnes-MacBook-Pro  ~/RubymineProjects/ktool   coding-bunny/update-inkycop  bundle info dry-core
  * dry-core (0.9.1)
        Summary: A toolset of small support modules used throughout the dry-rb ecosystem
        Homepage: https://dry-rb.org/gems/dry-core
        Source Code: https://github.com/dry-rb/dry-core
        Changelog: https://github.com/dry-rb/dry-core/blob/main/CHANGELOG.md
        Bug Tracker: https://github.com/dry-rb/dry-core/issues
        Path: /Users/olivar/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/dry-core-0.9.1
        Reverse Dependencies: 
                dry-logic (1.3.0) depends on dry-core (~> 0.9, >= 0.9)
                dry-struct (1.4.0) depends on dry-core (~> 0.5, >= 0.5)
                dry-types (1.5.1) depends on dry-core (~> 0.5, >= 0.5)
flash-gordon commented 1 year ago

It's not possible to change old releases to set an upper bound on dry-logic. It's unfortunate, but the alternative would be to bump all gems to 2.0 which. Regarding the problem itself, gems were switched to using zeitwerk, now there's no need to require specific files or gems. If you depend on dry-types, require 'dry-types' will suffice. Given you upgraded all gems to the latest versions.

flash-gordon commented 1 year ago

TBH maybe just upgrading dry-type to the latest compatible will do. It's just hitting 1.0 in dry-core was a major disturbance, now things look settled.

coding-red-panda commented 1 year ago

upgraded dry-types to ~> 1.7 and dry-struct to ~> 1.6 and that seems to resolve it properly.