Class: Avo::SvgFinder

Inherits:
Object
  • Object
show all
Defined in:
lib/avo/svg_finder.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filename) ⇒ SvgFinder

Returns a new instance of SvgFinder.



6
7
8
# File 'lib/avo/svg_finder.rb', line 6

def initialize(filename)
  @filename = filename
end

Class Method Details

.find_asset(filename) ⇒ Object



2
3
4
# File 'lib/avo/svg_finder.rb', line 2

def self.find_asset(filename)
  new(filename)
end

Instance Method Details

#default_strategyObject



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/avo/svg_finder.rb', line 37

def default_strategy
  # If the app uses Propshaft, grab it from there
  if defined?(Propshaft)
    asset_path = ::Rails.application.assets.load_path.find(@filename)
    asset_path&.path
  elsif ::Rails.application.config.assets.compile
    # Grab the asset from the compiled asset manifest
    asset = ::Rails.application.assets[@filename]
    Pathname.new(asset.filename) if asset.present?
  else
    # Grab the asset from the manifest
    manifest = ::Rails.application.assets_manifest
    asset_path = manifest.assets[@filename]
    unless asset_path.nil?
      ::Rails.root.join(manifest.directory, asset_path)
    end
  end
end

#pathnameObject

Use the default static finder logic. If that doesn’t find anything, search according to our pattern:



11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/avo/svg_finder.rb', line 11

def pathname
  Avo::CACHED_SVGS[@filename] ||= begin
    found_asset = default_strategy

    # Use the found asset
    return found_asset if found_asset.present?

    paths.find do |path|
      File.exist? path
    end
  end
end

#pathsObject



24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/avo/svg_finder.rb', line 24

def paths
  [
    Rails.root.join("app", "assets", "svgs", @filename),
    Rails.root.join(@filename),
    Avo::Engine.root.join("app", "assets", "svgs", @filename),
    Avo::Engine.root.join("app", "assets", "svgs", "avo", @filename),
    Avo::Engine.root.join("app", "assets", "svgs", "heroicons", "outline", @filename),
    Avo::Engine.root.join(@filename).to_s,
    # Add all paths from Rails including engines
    *Rails.application.config.assets&.paths&.map { |path| File.join(path, @filename) }
  ].map(&:to_s).uniq
end