rush3 3.0.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.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +15 -0
  3. data/Gemfile.lock +93 -0
  4. data/README.rdoc +124 -0
  5. data/Rakefile +58 -0
  6. data/VERSION +1 -0
  7. data/bin/rush +13 -0
  8. data/bin/rushd +7 -0
  9. data/lib/rush.rb +91 -0
  10. data/lib/rush/access.rb +121 -0
  11. data/lib/rush/array_ext.rb +16 -0
  12. data/lib/rush/box.rb +130 -0
  13. data/lib/rush/commands.rb +94 -0
  14. data/lib/rush/config.rb +147 -0
  15. data/lib/rush/dir.rb +159 -0
  16. data/lib/rush/embeddable_shell.rb +26 -0
  17. data/lib/rush/entry.rb +238 -0
  18. data/lib/rush/exceptions.rb +32 -0
  19. data/lib/rush/file.rb +100 -0
  20. data/lib/rush/find_by.rb +39 -0
  21. data/lib/rush/head_tail.rb +11 -0
  22. data/lib/rush/integer_ext.rb +18 -0
  23. data/lib/rush/local.rb +404 -0
  24. data/lib/rush/path.rb +9 -0
  25. data/lib/rush/process.rb +59 -0
  26. data/lib/rush/process_set.rb +62 -0
  27. data/lib/rush/search_results.rb +71 -0
  28. data/lib/rush/shell.rb +118 -0
  29. data/lib/rush/shell/completion.rb +108 -0
  30. data/lib/rush/string_ext.rb +33 -0
  31. data/spec/access_spec.rb +134 -0
  32. data/spec/array_ext_spec.rb +15 -0
  33. data/spec/base.rb +22 -0
  34. data/spec/box_spec.rb +76 -0
  35. data/spec/commands_spec.rb +47 -0
  36. data/spec/config_spec.rb +108 -0
  37. data/spec/dir_spec.rb +163 -0
  38. data/spec/embeddable_shell_spec.rb +17 -0
  39. data/spec/entry_spec.rb +162 -0
  40. data/spec/file_spec.rb +95 -0
  41. data/spec/find_by_spec.rb +58 -0
  42. data/spec/integer_ext_spec.rb +19 -0
  43. data/spec/local_spec.rb +363 -0
  44. data/spec/path_spec.rb +13 -0
  45. data/spec/process_set_spec.rb +50 -0
  46. data/spec/process_spec.rb +89 -0
  47. data/spec/rush_spec.rb +28 -0
  48. data/spec/search_results_spec.rb +44 -0
  49. data/spec/shell_spec.rb +39 -0
  50. data/spec/ssh_tunnel_spec.rb +122 -0
  51. data/spec/string_ext_spec.rb +23 -0
  52. metadata +228 -0
@@ -0,0 +1,13 @@
1
+ require_relative 'base'
2
+ require_relative '../lib/rush/path'
3
+
4
+ describe Rush::Path do
5
+ it 'works' do
6
+ expect(Rush::Path.executables).to be_kind_of Array
7
+ end
8
+
9
+ it "doesn't fail with non-existent directories in PATH" do
10
+ expect(ENV).to receive(:[]).with("PATH").and_return("/foobar")
11
+ expect(Rush::Path.executables).to eq []
12
+ end
13
+ end
@@ -0,0 +1,50 @@
1
+ require_relative 'base'
2
+
3
+ describe Rush::ProcessSet do
4
+ before do
5
+ @process = double('process')
6
+ @set = Rush::ProcessSet.new([ @process ])
7
+ end
8
+
9
+ it "is Enumerable" do
10
+ expect(@set.select { |s| s == @process }).to eq [ @process ]
11
+ end
12
+
13
+ it "defines size" do
14
+ expect(@set.size).to eq 1
15
+ end
16
+
17
+ it "defines first" do
18
+ expect(@set.first).to eq @process
19
+ end
20
+
21
+ it "is equal to sets with the same contents" do
22
+ expect(@set).to eq Rush::ProcessSet.new([ @process ])
23
+ end
24
+
25
+ it "is equal to arrays with the same contents" do
26
+ expect(@set).to eq [ @process ]
27
+ end
28
+
29
+ it "kills all processes in the set" do
30
+ expect(@process).to receive(:kill)
31
+ @set.kill
32
+ end
33
+
34
+ it "checks the alive? state of all processes in the set" do
35
+ expect(@process).to receive(:alive?).and_return(true)
36
+ expect(@set.alive?).to eq [ true ]
37
+ end
38
+
39
+ it "filters the set from a conditions hash and returns the filtered set" do
40
+ allow(@process).to receive(:pid).and_return(123)
41
+ expect(@set.filter(:pid => 123).first).to eq @process
42
+ expect(@set.filter(:pid => 456).size).to eq 0
43
+ end
44
+
45
+ it "filters with regexps if provided in the conditions" do
46
+ allow(@process).to receive(:command).and_return('foobaz')
47
+ expect(@set.filter(:command => /baz/).first).to eq @process
48
+ expect(@set.filter(:command => /blerg/).size).to eq 0
49
+ end
50
+ end
@@ -0,0 +1,89 @@
1
+ require_relative 'base'
2
+
3
+ describe Rush::Process do
4
+ let!(:pid_file) { "/tmp/rush_rspec_#{Process.pid}" }
5
+
6
+ before do
7
+ @parent_pid = fork do
8
+ # OSX includes checking `ps` process into current Process#children
9
+ # as such isolate parent from the main thread
10
+ # but the instance_valriabes are unavailable since #fork - use fs
11
+ @pid = fork do
12
+ sleep 999
13
+ end
14
+ ::File.write(pid_file, @pid)
15
+ sleep 999
16
+ end
17
+
18
+ # wait parent to tell child's pid
19
+ sleep 0.3
20
+
21
+ @pid = ::File.read(pid_file).to_i
22
+ @process = Rush::Process.all.detect { |p| p.pid == @pid }
23
+ end
24
+
25
+ after do
26
+ ::File.unlink(pid_file) if ::File.exists?(pid_file)
27
+ system "kill -9 #{@pid}"
28
+ system "kill -9 #{@parent_pid}"
29
+ end
30
+
31
+ it 'knows all its child processes' do
32
+ parent = Rush::Process.all.detect { |p| p.pid == @parent_pid }
33
+ expect(parent.children).to eq [@process]
34
+ end
35
+
36
+ it 'gets the list of all processes' do
37
+ list = Rush::Process.all
38
+ expect(list.size).to be > 5
39
+ expect(list.first).to be_kind_of Rush::Process
40
+ end
41
+
42
+ it 'knows the pid' do
43
+ expect(@process.pid).to eq @pid
44
+ end
45
+
46
+ it 'knows the uid' do
47
+ expect(@process.uid).to eq ::Process.uid
48
+ end
49
+
50
+ it 'knows the executed binary' do
51
+ expect(@process.command).to match(/(ruby|rbx)/)
52
+ end
53
+
54
+ it 'knows the command line' do
55
+ expect(@process.cmdline).to match(/rspec/)
56
+ end
57
+
58
+ it 'knows the memory used' do
59
+ expect(@process.mem).to be > 0
60
+ end
61
+
62
+ it 'knows the cpu used' do
63
+ expect(@process.cpu).to be >= 0
64
+ end
65
+
66
+ it 'knows the parent process pid' do
67
+ expect(@process.parent_pid).to eq @parent_pid
68
+ end
69
+
70
+ it 'knows the parent process' do
71
+ this = Rush::Box.new.processes
72
+ .select { |p| p.pid == @parent_pid }
73
+ .first
74
+ expect(@process.parent).to eq this
75
+ end
76
+
77
+ it 'can kill itself' do
78
+ process = Rush.bash('sleep 30', background: true)
79
+ expect(process.alive?).to eq true
80
+ process.kill
81
+ sleep 0.1
82
+ expect(process.alive?).to eq false
83
+ end
84
+
85
+ it 'if box and pid are the same, process is equal' do
86
+ other = Rush::Process.new({ pid: @process.pid }, @process.box)
87
+ expect(@process).to eq other
88
+ end
89
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'base'
2
+
3
+ describe Rush do
4
+ it 'fetches a local file path' do
5
+ expect(Rush['/etc/hosts'].full_path).to eq('/etc/hosts')
6
+ end
7
+
8
+ it 'fetches the dir of __FILE__' do
9
+ expect(Rush.dir(__FILE__).name).to eq('spec')
10
+ end
11
+
12
+ it 'fetches the launch dir (aka current working directory or pwd)' do
13
+ allow(Dir).to receive(:pwd).and_return('/tmp')
14
+ expect(Rush.launch_dir).to eq(Rush::Box.new['/tmp/'])
15
+ end
16
+
17
+ it 'runs a bash command' do
18
+ expect(Rush.bash('echo hi')).to eq("hi\n")
19
+ end
20
+
21
+ it 'gets the list of local processes' do
22
+ expect(Rush.processes).to be_kind_of(Rush::ProcessSet)
23
+ end
24
+
25
+ it 'gets my process' do
26
+ expect(Rush.my_process.pid).to eq(Process.pid)
27
+ end
28
+ end
@@ -0,0 +1,44 @@
1
+ require_relative 'base'
2
+
3
+ describe Rush::SearchResults do
4
+ before do
5
+ @results = Rush::SearchResults.new(/pat/)
6
+ @file = Rush::File.new("file")
7
+ end
8
+
9
+ it "returns its list of entries" do
10
+ @results.add(@file, %w(a))
11
+ expect(@results.entries).to eq [ @file ]
12
+ end
13
+
14
+ it "only returns each entry once no matter how many line matches it has" do
15
+ @results.add(@file, %w(a b))
16
+ expect(@results.entries).to eq [ @file ]
17
+ end
18
+
19
+ it "returns its list of matched lines" do
20
+ @results.add(@file, %w(a b))
21
+ expect(@results.lines).to eq %w(a b)
22
+ end
23
+
24
+ it "returns all lines for each entry in a flattened form" do
25
+ file2 = Rush::File.new("another file")
26
+ @results.add(@file, %w(a b))
27
+ @results.add(file2, %w(c d))
28
+ expect(@results.lines).to eq %w(a b c d)
29
+ end
30
+
31
+ it "returns a hash of entries_with_lines" do
32
+ @results.add(@file, %w(a))
33
+ expect(@results.entries_with_lines).to eq({ @file => %w(a) })
34
+ end
35
+
36
+ it "mixes in Commands to operate like a dir or entry array" do
37
+ expect(@results.methods.include?(:search)).to eq(true)
38
+ end
39
+
40
+ it "mixes in Enumerable to behave like an array" do
41
+ @results.add(@file, %w(a))
42
+ expect(@results.map { |e| e }).to eq [ @file ]
43
+ end
44
+ end
@@ -0,0 +1,39 @@
1
+ require_relative 'base'
2
+ require_relative '../lib/rush/shell'
3
+
4
+ describe Rush::Shell do
5
+ before do
6
+ @shell = Rush::Shell.new
7
+ end
8
+
9
+ it 'Complete constants' do
10
+ expect(@shell.complete('Obj')).to eq(["Object", "ObjectSpace"])
11
+ expect(@shell.complete('Rush::Sh')).to eq(["Rush::Shell"])
12
+ end
13
+
14
+ it 'Complete executables' do
15
+ expect(@shell.complete('rub')).to include 'ruby'
16
+ end
17
+
18
+ it 'Complete global method names' do
19
+ eval('def wakawaka; p "hi"; end', @shell.pure_binding)
20
+ expect(@shell.complete('waka')).to eq ["wakawaka"]
21
+ end
22
+
23
+ it 'Complete method names' do
24
+ # rbx has additional Rush.method_table, Rush.method_table=
25
+ expect(@shell.complete('Rush.meth')).
26
+ to include("Rush.method_part", "Rush.method_defined?", "Rush.methods", "Rush.method")
27
+ expect(@shell.complete('Rush.methods.inc')).to include "Rush.methods.include?"
28
+ end
29
+
30
+ it 'Complete paths' do
31
+ # Updated: 9/11/2019 by @protolif
32
+ # Details: Changed eq to include
33
+ # Reason: 'bin/ba' matches more than 'bin/bash' on many systems
34
+ expect(@shell.complete('root["bin/ba')).to include "root[\"bin/bash"
35
+ expect(@shell.complete('root[\'bin/ba')).to include "root['bin/bash"
36
+ expect(@shell.complete('root/"bin/ba')).to include "root/\"bin/bash"
37
+ expect(@shell.complete('root/\'bin/ba')).to include "root/'bin/bash"
38
+ end
39
+ end
@@ -0,0 +1,122 @@
1
+ # require_relative 'base'
2
+ #
3
+ # describe Rush::SshTunnel do
4
+ # before do
5
+ # @tunnel = Rush::SshTunnel.new('spec.example.com')
6
+ # @tunnel.stub(:config).and_return(mock_config_start)
7
+ # @tunnel.stub(:display)
8
+ # end
9
+ #
10
+ # after do
11
+ # mock_config_cleanup
12
+ # end
13
+ #
14
+ # it "ensure_tunnel sets everything up for the tunnel when one does not already exist" do
15
+ # @tunnel.should_receive(:push_credentials)
16
+ # @tunnel.should_receive(:launch_rushd)
17
+ # @tunnel.should_receive(:establish_tunnel)
18
+ # @tunnel.ensure_tunnel
19
+ # end
20
+ #
21
+ # it "ensure_tunnel uses the existing port as long as the tunnel is still alive" do
22
+ # @tunnel.should_receive(:tunnel_alive?).and_return(true)
23
+ # @tunnel.instance_eval("@port = 2345")
24
+ # @tunnel.ensure_tunnel
25
+ # @tunnel.port.should == 2345
26
+ # end
27
+ #
28
+ # it "existing tunnel is used when it is specified in the tunnels file" do
29
+ # @tunnel.config.tunnels_file.write "spec.example.com:4567\n"
30
+ # @tunnel.should_receive(:tunnel_alive?).and_return(true)
31
+ # @tunnel.should_not_receive(:setup_everything)
32
+ # @tunnel.ensure_tunnel
33
+ # @tunnel.port.should == 4567
34
+ # end
35
+ #
36
+ # it "tunnel host is always local" do
37
+ # @tunnel.host.should == 'localhost'
38
+ # end
39
+ #
40
+ # it "picks the first port number when there are no tunnels yet" do
41
+ # @tunnel.next_available_port.should == 7771
42
+ # end
43
+ #
44
+ # it "picks the next port number when there is already a tunnel" do
45
+ # @tunnel.config.tunnels_file.write("#{@tunnel.host}:7771")
46
+ # @tunnel.next_available_port.should == 7772
47
+ # end
48
+ #
49
+ # it "establishes a tunnel and saves it to ~/.rush/tunnels" do
50
+ # @tunnel.should_receive(:make_ssh_tunnel)
51
+ # @tunnel.should_receive(:port).exactly(0).times
52
+ # @tunnel.establish_tunnel
53
+ # @tunnel.config.tunnels_file.contents.should == "spec.example.com:7771\n"
54
+ # end
55
+ #
56
+ # it "converts instance vars to options hash for ssh_tunnel_command" do
57
+ # @tunnel.instance_eval("@port = 1234")
58
+ # @tunnel.tunnel_options.should == {
59
+ # :local_port => 1234,
60
+ # :remote_port => 7770,
61
+ # :ssh_host => 'spec.example.com'
62
+ # }
63
+ # end
64
+ #
65
+ # it "ssh_stall_command uses an infinite loop for :timeout => :infinite" do
66
+ # @tunnel.ssh_stall_command(:timeout => :infinite).should match(/while .* sleep .* done/)
67
+ # end
68
+ #
69
+ # it "ssh_stall_command sleeps for the number of seconds given as the :timeout option" do
70
+ # @tunnel.ssh_stall_command(:timeout => 123).should == "sleep 123"
71
+ # end
72
+ #
73
+ # it "ssh_stall_command uses the default timeout when no options are given" do
74
+ # @tunnel.ssh_stall_command.should == "sleep 9000"
75
+ # end
76
+ #
77
+ # it "constructs the ssh tunnel command (everything but stall) from the options hash" do
78
+ # @tunnel.should_receive(:tunnel_options).at_least(:once).and_return(
79
+ # :local_port => 123,
80
+ # :remote_port => 456,
81
+ # :ssh_host => 'example.com'
82
+ # )
83
+ # @tunnel.ssh_tunnel_command_without_stall.should == "ssh -f -L 123:127.0.0.1:456 example.com"
84
+ # end
85
+ #
86
+ # it "combines the tunnel command without stall and the stall command into the final command" do
87
+ # @tunnel.should_receive(:ssh_tunnel_command_without_stall).and_return('ssh command')
88
+ # @tunnel.should_receive(:ssh_stall_command).and_return('sleep 123')
89
+ # @tunnel.ssh_tunnel_command.should == 'ssh command "sleep 123"'
90
+ # end
91
+ #
92
+ # it "ssh_tunnel_command request that the port be set" do
93
+ # @tunnel.should_receive(:tunnel_options).at_least(:once).and_return(:local_port => nil)
94
+ # lambda { @tunnel.ssh_tunnel_command }.should raise_error(Rush::SshTunnel::NoPortSelectedYet)
95
+ # end
96
+ #
97
+ #
98
+ # it "push_credentials uses ssh to append to remote host's passwords file" do
99
+ # @tunnel.should_receive(:ssh_append_to_credentials).and_return(true)
100
+ # @tunnel.push_credentials
101
+ # end
102
+ #
103
+ # it "launches rushd on the remote host via ssh" do
104
+ # @tunnel.should_receive(:ssh) do |cmd|
105
+ # cmd.should match(/rushd/)
106
+ # end
107
+ # @tunnel.launch_rushd
108
+ # end
109
+ #
110
+ # it "tunnel_alive? checks whether a tunnel is still up" do
111
+ # @tunnel.should_receive(:tunnel_count_command).and_return("echo 1")
112
+ # @tunnel.tunnel_alive?.should be_true
113
+ # end
114
+ #
115
+ # it "tunnel_count_command greps ps to find the ssh tunnel" do
116
+ # @tunnel.should_receive(:ssh_tunnel_command_without_stall).and_return('ssh command')
117
+ # command = @tunnel.tunnel_count_command
118
+ # command.should match(/ps/)
119
+ # command.should match(/grep/)
120
+ # command.should match(/ssh command/)
121
+ # end
122
+ # end
@@ -0,0 +1,23 @@
1
+ require_relative 'base'
2
+
3
+ describe String do
4
+ before do
5
+ @string = "abc"
6
+ end
7
+
8
+ it "heads from the front of the string" do
9
+ expect(@string.head(1)).to eq 'a'
10
+ end
11
+
12
+ it "tails from the back of the string" do
13
+ expect(@string.tail(1)).to eq 'c'
14
+ end
15
+
16
+ it "gives the whole string when head exceeds length" do
17
+ expect(@string.head(999)).to eq @string
18
+ end
19
+
20
+ it "gives the whole string when tail exceeds length" do
21
+ expect(@string.tail(999)).to eq @string
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,228 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rush3
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Adam Wiggins
8
+ - Sergei Smagin
9
+ - James Dunn
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2019-09-11 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: session
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '3.2'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '3.2'
29
+ - !ruby/object:Gem::Dependency
30
+ name: coolline
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: 0.5.0
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: 0.5.0
43
+ - !ruby/object:Gem::Dependency
44
+ name: coderay
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.1.2
53
+ type: :runtime
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.1'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.1.2
63
+ - !ruby/object:Gem::Dependency
64
+ name: net-ssh
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '5.2'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '5.2'
77
+ - !ruby/object:Gem::Dependency
78
+ name: pry
79
+ requirement: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 0.12.2
84
+ type: :development
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 0.12.2
91
+ - !ruby/object:Gem::Dependency
92
+ name: rake
93
+ requirement: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '12.3'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 12.3.3
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '12.3'
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 12.3.3
111
+ - !ruby/object:Gem::Dependency
112
+ name: jeweler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.3'
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: 2.3.9
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '2.3'
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 2.3.9
131
+ - !ruby/object:Gem::Dependency
132
+ name: rspec
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '3.8'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.8'
145
+ description: A Ruby replacement for bash+ssh, providing both an interactive shell
146
+ and a library. Manage both local and remote unix systems from a single client.
147
+ email: jamesldunnjr@gmail.com
148
+ executables:
149
+ - rush
150
+ - rushd
151
+ extensions: []
152
+ extra_rdoc_files:
153
+ - README.rdoc
154
+ files:
155
+ - Gemfile
156
+ - Gemfile.lock
157
+ - README.rdoc
158
+ - Rakefile
159
+ - VERSION
160
+ - bin/rush
161
+ - bin/rushd
162
+ - lib/rush.rb
163
+ - lib/rush/access.rb
164
+ - lib/rush/array_ext.rb
165
+ - lib/rush/box.rb
166
+ - lib/rush/commands.rb
167
+ - lib/rush/config.rb
168
+ - lib/rush/dir.rb
169
+ - lib/rush/embeddable_shell.rb
170
+ - lib/rush/entry.rb
171
+ - lib/rush/exceptions.rb
172
+ - lib/rush/file.rb
173
+ - lib/rush/find_by.rb
174
+ - lib/rush/head_tail.rb
175
+ - lib/rush/integer_ext.rb
176
+ - lib/rush/local.rb
177
+ - lib/rush/path.rb
178
+ - lib/rush/process.rb
179
+ - lib/rush/process_set.rb
180
+ - lib/rush/search_results.rb
181
+ - lib/rush/shell.rb
182
+ - lib/rush/shell/completion.rb
183
+ - lib/rush/string_ext.rb
184
+ - spec/access_spec.rb
185
+ - spec/array_ext_spec.rb
186
+ - spec/base.rb
187
+ - spec/box_spec.rb
188
+ - spec/commands_spec.rb
189
+ - spec/config_spec.rb
190
+ - spec/dir_spec.rb
191
+ - spec/embeddable_shell_spec.rb
192
+ - spec/entry_spec.rb
193
+ - spec/file_spec.rb
194
+ - spec/find_by_spec.rb
195
+ - spec/integer_ext_spec.rb
196
+ - spec/local_spec.rb
197
+ - spec/path_spec.rb
198
+ - spec/process_set_spec.rb
199
+ - spec/process_spec.rb
200
+ - spec/rush_spec.rb
201
+ - spec/search_results_spec.rb
202
+ - spec/shell_spec.rb
203
+ - spec/ssh_tunnel_spec.rb
204
+ - spec/string_ext_spec.rb
205
+ homepage: https://github.com/protolif/rush
206
+ licenses:
207
+ - MIT
208
+ metadata: {}
209
+ post_install_message:
210
+ rdoc_options: []
211
+ require_paths:
212
+ - lib
213
+ required_ruby_version: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ required_rubygems_version: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ requirements: []
224
+ rubygems_version: 3.0.2
225
+ signing_key:
226
+ specification_version: 4
227
+ summary: A Ruby replacement for bash+ssh.
228
+ test_files: []