Merge pull request #3054 from BenMusch/github-refactor
Clean-up code in GitHub module to reduce duplication & coupling w/ Github API
This commit is contained in:
commit
3b92f69869
@ -15,8 +15,9 @@ module Hbc
|
||||
end
|
||||
|
||||
def self.search_remote(query)
|
||||
matches = GitHub.search_code("user:caskroom", "path:Casks", "filename:#{query}", "extension:rb")
|
||||
[*matches].map do |match|
|
||||
matches = GitHub.search_code(user: "caskroom", path: "Casks",
|
||||
filename: query, extension: "rb")
|
||||
matches.map do |match|
|
||||
tap = Tap.fetch(match["repository"]["full_name"])
|
||||
next if tap.installed?
|
||||
"#{tap.name}/#{File.basename(match["path"], ".rb")}"
|
||||
|
||||
@ -109,8 +109,9 @@ module Homebrew
|
||||
$stderr.puts Formatter.headline("Searching taps on GitHub...", color: :blue)
|
||||
|
||||
valid_dirnames = ["Formula", "HomebrewFormula", "Casks", "."].freeze
|
||||
matches = GitHub.search_code("user:Homebrew", "user:caskroom", "filename:#{query}", "extension:rb")
|
||||
[*matches].map do |match|
|
||||
matches = GitHub.search_code(user: ["Homebrew", "caskroom"], filename: query, extension: "rb")
|
||||
|
||||
matches.map do |match|
|
||||
dirname, filename = File.split(match["path"])
|
||||
next unless valid_dirnames.include?(dirname)
|
||||
tap = Tap.fetch(match["repository"]["full_name"])
|
||||
|
||||
@ -2,12 +2,38 @@ require "utils/github"
|
||||
|
||||
describe GitHub do
|
||||
describe "::search_code", :needs_network do
|
||||
it "searches code" do
|
||||
results = subject.search_code("repo:Homebrew/brew", "path:/", "filename:readme", "language:markdown")
|
||||
it "queries GitHub code with the passed paramaters" do
|
||||
results = subject.search_code(repo: "Homebrew/brew", path: "/",
|
||||
filename: "readme", language: "markdown")
|
||||
|
||||
expect(results.count).to eq(1)
|
||||
expect(results.first["name"]).to eq("README.md")
|
||||
expect(results.first["path"]).to eq("README.md")
|
||||
end
|
||||
end
|
||||
|
||||
describe "::query_string" do
|
||||
it "builds a query with the given hash parameters formatted as key:value" do
|
||||
query = subject.query_string(user: "Homebrew", repo: "brew")
|
||||
expect(query).to eq("q=user%3AHomebrew+repo%3Abrew&per_page=100")
|
||||
end
|
||||
|
||||
it "adds a variable number of top-level string parameters to the query when provided" do
|
||||
query = subject.query_string("value1", "value2", user: "Homebrew")
|
||||
expect(query).to eq("q=value1+value2+user%3AHomebrew&per_page=100")
|
||||
end
|
||||
|
||||
it "turns array values into multiple key:value parameters" do
|
||||
query = subject.query_string(user: ["Homebrew", "caskroom"])
|
||||
expect(query).to eq("q=user%3AHomebrew+user%3Acaskroom&per_page=100")
|
||||
end
|
||||
end
|
||||
|
||||
describe "::search_issues", :needs_network do
|
||||
it "queries GitHub issues with the passed parameters" do
|
||||
results = subject.search_issues("brew search", repo: "Homebrew/brew", author: "avetamine", is: "closed")
|
||||
expect(results).not_to be_empty
|
||||
expect(results.last["title"]).to eq("brew search : 422 Unprocessable Entity")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -227,72 +227,62 @@ module GitHub
|
||||
end
|
||||
end
|
||||
|
||||
def issues_matching(query, qualifiers = {})
|
||||
uri = URI.parse("#{API_URL}/search/issues")
|
||||
uri.query = build_query_string(query, qualifiers)
|
||||
open(uri) { |json| json["items"] }
|
||||
def search_issues(query, **qualifiers)
|
||||
search("issues", query, **qualifiers)
|
||||
end
|
||||
|
||||
def repository(user, repo)
|
||||
open(URI.parse("#{API_URL}/repos/#{user}/#{repo}"))
|
||||
open(url_to("repos", user, repo))
|
||||
end
|
||||
|
||||
def search_code(*params)
|
||||
uri = URI.parse("#{API_URL}/search/code")
|
||||
uri.query = "q=#{uri_escape(params.join(" "))}"
|
||||
open(uri) { |json| json["items"] }
|
||||
end
|
||||
|
||||
def build_query_string(query, qualifiers)
|
||||
s = "q=#{uri_escape(query)}+"
|
||||
s << build_search_qualifier_string(qualifiers)
|
||||
s << "&per_page=100"
|
||||
end
|
||||
|
||||
def build_search_qualifier_string(qualifiers)
|
||||
{
|
||||
repo: "Homebrew/homebrew-core",
|
||||
in: "title",
|
||||
}.update(qualifiers).map do |qualifier, value|
|
||||
"#{qualifier}:#{value}"
|
||||
end.join("+")
|
||||
end
|
||||
|
||||
def uri_escape(query)
|
||||
if URI.respond_to?(:encode_www_form_component)
|
||||
URI.encode_www_form_component(query)
|
||||
else
|
||||
require "erb"
|
||||
ERB::Util.url_encode(query)
|
||||
end
|
||||
def search_code(**qualifiers)
|
||||
search("code", **qualifiers)
|
||||
end
|
||||
|
||||
def issues_for_formula(name, options = {})
|
||||
tap = options[:tap] || CoreTap.instance
|
||||
issues_matching(name, state: "open", repo: "#{tap.user}/homebrew-#{tap.repo}")
|
||||
search_issues(name, state: "open", repo: "#{tap.user}/homebrew-#{tap.repo}")
|
||||
end
|
||||
|
||||
def print_pull_requests_matching(query)
|
||||
return [] if ENV["HOMEBREW_NO_GITHUB_API"]
|
||||
|
||||
open_or_closed_prs = issues_matching(query, type: "pr")
|
||||
open_or_closed_prs = search_issues(query, type: "pr")
|
||||
|
||||
open_prs = open_or_closed_prs.select { |i| i["state"] == "open" }
|
||||
if !open_prs.empty?
|
||||
prs = if !open_prs.empty?
|
||||
puts "Open pull requests:"
|
||||
prs = open_prs
|
||||
elsif !open_or_closed_prs.empty?
|
||||
puts "Closed pull requests:"
|
||||
prs = open_or_closed_prs
|
||||
open_prs
|
||||
else
|
||||
return
|
||||
puts "Closed pull requests:" unless open_or_closed_prs.empty?
|
||||
open_or_closed_prs
|
||||
end
|
||||
|
||||
prs.each { |i| puts "#{i["title"]} (#{i["html_url"]})" }
|
||||
end
|
||||
|
||||
def private_repo?(full_name)
|
||||
uri = URI.parse("#{API_URL}/repos/#{full_name}")
|
||||
uri = url_to "repos", full_name
|
||||
open(uri) { |json| json["private"] }
|
||||
end
|
||||
|
||||
def query_string(*main_params, **qualifiers)
|
||||
params = main_params
|
||||
|
||||
params += qualifiers.flat_map do |key, value|
|
||||
Array(value).map { |v| "#{key}:#{v}" }
|
||||
end
|
||||
|
||||
"q=#{URI.encode_www_form_component(params.join(" "))}&per_page=100"
|
||||
end
|
||||
|
||||
def url_to(*subroutes)
|
||||
URI.parse([API_URL, *subroutes].join("/"))
|
||||
end
|
||||
|
||||
def search(entity, *queries, **qualifiers)
|
||||
uri = url_to "search", entity
|
||||
uri.query = query_string(*queries, **qualifiers)
|
||||
open(uri) { |json| Array(json["items"]) }
|
||||
end
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user