lita-jira 0.5.0 → 0.6.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: aef4c53ef081757f69c5313e99612eb6c9b5503a
4
- data.tar.gz: 3c5ec6ad54539e97affbf462e71e3376aa9cdefd
3
+ metadata.gz: c8e25e7c623d12ae007a12d829a9982e4cd282f0
4
+ data.tar.gz: 4af36f87192c00de42d16201f43e351aa3c6636d
5
5
  SHA512:
6
- metadata.gz: bea64e3f8e3114be601474962ce76f006415fd2c797f76033242f8eaca6f5cb70a86980fb3b1c9f8cb77ec4974b73d5494642879700b1615f6acf6cea0339b69
7
- data.tar.gz: ff5eb8303c4dbc703d07759b64724cc30898ea3eb1cef9da71a9cb0cb24a0a2e31333edf97b5a748e18b4b503751aa1ffadeaf0c52b97a35bd3c220b1e941757
6
+ metadata.gz: 44b1d5c7b1ab88e483d1a2a8164e7e4891a58912d285d2c39399cbce34777e3ba20b6340baa5da955662f74a6fdf9116e44a70ab0ac8321e5aa9c748360a0b0e
7
+ data.tar.gz: 0a1f45120e30e39f0e2968789d411305b31bf91b19dfda8a65590b457da93d5d194bf044e8183a43176c4c7cc5273b155d8f96e628813a9bfe8a2f79ec142b19
data/.travis.yml CHANGED
@@ -1,8 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.1
4
- script: bundle exec rake
5
- before_install:
6
- - gem update --system
4
+ - 2.2
7
5
  services:
8
6
  - redis-server
7
+ sudo: false
8
+ cache: bundler
data/README.md CHANGED
@@ -40,6 +40,7 @@ todo <project> "<subject>" ["<summary>"] - Creates an issue in <project> with <s
40
40
  jira <issue> - Shows a short summary <issue>
41
41
  jira details <issue> - Shows all details about <issue>
42
42
  jira comment on <issue> <comment text> - Adds <comment text> to <issue>
43
+ jira myissues - Displays a list of issues assigned to identified user
43
44
  ```
44
45
 
45
46
  ### Misc
@@ -9,6 +9,14 @@ module JiraHelper
9
9
  nil
10
10
  end
11
11
 
12
+ # Leverage the jira-ruby Issue.jql search feature
13
+ #
14
+ # @param [Type String] jql Valid JQL query
15
+ # @return [Type Array] 0-m JIRA Issues returned from query
16
+ def fetch_issues(jql)
17
+ client.Issue.jql(jql)
18
+ end
19
+
12
20
  def fetch_project(key)
13
21
  client.Project.find(key)
14
22
  rescue
@@ -20,11 +28,20 @@ module JiraHelper
20
28
  t('issue.details',
21
29
  key: issue.key,
22
30
  summary: issue.summary,
23
- assigned: issue.assignee.displayName,
24
- priority: issue.priority.name,
31
+ assigned: optional_issue_property('unassigned') { issue.assignee.displayName },
32
+ priority: optional_issue_property('none') { issue.priority.name },
25
33
  status: issue.status.name)
26
34
  end
27
35
 
36
+ # Enumerate issues returned from JQL query and format for response
37
+ #
38
+ # @param [Type Array] issues 1-m issues returned from JQL query
39
+ # @return [Type Array<String>] formatted issues for display to user
40
+ def format_issues(issues)
41
+ results = [t('myissues.info')]
42
+ results.concat(issues.map { |issue| format_issue(issue) })
43
+ end
44
+
28
45
  def create_issue(project, subject, summary)
29
46
  project = fetch_project(project)
30
47
  return nil unless project
@@ -35,5 +52,17 @@ module JiraHelper
35
52
  issue.fetch
36
53
  issue
37
54
  end
55
+
56
+ # Attempt to retrieve optional JIRA issue property value via a provided block.
57
+ # JIRA properties such as assignee and priority may not exist.
58
+ # In that case, the fallback will be used.
59
+ #
60
+ # @param [Type String] fallback A String value to use if the JIRA property value doesn't exist
61
+ # @return [Type String] fallback or returned value from yield block
62
+ def optional_issue_property(fallback = '')
63
+ yield
64
+ rescue
65
+ fallback
66
+ end
38
67
  end
39
68
  end
@@ -14,6 +14,7 @@ module Lita
14
14
  include ::JiraHelper::Issue
15
15
  include ::JiraHelper::Misc
16
16
  include ::JiraHelper::Regex
17
+ include ::JiraHelper::Utility
17
18
 
18
19
  route(
19
20
  /^jira\s#{ISSUE_PATTERN}$/,
@@ -33,6 +34,15 @@ module Lita
33
34
  }
34
35
  )
35
36
 
37
+ route(
38
+ /^jira\smyissues$/,
39
+ :myissues,
40
+ command: true,
41
+ help: {
42
+ t('help.myissues.syntax') => t('help.myissues.desc')
43
+ }
44
+ )
45
+
36
46
  route(
37
47
  /^jira\scomment\son\s#{ISSUE_PATTERN}\s#{COMMENT_PATTERN}$/,
38
48
  :comment,
@@ -78,6 +88,24 @@ module Lita
78
88
  return response.reply(t('error.request')) unless issue
79
89
  response.reply(t('issue.created', key: issue.key))
80
90
  end
91
+
92
+ # rubocop:disable Metrics/AbcSize
93
+ def myissues(response)
94
+ return response.reply(t('error.not_identified')) unless user_stored?(response.user)
95
+
96
+ begin
97
+ issues = fetch_issues("assignee = '#{get_email(response.user)}' AND status not in (Closed)")
98
+ rescue
99
+ log.error('JIRA HTTPError')
100
+ response.reply(t('error.request'))
101
+ return
102
+ end
103
+
104
+ return response.reply(t('myissues.empty')) unless issues.size > 0
105
+
106
+ response.reply(format_issues(issues))
107
+ end
108
+ # rubocop:enable Metrics/AbcSize
81
109
  end
82
110
 
83
111
  Lita.register_handler(Jira)
data/lita-jira.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = 'lita-jira'
3
- spec.version = '0.5.0'
3
+ spec.version = '0.6.0'
4
4
  spec.authors = ['Eric Sigler']
5
5
  spec.email = ['me@esigler.com']
6
6
  spec.description = 'A JIRA plugin for Lita.'
@@ -10,17 +10,17 @@ Gem::Specification.new do |spec|
10
10
  spec.metadata = { 'lita_plugin_type' => 'handler' }
11
11
 
12
12
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
13
- spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
14
- spec.test_files = spec.files.grep(/^(test|spec|features)\//)
13
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
15
  spec.require_paths = ['lib']
16
16
 
17
17
  spec.add_runtime_dependency 'lita', '>= 4.0'
18
- spec.add_runtime_dependency 'jira-ruby', '>= 0.1.8'
18
+ spec.add_runtime_dependency 'jira-ruby'
19
19
 
20
- spec.add_development_dependency 'bundler', '~> 1.3'
21
- spec.add_development_dependency 'rake'
22
- spec.add_development_dependency 'rspec', '>= 3.0.0'
23
- spec.add_development_dependency 'simplecov'
20
+ spec.add_development_dependency 'bundler'
24
21
  spec.add_development_dependency 'coveralls'
22
+ spec.add_development_dependency 'rake'
23
+ spec.add_development_dependency 'rspec'
25
24
  spec.add_development_dependency 'rubocop'
25
+ spec.add_development_dependency 'simplecov'
26
26
  end
data/locales/en.yml CHANGED
@@ -28,6 +28,9 @@ en:
28
28
  todo:
29
29
  syntax: todo <project> "<subject>" ["<summary>"]
30
30
  desc: Creates an issue in <project> with <subject> and optionally <summary>
31
+ myissues:
32
+ syntax: jira myissues
33
+ desc: If identified, will display a list of issues currently assigned to you
31
34
  identify:
32
35
  stored: "You have been identified as %{email} to JIRA"
33
36
  deleted: You have been de-identified from JIRA
@@ -37,4 +40,7 @@ en:
37
40
  details: "%{key}: %{summary}, assigned to: %{assigned}, priority: %{priority}, status: %{status}"
38
41
  summary: "%{key}: %{summary}"
39
42
  comment:
40
- added: "Comment added to %{issue}"
43
+ added: "Comment added to %{issue}"
44
+ myissues:
45
+ empty: "You do not have any assigned issues. Great job!"
46
+ info: "Here are issues currently assigned to you:"
@@ -12,6 +12,33 @@ describe Lita::Handlers::Jira, lita_handler: true do
12
12
  result
13
13
  end
14
14
 
15
+ let(:saved_issue_with_fewer_details) do
16
+ result = double(summary: 'Some summary text',
17
+ status: double(name: 'In Progress'),
18
+ key: 'XYZ-987')
19
+ allow(result).to receive('assignee').and_raise
20
+ allow(result).to receive('priority').and_raise
21
+ allow(result).to receive('save') { true }
22
+ allow(result).to receive('fetch') { true }
23
+ result
24
+ end
25
+
26
+ let(:valid_search_results) do
27
+ result = [double(summary: 'Some summary text',
28
+ assignee: double(displayName: 'A Person'),
29
+ priority: double(name: 'P0'),
30
+ status: double(name: 'In Progress'),
31
+ key: 'XYZ-987'),
32
+ double(summary: 'Some summary text 2',
33
+ assignee: double(displayName: 'A Person 2'),
34
+ priority: double(name: 'P1'),
35
+ status: double(name: 'In Progress 2'),
36
+ key: 'XYZ-988')]
37
+ allow(result).to receive('save') { true }
38
+ allow(result).to receive('fetch') { true }
39
+ result
40
+ end
41
+
15
42
  let(:saved_project) do
16
43
  double(key: 'XYZ',
17
44
  id: 1)
@@ -23,6 +50,13 @@ describe Lita::Handlers::Jira, lita_handler: true do
23
50
  allow(issue).to receive_message_chain('Issue.find.comments.build.save!') { saved_issue }
24
51
  allow(issue).to receive_message_chain('Issue.build') { saved_issue }
25
52
  allow(issue).to receive_message_chain('Project.find') { saved_project }
53
+ allow(issue).to receive_message_chain('Issue.jql') { valid_search_results }
54
+ issue
55
+ end
56
+
57
+ let(:client_with_fewer_details) do
58
+ issue = double
59
+ allow(issue).to receive_message_chain('Issue.find') { saved_issue_with_fewer_details }
26
60
  issue
27
61
  end
28
62
 
@@ -32,18 +66,31 @@ describe Lita::Handlers::Jira, lita_handler: true do
32
66
  r
33
67
  end
34
68
 
69
+ let(:failed_find_issues) do
70
+ r = double
71
+ expect(r).to receive_message_chain('Issue.jql').and_throw(JIRA::HTTPError)
72
+ r
73
+ end
74
+
35
75
  let(:failed_find_project) do
36
76
  r = double
37
77
  expect(r).to receive_message_chain('Project.find').and_throw(JIRA::HTTPError)
38
78
  r
39
79
  end
40
80
 
81
+ let(:empty_search_result) do
82
+ r = double
83
+ expect(r).to receive_message_chain('Issue.jql') { [] }
84
+ r
85
+ end
86
+
41
87
  it do
42
88
  is_expected.to route_command('jira ABC-123').to(:summary)
43
89
  is_expected.to route_command('jira details ABC-123').to(:details)
44
90
  is_expected.to route_command('jira comment on ABC-123 "You just need a cat"').to(:comment)
45
91
  is_expected.to route_command('todo ABC "summary text"').to(:todo)
46
92
  is_expected.to route_command('todo ABC "summary text" "subject text"').to(:todo)
93
+ is_expected.to route_command('jira myissues').to(:myissues)
47
94
  end
48
95
 
49
96
  describe '#summary' do
@@ -68,6 +115,13 @@ describe Lita::Handlers::Jira, lita_handler: true do
68
115
  'A Person, priority: P0, status: In Progress')
69
116
  end
70
117
 
118
+ it 'shows fewer details when the property is not set' do
119
+ grab_request(client_with_fewer_details)
120
+ 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')
123
+ end
124
+
71
125
  it 'warns the user when the issue is not valid' do
72
126
  grab_request(failed_find_issue)
73
127
  send_command('jira details XYZ-987')
@@ -102,4 +156,38 @@ describe Lita::Handlers::Jira, lita_handler: true do
102
156
  expect(replies.last).to eq('Error fetching JIRA issue')
103
157
  end
104
158
  end
159
+
160
+ describe '#myissues' do
161
+ before { send_command('jira forget') }
162
+ context 'when not identified' do
163
+ it 'fails when user is not identified' do
164
+ send_command('jira myissues')
165
+ expect(replies.last).to eq('You do not have an email address on record')
166
+ end
167
+ end
168
+
169
+ context 'when identified' do
170
+ before { send_command('jira identify user@example.com') }
171
+
172
+ it 'shows default response when no results are returned' do
173
+ grab_request(empty_search_result)
174
+ send_command('jira myissues')
175
+ expect(replies.last).to eq('You do not have any assigned issues. Great job!')
176
+ end
177
+
178
+ it 'shows results when returned' do
179
+ grab_request(valid_client)
180
+ 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'])
184
+ end
185
+
186
+ it 'shows an error when the search fails' do
187
+ grab_request(failed_find_issues)
188
+ send_command('jira myissues')
189
+ expect(replies.last).to eq('Error fetching JIRA issue')
190
+ end
191
+ end
192
+ end
105
193
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lita-jira
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Sigler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-03 00:00:00.000000000 Z
11
+ date: 2015-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lita
@@ -30,30 +30,30 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.1.8
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.1.8
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.3'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '1.3'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rake
56
+ name: coveralls
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,21 +67,21 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rspec
70
+ name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 3.0.0
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 3.0.0
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: simplecov
84
+ name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: coveralls
98
+ name: rubocop
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: rubocop
112
+ name: simplecov
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="