Skip to content
This repository was archived by the owner on Nov 8, 2018. It is now read-only.

Commit e48e45f

Browse files
committed
support label filtering
1 parent f41a8a1 commit e48e45f

File tree

4 files changed

+68
-1
lines changed

4 files changed

+68
-1
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ resource_types:
5555
* `disable_forks`: *Optional.* If set to `true`, it will filter out pull requests that
5656
were created via users that forked from your repo.
5757

58+
* `label`: *Optional.* If set to a string it will only return pull requests that have been
59+
marked with that specific label. It is case insensitive.
60+
5861
* `username`: *Optional.* Username for HTTP(S) auth when pulling/pushing.
5962
This is needed when only HTTP/HTTPS protocol for git is available (which does not support private key auth)
6063
and auth is required.

assets/lib/filters/label.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module Filters
2+
class Label
3+
def initialize(pull_requests:, input: Input.instance)
4+
@pull_requests = pull_requests
5+
@input = input
6+
end
7+
8+
def pull_requests
9+
if @input.source.label
10+
@memoized ||= @pull_requests.select do |pr|
11+
issue = Octokit.issue(@input.source.repo, pr.id)
12+
labels = issue[:labels] || []
13+
labels.find { |l| l['name'].to_s.casecmp(@input.source.label.to_s.downcase).zero? }
14+
end
15+
else
16+
@pull_requests
17+
end
18+
end
19+
end
20+
end

assets/lib/repository.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
require_relative 'filters/all'
22
require_relative 'filters/fork'
3+
require_relative 'filters/label'
34
require_relative 'filters/path'
45

56
class Repository
67
attr_reader :name
78

8-
def initialize(name:, input: Input.instance, filters: [Filters::All, Filters::Path, Filters::Fork])
9+
def initialize(name:, input: Input.instance, filters: [Filters::All, Filters::Path, Filters::Fork, Filters::Label])
910
@filters = filters
1011
@name = name
1112
@input = input

spec/filters/label_spec.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
require_relative '../../assets/lib/filters/label'
2+
require_relative '../../assets/lib/pull_request'
3+
require 'webmock/rspec'
4+
5+
describe Filters::Label do
6+
let(:ignore_pr) do
7+
PullRequest.new(pr: { 'number' => 1 })
8+
end
9+
10+
let(:pr) do
11+
PullRequest.new(pr: { 'number' => 2 })
12+
end
13+
14+
let(:pull_requests) { [ignore_pr, pr] }
15+
16+
def stub_json(uri, body)
17+
stub_request(:get, uri)
18+
.to_return(headers: { 'Content-Type' => 'application/json' }, body: body.to_json)
19+
end
20+
21+
context 'when no label is specified' do
22+
it 'does not filter' do
23+
payload = { 'source' => { 'repo' => 'user/repo' } }
24+
filter = described_class.new(pull_requests: pull_requests, input: Input.instance(payload: payload))
25+
26+
expect(filter.pull_requests).to eq pull_requests
27+
end
28+
end
29+
30+
context 'when the label for filtering is provided' do
31+
before do
32+
stub_json(%r{https://api.github.com/repos/user/repo/issues/1}, 'labels' => [{ 'name' => 'feature' }])
33+
stub_json(%r{https://api.github.com/repos/user/repo/issues/2}, 'labels' => [{ 'name' => 'bug' }])
34+
end
35+
36+
it 'only returns PRs with that label' do
37+
payload = { 'source' => { 'repo' => 'user/repo', 'label' => 'bug' } }
38+
filter = described_class.new(pull_requests: pull_requests, input: Input.instance(payload: payload))
39+
40+
expect(filter.pull_requests).to eq [pr]
41+
end
42+
end
43+
end

0 commit comments

Comments
 (0)