lita-github 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/lib/lita-github/repo.rb +7 -0
- data/lib/lita-github/version.rb +1 -1
- data/lib/lita/handlers/github.rb +7 -7
- data/lib/lita/handlers/github_pr.rb +36 -0
- data/lib/lita/handlers/github_repo.rb +0 -6
- data/locales/en.yml +3 -0
- data/spec/unit/lita-github/repo_spec.rb +20 -0
- data/spec/unit/lita/handlers/github_pr_spec.rb +101 -0
- data/spec/unit/lita/handlers/github_repo_spec.rb +0 -11
- data/spec/unit/lita/handlers/github_spec.rb +5 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 807063c8ac3a37a3d99452dd97ca4697b25466ee
|
4
|
+
data.tar.gz: b05330632d6bec6b9e2de3dda514770ad5f5d4fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89cccb87fe4a2a3dd8023fb53a8e5752bf45dfe1c4ef0d9d45442e5cecbbec80ffaa2040ffcc7d0e1f2ce644c8805be1e712d91fccad001c0dffe1829903d05a
|
7
|
+
data.tar.gz: a880e825a989589478bd1eef547c94d034192370e6b23c659cc92fa1ab791dd0b43e24c3692f3c071091f9ed67bca542f2754781e392c6dceeb85bcd94a58f1a
|
data/README.md
CHANGED
@@ -63,3 +63,5 @@ Here is the current functionality:
|
|
63
63
|
* `!gh pr merge #42 PagerDuty/lita-github` or `!shipit #42 PagerDuty/lita-github`
|
64
64
|
* This merges the specified pull request
|
65
65
|
* This method can be disabled by setting `config.handlers.github.pr_merge_enabled = false` in your configuration file
|
66
|
+
* `!gh pr list PagerDuty/lita-github`
|
67
|
+
* list the open pull requests on a repo
|
data/lib/lita-github/repo.rb
CHANGED
@@ -17,6 +17,8 @@
|
|
17
17
|
module LitaGithub
|
18
18
|
# Github handler common-use Repository methods
|
19
19
|
module Repo
|
20
|
+
PR_LIST_MAX_COUNT = 20
|
21
|
+
|
20
22
|
def rpo(org, repo)
|
21
23
|
"#{org}/#{repo}"
|
22
24
|
end
|
@@ -24,5 +26,10 @@ module LitaGithub
|
|
24
26
|
def repo?(r)
|
25
27
|
octo.repository?(r)
|
26
28
|
end
|
29
|
+
|
30
|
+
def repo_match(response)
|
31
|
+
md = response.match_data
|
32
|
+
[organization(md['org']), md['repo']]
|
33
|
+
end
|
27
34
|
end
|
28
35
|
end
|
data/lib/lita-github/version.rb
CHANGED
data/lib/lita/handlers/github.rb
CHANGED
@@ -32,7 +32,7 @@ module Lita
|
|
32
32
|
on :loaded, :setup_octo # from LitaGithub::Octo
|
33
33
|
|
34
34
|
route(
|
35
|
-
/#{LitaGithub::R::A_REG}status/, :
|
35
|
+
/#{LitaGithub::R::A_REG}status/, :status,
|
36
36
|
command: true,
|
37
37
|
help: {
|
38
38
|
'github status' => 'get the system status from GitHub',
|
@@ -41,7 +41,7 @@ module Lita
|
|
41
41
|
)
|
42
42
|
|
43
43
|
route(
|
44
|
-
/#{LitaGithub::R::A_REG}(?:v|version|build)/, :
|
44
|
+
/#{LitaGithub::R::A_REG}(?:v|version|build)/, :version,
|
45
45
|
command: true,
|
46
46
|
help: {
|
47
47
|
'gh version' => 'get the lita-github version'
|
@@ -76,11 +76,15 @@ module Lita
|
|
76
76
|
config.pr_merge_enabled = true
|
77
77
|
end
|
78
78
|
|
79
|
-
def
|
79
|
+
def status(response)
|
80
80
|
status = octo.github_status_last_message
|
81
81
|
response.reply(t("status.#{status[:status]}", status))
|
82
82
|
end
|
83
83
|
|
84
|
+
def version(response)
|
85
|
+
response.reply("lita-github v#{LitaGithub::VERSION}")
|
86
|
+
end
|
87
|
+
|
84
88
|
def token_generate(response)
|
85
89
|
if config.totp_secret.is_a?(String)
|
86
90
|
response.reply(t('token_generate.totp', token: ROTP::TOTP.new(config.totp_secret).now))
|
@@ -88,10 +92,6 @@ module Lita
|
|
88
92
|
response.reply(t('token_generate.no_secret'))
|
89
93
|
end
|
90
94
|
end
|
91
|
-
|
92
|
-
def gh_version(response)
|
93
|
-
response.reply("lita-github v#{LitaGithub::VERSION}")
|
94
|
-
end
|
95
95
|
end
|
96
96
|
|
97
97
|
Lita.register_handler(Github)
|
@@ -52,6 +52,14 @@ module Lita
|
|
52
52
|
}
|
53
53
|
)
|
54
54
|
|
55
|
+
route(
|
56
|
+
/#{LitaGithub::R::A_REG}pr\s+?list\s+?#{LitaGithub::R::REPO_REGEX}/, :pr_list,
|
57
|
+
command: true,
|
58
|
+
help: {
|
59
|
+
'gh pr list PagerDuty/lita-github' => 'list the 10 oldest and newest PRs'
|
60
|
+
}
|
61
|
+
)
|
62
|
+
|
55
63
|
# rubocop:disable Metrics/CyclomaticComplexity
|
56
64
|
# rubocop:disable Metrics/PerceivedComplexity
|
57
65
|
def pr_info(response)
|
@@ -98,6 +106,30 @@ module Lita
|
|
98
106
|
# rubocop:enable Metrics/CyclomaticComplexity
|
99
107
|
# rubocop:enable Metrics/PerceivedComplexity
|
100
108
|
|
109
|
+
def pr_list(response)
|
110
|
+
org, repo = repo_match(response)
|
111
|
+
full_name = rpo(org, repo)
|
112
|
+
reply = ''
|
113
|
+
|
114
|
+
prs = octo.pull_requests(full_name)
|
115
|
+
|
116
|
+
if prs.length > LitaGithub::Repo::PR_LIST_MAX_COUNT
|
117
|
+
reply = t('pr_list.large_list', max: LitaGithub::Repo::PR_LIST_MAX_COUNT)
|
118
|
+
|
119
|
+
prs.slice(0, 10).each { |pr| reply << list_line(pr, full_name) }
|
120
|
+
|
121
|
+
reply << "----\n"
|
122
|
+
|
123
|
+
prs.slice(-10, 10).each { |pr| reply << list_line(pr, full_name) }
|
124
|
+
elsif prs.length > 0
|
125
|
+
prs.each { |pr| reply << list_line(pr, full_name) }
|
126
|
+
else
|
127
|
+
reply = t('pr_list.no_prs')
|
128
|
+
end
|
129
|
+
|
130
|
+
response.reply(reply)
|
131
|
+
end
|
132
|
+
|
101
133
|
private
|
102
134
|
|
103
135
|
def pr_match(response)
|
@@ -183,6 +215,10 @@ module Lita
|
|
183
215
|
info[:comments] = pr_obj[:comments]
|
184
216
|
info
|
185
217
|
end
|
218
|
+
|
219
|
+
def list_line(pr, full_name)
|
220
|
+
t('pr_info.header', build_pr_header!({}, pr).merge(repo: full_name))
|
221
|
+
end
|
186
222
|
end
|
187
223
|
|
188
224
|
Lita.register_handler(GithubPR)
|
@@ -117,12 +117,6 @@ module Lita
|
|
117
117
|
o
|
118
118
|
end
|
119
119
|
|
120
|
-
# TODO: convert this to a mixin method for reuse
|
121
|
-
def repo_match(response)
|
122
|
-
md = response.match_data
|
123
|
-
[organization(md['org']), md['repo']]
|
124
|
-
end
|
125
|
-
|
126
120
|
def extrapolate_create_opts(opts, org)
|
127
121
|
opts[:organization] = org
|
128
122
|
|
data/locales/en.yml
CHANGED
@@ -35,3 +35,6 @@ en:
|
|
35
35
|
pr_merge:
|
36
36
|
pass: "Merged pull request #%{pr} from %{org}/%{branch}\n%{title}"
|
37
37
|
fail: "Failed trying to merge PR #%{pr} (%{title}) :: %{url}\nMessage: %{msg}"
|
38
|
+
pr_list:
|
39
|
+
large_list: "You have more than %{max} open pull requests :(! Here are the ten newest oldest:\n"
|
40
|
+
no_prs: "This repo has no open pull requests; good job!"
|
@@ -5,6 +5,13 @@ require 'spec_helper'
|
|
5
5
|
describe LitaGithub::Repo do
|
6
6
|
include LitaGithub::Repo
|
7
7
|
|
8
|
+
describe '::PR_LIST_MAX_COUNT' do
|
9
|
+
subject { LitaGithub::Repo::PR_LIST_MAX_COUNT }
|
10
|
+
|
11
|
+
it { should be_an_instance_of Fixnum }
|
12
|
+
it { should eql 20 }
|
13
|
+
end
|
14
|
+
|
8
15
|
describe '.rpo' do
|
9
16
|
it 'should return the provided arguments in a Repo-like string' do
|
10
17
|
org = 'GrapeDuty'
|
@@ -34,4 +41,17 @@ describe LitaGithub::Repo do
|
|
34
41
|
it { should be_falsey }
|
35
42
|
end
|
36
43
|
end
|
44
|
+
|
45
|
+
describe '.repo_match' do
|
46
|
+
before { allow(self).to receive(:organization).and_return('GrapeDuty') }
|
47
|
+
|
48
|
+
let(:resp_obj) do
|
49
|
+
md_mock = { 'org' => 'GrapeDuty', 'repo' => 'lita-test' }
|
50
|
+
double('Lita::Response', match_data: md_mock)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should return the Org/Repo match' do
|
54
|
+
expect(repo_match(resp_obj)).to eql ['GrapeDuty', 'lita-test']
|
55
|
+
end
|
56
|
+
end
|
37
57
|
end
|
@@ -366,6 +366,16 @@ describe Lita::Handlers::GithubPR, lita_handler: true do
|
|
366
366
|
end
|
367
367
|
end
|
368
368
|
|
369
|
+
describe '.list_line' do
|
370
|
+
let(:pr) { { title: 'Test', number: 42, html_url: 'nothtml' } }
|
371
|
+
let(:full_name) { 'GrapeDuty/lita-test' }
|
372
|
+
|
373
|
+
it 'should return a PR header' do
|
374
|
+
l = github_pr.send(:list_line, pr, full_name)
|
375
|
+
expect(l).to eql "GrapeDuty/lita-test #42: Test :: nothtml\n"
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
369
379
|
####
|
370
380
|
# Handlers
|
371
381
|
####
|
@@ -549,4 +559,95 @@ describe Lita::Handlers::GithubPR, lita_handler: true do
|
|
549
559
|
end
|
550
560
|
end
|
551
561
|
end
|
562
|
+
|
563
|
+
describe '.pr_list' do
|
564
|
+
before do
|
565
|
+
cfg_obj = double('Lita::Configuration')
|
566
|
+
octo_obj = double('Octokit::Client', pull_requests: [])
|
567
|
+
allow(github_pr).to receive(:octo).and_return(octo_obj)
|
568
|
+
allow(github_pr).to receive(:config).and_return(cfg_obj)
|
569
|
+
end
|
570
|
+
|
571
|
+
context 'when there are no pull requests' do
|
572
|
+
it 'should state that there are no pull requests' do
|
573
|
+
send_command("gh pr list #{github_org}/#{github_repo}")
|
574
|
+
expect(replies.last).to eql 'This repo has no open pull requests; good job!'
|
575
|
+
end
|
576
|
+
end
|
577
|
+
|
578
|
+
context 'when there are less than 20 prs' do
|
579
|
+
before do
|
580
|
+
pr = [
|
581
|
+
{ title: 'Test2', number: 84, html_url: 'nohtmlurl' },
|
582
|
+
{ title: 'Test1', number: 42, html_url: 'htmlurl' }
|
583
|
+
]
|
584
|
+
octo_obj = double('Octokit::Client', pull_requests: pr)
|
585
|
+
allow(github_pr).to receive(:octo).and_return(octo_obj)
|
586
|
+
end
|
587
|
+
|
588
|
+
it 'should reply with the PRs' do
|
589
|
+
send_command("gh pr list #{github_org}/#{github_repo}")
|
590
|
+
expect(replies.last).to eql "GrapeDuty/lita-test #84: Test2 :: nohtmlurl\n" \
|
591
|
+
"GrapeDuty/lita-test #42: Test1 :: htmlurl\n"
|
592
|
+
end
|
593
|
+
end
|
594
|
+
|
595
|
+
context 'when there are more than 20 prs' do
|
596
|
+
before do
|
597
|
+
pr = [
|
598
|
+
{ title: 'Test21', number: 84, html_url: 'xxx' },
|
599
|
+
{ title: 'Test20', number: 83, html_url: 'xxx' },
|
600
|
+
{ title: 'Test19', number: 82, html_url: 'xxx' },
|
601
|
+
{ title: 'Test18', number: 80, html_url: 'xxx' },
|
602
|
+
{ title: 'Test17', number: 78, html_url: 'xxx' },
|
603
|
+
{ title: 'Test16', number: 74, html_url: 'xxx' },
|
604
|
+
{ title: 'Test15', number: 68, html_url: 'xxx' },
|
605
|
+
{ title: 'Test14', number: 66, html_url: 'xxx' },
|
606
|
+
{ title: 'Test13', number: 64, html_url: 'xxx' },
|
607
|
+
{ title: 'Test12', number: 55, html_url: 'xxx' },
|
608
|
+
{ title: 'Test11', number: 52, html_url: 'xxx' },
|
609
|
+
{ title: 'Test10', number: 51, html_url: 'xxx' },
|
610
|
+
{ title: 'Test9', number: 50, html_url: 'xxx' },
|
611
|
+
{ title: 'Test8', number: 49, html_url: 'xxx' },
|
612
|
+
{ title: 'Test7', number: 48, html_url: 'xxx' },
|
613
|
+
{ title: 'Test6', number: 47, html_url: 'xxx' },
|
614
|
+
{ title: 'Test5', number: 46, html_url: 'xxx' },
|
615
|
+
{ title: 'Test4', number: 45, html_url: 'xxx' },
|
616
|
+
{ title: 'Test3', number: 44, html_url: 'xxx' },
|
617
|
+
{ title: 'Test2', number: 43, html_url: 'xxx' },
|
618
|
+
{ title: 'Test1', number: 42, html_url: 'xxx' }
|
619
|
+
]
|
620
|
+
octo_obj = double('Octokit::Client', pull_requests: pr)
|
621
|
+
allow(github_pr).to receive(:octo).and_return(octo_obj)
|
622
|
+
end
|
623
|
+
|
624
|
+
it 'should return the list of ten oldest & ten newest' do
|
625
|
+
send_command("gh pr list #{github_org}/#{github_repo}")
|
626
|
+
expect(replies.last)
|
627
|
+
.to eql "You have more than 20 open pull requests :(! Here are the ten newest oldest:
|
628
|
+
GrapeDuty/lita-test #84: Test21 :: xxx
|
629
|
+
GrapeDuty/lita-test #83: Test20 :: xxx
|
630
|
+
GrapeDuty/lita-test #82: Test19 :: xxx
|
631
|
+
GrapeDuty/lita-test #80: Test18 :: xxx
|
632
|
+
GrapeDuty/lita-test #78: Test17 :: xxx
|
633
|
+
GrapeDuty/lita-test #74: Test16 :: xxx
|
634
|
+
GrapeDuty/lita-test #68: Test15 :: xxx
|
635
|
+
GrapeDuty/lita-test #66: Test14 :: xxx
|
636
|
+
GrapeDuty/lita-test #64: Test13 :: xxx
|
637
|
+
GrapeDuty/lita-test #55: Test12 :: xxx
|
638
|
+
----
|
639
|
+
GrapeDuty/lita-test #51: Test10 :: xxx
|
640
|
+
GrapeDuty/lita-test #50: Test9 :: xxx
|
641
|
+
GrapeDuty/lita-test #49: Test8 :: xxx
|
642
|
+
GrapeDuty/lita-test #48: Test7 :: xxx
|
643
|
+
GrapeDuty/lita-test #47: Test6 :: xxx
|
644
|
+
GrapeDuty/lita-test #46: Test5 :: xxx
|
645
|
+
GrapeDuty/lita-test #45: Test4 :: xxx
|
646
|
+
GrapeDuty/lita-test #44: Test3 :: xxx
|
647
|
+
GrapeDuty/lita-test #43: Test2 :: xxx
|
648
|
+
GrapeDuty/lita-test #42: Test1 :: xxx
|
649
|
+
"
|
650
|
+
end
|
651
|
+
end
|
652
|
+
end
|
552
653
|
end
|
@@ -151,17 +151,6 @@ describe Lita::Handlers::GithubRepo, lita_handler: true do
|
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|
154
|
-
describe '.repo_match' do
|
155
|
-
let(:resp_obj) do
|
156
|
-
md_mock = { 'org' => github_org, 'repo' => 'lita-test' }
|
157
|
-
double('Lita::Response', match_data: md_mock)
|
158
|
-
end
|
159
|
-
|
160
|
-
it 'should return the Org/Repo match' do
|
161
|
-
expect(github_repo.send(:repo_match, resp_obj)).to eql [github_org, 'lita-test']
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
154
|
describe '.command_opts' do
|
166
155
|
it 'should find the valid options' do
|
167
156
|
o = ' private:true team:heckman bacon:always bacon:sometimes'
|
@@ -19,9 +19,9 @@ require 'spec_helper'
|
|
19
19
|
describe Lita::Handlers::Github, lita_handler: true do
|
20
20
|
let(:github) { Lita::Handlers::Github.new('robot') }
|
21
21
|
|
22
|
-
it { routes_command('gh status').to(:
|
23
|
-
it { routes_command('github status').to(:
|
24
|
-
it { routes_command('gh version').to(:
|
22
|
+
it { routes_command('gh status').to(:status) }
|
23
|
+
it { routes_command('github status').to(:status) }
|
24
|
+
it { routes_command('gh version').to(:version) }
|
25
25
|
it { routes_command('gh token').to(:token_generate) }
|
26
26
|
|
27
27
|
describe '#default_config' do
|
@@ -42,7 +42,7 @@ describe Lita::Handlers::Github, lita_handler: true do
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
describe '.
|
45
|
+
describe '.status' do
|
46
46
|
context 'when GitHub status is good' do
|
47
47
|
before do
|
48
48
|
@octo = double(
|
@@ -104,7 +104,7 @@ describe Lita::Handlers::Github, lita_handler: true do
|
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
107
|
-
describe '.
|
107
|
+
describe '.version' do
|
108
108
|
it 'should send back the Lita version' do
|
109
109
|
send_command('gh version')
|
110
110
|
expect(replies.last).to eql "lita-github v#{LitaGithub::VERSION}"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-github
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Heckman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|