danger-jira_issue_links 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7d151d73a8eac57249babc5e48eea8e6c0b8b663
4
- data.tar.gz: 7564bb19da99d6e3ccaf2c84476750c05d56ec46
3
+ metadata.gz: 7e7df6fd19328c5200bca36fec3455702a803160
4
+ data.tar.gz: 7bf77af3efcb8d63e3660b397a0b208644df16d7
5
5
  SHA512:
6
- metadata.gz: 5039cae3189e6ee329ce0722f949363fa151e330b55b47c7f59be27bc8c0f219fab5ded6f351aed6c4429cce3aa6e5d8549d022380d3bbde18914cd04db81046
7
- data.tar.gz: da1ab3a2de0b2f320fde292948100c382936f1e1b442cda90f59857b7831de7a12b73aabb3196e50589e869dc1d5cb49753f35a3c90a9c40030da99ca68bf65a
6
+ metadata.gz: ddf477f291da157017bc91cd00d216bce118e79af1b004c7b49e3f6daa7dcd0bffab9f356d3f13fc778b9061c4e7aec0113f8ec538632c383103a2f5505c8890
7
+ data.tar.gz: 17372b48036608c53097dcd0cb7217f7e2c073f2c70dcd532e6d8f14bebf1d510eb94238cd653347b27171050a65fe31565cf73d7e01e9e13855d8f7fb853a97
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --require spec_helper
2
+ --color
3
+ --format d
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- danger-jira_issue_links (0.1.0)
4
+ danger-jira_issue_links (0.1.1)
5
5
  danger-plugin-api (~> 1.0)
6
6
  jira-ruby (~> 1.1)
7
7
 
@@ -13,7 +13,7 @@ GEM
13
13
  i18n (>= 0.7, < 2)
14
14
  minitest (~> 5.1)
15
15
  tzinfo (~> 1.1)
16
- addressable (2.5.2)
16
+ addressable (2.6.0)
17
17
  public_suffix (>= 2.0.2, < 4.0)
18
18
  ast (2.4.0)
19
19
  claide (1.0.2)
@@ -26,13 +26,13 @@ GEM
26
26
  concurrent-ruby (1.1.5)
27
27
  cork (0.3.0)
28
28
  colored2 (~> 3.1)
29
- danger (6.0.6)
29
+ danger (6.0.9)
30
30
  claide (~> 1.0)
31
31
  claide-plugins (>= 0.9.2)
32
32
  colored2 (~> 3.1)
33
33
  cork (~> 0.1)
34
34
  faraday (~> 0.9)
35
- faraday-http-cache (~> 1.0)
35
+ faraday-http-cache (~> 2.0)
36
36
  git (~> 1.5)
37
37
  kramdown (~> 2.0)
38
38
  kramdown-parser-gfm (~> 1.0)
@@ -44,7 +44,7 @@ GEM
44
44
  diff-lcs (1.3)
45
45
  faraday (0.15.4)
46
46
  multipart-post (>= 1.2, < 3)
47
- faraday-http-cache (1.3.1)
47
+ faraday-http-cache (2.0.0)
48
48
  faraday (~> 0.8)
49
49
  ffi (1.10.0)
50
50
  formatador (0.2.5)
@@ -71,7 +71,7 @@ GEM
71
71
  multipart-post
72
72
  oauth (~> 0.5, >= 0.5.0)
73
73
  kramdown (2.1.0)
74
- kramdown-parser-gfm (1.0.1)
74
+ kramdown-parser-gfm (1.1.0)
75
75
  kramdown (~> 2.0)
76
76
  listen (3.0.7)
77
77
  rb-fsevent (>= 0.9.3)
@@ -79,7 +79,7 @@ GEM
79
79
  lumberjack (1.0.13)
80
80
  method_source (0.9.2)
81
81
  minitest (5.11.3)
82
- multipart-post (2.0.0)
82
+ multipart-post (2.1.1)
83
83
  nap (1.1.0)
84
84
  nenv (0.3.0)
85
85
  no_proxy_fix (0.1.2)
@@ -97,7 +97,7 @@ GEM
97
97
  coderay (~> 1.1.0)
98
98
  method_source (~> 0.9.0)
99
99
  psych (3.1.0)
100
- public_suffix (3.0.3)
100
+ public_suffix (3.1.0)
101
101
  rainbow (3.0.0)
102
102
  rake (10.5.0)
103
103
  rb-fsevent (0.10.3)
@@ -125,9 +125,9 @@ GEM
125
125
  ruby-progressbar (~> 1.7)
126
126
  unicode-display_width (>= 1.4.0, < 1.6)
127
127
  ruby-progressbar (1.10.0)
128
- sawyer (0.8.1)
129
- addressable (>= 2.3.5, < 2.6)
130
- faraday (~> 0.8, < 1.0)
128
+ sawyer (0.8.2)
129
+ addressable (>= 2.3.5)
130
+ faraday (> 0.8, < 2.0)
131
131
  shellany (0.0.1)
132
132
  terminal-table (1.8.0)
133
133
  unicode-display_width (~> 1.1, >= 1.1.1)
data/README.md CHANGED
@@ -33,6 +33,12 @@ jira_issue_links.jira_password = "password"
33
33
  jira_issue_links.jira_site = "https://your-company.atlassian.net"
34
34
  ```
35
35
 
36
+ Option to include in output report phrase `Resolves TASK-123`, it help GitLab Jira plugin automatically close issues (see: [GitLab Jira integration](https://docs.gitlab.com/ee/user/project/integrations/jira.html#closing-jira-issues)).
37
+ ```
38
+ jira_issue_links.include_resolves_keyword = true
39
+ ```
40
+
41
+
36
42
  Find all issue mentions in commit messages, obtain info from Jira and make table of links
37
43
  ```
38
44
  jira_issue_links.print_links_with_titles
@@ -1,3 +1,3 @@
1
1
  module JiraIssueLinks
2
- VERSION = "0.1.1".freeze
2
+ VERSION = "0.2.0".freeze
3
3
  end
@@ -18,6 +18,9 @@ module Danger
18
18
  #
19
19
  class DangerJiraIssueLinks < Plugin
20
20
 
21
+ # Private struct
22
+ JiraIssue = Struct.new("JiraIssue", :id, :summary, :issuetype, :iconUrl)
23
+
21
24
  # Jira username
22
25
  #
23
26
  # @return [String]
@@ -39,19 +42,21 @@ module Danger
39
42
  # @return [String]
40
43
  attr_accessor :jira_context_path
41
44
 
45
+ # If `true` then in report will be added "Resolves" keyword for automatic resolve issue in jira.
46
+ # @see https://docs.gitlab.com/ee/user/project/integrations/jira.html
47
+ # Default - false
48
+ #
49
+ # @return [Bool]
50
+ attr_accessor :include_resolves_keyword
42
51
 
43
52
  # Find all issue references in commit messages.
44
53
  # Message should starts with pattern: `[TASK-123]`
45
54
  # @return [Array<String>]
46
55
  def collect_issues_from_commits
47
- all_issues = []
48
- git.commits.each do |c|
49
- captures = c.message.match(/^\[(\w+-\d+)\]*./)&.captures
50
- if captures
51
- all_issues.push(captures[0])
52
- end
53
- end
54
- all_issues.uniq
56
+ git.commits
57
+ .flat_map { |c| c.message.match(/^\[(\w+-\d+)\]/)&.captures }
58
+ .compact
59
+ .uniq
55
60
  end
56
61
 
57
62
  # Generates a `markdown` table of issues with type, title and link.
@@ -62,27 +67,26 @@ module Danger
62
67
  found_issues = collect_issues_from_commits
63
68
  return if found_issues.empty?
64
69
 
65
- jira_context_path = '' if jira_context_path.nil?
66
- client = JIRA::Client.new(
67
- username: jira_username,
68
- password: jira_password,
69
- site: jira_site,
70
- context_path: jira_context_path,
71
- auth_type: :basic
72
- )
73
-
74
70
  message = "## Jira issues\n\n"
75
- message << "| | |\n"
76
- message << "| --- | ----- |\n"
71
+ if include_resolves_keyword
72
+ message << "| | | |\n"
73
+ message << "| --- | --- | ----- |\n"
74
+ else
75
+ message << "| | |\n"
76
+ message << "| --- | ----- |\n"
77
+ end
77
78
 
78
79
  begin
79
80
  found_issues.each do |issue_id|
80
- issue = client.Issue.jql("ID = '#{issue_id}'").first
81
+ issue = obtain_issue(issue_id)
81
82
  return if issue.nil?
82
83
  description = issue.summary
83
84
  description = description.gsub(/[<|>\[\]]/) { |bracket| "\\#{bracket}" }
84
- message << "![#{issue.issuetype.name}](#{issue.issuetype.iconUrl}) | "
85
- message << "[#{description}](#{jira_site}/browse/#{issue_id})\n"
85
+ message << "![#{issue.issuetype}](#{issue.iconUrl}) | "
86
+ if include_resolves_keyword
87
+ message << "Resolves #{issue_id} | "
88
+ end
89
+ message << "[#{description}](#{jira_site}/browse/#{issue_id})\n"
86
90
  end
87
91
  rescue JIRA::HTTPError => e
88
92
  print e.message
@@ -100,13 +104,37 @@ module Danger
100
104
  found_issues = collect_issues_from_commits
101
105
  return if found_issues.empty?
102
106
 
103
- message = "### Jira issues\n\n"
104
- found_issues.each do |issue_id|
105
- message << "[#{issue_id}](#{jira_site}/browse/#{issue_id})\n\n"
107
+ message = "## Jira issues\n\n"
108
+ found_issues.each do |issue_id|
109
+ if include_resolves_keyword
110
+ message << "Resolves "
111
+ end
112
+ message << "[#{issue_id}](#{jira_site}/browse/#{issue_id})\n\n"
106
113
  end
107
114
 
108
115
  markdown message
109
116
  end
110
117
 
118
+
119
+ private
120
+
121
+ def jira_client
122
+ jira_context_path = '' if jira_context_path.nil?
123
+ @jira_client = JIRA::Client.new(
124
+ username: jira_username,
125
+ password: jira_password,
126
+ site: jira_site,
127
+ context_path: jira_context_path,
128
+ auth_type: :basic
129
+ ) if @jira_client.nil?
130
+ return @jira_client
131
+ end
132
+
133
+ def obtain_issue(issue_id)
134
+ issue = jira_client.Issue.jql("ID = '#{issue_id}'").first
135
+ return if issue.nil?
136
+ return JiraIssue.new(issue_id, issue.summary, issue.issuetype.name, issue.issuetype.iconUrl)
137
+ end
138
+
111
139
  end
112
140
  end
@@ -2,6 +2,10 @@ require File.expand_path("../spec_helper", __FILE__)
2
2
 
3
3
  module Danger
4
4
  describe Danger::DangerJiraIssueLinks do
5
+
6
+ # alias
7
+ JiraIssue = Danger::DangerJiraIssueLinks::JiraIssue
8
+
5
9
  it "should be a plugin" do
6
10
  expect(Danger::DangerJiraIssueLinks.new(nil)).to be_a Danger::Plugin
7
11
  end
@@ -9,16 +13,80 @@ module Danger
9
13
  describe "with Dangerfile" do
10
14
  before do
11
15
  @dangerfile = testing_dangerfile
12
- @my_plugin = @dangerfile.jira_issue_links
16
+ @plugin = @dangerfile.jira_issue_links
17
+ end
18
+
19
+ it "collect issues with regex" do
20
+ @plugin.include_resolves_keyword = true
21
+
22
+ commits = [
23
+ "[XX-123] fix it",
24
+ "xxx",
25
+ "[XX-123] fix it",
26
+ "[A-1] fix it, [B-2] df"
27
+ ].map do |message|
28
+ instance_double('Commit', message: message)
29
+ end
30
+
31
+ expect(@plugin.git).to receive(:commits).and_return(commits)
32
+ expect(@plugin.collect_issues_from_commits).to eql([
33
+ "XX-123", "A-1"
34
+ ])
35
+
36
+ end
37
+
38
+ it "print simple links" do
39
+ @plugin.jira_site = "http://site"
40
+
41
+ commits = [
42
+ "[XX-123] fix it"
43
+ ].map do |message|
44
+ instance_double('Commit', message: message)
45
+ end
46
+
47
+ expect(@plugin.git).to receive(:commits).and_return(commits)
48
+ expect(@plugin.print_links_only)
49
+ output = @plugin.status_report[:markdowns].first
50
+ expect(output.message).to eq("## Jira issues\n\n[XX-123](http://site/browse/XX-123)\n\n")
13
51
  end
52
+
53
+
54
+ it "print jira task without resolves" do
55
+ @plugin.jira_site = "http://site"
14
56
 
15
- it "some" do
16
- @my_plugin.print_links_only
57
+ commits = [
58
+ "[XX-123] fix it"
59
+ ].map do |message|
60
+ instance_double('Commit', message: message)
61
+ end
17
62
 
18
- expect(@dangerfile.status_report[:warnings]).to eq([])
63
+ expect(@plugin.git).to receive(:commits).and_return(commits)
64
+ expect(@plugin).to receive(:obtain_issue).and_return(JiraIssue.new("XX-123", "summary", "Task", "url"))
65
+
66
+ expect(@plugin.print_links_with_titles)
67
+ output = @plugin.status_report[:markdowns].first
68
+ expect(output.message).to eq("## Jira issues\n\n| | |\n| --- | ----- |\n![Task](url) | [summary](http://site/browse/XX-123)\n")
19
69
  end
20
70
 
21
71
 
72
+ it "print jira task with resolves keyword" do
73
+ @plugin.include_resolves_keyword = true
74
+ @plugin.jira_site = "http://site"
75
+
76
+ commits = [
77
+ "[XX-123] fix it"
78
+ ].map do |message|
79
+ instance_double('Commit', message: message)
80
+ end
81
+
82
+ expect(@plugin.git).to receive(:commits).and_return(commits)
83
+ expect(@plugin).to receive(:obtain_issue).and_return(JiraIssue.new("XX-123", "summary", "Task", "url"))
84
+
85
+ expect(@plugin.print_links_with_titles)
86
+ output = @plugin.status_report[:markdowns].first
87
+ expect(output.message).to eq("## Jira issues\n\n| | | |\n| --- | --- | ----- |\n![Task](url) | Resolves XX-123 | [summary](http://site/browse/XX-123)\n")
88
+ end
89
+
22
90
  end
23
91
  end
24
92
  end
data/spec/spec_helper.rb CHANGED
@@ -51,7 +51,11 @@ def testing_env
51
51
  {
52
52
  "HAS_JOSH_K_SEAL_OF_APPROVAL" => "true",
53
53
  "DANGER_LOCAL_ONLY" => "true",
54
- "FL_JIRA_SITE" => "https://redmadrobot.atlassian.net"
54
+ "FL_JIRA_SITE" => "https://redmadrobot.atlassian.net",
55
+ 'TRAVIS_PULL_REQUEST' => '800',
56
+ 'TRAVIS_REPO_SLUG' => 'artsy/eigen',
57
+ 'TRAVIS_COMMIT_RANGE' => '759adcbd0d8f...13c4dc8bb61d',
58
+ 'DANGER_GITHUB_API_TOKEN' => '123sbdq54erfsd3422gdfio'
55
59
  }
56
60
  end
57
61
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger-jira_issue_links
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Glezman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-24 00:00:00.000000000 Z
11
+ date: 2019-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-plugin-api
@@ -172,6 +172,7 @@ extensions: []
172
172
  extra_rdoc_files: []
173
173
  files:
174
174
  - ".gitignore"
175
+ - ".rspec"
175
176
  - ".rubocop.yml"
176
177
  - ".travis.yml"
177
178
  - Gemfile