rutty 2.3.2 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/test/helper.rb CHANGED
@@ -7,7 +7,22 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
7
  require 'rutty'
8
8
 
9
9
  class Test::Unit::TestCase
10
- TEST_CONF_DIR = File.join(File.dirname(__FILE__), '..', 'tmp')
10
+ # Terminal escape sequences for colors
11
+ module Colors
12
+ CLEAR = '\\e\[0m'
13
+
14
+ RED = '\\e\[31m'
15
+ YELLOW = '\\e\[33m'
16
+ GREEN = '\\e\[32m'
17
+ CYAN = '\\e\[36m'
18
+
19
+ RED_BG = '\\e\[41m'
20
+
21
+ BOLD = '\\e\[1m'
22
+ end
23
+
24
+ TMP_DIR = File.join(File.dirname(__FILE__), '..', 'tmp')
25
+ TEST_CONF_DIR = File.join(TMP_DIR, 'config')
11
26
  TEST_GENERAL_CONF = File.join(TEST_CONF_DIR, 'defaults.yaml')
12
27
  TEST_NODES_CONF = File.join(TEST_CONF_DIR, 'nodes.yaml')
13
28
 
@@ -20,16 +35,16 @@ class Test::Unit::TestCase
20
35
  end
21
36
 
22
37
  def clean_test_config!
23
- %x(rm -rf #{TEST_CONF_DIR}) if File.exists? TEST_CONF_DIR
38
+ %x(rm -rf #{TMP_DIR}) if File.exists? TMP_DIR
24
39
  end
25
40
 
26
41
  def seed_nodes
27
- out = %x(#{RUTTY_BIN} add_node localhost -c #{TEST_CONF_DIR} -k ~/.ssh/id_rsa -u #{ENV['USER']} --tags localhost,test -p 22)
42
+ out = %x(#{RUTTY_BIN} add_node localhost -c #{TEST_CONF_DIR} -k ~/.ssh/id_rsa -u #{ENV['USER']} -g localhost,test -p 22)
28
43
  assert_match /Added localhost/, out
29
44
  end
30
45
 
31
46
  def seed_bad_node
32
- out = %x(#{RUTTY_BIN} add_node example.com -c #{TEST_CONF_DIR} --tags example,test,broken)
47
+ out = %x(#{RUTTY_BIN} add_node example.com -c #{TEST_CONF_DIR} -g example,test,broken)
33
48
  assert_match /Added example\.com/, out
34
49
  end
35
50
 
@@ -45,6 +60,7 @@ class Test::Unit::TestCase
45
60
  end
46
61
  end
47
62
 
63
+ # Used to make private methods in a class public temporarily.
48
64
  class Class
49
65
  def publicize_methods
50
66
  saved_private_instance_methods = self.private_instance_methods
@@ -8,12 +8,9 @@ class TestActionAddNode < Test::Unit::TestCase
8
8
  should "properly create a new node entry when called" do
9
9
  require 'yaml'
10
10
 
11
- output = %x(#{RUTTY_BIN} add_node -c #{TEST_CONF_DIR} example.com -k /home/user/.ssh/id_rsa -u root -p 22333 --tags example,testing)
11
+ output = %x(#{RUTTY_BIN} add_node -c #{TEST_CONF_DIR} example.com -k /home/user/.ssh/id_rsa -u root -p 22333 -g example,testing)
12
12
 
13
- green = '\\e\[32m'
14
- clear = '\\e\[0m'
15
-
16
- assert_match /#{green}Added example\.com#{clear}/, output
13
+ assert_match /#{Colors::GREEN}Added example\.com#{Colors::CLEAR}/, output
17
14
 
18
15
  nodes = YAML.load(File.open(TEST_NODES_CONF).read)
19
16
 
@@ -8,10 +8,7 @@ class TestActionDSH < Test::Unit::TestCase
8
8
  should "report no defined nodes when no nodes defined" do
9
9
  output = %x(#{RUTTY_BIN} -c #{TEST_CONF_DIR} -a uptime)
10
10
 
11
- yellow = '\\e\[33m'
12
- clear = '\\e\[0m'
13
-
14
- assert_match /^#{yellow}No nodes defined#{clear}$/, output.rstrip
11
+ assert_match /^#{Colors::YELLOW}No nodes defined#{Colors::CLEAR}$/, output.rstrip
15
12
  end
16
13
 
17
14
  should "display a critical error state when unable to connect" do
@@ -19,35 +16,39 @@ class TestActionDSH < Test::Unit::TestCase
19
16
 
20
17
  output = %x(#{RUTTY_BIN} -c #{TEST_CONF_DIR} -a uptime)
21
18
 
22
- red_bg = '\\e\[41m'
23
- yellow = '\\e\[33m'
24
- red = '\\e\[31m'
25
- clear = '\\e\[0m'
26
-
27
- assert_match /^#{yellow}#{red_bg}example\.com#{clear}\s+#{red}ERROR: Connection timeout#{clear}$/, output.rstrip
19
+ assert_match /^#{Colors::YELLOW}#{Colors::RED_BG}example\.com#{Colors::CLEAR}\s+#{Colors::RED}ERROR: Connection timeout#{Colors::CLEAR}$/, output.rstrip
28
20
  end
29
21
 
30
- should "display a general error state when an exite code > 0 is returned" do
22
+ should "display a general error state when an exit code > 0 is returned" do
31
23
  seed_nodes
32
24
 
33
25
  output = %x(#{RUTTY_BIN} -c #{TEST_CONF_DIR} -a foobar)
26
+
27
+ assert_match /^#{Colors::BOLD}#{Colors::RED}localhost#{Colors::CLEAR}\s+.*command not found.*$/, output.rstrip
28
+ end
29
+
30
+ should "display the proper output on success" do
31
+ seed_nodes
34
32
 
35
- bold = '\\e\[1m'
36
- red = '\\e\[31m'
37
- clear = '\\e\[0m'
33
+ output = %x(#{RUTTY_BIN} -c #{TEST_CONF_DIR} -a whoami)
38
34
 
39
- assert_match /^#{bold}#{red}localhost#{clear}\s+.*command not found$/, output.rstrip
35
+ assert_match /^#{Colors::GREEN}localhost#{Colors::CLEAR}\s+#{ENV['USER']}$/, output.rstrip
40
36
  end
41
37
 
42
- should "display the proper output on success" do
38
+ should "display successful statistics output" do
43
39
  seed_nodes
44
40
 
45
41
  output = %x(#{RUTTY_BIN} -c #{TEST_CONF_DIR} -a whoami)
46
42
 
47
- green = '\\e\[32m'
48
- clear = '\\e\[0m'
43
+ assert_match /\n+#{Colors::GREEN}1 host\(s\), 0 error\(s\), \d+(?:\.\d+)? seconds?#{Colors::CLEAR}/, output
44
+ end
45
+
46
+ should "display error-state statistics output" do
47
+ seed_bad_node
48
+
49
+ output = %x(#{RUTTY_BIN} -c #{TEST_CONF_DIR} -a whoami)
49
50
 
50
- assert_match /^#{green}localhost#{clear}\s+#{ENV['USER']}$/, output.rstrip
51
+ assert_match /\n+#{Colors::RED}1 host\(s\), 1 error\(s\), \d+(?:\.\d+)? seconds?#{Colors::CLEAR}/, output
51
52
  end
52
53
  end
53
54
  end
@@ -17,10 +17,8 @@ class TestActionInit < Test::Unit::TestCase
17
17
  ensure_fresh_config!
18
18
 
19
19
  out = %x(#{RUTTY_BIN} init #{TEST_CONF_DIR})
20
-
21
- cyan = '\\e\[36m'
22
- clear = '\\e\[0m'
23
- exists = "#{cyan}exists#{clear}"
20
+
21
+ exists = "#{Colors::CYAN}exists#{Colors::CLEAR}"
24
22
 
25
23
  assert_match /^\s+#{exists}\s+#{TEST_CONF_DIR}$/o, out
26
24
  assert_match /^\s+#{exists}\s+#{TEST_GENERAL_CONF}$/o, out
@@ -29,10 +27,8 @@ class TestActionInit < Test::Unit::TestCase
29
27
 
30
28
  should "report that it has created the file structure if it doesn't exist" do
31
29
  out = %x(#{RUTTY_BIN} init #{TEST_CONF_DIR})
32
-
33
- green = '\\e\[32m'
34
- clear = '\\e\[0m'
35
- create = "#{green}create#{clear}"
30
+
31
+ create = "#{Colors::GREEN}create#{Colors::CLEAR}"
36
32
 
37
33
  assert_match /^\s+#{create}\s+#{TEST_CONF_DIR}$/o, out
38
34
  assert_match /^\s+#{create}\s+#{TEST_GENERAL_CONF}$/o, out
@@ -8,10 +8,7 @@ class TestActionListNodes < Test::Unit::TestCase
8
8
  should "report no defined nodes when no nodes are defined" do
9
9
  output = %x(#{RUTTY_BIN} list_nodes -c #{TEST_CONF_DIR} 2>&1)
10
10
 
11
- yellow = '\\e\[33m'
12
- clear = '\\e\[0m'
13
-
14
- assert_match /#{yellow}No nodes defined#{clear}/, output
11
+ assert_match /#{Colors::YELLOW}No nodes defined#{Colors::CLEAR}/, output
15
12
  end
16
13
 
17
14
  should "properly list defined nodes in ASCII table format" do
@@ -0,0 +1,50 @@
1
+ require 'helper'
2
+
3
+ class TestActionSCP < Test::Unit::TestCase
4
+ context "The 'rutty scp' action" do
5
+ setup { ensure_fresh_config! }
6
+ teardown { clean_test_config! }
7
+
8
+ should "correctly upload a file to a node" do
9
+ seed_nodes
10
+
11
+ @test_file_src = File.join(File.expand_path(TMP_DIR), 'TEST')
12
+ @test_file_dest = @test_file_src.dup << "2"
13
+
14
+ File.open(@test_file_src, 'w') { |f| f.write "Hello, this is a test." }
15
+
16
+ @out = %x(#{RUTTY_BIN} scp -c #{TEST_CONF_DIR} -a #{@test_file_src} #{@test_file_dest} 2>&1)
17
+
18
+ assert_file_exists "#{@test_file_dest}"
19
+ assert_equal "Hello, this is a test.", File.read("#{@test_file_dest}")
20
+ end
21
+
22
+ should "display the correct output on success" do
23
+ seed_nodes
24
+
25
+ @test_file_src = File.join(File.expand_path(TMP_DIR), 'TEST')
26
+ @test_file_dest = @test_file_src.dup << "2"
27
+
28
+ File.open(@test_file_src, 'w') { |f| f.write "Hello, this is a test." }
29
+
30
+ @out = %x(#{RUTTY_BIN} scp -c #{TEST_CONF_DIR} -a #{@test_file_src} #{@test_file_dest} 2>&1)
31
+
32
+ assert_match /^#{Colors::GREEN}localhost#{Colors::CLEAR}\n+/, @out
33
+ assert_match /\n+#{Colors::GREEN}1 host\(s\), 0 error\(s\), \d+(?:\.\d+)? seconds?#{Colors::CLEAR}/, @out
34
+ end
35
+
36
+ should "display the correct output on error" do
37
+ seed_bad_node
38
+
39
+ @test_file_src = File.join(File.expand_path(TMP_DIR), 'TEST')
40
+ @test_file_dest = @test_file_src.dup << "2"
41
+
42
+ File.open(@test_file_src, 'w') { |f| f.write "Hello, this is a test." }
43
+
44
+ @out = %x(#{RUTTY_BIN} scp -c #{TEST_CONF_DIR} -a #{@test_file_src} #{@test_file_dest} 2>&1)
45
+
46
+ assert_match /^#{Colors::YELLOW}#{Colors::RED_BG}example\.com#{Colors::CLEAR}\s+#{Colors::RED}ERROR: Connection timeout#{Colors::CLEAR}\n+/, @out
47
+ assert_match /\n+#{Colors::RED}1 host\(s\), 1 error\(s\), \d+(?:\.\d+)? seconds?#{Colors::CLEAR}/, @out
48
+ end
49
+ end
50
+ end
data/test/test_node.rb CHANGED
@@ -1,6 +1,18 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestNode < Test::Unit::TestCase
4
+ context "The Rutty::Node class" do
5
+ should "respond to its methods" do
6
+ assert_respond_to Rutty::Node, :load_config
7
+ end
8
+
9
+ should "raise an exception on #load_config calls" do
10
+ assert_raises RuntimeError do
11
+ Rutty::Node.load_config 'foo'
12
+ end
13
+ end
14
+ end
15
+
4
16
  context "A Rutty::Node instance" do
5
17
  setup do
6
18
  hash = { :foo => "blah", :test => "hello" }
@@ -12,6 +24,7 @@ class TestNode < Test::Unit::TestCase
12
24
  node = Rutty::Node.new Hash.new, @defaults
13
25
 
14
26
  assert_respond_to node, :has_tag?
27
+ assert_respond_to node, :==
15
28
  assert_respond_to node, :<=>
16
29
  end
17
30
 
data/test/test_nodes.rb CHANGED
@@ -65,7 +65,6 @@ class TestNodes < Test::Unit::TestCase
65
65
 
66
66
  should "generate the correct Proc string to eval" do
67
67
  Rutty::Nodes.publicize_methods do
68
- # New sql-like tag query. Need the parser for this.
69
68
  require 'treetop'
70
69
  require 'rutty/treetop/syntax_nodes'
71
70
  require 'rutty/treetop/tag_query'
@@ -84,6 +83,16 @@ class TestNodes < Test::Unit::TestCase
84
83
  end
85
84
  end
86
85
 
86
+ should "raise an exception on malformed tag query strings" do
87
+ Rutty::Nodes.publicize_methods do
88
+ ["'foo' ARND 'bar'", "'fail", "'failure' AND )'foo'"].each do |str|
89
+ assert_raises Rutty::InvalidTagQueryString do
90
+ @nodes.get_tag_query_filter str
91
+ end
92
+ end
93
+ end
94
+ end
95
+
87
96
  should "filter out nodes matching provided criteria" do
88
97
  assert_equal [@node1, @node2], @nodes.filter(OpenStruct.new :port => 22)
89
98
  assert_equal [@node2], @nodes.filter(OpenStruct.new :user => 'google')
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rutty
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
- - 3
9
- - 2
10
- version: 2.3.2
8
+ - 4
9
+ - 0
10
+ version: 2.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Josh Lindsey
@@ -15,16 +15,158 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-15 00:00:00 -05:00
18
+ date: 2010-11-24 00:00:00 -05:00
19
19
  default_executable: rutty
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: bundler
23
- prerelease: false
24
22
  requirement: &id001 !ruby/object:Gem::Requirement
25
23
  none: false
26
24
  requirements:
27
- - - ">="
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ hash: 57
28
+ segments:
29
+ - 4
30
+ - 0
31
+ - 3
32
+ version: 4.0.3
33
+ type: :runtime
34
+ name: commander
35
+ prerelease: false
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 1
46
+ - 4
47
+ - 2
48
+ version: 1.4.2
49
+ type: :runtime
50
+ name: terminal-table
51
+ prerelease: false
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ hash: 11
60
+ segments:
61
+ - 1
62
+ - 4
63
+ - 6
64
+ version: 1.4.6
65
+ type: :runtime
66
+ name: json
67
+ prerelease: false
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ hash: 33
76
+ segments:
77
+ - 2
78
+ - 0
79
+ - 23
80
+ version: 2.0.23
81
+ type: :runtime
82
+ name: net-ssh
83
+ prerelease: false
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ requirement: &id005 !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ~>
90
+ - !ruby/object:Gem::Version
91
+ hash: 31
92
+ segments:
93
+ - 1
94
+ - 0
95
+ - 4
96
+ version: 1.0.4
97
+ type: :runtime
98
+ name: net-scp
99
+ prerelease: false
100
+ version_requirements: *id005
101
+ - !ruby/object:Gem::Dependency
102
+ requirement: &id006 !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ~>
106
+ - !ruby/object:Gem::Version
107
+ hash: 15
108
+ segments:
109
+ - 2
110
+ - 1
111
+ - 2
112
+ version: 2.1.2
113
+ type: :runtime
114
+ name: builder
115
+ prerelease: false
116
+ version_requirements: *id006
117
+ - !ruby/object:Gem::Dependency
118
+ requirement: &id007 !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ~>
122
+ - !ruby/object:Gem::Version
123
+ hash: 23
124
+ segments:
125
+ - 1
126
+ - 4
127
+ - 8
128
+ version: 1.4.8
129
+ type: :runtime
130
+ name: treetop
131
+ prerelease: false
132
+ version_requirements: *id007
133
+ - !ruby/object:Gem::Dependency
134
+ requirement: &id008 !ruby/object:Gem::Requirement
135
+ none: false
136
+ requirements:
137
+ - - ~>
138
+ - !ruby/object:Gem::Version
139
+ hash: 25
140
+ segments:
141
+ - 1
142
+ - 0
143
+ - 7
144
+ version: 1.0.7
145
+ type: :runtime
146
+ name: fastthread
147
+ prerelease: false
148
+ version_requirements: *id008
149
+ - !ruby/object:Gem::Dependency
150
+ requirement: &id009 !ruby/object:Gem::Requirement
151
+ none: false
152
+ requirements:
153
+ - - ~>
154
+ - !ruby/object:Gem::Version
155
+ hash: 1
156
+ segments:
157
+ - 1
158
+ - 5
159
+ - 1
160
+ version: 1.5.1
161
+ type: :development
162
+ name: jeweler
163
+ prerelease: false
164
+ version_requirements: *id009
165
+ - !ruby/object:Gem::Dependency
166
+ requirement: &id010 !ruby/object:Gem::Requirement
167
+ none: false
168
+ requirements:
169
+ - - ~>
28
170
  - !ruby/object:Gem::Version
29
171
  hash: 23
30
172
  segments:
@@ -33,27 +175,55 @@ dependencies:
33
175
  - 0
34
176
  version: 1.0.0
35
177
  type: :development
36
- version_requirements: *id001
178
+ name: bundler
179
+ prerelease: false
180
+ version_requirements: *id010
37
181
  - !ruby/object:Gem::Dependency
38
- name: jeweler
182
+ requirement: &id011 !ruby/object:Gem::Requirement
183
+ none: false
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ hash: 3
188
+ segments:
189
+ - 0
190
+ version: "0"
191
+ type: :development
192
+ name: shoulda
39
193
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
194
+ version_requirements: *id011
195
+ - !ruby/object:Gem::Dependency
196
+ requirement: &id012 !ruby/object:Gem::Requirement
41
197
  none: false
42
198
  requirements:
43
199
  - - ">="
44
200
  - !ruby/object:Gem::Version
45
- hash: 7
201
+ hash: 3
46
202
  segments:
47
- - 1
48
- - 4
49
203
  - 0
50
- version: 1.4.0
204
+ version: "0"
51
205
  type: :development
52
- version_requirements: *id002
206
+ name: rcov
207
+ prerelease: false
208
+ version_requirements: *id012
53
209
  - !ruby/object:Gem::Dependency
54
- name: thoughtbot-shoulda
210
+ requirement: &id013 !ruby/object:Gem::Requirement
211
+ none: false
212
+ requirements:
213
+ - - ~>
214
+ - !ruby/object:Gem::Version
215
+ hash: 15
216
+ segments:
217
+ - 1
218
+ - 0
219
+ - 12
220
+ version: 1.0.12
221
+ type: :development
222
+ name: xml-simple
55
223
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
224
+ version_requirements: *id013
225
+ - !ruby/object:Gem::Dependency
226
+ requirement: &id014 !ruby/object:Gem::Requirement
57
227
  none: false
58
228
  requirements:
59
229
  - - ">="
@@ -63,11 +233,57 @@ dependencies:
63
233
  - 0
64
234
  version: "0"
65
235
  type: :development
66
- version_requirements: *id003
236
+ name: ruby-debug
237
+ prerelease: false
238
+ version_requirements: *id014
67
239
  - !ruby/object:Gem::Dependency
68
- name: xml-simple
240
+ requirement: &id015 !ruby/object:Gem::Requirement
241
+ none: false
242
+ requirements:
243
+ - - ">="
244
+ - !ruby/object:Gem::Version
245
+ hash: 23
246
+ segments:
247
+ - 1
248
+ - 0
249
+ - 0
250
+ version: 1.0.0
251
+ type: :development
252
+ name: bundler
69
253
  prerelease: false
70
- requirement: &id004 !ruby/object:Gem::Requirement
254
+ version_requirements: *id015
255
+ - !ruby/object:Gem::Dependency
256
+ requirement: &id016 !ruby/object:Gem::Requirement
257
+ none: false
258
+ requirements:
259
+ - - ">="
260
+ - !ruby/object:Gem::Version
261
+ hash: 1
262
+ segments:
263
+ - 1
264
+ - 5
265
+ - 1
266
+ version: 1.5.1
267
+ type: :development
268
+ name: jeweler
269
+ prerelease: false
270
+ version_requirements: *id016
271
+ - !ruby/object:Gem::Dependency
272
+ requirement: &id017 !ruby/object:Gem::Requirement
273
+ none: false
274
+ requirements:
275
+ - - ">="
276
+ - !ruby/object:Gem::Version
277
+ hash: 3
278
+ segments:
279
+ - 0
280
+ version: "0"
281
+ type: :development
282
+ name: thoughtbot-shoulda
283
+ prerelease: false
284
+ version_requirements: *id017
285
+ - !ruby/object:Gem::Dependency
286
+ requirement: &id018 !ruby/object:Gem::Requirement
71
287
  none: false
72
288
  requirements:
73
289
  - - ">="
@@ -79,11 +295,11 @@ dependencies:
79
295
  - 12
80
296
  version: 1.0.12
81
297
  type: :development
82
- version_requirements: *id004
83
- - !ruby/object:Gem::Dependency
84
- name: commander
298
+ name: xml-simple
85
299
  prerelease: false
86
- requirement: &id005 !ruby/object:Gem::Requirement
300
+ version_requirements: *id018
301
+ - !ruby/object:Gem::Dependency
302
+ requirement: &id019 !ruby/object:Gem::Requirement
87
303
  none: false
88
304
  requirements:
89
305
  - - ">="
@@ -95,11 +311,11 @@ dependencies:
95
311
  - 3
96
312
  version: 4.0.3
97
313
  type: :runtime
98
- version_requirements: *id005
99
- - !ruby/object:Gem::Dependency
100
- name: terminal-table
314
+ name: commander
101
315
  prerelease: false
102
- requirement: &id006 !ruby/object:Gem::Requirement
316
+ version_requirements: *id019
317
+ - !ruby/object:Gem::Dependency
318
+ requirement: &id020 !ruby/object:Gem::Requirement
103
319
  none: false
104
320
  requirements:
105
321
  - - ">="
@@ -111,11 +327,27 @@ dependencies:
111
327
  - 2
112
328
  version: 1.4.2
113
329
  type: :runtime
114
- version_requirements: *id006
330
+ name: terminal-table
331
+ prerelease: false
332
+ version_requirements: *id020
115
333
  - !ruby/object:Gem::Dependency
116
- name: net-ssh
334
+ requirement: &id021 !ruby/object:Gem::Requirement
335
+ none: false
336
+ requirements:
337
+ - - ">="
338
+ - !ruby/object:Gem::Version
339
+ hash: 11
340
+ segments:
341
+ - 1
342
+ - 4
343
+ - 6
344
+ version: 1.4.6
345
+ type: :runtime
346
+ name: json
117
347
  prerelease: false
118
- requirement: &id007 !ruby/object:Gem::Requirement
348
+ version_requirements: *id021
349
+ - !ruby/object:Gem::Dependency
350
+ requirement: &id022 !ruby/object:Gem::Requirement
119
351
  none: false
120
352
  requirements:
121
353
  - - ">="
@@ -127,11 +359,11 @@ dependencies:
127
359
  - 23
128
360
  version: 2.0.23
129
361
  type: :runtime
130
- version_requirements: *id007
131
- - !ruby/object:Gem::Dependency
132
- name: net-scp
362
+ name: net-ssh
133
363
  prerelease: false
134
- requirement: &id008 !ruby/object:Gem::Requirement
364
+ version_requirements: *id022
365
+ - !ruby/object:Gem::Dependency
366
+ requirement: &id023 !ruby/object:Gem::Requirement
135
367
  none: false
136
368
  requirements:
137
369
  - - ">="
@@ -143,11 +375,11 @@ dependencies:
143
375
  - 4
144
376
  version: 1.0.4
145
377
  type: :runtime
146
- version_requirements: *id008
147
- - !ruby/object:Gem::Dependency
148
- name: builder
378
+ name: net-scp
149
379
  prerelease: false
150
- requirement: &id009 !ruby/object:Gem::Requirement
380
+ version_requirements: *id023
381
+ - !ruby/object:Gem::Dependency
382
+ requirement: &id024 !ruby/object:Gem::Requirement
151
383
  none: false
152
384
  requirements:
153
385
  - - ">="
@@ -159,11 +391,11 @@ dependencies:
159
391
  - 2
160
392
  version: 2.1.2
161
393
  type: :runtime
162
- version_requirements: *id009
163
- - !ruby/object:Gem::Dependency
164
- name: treetop
394
+ name: builder
165
395
  prerelease: false
166
- requirement: &id010 !ruby/object:Gem::Requirement
396
+ version_requirements: *id024
397
+ - !ruby/object:Gem::Dependency
398
+ requirement: &id025 !ruby/object:Gem::Requirement
167
399
  none: false
168
400
  requirements:
169
401
  - - ">="
@@ -175,7 +407,25 @@ dependencies:
175
407
  - 8
176
408
  version: 1.4.8
177
409
  type: :runtime
178
- version_requirements: *id010
410
+ name: treetop
411
+ prerelease: false
412
+ version_requirements: *id025
413
+ - !ruby/object:Gem::Dependency
414
+ requirement: &id026 !ruby/object:Gem::Requirement
415
+ none: false
416
+ requirements:
417
+ - - ">="
418
+ - !ruby/object:Gem::Version
419
+ hash: 25
420
+ segments:
421
+ - 1
422
+ - 0
423
+ - 7
424
+ version: 1.0.7
425
+ type: :runtime
426
+ name: fastthread
427
+ prerelease: false
428
+ version_requirements: *id026
179
429
  description: "\n RuTTY is a DSH (distributed / dancer's shell) written in Ruby. It's used to run commands \n on multiple remote servers at once, based on a tagging system. Also allows for multiple\n SCP-style uploads.\n "
180
430
  email: josh@cloudspace.com
181
431
  executables:
@@ -186,7 +436,6 @@ extra_rdoc_files:
186
436
  - LICENSE
187
437
  - README.md
188
438
  files:
189
- - .gitignore
190
439
  - .yardopts
191
440
  - Gemfile
192
441
  - Gemfile.lock
@@ -204,6 +453,8 @@ files:
204
453
  - lib/rutty/node.rb
205
454
  - lib/rutty/nodes.rb
206
455
  - lib/rutty/proc_classes.rb
456
+ - lib/rutty/thread_pool/pool.rb
457
+ - lib/rutty/thread_pool/worker.rb
207
458
  - lib/rutty/treetop/syntax_nodes.rb
208
459
  - lib/rutty/treetop/tag_query.rb
209
460
  - lib/rutty/treetop/tag_query.treetop
@@ -214,6 +465,7 @@ files:
214
465
  - test/test_action_dsh.rb
215
466
  - test/test_action_init.rb
216
467
  - test/test_action_list_nodes.rb
468
+ - test/test_action_scp.rb
217
469
  - test/test_actions.rb
218
470
  - test/test_config.rb
219
471
  - test/test_consts.rb
@@ -223,11 +475,11 @@ files:
223
475
  - test/test_runner.rb
224
476
  has_rdoc: true
225
477
  homepage: http://github.com/jlindsey/rutty
226
- licenses: []
227
-
478
+ licenses:
479
+ - MIT
228
480
  post_install_message:
229
- rdoc_options:
230
- - --charset=UTF-8
481
+ rdoc_options: []
482
+
231
483
  require_paths:
232
484
  - lib
233
485
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -261,6 +513,7 @@ test_files:
261
513
  - test/test_action_dsh.rb
262
514
  - test/test_action_init.rb
263
515
  - test/test_action_list_nodes.rb
516
+ - test/test_action_scp.rb
264
517
  - test/test_actions.rb
265
518
  - test/test_config.rb
266
519
  - test/test_consts.rb