lita-jira 0.6.0 → 0.7.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: c8e25e7c623d12ae007a12d829a9982e4cd282f0
4
- data.tar.gz: 4af36f87192c00de42d16201f43e351aa3c6636d
3
+ metadata.gz: 372aaea44e1c7953b66a0cb3afe6a53a631e08c9
4
+ data.tar.gz: 8ffc592e14e99e246d07effe13f1248d850c7a3f
5
5
  SHA512:
6
- metadata.gz: 44b1d5c7b1ab88e483d1a2a8164e7e4891a58912d285d2c39399cbce34777e3ba20b6340baa5da955662f74a6fdf9116e44a70ab0ac8321e5aa9c748360a0b0e
7
- data.tar.gz: 0a1f45120e30e39f0e2968789d411305b31bf91b19dfda8a65590b457da93d5d194bf044e8183a43176c4c7cc5273b155d8f96e628813a9bfe8a2f79ec142b19
6
+ metadata.gz: 74d908bfa0e64d3d9331447e75873797b5d1fb8ae485da8beff3c1ecf49cc1faa830ec41e66a4f8a7a646684e531fb8124350f193510457b3b5814944e96a439
7
+ data.tar.gz: 76ef2321482c259b729f97475525e671d084fdf6992e68c01b694aff11de65c3b943eae4a5a31d867560709558c1f67edda4e1ab86014cb8f1b79aa6868a083a
data/.rubocop.yml CHANGED
@@ -3,4 +3,4 @@ FileName:
3
3
  - lib/lita-jira.rb
4
4
 
5
5
  LineLength:
6
- Max: 130
6
+ Max: 190
data/CONTRIBUTING.md CHANGED
@@ -7,3 +7,7 @@ Pull requests are awesome! Pull requests with tests are even more awesome!
7
7
  3. Add a test for your change. Only refactoring and documentation changes require no new tests. If you are adding functionality or fixing a bug, it needs a test!
8
8
  4. Make the test pass.
9
9
  5. Push to your fork and submit a pull request.
10
+
11
+ ## Reminders
12
+
13
+ * Be sure to add yourself to the Gemspec
data/README.md CHANGED
@@ -21,11 +21,25 @@ gem "lita-jira"
21
21
 
22
22
  Add the following variables to your lita config file:
23
23
 
24
- ```
24
+ ``` ruby
25
25
  config.handlers.jira.username = 'your_jira_username'
26
26
  config.handlers.jira.password = 'a_password'
27
27
  config.handlers.jira.site = 'https://your.jira.instance.example.com/'
28
- config.handlers.jira.context = '' # If your instance is in a /subdirectory, put that here
28
+ ```
29
+
30
+ ### Optional attributes
31
+ * `context` (string) - If your instance is in a /subdirectory, put that here. Default: `''`
32
+ * `format` (string) - You can select a compact one line issue summary by setting this parameter to `one-line`. Default: `verbose`
33
+ * `ambient` (boolean) - When set to `true`, Lita will show JIRA issue details when a JIRA issue key is mentioned in chat, outside the context of a command. Default: `false`
34
+ * `ignore` (array) - Prevent ambient JIRA issue detection in certain users' messages. Default: `[]`
35
+ * `rooms` (array) - Limit ambient JIRA issue detection to a certain list of rooms. If unspecified, the bot will respond to detected issues in all rooms.
36
+
37
+ ``` ruby
38
+ config.handlers.jira.context = '/myjira'
39
+ config.handlers.jira.ambient = true
40
+ config.handlers.jira.format = 'one-line'
41
+ config.handlers.jira.ignore = ['Jira', 'Github']
42
+ config.handlers.jira.rooms = ['devtools', 'engineering']
29
43
  ```
30
44
 
31
45
  ## Usage
@@ -51,6 +65,10 @@ jira forget - Remove your chat user / email association
51
65
  jira whoami - Show your chat user / email association
52
66
  ```
53
67
 
68
+ ## CHANGELOG
69
+
70
+ [CHANGELOG](https://github.com/esigler/lita-jira/releases)
71
+
54
72
  ## License
55
73
 
56
74
  [MIT](http://opensource.org/licenses/MIT)
@@ -2,12 +2,15 @@
2
2
  module JiraHelper
3
3
  # Issues
4
4
  module Issue
5
- def fetch_issue(key)
5
+ # NOTE: Prefer this syntax here as it's cleaner
6
+ # rubocop:disable Style/RescueEnsureAlignment
7
+ def fetch_issue(key, expected = true)
6
8
  client.Issue.find(key)
7
9
  rescue
8
- log.error('JIRA HTTPError')
10
+ log.error('JIRA HTTPError') if expected
9
11
  nil
10
12
  end
13
+ # rubocop:enable Style/RescueEnsureAlignment
11
14
 
12
15
  # Leverage the jira-ruby Issue.jql search feature
13
16
  #
@@ -17,21 +20,29 @@ module JiraHelper
17
20
  client.Issue.jql(jql)
18
21
  end
19
22
 
23
+ # NOTE: Prefer this syntax here as it's cleaner
24
+ # rubocop:disable Style/RescueEnsureAlignment
20
25
  def fetch_project(key)
21
26
  client.Project.find(key)
22
27
  rescue
23
28
  log.error('JIRA HTTPError')
24
29
  nil
25
30
  end
31
+ # rubocop:enable Style/RescueEnsureAlignment
26
32
 
33
+ # NOTE: Not breaking this function out just yet.
34
+ # rubocop:disable Metrics/AbcSize
27
35
  def format_issue(issue)
28
- t('issue.details',
36
+ t(config.format == 'one-line' ? 'issue.oneline' : 'issue.details',
29
37
  key: issue.key,
30
38
  summary: issue.summary,
39
+ status: issue.status.name,
31
40
  assigned: optional_issue_property('unassigned') { issue.assignee.displayName },
41
+ fixVersion: optional_issue_property('none') { issue.fixVersions.first['name'] },
32
42
  priority: optional_issue_property('none') { issue.priority.name },
33
- status: issue.status.name)
43
+ url: format_issue_link(issue.key))
34
44
  end
45
+ # rubocop:enable Metrics/AbcSize
35
46
 
36
47
  # Enumerate issues returned from JQL query and format for response
37
48
  #
@@ -42,6 +53,10 @@ module JiraHelper
42
53
  results.concat(issues.map { |issue| format_issue(issue) })
43
54
  end
44
55
 
56
+ def format_issue_link(key)
57
+ "#{config.site}#{config.context}/browse/#{key}"
58
+ end
59
+
45
60
  def create_issue(project, subject, summary)
46
61
  project = fetch_project(project)
47
62
  return nil unless project
@@ -6,10 +6,14 @@ module Lita
6
6
  class Jira < Handler
7
7
  namespace 'Jira'
8
8
 
9
- config :username, required: true
10
- config :password, required: true
11
- config :site, required: true
12
- config :context, required: true
9
+ config :username, required: true, type: String
10
+ config :password, required: true, type: String
11
+ config :site, required: true, type: String
12
+ config :context, required: false, type: String, default: ''
13
+ config :format, required: false, type: String, default: 'verbose'
14
+ config :ambient, required: false, types: [TrueClass, FalseClass], default: false
15
+ config :ignore, required: false, type: Array, default: []
16
+ config :rooms, required: false, type: Array
13
17
 
14
18
  include ::JiraHelper::Issue
15
19
  include ::JiraHelper::Misc
@@ -61,6 +65,9 @@ module Lita
61
65
  }
62
66
  )
63
67
 
68
+ # Detect ambient JIRA issues in non-command messages
69
+ route ISSUE_PATTERN, :ambient, command: false
70
+
64
71
  def summary(response)
65
72
  issue = fetch_issue(response.match_data['issue'])
66
73
  return response.reply(t('error.request')) unless issue
@@ -105,9 +112,20 @@ module Lita
105
112
 
106
113
  response.reply(format_issues(issues))
107
114
  end
115
+
116
+ def ambient(response)
117
+ return if invalid_ambient(response)
118
+ issue = fetch_issue(response.match_data['issue'], false)
119
+ response.reply(format_issue(issue)) if issue
120
+ end
121
+
122
+ private
123
+
124
+ def invalid_ambient(response)
125
+ response.message.command? || !config.ambient || config.ignore.include?(response.user.name) || (config.rooms && !config.rooms.include?(response.message.source.room))
126
+ end
108
127
  # rubocop:enable Metrics/AbcSize
109
128
  end
110
-
111
129
  Lita.register_handler(Jira)
112
130
  end
113
131
  end
data/lita-jira.gemspec CHANGED
@@ -1,10 +1,10 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = 'lita-jira'
3
- spec.version = '0.6.0'
4
- spec.authors = ['Eric Sigler']
5
- spec.email = ['me@esigler.com']
3
+ spec.version = '0.7.0'
4
+ spec.authors = ['Eric Sigler', 'Matt Critchlow']
5
+ spec.email = ['me@esigler.com', 'matt.critchlow@gmail.com']
6
6
  spec.description = 'A JIRA plugin for Lita.'
7
- spec.summary = 'A JIRA plugin for Lita.'
7
+ spec.summary = spec.description
8
8
  spec.homepage = 'https://github.com/esigler/lita-jira'
9
9
  spec.license = 'MIT'
10
10
  spec.metadata = { 'lita_plugin_type' => 'handler' }
data/locales/en.yml CHANGED
@@ -37,7 +37,8 @@ en:
37
37
  email: "You are identified with JIRA as %{email}"
38
38
  issue:
39
39
  created: "Issue %{key} created"
40
- details: "%{key}: %{summary}, assigned to: %{assigned}, priority: %{priority}, status: %{status}"
40
+ details: "[%{key}] %{summary}\nStatus: %{status}, assigned to: %{assigned}, fixVersion: %{fixVersion}, priority: %{priority}\n%{url}"
41
+ oneline: "%{url} - %{status}, %{assigned} - %{summary}"
41
42
  summary: "%{key}: %{summary}"
42
43
  comment:
43
44
  added: "Comment added to %{issue}"
@@ -1,11 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Lita::Handlers::Jira, lita_handler: true do
4
+ before do
5
+ registry.config.handlers.jira.site = 'http://jira.local'
6
+ end
7
+
4
8
  let(:saved_issue) do
5
9
  result = double(summary: 'Some summary text',
6
10
  assignee: double(displayName: 'A Person'),
7
11
  priority: double(name: 'P0'),
8
12
  status: double(name: 'In Progress'),
13
+ fixVersions: [{ 'name' => 'Sprint 2' }],
9
14
  key: 'XYZ-987')
10
15
  allow(result).to receive('save') { true }
11
16
  allow(result).to receive('fetch') { true }
@@ -15,6 +20,7 @@ describe Lita::Handlers::Jira, lita_handler: true do
15
20
  let(:saved_issue_with_fewer_details) do
16
21
  result = double(summary: 'Some summary text',
17
22
  status: double(name: 'In Progress'),
23
+ fixVersions: [],
18
24
  key: 'XYZ-987')
19
25
  allow(result).to receive('assignee').and_raise
20
26
  allow(result).to receive('priority').and_raise
@@ -28,11 +34,13 @@ describe Lita::Handlers::Jira, lita_handler: true do
28
34
  assignee: double(displayName: 'A Person'),
29
35
  priority: double(name: 'P0'),
30
36
  status: double(name: 'In Progress'),
37
+ fixVersions: [{ 'name' => 'Sprint 2' }],
31
38
  key: 'XYZ-987'),
32
39
  double(summary: 'Some summary text 2',
33
40
  assignee: double(displayName: 'A Person 2'),
34
41
  priority: double(name: 'P1'),
35
42
  status: double(name: 'In Progress 2'),
43
+ fixVersions: [],
36
44
  key: 'XYZ-988')]
37
45
  allow(result).to receive('save') { true }
38
46
  allow(result).to receive('fetch') { true }
@@ -111,15 +119,21 @@ describe Lita::Handlers::Jira, lita_handler: true do
111
119
  it 'shows details with a valid issue' do
112
120
  grab_request(valid_client)
113
121
  send_command('jira details XYZ-987')
114
- expect(replies.last).to eq('XYZ-987: Some summary text, assigned to: ' \
115
- 'A Person, priority: P0, status: In Progress')
122
+ expect(replies.last).to eq("[XYZ-987] Some summary text\nStatus: In Progress, assigned to: A Person, fixVersion: Sprint 2, priority: P0\nhttp://jira.local/browse/XYZ-987")
116
123
  end
117
124
 
118
125
  it 'shows fewer details when the property is not set' do
119
126
  grab_request(client_with_fewer_details)
120
127
  send_command('jira details XYZ-987')
121
- expect(replies.last).to eq('XYZ-987: Some summary text, assigned to: ' \
122
- 'unassigned, priority: none, status: In Progress')
128
+ expect(replies.last).to eq("[XYZ-987] Some summary text\nStatus: In Progress, assigned to: unassigned, fixVersion: none, priority: none\nhttp://jira.local/browse/XYZ-987")
129
+ end
130
+
131
+ it 'displays the correct URL when config.context is set' do
132
+ registry.config.handlers.jira.context = '/myjira'
133
+ grab_request(valid_client)
134
+ send_command('jira details XYZ-987')
135
+ expect(replies.last).to eq("[XYZ-987] Some summary text\nStatus: In Progress, assigned to: A Person, fixVersion: Sprint 2, priority: P0\nhttp://jira.local/myjira/browse/XYZ-987")
136
+ registry.config.handlers.jira.context = ''
123
137
  end
124
138
 
125
139
  it 'warns the user when the issue is not valid' do
@@ -127,6 +141,14 @@ describe Lita::Handlers::Jira, lita_handler: true do
127
141
  send_command('jira details XYZ-987')
128
142
  expect(replies.last).to eq('Error fetching JIRA issue')
129
143
  end
144
+
145
+ it 'shows details on one line with a valid issue if config.format is one-line' do
146
+ registry.config.handlers.jira.format = 'one-line'
147
+ grab_request(valid_client)
148
+ send_command('jira details XYZ-987')
149
+ expect(replies.last).to eq('http://jira.local/browse/XYZ-987 - In Progress, A Person - Some summary text')
150
+ registry.config.handlers.jira.format = 'verbose'
151
+ end
130
152
  end
131
153
 
132
154
  describe '#comment' do
@@ -157,6 +179,68 @@ describe Lita::Handlers::Jira, lita_handler: true do
157
179
  end
158
180
  end
159
181
 
182
+ describe '#ambient' do
183
+ it 'does not show details for a detected issue by default' do
184
+ end
185
+
186
+ context 'when enabled in config' do
187
+ before(:each) do
188
+ registry.config.handlers.jira.ambient = true
189
+ grab_request(valid_client)
190
+ end
191
+
192
+ it 'shows details for a detected issue in a message' do
193
+ send_message('foo XYZ-987 bar')
194
+ expect(replies.last).to eq("[XYZ-987] Some summary text\nStatus: In Progress, assigned to: A Person, fixVersion: Sprint 2, priority: P0\nhttp://jira.local/browse/XYZ-987")
195
+ end
196
+
197
+ it 'does not show details for a detected issue in a command' do
198
+ send_command('foo XYZ-987 bar')
199
+ expect(replies.size).to eq(0)
200
+ end
201
+
202
+ context 'and an ignore list is defined' do
203
+ before(:each) do
204
+ @user1 = Lita::User.create(1, name: 'User1')
205
+ @user2 = Lita::User.create(2, name: 'User2')
206
+ registry.config.handlers.jira.ignore = ['User2']
207
+ end
208
+
209
+ it 'shows details for a detected issue sent by a user absent from the list' do
210
+ send_message('foo XYZ-987 bar', as: @user1)
211
+ expect(replies.last).to eq("[XYZ-987] Some summary text\nStatus: In Progress, assigned to: A Person, fixVersion: Sprint 2, priority: P0\nhttp://jira.local/browse/XYZ-987")
212
+ end
213
+
214
+ it 'does not show details for a detected issue sent by a user on the list' do
215
+ send_message('foo XYZ-987 bar', as: @user2)
216
+ expect(replies.size).to eq(0)
217
+ end
218
+ end
219
+
220
+ context 'and a room list is defined' do
221
+ def send_room_message(body, room)
222
+ robot.receive(Lita::Message.new(robot, body, Lita::Source.new(user: user, room: room)))
223
+ end
224
+
225
+ before(:each) do
226
+ @room1 = 'Room1'
227
+ @room2 = 'Room2'
228
+ registry.config.handlers.jira.rooms = [@room1]
229
+ end
230
+
231
+ it 'shows details for a detected issue sent in a room on the list' do
232
+ send_room_message('foo XYZ-987 bar', @room1)
233
+ expect(replies.last).to eq("[XYZ-987] Some summary text\nStatus: In Progress, assigned to: A Person, fixVersion: Sprint 2, priority: P0\nhttp://jira.local/browse/XYZ-987")
234
+ end
235
+
236
+ it 'does not show details for a detected issue sent in a room absent from the list' do
237
+ send_room_message('foo XYZ-987 bar', @room2)
238
+ expect(replies.size).to eq(0)
239
+ end
240
+ end
241
+ end
242
+ end
243
+
160
244
  describe '#myissues' do
161
245
  before { send_command('jira forget') }
162
246
  context 'when not identified' do
@@ -178,9 +262,11 @@ describe Lita::Handlers::Jira, lita_handler: true do
178
262
  it 'shows results when returned' do
179
263
  grab_request(valid_client)
180
264
  send_command('jira myissues')
181
- expect(replies.last).to eq(['Here are issues currently assigned to you:',
182
- 'XYZ-987: Some summary text, assigned to: A Person, priority: P0, status: In Progress',
183
- 'XYZ-988: Some summary text 2, assigned to: A Person 2, priority: P1, status: In Progress 2'])
265
+ expect(replies.last).to eq([
266
+ 'Here are issues currently assigned to you:',
267
+ "[XYZ-987] Some summary text\nStatus: In Progress, assigned to: A Person, fixVersion: Sprint 2, priority: P0\nhttp://jira.local/browse/XYZ-987",
268
+ "[XYZ-988] Some summary text 2\nStatus: In Progress 2, assigned to: A Person 2, fixVersion: none, priority: P1\nhttp://jira.local/browse/XYZ-988"
269
+ ])
184
270
  end
185
271
 
186
272
  it 'shows an error when the search fails' do
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lita-jira
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Sigler
8
+ - Matt Critchlow
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2015-07-19 00:00:00.000000000 Z
12
+ date: 2015-08-07 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: lita
@@ -125,6 +126,7 @@ dependencies:
125
126
  description: A JIRA plugin for Lita.
126
127
  email:
127
128
  - me@esigler.com
129
+ - matt.critchlow@gmail.com
128
130
  executables: []
129
131
  extensions: []
130
132
  extra_rdoc_files: []
@@ -170,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
172
  version: '0'
171
173
  requirements: []
172
174
  rubyforge_project:
173
- rubygems_version: 2.2.2
175
+ rubygems_version: 2.4.5
174
176
  signing_key:
175
177
  specification_version: 4
176
178
  summary: A JIRA plugin for Lita.