Giter Club home page Giter Club logo

Comments (9)

flash-gordon avatar flash-gordon commented on July 18, 2024

It's not a bug, it's just how ruby works. You'll get the same results with something like

GemTypes = Dry.Types()
GemTypes::Params::Integer # => returns type, ok

module Types
  include GemTypes
  # here Params::Integer is still available 
  # because it's inherited from GemTypes

  module Params # this shadows Params of GemTypes
    # now Types::Params references to another module, not one defined in GemTypes
  end
end

There are a bunch of workarounds you can apply. Simplest:

# don't use inheritence
Types = Dry.Types() 
# instead, work with the module created by dry-types directly
module Types
  module Params
    PageSize = Types::Params::Integer
  end
end

Another option is avoiding shadowing:

module Types
  include Dry.Types()

  Params::PageSize = Params::Integer
end

or

module Types
  types = Dry::Types().tap { include _1 }

  module types::Params
    PageSize = Types::Params::Integer
  end
end

or

module Types
  include Dry::Types()

  module ancestors[1]::Params
    PageSize = Types::Params::Integer
  end
end

from dry-types.

solnic avatar solnic commented on July 18, 2024

Wait, this is counter-intuitive. I would expect this to work. Given that Types::Params works, why re-opening the module does not?

from dry-types.

flash-gordon avatar flash-gordon commented on July 18, 2024

@solnic because it's not reopening the module but creating a new one. We can't control it. We could change our examples to Types = Dry::Types(), it'll help somewhat.

from dry-types.

solnic avatar solnic commented on July 18, 2024

@flash-gordon do you know if it's possible to define regular modules for Param JSON etc.? It feels like we're violating POLS here.

from dry-types.

flash-gordon avatar flash-gordon commented on July 18, 2024

@solnic I'm pretty sure you can subscribe to the included hook and define modules there. This would be surprising to me OTOH because it has nothing to do with dry-types rather how ruby operates itself. I've once heard of a framework that tries to improve ruby, not sure they really pulled this off. I suggest updating docs to Types = Dry.Types() and call it a day. Same effect, no magic.
Keep in mind, lexical scoping in ruby is far from being self-evident. For instance, you can't make it work with either approach:

RSpec.describe 'foo' do
  include Dry.Types

  specify do
    Params # boom, no params!
  end
end

Oh! I have another suggestion actually! We can detect when the user overrides exported modules and give a proper warning. WDYT? This way we won't bend ruby (with unforeseeable consequences) and provide robust UX.

from dry-types.

timriley avatar timriley commented on July 18, 2024

I've been bitten by this before too, ended up scratching my head for a bit and then went for one of the workarounds.

I think if we follow this recommendation of @flash-gordon's:

I suggest updating docs to Types = Dry.Types() and call it a day. Same effect, no magic.

We'd effectively solve this issue for 99.9% of our users.

Is this the one you're suggesting, @flash-gordon?

# don't use inheritence
Types = Dry.Types() 
# instead, work with the module created by dry-types directly
module Types
  module Params
    PageSize = Types::Params::Integer
  end
end

That said, this suggestion does sound good too, if we're able to do it :)

We can detect when the user overrides exported modules and give a proper warning. WDYT?

from dry-types.

flash-gordon avatar flash-gordon commented on July 18, 2024

Is this the one you're suggesting, @flash-gordon?

Yep.

I think applying both improvements is a good way of solving this.

from dry-types.

solnic avatar solnic commented on July 18, 2024

Yeah let's just fix it via docs and:

We can detect when the user overrides exported modules and give a proper warning. WDYT?

sounds good to me too.

from dry-types.

flash-gordon avatar flash-gordon commented on July 18, 2024

hm, it's not possible to detect if there was a constant definition, not without tracepoint API at least, that'd be overkill FWIW https://bugs.ruby-lang.org/issues/17881

from dry-types.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.