necktie 0.1.1 → 0.2.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/bin/necktie +1 -1
- data/lib/necktie/rush.rb +11 -0
- data/lib/necktie/services.rb +31 -11
- data/lib/necktie.rb +10 -6
- data/necktie.gemspec +2 -2
- data/rush/README.rdoc +87 -0
- data/rush/Rakefile +60 -0
- data/rush/VERSION +1 -0
- data/rush/bin/rush +13 -0
- data/rush/bin/rushd +7 -0
- data/rush/lib/rush/access.rb +130 -0
- data/rush/lib/rush/array_ext.rb +19 -0
- data/rush/lib/rush/box.rb +112 -0
- data/rush/lib/rush/commands.rb +55 -0
- data/rush/lib/rush/config.rb +154 -0
- data/rush/lib/rush/dir.rb +160 -0
- data/rush/lib/rush/embeddable_shell.rb +26 -0
- data/rush/lib/rush/entry.rb +185 -0
- data/rush/lib/rush/exceptions.rb +31 -0
- data/rush/lib/rush/file.rb +85 -0
- data/rush/lib/rush/find_by.rb +39 -0
- data/rush/lib/rush/fixnum_ext.rb +18 -0
- data/rush/lib/rush/head_tail.rb +11 -0
- data/rush/lib/rush/local.rb +402 -0
- data/rush/lib/rush/process.rb +59 -0
- data/rush/lib/rush/process_set.rb +62 -0
- data/rush/lib/rush/remote.rb +156 -0
- data/rush/lib/rush/search_results.rb +58 -0
- data/rush/lib/rush/server.rb +117 -0
- data/rush/lib/rush/shell.rb +187 -0
- data/rush/lib/rush/ssh_tunnel.rb +122 -0
- data/rush/lib/rush/string_ext.rb +3 -0
- data/rush/lib/rush.rb +87 -0
- data/rush/rush.gemspec +113 -0
- data/rush/spec/access_spec.rb +134 -0
- data/rush/spec/array_ext_spec.rb +15 -0
- data/rush/spec/base.rb +24 -0
- data/rush/spec/box_spec.rb +64 -0
- data/rush/spec/commands_spec.rb +47 -0
- data/rush/spec/config_spec.rb +108 -0
- data/rush/spec/dir_spec.rb +164 -0
- data/rush/spec/embeddable_shell_spec.rb +17 -0
- data/rush/spec/entry_spec.rb +133 -0
- data/rush/spec/file_spec.rb +83 -0
- data/rush/spec/find_by_spec.rb +58 -0
- data/rush/spec/fixnum_ext_spec.rb +19 -0
- data/rush/spec/local_spec.rb +352 -0
- data/rush/spec/process_set_spec.rb +50 -0
- data/rush/spec/process_spec.rb +73 -0
- data/rush/spec/remote_spec.rb +140 -0
- data/rush/spec/rush_spec.rb +28 -0
- data/rush/spec/search_results_spec.rb +44 -0
- data/rush/spec/shell_spec.rb +23 -0
- data/rush/spec/ssh_tunnel_spec.rb +122 -0
- data/rush/spec/string_ext_spec.rb +23 -0
- metadata +53 -3
- data/lib/necktie/files.rb +0 -14
@@ -0,0 +1,134 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
|
3
|
+
describe Rush::Access do
|
4
|
+
before do
|
5
|
+
@access = Rush::Access.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it "has roles: user, group, other" do
|
9
|
+
@access.class.roles == %w(user group other)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "has permissions: read, write, execute" do
|
13
|
+
@access.class.permissions == %w(read write execute)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "gets parts from a one-part symbol like :user" do
|
17
|
+
@access.parts_from(:user).should == %w(user)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "gets parts from a two-part symbol like :read_write" do
|
21
|
+
@access.parts_from(:read_write).should == %w(read write)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "allows use of 'and' in multipart symbols, like :user_and_group" do
|
25
|
+
@access.parts_from(:user_and_group).should == %w(user group)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "extract_list verifies that all the parts among the valid choices" do
|
29
|
+
@access.should_receive(:parts_from).with(:red_green).and_return(%w(red green))
|
30
|
+
@access.extract_list('type', :red_green, %w(red blue green)).should == %w(red green)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "extract_list raises a BadAccessSpecifier when there is part not in the list of choices" do
|
34
|
+
lambda do
|
35
|
+
@access.extract_list('role', :user_bork, %w(user group))
|
36
|
+
end.should raise_error(Rush::BadAccessSpecifier, "Unrecognized role: bork")
|
37
|
+
end
|
38
|
+
|
39
|
+
it "sets one value in the matrix of permissions and roles" do
|
40
|
+
@access.set_matrix(%w(read), %w(user))
|
41
|
+
@access.user_can_read.should == true
|
42
|
+
end
|
43
|
+
|
44
|
+
it "sets two values in the matrix of permissions and roles" do
|
45
|
+
@access.set_matrix(%w(read), %w(user group))
|
46
|
+
@access.user_can_read.should == true
|
47
|
+
@access.group_can_read.should == true
|
48
|
+
end
|
49
|
+
|
50
|
+
it "sets four values in the matrix of permissions and roles" do
|
51
|
+
@access.set_matrix(%w(read write), %w(user group))
|
52
|
+
@access.user_can_read.should == true
|
53
|
+
@access.group_can_read.should == true
|
54
|
+
@access.user_can_write.should == true
|
55
|
+
@access.group_can_write.should == true
|
56
|
+
end
|
57
|
+
|
58
|
+
it "parse options hash" do
|
59
|
+
@access.parse(:user_can => :read)
|
60
|
+
@access.user_can_read.should == true
|
61
|
+
end
|
62
|
+
|
63
|
+
it "generates octal permissions from its member vars" do
|
64
|
+
@access.user_can_read = true
|
65
|
+
@access.octal_permissions.should == 0400
|
66
|
+
end
|
67
|
+
|
68
|
+
it "generates octal permissions from its member vars" do
|
69
|
+
@access.user_can_read = true
|
70
|
+
@access.user_can_write = true
|
71
|
+
@access.user_can_execute = true
|
72
|
+
@access.group_can_read = true
|
73
|
+
@access.group_can_execute = true
|
74
|
+
@access.octal_permissions.should == 0750
|
75
|
+
end
|
76
|
+
|
77
|
+
it "applies its settings to a file" do
|
78
|
+
file = "/tmp/rush_spec_#{Process.pid}"
|
79
|
+
begin
|
80
|
+
system "rm -rf #{file}; touch #{file}; chmod 770 #{file}"
|
81
|
+
@access.user_can_read = true
|
82
|
+
@access.apply(file)
|
83
|
+
`ls -l #{file}`.should match(/^-r--------/)
|
84
|
+
ensure
|
85
|
+
system "rm -rf #{file}; touch #{file}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
it "serializes itself to a hash" do
|
90
|
+
@access.user_can_read = true
|
91
|
+
@access.to_hash.should == {
|
92
|
+
:user_can_read => 1, :user_can_write => 0, :user_can_execute => 0,
|
93
|
+
:group_can_read => 0, :group_can_write => 0, :group_can_execute => 0,
|
94
|
+
:other_can_read => 0, :other_can_write => 0, :other_can_execute => 0,
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
it "unserializes from a hash" do
|
99
|
+
@access.from_hash(:user_can_read => '1')
|
100
|
+
@access.user_can_read.should == true
|
101
|
+
end
|
102
|
+
|
103
|
+
it "initializes from a serialized hash" do
|
104
|
+
@access.class.should_receive(:new).and_return(@access)
|
105
|
+
@access.class.from_hash(:user_can_read => '1').should == @access
|
106
|
+
@access.user_can_read.should == true
|
107
|
+
end
|
108
|
+
|
109
|
+
it "initializes from a parsed options hash" do
|
110
|
+
@access.class.should_receive(:new).and_return(@access)
|
111
|
+
@access.class.parse(:user_and_group_can => :read).should == @access
|
112
|
+
@access.user_can_read.should == true
|
113
|
+
end
|
114
|
+
|
115
|
+
it "converts and octal integer into an array of integers" do
|
116
|
+
@access.octal_integer_array(0740).should == [ 7, 4, 0 ]
|
117
|
+
end
|
118
|
+
|
119
|
+
it "filters out anything above the top three digits (File.stat returns some extra data there)" do
|
120
|
+
@access.octal_integer_array(0100644).should == [ 6, 4, 4 ]
|
121
|
+
end
|
122
|
+
|
123
|
+
it "taskes permissions from an octal representation" do
|
124
|
+
@access.from_octal(0644)
|
125
|
+
@access.user_can_read.should == true
|
126
|
+
@access.user_can_write.should == true
|
127
|
+
@access.user_can_execute.should == false
|
128
|
+
end
|
129
|
+
|
130
|
+
it "computes a display hash by dropping false keys and converting the 1s to trues" do
|
131
|
+
@access.should_receive(:to_hash).and_return(:red => 1, :green => 0, :blue => 1)
|
132
|
+
@access.display_hash.should == { :red => true, :blue => true }
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
|
3
|
+
describe Array do
|
4
|
+
it "mixes commands into array" do
|
5
|
+
[ 1,2,3 ].entries.should == [ 1, 2, 3 ]
|
6
|
+
end
|
7
|
+
|
8
|
+
it "can call head" do
|
9
|
+
[ 1,2,3 ].head(1).should == [ 1 ]
|
10
|
+
end
|
11
|
+
|
12
|
+
it "can call tail" do
|
13
|
+
[ 1,2,3 ].tail(1).should == [ 3 ]
|
14
|
+
end
|
15
|
+
end
|
data/rush/spec/base.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec'
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
|
5
|
+
require 'rush'
|
6
|
+
|
7
|
+
def mock_config(&block)
|
8
|
+
mock_config_start
|
9
|
+
block.call(config)
|
10
|
+
mock_config_end
|
11
|
+
end
|
12
|
+
|
13
|
+
def mock_config_sandbox_dir
|
14
|
+
"/tmp/fake_config.#{Process.pid}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def mock_config_start
|
18
|
+
mock_config_cleanup
|
19
|
+
Rush::Config.new(mock_config_sandbox_dir)
|
20
|
+
end
|
21
|
+
|
22
|
+
def mock_config_cleanup
|
23
|
+
FileUtils.rm_rf(mock_config_sandbox_dir)
|
24
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
|
3
|
+
describe Rush::Box do
|
4
|
+
before do
|
5
|
+
@sandbox_dir = "/tmp/rush_spec.#{Process.pid}"
|
6
|
+
system "rm -rf #{@sandbox_dir}; mkdir -p #{@sandbox_dir}"
|
7
|
+
|
8
|
+
@box = Rush::Box.new('localhost')
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
system "rm -rf #{@sandbox_dir}"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "looks up entries with [] syntax" do
|
16
|
+
@box['/'].should == Rush::Dir.new('/', @box)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "looks up processes" do
|
20
|
+
@box.connection.should_receive(:processes).and_return([ { :pid => 123 } ])
|
21
|
+
@box.processes.should == [ Rush::Process.new({ :pid => 123 }, @box) ]
|
22
|
+
end
|
23
|
+
|
24
|
+
it "executes bash commands" do
|
25
|
+
@box.connection.should_receive(:bash).with('cmd', nil, false).and_return('output')
|
26
|
+
@box.bash('cmd').should == 'output'
|
27
|
+
end
|
28
|
+
|
29
|
+
it "executes bash commands with an optional user" do
|
30
|
+
@box.connection.should_receive(:bash).with('cmd', 'user', false)
|
31
|
+
@box.bash('cmd', :user => 'user')
|
32
|
+
end
|
33
|
+
|
34
|
+
it "executes bash commands in the background, returning a Rush::Process" do
|
35
|
+
@box.connection.should_receive(:bash).with('cmd', nil, true).and_return(123)
|
36
|
+
@box.stub!(:processes).and_return([ mock('ps', :pid => 123) ])
|
37
|
+
@box.bash('cmd', :background => true).pid.should == 123
|
38
|
+
end
|
39
|
+
|
40
|
+
it "builds a script of environment variables to prefix the bash command" do
|
41
|
+
@box.command_with_environment('cmd', { :a => 'b' }).should == "export a='b'\ncmd"
|
42
|
+
end
|
43
|
+
|
44
|
+
it "sets the environment variables from the provided hash" do
|
45
|
+
@box.connection.stub!(:bash)
|
46
|
+
@box.should_receive(:command_with_environment).with('cmd', { 1 => 2 })
|
47
|
+
@box.bash('cmd', :env => { 1 => 2 })
|
48
|
+
end
|
49
|
+
|
50
|
+
it "checks the connection to determine if it is alive" do
|
51
|
+
@box.connection.should_receive(:alive?).and_return(true)
|
52
|
+
@box.should be_alive
|
53
|
+
end
|
54
|
+
|
55
|
+
it "establish_connection to set up the connection manually" do
|
56
|
+
@box.connection.should_receive(:ensure_tunnel)
|
57
|
+
@box.establish_connection
|
58
|
+
end
|
59
|
+
|
60
|
+
it "establish_connection can take a hash of options" do
|
61
|
+
@box.connection.should_receive(:ensure_tunnel).with(:timeout => :infinite)
|
62
|
+
@box.establish_connection(:timeout => :infinite)
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
|
3
|
+
describe Rush::Commands do
|
4
|
+
before do
|
5
|
+
@sandbox_dir = "/tmp/rush_spec.#{Process.pid}"
|
6
|
+
system "rm -rf #{@sandbox_dir}; mkdir -p #{@sandbox_dir}"
|
7
|
+
|
8
|
+
@filename = "test_file"
|
9
|
+
system "echo thing_to_find > #{@sandbox_dir}/#{@filename}"
|
10
|
+
system "echo dont_find_me > #{@sandbox_dir}/some_other_file"
|
11
|
+
|
12
|
+
@dir = Rush::Dir.new(@sandbox_dir)
|
13
|
+
@array = @dir.files
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
system "rm -rf #{@sandbox_dir}"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "searches a list of files" do
|
21
|
+
results = @dir.files.search(/thing_to_find/)
|
22
|
+
results.should be_kind_of(Rush::SearchResults)
|
23
|
+
results.entries.should == [ @dir[@filename] ]
|
24
|
+
results.lines.should == [ "thing_to_find" ]
|
25
|
+
end
|
26
|
+
|
27
|
+
it "searches a dir" do
|
28
|
+
@dir.search(/thing_to_find/).entries.should == [ @dir[@filename] ]
|
29
|
+
end
|
30
|
+
|
31
|
+
it "searchs a dir's nested files" do
|
32
|
+
@dir.create_dir('sub').create_file('file').write('nested')
|
33
|
+
@dir['**'].search(/nested/).entries.should == [ @dir['sub/file'] ]
|
34
|
+
end
|
35
|
+
|
36
|
+
it "search and replace contents on all files in the glob" do
|
37
|
+
@dir['1'].create.write('xax')
|
38
|
+
@dir['2'].create.write('-a-')
|
39
|
+
@dir.replace_contents!(/a/, 'b')
|
40
|
+
@dir['1'].contents.should == "xbx"
|
41
|
+
@dir['2'].contents.should == "-b-"
|
42
|
+
end
|
43
|
+
|
44
|
+
it "counts lines of the contained files" do
|
45
|
+
@dir.files.line_count.should == 2
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
|
3
|
+
describe Rush::Config do
|
4
|
+
before do
|
5
|
+
@sandbox_dir = "/tmp/rush_config_spec.#{Process.pid}"
|
6
|
+
system "rm -rf #{@sandbox_dir}"
|
7
|
+
@config = Rush::Config.new(@sandbox_dir)
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
system "rm -rf #{@sandbox_dir}"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "creates the dir" do
|
15
|
+
File.directory?(@sandbox_dir).should be_true
|
16
|
+
end
|
17
|
+
|
18
|
+
it "can access the history file" do
|
19
|
+
@config.history_file.class.should == Rush::File
|
20
|
+
end
|
21
|
+
|
22
|
+
it "saves the shell command history" do
|
23
|
+
@config.save_history(%w(1 2 3))
|
24
|
+
@config.history_file.contents.should == "1\n2\n3\n"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "loads the shell command history" do
|
28
|
+
@config.save_history(%w(1 2 3))
|
29
|
+
@config.load_history.should == %w(1 2 3)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "loads a blank history if no history file" do
|
33
|
+
@config.load_history.should == []
|
34
|
+
end
|
35
|
+
|
36
|
+
it "loads the env file" do
|
37
|
+
@config.env_file.write('abc')
|
38
|
+
@config.load_env.should == 'abc'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "loads nothing if env file does not exist" do
|
42
|
+
@config.load_env.should == ""
|
43
|
+
end
|
44
|
+
|
45
|
+
it "loads the commands file" do
|
46
|
+
@config.commands_file.write('abc')
|
47
|
+
@config.load_commands.should == 'abc'
|
48
|
+
end
|
49
|
+
|
50
|
+
it "loads nothing if commands file does not exist" do
|
51
|
+
@config.load_commands.should == ""
|
52
|
+
end
|
53
|
+
|
54
|
+
it "loads usernames and password for rushd" do
|
55
|
+
system "echo 1:2 > #{@sandbox_dir}/passwords"
|
56
|
+
system "echo a:b >> #{@sandbox_dir}/passwords"
|
57
|
+
@config.passwords.should == { '1' => '2', 'a' => 'b' }
|
58
|
+
end
|
59
|
+
|
60
|
+
it "loads blank hash if no passwords file" do
|
61
|
+
@config.passwords.should == { }
|
62
|
+
end
|
63
|
+
|
64
|
+
it "loads credentials for client connecting to server" do
|
65
|
+
system "echo user:pass > #{@sandbox_dir}/credentials"
|
66
|
+
@config.credentials_user.should == 'user'
|
67
|
+
@config.credentials_password.should == 'pass'
|
68
|
+
end
|
69
|
+
|
70
|
+
it "loads list of ssh tunnels" do
|
71
|
+
system "echo host.example.com:123 > #{@sandbox_dir}/tunnels"
|
72
|
+
@config.tunnels.should == { 'host.example.com' => 123 }
|
73
|
+
end
|
74
|
+
|
75
|
+
it "returns an empty hash if tunnels file is blank" do
|
76
|
+
@config.tunnels.should == { }
|
77
|
+
end
|
78
|
+
|
79
|
+
it "saves a list of ssh tunnels" do
|
80
|
+
@config.save_tunnels({ 'my.example.com' => 4000 })
|
81
|
+
@config.tunnels_file.contents.should == "my.example.com:4000\n"
|
82
|
+
end
|
83
|
+
|
84
|
+
it "ensure_credentials_exist doesn't do anything if credentials already exist" do
|
85
|
+
@config.credentials_file.write "dummy"
|
86
|
+
@config.should_receive(:generate_credentials).exactly(0).times
|
87
|
+
@config.ensure_credentials_exist
|
88
|
+
end
|
89
|
+
|
90
|
+
it "ensure_credentials_exist generates credentials file if they don't exist" do
|
91
|
+
@config.should_receive(:generate_credentials)
|
92
|
+
@config.ensure_credentials_exist
|
93
|
+
end
|
94
|
+
|
95
|
+
it "secret_characters returns valid characters for username or password" do
|
96
|
+
@config.secret_characters.should be_kind_of(Array)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "generate_secret products a random string for use in username and password" do
|
100
|
+
@config.should_receive(:secret_characters).and_return(%w(a))
|
101
|
+
@config.generate_secret(2, 2).should == "aa"
|
102
|
+
end
|
103
|
+
|
104
|
+
it "generate_credentials saves credentials" do
|
105
|
+
@config.generate_credentials
|
106
|
+
@config.credentials_file.contents.should match(/^.+:.+$/)
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
|
3
|
+
describe Rush::Dir do
|
4
|
+
before do
|
5
|
+
@sandbox_dir = "/tmp/rush_spec.#{Process.pid}"
|
6
|
+
system "rm -rf #{@sandbox_dir}; mkdir -p #{@sandbox_dir}"
|
7
|
+
|
8
|
+
@dirname = "#{@sandbox_dir}/test_dir/"
|
9
|
+
system "mkdir -p #{@dirname}"
|
10
|
+
|
11
|
+
@dir = Rush::Dir.new(@dirname)
|
12
|
+
end
|
13
|
+
|
14
|
+
after do
|
15
|
+
system "rm -rf #{@sandbox_dir}"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "is a child of Rush::Entry" do
|
19
|
+
@dir.should be_kind_of(Rush::Entry)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can create itself, returning itself" do
|
23
|
+
system "rm -rf #{@sandbox_dir}"
|
24
|
+
@dir.create.should == @dir
|
25
|
+
File.directory?(@dir.full_path).should be_true
|
26
|
+
end
|
27
|
+
|
28
|
+
it "can create a new file" do
|
29
|
+
newfile = @dir.create_file('one.txt')
|
30
|
+
newfile.name.should == 'one.txt'
|
31
|
+
newfile.parent.should == @dir
|
32
|
+
end
|
33
|
+
|
34
|
+
it "can create a new subdir" do
|
35
|
+
newfile = @dir['two/'].create
|
36
|
+
newfile.name.should == 'two'
|
37
|
+
newfile.parent.should == @dir
|
38
|
+
end
|
39
|
+
|
40
|
+
it "find_by_name finds a single entry in the contents" do
|
41
|
+
file = @dir.create_file('one.rb')
|
42
|
+
@dir.find_by_name('one.rb').should == file
|
43
|
+
end
|
44
|
+
|
45
|
+
it "find_by_glob finds a list of entries by wildcard" do
|
46
|
+
file1 = @dir.create_file('one.rb')
|
47
|
+
file2 = @dir.create_file('two.txt')
|
48
|
+
@dir.find_by_glob('*.rb').should == [ file1 ]
|
49
|
+
end
|
50
|
+
|
51
|
+
it "lists files" do
|
52
|
+
@dir.create_file('a')
|
53
|
+
@dir.files.should == [ Rush::File.new("#{@dirname}/a") ]
|
54
|
+
end
|
55
|
+
|
56
|
+
it "lists dirs" do
|
57
|
+
system "mkdir -p #{@dir.full_path}/b"
|
58
|
+
@dir.dirs.should == [ Rush::Dir.new("#{@dirname}/b") ]
|
59
|
+
end
|
60
|
+
|
61
|
+
it "lists combined files and dirs" do
|
62
|
+
@dir['c'].create
|
63
|
+
@dir['d/'].create
|
64
|
+
@dir.contents.size.should == 2
|
65
|
+
end
|
66
|
+
|
67
|
+
it "fetches the entry_tree of all contents recursively" do
|
68
|
+
@dir['a/'].create['b/'].create['c'].create
|
69
|
+
@dir.entries_tree.should == @dir.make_entries(%w(a/ a/b/ a/b/c))
|
70
|
+
end
|
71
|
+
|
72
|
+
it "maps [] to find_by_name" do
|
73
|
+
@dir.should_receive(:find_by_name).once
|
74
|
+
@dir['one']
|
75
|
+
end
|
76
|
+
|
77
|
+
it "maps [] with a wildcard character to find_by_glob" do
|
78
|
+
@dir.should_receive(:find_by_glob).once
|
79
|
+
@dir['*']
|
80
|
+
end
|
81
|
+
|
82
|
+
it "can use symbols or strings for [] access" do
|
83
|
+
@dir.should_receive(:find_by_name).once.with('subdir')
|
84
|
+
@dir[:subdir]
|
85
|
+
end
|
86
|
+
|
87
|
+
it "[] can return a file that has yet to be created" do
|
88
|
+
@dir['not_yet'].class.should == Rush::File
|
89
|
+
end
|
90
|
+
|
91
|
+
it "makes a list of entries from an array of filenames" do
|
92
|
+
@dir['a'].create
|
93
|
+
@dir['b/c/'].create
|
94
|
+
@dir.make_entries(%w(a b/c)).should == [ @dir['a'], @dir['b/c'] ]
|
95
|
+
end
|
96
|
+
|
97
|
+
it "lists flattened files from all nested subdirectories" do
|
98
|
+
@dir['1'].create
|
99
|
+
@dir['2/3/'].create['4'].create
|
100
|
+
@dir['a/b/c/'].create['d'].create
|
101
|
+
@dir.files_flattened.should == @dir.make_entries(%w(1 2/3/4 a/b/c/d))
|
102
|
+
end
|
103
|
+
|
104
|
+
it "lists flattened dirs from all nested subdirectories" do
|
105
|
+
@dir.create_dir('1/2')
|
106
|
+
@dir.dirs_flattened.should == @dir.make_entries(%w(1/ 1/2/))
|
107
|
+
end
|
108
|
+
|
109
|
+
it "** as a shortcut to flattened_files" do
|
110
|
+
@dir['**'].should == @dir.files_flattened
|
111
|
+
end
|
112
|
+
|
113
|
+
it "**/ as a shortcut to flattened_files + regular globbing" do
|
114
|
+
@dir.create_file('1.rb')
|
115
|
+
@dir.create_file('ignore.txt')
|
116
|
+
@dir.create_dir('2').create_file('3.rb')
|
117
|
+
@dir.create_dir('a/b').create_file('c.rb')
|
118
|
+
@dir['**/*.rb'].should == @dir.make_entries(%w(1.rb 2/3.rb a/b/c.rb))
|
119
|
+
end
|
120
|
+
|
121
|
+
it "lists nonhidden files" do
|
122
|
+
@dir.create_file('show')
|
123
|
+
@dir.create_file('.dont_show')
|
124
|
+
@dir.nonhidden_files.should == @dir.make_entries(%(show))
|
125
|
+
end
|
126
|
+
|
127
|
+
it "lists nonhidden dirs" do
|
128
|
+
@dir.create_dir('show')
|
129
|
+
@dir.create_dir('.dont_show')
|
130
|
+
@dir.nonhidden_dirs.should == @dir.make_entries(%(show/))
|
131
|
+
end
|
132
|
+
|
133
|
+
if !RUBY_PLATFORM.match(/darwin/) # doesn't work on OS X 'cause du switches are different
|
134
|
+
it "knows its size in bytes, which includes its contents recursively" do
|
135
|
+
@dir.create_file('a').write('1234')
|
136
|
+
@dir.size.should be(4096 + 4)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
it "can destroy itself when empty" do
|
141
|
+
@dir.destroy
|
142
|
+
end
|
143
|
+
|
144
|
+
it "can destroy itself when not empty" do
|
145
|
+
@dir.create_dir('a').create_file('b').write('c')
|
146
|
+
@dir.destroy
|
147
|
+
end
|
148
|
+
|
149
|
+
it "can run a bash command within itself" do
|
150
|
+
system "echo test > #{@dir.full_path}/file"
|
151
|
+
@dir.bash("cat file").should == "test\n"
|
152
|
+
end
|
153
|
+
|
154
|
+
it "can run bash within directories with spaces" do
|
155
|
+
@dir.create_dir('with space').create_file('file').write('test')
|
156
|
+
@dir["with space/"].bash("cat file").should == "test"
|
157
|
+
end
|
158
|
+
|
159
|
+
it "passes bash options (e.g., :user) through to the box bash command" do
|
160
|
+
@dir.should_receive(:bash).with('cmd', :opt1 => 1, :opt2 => 2)
|
161
|
+
@dir.bash('cmd', :opt1 => 1, :opt2 => 2)
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
|
3
|
+
describe Rush::EmbeddableShell do
|
4
|
+
before do
|
5
|
+
@shell = Rush::EmbeddableShell.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should execute unknown methods against a Rush::Shell instance" do
|
9
|
+
@shell.root.class.should == Rush::Dir
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should executes a block as if it were inside the shell" do
|
13
|
+
@shell.execute_in_shell {
|
14
|
+
root.class.should == Rush::Dir
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|