toolshed 1.0.0 → 1.0.1

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: 54a3e26a9cf4670879ed25c97435e8561787c511
4
- data.tar.gz: b8f2a24202d44ad03349477e54d2ce1216ebfe61
3
+ metadata.gz: 6ba93e5a10749583bb6eaf60cbca9fba6b511514
4
+ data.tar.gz: a02953709a3fee4e24755aaf6a5011b6ed74dfb4
5
5
  SHA512:
6
- metadata.gz: cf484481408ec9dbac5b35d93e19e3dc39f907aec6c5e6fe5f908135b794a401498cd5e9353b6556aeab016a02bf6b32bf1e515de1e9f2e58f8d5a4aff16ca04
7
- data.tar.gz: 1b4833ba97542589fb44a81a358f250eaafe730d80e49b9c3339cee24b7df171dadb3f5bad726723df62984a6a176e4ee86565b053384aa87bc875c802ba0252
6
+ metadata.gz: 30b6e833386c13ff5806389dbe8b704e99979f1b4dae0af54de61bfb6c341bed85fff197ce42ce66f33461118e76fab4daf746593dc200f41f167fe5f0118192
7
+ data.tar.gz: bb95e2a36220f302baa4ce1c08c80558283d2d279fe661e41ce508846eb1f0a353f742094ceae6dcfc2116361c03be16000766b734e2e3a227bfb20654dec937
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require File.expand_path(File.dirname(__FILE__)) + "/test/config"
5
5
 
6
6
  Rake::TestTask.new do |t|
7
7
  t.libs << 'test'
8
- t.test_files = FileList['test/**/*_test.rb']
8
+ t.test_files = FileList['test/**/*_test.rb', 'test/*_test.rb']
9
9
  end
10
10
 
11
11
  desc "Run tests"
data/bin/toolshed.rb CHANGED
@@ -89,6 +89,18 @@ create_ticket_comment [ # Add a comment to a specific ticket
89
89
  ]
90
90
  update_ticket_status [ # Update a specific tickets status
91
91
  ]
92
+ ssh [
93
+ --use-sudo "true|false" # If you want the command to run under sudo i.e. sudo ssh ..
94
+ --host "ip_address" # The host you want to connect to
95
+ --connection-string-options "-p 4000" # A string of options that will be added onto the command
96
+ --commands 'command1;command2' # A list of commands either a string array "["command1", "command2"]" or "command1;command2" or put string into toolshedrc file and call it "main_server_commands"
97
+ --password "password1" # The password you are using to login to the server
98
+ --prompt-for-password "true|false" # If you want to be more secure and just prompt for passwords
99
+ --user "username" # The user you want to connect with
100
+ --keys "path/to/file" # IdentityFile you want to use for authentication if passed no password will be asked
101
+ --sudo-password "password1" # If you need to use sudo provide a sudo password this can be taken from toolshedrc file also
102
+ --verbose-output "true|flase" # If you want to see commands being ran and other verbose output set this flag to true
103
+ ]
92
104
  EOF
93
105
  end
94
106
 
@@ -198,6 +210,38 @@ if $0.split("/").last == 'toolshed'
198
210
  Toolshed::Client.use_defaults = opt
199
211
  end
200
212
  end,
213
+ 'ssh' => OptionParser.new do |opts|
214
+ opts.on("--use-sudo [ARG]") do |opt|
215
+ options[:use_sudo] = opt
216
+ end
217
+ opts.on("--host [ARG]") do |opt|
218
+ options[:host] = opt
219
+ end
220
+ opts.on("--connection-string-options [ARG]") do |opt|
221
+ options[:connection_string_options] = opt
222
+ end
223
+ opts.on("--commands [ARG]") do |opt|
224
+ options[:commands] = opt
225
+ end
226
+ opts.on("--password [ARG]") do |opt|
227
+ options[:password] = opt
228
+ end
229
+ opts.on("--prompt-for-password [ARG]") do |opt|
230
+ options[:prompt_for_password] = opt
231
+ end
232
+ opts.on("--user [ARG]") do |opt|
233
+ options[:user] = opt
234
+ end
235
+ opts.on("--keys [ARG]") do |opt|
236
+ options[:keys] = opt
237
+ end
238
+ opts.on("--sudo-password [ARG]") do |opt|
239
+ options[:sudo_password] = opt
240
+ end
241
+ opts.on("--verbose-output [ARG]") do |opt|
242
+ options[:verbose_output] = opt
243
+ end
244
+ end,
201
245
  }
202
246
 
203
247
  global.order!
data/lib/toolshed.rb CHANGED
@@ -33,3 +33,5 @@ require 'toolshed/ticket_tracking/jira'
33
33
  require 'toolshed/time_tracking/time_tracking'
34
34
  require 'toolshed/time_tracking/harvest'
35
35
  require 'toolshed/error'
36
+ require 'toolshed/password'
37
+ require 'toolshed/server_administration/ssh'
data/lib/toolshed/cli.rb CHANGED
@@ -33,6 +33,7 @@ module Toolshed
33
33
  'delete_branch' => Toolshed::Commands::DeleteBranch,
34
34
  'create_ticket_comment' => Toolshed::Commands::CreateTicketComment,
35
35
  'update_ticket_status' => Toolshed::Commands::UpdateTicketStatus,
36
+ 'ssh' => Toolshed::Commands::SSH,
36
37
  }
37
38
  end
38
39
  end
@@ -51,3 +52,4 @@ require 'toolshed/commands/list_branches'
51
52
  require 'toolshed/commands/delete_branch'
52
53
  require 'toolshed/commands/create_ticket_comment'
53
54
  require 'toolshed/commands/update_ticket_status'
55
+ require 'toolshed/commands/ssh'
@@ -230,17 +230,50 @@ module Toolshed
230
230
  @time_tracking_default_project_id = time_tracking_default_project_id
231
231
  end
232
232
 
233
-
234
-
235
233
  def self.load_credentials_if_necessary
236
234
  load_credentials unless credentials_loaded?
237
235
  end
238
236
 
239
237
  def self.config_path
240
- ENV['TOOLSHED_CONFIG'] || '~/.toolshed'
238
+ ENV['TOOLSHED_CONFIG'] || '~/.toolshedrc'
241
239
  end
242
240
 
243
241
  def self.load_credentials(path = config_path)
242
+ credentials = Client.read_credenials(config_path)
243
+ self.github_username ||= credentials['github_username']
244
+ self.github_password ||= credentials['github_password']
245
+ self.github_token ||= credentials['github_token']
246
+ self.pivotal_tracker_username ||= credentials['pivotal_tracker_username']
247
+ self.pivotal_tracker_password ||= credentials['pivotal_tracker_password']
248
+ self.default_pivotal_tracker_project_id ||= credentials['default_pivotal_tracker_project_id']
249
+ self.ticket_tracker_username ||= credentials['ticket_tracker_username']
250
+ self.ticket_tracker_password ||= credentials['ticket_tracker_password']
251
+ self.ticket_tracker_owner ||= credentials['ticket_tracker_owner']
252
+ self.ticket_status_for_complete ||= credentials['ticket_status_for_complete']
253
+ self.default_ticket_tracker_project ||= credentials['default_ticket_tracker_project']
254
+ self.pull_from_remote_name ||= credentials['pull_from_remote_name']
255
+ self.pull_from_repository_user ||= credentials['pull_from_repository_user']
256
+ self.pull_from_repository_name ||= credentials['pull_from_repository_name']
257
+ self.push_to_repository_user ||= credentials['push_to_repository_user']
258
+ self.push_to_remote_name ||= credentials['push_to_remote_name']
259
+ self.ticket_tracking_tool ||= credentials['ticket_tracking_tool']
260
+ self.use_git_submodules ||= credentials['use_git_submodules']
261
+ self.git_tool ||= credentials['git_tool']
262
+ self.time_tracking_username ||= credentials['time_tracking_username']
263
+ self.time_tracking_password ||= credentials['time_tracking_password']
264
+ self.time_tracking_owner ||= credentials['time_tracking_owner']
265
+ self.time_tracking_default_project_id ||= credentials['time_tracking_default_project_id']
266
+ self.time_tracking_tool ||= credentials['time_tracking_tool']
267
+ self.git_quiet ||= (credentials['git_quiet']) ? '&> /dev/null' : ''
268
+ self.use_defaults ||= credentials['use_defaults']
269
+ @credentials_loaded = true
270
+ end
271
+
272
+ def self.credentials_loaded?
273
+ (@credentials_loaded ||= false)
274
+ end
275
+
276
+ def self.read_credenials(path = Client.config_path)
244
277
  begin
245
278
  dir = Dir.pwd
246
279
  while File.expand_path(dir) != '/' do
@@ -256,43 +289,12 @@ module Toolshed
256
289
  dir = File.join dir, '..'
257
290
  end
258
291
 
259
- credentials = YAML.load_file(File.expand_path(loaded_from_path))
260
- self.github_username ||= credentials['github_username']
261
- self.github_password ||= credentials['github_password']
262
- self.github_token ||= credentials['github_token']
263
- self.pivotal_tracker_username ||= credentials['pivotal_tracker_username']
264
- self.pivotal_tracker_password ||= credentials['pivotal_tracker_password']
265
- self.default_pivotal_tracker_project_id ||= credentials['default_pivotal_tracker_project_id']
266
- self.ticket_tracker_username ||= credentials['ticket_tracker_username']
267
- self.ticket_tracker_password ||= credentials['ticket_tracker_password']
268
- self.ticket_tracker_owner ||= credentials['ticket_tracker_owner']
269
- self.ticket_status_for_complete ||= credentials['ticket_status_for_complete']
270
- self.default_ticket_tracker_project ||= credentials['default_ticket_tracker_project']
271
- self.pull_from_remote_name ||= credentials['pull_from_remote_name']
272
- self.pull_from_repository_user ||= credentials['pull_from_repository_user']
273
- self.pull_from_repository_name ||= credentials['pull_from_repository_name']
274
- self.push_to_repository_user ||= credentials['push_to_repository_user']
275
- self.push_to_remote_name ||= credentials['push_to_remote_name']
276
- self.ticket_tracking_tool ||= credentials['ticket_tracking_tool']
277
- self.use_git_submodules ||= credentials['use_git_submodules']
278
- self.git_tool ||= credentials['git_tool']
279
- self.time_tracking_username ||= credentials['time_tracking_username']
280
- self.time_tracking_password ||= credentials['time_tracking_password']
281
- self.time_tracking_owner ||= credentials['time_tracking_owner']
282
- self.time_tracking_default_project_id ||= credentials['time_tracking_default_project_id']
283
- self.time_tracking_tool ||= credentials['time_tracking_tool']
284
- self.git_quiet ||= (credentials['git_quiet']) ? '&> /dev/null' : ''
285
- self.use_defaults ||= credentials['use_defaults']
286
- @credentials_loaded = true
287
292
  puts "Credentials loaded from #{File.absolute_path(loaded_from_path)}"
293
+ credentials = YAML.load_file(File.expand_path(loaded_from_path))
288
294
  rescue => error
289
295
  puts "Error loading your credentials: #{error.message}"
290
296
  exit 1
291
297
  end
292
298
  end
293
-
294
- def self.credentials_loaded?
295
- (@credentials_loaded ||= false)
296
- end
297
299
  end
298
300
  end
@@ -0,0 +1,16 @@
1
+ module Toolshed
2
+ module Commands
3
+ class SSH
4
+ def execute(args, options = {})
5
+ puts "running ssh command with options #{options.inspect}" unless options[:verbose_output].blank?
6
+ begin
7
+ ssh = Toolshed::ServerAdministration::SSH.new(options)
8
+ ssh.execute
9
+ rescue => e
10
+ puts e.inspect
11
+ puts "Unable to connect to #{options[:host]}"
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,42 @@
1
+ module Toolshed
2
+ class Password
3
+ attr_accessor :password, :sudo_password
4
+
5
+ def initialize(options={})
6
+ self.password = options[:password] ||= ''
7
+ self.sudo_password = options[:sudo_password] ||= ''
8
+ end
9
+
10
+ def read_user_input_password(type, prompt_message='Password:')
11
+ unless self.send(type).blank?
12
+ read_password_from_configuration(type)
13
+ else
14
+ prompt_user_to_input_password(prompt_message)
15
+ end
16
+ end
17
+
18
+ protected
19
+
20
+ def prompt_user_to_input_password(message)
21
+ system "stty -echo"
22
+ puts message
23
+ value = get_password_input
24
+ system "stty echo"
25
+
26
+ value
27
+ end
28
+
29
+ def get_password_input
30
+ $stdin.gets.chomp.strip
31
+ end
32
+
33
+ def read_password_from_configuration(type)
34
+ credentials = Toolshed::Client.read_credenials
35
+ if credentials[self.send(type)]
36
+ credentials[self.send(type)]
37
+ else
38
+ self.send(type)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,89 @@
1
+ require 'net/ssh'
2
+
3
+ module Toolshed
4
+ module ServerAdministration
5
+ class SSH
6
+ attr_accessor :keys, :password, :sudo_password, :host, :user, :ssh_options, :channel, :commands, :password
7
+
8
+ def initialize(options={})
9
+ self.password = options[:password] ||= ''
10
+ self.sudo_password = options[:sudo_password] ||= ''
11
+ self.keys = options[:keys] ||= ''
12
+ self.host = options[:host] ||= ''
13
+ self.user = options[:user] ||= ''
14
+ self.ssh_options = options[:ssh_options] ||= {}
15
+ self.commands = options[:commands] ||= ''
16
+ self.password = Toolshed::Password.new(options)
17
+
18
+ set_ssh_options
19
+ end
20
+
21
+ def execute
22
+ Net::SSH.start(self.host, self.user, self.ssh_options) do |ssh|
23
+ ssh.open_channel do |channel|
24
+ self.channel = channel
25
+ request_pty
26
+ run_commands
27
+ end
28
+ ssh.loop
29
+ end
30
+ end
31
+
32
+ protected
33
+
34
+ def run_commands
35
+ # @TODO fix this so it does not just pass in the commands option but converts to a string i.e. command1;command2
36
+ self.channel.exec(self.commands) do |ch, success|
37
+ abort "Could not execute commands!" unless success
38
+
39
+ on_data
40
+ on_extended_data
41
+ on_close
42
+ end
43
+ end
44
+
45
+ def request_pty
46
+ self.channel.request_pty do |ch, success|
47
+ puts (success) ? "Successfully obtained pty" : "Could not obtain pty"
48
+ end
49
+ end
50
+
51
+ def on_close
52
+ self.channel.on_close do |ch|
53
+ puts "Channel is closing!"
54
+ end
55
+ end
56
+
57
+ def on_extended_data
58
+ self.channel.on_extended_data do |ch, type, data|
59
+ puts "stderr: #{data}"
60
+ end
61
+ end
62
+
63
+ def on_data
64
+ self.channel.on_data do |ch, data|
65
+ puts "#{data}"
66
+ send_data(data)
67
+ end
68
+ end
69
+
70
+ def send_data(data)
71
+ send_password_data if data =~ /password/
72
+ send_yes_no_data if data =~ /Do you want to continue \[Y\/n\]?/
73
+ end
74
+
75
+ def send_password_data
76
+ self.channel.send_data "#{@password.read_user_input_password('sudo_password')}\n"
77
+ end
78
+
79
+ def send_yes_no_data
80
+ self.channel.send_data "Y\n"
81
+ end
82
+
83
+ def set_ssh_options
84
+ self.ssh_options.merge!({ keys: [self.keys] }) unless self.keys.blank?
85
+ self.ssh_options.merge!({ password: self.password.read_user_input_password('password') }) if self.keys.blank?
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,3 +1,3 @@
1
1
  module Toolshed
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
data/test/.toolshedrc ADDED
@@ -0,0 +1 @@
1
+ server_password: "tester1234"
@@ -0,0 +1,24 @@
1
+ require 'helper'
2
+
3
+ class PasswordTest < Test::Unit::TestCase
4
+ def test_read_user_input_password
5
+ password = Toolshed::Password.new({ password: 'test1234' })
6
+ assert_equal password.read_user_input_password('password'), 'test1234'
7
+ end
8
+
9
+ def test_read_user_input_password_sudo
10
+ password = Toolshed::Password.new({ sudo_password: 'test12345' })
11
+ assert_equal password.read_user_input_password('sudo_password'), 'test12345'
12
+ end
13
+
14
+ def test_read_user_input_password_prompt
15
+ password = Toolshed::Password.new({})
16
+ password.expects(:get_password_input).returns('readin1234')
17
+ assert_equal password.read_user_input_password('password'), 'readin1234'
18
+ end
19
+
20
+ def test_read_user_input_from_toolshedrc
21
+ password = Toolshed::Password.new({ password: 'server_password' })
22
+ assert_equal password.read_user_input_password('password'), 'tester1234'
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ require 'helper'
2
+
3
+ class SSHTest < Test::Unit::TestCase
4
+ def test_setting_ssh_options
5
+ ssh = Toolshed::ServerAdministration::SSH.new({ keys: 'testing1234' })
6
+ assert_equal Set.new(ssh.ssh_options), Set.new({ keys: ['testing1234'] })
7
+ end
8
+
9
+ def test_execute
10
+ params = { keys: 'testing1234', host: 'localhost', user: 'localhost' }
11
+
12
+ net_ssh_connection_mock = mock('Net::SSH::Connection::Session')
13
+ net_ssh_connection_mock.stubs({ connection: true })
14
+
15
+ net_ssh_connection_channel_mock = mock('Net::SSH::Connection::Channel')
16
+ net_ssh_connection_channel_mock.stubs({ request_pty: [net_ssh_connection_mock, 'good'] })
17
+
18
+ Net::SSH.expects(:start).with(params[:host], params[:user], { keys: [params[:keys]] }).returns(net_ssh_connection_mock)
19
+
20
+ ssh = Toolshed::ServerAdministration::SSH.new(params)
21
+ ssh.execute
22
+ end
23
+ end
data/toolshed.gemspec CHANGED
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency "launchy"
28
28
  spec.add_dependency "clipboard"
29
29
  spec.add_dependency "jira-ruby"
30
+ spec.add_dependency "net-ssh"
30
31
 
31
32
  spec.add_development_dependency "bundler", "~> 1.3"
32
33
  spec.add_development_dependency "rake"
metadata CHANGED
@@ -1,251 +1,265 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toolshed
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - test
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-08 00:00:00.000000000 Z
11
+ date: 2014-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: json
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pivotal-tracker
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: harvested
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: veto
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: launchy
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: clipboard
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: jira-ruby
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '>='
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '>='
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: net-ssh
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: bundler
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - ~>
143
+ - - "~>"
130
144
  - !ruby/object:Gem::Version
131
145
  version: '1.3'
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
- - - ~>
150
+ - - "~>"
137
151
  - !ruby/object:Gem::Version
138
152
  version: '1.3'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: rake
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
- - - '>='
157
+ - - ">="
144
158
  - !ruby/object:Gem::Version
145
159
  version: '0'
146
160
  type: :development
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
- - - '>='
164
+ - - ">="
151
165
  - !ruby/object:Gem::Version
152
166
  version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: mocha
155
169
  requirement: !ruby/object:Gem::Requirement
156
170
  requirements:
157
- - - '>='
171
+ - - ">="
158
172
  - !ruby/object:Gem::Version
159
173
  version: '0'
160
174
  type: :development
161
175
  prerelease: false
162
176
  version_requirements: !ruby/object:Gem::Requirement
163
177
  requirements:
164
- - - '>='
178
+ - - ">="
165
179
  - !ruby/object:Gem::Version
166
180
  version: '0'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: faker
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
- - - '>='
185
+ - - ">="
172
186
  - !ruby/object:Gem::Version
173
187
  version: '0'
174
188
  type: :development
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
- - - '>='
192
+ - - ">="
179
193
  - !ruby/object:Gem::Version
180
194
  version: '0'
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: test-unit
183
197
  requirement: !ruby/object:Gem::Requirement
184
198
  requirements:
185
- - - ~>
199
+ - - "~>"
186
200
  - !ruby/object:Gem::Version
187
201
  version: 2.5.5
188
202
  type: :development
189
203
  prerelease: false
190
204
  version_requirements: !ruby/object:Gem::Requirement
191
205
  requirements:
192
- - - ~>
206
+ - - "~>"
193
207
  - !ruby/object:Gem::Version
194
208
  version: 2.5.5
195
209
  - !ruby/object:Gem::Dependency
196
210
  name: debugger
197
211
  requirement: !ruby/object:Gem::Requirement
198
212
  requirements:
199
- - - '>='
213
+ - - ">="
200
214
  - !ruby/object:Gem::Version
201
215
  version: '0'
202
216
  type: :development
203
217
  prerelease: false
204
218
  version_requirements: !ruby/object:Gem::Requirement
205
219
  requirements:
206
- - - '>='
220
+ - - ">="
207
221
  - !ruby/object:Gem::Version
208
222
  version: '0'
209
223
  - !ruby/object:Gem::Dependency
210
224
  name: ci_reporter
211
225
  requirement: !ruby/object:Gem::Requirement
212
226
  requirements:
213
- - - '>='
227
+ - - ">="
214
228
  - !ruby/object:Gem::Version
215
229
  version: '0'
216
230
  type: :development
217
231
  prerelease: false
218
232
  version_requirements: !ruby/object:Gem::Requirement
219
233
  requirements:
220
- - - '>='
234
+ - - ">="
221
235
  - !ruby/object:Gem::Version
222
236
  version: '0'
223
237
  - !ruby/object:Gem::Dependency
224
238
  name: simplecov
225
239
  requirement: !ruby/object:Gem::Requirement
226
240
  requirements:
227
- - - '>='
241
+ - - ">="
228
242
  - !ruby/object:Gem::Version
229
243
  version: '0'
230
244
  type: :development
231
245
  prerelease: false
232
246
  version_requirements: !ruby/object:Gem::Requirement
233
247
  requirements:
234
- - - '>='
248
+ - - ">="
235
249
  - !ruby/object:Gem::Version
236
250
  version: '0'
237
251
  - !ruby/object:Gem::Dependency
238
252
  name: codeclimate-test-reporter
239
253
  requirement: !ruby/object:Gem::Requirement
240
254
  requirements:
241
- - - '>='
255
+ - - ">="
242
256
  - !ruby/object:Gem::Version
243
257
  version: '0'
244
258
  type: :development
245
259
  prerelease: false
246
260
  version_requirements: !ruby/object:Gem::Requirement
247
261
  requirements:
248
- - - '>='
262
+ - - ">="
249
263
  - !ruby/object:Gem::Version
250
264
  version: '0'
251
265
  description: Utility that will automate simple daily tasks developers perform like
@@ -258,8 +272,8 @@ executables:
258
272
  extensions: []
259
273
  extra_rdoc_files: []
260
274
  files:
261
- - .gitignore
262
- - .travis.yml
275
+ - ".gitignore"
276
+ - ".travis.yml"
263
277
  - Gemfile
264
278
  - LICENSE.txt
265
279
  - README.md
@@ -279,18 +293,22 @@ files:
279
293
  - lib/toolshed/commands/get_daily_time_update.rb
280
294
  - lib/toolshed/commands/list_branches.rb
281
295
  - lib/toolshed/commands/push_branch.rb
296
+ - lib/toolshed/commands/ssh.rb
282
297
  - lib/toolshed/commands/ticket_information.rb
283
298
  - lib/toolshed/commands/update_pivotal_tracker_story_status.rb
284
299
  - lib/toolshed/commands/update_ticket_status.rb
285
300
  - lib/toolshed/error.rb
286
301
  - lib/toolshed/git/git.rb
287
302
  - lib/toolshed/git/github.rb
303
+ - lib/toolshed/password.rb
304
+ - lib/toolshed/server_administration/ssh.rb
288
305
  - lib/toolshed/ticket_tracking/jira.rb
289
306
  - lib/toolshed/ticket_tracking/pivotal_tracker.rb
290
307
  - lib/toolshed/ticket_tracking/ticket_tracking.rb
291
308
  - lib/toolshed/time_tracking/harvest.rb
292
309
  - lib/toolshed/time_tracking/time_tracking.rb
293
310
  - lib/toolshed/version.rb
311
+ - test/.toolshedrc
294
312
  - test/commands/checkout_branch_test.rb
295
313
  - test/commands/commands_helper.rb
296
314
  - test/commands/create_branch_test.rb
@@ -303,6 +321,8 @@ files:
303
321
  - test/git/git_test.rb
304
322
  - test/git/github_test.rb
305
323
  - test/helper.rb
324
+ - test/password_test.rb
325
+ - test/server_administration/ssh_test.rb
306
326
  - test/ticket_tracking/jira_test.rb
307
327
  - test/time_tracking/harvest_test.rb
308
328
  - toolshed.gemspec
@@ -316,12 +336,12 @@ require_paths:
316
336
  - lib
317
337
  required_ruby_version: !ruby/object:Gem::Requirement
318
338
  requirements:
319
- - - '>='
339
+ - - ">="
320
340
  - !ruby/object:Gem::Version
321
341
  version: '0'
322
342
  required_rubygems_version: !ruby/object:Gem::Requirement
323
343
  requirements:
324
- - - '>='
344
+ - - ">="
325
345
  - !ruby/object:Gem::Version
326
346
  version: '0'
327
347
  requirements: []
@@ -332,6 +352,7 @@ specification_version: 4
332
352
  summary: Create a Github pull request with minimal work. Will automatically read ticket
333
353
  information from pivotal tracker if you use that.
334
354
  test_files:
355
+ - test/.toolshedrc
335
356
  - test/commands/checkout_branch_test.rb
336
357
  - test/commands/commands_helper.rb
337
358
  - test/commands/create_branch_test.rb
@@ -344,5 +365,7 @@ test_files:
344
365
  - test/git/git_test.rb
345
366
  - test/git/github_test.rb
346
367
  - test/helper.rb
368
+ - test/password_test.rb
369
+ - test/server_administration/ssh_test.rb
347
370
  - test/ticket_tracking/jira_test.rb
348
371
  - test/time_tracking/harvest_test.rb