zeus 0.4.6 → 0.10.0.pre
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/Gemfile +0 -4
- data/Rakefile +52 -8
- data/bin/zeus +14 -6
- data/build/fsevents-wrapper +0 -0
- data/build/zeus-darwin-amd64 +0 -0
- data/build/zeus-linux-386 +0 -0
- data/build/zeus-linux-amd64 +0 -0
- data/examples/zeus.json +22 -0
- data/ext/fsevents-wrapper/fsevents-wrapper +0 -0
- data/ext/inotify-wrapper/extconf.rb +24 -0
- data/ext/inotify-wrapper/inotify-wrapper.cpp +86 -0
- data/lib/zeus.rb +123 -35
- data/lib/zeus/{server/load_tracking.rb → load_tracking.rb} +1 -3
- data/lib/zeus/rails.rb +141 -0
- data/man/build/zeus +49 -0
- data/man/build/zeus-init +13 -0
- data/man/build/zeus-init.txt +17 -0
- data/man/build/zeus-start +16 -0
- data/man/build/zeus-start.txt +18 -0
- data/man/build/zeus.txt +50 -0
- data/zeus.gemspec +17 -6
- metadata +27 -58
- data/.gitignore +0 -17
- data/.travis.yml +0 -5
- data/.zeus.rb +0 -11
- data/README.md +0 -73
- data/docs/acceptor_registration.md +0 -14
- data/docs/client_server_handshake.md +0 -25
- data/ext/fsevents-wrapper/main.m +0 -118
- data/lib/thrud.rb +0 -97
- data/lib/zeus/cli.rb +0 -80
- data/lib/zeus/client.rb +0 -114
- data/lib/zeus/client/winsize.rb +0 -28
- data/lib/zeus/error_printer.rb +0 -16
- data/lib/zeus/plan.rb +0 -18
- data/lib/zeus/plan/acceptor.rb +0 -38
- data/lib/zeus/plan/node.rb +0 -66
- data/lib/zeus/plan/stage.rb +0 -50
- data/lib/zeus/server.rb +0 -103
- data/lib/zeus/server/acceptor.rb +0 -79
- data/lib/zeus/server/acceptor_registration_monitor.rb +0 -75
- data/lib/zeus/server/client_handler.rb +0 -106
- data/lib/zeus/server/command_runner.rb +0 -70
- data/lib/zeus/server/file_monitor.rb +0 -8
- data/lib/zeus/server/file_monitor/fsevent.rb +0 -102
- data/lib/zeus/server/process_tree_monitor.rb +0 -89
- data/lib/zeus/server/stage.rb +0 -88
- data/lib/zeus/server/stage/error_state.rb +0 -42
- data/lib/zeus/server/stage/feature_notifier.rb +0 -38
- data/lib/zeus/templates/rails.rb +0 -133
- data/lib/zeus/ui.rb +0 -57
- data/lib/zeus/version.rb +0 -3
- data/spec/cli_spec.rb +0 -95
- data/spec/error_printer_spec.rb +0 -27
- data/spec/integration_spec.rb +0 -106
- data/spec/server/file_monitor/fsevent_spec.rb +0 -88
- data/spec/server/load_tracking_spec.rb +0 -67
- data/spec/server/process_tree_monitor_spec.rb +0 -50
- data/spec/spec_helper.rb +0 -38
- data/spec/ui_spec.rb +0 -54
@@ -1,88 +0,0 @@
|
|
1
|
-
require 'socket'
|
2
|
-
require 'tempfile'
|
3
|
-
require 'fileutils'
|
4
|
-
require 'securerandom'
|
5
|
-
|
6
|
-
require 'zeus'
|
7
|
-
|
8
|
-
module Zeus::Server::FileMonitor
|
9
|
-
describe FSEvent do
|
10
|
-
|
11
|
-
let(:fsevent) { FSEvent.new() { } }
|
12
|
-
|
13
|
-
it 'registers files to be watched' do
|
14
|
-
_, io_out = stub_open_wrapper!
|
15
|
-
|
16
|
-
fsevent.watch("/a/b/c.rb")
|
17
|
-
io_out.readline.chomp.should == "/a/b/c.rb"
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'only registers a file with the wrapper script once' do
|
21
|
-
_, io_out = stub_open_wrapper!
|
22
|
-
|
23
|
-
files = ["a", "a", "b", "a", "b", "c", "d", "a"]
|
24
|
-
files.each { |f| fsevent.watch(f) }
|
25
|
-
|
26
|
-
files.uniq.each do |file|
|
27
|
-
io_out.readline.chomp.should == file
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'passes changed files to a callback' do
|
32
|
-
io_in, io_out = stub_open_wrapper!
|
33
|
-
|
34
|
-
# to prove that very long filenames aren't truncated anywhere:
|
35
|
-
filename = SecureRandom.hex(4000) + ".rb"
|
36
|
-
|
37
|
-
results = []
|
38
|
-
fsevent = FSEvent.new { |f| results << f }
|
39
|
-
|
40
|
-
io_in.puts filename
|
41
|
-
fsevent.stub(realpaths_for_givenpath: [filename])
|
42
|
-
# test that the right socket is used, and it's ready for reading.
|
43
|
-
IO.select([fsevent.datasource])[0].should == [io_out]
|
44
|
-
|
45
|
-
Zeus.ui.should_receive(:info).with(%r{#{filename}})
|
46
|
-
fsevent.on_datasource_event
|
47
|
-
results[0].should == filename
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
it 'closes sockets not necessary in child processes' do
|
52
|
-
io_in, io_out = stub_open_wrapper!
|
53
|
-
fsevent.close_parent_socket
|
54
|
-
|
55
|
-
io_in.should be_closed
|
56
|
-
io_out.should be_closed
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'integrates with the wrapper script to detect changes' do
|
60
|
-
results = []
|
61
|
-
callback = ->(path){ results << path }
|
62
|
-
fsevent = FSEvent.new(&callback)
|
63
|
-
|
64
|
-
file = Tempfile.new('fsevent-test')
|
65
|
-
|
66
|
-
fsevent.watch(file.path)
|
67
|
-
|
68
|
-
Zeus.ui.should_receive(:info).with(%r{#{file.path}})
|
69
|
-
|
70
|
-
FileUtils.touch(file.path)
|
71
|
-
IO.select([fsevent.datasource], [], [], 3)[0] # just wait for the data to appear
|
72
|
-
fsevent.on_datasource_event
|
73
|
-
results[0].should == file.path
|
74
|
-
|
75
|
-
file.unlink
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
def stub_open_wrapper!
|
81
|
-
io_in, io_out = Socket.pair(:UNIX, :STREAM)
|
82
|
-
FSEvent.any_instance.stub(open_wrapper: [io_in, io_out])
|
83
|
-
|
84
|
-
[io_in, io_out]
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
88
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Zeus::Server::LoadTracking do
|
4
|
-
class Recorder
|
5
|
-
def recorded
|
6
|
-
@recorded ||= []
|
7
|
-
end
|
8
|
-
|
9
|
-
def add_extra_feature(*args)
|
10
|
-
recorded << [:add_extra_feature, *args]
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
let(:recorder){ Recorder.new }
|
15
|
-
|
16
|
-
around do |example|
|
17
|
-
$foo = nil
|
18
|
-
Zeus::Server::LoadTracking.server = recorder
|
19
|
-
example.call
|
20
|
-
Zeus::Server::LoadTracking.server = nil
|
21
|
-
end
|
22
|
-
|
23
|
-
let(:tmp_path) { File.expand_path(Dir.pwd) }
|
24
|
-
|
25
|
-
it "tracks loading of absolute paths" do
|
26
|
-
write "foo.rb", "$foo = 1"
|
27
|
-
load "#{Dir.pwd}/foo.rb"
|
28
|
-
$foo.should == 1
|
29
|
-
recorder.recorded.should == [[:add_extra_feature, tmp_path + "/foo.rb"]]
|
30
|
-
end
|
31
|
-
|
32
|
-
it "tracks loading of relative paths" do
|
33
|
-
write "foo.rb", "$foo = 1"
|
34
|
-
load "./foo.rb"
|
35
|
-
$foo.should == 1
|
36
|
-
recorder.recorded.should == [[:add_extra_feature, tmp_path + "/foo.rb"]]
|
37
|
-
end
|
38
|
-
|
39
|
-
it "tracks loading from library paths" do
|
40
|
-
write "lib/foo.rb", "$foo = 1"
|
41
|
-
restoring $LOAD_PATH do
|
42
|
-
$LOAD_PATH << File.expand_path("lib")
|
43
|
-
load "foo.rb"
|
44
|
-
end
|
45
|
-
$foo.should == 1
|
46
|
-
recorder.recorded.should == [[:add_extra_feature, tmp_path + "/lib/foo.rb"]]
|
47
|
-
end
|
48
|
-
|
49
|
-
it "does not add unfound files" do
|
50
|
-
write "lib/foo.rb", "$foo = 1"
|
51
|
-
begin
|
52
|
-
load "foo.rb"
|
53
|
-
rescue LoadError
|
54
|
-
end
|
55
|
-
$foo.should == nil
|
56
|
-
recorder.recorded.should == []
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def restoring(thingy)
|
62
|
-
old = thingy.dup
|
63
|
-
yield
|
64
|
-
ensure
|
65
|
-
thingy.replace(old)
|
66
|
-
end
|
67
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
class Zeus::Server
|
4
|
-
describe ProcessTreeMonitor do
|
5
|
-
|
6
|
-
let(:file_monitor) { stub }
|
7
|
-
let(:tree) { stub }
|
8
|
-
let(:monitor) { ProcessTreeMonitor.new(file_monitor, tree) }
|
9
|
-
|
10
|
-
it "closes sockets not useful to forked processes" do
|
11
|
-
parent, child = stub, stub
|
12
|
-
ProcessTreeMonitor.any_instance.stub(open_socketpair: [parent, child])
|
13
|
-
parent.should_receive(:close)
|
14
|
-
monitor.close_parent_socket
|
15
|
-
end
|
16
|
-
|
17
|
-
it "closes sockets not useful to the master process" do
|
18
|
-
parent, child = stub, stub
|
19
|
-
ProcessTreeMonitor.any_instance.stub(open_socketpair: [parent, child])
|
20
|
-
child.should_receive(:close)
|
21
|
-
monitor.close_child_socket
|
22
|
-
end
|
23
|
-
|
24
|
-
it "kills nodes with a feature that changed" do
|
25
|
-
tree.should_receive(:kill_nodes_with_feature).with("rails")
|
26
|
-
monitor.kill_nodes_with_feature("rails")
|
27
|
-
end
|
28
|
-
|
29
|
-
it "passes process inheritance information to the tree" do
|
30
|
-
IO.select([monitor.datasource], [], [], 0).should be_nil
|
31
|
-
monitor.__CHILD__stage_starting_with_pid(:name, 1)
|
32
|
-
IO.select([monitor.datasource], [], [], 0.5).should_not be_nil
|
33
|
-
tree.should_receive(:stage_has_pid).with(:name, 1)
|
34
|
-
monitor.on_datasource_event
|
35
|
-
end
|
36
|
-
|
37
|
-
it "passes process feature information to the tree" do
|
38
|
-
IO.select([monitor.datasource], [], [], 0).should be_nil
|
39
|
-
monitor.__CHILD__stage_has_feature(:name, "rails")
|
40
|
-
IO.select([monitor.datasource], [], [], 0.5).should_not be_nil
|
41
|
-
tree.should_receive(:stage_has_feature).with(:name, "rails")
|
42
|
-
file_monitor.should_receive(:watch).with("rails")
|
43
|
-
monitor.on_datasource_event
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
data/spec/spec_helper.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'zeus'
|
2
|
-
|
3
|
-
module FolderHelpers
|
4
|
-
def write(file, content)
|
5
|
-
ensure_folder File.dirname(file)
|
6
|
-
File.open(file, 'w'){|f| f.write content }
|
7
|
-
end
|
8
|
-
|
9
|
-
def read(file)
|
10
|
-
File.read file
|
11
|
-
end
|
12
|
-
|
13
|
-
def delete(file)
|
14
|
-
`rm #{file}`
|
15
|
-
end
|
16
|
-
|
17
|
-
def ensure_folder(folder)
|
18
|
-
`mkdir -p #{folder}` unless File.exist?(folder)
|
19
|
-
end
|
20
|
-
|
21
|
-
def root
|
22
|
-
File.expand_path '../..', __FILE__
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
RSpec.configure do |config|
|
27
|
-
config.include FolderHelpers
|
28
|
-
|
29
|
-
config.around do |example|
|
30
|
-
folder = File.expand_path("../tmp", __FILE__)
|
31
|
-
`rm -rf #{folder}`
|
32
|
-
ensure_folder folder
|
33
|
-
Dir.chdir folder do
|
34
|
-
example.call
|
35
|
-
end
|
36
|
-
`rm -rf #{folder}`
|
37
|
-
end
|
38
|
-
end
|
data/spec/ui_spec.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'zeus'
|
2
|
-
|
3
|
-
module Zeus
|
4
|
-
describe UI do
|
5
|
-
|
6
|
-
let(:ui) {
|
7
|
-
ui = UI.new
|
8
|
-
# override this method to return the result rather than printing it.
|
9
|
-
def ui.tell_me(msg, color)
|
10
|
-
return make_message(msg, color)
|
11
|
-
end
|
12
|
-
ui
|
13
|
-
}
|
14
|
-
|
15
|
-
it "prints errors in red, regardless of verbosity level" do
|
16
|
-
ui.error("error").should == "\x1b[31merror\x1b[0m\n"
|
17
|
-
ui.be_quiet!
|
18
|
-
ui.error("error").should == "\x1b[31merror\x1b[0m\n"
|
19
|
-
end
|
20
|
-
|
21
|
-
it "prints warnings in yellow, regardless of verbosity level" do
|
22
|
-
ui.warn("warning").should == "\x1b[33mwarning\x1b[0m\n"
|
23
|
-
ui.be_quiet!
|
24
|
-
ui.warn("warning").should == "\x1b[33mwarning\x1b[0m\n"
|
25
|
-
end
|
26
|
-
|
27
|
-
it "prints info messages in magenta, but not if quiet-mode is set" do
|
28
|
-
ui.info("info").should == "\x1b[35minfo\x1b[0m\n"
|
29
|
-
ui.be_quiet!
|
30
|
-
ui.info("info").should == nil
|
31
|
-
end
|
32
|
-
|
33
|
-
it "doesn't print debug messages by default" do
|
34
|
-
ui.debug("debug").should == nil
|
35
|
-
end
|
36
|
-
|
37
|
-
it "prints debug messages if debug-mode is set" do
|
38
|
-
ui.debug!
|
39
|
-
ui.debug("debug").should == "debug\n"
|
40
|
-
end
|
41
|
-
|
42
|
-
it "sets debug if ENV['DEBUG']" do
|
43
|
-
ENV['DEBUG'] = "yup"
|
44
|
-
ui.debug?.should be_true
|
45
|
-
end
|
46
|
-
|
47
|
-
it "doesn't print debug messages if both quiet-mode and debug-mode are set" do
|
48
|
-
ui.be_quiet!
|
49
|
-
ui.debug!
|
50
|
-
ui.debug("debug").should == nil
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
end
|