Before I dive into question I m gonna try to explain the structure of my codebase. This question is different from the linked question in the comments because it's concerning the list of includding modules within module classes. Not directly on the classes or in a 1 level module
1) There might be a class X which definition would be :
module ParentModule
class X
end
end
2) Also there might be a nested class under different module :
module ParentModule
module ChildModule
class Y
end
end
end
3) Also there might be just a module with some classes inside:
module ParentModule
module OtherModule
def some_awesome_method
..does something
end
end
end
I m trying to get a list of classes within my ParentModule
that include OtherModule
. Here is what I have so far, working well :
include_resources = ->(klass) {
begin
klass_string = klass.to_s
klass_resource = klass_string.constantize
klass_string if klass_resource.included_modules.include?(OtherModule)
rescue NameError # skip all bad naming and other irrelevant constant loading mishaps
next
end
}
So if I do ParentModule.constants.find_all(&include_resources)
I get the list of classes that include OtherModule
, great! BUT unfortunately it is not able to find a class nested under child module as shown in the #2 example. So I tried doing this :
include_resources = ->(klass) {
begin
klass_string = klass.to_s
klass_resource = klass_string.constantize
if klass_resource.class == Module
return "ParentModule::#{klass_string}".constants.find_all do |module_klass|
module_klass.constantize.included_modules.include?(OtherModule)
end
end
klass_string if klass_resource.included_modules.include?(OtherModule)
rescue NameError # skip all bad naming and other irrelevant constant loading mishaps
next
end
}
Unfortunately this returns the same list.