lita-github 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +1 -0
- data/README.md +6 -0
- data/lib/lita-github.rb +1 -0
- data/lib/lita-github/filters.rb +24 -0
- data/lib/lita-github/org.rb +24 -0
- data/lib/lita-github/r.rb +2 -2
- data/lib/lita-github/repo.rb +28 -0
- data/lib/lita-github/version.rb +1 -1
- data/lib/lita/handlers/github.rb +2 -1
- data/lib/lita/handlers/github_repo.rb +191 -0
- data/lita-github.gemspec +1 -2
- data/locales/en.yml +1 -0
- data/spec/spec_helper.rb +2 -6
- data/spec/unit/lita-github/filters_spec.rb +31 -0
- data/spec/unit/lita-github/org_spec.rb +32 -0
- data/spec/unit/lita-github/r_spec.rb +22 -6
- data/spec/unit/lita-github/repo_spec.rb +37 -0
- data/spec/unit/lita/handlers/github_repo_spec.rb +326 -0
- metadata +22 -19
- data/Gemfile.lock +0 -113
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83ef88d9ef27a589ab808c94f5acbee5c45890f3
|
4
|
+
data.tar.gz: 72f83141ec52828b41e684fce7a60371ef0f1270
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 299cbb26470c5d2d99d3eaaf34bf61b5d5de8e88b6a0b701a24e09d02eb492b4e7db75e3642a729a4a6326f75635c4fe0c933a725ed1dfa1ad3c94c0c5ffca65
|
7
|
+
data.tar.gz: 3ca05325963bcc50abb0f39bb91f54acee4147699b513a3d06d272d4f8ed473b6d4d60292ab6b45877267387239a3c3ccb68b9833b9bba7710eaca892269f394
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
lita-github
|
2
2
|
===========
|
3
|
+
[![Build Status](https://img.shields.io/travis/PagerDuty/lita-github/master.svg)](https://travis-ci.org/PagerDuty/lita-github)
|
4
|
+
[![MIT License](https://img.shields.io/badge/license-Apache%202.0-brightgreen.svg)](https://tldrlegal.com/license/apache-license-2.0-(apache-2.0))
|
5
|
+
[![RubyGems :: lita-github Gem Version](http://img.shields.io/gem/v/lita-github.svg)](https://rubygems.org/gems/lita-github)
|
6
|
+
[![Code Climate Quality](https://img.shields.io/codeclimate/github/PagerDuty/lita-github.svg)](https://codeclimate.com/github/PagerDuty/lita-github)
|
7
|
+
[![Code Climate Coverage](http://img.shields.io/codeclimate/coverage/github/PagerDuty/lita-github.svg)](https://codeclimate.com/github/PagerDuty/lita-github)
|
8
|
+
|
3
9
|
Copyright 2014 PagerDuty, Inc.
|
4
10
|
|
5
11
|
Lita handler for GitHub-related operations. This include administrative management of organizations and repository management/operations.
|
data/lib/lita-github.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright 2014 PagerDuty, Inc.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
module LitaGithub
|
18
|
+
# Github handler common-use method filters
|
19
|
+
module Filters
|
20
|
+
def func_disabled?(method)
|
21
|
+
config.send("#{method}_enabled".to_sym) ? false : true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright 2014 PagerDuty, Inc.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
module LitaGithub
|
18
|
+
# Github handler common-use Organization methods
|
19
|
+
module Org
|
20
|
+
def organization(name)
|
21
|
+
name.nil? || name.empty? ? config.default_org : name
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/lita-github/r.rb
CHANGED
@@ -22,9 +22,9 @@ module LitaGithub
|
|
22
22
|
|
23
23
|
# option regex, letting you scan the command string of things like:
|
24
24
|
# key1:value key2:value, etc.
|
25
|
-
OPT_REGEX ||= /((?:\s+?[a-zA-Z0-9_]+?):(?:[a-zA-Z0-9_]+))
|
25
|
+
OPT_REGEX ||= /((?:\s+?[a-zA-Z0-9_]+?):(?:[a-zA-Z0-9_]+))/
|
26
26
|
|
27
27
|
# regex matcher for: Org/repo
|
28
|
-
REPO_REGEX = '(?:(?<org
|
28
|
+
REPO_REGEX = '(?:(?<org>[a-zA-Z0-9_\-]+)(?:\s+?)?\/)?(?:\s+?)?(?<repo>[a-zA-Z0-9_\-]+)'
|
29
29
|
end
|
30
30
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright 2014 PagerDuty, Inc.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
module LitaGithub
|
18
|
+
# Github handler common-use Repository methods
|
19
|
+
module Repo
|
20
|
+
def rpo(org, repo)
|
21
|
+
"#{org}/#{repo}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def repo?(r)
|
25
|
+
octo.repository?(r)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/lita-github/version.rb
CHANGED
data/lib/lita/handlers/github.rb
CHANGED
@@ -14,7 +14,6 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
-
require 'octokit'
|
18
17
|
require 'lita-github/version'
|
19
18
|
require 'lita-github/r'
|
20
19
|
require 'lita-github/config'
|
@@ -49,6 +48,8 @@ module Lita
|
|
49
48
|
)
|
50
49
|
|
51
50
|
def self.default_config(config)
|
51
|
+
# when setting default configuration values please remember one thing:
|
52
|
+
# secure and safe by default
|
52
53
|
config.repo_delete_enabled = false
|
53
54
|
config.repo_private_default = true
|
54
55
|
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright 2014 PagerDuty, Inc.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
require 'lita-github/r'
|
18
|
+
require 'lita-github/config'
|
19
|
+
require 'lita-github/octo'
|
20
|
+
require 'lita-github/org'
|
21
|
+
require 'lita-github/repo'
|
22
|
+
require 'lita-github/filters'
|
23
|
+
|
24
|
+
module Lita
|
25
|
+
# Lita Handler
|
26
|
+
module Handlers
|
27
|
+
# GitHub Lita Handler
|
28
|
+
class GithubRepo < Handler
|
29
|
+
include LitaGithub::Config # Github handler Lita configuration methods
|
30
|
+
include LitaGithub::Octo # Github handler common-use Octokit methods
|
31
|
+
include LitaGithub::Org # Github handler common-use Organization methods
|
32
|
+
include LitaGithub::Repo # Github handler common-use Repository methods
|
33
|
+
include LitaGithub::Filters # Github handler common-use method filters
|
34
|
+
|
35
|
+
on :loaded, :setup_octo # from LitaGithub::Octo
|
36
|
+
|
37
|
+
route(
|
38
|
+
/#{LitaGithub::R::A_REG}repo\s+?(?:create|new)\s+?#{LitaGithub::R::REPO_REGEX}.*$/,
|
39
|
+
:repo_create,
|
40
|
+
command: true,
|
41
|
+
help: {
|
42
|
+
'gh repo create PagerDuty/lita-github private:true team:heckman' =>
|
43
|
+
'Create the PagerDuty/lita-github repo, make it private, use team with "heckman" slug',
|
44
|
+
'gh repo new PagerDuty/lita-github' =>
|
45
|
+
'create new repo using the default privacy/team settings'
|
46
|
+
}
|
47
|
+
)
|
48
|
+
|
49
|
+
route(
|
50
|
+
/#{LitaGithub::R::A_REG}repo\s+?delete\s+?#{LitaGithub::R::REPO_REGEX}/,
|
51
|
+
:repo_delete, command: true, confirmation: true,
|
52
|
+
help: {
|
53
|
+
'gh repo delete PagerDuty/lita-github' => 'Delete the PagerDuty/lita-github repo'
|
54
|
+
}
|
55
|
+
)
|
56
|
+
|
57
|
+
route(
|
58
|
+
/#{LitaGithub::R::A_REG}repo\s+?info\s+?#{LitaGithub::R::REPO_REGEX}/,
|
59
|
+
:repo_info,
|
60
|
+
command: true,
|
61
|
+
help: {
|
62
|
+
'gh repo info PagerDuty/lita-github' => 'Display some information about the repo'
|
63
|
+
}
|
64
|
+
)
|
65
|
+
|
66
|
+
def repo_create(response)
|
67
|
+
org, repo = repo_match(response)
|
68
|
+
|
69
|
+
if repo?(rpo(org, repo))
|
70
|
+
return response.reply(t('repo_create.exists', org: org, repo: repo))
|
71
|
+
end
|
72
|
+
|
73
|
+
opts = extrapolate_create_opts(command_opts(response.args.join(' ')), org)
|
74
|
+
|
75
|
+
response.reply(create_repo(org, repo, opts))
|
76
|
+
end
|
77
|
+
|
78
|
+
def repo_delete(response)
|
79
|
+
return response.reply(t('method_disabled')) if func_disabled?(__method__)
|
80
|
+
|
81
|
+
org, repo = repo_match(response)
|
82
|
+
|
83
|
+
return response.reply(t('repo_delete.not_found', org: org, repo: repo)) unless repo?(rpo(org, repo))
|
84
|
+
|
85
|
+
response.reply(delete_repo(org, repo))
|
86
|
+
end
|
87
|
+
|
88
|
+
def repo_info(response)
|
89
|
+
org, repo = repo_match(response)
|
90
|
+
opts = {}
|
91
|
+
r_obj = octo.repository(rpo(org, repo))
|
92
|
+
p_obj = octo.pull_requests(rpo(org, repo))
|
93
|
+
|
94
|
+
opts[:repo] = r_obj[:full_name]
|
95
|
+
opts[:description] = r_obj[:description]
|
96
|
+
opts[:private] = r_obj[:private]
|
97
|
+
opts[:url] = r_obj[:html_url]
|
98
|
+
opts[:raw_issues_count] = r_obj[:open_issues_count]
|
99
|
+
opts[:pr_count] = p_obj.length
|
100
|
+
opts[:issues_count] = opts[:raw_issues_count] - opts[:pr_count]
|
101
|
+
|
102
|
+
response.reply(t('repo_info.reply', opts))
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def command_opts(cmd)
|
108
|
+
o = {}
|
109
|
+
cmd.scan(LitaGithub::R::OPT_REGEX).flatten.compact.each do |opt|
|
110
|
+
k, v = opt.strip.split(':')
|
111
|
+
k = k.to_sym
|
112
|
+
o[k] = v unless o.key?(k)
|
113
|
+
end
|
114
|
+
o
|
115
|
+
end
|
116
|
+
|
117
|
+
def repo_match(response)
|
118
|
+
md = response.match_data
|
119
|
+
[organization(md['org']), md['repo']]
|
120
|
+
end
|
121
|
+
|
122
|
+
def extrapolate_create_opts(opts, org)
|
123
|
+
opts[:organization] = org
|
124
|
+
|
125
|
+
if opts.key?(:team)
|
126
|
+
opts[:team_id] = team_by_slug(opts[:team], org) || team_by_slug(config.default_team_slug, org)
|
127
|
+
else
|
128
|
+
opts[:team_id] = team_by_slug(config.default_team_slug, org)
|
129
|
+
end unless opts.key?(:team_id)
|
130
|
+
opts
|
131
|
+
end
|
132
|
+
|
133
|
+
def team_by_slug(slug, org)
|
134
|
+
octo.organization_teams(org).each do |team|
|
135
|
+
return team[:id] if team[:slug] == slug
|
136
|
+
end
|
137
|
+
nil
|
138
|
+
end
|
139
|
+
|
140
|
+
def should_repo_be_private?(value)
|
141
|
+
if value.nil? || value.empty?
|
142
|
+
config.repo_private_default
|
143
|
+
else
|
144
|
+
privacy_decider(value)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def privacy_decider(value)
|
149
|
+
case value.downcase
|
150
|
+
when 'true'
|
151
|
+
true
|
152
|
+
when 'false'
|
153
|
+
false
|
154
|
+
else # when some invalud value...
|
155
|
+
config.repo_private_default
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def create_repo(org, repo, opts)
|
160
|
+
reply = nil
|
161
|
+
begin
|
162
|
+
octo.create_repository(repo, opts)
|
163
|
+
ensure
|
164
|
+
if repo?(rpo(org, repo))
|
165
|
+
repo_url = "https://github.com/#{rpo(org, repo)}"
|
166
|
+
reply = t('repo_create.pass', org: org, repo: repo, repo_url: repo_url)
|
167
|
+
else
|
168
|
+
reply = t('repo_create.fail', org: org, repo: repo)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
reply
|
172
|
+
end
|
173
|
+
|
174
|
+
def delete_repo(org, repo)
|
175
|
+
reply = nil
|
176
|
+
begin
|
177
|
+
octo.delete_repository(rpo(org, repo))
|
178
|
+
ensure
|
179
|
+
if repo?(rpo(org, repo))
|
180
|
+
reply = t('repo_delete.fail', org: org, repo: repo)
|
181
|
+
else
|
182
|
+
reply = t('repo_delete.pass', org: org, repo: repo)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
reply
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
Lita.register_handler(GithubRepo)
|
190
|
+
end
|
191
|
+
end
|
data/lita-github.gemspec
CHANGED
@@ -40,8 +40,7 @@ Gem::Specification.new do |s|
|
|
40
40
|
s.add_development_dependency 'rubocop', '~> 0.25.0'
|
41
41
|
s.add_development_dependency 'rspec', '~> 3.0'
|
42
42
|
s.add_development_dependency 'fuubar', '~> 2.0'
|
43
|
-
s.add_development_dependency '
|
44
|
-
s.add_development_dependency 'simplecov', '~> 0.9'
|
43
|
+
s.add_development_dependency 'codeclimate-test-reporter', '~> 0.4', '>= 0.4.0'
|
45
44
|
|
46
45
|
s.add_runtime_dependency 'lita', '~> 3.3'
|
47
46
|
s.add_runtime_dependency 'octokit', '~> 3.3'
|
data/locales/en.yml
CHANGED
@@ -15,6 +15,7 @@ en:
|
|
15
15
|
repo_delete:
|
16
16
|
pass: "Deleted %{org}/%{repo}"
|
17
17
|
fail: "Unable to delete %{org}/%{repo}"
|
18
|
+
not_found: "That repo (%{org}/%{repo}) does not exist"
|
18
19
|
repo_info:
|
19
20
|
reply: "%{repo} (private:%{private}) :: %{url}\nDesc: %{description}\nIssues: %{issues_count} PRs: %{pr_count}"
|
20
21
|
github_pr:
|
data/spec/spec_helper.rb
CHANGED
@@ -16,12 +16,8 @@
|
|
16
16
|
|
17
17
|
require 'rspec'
|
18
18
|
require 'lita/rspec'
|
19
|
-
|
20
|
-
# require 'simplecov'
|
19
|
+
require 'codeclimate-test-reporter'
|
21
20
|
|
22
|
-
|
23
|
-
# SimpleCov.start do
|
24
|
-
# add_filter 'spec/'
|
25
|
-
# end
|
21
|
+
CodeClimate::TestReporter.start
|
26
22
|
|
27
23
|
require 'lita-github'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe LitaGithub::Filters do
|
6
|
+
include LitaGithub::Filters
|
7
|
+
|
8
|
+
describe '.func_disabled?' do
|
9
|
+
before do
|
10
|
+
@cfg = double('Lita::Configuration', test_enabled: true)
|
11
|
+
allow(self).to receive(:config).and_return(@cfg)
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'when enabled' do
|
15
|
+
it 'should return false' do
|
16
|
+
expect(func_disabled?(:test)).to be_falsey
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when disabled' do
|
21
|
+
before do
|
22
|
+
@cfg = double('Lita::Configuration', test_enabled: false)
|
23
|
+
allow(self).to receive(:config).and_return(@cfg)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should return true' do
|
27
|
+
expect(func_disabled?(:test)).to be_truthy
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe LitaGithub::Org do
|
6
|
+
include LitaGithub::Org
|
7
|
+
|
8
|
+
describe '.organization' do
|
9
|
+
before do
|
10
|
+
@cfg = double('Lita::Config', default_org: 'GrapeDuty')
|
11
|
+
allow(self).to receive(:config).and_return(@cfg)
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'when name provided is nil' do
|
15
|
+
it 'should use the default' do
|
16
|
+
expect(organization(nil)).to eql 'GrapeDuty'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when name provided is empty string ("")' do
|
21
|
+
it 'should use the default' do
|
22
|
+
expect(organization('')).to eql 'GrapeDuty'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'when name provided is not nil or not empty string' do
|
27
|
+
it 'should use the name provided' do
|
28
|
+
expect(organization('testing')).to eql 'testing'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -46,25 +46,41 @@ describe LitaGithub::R do
|
|
46
46
|
|
47
47
|
context 'it should match' do
|
48
48
|
it 'test:pass' do
|
49
|
-
|
49
|
+
s = ' test:pass'
|
50
|
+
m = s.scan(subject).flatten.compact
|
51
|
+
expect(m).to eql [' test:pass']
|
50
52
|
end
|
51
53
|
|
52
54
|
it 'test7_pass:pAss_test' do
|
53
|
-
|
55
|
+
s = ' test7_pass:pAss_test'
|
56
|
+
m = s.scan(subject).flatten.compact
|
57
|
+
expect(m).to eql [' test7_pass:pAss_test']
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'test:pass bacon:always test:coverage' do
|
61
|
+
s = ' test:pass bacon:always test:coverage'
|
62
|
+
m = s.scan(subject).flatten.compact
|
63
|
+
expect(m).to eql [' test:pass', ' bacon:always', ' test:coverage']
|
54
64
|
end
|
55
65
|
end
|
56
66
|
|
57
67
|
context 'it should not match' do
|
58
68
|
it 'test-stuff:fail' do
|
59
|
-
|
69
|
+
s = ' test-stuff:fail'
|
70
|
+
m = s.scan(subject).flatten.compact
|
71
|
+
expect(m).to be_empty
|
60
72
|
end
|
61
73
|
|
62
74
|
it 'test: fail' do
|
63
|
-
|
75
|
+
s = ' test: fail'
|
76
|
+
m = s.scan(subject).flatten.compact
|
77
|
+
expect(m).to be_empty
|
64
78
|
end
|
65
79
|
|
66
|
-
it 'test:fail' do
|
67
|
-
|
80
|
+
it 'test:fail (no leading space)' do
|
81
|
+
s = 'test:fail'
|
82
|
+
m = s.scan(subject).flatten.compact
|
83
|
+
expect(m).to be_empty
|
68
84
|
end
|
69
85
|
end
|
70
86
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe LitaGithub::Repo do
|
6
|
+
include LitaGithub::Repo
|
7
|
+
|
8
|
+
describe '.rpo' do
|
9
|
+
it 'should return the provided arguments in a Repo-like string' do
|
10
|
+
org = 'GrapeDuty'
|
11
|
+
repo = 'lita-test'
|
12
|
+
expect(rpo(org, repo)).to eql "#{org}/#{repo}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.repo?' do
|
17
|
+
before do
|
18
|
+
@octo = double('Octokit::Client', repository?: true)
|
19
|
+
allow(self).to receive(:octo).and_return(@octo)
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when repo exists' do
|
23
|
+
subject { repo?('GrapeDuty/lita-test') }
|
24
|
+
it { should be_truthy }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when repo does not exist' do
|
28
|
+
before do
|
29
|
+
@octo = double('Octokit::Client', repository?: false)
|
30
|
+
allow(self).to receive(:octo).and_return(@octo)
|
31
|
+
end
|
32
|
+
|
33
|
+
subject { repo?('GrapeDuty/lita-test') }
|
34
|
+
it { should be_falsey }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,326 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright 2014 GrapeDuty, Inc.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
require 'spec_helper'
|
18
|
+
|
19
|
+
describe Lita::Handlers::GithubRepo, lita_handler: true do
|
20
|
+
# repo_create command routing
|
21
|
+
it { routes_command('gh repo create GrapeDuty/lita-test').to(:repo_create) }
|
22
|
+
it { routes_command('gh repo new GrapeDuty/lita-test').to(:repo_create) }
|
23
|
+
it { routes_command('gh repo new lita-test').to(:repo_create) }
|
24
|
+
it { routes_command('gh repo new GrapeDuty/lita-test private:true team:heckman').to(:repo_create) }
|
25
|
+
it { routes_command('gh repo new GrapeDuty/lita-test private:true randomunparseabletext ').to(:repo_create) }
|
26
|
+
|
27
|
+
# repo_delete command routing
|
28
|
+
it { routes_command('gh repo delete GrapeDuty/lita-test').to(:repo_delete) }
|
29
|
+
it { routes_command('gh repo delete lita-test').to(:repo_delete) }
|
30
|
+
|
31
|
+
# repo_info command routing
|
32
|
+
it { routes_command('gh repo info GrapeDuty/lita-test').to(:repo_info) }
|
33
|
+
it { routes_command('gh repo info lita-test').to(:repo_info) }
|
34
|
+
|
35
|
+
let(:github_repo) { Lita::Handlers::GithubRepo.new('robot') }
|
36
|
+
let(:github_org) { 'GrapeDuty' }
|
37
|
+
let(:disabled_reply) { 'Sorry, this function has been disabled in the config' }
|
38
|
+
|
39
|
+
####
|
40
|
+
# Helper Methods
|
41
|
+
####
|
42
|
+
describe '.privacy_decider' do
|
43
|
+
before do
|
44
|
+
c_obj = double('Lita::Configuration', repo_private_default: :dummyvalue)
|
45
|
+
allow(github_repo).to receive(:config).and_return(c_obj)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should return true when value is "true"' do
|
49
|
+
expect(github_repo.send(:privacy_decider, 'true')).to be_truthy
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should return true when value is "True"' do
|
53
|
+
expect(github_repo.send(:privacy_decider, 'True')).to be_truthy
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should return false when value is "false"' do
|
57
|
+
expect(github_repo.send(:privacy_decider, 'false')).to be_falsey
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should return the default when the value is something unknown' do
|
61
|
+
expect(github_repo.send(:privacy_decider, 'something')).to eql :dummyvalue
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '.should_repo_be_private?' do
|
66
|
+
before do
|
67
|
+
@c_obj = double('Lita::Configuration', repo_private_default: true)
|
68
|
+
allow(github_repo).to receive(:config).and_return(@c_obj)
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should return the default if value nil' do
|
72
|
+
expect(@c_obj).to receive(:repo_private_default).and_return(:dummyvalue)
|
73
|
+
expect(github_repo.send(:should_repo_be_private?, nil)).to eql :dummyvalue
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should return the default if value empty string ("")' do
|
77
|
+
expect(@c_obj).to receive(:repo_private_default).and_return(:dummyvalue)
|
78
|
+
expect(github_repo.send(:should_repo_be_private?, '')).to eql :dummyvalue
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should call privacy_decider() with the value if not nil or empty' do
|
82
|
+
expect(github_repo).to receive(:privacy_decider).with('ohai').and_return(:dummyvalue)
|
83
|
+
expect(github_repo.send(:should_repo_be_private?, 'ohai')).to eql :dummyvalue
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '.team_by_slug' do
|
88
|
+
before do
|
89
|
+
@teams = [
|
90
|
+
{ id: 1, slug: 'hi' },
|
91
|
+
{ id: 42, slug: 'heckman' },
|
92
|
+
{ id: 84, slug: 'orwell' }
|
93
|
+
]
|
94
|
+
@octo_obj = double('Octokit::Client', organization_teams: @teams)
|
95
|
+
allow(github_repo).to receive(:octo).and_return(@octo_obj)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should return the team id of the team matching the slug' do
|
99
|
+
expect(@octo_obj).to receive(:organization_teams).with(github_org).and_return(@teams)
|
100
|
+
expect(github_repo.send(:team_by_slug, 'heckman', github_org)).to eql 42
|
101
|
+
expect(github_repo.send(:team_by_slug, 'orwell', github_org)).to eql 84
|
102
|
+
expect(github_repo.send(:team_by_slug, 'unknown', github_org)).to be_nil
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should return nil if unknown' do
|
106
|
+
expect(github_repo.send(:team_by_slug, 'unknown', 'x')).to be_nil
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '.extrapolate_create_opts' do
|
111
|
+
before do
|
112
|
+
@eco_opts = {}
|
113
|
+
@c_obj = double('Lita::Configuration', default_team_slug: 'h3ckman')
|
114
|
+
allow(github_repo).to receive(:config).and_return(@c_obj)
|
115
|
+
allow(github_repo).to receive(:team_by_slug).and_return(42)
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'should set the :organization key and :team_id key' do
|
119
|
+
h = { organization: github_org, team_id: 42 }
|
120
|
+
expect(github_repo.send(:extrapolate_create_opts, @eco_opts, github_org)).to eql h
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'when options contains :team and no :team_id' do
|
124
|
+
context 'when given a valid slug' do
|
125
|
+
before { @eco_opts = { team: 'heckman' } }
|
126
|
+
|
127
|
+
it 'should set the :team_id key' do
|
128
|
+
h = { organization: github_org, team_id: 84 }.merge!(@eco_opts)
|
129
|
+
expect(github_repo).to receive(:team_by_slug).with('heckman', github_org).and_return(84)
|
130
|
+
expect(github_repo.send(:extrapolate_create_opts, @eco_opts, github_org)).to eql h
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when given an invalid slug' do
|
135
|
+
it 'should set the team to the default' do
|
136
|
+
h = { organization: github_org, team_id: 42 }.merge!(@eco_opts)
|
137
|
+
expect(github_repo).to receive(:team_by_slug).with('h3ckman', github_org).and_return(42)
|
138
|
+
expect(github_repo.send(:extrapolate_create_opts, @eco_opts, github_org)).to eql h
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'when there is a :team_id key' do
|
144
|
+
before { @eco_opts = { team_id: 44 } }
|
145
|
+
|
146
|
+
it 'should just leave it alone...' do
|
147
|
+
h = { organization: github_org }.merge!(@eco_opts)
|
148
|
+
expect(github_repo).not_to receive(:team_by_slug)
|
149
|
+
expect(github_repo.send(:extrapolate_create_opts, @eco_opts, github_org)).to eql h
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
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
|
+
describe '.command_opts' do
|
166
|
+
it 'should find the valid options' do
|
167
|
+
o = ' private:true team:heckman bacon:always bacon:sometimes'
|
168
|
+
co = github_repo.send(:command_opts, o)
|
169
|
+
expect(co).to be_an_instance_of Hash
|
170
|
+
expect(co[:private]).to eql 'true'
|
171
|
+
expect(co[:team]).to eql 'heckman'
|
172
|
+
expect(co[:bacon]).to eql 'always' # of course it's always
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe '.create_repo' do
|
177
|
+
before do
|
178
|
+
allow(github_repo).to receive(:octo).and_return(double('Octokit::Client', create_repository: nil))
|
179
|
+
end
|
180
|
+
|
181
|
+
context 'when repo created' do
|
182
|
+
before do
|
183
|
+
allow(github_repo).to receive(:repo?).with("#{github_org}/lita-test").and_return(true)
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'should confirm succesfful creation' do
|
187
|
+
opts = { private: true, team_id: 42, organization: github_org }
|
188
|
+
expect(github_repo.send(:create_repo, github_org, 'lita-test', opts))
|
189
|
+
.to eql 'Created GrapeDuty/lita-test: https://github.com/GrapeDuty/lita-test'
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context 'when repo not created' do
|
194
|
+
before do
|
195
|
+
allow(github_repo).to receive(:repo?).with("#{github_org}/lita-test").and_return(false)
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'should confirm failure' do
|
199
|
+
opts = { private: true, team_id: 42, organization: github_org }
|
200
|
+
expect(github_repo.send(:create_repo, github_org, 'lita-test', opts))
|
201
|
+
.to eql 'Unable to create GrapeDuty/lita-test'
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
describe '.delete_repo' do
|
207
|
+
before do
|
208
|
+
allow(github_repo).to receive(:octo).and_return(double('Octokit::Client', delete_repository: nil))
|
209
|
+
end
|
210
|
+
|
211
|
+
context 'when repo deleted' do
|
212
|
+
before do
|
213
|
+
allow(github_repo).to receive(:repo?).with("#{github_org}/lita-test").and_return(false)
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'should confirm successful delete' do
|
217
|
+
expect(github_repo.send(:delete_repo, github_org, 'lita-test'))
|
218
|
+
.to eql 'Deleted GrapeDuty/lita-test'
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context 'when repo not deleted' do
|
223
|
+
before do
|
224
|
+
allow(github_repo).to receive(:repo?).with("#{github_org}/lita-test").and_return(true)
|
225
|
+
end
|
226
|
+
|
227
|
+
it 'should reply with failure message' do
|
228
|
+
expect(github_repo.send(:delete_repo, github_org, 'lita-test'))
|
229
|
+
.to eql 'Unable to delete GrapeDuty/lita-test'
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
####
|
235
|
+
# Handlers
|
236
|
+
####
|
237
|
+
describe '.repo_info' do
|
238
|
+
before do
|
239
|
+
repo = {
|
240
|
+
full_name: "#{github_org}/lita-test",
|
241
|
+
description: 'unit testing',
|
242
|
+
private: true,
|
243
|
+
html_url: "https://stubbed.github.com/#{github_org}/lita-test",
|
244
|
+
open_issues_count: 10
|
245
|
+
}
|
246
|
+
pr = [nil, nil, nil, nil, nil]
|
247
|
+
@octo_obj = double('Octokit::Client', repository: repo, pull_requests: pr)
|
248
|
+
allow(github_repo).to receive(:octo).and_return(@octo_obj)
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'should return some repo info' do
|
252
|
+
send_command('gh repo info GrapeDuty/lita-test')
|
253
|
+
r = "GrapeDuty/lita-test (private:true) :: https://stubbed.github.com/#{github_org}/lita-test\n" \
|
254
|
+
"Desc: unit testing\n" \
|
255
|
+
'Issues: 5 PRs: 5'
|
256
|
+
expect(replies.last).to eql r
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
describe '.repo_delete' do
|
261
|
+
before do
|
262
|
+
allow(github_repo).to receive(:func_disabled?).and_return(false)
|
263
|
+
allow(github_repo).to receive(:delete_repo).and_return('hello there')
|
264
|
+
allow(github_repo).to receive(:repo?).with("#{github_org}/lita-test").and_return(true)
|
265
|
+
end
|
266
|
+
|
267
|
+
it 'reply with the return from delete_repo()' do
|
268
|
+
send_command("gh repo delete #{github_org}/lita-test")
|
269
|
+
expect(replies.last).to eql 'hello there'
|
270
|
+
end
|
271
|
+
|
272
|
+
context 'when command disabled' do
|
273
|
+
before do
|
274
|
+
allow(github_repo).to receive(:func_disabled?).and_return(true)
|
275
|
+
end
|
276
|
+
|
277
|
+
it 'should no-op and say such if the command is disabled' do
|
278
|
+
send_command("gh repo delete #{github_org}/lita-test")
|
279
|
+
expect(replies.last).to eql disabled_reply
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
context 'when repo not found' do
|
284
|
+
before do
|
285
|
+
allow(github_repo).to receive(:repo?).with("#{github_org}/lita-test").and_return(false)
|
286
|
+
end
|
287
|
+
|
288
|
+
it 'should no-op informing you that the repo is not there' do
|
289
|
+
send_command("gh repo delete #{github_org}/lita-test")
|
290
|
+
expect(replies.last).to eql 'That repo (GrapeDuty/lita-test) does not exist'
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
describe '.repo_create' do
|
296
|
+
before do
|
297
|
+
@opts = { private: true, team_id: 42, organization: github_org }
|
298
|
+
allow(github_repo).to receive(:repo?).with("#{github_org}/lita-test").and_return(false)
|
299
|
+
allow(github_repo).to receive(:extrapolate_create_opts).and_return(@opts)
|
300
|
+
allow(github_repo).to receive(:create_repo).and_return('hello from PAX prime!')
|
301
|
+
end
|
302
|
+
|
303
|
+
context 'when repo already exists' do
|
304
|
+
before do
|
305
|
+
allow(github_repo).to receive(:repo?).with("#{github_org}/lita-test").and_return(true)
|
306
|
+
end
|
307
|
+
|
308
|
+
it 'should tell you it already exists' do
|
309
|
+
send_command("gh repo create #{github_org}/lita-test")
|
310
|
+
expect(replies.last).to eql 'Unable to create GrapeDuty/lita-test as it already exists'
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
context 'when repo does not exist' do
|
315
|
+
before do
|
316
|
+
allow(github_repo).to receive(:repo?).with("#{github_org}/lita-test").and_return(false)
|
317
|
+
end
|
318
|
+
|
319
|
+
it 'should reply with the return of create_repo()' do
|
320
|
+
expect(github_repo).to receive(:extrapolate_create_opts).and_return(@opts)
|
321
|
+
send_command("gh repo create #{github_org}/lita-test")
|
322
|
+
expect(replies.last).to eql 'hello from PAX prime!'
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
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.2
|
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-08-
|
11
|
+
date: 2014-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -81,33 +81,25 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '2.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: codeclimate-test-reporter
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
90
|
-
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0.7'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: simplecov
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
89
|
+
version: '0.4'
|
90
|
+
- - ">="
|
102
91
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
92
|
+
version: 0.4.0
|
104
93
|
type: :development
|
105
94
|
prerelease: false
|
106
95
|
version_requirements: !ruby/object:Gem::Requirement
|
107
96
|
requirements:
|
108
97
|
- - "~>"
|
109
98
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0.
|
99
|
+
version: '0.4'
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 0.4.0
|
111
103
|
- !ruby/object:Gem::Dependency
|
112
104
|
name: lita
|
113
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -162,23 +154,30 @@ files:
|
|
162
154
|
- ".rubocop.yml"
|
163
155
|
- ".travis.yml"
|
164
156
|
- Gemfile
|
165
|
-
- Gemfile.lock
|
166
157
|
- LICENSE
|
167
158
|
- README.md
|
168
159
|
- Rakefile
|
169
160
|
- lib/lita-github.rb
|
170
161
|
- lib/lita-github/config.rb
|
162
|
+
- lib/lita-github/filters.rb
|
171
163
|
- lib/lita-github/octo.rb
|
164
|
+
- lib/lita-github/org.rb
|
172
165
|
- lib/lita-github/r.rb
|
166
|
+
- lib/lita-github/repo.rb
|
173
167
|
- lib/lita-github/version.rb
|
174
168
|
- lib/lita/handlers/github.rb
|
169
|
+
- lib/lita/handlers/github_repo.rb
|
175
170
|
- lita-github.gemspec
|
176
171
|
- locales/en.yml
|
177
172
|
- spec/spec_helper.rb
|
178
173
|
- spec/unit/lita-github/config_spec.rb
|
174
|
+
- spec/unit/lita-github/filters_spec.rb
|
179
175
|
- spec/unit/lita-github/octo_spec.rb
|
176
|
+
- spec/unit/lita-github/org_spec.rb
|
180
177
|
- spec/unit/lita-github/r_spec.rb
|
178
|
+
- spec/unit/lita-github/repo_spec.rb
|
181
179
|
- spec/unit/lita-github/version_spec.rb
|
180
|
+
- spec/unit/lita/handlers/github_repo_spec.rb
|
182
181
|
- spec/unit/lita/handlers/github_spec.rb
|
183
182
|
homepage: https://github.com/PagerDuty/lita-github
|
184
183
|
licenses:
|
@@ -208,7 +207,11 @@ summary: GitHub repo/org management in Lita; handler not ready for production
|
|
208
207
|
test_files:
|
209
208
|
- spec/spec_helper.rb
|
210
209
|
- spec/unit/lita-github/config_spec.rb
|
210
|
+
- spec/unit/lita-github/filters_spec.rb
|
211
211
|
- spec/unit/lita-github/octo_spec.rb
|
212
|
+
- spec/unit/lita-github/org_spec.rb
|
212
213
|
- spec/unit/lita-github/r_spec.rb
|
214
|
+
- spec/unit/lita-github/repo_spec.rb
|
213
215
|
- spec/unit/lita-github/version_spec.rb
|
216
|
+
- spec/unit/lita/handlers/github_repo_spec.rb
|
214
217
|
- spec/unit/lita/handlers/github_spec.rb
|
data/Gemfile.lock
DELETED
@@ -1,113 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
lita-github (0.0.1)
|
5
|
-
lita (~> 3.3)
|
6
|
-
lita-confirmation
|
7
|
-
octokit (~> 3.3)
|
8
|
-
|
9
|
-
GEM
|
10
|
-
remote: https://rubygems.org/
|
11
|
-
specs:
|
12
|
-
addressable (2.3.6)
|
13
|
-
ast (2.0.0)
|
14
|
-
coveralls (0.7.0)
|
15
|
-
multi_json (~> 1.3)
|
16
|
-
rest-client
|
17
|
-
simplecov (>= 0.7)
|
18
|
-
term-ansicolor
|
19
|
-
thor
|
20
|
-
diff-lcs (1.2.5)
|
21
|
-
docile (1.1.5)
|
22
|
-
faraday (0.9.0)
|
23
|
-
multipart-post (>= 1.2, < 3)
|
24
|
-
fuubar (2.0.0)
|
25
|
-
rspec (~> 3.0)
|
26
|
-
ruby-progressbar (~> 1.4)
|
27
|
-
http_router (0.11.1)
|
28
|
-
rack (>= 1.0.0)
|
29
|
-
url_mount (~> 0.2.1)
|
30
|
-
i18n (0.6.11)
|
31
|
-
ice_nine (0.11.0)
|
32
|
-
lita (3.3.1)
|
33
|
-
bundler (>= 1.3)
|
34
|
-
faraday (>= 0.8.7)
|
35
|
-
http_router (>= 0.11.1)
|
36
|
-
i18n (>= 0.6.9)
|
37
|
-
ice_nine (>= 0.11.0)
|
38
|
-
multi_json (>= 1.7.7)
|
39
|
-
puma (>= 2.7.1)
|
40
|
-
rack (>= 1.5.2)
|
41
|
-
rb-readline (>= 0.5.1)
|
42
|
-
redis-namespace (>= 1.3.0)
|
43
|
-
thor (>= 0.18.1)
|
44
|
-
lita-confirmation (0.0.1)
|
45
|
-
lita (>= 3.3)
|
46
|
-
mime-types (2.3)
|
47
|
-
multi_json (1.10.1)
|
48
|
-
multipart-post (2.0.0)
|
49
|
-
netrc (0.7.7)
|
50
|
-
octokit (3.3.1)
|
51
|
-
sawyer (~> 0.5.3)
|
52
|
-
parser (2.2.0.pre.4)
|
53
|
-
ast (>= 1.1, < 3.0)
|
54
|
-
slop (~> 3.4, >= 3.4.5)
|
55
|
-
powerpack (0.0.9)
|
56
|
-
puma (2.9.0)
|
57
|
-
rack (>= 1.1, < 2.0)
|
58
|
-
rack (1.5.2)
|
59
|
-
rainbow (2.0.0)
|
60
|
-
rake (10.3.2)
|
61
|
-
rb-readline (0.5.1)
|
62
|
-
redis (3.1.0)
|
63
|
-
redis-namespace (1.5.1)
|
64
|
-
redis (~> 3.0, >= 3.0.4)
|
65
|
-
rest-client (1.7.2)
|
66
|
-
mime-types (>= 1.16, < 3.0)
|
67
|
-
netrc (~> 0.7)
|
68
|
-
rspec (3.0.0)
|
69
|
-
rspec-core (~> 3.0.0)
|
70
|
-
rspec-expectations (~> 3.0.0)
|
71
|
-
rspec-mocks (~> 3.0.0)
|
72
|
-
rspec-core (3.0.4)
|
73
|
-
rspec-support (~> 3.0.0)
|
74
|
-
rspec-expectations (3.0.4)
|
75
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
76
|
-
rspec-support (~> 3.0.0)
|
77
|
-
rspec-mocks (3.0.4)
|
78
|
-
rspec-support (~> 3.0.0)
|
79
|
-
rspec-support (3.0.4)
|
80
|
-
rubocop (0.25.0)
|
81
|
-
parser (>= 2.2.0.pre.4, < 3.0)
|
82
|
-
powerpack (~> 0.0.6)
|
83
|
-
rainbow (>= 1.99.1, < 3.0)
|
84
|
-
ruby-progressbar (~> 1.4)
|
85
|
-
ruby-progressbar (1.5.1)
|
86
|
-
sawyer (0.5.5)
|
87
|
-
addressable (~> 2.3.5)
|
88
|
-
faraday (~> 0.8, < 0.10)
|
89
|
-
simplecov (0.9.0)
|
90
|
-
docile (~> 1.1.0)
|
91
|
-
multi_json
|
92
|
-
simplecov-html (~> 0.8.0)
|
93
|
-
simplecov-html (0.8.0)
|
94
|
-
slop (3.6.0)
|
95
|
-
term-ansicolor (1.3.0)
|
96
|
-
tins (~> 1.0)
|
97
|
-
thor (0.19.1)
|
98
|
-
tins (1.3.0)
|
99
|
-
url_mount (0.2.1)
|
100
|
-
rack
|
101
|
-
|
102
|
-
PLATFORMS
|
103
|
-
ruby
|
104
|
-
|
105
|
-
DEPENDENCIES
|
106
|
-
bundler (~> 1.5)
|
107
|
-
coveralls (~> 0.7)
|
108
|
-
fuubar (~> 2.0)
|
109
|
-
lita-github!
|
110
|
-
rake (~> 10.2)
|
111
|
-
rspec (~> 3.0)
|
112
|
-
rubocop (~> 0.25.0)
|
113
|
-
simplecov (~> 0.9)
|