toolshed 0.0.9 → 1.0.0
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 +4 -4
- data/.travis.yml +3 -0
- data/README.md +3 -0
- data/bin/toolshed.rb +26 -3
- data/lib/toolshed/cli.rb +4 -0
- data/lib/toolshed/client.rb +54 -2
- data/lib/toolshed/commands/create_branch.rb +5 -0
- data/lib/toolshed/commands/create_pull_request.rb +62 -17
- data/lib/toolshed/commands/create_ticket_comment.rb +85 -0
- data/lib/toolshed/commands/get_daily_time_update.rb +22 -19
- data/lib/toolshed/commands/ticket_information.rb +15 -7
- data/lib/toolshed/commands/update_ticket_status.rb +74 -0
- data/lib/toolshed/git/git.rb +3 -2
- data/lib/toolshed/git/github.rb +14 -3
- data/lib/toolshed/ticket_tracking/jira.rb +106 -0
- data/lib/toolshed/ticket_tracking/pivotal_tracker.rb +49 -47
- data/lib/toolshed/ticket_tracking/ticket_tracking.rb +10 -0
- data/lib/toolshed/time_tracking/harvest.rb +47 -26
- data/lib/toolshed/version.rb +1 -1
- data/lib/toolshed.rb +2 -0
- data/test/commands/create_branch_test.rb +20 -0
- data/test/commands/create_pull_request_test.rb +10 -2
- data/test/commands/get_daily_time_update_test.rb +60 -0
- data/test/git/git_helper.rb +1 -1
- data/test/helper.rb +4 -0
- data/test/ticket_tracking/jira_test.rb +260 -0
- data/test/time_tracking/harvest_test.rb +49 -0
- data/toolshed.gemspec +2 -0
- metadata +40 -3
@@ -0,0 +1,260 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class JiraTest < Test::Unit::TestCase
|
4
|
+
def self.startup
|
5
|
+
Toolshed::Client::ticket_tracker_username = 'sample'
|
6
|
+
Toolshed::Client::ticket_tracker_password = 'sample'
|
7
|
+
Toolshed::Client::ticket_tracker_owner = 'sample'
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_add_note
|
11
|
+
mock_init
|
12
|
+
jira_init
|
13
|
+
|
14
|
+
jira_comments_mock = mock('JIRA::HasManyProxy')
|
15
|
+
jira_comments_mock.stubs({
|
16
|
+
parent: @jira_issue_mock
|
17
|
+
})
|
18
|
+
|
19
|
+
@jira_issue_mock.expects(:comments).returns(
|
20
|
+
jira_comments_mock
|
21
|
+
)
|
22
|
+
|
23
|
+
jira_comment_build_mock = mock('JIRA::Resource::Comment')
|
24
|
+
jira_comment_build_mock.stubs({
|
25
|
+
parent: @jira_issue_http_mock
|
26
|
+
})
|
27
|
+
|
28
|
+
jira_comments_mock.expects(:build).returns(
|
29
|
+
jira_comment_build_mock
|
30
|
+
)
|
31
|
+
|
32
|
+
jira_comment_build_mock.expects(:save).with({ 'body' => 'This is my note' }).returns(
|
33
|
+
true
|
34
|
+
)
|
35
|
+
|
36
|
+
assert(@jira.add_note('This is my note'))
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_available_statuses
|
40
|
+
mock_init
|
41
|
+
jira_init
|
42
|
+
available_statuses_mock
|
43
|
+
|
44
|
+
assert_equal(@jira.available_statuses, @jira_find_all_mock)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_update_ticket_status
|
48
|
+
mock_init
|
49
|
+
jira_init
|
50
|
+
available_statuses_mock
|
51
|
+
|
52
|
+
jira_transitions_mock = mock('JIRA::HasManyProxy')
|
53
|
+
jira_transitions_mock.stubs({
|
54
|
+
parent: @jira_issue_http_mock
|
55
|
+
})
|
56
|
+
|
57
|
+
@jira_issue_mock.expects(:transitions).returns(
|
58
|
+
jira_transitions_mock
|
59
|
+
)
|
60
|
+
|
61
|
+
jira_transition_build_mock = mock('JIRA::Resource::Transition')
|
62
|
+
jira_transition_build_mock.stubs(
|
63
|
+
:true
|
64
|
+
)
|
65
|
+
|
66
|
+
@jira.expects(:transition_status_id_by_status).with('Code Review').returns('1')
|
67
|
+
|
68
|
+
jira_transitions_mock.expects(:build).returns(
|
69
|
+
jira_transition_build_mock
|
70
|
+
)
|
71
|
+
|
72
|
+
jira_transition_build_mock.expects(:save).with({ 'transition' => { 'id' => '1' } }).returns(true)
|
73
|
+
|
74
|
+
|
75
|
+
assert(@jira.update_ticket_status('Code Review'))
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_transition_status_id_by_status
|
79
|
+
mock_init
|
80
|
+
jira_init
|
81
|
+
|
82
|
+
jira_status = Struct.new(:id, :name)
|
83
|
+
object_1 = jira_status.new(1, 'Code Review')
|
84
|
+
object_2 = jira_status.new(2, 'In Development')
|
85
|
+
|
86
|
+
@jira.expects(:available_statuses).returns(
|
87
|
+
[
|
88
|
+
object_1,
|
89
|
+
object_2
|
90
|
+
]
|
91
|
+
)
|
92
|
+
|
93
|
+
assert('1', @jira.transition_status_id_by_status('Code Review').to_s)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_transition_status_id_by_status_should_raise_error
|
97
|
+
mock_init
|
98
|
+
jira_init
|
99
|
+
|
100
|
+
jira_status = Struct.new(:id, :name)
|
101
|
+
object_1 = jira_status.new(1, 'Code Review')
|
102
|
+
object_2 = jira_status.new(2, 'In Development')
|
103
|
+
|
104
|
+
@jira.expects(:available_statuses).returns(
|
105
|
+
[
|
106
|
+
object_1,
|
107
|
+
object_2
|
108
|
+
]
|
109
|
+
)
|
110
|
+
|
111
|
+
assert_raise('Unable to find available status') { @jira.transition_status_id_by_status('bla') }
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_url
|
115
|
+
mock_init
|
116
|
+
jira_init
|
117
|
+
|
118
|
+
@jira_issue_mock.expects(:key).returns(
|
119
|
+
'11'
|
120
|
+
)
|
121
|
+
|
122
|
+
assert_equal("https://#{Toolshed::Client::ticket_tracker_owner}.atlassian.net/browse/11", @jira.url)
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_username
|
126
|
+
assert_equal(Toolshed::TicketTracking::Jira.username, Toolshed::Client::ticket_tracker_username)
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_password
|
130
|
+
assert_equal(Toolshed::TicketTracking::Jira.password, Toolshed::Client::ticket_tracker_password)
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_create_instance_raise_project_name
|
134
|
+
assert_raise('Unable to use Jira as project name was not supplied') { Toolshed::TicketTracking::Jira.create_instance() }
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_create_instance_raise_ticket_id
|
138
|
+
assert_raise('Unable to use Jira as ticket id was not supplied') { Toolshed::TicketTracking::Jira.create_instance({ project: 11 }) }
|
139
|
+
end
|
140
|
+
|
141
|
+
private
|
142
|
+
|
143
|
+
def jira_init
|
144
|
+
@jira = Toolshed::TicketTracking::Jira.create_instance({
|
145
|
+
username: Toolshed::Client::ticket_tracker_username,
|
146
|
+
password: Toolshed::Client::ticket_tracker_password,
|
147
|
+
owner: Toolshed::Client::ticket_tracker_owner,
|
148
|
+
project: 'project',
|
149
|
+
ticket_id: '11',
|
150
|
+
})
|
151
|
+
end
|
152
|
+
|
153
|
+
def mock_init
|
154
|
+
#
|
155
|
+
# Client MOCK
|
156
|
+
#
|
157
|
+
@jira_http_client = mock('JIRA::HttpClient')
|
158
|
+
@jira_http_client.stubs(jira_http_mock_attributes)
|
159
|
+
|
160
|
+
@jira_client_mock = mock('JIRA::Client')
|
161
|
+
|
162
|
+
mock_options = jira_http_mock_attributes.merge!({ request_client: @jira_http_client})
|
163
|
+
@jira_client_mock.stubs(mock_options)
|
164
|
+
|
165
|
+
JIRA::Client.expects(:new).
|
166
|
+
with({
|
167
|
+
username: Toolshed::Client::ticket_tracker_username,
|
168
|
+
password: Toolshed::Client::ticket_tracker_password,
|
169
|
+
site: "https://#{Toolshed::Client::ticket_tracker_owner}.atlassian.net",
|
170
|
+
context_path: '',
|
171
|
+
auth_type: :basic,
|
172
|
+
use_ssl: true
|
173
|
+
}).
|
174
|
+
returns(@jira_client_mock)
|
175
|
+
|
176
|
+
#
|
177
|
+
# Project MOCK
|
178
|
+
#
|
179
|
+
@jira_project_http_mock = mock('JIRA::HttpClient')
|
180
|
+
@jira_project_http_mock.stubs(jira_http_mock_attributes)
|
181
|
+
|
182
|
+
@jira_project_mock = mock('JIRA::Resource::ProjectFactory')
|
183
|
+
@jira_project_mock.stubs({
|
184
|
+
:client => @jira_client_mock,
|
185
|
+
:request_client => @jira_project_http_mock
|
186
|
+
})
|
187
|
+
|
188
|
+
@jira_client_mock.expects(:Project).returns(
|
189
|
+
@jira_project_mock
|
190
|
+
)
|
191
|
+
|
192
|
+
@jira_project_mock.expects(:find).with('project').returns(
|
193
|
+
@jira_project_mock
|
194
|
+
)
|
195
|
+
|
196
|
+
#
|
197
|
+
# Issue MOCK
|
198
|
+
#
|
199
|
+
@jira_issue_http_mock = mock('JIRA::HttpClient')
|
200
|
+
@jira_issue_http_mock.stubs(jira_http_mock_attributes)
|
201
|
+
|
202
|
+
@jira_issue_mock = mock('JIRA::Resource::IssueFactory')
|
203
|
+
@jira_issue_mock.stubs({
|
204
|
+
:client => @jira_client_mock,
|
205
|
+
:request_client => @jira_project_http_mock
|
206
|
+
})
|
207
|
+
|
208
|
+
@jira_client_mock.expects(:Issue).returns(
|
209
|
+
@jira_issue_mock
|
210
|
+
)
|
211
|
+
|
212
|
+
@jira_issue_mock.expects(:find).with('11').returns(
|
213
|
+
@jira_issue_mock
|
214
|
+
)
|
215
|
+
end
|
216
|
+
|
217
|
+
def jira_http_mock_attributes
|
218
|
+
{
|
219
|
+
options: {
|
220
|
+
username: Toolshed::Client::ticket_tracker_username,
|
221
|
+
password: Toolshed::Client::ticket_tracker_password,
|
222
|
+
site: "https://#{Toolshed::Client::ticket_tracker_owner}.atlassian.net",
|
223
|
+
context_path: "",
|
224
|
+
rest_base_path: "/rest/api/2",
|
225
|
+
ssl_verify_mode: 1,
|
226
|
+
use_ssl: true,
|
227
|
+
auth_type: :basic,
|
228
|
+
}
|
229
|
+
}
|
230
|
+
end
|
231
|
+
|
232
|
+
def available_statuses_mock
|
233
|
+
jira_transition_mock = mock('JIRA::Resource::TransitionFactory')
|
234
|
+
|
235
|
+
mock_options = jira_http_mock_attributes.merge!({ request_client: @jira_http_client})
|
236
|
+
jira_transition_mock.stubs(
|
237
|
+
mock_options
|
238
|
+
)
|
239
|
+
|
240
|
+
@jira_client_mock.expects(:Transition).returns(
|
241
|
+
jira_transition_mock
|
242
|
+
)
|
243
|
+
|
244
|
+
@jira_find_all_mock = mock('JIRA::Resource::Transition')
|
245
|
+
@jira_find_all_mock.stubs(
|
246
|
+
{
|
247
|
+
id: 1,
|
248
|
+
name: 'Code Review',
|
249
|
+
},
|
250
|
+
{
|
251
|
+
id: 2,
|
252
|
+
name: 'In Development',
|
253
|
+
},
|
254
|
+
)
|
255
|
+
|
256
|
+
jira_transition_mock.expects(:all).with({ issue: @jira_issue_mock }).returns(
|
257
|
+
@jira_find_all_mock
|
258
|
+
)
|
259
|
+
end
|
260
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class HarvestTest < Test::Unit::TestCase
|
4
|
+
def self.startup
|
5
|
+
Toolshed::Client.time_tracking_tool = 'harvest'
|
6
|
+
Toolshed::Client.time_tracking_default_project_id = '1234'
|
7
|
+
Toolshed::Client.time_tracking_username = 'sample_username'
|
8
|
+
Toolshed::Client.time_tracking_password = 'sample1234'
|
9
|
+
Toolshed::Client.time_tracking_owner = 'me'
|
10
|
+
|
11
|
+
::Harvest.expects(:client).
|
12
|
+
with(Toolshed::Client.time_tracking_owner, Toolshed::Client.time_tracking_username, Toolshed::Client.time_tracking_password).
|
13
|
+
returns('')
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_get_previous_time_entries
|
17
|
+
harvest_mock = mock('Harvest::TimeEntry')
|
18
|
+
harvest_mock.stubs(:notes => 'Worked on this yesterday')
|
19
|
+
|
20
|
+
second_time_entry_harvest_mock = mock('Harvest::TimeEntry')
|
21
|
+
second_time_entry_harvest_mock.stubs(:notes => 'Second thing for the day')
|
22
|
+
|
23
|
+
Toolshed::TimeTracking::Harvest.any_instance.stubs(:previous_time_entries).
|
24
|
+
returns([harvest_mock, second_time_entry_harvest_mock])
|
25
|
+
|
26
|
+
harvest = Toolshed::TimeTracking::Harvest.new()
|
27
|
+
output = harvest.previous_notes
|
28
|
+
|
29
|
+
assert_match /Worked on this yesterday/, output
|
30
|
+
assert_match /Second thing for the day/, output
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_get_todays_time_entries
|
34
|
+
harvest_mock = mock('Harvest::TimeEntry')
|
35
|
+
harvest_mock.stubs(:notes => 'Worked on this today')
|
36
|
+
|
37
|
+
second_time_entry_harvest_mock = mock('Harvest::TimeEntry')
|
38
|
+
second_time_entry_harvest_mock.stubs(:notes => 'Second thing for the day today')
|
39
|
+
|
40
|
+
Toolshed::TimeTracking::Harvest.any_instance.stubs(:previous_time_entries).
|
41
|
+
returns([harvest_mock, second_time_entry_harvest_mock])
|
42
|
+
|
43
|
+
harvest = Toolshed::TimeTracking::Harvest.new()
|
44
|
+
output = harvest.previous_notes
|
45
|
+
|
46
|
+
assert_match /Worked on this today/, output
|
47
|
+
assert_match /Second thing for the day today/, output
|
48
|
+
end
|
49
|
+
end
|
data/toolshed.gemspec
CHANGED
@@ -26,6 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_dependency "veto"
|
27
27
|
spec.add_dependency "launchy"
|
28
28
|
spec.add_dependency "clipboard"
|
29
|
+
spec.add_dependency "jira-ruby"
|
29
30
|
|
30
31
|
spec.add_development_dependency "bundler", "~> 1.3"
|
31
32
|
spec.add_development_dependency "rake"
|
@@ -35,4 +36,5 @@ Gem::Specification.new do |spec|
|
|
35
36
|
spec.add_development_dependency 'debugger'
|
36
37
|
spec.add_development_dependency 'ci_reporter'
|
37
38
|
spec.add_development_dependency 'simplecov'
|
39
|
+
spec.add_development_dependency 'codeclimate-test-reporter'
|
38
40
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toolshed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- test
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: jira-ruby
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: bundler
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -220,6 +234,20 @@ dependencies:
|
|
220
234
|
- - '>='
|
221
235
|
- !ruby/object:Gem::Version
|
222
236
|
version: '0'
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: codeclimate-test-reporter
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - '>='
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: '0'
|
244
|
+
type: :development
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - '>='
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: '0'
|
223
251
|
description: Utility that will automate simple daily tasks developers perform like
|
224
252
|
creating a Github pull request
|
225
253
|
email:
|
@@ -246,15 +274,18 @@ files:
|
|
246
274
|
- lib/toolshed/commands/create_branch.rb
|
247
275
|
- lib/toolshed/commands/create_pivotal_tracker_note.rb
|
248
276
|
- lib/toolshed/commands/create_pull_request.rb
|
277
|
+
- lib/toolshed/commands/create_ticket_comment.rb
|
249
278
|
- lib/toolshed/commands/delete_branch.rb
|
250
279
|
- lib/toolshed/commands/get_daily_time_update.rb
|
251
280
|
- lib/toolshed/commands/list_branches.rb
|
252
281
|
- lib/toolshed/commands/push_branch.rb
|
253
282
|
- lib/toolshed/commands/ticket_information.rb
|
254
283
|
- lib/toolshed/commands/update_pivotal_tracker_story_status.rb
|
284
|
+
- lib/toolshed/commands/update_ticket_status.rb
|
255
285
|
- lib/toolshed/error.rb
|
256
286
|
- lib/toolshed/git/git.rb
|
257
287
|
- lib/toolshed/git/github.rb
|
288
|
+
- lib/toolshed/ticket_tracking/jira.rb
|
258
289
|
- lib/toolshed/ticket_tracking/pivotal_tracker.rb
|
259
290
|
- lib/toolshed/ticket_tracking/ticket_tracking.rb
|
260
291
|
- lib/toolshed/time_tracking/harvest.rb
|
@@ -265,12 +296,15 @@ files:
|
|
265
296
|
- test/commands/create_branch_test.rb
|
266
297
|
- test/commands/create_pull_request_test.rb
|
267
298
|
- test/commands/delete_branch_test.rb
|
299
|
+
- test/commands/get_daily_time_update_test.rb
|
268
300
|
- test/commands/push_branch_test.rb
|
269
301
|
- test/config.rb
|
270
302
|
- test/git/git_helper.rb
|
271
303
|
- test/git/git_test.rb
|
272
304
|
- test/git/github_test.rb
|
273
305
|
- test/helper.rb
|
306
|
+
- test/ticket_tracking/jira_test.rb
|
307
|
+
- test/time_tracking/harvest_test.rb
|
274
308
|
- toolshed.gemspec
|
275
309
|
homepage: ''
|
276
310
|
licenses:
|
@@ -292,7 +326,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
292
326
|
version: '0'
|
293
327
|
requirements: []
|
294
328
|
rubyforge_project:
|
295
|
-
rubygems_version: 2.
|
329
|
+
rubygems_version: 2.2.2
|
296
330
|
signing_key:
|
297
331
|
specification_version: 4
|
298
332
|
summary: Create a Github pull request with minimal work. Will automatically read ticket
|
@@ -303,9 +337,12 @@ test_files:
|
|
303
337
|
- test/commands/create_branch_test.rb
|
304
338
|
- test/commands/create_pull_request_test.rb
|
305
339
|
- test/commands/delete_branch_test.rb
|
340
|
+
- test/commands/get_daily_time_update_test.rb
|
306
341
|
- test/commands/push_branch_test.rb
|
307
342
|
- test/config.rb
|
308
343
|
- test/git/git_helper.rb
|
309
344
|
- test/git/git_test.rb
|
310
345
|
- test/git/github_test.rb
|
311
346
|
- test/helper.rb
|
347
|
+
- test/ticket_tracking/jira_test.rb
|
348
|
+
- test/time_tracking/harvest_test.rb
|