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