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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ba93e5a10749583bb6eaf60cbca9fba6b511514
4
- data.tar.gz: a02953709a3fee4e24755aaf6a5011b6ed74dfb4
3
+ metadata.gz: 9bdfea21a3da3ced44701c4030023a41dffd6f24
4
+ data.tar.gz: 0e1abc6ed334b5e07390c356242f7e9de3033f54
5
5
  SHA512:
6
- metadata.gz: 30b6e833386c13ff5806389dbe8b704e99979f1b4dae0af54de61bfb6c341bed85fff197ce42ce66f33461118e76fab4daf746593dc200f41f167fe5f0118192
7
- data.tar.gz: bb95e2a36220f302baa4ce1c08c80558283d2d279fe661e41ce508846eb1f0a353f742094ceae6dcfc2116361c03be16000766b734e2e3a227bfb20654dec937
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 meant to make small tasks faster. This includes things like making a pull request up to Github all the way to creating a branch. This gem can be extended to used else where also.
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 install the gem run toolshed for help menu. It will list the available commands.
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
@@ -39,6 +39,7 @@ module Toolshed
39
39
  end
40
40
  end
41
41
 
42
+ require 'toolshed/commands/base'
42
43
  require 'toolshed/commands/create_pull_request'
43
44
  require 'toolshed/commands/create_pivotal_tracker_note'
44
45
  require 'toolshed/commands/ticket_information'
@@ -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
- def execute(args, options = {})
5
- # see what branch is checked out and where we are branched from
6
- puts "Current Branch: #{Toolshed::Git::Base.branch_name}"
7
- puts "Branched From: #{Toolshed::Git::Base.branched_from}"
8
- puts "Using Defaults: #{(Toolshed::Client.use_defaults.nil?) ? 'No' : 'Yes'}"
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
- unless (Toolshed::Client.ticket_tracking_tool.nil? || Toolshed::Client.ticket_tracking_tool.empty?)
11
- ticket_tracking_url = ''
12
- ticket_tracking_title = ''
13
- ticket_id = ''
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
- begin
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
- use_project_name = Object.const_get("#{ticket_tracker_class}::USE_PROJECT_NAME") rescue false
32
- if use_project_name
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
- # @TODO - refactor this code into the git module seems more appropriate since it's performing git functions
44
- ticket_id = read_user_input_ticket_tracker_ticket_id(
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
- ticket_tracker = ticket_tracker_class.create_instance(options)
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
- ticket_tracking_url = ticket_tracker.url
56
- ticket_tracking_title = ticket_tracker.title
57
- ticket_id = ticket_id
38
+ (value == 'y') ? true : false
39
+ end
58
40
 
59
- puts "Ticket Tracking URL: #{ticket_tracking_url}"
60
- puts "Ticket Tracking title: #{ticket_tracking_title}"
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
- pull_request_url = ''
70
- begin
71
- git_tool_class = Object.const_get("Toolshed::Git::#{Toolshed::Client.git_tool.camel_case}")
72
- git_tool = git_tool_class.create_instance
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
- # create the pull request prompt when needed
75
- title = read_user_input_pull_request_title(
76
- "Pull request title (Default: #{ticket_tracking_title}):",
77
- options.merge!({
78
- default: ticket_tracking_title,
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
- puts "Pull request being created"
89
- git_pull_request_result = git_tool.create_pull_request(title, body)
90
- pull_request_url = git_pull_request_result["html_url"]
91
-
92
- unless (Toolshed::Client.ticket_tracking_tool.nil? || Toolshed::Client.ticket_tracking_tool.empty?)
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
- result = ticket_tracker.update_ticket_status(default_completed_status)
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
- until (%w(y n).include?(value.downcase))
120
- puts "Value must be Y or N"
121
- puts message
122
- value = $stdin.gets.chomp
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
- (value == 'y') ? true : false
126
- end
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
- value
139
- end
140
-
141
- def read_user_input_pull_request_body(message, options)
142
- return options[:body] if (options.has_key?(:body))
143
- return options[:default] if (Toolshed::Client.use_defaults)
144
-
145
- puts message
146
- value = $stdin.gets.chomp
147
-
148
- if (value.empty?)
149
- value = options[:default]
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
- value
153
- end
154
-
155
- def read_user_input_project(message, options)
156
- return options[:default] if (Toolshed::Client.use_defaults)
157
-
158
- puts message
159
- value = $stdin.gets.chomp
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
- value
166
- end
167
-
168
- def read_user_input_ticket_tracker_ticket_id(message, options)
169
- return options[:default] if (Toolshed::Client.use_defaults)
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
- puts message
172
- value = $stdin.gets.chomp
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
- if (value.empty?)
175
- value = options[:default]
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
- value
179
- end
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
- use_project_id = Object.const_get("#{ticket_tracker_class}::USE_PROJECT_ID") rescue false
8
- if use_project_id
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 = read_user_input_ticket_id("Ticket ID (Default: #{default_ticket_id}):", options.merge!({ default: default_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::ticket_tracker_owner
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 title
60
- self.ticket.summary
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
- # Class methods
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
- def self.password
79
- return Toolshed::Client::ticket_tracker_password unless Toolshed::Client::ticket_tracker_password.nil?
76
+ # prompt to ask for username
77
+ puts "Jira username? "
78
+ username = $stdin.gets.chomp.strip
79
+ end
80
80
 
81
- # prompt to ask for password
82
- system "stty -echo"
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
- def self.create_instance(options={})
89
- unless (options.has_key?(:project))
90
- raise 'Unable to use Jira as project name was not supplied'
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
- unless (options.has_key?(:ticket_id))
94
- raise 'Unable to use Jira as ticket id was not supplied'
95
- end
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
- jira = Toolshed::TicketTracking::Jira.new({
98
- project: options[:project],
99
- username: Toolshed::TicketTracking::Jira.username,
100
- password: Toolshed::TicketTracking::Jira.password,
101
- ticket_id: options[:ticket_id]
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 title
62
- self.clean(self.story.name)
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 url(ticket_id)
66
- self.story.url
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
@@ -1,6 +1,13 @@
1
1
  module Toolshed
2
2
  module TicketTracking
3
- def initialize(options={})
3
+ class Base
4
+ def initialize(options={})
5
+ end
6
+
7
+ def method_missing(name, *args)
8
+ string_name = name.to_s
9
+ attribute_value(string_name)
10
+ end
4
11
  end
5
12
 
6
13
  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
@@ -1,3 +1,3 @@
1
1
  module Toolshed
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -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 = ["test"]
10
- spec.email = ["test@gmail.com"]
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|spec|features)/})
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", "~> 1.3"
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', '~> 2.5.5'
37
- spec.add_development_dependency 'debugger'
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.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
- - test
7
+ - Jake Waller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-29 00:00:00.000000000 Z
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: '1.3'
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: '1.3'
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: 2.5.5
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: 2.5.5
208
+ version: '0'
209
209
  - !ruby/object:Gem::Dependency
210
- name: debugger
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
- - test@gmail.com
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