lib/propshaft/load_path.rb in propshaft-0.8.0 vs lib/propshaft/load_path.rb in propshaft-0.9.1
- old
+ new
@@ -1,27 +1,36 @@
require "propshaft/asset"
class Propshaft::LoadPath
- attr_reader :paths, :version
+ attr_reader :paths, :compilers, :version
- def initialize(paths = [], version: nil)
- @paths = dedup(paths)
- @version = version
+ def initialize(paths = [], compilers:, version: nil)
+ @paths, @compilers, @version = dedup(paths), compilers, version
end
def find(asset_name)
assets_by_path[asset_name]
end
- def assets(content_types: nil)
- if content_types
- assets_by_path.values.select { |asset| asset.content_type.in?(content_types) }
- else
- assets_by_path.values
- end
+ def find_referenced_by(asset)
+ compilers.referenced_by(asset).delete(self)
end
+ def assets
+ assets_by_path.values
+ end
+
+ def asset_paths_by_type(content_type)
+ (@cached_asset_paths_by_type ||= Hash.new)[content_type] ||=
+ extract_logical_paths_from(assets.select { |a| a.content_type == Mime::EXTENSION_LOOKUP[content_type] })
+ end
+
+ def asset_paths_by_glob(glob)
+ (@cached_asset_paths_by_glob ||= Hash.new)[glob] ||=
+ extract_logical_paths_from(assets.select { |a| a.path.fnmatch?(glob) })
+ end
+
def manifest
Hash.new.tap do |manifest|
assets.each do |asset|
manifest[asset.logical_path.to_s] = asset.digested_path.to_s
end
@@ -33,38 +42,52 @@
# and test to ensure the map caches are reset when javascript files are changed.
def cache_sweeper
@cache_sweeper ||= begin
exts_to_watch = Mime::EXTENSION_LOOKUP.map(&:first)
files_to_watch = Array(paths).collect { |dir| [ dir.to_s, exts_to_watch ] }.to_h
+ mutex = Mutex.new
Rails.application.config.file_watcher.new([], files_to_watch) do
- clear_cache
+ mutex.synchronize do
+ clear_cache
+ seed_cache
+ end
end
end
end
private
def assets_by_path
@cached_assets_by_path ||= Hash.new.tap do |mapped|
paths.each do |path|
without_dotfiles(all_files_from_tree(path)).each do |file|
logical_path = file.relative_path_from(path)
- mapped[logical_path.to_s] ||= Propshaft::Asset.new(file, logical_path: logical_path, version: version)
+ mapped[logical_path.to_s] ||= Propshaft::Asset.new(file, logical_path: logical_path, load_path: self)
end if path.exist?
end
end
end
def all_files_from_tree(path)
path.children.flat_map { |child| child.directory? ? all_files_from_tree(child) : child }
end
+ def extract_logical_paths_from(assets)
+ assets.collect { |asset| asset.logical_path.to_s }.sort
+ end
+
def without_dotfiles(files)
files.reject { |file| file.basename.to_s.starts_with?(".") }
end
def clear_cache
@cached_assets_by_path = nil
+ @cached_asset_paths_by_type = nil
+ @cached_asset_paths_by_glob = nil
+ end
+
+ def seed_cache
+ assets_by_path
end
def dedup(paths)
paths = Array(paths).map { |path| Pathname.new(path) }
deduped = [].tap do |deduped|