class Pakyow::Assets::External

@api private

Attributes

name[R]
package[R]
version[R]

Public Class Methods

new(name, version:, package:, files:, config:) click to toggle source
# File lib/pakyow/assets/external.rb, line 11
def initialize(name, version:, package:, files:, config:)
  @name, @version, @config = name, version, config
  @package = package || name
  @files = files || []
end

Public Instance Methods

exist?() click to toggle source
# File lib/pakyow/assets/external.rb, line 17
def exist?
  if @files.empty?
    Dir.glob(File.join(@config.externals.path, "#{@name}*.js")).any?
  else
    !@files.any? { |file|
      if File.basename(file, File.extname(file)) == @name.to_s
        Dir.glob(File.join(@config.externals.path, "#{@name}*.js")).empty?
      else
        Dir.glob(File.join(@config.externals.path, "#{@name}*__#{File.basename(file, File.extname(file))}.js")).empty?
      end
    }
  end
end
fetch!() click to toggle source
# File lib/pakyow/assets/external.rb, line 31
def fetch!
  if @files.empty?
    fetch_file!(nil)
  else
    @files.each do |file|
      fetch_file!(file)
    end
  end
end

Private Instance Methods

fetch_file!(file) click to toggle source
# File lib/pakyow/assets/external.rb, line 43
def fetch_file!(file)
  name_with_version = if @version
    "#{name}@#{@version}"
  else
    name.to_s
  end

  file_with_version = File.join(name_with_version, file.to_s).chomp("/")

  package_with_version = if @version
    "#{@package}@#{@version}"
  else
    @package.to_s
  end

  Support::CLI::Runner.new(message: "Fetching #{file_with_version}").run do |runner|
    Async do
      downloader = Downloader.new(
        File.join(@config.externals.provider, CGI.escape(package_with_version), CGI.escape(file.to_s))
      ).perform

      FileUtils.mkdir_p(@config.externals.path)

      fetched_version = CGI.unescape(downloader.path.to_s).split(@package.to_s, 2)[1].split("/", 2)[0].split("@", 2)[1]
      file_basename = File.basename(file.to_s, File.extname(file.to_s))

      local_path = if file && file_basename != name.to_s
        File.join(
          @config.externals.path,
          "#{name}@#{fetched_version}__#{file_basename}.js"
        )
      else
        File.join(
          @config.externals.path,
          "#{name}@#{fetched_version}.js"
        )
      end

      File.open(local_path, "w") do |fp|
        fp.write(downloader.body.to_s)
      end

      runner.succeeded
    rescue Downloader::Failed => error
      runner.failed(error.to_s)
    end
  end
end