toolshed 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +1 -1
- data/bin/toolshed.rb +44 -0
- data/lib/toolshed.rb +2 -0
- data/lib/toolshed/cli.rb +2 -0
- data/lib/toolshed/client.rb +37 -35
- data/lib/toolshed/commands/ssh.rb +16 -0
- data/lib/toolshed/password.rb +42 -0
- data/lib/toolshed/server_administration/ssh.rb +89 -0
- data/lib/toolshed/version.rb +1 -1
- data/test/.toolshedrc +1 -0
- data/test/password_test.rb +24 -0
- data/test/server_administration/ssh_test.rb +23 -0
- data/toolshed.gemspec +1 -0
- metadata +63 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ba93e5a10749583bb6eaf60cbca9fba6b511514
|
4
|
+
data.tar.gz: a02953709a3fee4e24755aaf6a5011b6ed74dfb4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30b6e833386c13ff5806389dbe8b704e99979f1b4dae0af54de61bfb6c341bed85fff197ce42ce66f33461118e76fab4daf746593dc200f41f167fe5f0118192
|
7
|
+
data.tar.gz: bb95e2a36220f302baa4ce1c08c80558283d2d279fe661e41ce508846eb1f0a353f742094ceae6dcfc2116361c03be16000766b734e2e3a227bfb20654dec937
|
data/Rakefile
CHANGED
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
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'
|
data/lib/toolshed/client.rb
CHANGED
@@ -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'] || '~/.
|
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
|
data/lib/toolshed/version.rb
CHANGED
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.
|
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-
|
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
|