toolshed 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/bin/toolshed.rb +1 -0
- data/lib/toolshed/cli.rb +1 -0
- data/lib/toolshed/client.rb +9 -0
- data/lib/toolshed/commands/base.rb +67 -0
- data/lib/toolshed/commands/create_pull_request.rb +125 -148
- data/lib/toolshed/commands/create_ticket_comment.rb +12 -54
- data/lib/toolshed/ticket_tracking/jira.rb +38 -39
- data/lib/toolshed/ticket_tracking/pivotal_tracker.rb +13 -7
- data/lib/toolshed/ticket_tracking/ticket_tracking.rb +8 -1
- data/lib/toolshed/time_tracking/harvest.rb +1 -1
- data/lib/toolshed/version.rb +1 -1
- data/test/commands/get_daily_time_update_test.rb +2 -2
- data/test/ticket_tracking/jira_test.rb +16 -0
- data/test/time_tracking/harvest_test.rb +1 -1
- data/toolshed.gemspec +6 -6
- metadata +14 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9bdfea21a3da3ced44701c4030023a41dffd6f24
|
4
|
+
data.tar.gz: 0e1abc6ed334b5e07390c356242f7e9de3033f54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 669886428374a6dfe17cbdfecf5e06b51594cc31d913bc92c526c797b1e8611cfb5fab7ac4bf1e10a6079e7e17d0dd758441679deff0f19f2175cfca74152da8
|
7
|
+
data.tar.gz: d1876a1cd4ee6d45347210254f206ee1ea12fece621139195c43170b006a0ca0c9d936225d0d2e00f11a751ccd325c1be08a281fd4abcbbdd6b4b6b5301a9c2c
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
# Toolshed
|
5
5
|
|
6
|
-
Toolshed is a utility gem
|
6
|
+
Toolshed is a utility gem. The purpose of toolshed is to make small to complex command line tasks easier. This includes tasks related to Git like creating a pull request or creating a branch. It also includes tasks like ticket tracking. Currently only a limited set of products is supported but this can be expanded over time as needed.
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -21,7 +21,7 @@ Or install it yourself as:
|
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
24
|
-
After
|
24
|
+
After installing the gem run toolshed from the command line for help menu. It will list the available commands.
|
25
25
|
|
26
26
|
## Contributing
|
27
27
|
|
data/bin/toolshed.rb
CHANGED
@@ -33,6 +33,7 @@ Note that it will only read one file which ever file is closest to the directory
|
|
33
33
|
push_to_repository_user: [push_to_repository_user] (required)
|
34
34
|
push_to_repository_name: [push_to_repository_name] (required)
|
35
35
|
push_to_remote_name: [push_to_remote_name] (required)
|
36
|
+
default_pull_request_title_format: [id] - [summary] (optional)
|
36
37
|
|
37
38
|
time_tracking_username: [username] (optional)
|
38
39
|
time_tracking_password: [password] (optional)
|
data/lib/toolshed/cli.rb
CHANGED
data/lib/toolshed/client.rb
CHANGED
@@ -188,6 +188,14 @@ module Toolshed
|
|
188
188
|
@ticket_status_for_complete = status
|
189
189
|
end
|
190
190
|
|
191
|
+
def self.default_pull_request_title_format
|
192
|
+
@default_pull_request_title_format
|
193
|
+
end
|
194
|
+
|
195
|
+
def self.default_pull_request_title_format=(default_pull_request_title_format)
|
196
|
+
@default_pull_request_title_format = default_pull_request_title_format
|
197
|
+
end
|
198
|
+
|
191
199
|
# time tracking configuration
|
192
200
|
|
193
201
|
def self.time_tracking_tool
|
@@ -266,6 +274,7 @@ module Toolshed
|
|
266
274
|
self.time_tracking_tool ||= credentials['time_tracking_tool']
|
267
275
|
self.git_quiet ||= (credentials['git_quiet']) ? '&> /dev/null' : ''
|
268
276
|
self.use_defaults ||= credentials['use_defaults']
|
277
|
+
self.default_pull_request_title_format ||= credentials['default_pull_request_title_format']
|
269
278
|
@credentials_loaded = true
|
270
279
|
end
|
271
280
|
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Toolshed
|
2
|
+
module Commands
|
3
|
+
class Base
|
4
|
+
def initialize(options={})
|
5
|
+
end
|
6
|
+
|
7
|
+
def read_user_input(message, options={})
|
8
|
+
return options[:default] if Toolshed::Client.use_defaults
|
9
|
+
prompt_user_input(message, options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def read_user_input_title(message, options={})
|
13
|
+
return options[:title] if options.has_key?(:title)
|
14
|
+
read_user_input(message, options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def read_user_input_body(message, options={})
|
18
|
+
return options[:body] if options.has_key?(:body)
|
19
|
+
read_user_input(message, options)
|
20
|
+
end
|
21
|
+
|
22
|
+
def use_ticket_tracker_project_id(options)
|
23
|
+
options
|
24
|
+
options.merge!({
|
25
|
+
ticket_tracker_const: 'USE_PROJECT_ID',
|
26
|
+
type: :project_id,
|
27
|
+
default_method: 'default_pivotal_tracker_project_id',
|
28
|
+
default_message: "Project ID (Default: #{Toolshed::Client.default_pivotal_tracker_project_id}):",
|
29
|
+
})
|
30
|
+
options = use_ticket_tracker_by_type(options)
|
31
|
+
end
|
32
|
+
|
33
|
+
def use_ticket_tracker_project_name(options)
|
34
|
+
options.merge!({
|
35
|
+
ticket_tracker_const: 'USE_PROJECT_NAME',
|
36
|
+
type: :project,
|
37
|
+
default_method: 'default_ticket_tracker_project',
|
38
|
+
default_message: "Project Name (Default: #{Toolshed::Client.default_ticket_tracker_project}):",
|
39
|
+
})
|
40
|
+
use_ticket_tracker_by_type(options)
|
41
|
+
end
|
42
|
+
|
43
|
+
def use_ticket_tracker_by_type(options)
|
44
|
+
use_field = Object.const_get("#{ticket_tracker_class}::#{options[:ticket_tracker_const]}") rescue false
|
45
|
+
if use_field
|
46
|
+
ticket_tracker_response = read_user_input(options[:default_message],
|
47
|
+
options.merge!({ default: Toolshed::Client.send(options[:default_method]) })
|
48
|
+
)
|
49
|
+
options.merge!({ options[:type] => ticket_tracker_response })
|
50
|
+
end
|
51
|
+
options
|
52
|
+
end
|
53
|
+
|
54
|
+
def use_project_id
|
55
|
+
Object.const_get("#{ticket_tracker_class}::USE_PROJECT_ID") rescue false
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def prompt_user_input(message, options)
|
61
|
+
puts message
|
62
|
+
value = $stdin.gets.chomp
|
63
|
+
value.empty? ? options[:default] : value
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -1,182 +1,159 @@
|
|
1
|
+
require 'toolshed/commands/base'
|
2
|
+
|
1
3
|
module Toolshed
|
2
4
|
module Commands
|
3
|
-
class CreatePullRequest
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
class CreatePullRequest < Base
|
6
|
+
attr_accessor :ticket_tracking_url, :ticket_tracking_title,
|
7
|
+
:ticket_id, :ticket_tracker,
|
8
|
+
:ticket_tracker_class, :ticket_tracker_project_id,
|
9
|
+
:pull_request_url, :git_tool,
|
10
|
+
:pull_request_title, :pull_request_body
|
11
|
+
|
12
|
+
def initialize(options={})
|
13
|
+
super(options)
|
14
|
+
self.ticket_tracker_class = nil
|
15
|
+
self.pull_request_url = ''
|
16
|
+
end
|
9
17
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
18
|
+
def execute(args, options = {})
|
19
|
+
output_begining_messages
|
20
|
+
options = execute_ticket_tracking(options)
|
21
|
+
options = execute_pull_request(options) unless options.nil?
|
22
|
+
end
|
14
23
|
|
15
|
-
|
16
|
-
ticket_tracker_class = Object.const_get("Toolshed::TicketTracking::#{Toolshed::Client.ticket_tracking_tool.camel_case}")
|
17
|
-
|
18
|
-
use_project_id = Object.const_get("#{ticket_tracker_class}::USE_PROJECT_ID") rescue false
|
19
|
-
if use_project_id
|
20
|
-
ticket_tracker_project_id = read_user_input_project(
|
21
|
-
"Project ID (Default: #{Toolshed::Client.default_pivotal_tracker_project_id}):",
|
22
|
-
options.merge!({
|
23
|
-
default: Toolshed::Client.default_pivotal_tracker_project_id,
|
24
|
-
})
|
25
|
-
)
|
26
|
-
options.merge!({
|
27
|
-
project_id: ticket_tracker_project_id,
|
28
|
-
})
|
29
|
-
end
|
24
|
+
private
|
30
25
|
|
31
|
-
|
32
|
-
|
33
|
-
ticket_tracker_project_name = read_user_input_project(
|
34
|
-
"Project Name (Default: #{Toolshed::Client.default_ticket_tracker_project}):", options.merge!({
|
35
|
-
default: Toolshed::Client.default_ticket_tracker_project,
|
36
|
-
})
|
37
|
-
)
|
38
|
-
options.merge!({
|
39
|
-
project: ticket_tracker_project_name,
|
40
|
-
})
|
41
|
-
end
|
26
|
+
def read_user_input_add_note_to_ticket(message)
|
27
|
+
return true if Toolshed::Client.use_defaults
|
42
28
|
|
43
|
-
|
44
|
-
|
45
|
-
"Ticket ID (Default: #{Toolshed::TicketTracking::story_id_from_branch_name(Toolshed::Git::Base.branch_name)}):", {
|
46
|
-
default: Toolshed::TicketTracking::story_id_from_branch_name(Toolshed::Git::Base.branch_name),
|
47
|
-
}
|
48
|
-
)
|
49
|
-
options.merge!({
|
50
|
-
ticket_id: ticket_id,
|
51
|
-
})
|
29
|
+
puts message
|
30
|
+
value = $stdin.gets.chomp
|
52
31
|
|
53
|
-
|
32
|
+
until %w(y n).include?(value.downcase)
|
33
|
+
puts "Value must be Y or N"
|
34
|
+
puts message
|
35
|
+
value = $stdin.gets.chomp
|
36
|
+
end
|
54
37
|
|
55
|
-
|
56
|
-
|
57
|
-
ticket_id = ticket_id
|
38
|
+
(value == 'y') ? true : false
|
39
|
+
end
|
58
40
|
|
59
|
-
|
60
|
-
|
61
|
-
puts "Ticket ID: #{ticket_id}"
|
62
|
-
rescue Exception => e
|
63
|
-
puts e.inspect
|
64
|
-
puts "Ticket tracking tool is not supported at this time"
|
65
|
-
return
|
66
|
-
end
|
41
|
+
def read_user_input_ticket_tracker_ticket_id(message, options)
|
42
|
+
read_user_input(message, options)
|
67
43
|
end
|
68
44
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
45
|
+
def output_begining_messages
|
46
|
+
puts "Current Branch: #{Toolshed::Git::Base.branch_name}"
|
47
|
+
puts "Branched From: #{Toolshed::Git::Base.branched_from}"
|
48
|
+
puts "Using Defaults: #{(Toolshed::Client.use_defaults.nil?) ? 'No' : 'Yes'}"
|
49
|
+
end
|
73
50
|
|
74
|
-
|
75
|
-
|
76
|
-
"
|
77
|
-
|
78
|
-
|
79
|
-
})
|
80
|
-
)
|
81
|
-
body = read_user_input_pull_request_body(
|
82
|
-
"Pull request body (Default: #{ticket_tracking_url}):",
|
83
|
-
options.merge!({
|
84
|
-
default: ticket_tracking_url
|
85
|
-
})
|
51
|
+
def get_ticket_id(options)
|
52
|
+
self.ticket_id = read_user_input_ticket_tracker_ticket_id(
|
53
|
+
"Ticket ID (Default: #{Toolshed::TicketTracking::story_id_from_branch_name(Toolshed::Git::Base.branch_name)}):", {
|
54
|
+
default: Toolshed::TicketTracking::story_id_from_branch_name(Toolshed::Git::Base.branch_name),
|
55
|
+
}
|
86
56
|
)
|
57
|
+
options.merge!({
|
58
|
+
ticket_id: self.ticket_id,
|
59
|
+
})
|
60
|
+
options
|
61
|
+
end
|
87
62
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
add_note_to_ticket = read_user_input_add_note_to_ticket("Would you like to add a note with the pull request url?")
|
94
|
-
if (add_note_to_ticket)
|
95
|
-
result = ticket_tracker.add_note(pull_request_url)
|
96
|
-
|
97
|
-
default_completed_status = Object.const_get("#{ticket_tracker_class}::DEFAULT_COMPLETED_STATUS") rescue false
|
98
|
-
unless (default_completed_status)
|
99
|
-
default_completed_status = Toolshed::Client.ticket_status_for_complete
|
100
|
-
end
|
63
|
+
def output_ticket_information
|
64
|
+
puts "Ticket Tracking URL: #{ticket_tracking_url}"
|
65
|
+
puts "Ticket Tracking title: #{ticket_tracking_title}"
|
66
|
+
puts "Ticket ID: #{ticket_id}"
|
67
|
+
end
|
101
68
|
|
102
|
-
|
69
|
+
def execute_ticket_tracking(options)
|
70
|
+
unless Toolshed::Client.ticket_tracking_tool.nil? || Toolshed::Client.ticket_tracking_tool.empty?
|
71
|
+
begin
|
72
|
+
self.ticket_tracker_class = Object.const_get("Toolshed::TicketTracking::#{Toolshed::Client.ticket_tracking_tool.camel_case}")
|
73
|
+
options = get_ticket_project_information(options)
|
74
|
+
initialize_ticket_tracker_properties(options)
|
75
|
+
|
76
|
+
output_ticket_information
|
77
|
+
rescue Exception => e
|
78
|
+
puts e.inspect
|
79
|
+
puts e.backtrace
|
80
|
+
puts "Ticket tracking tool is not supported at this time"
|
81
|
+
return
|
103
82
|
end
|
83
|
+
options
|
104
84
|
end
|
105
|
-
|
106
|
-
puts "Created Pull Request: #{pull_request_url}"
|
107
|
-
rescue => e
|
108
|
-
puts e.message
|
109
|
-
exit
|
85
|
+
options
|
110
86
|
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def read_user_input_add_note_to_ticket(message)
|
114
|
-
return true if (Toolshed::Client.use_defaults)
|
115
|
-
|
116
|
-
puts message
|
117
|
-
value = $stdin.gets.chomp
|
118
87
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
88
|
+
def add_note_to_ticket
|
89
|
+
add_note_to_ticket_response = read_user_input_add_note_to_ticket(
|
90
|
+
"Would you like to add a note with the pull request url?"
|
91
|
+
)
|
92
|
+
if add_note_to_ticket_response
|
93
|
+
result = self.ticket_tracker.add_note(pull_request_url)
|
94
|
+
default_completed_status = Object.const_get("#{ticket_tracker_class}::DEFAULT_COMPLETED_STATUS") rescue false
|
95
|
+
default_completed_status = Toolshed::Client.ticket_status_for_complete unless default_completed_status
|
96
|
+
ticket_tracker.update_ticket_status(default_completed_status)
|
97
|
+
end
|
123
98
|
end
|
124
99
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
def read_user_input_pull_request_title(message, options)
|
129
|
-
return options[:title] if (options.has_key?(:title))
|
130
|
-
return options[:default] if (Toolshed::Client.use_defaults)
|
131
|
-
|
132
|
-
puts message
|
133
|
-
value = $stdin.gets.chomp
|
134
|
-
if (value.empty?)
|
135
|
-
value = options[:default]
|
100
|
+
def pull_request_created_message
|
101
|
+
puts "Created Pull Request: #{pull_request_url}"
|
136
102
|
end
|
137
103
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
104
|
+
def execute_pull_request(options)
|
105
|
+
begin
|
106
|
+
self.git_tool = Object.const_get("Toolshed::Git::#{Toolshed::Client.git_tool.camel_case}").create_instance
|
107
|
+
|
108
|
+
options = set_pull_request_title(options)
|
109
|
+
options = set_pull_request_body(options)
|
110
|
+
send_pull_request
|
111
|
+
add_note_to_ticket unless ticket_tracker_class.nil?
|
112
|
+
pull_request_created_message
|
113
|
+
rescue => e
|
114
|
+
puts e.message
|
115
|
+
exit
|
116
|
+
end
|
150
117
|
end
|
151
118
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
if (value.empty?)
|
162
|
-
value = options[:default]
|
119
|
+
def set_pull_request_title(options)
|
120
|
+
self.pull_request_title = read_user_input_title(
|
121
|
+
"Pull request title (Default: #{self.ticket_tracking_title}):",
|
122
|
+
options.merge!({
|
123
|
+
default: self.ticket_tracking_title,
|
124
|
+
})
|
125
|
+
)
|
126
|
+
options
|
163
127
|
end
|
164
128
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
129
|
+
def set_pull_request_body(options)
|
130
|
+
self.pull_request_body = read_user_input_body(
|
131
|
+
"Pull request body (Default: #{self.ticket_tracking_url}):",
|
132
|
+
options.merge!({
|
133
|
+
default: self.ticket_tracking_url
|
134
|
+
})
|
135
|
+
)
|
136
|
+
options
|
137
|
+
end
|
170
138
|
|
171
|
-
|
172
|
-
|
139
|
+
def send_pull_request
|
140
|
+
puts "Pull request being created"
|
141
|
+
git_pull_request_result = self.git_tool.create_pull_request(pull_request_title, pull_request_body)
|
142
|
+
self.pull_request_url = git_pull_request_result["html_url"]
|
143
|
+
end
|
173
144
|
|
174
|
-
|
175
|
-
|
145
|
+
def get_ticket_project_information(options)
|
146
|
+
options = use_ticket_tracker_project_id(options)
|
147
|
+
options = use_ticket_tracker_project_name(options)
|
148
|
+
options = get_ticket_id(options)
|
149
|
+
options
|
176
150
|
end
|
177
151
|
|
178
|
-
|
179
|
-
|
152
|
+
def initialize_ticket_tracker_properties(options)
|
153
|
+
self.ticket_tracker = ticket_tracker_class.create_instance(options)
|
154
|
+
self.ticket_tracking_url = ticket_tracker.url
|
155
|
+
self.ticket_tracking_title = ticket_tracker.default_title
|
156
|
+
end
|
180
157
|
end
|
181
158
|
end
|
182
159
|
end
|
@@ -1,42 +1,26 @@
|
|
1
|
+
require 'toolshed/commands/base'
|
2
|
+
|
1
3
|
module Toolshed
|
2
4
|
module Commands
|
3
|
-
class CreateTicketComment
|
5
|
+
class CreateTicketComment < Base
|
6
|
+
|
7
|
+
def initialize(options={})
|
8
|
+
super(options)
|
9
|
+
end
|
10
|
+
|
4
11
|
def execute(args, options = {})
|
5
12
|
ticket_tracker_class = Object.const_get("Toolshed::TicketTracking::#{Toolshed::Client.ticket_tracking_tool.camel_case}")
|
6
13
|
|
7
|
-
|
8
|
-
|
9
|
-
ticket_tracker_project_id = read_user_input_project(
|
10
|
-
"Project ID (Default: #{Toolshed::Client.default_pivotal_tracker_project_id}):",
|
11
|
-
options.merge!({
|
12
|
-
default: Toolshed::Client.default_pivotal_tracker_project_id,
|
13
|
-
})
|
14
|
-
)
|
15
|
-
options.merge!({
|
16
|
-
project_id: ticket_tracker_project_id
|
17
|
-
})
|
18
|
-
end
|
19
|
-
|
20
|
-
use_project_name = Object.const_get("#{ticket_tracker_class}::USE_PROJECT_NAME") rescue false
|
21
|
-
if use_project_name
|
22
|
-
ticket_tracker_project_name = read_user_input_project(
|
23
|
-
"Project Name (Default: #{Toolshed::Client.default_ticket_tracker_project}):",
|
24
|
-
options.merge!({ default: Toolshed::Client.default_ticket_tracker_project })
|
25
|
-
)
|
26
|
-
options.merge!({
|
27
|
-
project: ticket_tracker_project_name
|
28
|
-
})
|
29
|
-
end
|
14
|
+
options = use_ticket_tracker_project_id(options)
|
15
|
+
options = use_ticket_tracker_project_name(options)
|
30
16
|
|
31
17
|
default_ticket_id = Toolshed::TicketTracking::story_id_from_branch_name(Toolshed::Git::Base.branch_name)
|
32
|
-
ticket_id =
|
18
|
+
ticket_id = read_user_input("Ticket ID (Default: #{default_ticket_id}):", options.merge!({ default: default_ticket_id }))
|
33
19
|
options.merge!({ ticket_id: ticket_id })
|
34
20
|
|
35
21
|
ticket_tracker = ticket_tracker_class.create_instance(options)
|
36
22
|
|
37
|
-
if use_project_id
|
38
|
-
puts "Using Project: #{ticket_tracker_project_id}"
|
39
|
-
end
|
23
|
+
puts "Using Project: #{ticket_tracker_project_id}" if use_project_id
|
40
24
|
puts "Using Ticket: #{ticket_id}"
|
41
25
|
|
42
26
|
puts "Note? "
|
@@ -54,32 +38,6 @@ module Toolshed
|
|
54
38
|
exit
|
55
39
|
end
|
56
40
|
end
|
57
|
-
|
58
|
-
def read_user_input_project(message, options)
|
59
|
-
return options[:default] if (options.has_key?(:use_defaults))
|
60
|
-
|
61
|
-
puts message
|
62
|
-
value = $stdin.gets.chomp
|
63
|
-
|
64
|
-
if (value.empty?)
|
65
|
-
value = options[:default]
|
66
|
-
end
|
67
|
-
|
68
|
-
value
|
69
|
-
end
|
70
|
-
|
71
|
-
def read_user_input_ticket_id(message, options)
|
72
|
-
return options[:default] if (options.has_key?(:use_defaults))
|
73
|
-
|
74
|
-
puts message
|
75
|
-
value = $stdin.gets.chomp
|
76
|
-
|
77
|
-
if (value.empty?)
|
78
|
-
value = options[:default]
|
79
|
-
end
|
80
|
-
|
81
|
-
value
|
82
|
-
end
|
83
41
|
end
|
84
42
|
end
|
85
43
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
module Toolshed
|
2
2
|
module TicketTracking
|
3
|
-
class Jira
|
4
|
-
extend TicketTracking
|
3
|
+
class Jira < Base
|
5
4
|
include HTTParty
|
6
5
|
|
7
6
|
USE_PROJECT_NAME = true
|
8
7
|
|
9
|
-
attr_accessor :project, :client, :owner, :ticket
|
8
|
+
attr_accessor :project, :client, :owner, :ticket, :default_pull_request_title_format
|
10
9
|
|
11
10
|
def initialize(options={})
|
12
11
|
username = (options[:username].nil?) ? Toolshed::Client::ticket_tracker_username : options[:username]
|
13
12
|
password = (options[:password].nil?) ? Toolshed::Client::ticket_tracker_password : options[:password]
|
14
13
|
|
15
|
-
self.owner = Toolshed::Client
|
14
|
+
self.owner = Toolshed::Client.ticket_tracker_owner
|
15
|
+
self.default_pull_request_title_format = Toolshed::Client.default_pull_request_title_format ||= "[summary]"
|
16
16
|
|
17
17
|
self.client = JIRA::Client.new({
|
18
18
|
username: username,
|
@@ -27,9 +27,6 @@ module Toolshed
|
|
27
27
|
self.ticket = self.client.Issue.find(options[:ticket_id])
|
28
28
|
end
|
29
29
|
|
30
|
-
#
|
31
|
-
# Instance methods
|
32
|
-
#
|
33
30
|
def add_note(note_text)
|
34
31
|
issue = self.ticket.comments.build
|
35
32
|
issue.save({ 'body' => note_text })
|
@@ -56,50 +53,52 @@ module Toolshed
|
|
56
53
|
raise "Unable to find available status"
|
57
54
|
end
|
58
55
|
|
59
|
-
def
|
60
|
-
self.
|
56
|
+
def default_title
|
57
|
+
default_title_text = self.default_pull_request_title_format
|
58
|
+
self.default_pull_request_title_format.scan(/(\[\w*\])/).each do |replacement_element|
|
59
|
+
default_title_text = default_title_text.gsub(replacement_element.first.to_s, self.send(replacement_element.first.to_s.gsub("[", "").gsub("]", "")))
|
60
|
+
end
|
61
|
+
default_title_text
|
62
|
+
end
|
63
|
+
|
64
|
+
def attribute_value(attribute)
|
65
|
+
self.ticket.send(attribute)
|
61
66
|
end
|
62
67
|
|
63
68
|
def url
|
64
69
|
"https://#{self.owner}.atlassian.net/browse/#{self.ticket.key}"
|
65
70
|
end
|
66
71
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
def self.username
|
71
|
-
return Toolshed::Client::ticket_tracker_username unless Toolshed::Client::ticket_tracker_username.nil?
|
72
|
-
|
73
|
-
# prompt to ask for username
|
74
|
-
puts "Jira username? "
|
75
|
-
username = $stdin.gets.chomp.strip
|
76
|
-
end
|
72
|
+
class << self
|
73
|
+
def username
|
74
|
+
return Toolshed::Client::ticket_tracker_username unless Toolshed::Client::ticket_tracker_username.nil?
|
77
75
|
|
78
|
-
|
79
|
-
|
76
|
+
# prompt to ask for username
|
77
|
+
puts "Jira username? "
|
78
|
+
username = $stdin.gets.chomp.strip
|
79
|
+
end
|
80
80
|
|
81
|
-
|
82
|
-
|
83
|
-
puts "Jira password? "
|
84
|
-
password = $stdin.gets.chomp.strip
|
85
|
-
system "stty echo"
|
86
|
-
end
|
81
|
+
def password
|
82
|
+
return Toolshed::Client::ticket_tracker_password unless Toolshed::Client::ticket_tracker_password.nil?
|
87
83
|
|
88
|
-
|
89
|
-
|
90
|
-
|
84
|
+
# prompt to ask for password
|
85
|
+
system "stty -echo"
|
86
|
+
puts "Jira password? "
|
87
|
+
password = $stdin.gets.chomp.strip
|
88
|
+
system "stty echo"
|
91
89
|
end
|
92
90
|
|
93
|
-
|
94
|
-
raise 'Unable to use Jira as
|
95
|
-
|
91
|
+
def create_instance(options={})
|
92
|
+
raise 'Unable to use Jira as project name was not supplied' unless (options.has_key?(:project))
|
93
|
+
raise 'Unable to use Jira as ticket id was not supplied' unless (options.has_key?(:ticket_id))
|
96
94
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
95
|
+
jira = Toolshed::TicketTracking::Jira.new({
|
96
|
+
project: options[:project],
|
97
|
+
username: Toolshed::TicketTracking::Jira.username,
|
98
|
+
password: Toolshed::TicketTracking::Jira.password,
|
99
|
+
ticket_id: options[:ticket_id]
|
100
|
+
})
|
101
|
+
end
|
103
102
|
end
|
104
103
|
end
|
105
104
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
module Toolshed
|
2
2
|
module TicketTracking
|
3
|
-
class PivotalTracker
|
4
|
-
extend TicketTracking
|
3
|
+
class PivotalTracker < Base
|
5
4
|
include HTTParty
|
6
5
|
|
7
6
|
DEFAULT_COMPLETED_STATUS = 'finished'
|
8
7
|
USE_PROJECT_ID = true
|
9
8
|
|
10
|
-
attr_accessor :project_id, :token, :story
|
9
|
+
attr_accessor :project_id, :token, :story, :default_pull_request_title_format
|
11
10
|
|
12
11
|
def initialize(options={})
|
13
12
|
username = Toolshed::Client::pivotal_tracker_username
|
14
13
|
password = Toolshed::Client::pivotal_tracker_password
|
14
|
+
self.default_pull_request_title_format = Toolshed::Client.default_pull_request_title_format ||= "[title]"
|
15
15
|
|
16
16
|
unless (options[:username].nil?)
|
17
17
|
username = options[:username]
|
@@ -58,12 +58,18 @@ module Toolshed
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
def
|
62
|
-
self.
|
61
|
+
def default_title
|
62
|
+
default_title_text = self.default_pull_request_title_format
|
63
|
+
self.default_pull_request_title_format.scan(/(\[\w*\])/).each do |replacement_element|
|
64
|
+
default_title_text = default_title_text.gsub(replacement_element.first.to_s, self.send(replacement_element.first.to_s.gsub("[", "").gsub("]", "")))
|
65
|
+
end
|
66
|
+
default_title_text
|
63
67
|
end
|
64
68
|
|
65
|
-
def
|
66
|
-
self.story.
|
69
|
+
def attribute_value(attribute)
|
70
|
+
value = self.story.send(attribute)
|
71
|
+
self.clean(value) if attribute == 'title'
|
72
|
+
value
|
67
73
|
end
|
68
74
|
|
69
75
|
class << self
|
@@ -25,7 +25,7 @@ module Toolshed
|
|
25
25
|
owner = options[:sub_domain]
|
26
26
|
end
|
27
27
|
|
28
|
-
self.harvest_client = ::Harvest.client(owner, username, password)
|
28
|
+
self.harvest_client = ::Harvest.client(subdomain: owner, username: username, password: password)
|
29
29
|
self.project_id = options[:project_id] unless !options.has_key?(:project_id)
|
30
30
|
|
31
31
|
# setup formatting
|
data/lib/toolshed/version.rb
CHANGED
@@ -12,7 +12,7 @@ class GetDailyTimeUpdateTest < Test::Unit::TestCase
|
|
12
12
|
|
13
13
|
def test_get_daily_time_update_with_defaults
|
14
14
|
::Harvest.expects(:client).
|
15
|
-
with(Toolshed::Client.time_tracking_owner, Toolshed::Client.time_tracking_username, Toolshed::Client.time_tracking_password).
|
15
|
+
with(subdomain: Toolshed::Client.time_tracking_owner, username: Toolshed::Client.time_tracking_username, password: Toolshed::Client.time_tracking_password).
|
16
16
|
returns('')
|
17
17
|
|
18
18
|
harvest_mock = mock('Harvest::TimeEntry')
|
@@ -36,7 +36,7 @@ class GetDailyTimeUpdateTest < Test::Unit::TestCase
|
|
36
36
|
Toolshed::Client.use_defaults = true
|
37
37
|
|
38
38
|
::Harvest.expects(:client).
|
39
|
-
with(Toolshed::Client.time_tracking_owner, Toolshed::Client.time_tracking_username, Toolshed::Client.time_tracking_password).
|
39
|
+
with(subdomain: Toolshed::Client.time_tracking_owner, username: Toolshed::Client.time_tracking_username, password: Toolshed::Client.time_tracking_password).
|
40
40
|
returns('')
|
41
41
|
|
42
42
|
harvest_mock = mock('Harvest::TimeEntry')
|
@@ -5,6 +5,7 @@ class JiraTest < Test::Unit::TestCase
|
|
5
5
|
Toolshed::Client::ticket_tracker_username = 'sample'
|
6
6
|
Toolshed::Client::ticket_tracker_password = 'sample'
|
7
7
|
Toolshed::Client::ticket_tracker_owner = 'sample'
|
8
|
+
Toolshed::Client::default_pull_request_title_format = '[id] - [summary]'
|
8
9
|
end
|
9
10
|
|
10
11
|
def test_add_note
|
@@ -138,6 +139,21 @@ class JiraTest < Test::Unit::TestCase
|
|
138
139
|
assert_raise('Unable to use Jira as ticket id was not supplied') { Toolshed::TicketTracking::Jira.create_instance({ project: 11 }) }
|
139
140
|
end
|
140
141
|
|
142
|
+
def test_default_pull_request_format_is_correct
|
143
|
+
mock_init
|
144
|
+
jira_init
|
145
|
+
|
146
|
+
@jira_issue_mock.expects(:id).returns(
|
147
|
+
'10'
|
148
|
+
)
|
149
|
+
|
150
|
+
@jira_issue_mock.expects(:summary).returns(
|
151
|
+
'testing this out'
|
152
|
+
)
|
153
|
+
|
154
|
+
assert_equal "10 - testing this out", @jira.default_title
|
155
|
+
end
|
156
|
+
|
141
157
|
private
|
142
158
|
|
143
159
|
def jira_init
|
@@ -9,7 +9,7 @@ class HarvestTest < Test::Unit::TestCase
|
|
9
9
|
Toolshed::Client.time_tracking_owner = 'me'
|
10
10
|
|
11
11
|
::Harvest.expects(:client).
|
12
|
-
with(Toolshed::Client.time_tracking_owner, Toolshed::Client.time_tracking_username, Toolshed::Client.time_tracking_password).
|
12
|
+
with(subdomain: Toolshed::Client.time_tracking_owner, username: Toolshed::Client.time_tracking_username, password: Toolshed::Client.time_tracking_password).
|
13
13
|
returns('')
|
14
14
|
end
|
15
15
|
|
data/toolshed.gemspec
CHANGED
@@ -6,8 +6,8 @@ require 'toolshed/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "toolshed"
|
8
8
|
spec.version = Toolshed::VERSION
|
9
|
-
spec.authors = ["
|
10
|
-
spec.email = ["
|
9
|
+
spec.authors = ["Jake Waller"]
|
10
|
+
spec.email = ["wallerjake@gmail.com"]
|
11
11
|
spec.description = %q{Utility that will automate simple daily tasks developers perform like creating a Github pull request}
|
12
12
|
spec.summary = %q{Create a Github pull request with minimal work. Will automatically read ticket information from pivotal tracker if you use that.}
|
13
13
|
spec.homepage = ""
|
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
17
17
|
#spec.executables = ["toolshed"]
|
18
18
|
spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
-
spec.test_files = spec.files.grep(%r{^(test
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test)/})
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
22
|
spec.add_dependency "httparty"
|
@@ -29,12 +29,12 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_dependency "jira-ruby"
|
30
30
|
spec.add_dependency "net-ssh"
|
31
31
|
|
32
|
-
spec.add_development_dependency "bundler"
|
32
|
+
spec.add_development_dependency "bundler"
|
33
33
|
spec.add_development_dependency "rake"
|
34
34
|
spec.add_development_dependency 'mocha'
|
35
35
|
spec.add_development_dependency 'faker'
|
36
|
-
spec.add_development_dependency 'test-unit'
|
37
|
-
spec.add_development_dependency '
|
36
|
+
spec.add_development_dependency 'test-unit'
|
37
|
+
spec.add_development_dependency 'pry-byebug'
|
38
38
|
spec.add_development_dependency 'ci_reporter'
|
39
39
|
spec.add_development_dependency 'simplecov'
|
40
40
|
spec.add_development_dependency 'codeclimate-test-reporter'
|
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: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Jake Waller
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -140,16 +140,16 @@ dependencies:
|
|
140
140
|
name: bundler
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- - "
|
143
|
+
- - ">="
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: '
|
145
|
+
version: '0'
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- - "
|
150
|
+
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: '
|
152
|
+
version: '0'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: rake
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -196,18 +196,18 @@ dependencies:
|
|
196
196
|
name: test-unit
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
198
198
|
requirements:
|
199
|
-
- - "
|
199
|
+
- - ">="
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version:
|
201
|
+
version: '0'
|
202
202
|
type: :development
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
|
-
- - "
|
206
|
+
- - ">="
|
207
207
|
- !ruby/object:Gem::Version
|
208
|
-
version:
|
208
|
+
version: '0'
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
|
-
name:
|
210
|
+
name: pry-byebug
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
212
212
|
requirements:
|
213
213
|
- - ">="
|
@@ -265,7 +265,7 @@ dependencies:
|
|
265
265
|
description: Utility that will automate simple daily tasks developers perform like
|
266
266
|
creating a Github pull request
|
267
267
|
email:
|
268
|
-
-
|
268
|
+
- wallerjake@gmail.com
|
269
269
|
executables:
|
270
270
|
- toolshed
|
271
271
|
- toolshed.rb
|
@@ -284,6 +284,7 @@ files:
|
|
284
284
|
- lib/toolshed/base.rb
|
285
285
|
- lib/toolshed/cli.rb
|
286
286
|
- lib/toolshed/client.rb
|
287
|
+
- lib/toolshed/commands/base.rb
|
287
288
|
- lib/toolshed/commands/checkout_branch.rb
|
288
289
|
- lib/toolshed/commands/create_branch.rb
|
289
290
|
- lib/toolshed/commands/create_pivotal_tracker_note.rb
|