danger-jira_sync 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.env.sample +4 -0
- data/.gitignore +6 -0
- data/.rubocop.yml +152 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +12 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +177 -0
- data/Guardfile +21 -0
- data/LICENSE.txt +22 -0
- data/README.md +67 -0
- data/Rakefile +25 -0
- data/danger-jira_sync.gemspec +58 -0
- data/lib/danger_jira_sync.rb +3 -0
- data/lib/danger_plugin.rb +3 -0
- data/lib/jira_sync/gem_version.rb +5 -0
- data/lib/jira_sync/plugin.rb +130 -0
- data/spec/fixtures/vcr_cassettes/default_success.yml +177 -0
- data/spec/fixtures/vcr_cassettes/pull_request.yml +167 -0
- data/spec/jira_sync_spec.rb +299 -0
- data/spec/spec_helper.rb +87 -0
- metadata +293 -0
@@ -0,0 +1,299 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require File.expand_path("spec_helper", __dir__)
|
4
|
+
|
5
|
+
# In order to regenerate the fixtures in ./fixtures/vcr_cassettes,
|
6
|
+
# you must ensure that your Jira Cloud development environment contains
|
7
|
+
# projects matching all of the key prefixes in ISSUE_KEYS_IN_PR_TITLE and
|
8
|
+
# ISSUE_KEYS_IN_PR_BODY. Similarly, there must be an issue in each project
|
9
|
+
# with a matching key. Look at JIRA_ENVIRONMENT for hints on how to
|
10
|
+
# configure the development environment for VCR.
|
11
|
+
#
|
12
|
+
# On the GitHub side, if ./fixtures/vcr_cassettes/pull_request.yml changes, you
|
13
|
+
# must ensure the title in the response contains the keys found in
|
14
|
+
# ISSUE_KEYS_IN_PR_TITLE, and that the body contains the strings found in
|
15
|
+
# ISSUE_KEYS_IN_PR_BODY. These constants reflect assumptions in the test suite.
|
16
|
+
#
|
17
|
+
ISSUE_KEYS_IN_PR_TITLE = ["DEV-1", "ABC-1"].freeze
|
18
|
+
ISSUE_KEYS_IN_PR_BODY = ["XYZ-1"].freeze
|
19
|
+
JIRA_ENVIRONMENT = {
|
20
|
+
projects: [
|
21
|
+
{
|
22
|
+
key: "DEV",
|
23
|
+
issues: [
|
24
|
+
{
|
25
|
+
key: "DEV-1",
|
26
|
+
components: %w(ComponentA ComponentB)
|
27
|
+
}
|
28
|
+
]
|
29
|
+
},
|
30
|
+
{
|
31
|
+
key: "XYZ",
|
32
|
+
issues: [
|
33
|
+
{
|
34
|
+
key: "XYZ-1",
|
35
|
+
components: %w(ComponentC)
|
36
|
+
}
|
37
|
+
]
|
38
|
+
},
|
39
|
+
{
|
40
|
+
key: "ABC",
|
41
|
+
issues: [
|
42
|
+
{
|
43
|
+
key: "ABC-1",
|
44
|
+
components: %w(ComponentB)
|
45
|
+
}
|
46
|
+
]
|
47
|
+
}
|
48
|
+
]
|
49
|
+
}.freeze
|
50
|
+
|
51
|
+
RSpec.describe Danger::DangerJiraSync do
|
52
|
+
it "should be a plugin" do
|
53
|
+
expect(described_class.new(nil)).to be_a Danger::Plugin
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "with Dangerfile" do
|
57
|
+
let(:dangerfile) { testing_dangerfile }
|
58
|
+
let(:plugin) { dangerfile.jira_sync }
|
59
|
+
let(:jira_settings) do
|
60
|
+
{
|
61
|
+
jira_url: testing_env["DANGER_JIRA_URL"],
|
62
|
+
jira_username: testing_env["DANGER_JIRA_USERNAME"],
|
63
|
+
jira_api_token: testing_env["DANGER_JIRA_API_TOKEN"]
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
def stub_pull_request
|
68
|
+
VCR.use_cassette(:pull_request) do
|
69
|
+
plugin.env.request_source.fetch_details
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
before do
|
74
|
+
stub_pull_request
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "configure" do
|
78
|
+
it "should return the JIRA::Client instance" do
|
79
|
+
value = plugin.configure(jira_settings)
|
80
|
+
expect(value).to be_a(JIRA::Client)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "autolabel_pull_request" do
|
85
|
+
let(:issue_prefixes) { %w(DEV ABC) }
|
86
|
+
|
87
|
+
it "raises a NotConfiguredError when #configure has not been called" do
|
88
|
+
expect { plugin.autolabel_pull_request(issue_prefixes) }.to(
|
89
|
+
raise_error(Danger::DangerJiraSync::NotConfiguredError)
|
90
|
+
)
|
91
|
+
end
|
92
|
+
|
93
|
+
context "after calling #configure" do
|
94
|
+
class GitHubAPIMock
|
95
|
+
end
|
96
|
+
|
97
|
+
let(:github_api_mock) { GitHubAPIMock.new }
|
98
|
+
|
99
|
+
before do
|
100
|
+
plugin.configure(jira_settings)
|
101
|
+
end
|
102
|
+
|
103
|
+
def stub_github_api_labelling(labels: [])
|
104
|
+
allow(github_api_mock).to receive(:labels).and_return(labels)
|
105
|
+
allow(github_api_mock).to receive(:add_label).and_return(nil)
|
106
|
+
allow(github_api_mock).to receive(:add_labels_to_an_issue).and_return(nil)
|
107
|
+
|
108
|
+
allow(plugin.github).to receive(:api).and_return(github_api_mock)
|
109
|
+
end
|
110
|
+
|
111
|
+
def extract_project_keys(prefixes)
|
112
|
+
return prefixes.map { |key| key.gsub(/-\d+/, "") }
|
113
|
+
end
|
114
|
+
|
115
|
+
def pr_title_project_keys
|
116
|
+
extract_project_keys(ISSUE_KEYS_IN_PR_TITLE)
|
117
|
+
end
|
118
|
+
|
119
|
+
def pr_body_project_keys
|
120
|
+
extract_project_keys(ISSUE_KEYS_IN_PR_BODY)
|
121
|
+
end
|
122
|
+
|
123
|
+
def pr_title_related_component_names
|
124
|
+
component_names = []
|
125
|
+
|
126
|
+
JIRA_ENVIRONMENT[:projects].map do |project|
|
127
|
+
next unless pr_title_project_keys.include? project[:key]
|
128
|
+
component_names += project[:issues].map { |issue| issue[:components] }
|
129
|
+
end
|
130
|
+
|
131
|
+
component_names.flatten.uniq
|
132
|
+
end
|
133
|
+
|
134
|
+
def pr_title_related_project_keys
|
135
|
+
project_keys = []
|
136
|
+
|
137
|
+
JIRA_ENVIRONMENT[:projects].map do |project|
|
138
|
+
project_keys << project[:key] if pr_title_project_keys.include? project[:key]
|
139
|
+
end
|
140
|
+
|
141
|
+
project_keys.compact.uniq
|
142
|
+
end
|
143
|
+
|
144
|
+
def stub_jira_find_issue_response(code:, message:)
|
145
|
+
client = plugin.configure(jira_settings)
|
146
|
+
|
147
|
+
response_mock = Object.new
|
148
|
+
allow(response_mock).to receive(:code).and_return(code)
|
149
|
+
allow(response_mock).to receive(:message).and_return(message)
|
150
|
+
|
151
|
+
issue_mock = Object.new
|
152
|
+
allow(issue_mock).to receive(:find).and_raise(JIRA::HTTPError.new(response_mock))
|
153
|
+
|
154
|
+
allow(client).to receive(:Issue).and_return(issue_mock)
|
155
|
+
end
|
156
|
+
|
157
|
+
def stub_jira_find_issue_404
|
158
|
+
stub_jira_find_issue_response(code: 404, message: "Not found")
|
159
|
+
end
|
160
|
+
|
161
|
+
def stub_jira_find_issue_unauthorized
|
162
|
+
stub_jira_find_issue_response(code: 503, message: "Unauthorized")
|
163
|
+
end
|
164
|
+
|
165
|
+
it "returns a list of labels that contains Jira component names" do
|
166
|
+
stub_github_api_labelling
|
167
|
+
|
168
|
+
labels = []
|
169
|
+
VCR.use_cassette(:default_success, record: :new_episodes) do
|
170
|
+
labels = plugin.autolabel_pull_request(issue_prefixes)
|
171
|
+
end
|
172
|
+
|
173
|
+
expect(labels).to include(*pr_title_related_component_names)
|
174
|
+
end
|
175
|
+
|
176
|
+
it "returns a list of labels that contains Jira issue project keys" do
|
177
|
+
stub_github_api_labelling
|
178
|
+
|
179
|
+
labels = []
|
180
|
+
VCR.use_cassette(:default_success, record: :new_episodes) do
|
181
|
+
labels = plugin.autolabel_pull_request(issue_prefixes)
|
182
|
+
end
|
183
|
+
|
184
|
+
expect(labels).to include(*pr_title_related_project_keys)
|
185
|
+
end
|
186
|
+
|
187
|
+
it "creates a warning when a related Jira ticket cannot be fetched" do
|
188
|
+
stub_jira_find_issue_404
|
189
|
+
|
190
|
+
VCR.use_cassette(:default_success, record: :new_episodes) do
|
191
|
+
expect(plugin.autolabel_pull_request(issue_prefixes)).to be_nil
|
192
|
+
end
|
193
|
+
|
194
|
+
issue_warning_count = dangerfile.status_report[:warnings].count do |warning|
|
195
|
+
warning.start_with?("Error while retrieving JIRA issue")
|
196
|
+
end
|
197
|
+
|
198
|
+
expect(issue_warning_count).to eq(issue_prefixes.length)
|
199
|
+
end
|
200
|
+
|
201
|
+
it "creates only one warning when the Jira credentials are invalid" do
|
202
|
+
stub_jira_find_issue_unauthorized
|
203
|
+
|
204
|
+
VCR.use_cassette(:default_success, record: :new_episodes) do
|
205
|
+
expect(plugin.autolabel_pull_request(issue_prefixes)).to be_nil
|
206
|
+
end
|
207
|
+
|
208
|
+
issue_warning_count = dangerfile.status_report[:warnings].count do |warning|
|
209
|
+
warning.start_with?("Error while retrieving JIRA issue")
|
210
|
+
end
|
211
|
+
|
212
|
+
expect(issue_warning_count).to eq(1)
|
213
|
+
end
|
214
|
+
|
215
|
+
it "adds a label to the github issue for each related jira issue component name" do
|
216
|
+
pr_title_related_component_names.each do |component_name|
|
217
|
+
expect(github_api_mock).to receive(:add_label).with(anything, component_name, anything).once.and_return(nil)
|
218
|
+
end
|
219
|
+
stub_github_api_labelling
|
220
|
+
|
221
|
+
VCR.use_cassette(:default_success, record: :new_episodes) do
|
222
|
+
plugin.autolabel_pull_request(issue_prefixes)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
it "adds a label to the github issue for each related jira issue project key" do
|
227
|
+
pr_title_related_project_keys.each do |project_key|
|
228
|
+
expect(github_api_mock).to receive(:add_label).with(anything, project_key, anything).once.and_return(nil)
|
229
|
+
end
|
230
|
+
stub_github_api_labelling
|
231
|
+
|
232
|
+
VCR.use_cassette(:default_success, record: :new_episodes) do
|
233
|
+
plugin.autolabel_pull_request(issue_prefixes)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
it "adds missing github labels" do
|
238
|
+
labels = pr_title_project_keys + pr_title_related_component_names
|
239
|
+
labels.each do |label|
|
240
|
+
expect(github_api_mock).to receive(:add_label).with(anything, label, anything)
|
241
|
+
end
|
242
|
+
stub_github_api_labelling
|
243
|
+
|
244
|
+
VCR.use_cassette(:default_success, record: :new_episodes) do
|
245
|
+
plugin.autolabel_pull_request(issue_prefixes)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
it "does not attempt to add new github labels when they already exist" do
|
250
|
+
existing_labels = %w(ComponentA)
|
251
|
+
existing_labels.each do |existing_label|
|
252
|
+
expect(github_api_mock).not_to receive(:add_label).with(anything, existing_label, anything)
|
253
|
+
end
|
254
|
+
stub_github_api_labelling(labels: existing_labels)
|
255
|
+
|
256
|
+
VCR.use_cassette(:default_success) do
|
257
|
+
plugin.autolabel_pull_request(issue_prefixes)
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
it "returns nil if no issue keys are found in the pr name or body" do
|
262
|
+
expect(plugin.autolabel_pull_request(["NOPE"])).to be_nil
|
263
|
+
end
|
264
|
+
|
265
|
+
it "falls back to issue keys in the pr body if none are found in the pr title" do
|
266
|
+
stub_github_api_labelling
|
267
|
+
|
268
|
+
VCR.use_cassette(:default_success, record: :new_episodes) do
|
269
|
+
plugin.autolabel_pull_request(pr_body_project_keys)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
it "ignores issue keys in the pr body if any are found in the pr title" do
|
274
|
+
stub_github_api_labelling
|
275
|
+
|
276
|
+
labels = []
|
277
|
+
VCR.use_cassette(:default_success, record: :new_episodes) do
|
278
|
+
labels = plugin.autolabel_pull_request(pr_body_project_keys + pr_title_project_keys)
|
279
|
+
end
|
280
|
+
|
281
|
+
expect(labels).to include(*pr_title_project_keys)
|
282
|
+
expect(labels).not_to include(*pr_body_project_keys)
|
283
|
+
end
|
284
|
+
|
285
|
+
it "raises an ArgumentError if no issue_prefixes are specified" do
|
286
|
+
expect { plugin.autolabel_pull_request([]) }.to raise_error(ArgumentError)
|
287
|
+
end
|
288
|
+
|
289
|
+
it "returns nil if no labels can be fetched from Jira" do
|
290
|
+
stub_jira_find_issue_404
|
291
|
+
|
292
|
+
VCR.use_cassette(:default_success, record: :new_episodes) do
|
293
|
+
expect(plugin.autolabel_pull_request(issue_prefixes)).to be_nil
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pathname"
|
4
|
+
ROOT = Pathname.new(File.expand_path("..", __dir__))
|
5
|
+
$:.unshift((ROOT + "lib").to_s)
|
6
|
+
$:.unshift((ROOT + "spec").to_s)
|
7
|
+
|
8
|
+
require "bundler/setup"
|
9
|
+
require "pry"
|
10
|
+
|
11
|
+
require "dotenv"
|
12
|
+
Dotenv.load
|
13
|
+
|
14
|
+
# Must be required and started before danger
|
15
|
+
require "simplecov"
|
16
|
+
SimpleCov.start do
|
17
|
+
add_filter "/spec/"
|
18
|
+
end
|
19
|
+
|
20
|
+
require "rspec"
|
21
|
+
require "danger"
|
22
|
+
require "webmock"
|
23
|
+
require "webmock/rspec"
|
24
|
+
require "vcr"
|
25
|
+
|
26
|
+
if `git remote -v` == ""
|
27
|
+
puts "You cannot run tests without setting a local git remote on this repo"
|
28
|
+
puts "It's a weird side-effect of Danger's internals."
|
29
|
+
exit(0)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Use coloured output, it's the best.
|
33
|
+
RSpec.configure do |config|
|
34
|
+
config.filter_gems_from_backtrace "bundler"
|
35
|
+
config.color = true
|
36
|
+
config.tty = true
|
37
|
+
end
|
38
|
+
|
39
|
+
VCR.configure do |config|
|
40
|
+
config.cassette_library_dir = "#{File.dirname(__FILE__)}/fixtures/vcr_cassettes"
|
41
|
+
config.hook_into :webmock
|
42
|
+
end
|
43
|
+
|
44
|
+
require "danger_plugin"
|
45
|
+
|
46
|
+
# These functions are a subset of https://github.com/danger/danger/blob/master/spec/spec_helper.rb
|
47
|
+
# If you are expanding these files, see if it's already been done ^.
|
48
|
+
|
49
|
+
# A silent version of the user interface,
|
50
|
+
# it comes with an extra function `.string` which will
|
51
|
+
# strip all ANSI colours from the string.
|
52
|
+
|
53
|
+
# rubocop:disable Lint/NestedMethodDefinition
|
54
|
+
def testing_ui
|
55
|
+
@output = StringIO.new
|
56
|
+
def @output.winsize
|
57
|
+
[20, 9999]
|
58
|
+
end
|
59
|
+
|
60
|
+
cork = Cork::Board.new(out: @output)
|
61
|
+
def cork.string
|
62
|
+
out.string.gsub(/\e\[([;\d]+)?m/, "")
|
63
|
+
end
|
64
|
+
cork
|
65
|
+
end
|
66
|
+
# rubocop:enable Lint/NestedMethodDefinition
|
67
|
+
|
68
|
+
# Example environment (ENV) that would come from
|
69
|
+
# running a PR on TravisCI
|
70
|
+
def testing_env
|
71
|
+
{
|
72
|
+
"HAS_JOSH_K_SEAL_OF_APPROVAL" => "true",
|
73
|
+
"TRAVIS_PULL_REQUEST" => "800",
|
74
|
+
"TRAVIS_REPO_SLUG" => "artsy/eigen",
|
75
|
+
"TRAVIS_COMMIT_RANGE" => "759adcbd0d8f...13c4dc8bb61d",
|
76
|
+
"DANGER_GITHUB_API_TOKEN" => ENV["DANGER_GITHUB_API_TOKEN"],
|
77
|
+
"DANGER_JIRA_URL" => ENV["DANGER_JIRA_URL"],
|
78
|
+
"DANGER_JIRA_USERNAME" => ENV["DANGER_JIRA_USERNAME"],
|
79
|
+
"DANGER_JIRA_API_TOKEN" => ENV["DANGER_JIRA_API_TOKEN"]
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
# A stubbed out Dangerfile for use in tests
|
84
|
+
def testing_dangerfile
|
85
|
+
env = Danger::EnvironmentManager.new(testing_env)
|
86
|
+
Danger::Dangerfile.new(env, testing_ui)
|
87
|
+
end
|
metadata
ADDED
@@ -0,0 +1,293 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: danger-jira_sync
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ben Menesini
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-06-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: danger-plugin-api
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jira-ruby
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.5.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.5.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: dotenv
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.4'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.4'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: vcr
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: webmock
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: yard
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: guard
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '2.14'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '2.14'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: guard-rspec
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '4.7'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '4.7'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: listen
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - '='
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: 3.0.7
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - '='
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: 3.0.7
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: awesome_print
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - ">="
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: pry
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - ">="
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :development
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: '0'
|
237
|
+
description: Synchronizes information between Jira and GitHub
|
238
|
+
email:
|
239
|
+
- ben.menesini@rover.com
|
240
|
+
executables: []
|
241
|
+
extensions: []
|
242
|
+
extra_rdoc_files: []
|
243
|
+
files:
|
244
|
+
- ".env.sample"
|
245
|
+
- ".gitignore"
|
246
|
+
- ".rubocop.yml"
|
247
|
+
- ".ruby-gemset"
|
248
|
+
- ".ruby-version"
|
249
|
+
- ".travis.yml"
|
250
|
+
- Gemfile
|
251
|
+
- Gemfile.lock
|
252
|
+
- Guardfile
|
253
|
+
- LICENSE.txt
|
254
|
+
- README.md
|
255
|
+
- Rakefile
|
256
|
+
- danger-jira_sync.gemspec
|
257
|
+
- lib/danger_jira_sync.rb
|
258
|
+
- lib/danger_plugin.rb
|
259
|
+
- lib/jira_sync/gem_version.rb
|
260
|
+
- lib/jira_sync/plugin.rb
|
261
|
+
- spec/fixtures/vcr_cassettes/default_success.yml
|
262
|
+
- spec/fixtures/vcr_cassettes/pull_request.yml
|
263
|
+
- spec/jira_sync_spec.rb
|
264
|
+
- spec/spec_helper.rb
|
265
|
+
homepage: https://github.com/roverdotcom/danger-jira_sync
|
266
|
+
licenses:
|
267
|
+
- MIT
|
268
|
+
metadata: {}
|
269
|
+
post_install_message:
|
270
|
+
rdoc_options: []
|
271
|
+
require_paths:
|
272
|
+
- lib
|
273
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
274
|
+
requirements:
|
275
|
+
- - ">="
|
276
|
+
- !ruby/object:Gem::Version
|
277
|
+
version: '0'
|
278
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
279
|
+
requirements:
|
280
|
+
- - ">="
|
281
|
+
- !ruby/object:Gem::Version
|
282
|
+
version: '0'
|
283
|
+
requirements: []
|
284
|
+
rubyforge_project:
|
285
|
+
rubygems_version: 2.7.6
|
286
|
+
signing_key:
|
287
|
+
specification_version: 4
|
288
|
+
summary: Synchronizes information betweeh Jira and GitHub
|
289
|
+
test_files:
|
290
|
+
- spec/fixtures/vcr_cassettes/default_success.yml
|
291
|
+
- spec/fixtures/vcr_cassettes/pull_request.yml
|
292
|
+
- spec/jira_sync_spec.rb
|
293
|
+
- spec/spec_helper.rb
|