Class: Dependabot::Source

Inherits:
Object
  • Object
show all
Defined in:
lib/dependabot/source.rb

Constant Summary collapse

GITHUB_SOURCE =
%r{
  (?<provider>github)
  (?:\.com)[/:]
  (?<repo>[\w.-]+/(?:(?!\.git|\.\s)[\w.-])+)
  (?:(?:/tree|/blob)/(?<branch>[^/]+)/(?<directory>.*)[\#|/])?
}x.freeze
GITLAB_SOURCE =
%r{
  (?<provider>gitlab)
  (?:\.com)[/:]
  (?<repo>[^/\s]+/(?:(?!\.git|\.\s)[^/\s#"',])+)
  (?:(?:/tree|/blob)/(?<branch>[^/]+)/(?<directory>.*)[\#|/])?
}x.freeze
BITBUCKET_SOURCE =
%r{
  (?<provider>bitbucket)
  (?:\.org)[/:]
  (?<repo>[^/\s]+/(?:(?!\.git|\.\s)[^/\s#"',])+)
  (?:(?:/src)/(?<branch>[^/]+)/(?<directory>.*)[\#|/])?
}x.freeze
AZURE_SOURCE =
%r{
  (?<provider>azure)
  (?:\.com)[/:]
  (?<repo>[^/\s]+/([^/\s]+/)?(?:_git/)(?:(?!\.git|\.\s)[^/\s#?"',])+)
}x.freeze
SOURCE_REGEX =
/
  (?:#{GITHUB_SOURCE})|
  (?:#{GITLAB_SOURCE})|
  (?:#{BITBUCKET_SOURCE})|
  (?:#{AZURE_SOURCE})
/x.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(provider:, repo:, directory: nil, branch: nil, hostname: nil, api_endpoint: nil) ⇒ Source

Returns a new instance of Source.



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/dependabot/source.rb', line 54

def initialize(provider:, repo:, directory: nil, branch: nil, hostname: nil,
               api_endpoint: nil)
  if hostname.nil? ^ api_endpoint.nil?
    msg = "Both hostname and api_endpoint must be specified if either "\
          "are. Alternatively, both may be left blank to use the "\
          "provider's defaults."
    raise msg
  end

  @provider = provider
  @repo = repo
  @directory = directory
  @branch = branch
  @hostname = hostname || default_hostname(provider)
  @api_endpoint = api_endpoint || default_api_endpoint(provider)
end

Instance Attribute Details

#api_endpointObject (readonly)

Returns the value of attribute api_endpoint.



39
40
41
# File 'lib/dependabot/source.rb', line 39

def api_endpoint
  @api_endpoint
end

#branchObject (readonly)

Returns the value of attribute branch.



39
40
41
# File 'lib/dependabot/source.rb', line 39

def branch
  @branch
end

#directoryObject (readonly)

Returns the value of attribute directory.



39
40
41
# File 'lib/dependabot/source.rb', line 39

def directory
  @directory
end

#hostnameObject (readonly)

Returns the value of attribute hostname.



39
40
41
# File 'lib/dependabot/source.rb', line 39

def hostname
  @hostname
end

#providerObject (readonly)

Returns the value of attribute provider.



39
40
41
# File 'lib/dependabot/source.rb', line 39

def provider
  @provider
end

#repoObject (readonly)

Returns the value of attribute repo.



39
40
41
# File 'lib/dependabot/source.rb', line 39

def repo
  @repo
end

Class Method Details

.from_url(url_string) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/dependabot/source.rb', line 41

def self.from_url(url_string)
  return unless url_string&.match?(SOURCE_REGEX)

  captures = url_string.match(SOURCE_REGEX).named_captures

  new(
    provider: captures.fetch("provider"),
    repo: captures.fetch("repo"),
    directory: captures.fetch("directory"),
    branch: captures.fetch("branch")
  )
end

Instance Method Details

#organizationObject



81
82
83
# File 'lib/dependabot/source.rb', line 81

def organization
  repo.split("/").first
end

#projectObject



85
86
87
88
89
90
91
92
# File 'lib/dependabot/source.rb', line 85

def project
  raise "Project is an Azure DevOps concept only" unless provider == "azure"

  parts = repo.split("/_git/")
  return parts.first.split("/").last if parts.first.split("/").count == 2

  parts.last
end

#unscoped_repoObject



94
95
96
# File 'lib/dependabot/source.rb', line 94

def unscoped_repo
  repo.split("/").last
end

#urlObject



71
72
73
74
75
76
77
78
79
# File 'lib/dependabot/source.rb', line 71

def url
  case provider
  when "github" then "https://github.com/" + repo
  when "bitbucket" then "https://bitbucket.org/" + repo
  when "gitlab" then "https://gitlab.com/" + repo
  when "azure" then "https://dev.azure.com/" + repo
  else raise "Unexpected repo provider '#{provider}'"
  end
end