dblock / ruby-enum

A handy way to define enums in Ruby.
MIT License
177 stars 23 forks source link

Add support for sub/superclasses (NoMethodError: undefined method `values' for nil ?) #49

Open coneybeare opened 1 month ago

coneybeare commented 1 month ago

I have an older project, just updated to rails 6.1 and ruby 3. However, I am seeing an issue when trying to read the values from here, and not sure why

class PostVideoType < PostMediaType
  include Ruby::Enum

  define :RAW,          'Raw Video'
  define :GFYCAT,       'Gfycat'
  define :GIPHY,        'Giphy'
  define :KICKSTARTER,  'Kickstarter'
  define :INSTAGRAM,    'Instagram'
  define :IMGUR,        'Imgur'
  define :TWITTER,      'Twitter'
  define :VIDME,        'Vidme'
  define :VIMEO,        'Vimeo'
  define :VINE,         'Vine'
  define :YOUTUBE,      'YouTube'
end
[1] pry(main)> PostVideoType.keys
=> [:RAW, :GFYCAT, :GIPHY, :KICKSTARTER, :INSTAGRAM, :IMGUR, :TWITTER, :VIDME, :VIMEO, :VINE, :YOUTUBE]
[2] pry(main)> PostVideoType.value(:RAW)
=> "Raw Video"
[3] pry(main)> PostVideoType.values
NoMethodError: undefined method `values' for nil
from /Users/redacted/.rbenv/versions/3.3.4/lib/ruby/gems/3.3.0/gems/ruby-enum-1.0.0/lib/ruby-enum/enum.rb:126:in `values'

It doesn't appear that the values method is working correctly, but I can't see why.

coneybeare commented 1 month ago

Ah, think I figured it out. I had include Ruby::Enum in the superclass PostMediaType, even though I put it here to try and simplify it. The @_enum_hash seems to have not been accessible that way. Moving include Ruby::Enum into every subclass directly, and removing from the super class works again.

dblock commented 1 month ago

I think supporting superclass enums is a very desirable feature! Let's reopen this.

Want to try and write some (failing) specs and maybe an implementation?