Sha256: 7ba083cffee3276d26088797fb1712e481704a392181d7da8742c9ae4984e9b0

Contents?: true

Size: 1.98 KB

Versions: 2

Compression:

Stored size: 1.98 KB

Contents

require 'percy/capybara/loaders/base_loader'
require 'digest'
require 'find'
require 'pathname'

module Percy
  module Capybara
    module Loaders
      # Resource loader that looks for resources in the specified folder.
      class FilesystemLoader < BaseLoader
        SKIP_RESOURCE_EXTENSIONS = [
          '.map', # Ignore source maps.
          '.gz', # Ignore gzipped files.
        ].freeze
        MAX_FILESIZE_BYTES = 15 * 1024**2 # 15 MB.

        def initialize(options = {})
          # @assets_dir should point to a _compiled_ static assets directory, not source assets.
          @assets_dir = options[:assets_dir]
          @base_url = options[:base_url] || '/'

          raise ArgumentError, 'assets_dir is required' if @assets_dir.nil? || @assets_dir == ''
          unless Pathname.new(@assets_dir).absolute?
            raise ArgumentError, "assets_dir needs to be an absolute path. Received: #{@assets_dir}"
          end
          unless Dir.exist?(@assets_dir)
            raise ArgumentError, "assets_dir provided was not found. Received: #{@assets_dir}"
          end

          super
        end

        def snapshot_resources
          [root_html_resource]
        end

        def build_resources
          resources = []
          Find.find(@assets_dir).each do |path|
            # Skip directories.
            next unless FileTest.file?(path)
            # Skip certain extensions.
            next if SKIP_RESOURCE_EXTENSIONS.include?(File.extname(path))
            # Skip large files, these are hopefully downloads and not used in page rendering.
            next if File.size(path) > MAX_FILESIZE_BYTES

            # Replace the assets_dir with the base_url to generate the resource_url
            resource_url = @base_url.chomp('/') + path.sub(@assets_dir, '')

            sha = Digest::SHA256.hexdigest(File.read(path))
            resources << Percy::Client::Resource.new(resource_url, sha: sha, path: path)
          end
          resources
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
percy-capybara-2.5.1 lib/percy/capybara/loaders/filesystem_loader.rb
percy-capybara-2.5.0 lib/percy/capybara/loaders/filesystem_loader.rb