Module: Modulation::Paths
- Defined in:
- lib/modulation/paths.rb
Overview
Implements methods for expanding relative or incomplete module file names
Constant Summary collapse
- CALLER_FILE_REGEXP =
Regexp for extracting filename from caller reference
/^([^\:]+)\:?/.freeze
- TAGGED_REGEXP =
/^@([^\/]+)(\/.+)?$/.freeze
- RE_TAG =
/^@([^\/]+)/.freeze
- GEM_NAME_RE =
/^([^\/]+)/.freeze
Class Method Summary collapse
-
.absolute_dir_path(path, caller_location) ⇒ String
Computes and verifies the absolute directory path.
-
.absolute_path(path, caller_location) ⇒ String
Resolves the absolute path to the provided reference.
- .add_tags(new_tags, caller_location) ⇒ Object
-
.check_path(path) ⇒ String?
Checks that the given path references an existing file, adding the .rb extension if needed.
- .expand_tag(path) ⇒ Object
-
.find_gem_based_path(gemspec, path) ⇒ String
Finds full path for gem file based on gem’s require paths.
-
.gem_uses_modulation?(gemspec) ⇒ Boolean
Returns true if given gemspec depends on modulation, which means it can be loaded using
import. -
.lookup_gem_path(name) ⇒ String, Symbol
Resolves the provided path by looking for a corresponding gem.
- .process(path, caller_location) ⇒ Object
- .tags ⇒ Object
Class Method Details
.absolute_dir_path(path, caller_location) ⇒ String
Computes and verifies the absolute directory path
58 59 60 61 62 63 64 65 |
# File 'lib/modulation/paths.rb', line 58 def absolute_dir_path(path, caller_location) path = (path) caller_file = caller_location[CALLER_FILE_REGEXP, 1] return nil unless caller_file path = File.(path, File.dirname(caller_file)) File.directory?(path) ? path : (raise "Invalid directory #{path}") end |
.absolute_path(path, caller_location) ⇒ String
Resolves the absolute path to the provided reference. If the file is not found, will try to resolve to a gem
46 47 48 49 50 51 52 |
# File 'lib/modulation/paths.rb', line 46 def absolute_path(path, caller_location) caller_file = caller_location[CALLER_FILE_REGEXP, 1] return nil unless caller_file path = File.(path, File.dirname(caller_file)) check_path(path) end |
.add_tags(new_tags, caller_location) ⇒ Object
23 24 25 26 27 28 29 30 |
# File 'lib/modulation/paths.rb', line 23 def (, caller_location) caller_file = caller_location[CALLER_FILE_REGEXP, 1] caller_dir = caller_file ? File.dirname(caller_file) : nil .each do |k, path| [k.to_s] = caller_dir ? File.(path, caller_dir) : path end end |
.check_path(path) ⇒ String?
Checks that the given path references an existing file, adding the .rb extension if needed
71 72 73 74 75 76 77 |
# File 'lib/modulation/paths.rb', line 71 def check_path(path) if File.file?("#{path}.rb") path + '.rb' elsif File.file?(path) path end end |
.expand_tag(path) ⇒ Object
34 35 36 37 38 39 |
# File 'lib/modulation/paths.rb', line 34 def (path) path.sub RE_TAG do tag = Regexp.last_match[1] [tag] || (raise "Invalid tag #{tag}") end end |
.find_gem_based_path(gemspec, path) ⇒ String
Finds full path for gem file based on gem’s require paths
111 112 113 114 115 116 117 |
# File 'lib/modulation/paths.rb', line 111 def find_gem_based_path(gemspec, path) gemspec.full_require_paths.each do |p| full_path = check_path(File.join(p, path)) return full_path if full_path end nil end |
.gem_uses_modulation?(gemspec) ⇒ Boolean
Returns true if given gemspec depends on modulation, which means it can be loaded using import
103 104 105 |
# File 'lib/modulation/paths.rb', line 103 def gem_uses_modulation?(gemspec) gemspec.dependencies.map(&:name).include?('modulation') end |
.lookup_gem_path(name) ⇒ String, Symbol
Resolves the provided path by looking for a corresponding gem. If no gem is found, returns nil. If the corresponding gem does not use modulation, returns :require_gem, which signals that the gem must be required.
86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/modulation/paths.rb', line 86 def lookup_gem_path(name) gem = name[GEM_NAME_RE, 1] || name spec = Gem::Specification.find_by_name(gem) if gem_uses_modulation?(spec) find_gem_based_path(spec, name) else :require_gem end rescue Gem::MissingSpecError nil end |
.process(path, caller_location) ⇒ Object
7 8 9 10 11 |
# File 'lib/modulation/paths.rb', line 7 def process(path, caller_location) path = (path) absolute_path(path, caller_location) || lookup_gem_path(path) end |
.tags ⇒ Object
17 18 19 20 21 |
# File 'lib/modulation/paths.rb', line 17 def @tags ||= { 'modulation' => File.join(Modulation::DIR, 'modulation/modules') } end |