Class: Fetchers::Url

Inherits:
Object
  • Object
show all
Defined in:
lib/fetchers/url.rb

Direct Known Subclasses

Compliance::Fetcher

Constant Summary collapse

MIME_TYPES =
{
  'application/x-zip-compressed' => '.zip',
  'application/zip' => '.zip',
  'application/x-gzip' => '.tar.gz',
  'application/gzip' => '.tar.gz',
}.freeze
GITHUB_URL_REGEX =
%r{^https?://(www\.)?github\.com/(?<user>[\w-]+)/(?<repo>[\w-]+)(\.git)?(/)?$}
GITHUB_URL_WITH_TREE_REGEX =
%r{^https?://(www\.)?github\.com/(?<user>[\w-]+)/(?<repo>[\w-]+)/tree/(?<commit>[\w\.]+)(/)?$}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(url, opts) ⇒ Url

Returns a new instance of Url.



76
77
78
79
80
81
# File 'lib/fetchers/url.rb', line 76

def initialize(url, opts)
  @target = url
  @insecure = opts['insecure']
  @token = opts['token']
  @config = opts
end

Instance Attribute Details

#archive_pathObject (readonly)

Returns the value of attribute archive_path.



74
75
76
# File 'lib/fetchers/url.rb', line 74

def archive_path
  @archive_path
end

#filesObject (readonly)

Returns the value of attribute files.



74
75
76
# File 'lib/fetchers/url.rb', line 74

def files
  @files
end

Class Method Details

.resolve(target, opts = {}) ⇒ Object



21
22
23
24
25
26
27
# File 'lib/fetchers/url.rb', line 21

def self.resolve(target, opts = {})
  if target.is_a?(Hash) && target.key?(:url)
    resolve_from_string(target[:url], opts)
  elsif target.is_a?(String)
    resolve_from_string(target, opts)
  end
end

.resolve_from_string(target, opts) ⇒ Object



29
30
31
32
33
34
35
36
37
# File 'lib/fetchers/url.rb', line 29

def self.resolve_from_string(target, opts)
  uri = URI.parse(target)
  return nil if uri.nil? or uri.scheme.nil?
  return nil unless %{ http https }.include? uri.scheme
  target = transform(target)
  new(target, opts)
rescue URI::Error
  nil
end

.transform(target) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/fetchers/url.rb', line 59

def self.transform(target)
  transformed_target = if m = GITHUB_URL_REGEX.match(target) # rubocop:disable Lint/AssignmentInCondition
                         "https://github.com/#{m[:user]}/#{m[:repo]}/archive/master.tar.gz"
                       elsif m = GITHUB_URL_WITH_TREE_REGEX.match(target) # rubocop:disable Lint/AssignmentInCondition
                         "https://github.com/#{m[:user]}/#{m[:repo]}/archive/#{m[:commit]}.tar.gz"
                       end

  if transformed_target
    Inspec::Log.warn("URL target #{target} transformed to #{transformed_target}. Consider using the git fetcher")
    transformed_target
  else
    target
  end
end

Instance Method Details

#fetch(path) ⇒ Object



83
84
85
86
# File 'lib/fetchers/url.rb', line 83

def fetch(path)
  Inspec::Log.debug("Fetching URL: #{@target}")
  @archive_path = download_archive(path)
end

#resolved_sourceObject



88
89
90
# File 'lib/fetchers/url.rb', line 88

def resolved_source
  { url: @target }
end