module Packwerk::ApplicationLoadPaths
Public Class Methods
extract_application_autoload_paths()
click to toggle source
# File lib/packwerk/application_load_paths.rb, line 21 def extract_application_autoload_paths Rails.application.railties .select { |railtie| railtie.is_a?(Rails::Engine) } .push(Rails.application) .flat_map do |engine| paths = (engine.config.autoload_paths + engine.config.eager_load_paths + engine.config.autoload_once_paths) paths.map(&:to_s).uniq end end
extract_relevant_paths(root, environment)
click to toggle source
# File lib/packwerk/application_load_paths.rb, line 12 def extract_relevant_paths(root, environment) require_application(root, environment) all_paths = extract_application_autoload_paths relevant_paths = filter_relevant_paths(all_paths) assert_load_paths_present(relevant_paths) relative_path_strings(relevant_paths) end
filter_relevant_paths(all_paths, bundle_path: Bundler.bundle_path, rails_root: Rails.root)
click to toggle source
# File lib/packwerk/application_load_paths.rb, line 35 def filter_relevant_paths(all_paths, bundle_path: Bundler.bundle_path, rails_root: Rails.root) bundle_path_match = bundle_path.join("**") rails_root_match = rails_root.join("**") all_paths .map { |path| Pathname.new(path).expand_path } .select { |path| path.fnmatch(rails_root_match.to_s) } # path needs to be in application directory .reject { |path| path.fnmatch(bundle_path_match.to_s) } # reject paths from vendored gems end
relative_path_strings(paths, rails_root: Rails.root)
click to toggle source
# File lib/packwerk/application_load_paths.rb, line 46 def relative_path_strings(paths, rails_root: Rails.root) paths .map { |path| path.relative_path_from(rails_root).to_s } .uniq end
Private Class Methods
assert_load_paths_present(paths)
click to toggle source
# File lib/packwerk/application_load_paths.rb, line 68 def assert_load_paths_present(paths) if paths.empty? raise <<~EOS We could not extract autoload paths from your Rails app. This is likely a configuration error. Packwerk will not work correctly without any autoload paths. EOS end end
require_application(root, environment)
click to toggle source
# File lib/packwerk/application_load_paths.rb, line 55 def require_application(root, environment) environment_file = "#{root}/config/environment" if File.file?("#{environment_file}.rb") ENV["RAILS_ENV"] ||= environment require environment_file else raise "A Rails application could not be found in #{root}" end end