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 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