Makes resolving a constant in a given namespace easy.
https://github.com/amarshall/const_lookup.git
Makes resolving a constant in a given namespace easy.
Install as usual: gem install const_lookup or add gem 'const_lookup' to your Gemfile. See .travis.yml for supported (tested) Ruby versions.
module A
module B; end
module C; end
end
module D; end
require 'const_lookup'
ConstLookup.lookup('A', A::C) #=> A
ConstLookup.lookup('B', A::C) #=> A::B
ConstLookup.lookup('D', A::C) #=> D
ConstLookup.lookup('E', A::C) #=> #<NameError: Failed to find `E' in A::C>
Or, if you like monkey-patching Ruby core:
module A
module B; end
module C; end
end
module D; end
require 'const_lookup/core_ext'
A::C.const_lookup('B') #=> A::B
A::C.const_lookup('D') #=> D
Compare this with using Module#const_get:
module A
module B; end
module C; end
end
module D; end
A::C.const_get('A') #=> A
A::C.const_get('B') #=> #<NameError: uninitialized constant A::C::B>
A::C.const_get('B', true) #=> #<NameError: uninitialized constant A::C::B>
A::C.const_get('D') #=> D
A::C.const_get('E') #=> #<NameError: uninitialized constant A::C::E>
This is because const_get looks up the ancestor tree, not the namespace tree like ConstLookup does.
Contributions are welcome. Please be sure that your pull requests are atomic so they can be considered and accepted separately.
git checkout -b my-new-feature)git commit -am 'Add some feature')git push origin my-new-feature)Copyright ยฉ 2013โ2017 J. Andrew Marshall. License is available in the LICENSE file.