rutty 2.3.2 → 2.4.0

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