toolshed 1.0.1 → 1.0.2
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/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
|