lib/logstash-docket/source.rb (47 lines of code) (raw):
# encoding: utf-8
require 'set'
module LogstashDocket
##
# A {@link Source} provides methods for working with versioned source data.
#
module Source
##
# Read the file at the given version
#
# @param filename [String]: the full file path
# @param version [#to_s, nil]: the version (default: latest)
#
# @return [String]
def read_file(filename, version=nil)
fail NotImplementedError
end
##
# Get the public web URL for the given file path at the given revision
#
# @param filename [String]: the full file path
# @param version [#to_s, nil]: the version (default: latest)
#
# @return [String]
def web_url(filename, version=nil)
fail NotImplementedError
end
##
# Get a set of release tags from this source
#
# @return [Set{String}]
def release_tags
fail NotImplementedError
end
##
# A {@link Source::Github} represents the source of a public project hosted on Github
class Github
include Source
attr_reader :org
attr_reader :repo
##
# @param repo [String]: a repository name
# @param org [String]: a github organisation (default: extract from `repo`)
# @param octokit [Octokit::Client]: a github API client (optional; required for tag listing)
def initialize(repo:, org:nil, octokit: nil)
if org.nil?
org, repo = repo.split('/', 2)
fail(ArgumentError, "incomplete repo spec: `#{repo}`") if org.nil? || repo.nil?
end
@org = org
@repo = repo
@octokit = octokit
end
##
# @see [Source#read_file]
def read_file(filename, version=nil)
uri = URI.parse("https://raw.githubusercontent.com/#{org}/#{repo}/#{ref(version)}/#{filename}")
response = Net::HTTP.get(uri)
return nil if response.start_with?('404: Not Found')
response
end
##
# @see [Source#web_url]
def web_url(filename, version=nil)
"https://github.com/#{org}/#{repo}/blob/#{ref(version)}/#{filename}"
end
##
# @see [Source#release_tags]
def release_tags
@tags ||= begin
fail('octokit github client required') if @octokit.nil?
Set.new(@octokit.tags("#{org}/#{repo}").map(&:name).select{|t| t[%r{\Av\d+\.\d+\.\d+}] })
end
end
private
def ref(version)
version ? "v#{version}" : 'main'
end
end
end
end