styoe 0.0.1 → 0.0.2
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.
- checksums.yaml +8 -8
- data/bin/styoe +11 -6
- data/features/applications_closing.feature +1 -0
- data/lib/styoe.rb +20 -14
- data/lib/styoe/configuration_resolver.rb +27 -27
- data/lib/styoe/dot_file_manager.rb +40 -0
- data/lib/styoe/version.rb +1 -1
- data/spec/configuration_resolver_spec.rb +39 -61
- data/spec/{fire_spec.rb → styoe_spec.rb} +10 -8
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NWYwZGQ2ODE3NzMwZjk5Y2JiYzM0NmRlMThkYTFlNTQwYzU4MDc2Nw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MWZmMTAyMzIwMGQ4ZGZhOTlhNTRlMjE0NWNiNjFiMTFlZDZmN2U4MQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MTVhNzFmNmViZGYzYzI2MGRlZTBiMGE0Y2M4N2QxZWU2MWYxNTllZDNhMTM2
|
10
|
+
ZmYwMjM2OWFkMTVlY2U5ZWQ5ZDUyMzQ1MzAyYjdmZWYyYmZjZTg4ZDQ1OThk
|
11
|
+
YzM4YTE3MTAwNzljYTE2ZjhmNWE1NTBkNGYxMDkxNmRhZDhlZTM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NjVlMWRhZTk3ZWIzMWVjZmVjMmM1NDQ2MTI2ZjNmZjA0YjE5OTBhNGRlZmNl
|
14
|
+
M2M1NGExZWY1NGIzMDFlY2M5ZDNlNjJmZWYyODE0MDVkN2ZiZjhjYjljNzE1
|
15
|
+
OTM1MzJhZjM3NDk2MWY5NzJlZTczMDdmODdjYjAwMjk0NWIwNjg=
|
data/bin/styoe
CHANGED
@@ -2,11 +2,16 @@
|
|
2
2
|
|
3
3
|
require 'styoe'
|
4
4
|
|
5
|
-
launcher = Styoe::Launcher.
|
5
|
+
launcher = Styoe::Launcher.build('.engines', '.engines.pids')
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
begin
|
8
|
+
case ARGV[0]
|
9
|
+
when '--stop'
|
10
|
+
launcher.stop
|
11
|
+
else
|
12
|
+
launcher.start
|
13
|
+
end
|
14
|
+
rescue Styoe::ConfigurationNotFound
|
15
|
+
$stderr.puts 'No configuration found. Are you sure you have created a .engines file?'
|
16
|
+
exit(1)
|
12
17
|
end
|
data/lib/styoe.rb
CHANGED
@@ -3,20 +3,25 @@ require 'styoe/configuration_resolver'
|
|
3
3
|
require 'styoe/process_launcher'
|
4
4
|
|
5
5
|
module Styoe
|
6
|
+
class RunningProcess < Struct.new(:path, :pid)
|
7
|
+
end
|
8
|
+
|
6
9
|
class Launcher
|
7
|
-
def initialize(config_resolver
|
8
|
-
@config_resolver = config_resolver
|
9
|
-
@process_launcher = process_launcher
|
10
|
+
def initialize(config_resolver, process_launcher)
|
11
|
+
@config_resolver = config_resolver
|
12
|
+
@process_launcher = process_launcher
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.build(dot_file, pid_file)
|
16
|
+
config_resolver = Styoe::ConfigurationResolver.new(dot_file, pid_file, Styoe::DotFileManager.new)
|
17
|
+
process_launcher = Styoe::ProcessLauncher.new
|
18
|
+
|
19
|
+
self.new(config_resolver, process_launcher)
|
10
20
|
end
|
11
21
|
|
12
22
|
def start
|
13
|
-
|
14
|
-
|
15
|
-
@config_resolver.dump_pids(processes)
|
16
|
-
rescue ConfigurationNotFound
|
17
|
-
$stderr.puts 'No configuration found. Are you sure you have created a .engines file?'
|
18
|
-
exit(1)
|
19
|
-
end
|
23
|
+
running_processes = run_processes!
|
24
|
+
@config_resolver.dump_processes(running_processes)
|
20
25
|
end
|
21
26
|
|
22
27
|
def stop
|
@@ -27,10 +32,11 @@ module Styoe
|
|
27
32
|
|
28
33
|
private
|
29
34
|
|
30
|
-
def run_processes
|
31
|
-
@config_resolver.processes.map do |
|
32
|
-
|
33
|
-
|
35
|
+
def run_processes!
|
36
|
+
@config_resolver.processes.map do |process_path|
|
37
|
+
pid = @process_launcher.launch(process_path)
|
38
|
+
RunningProcess.new(process_path, pid)
|
39
|
+
end
|
34
40
|
end
|
35
41
|
end
|
36
42
|
end
|
@@ -1,48 +1,48 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'styoe/dot_file_manager'
|
2
3
|
|
3
4
|
module Styoe
|
4
|
-
DOT_FILE = '.engines'
|
5
|
-
PID_FILE = '.engines.pids'
|
6
|
-
|
7
|
-
class ConfigurationNotFound < StandardError; end
|
8
|
-
|
9
5
|
class ConfigurationResolver
|
10
|
-
def initialize(
|
11
|
-
@
|
6
|
+
def initialize(dot_filename, pid_filename, dot_file_manager)
|
7
|
+
@dot_filename = dot_filename
|
8
|
+
@pid_filename = pid_filename
|
9
|
+
@dot_file_manager = dot_file_manager
|
12
10
|
end
|
13
11
|
|
14
|
-
def active_processes
|
15
|
-
|
16
|
-
return active_processes("../#{path}") unless File.exist?(path)
|
12
|
+
def active_processes
|
13
|
+
file_configuration = @dot_file_manager.find_recursively(@pid_filename)
|
17
14
|
|
18
|
-
|
15
|
+
File.delete(file_configuration.path)
|
16
|
+
parse_contents(file_configuration.contents)
|
19
17
|
end
|
20
18
|
|
21
|
-
def processes
|
22
|
-
|
23
|
-
return processes("../#{path}") unless File.exist?(path)
|
19
|
+
def processes
|
20
|
+
file_configuration = @dot_file_manager.find_recursively(@dot_filename)
|
24
21
|
|
25
|
-
|
22
|
+
parse_contents(file_configuration.contents)
|
26
23
|
end
|
27
24
|
|
28
|
-
def
|
29
|
-
|
30
|
-
return dump_pids(pids, "../#{path}") unless File.exist?(path)
|
25
|
+
def dump_processes(processes)
|
26
|
+
processes_dump = ProcessesDumper.dump(processes)
|
31
27
|
|
32
|
-
|
33
|
-
|
34
|
-
|
28
|
+
@dot_file_manager.save_near(@dot_filename,
|
29
|
+
new_name: @pid_filename,
|
30
|
+
contents: processes_dump)
|
35
31
|
end
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
def parse_values(path)
|
40
|
-
contents = File.read(path)
|
33
|
+
def parse_contents(contents)
|
41
34
|
YAML.load(contents).values
|
42
35
|
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class ProcessesDumper
|
39
|
+
def self.dump(processes)
|
40
|
+
self.to_hash(processes).to_yaml
|
41
|
+
end
|
43
42
|
|
44
|
-
def
|
45
|
-
|
43
|
+
def self.to_hash(processes)
|
44
|
+
ary_processes = processes.map { |p| [p.path, p.pid] }.flatten
|
45
|
+
Hash[*ary_processes]
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Styoe
|
2
|
+
class ConfigurationNotFound < StandardError; end
|
3
|
+
|
4
|
+
class DotFile < Struct.new(:path, :contents)
|
5
|
+
def self.read_from_path(path)
|
6
|
+
contents = File.read(path)
|
7
|
+
self.new(path, contents)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class DotFileManager
|
12
|
+
def find_recursively(path)
|
13
|
+
return DotFile.read_from_path(path) if File.exist?(path)
|
14
|
+
raise ConfigurationNotFound if reached_root?(path)
|
15
|
+
|
16
|
+
find_recursively("../#{path}")
|
17
|
+
end
|
18
|
+
|
19
|
+
def save_near(filename, new_name: "", contents: "")
|
20
|
+
near_file = find_recursively(filename)
|
21
|
+
path_to_save = filename_near(near_file.path, new_name)
|
22
|
+
write_file(path_to_save, contents)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def filename_near(path, name)
|
28
|
+
filename = File.basename(path)
|
29
|
+
path.gsub(filename, name)
|
30
|
+
end
|
31
|
+
|
32
|
+
def write_file(path, contents)
|
33
|
+
File.open(path, 'w') { |f| f.write(contents) }
|
34
|
+
end
|
35
|
+
|
36
|
+
def reached_root?(path)
|
37
|
+
File.dirname(File.absolute_path path) == '/'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/styoe/version.rb
CHANGED
@@ -1,84 +1,62 @@
|
|
1
|
+
require 'styoe'
|
1
2
|
require 'styoe/configuration_resolver'
|
2
3
|
|
3
4
|
describe Styoe::ConfigurationResolver do
|
4
5
|
|
5
|
-
let(:
|
6
|
-
let(:
|
6
|
+
let(:dot_filename) { '.engines' }
|
7
|
+
let(:pid_filename) { '.engines.pids' }
|
8
|
+
let(:dot_file_manager) { instance_double(Styoe::DotFileManager) }
|
7
9
|
|
8
|
-
|
9
|
-
allow_file_to_exist_and_return("#{Styoe::DOT_FILE}", sample_configuration)
|
10
|
+
subject { described_class.new(dot_filename, pid_filename, dot_file_manager) }
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
it 'searches configuration recursively in parent directories' do
|
15
|
-
allow_file_to_exist_and_return("../../#{Styoe::DOT_FILE}", sample_configuration)
|
12
|
+
it 'parses found configuration file' do
|
13
|
+
stub_found_dotfile(dot_filename, sample_configuration)
|
16
14
|
|
17
15
|
expect(subject.processes).to eq(['hello', 'world'])
|
18
16
|
end
|
19
17
|
|
20
|
-
it '
|
21
|
-
|
22
|
-
allow(File).to receive(:
|
18
|
+
it 'searches active processes and deletes related pidfile' do
|
19
|
+
stub_found_dotfile(pid_filename, sample_pids)
|
20
|
+
allow(File).to receive(:delete)
|
23
21
|
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'searches active processes' do
|
28
|
-
allow_file_to_exist_and_return("#{Styoe::PID_FILE}", sample_pids)
|
22
|
+
active_processes = subject.active_processes
|
29
23
|
|
30
|
-
expect(
|
24
|
+
expect(active_processes).to eq([ 1, 2 ])
|
25
|
+
expect(File).to have_received(:delete).with(pid_filename)
|
31
26
|
end
|
32
27
|
|
33
|
-
it '
|
34
|
-
|
28
|
+
it 'dumps active processes on the same path of dotfile' do
|
29
|
+
allow(dot_file_manager).to receive(:save_near)
|
30
|
+
subject.dump_processes([
|
31
|
+
Styoe::RunningProcess.new("application1", 1),
|
32
|
+
Styoe::RunningProcess.new("application2", 2)
|
33
|
+
])
|
35
34
|
|
36
|
-
expect(
|
35
|
+
expect(dot_file_manager).to have_received(:save_near)
|
36
|
+
.with(dot_filename,
|
37
|
+
new_name: pid_filename,
|
38
|
+
contents: sample_pids)
|
37
39
|
end
|
38
40
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
it "dumps active processes on the same path of #{Styoe::DOT_FILE}" do
|
47
|
-
pid_file = double
|
48
|
-
pids = { application1: 1, application2: 2 }
|
49
|
-
allow(File).to receive(:exist?).and_return(false, false, true)
|
50
|
-
allow(File).to receive(:open).with("../../#{Styoe::PID_FILE}", "w").and_return(pid_file)
|
51
|
-
allow(YAML).to receive(:dump).with(pids).and_return(sample_pids)
|
52
|
-
allow(pid_file).to receive(:write)
|
53
|
-
allow(pid_file).to receive(:close)
|
54
|
-
|
55
|
-
subject.dump_pids(pids)
|
56
|
-
|
57
|
-
expect(pid_file).to have_received(:write).with(sample_pids)
|
58
|
-
expect(pid_file).to have_received(:close)
|
59
|
-
end
|
60
|
-
|
61
|
-
def allow_file_to_exist_and_return(path, read_file)
|
62
|
-
allow_file_to_exist(path)
|
63
|
-
allow(File).to receive(:read).with(path).and_return(read_file)
|
64
|
-
end
|
65
|
-
|
66
|
-
def allow_file_to_exist(path)
|
67
|
-
allow(File).to receive(:exist?).and_return(false)
|
68
|
-
allow(File).to receive(:exist?).with(path).and_return(true)
|
69
|
-
end
|
70
|
-
|
71
|
-
def sample_configuration
|
72
|
-
<<-config
|
73
|
-
application1: hello
|
74
|
-
application2: world
|
75
|
-
config
|
76
|
-
end
|
41
|
+
def sample_configuration
|
42
|
+
<<-pids
|
43
|
+
---
|
44
|
+
application1: hello
|
45
|
+
application2: world
|
46
|
+
pids
|
47
|
+
end
|
77
48
|
|
78
49
|
def sample_pids
|
79
50
|
<<-pids
|
80
|
-
|
81
|
-
|
51
|
+
---
|
52
|
+
application1: 1
|
53
|
+
application2: 2
|
82
54
|
pids
|
83
55
|
end
|
56
|
+
|
57
|
+
def stub_found_dotfile(path, contents)
|
58
|
+
configuration = Styoe::DotFile.new(path, contents)
|
59
|
+
allow(dot_file_manager).to receive(:find_recursively).with(path).and_return(configuration)
|
60
|
+
end
|
61
|
+
|
84
62
|
end
|
@@ -3,20 +3,22 @@ require 'styoe'
|
|
3
3
|
describe Styoe::Launcher do
|
4
4
|
let(:configuration_resolver) { instance_double(Styoe::ConfigurationResolver) }
|
5
5
|
let(:process_launcher) { instance_double(Styoe::ProcessLauncher) }
|
6
|
-
let(:processes) { [ "app1", "app2", "app3" ] }
|
7
6
|
let(:pids) { [ 1, 2, 3 ] }
|
8
|
-
let(:running_processes) { Hash[*processes.zip(pids).flatten] }
|
9
7
|
|
10
8
|
subject { Styoe::Launcher.new(configuration_resolver, process_launcher) }
|
11
9
|
|
12
10
|
it "launches configuration processes and remembers open pids" do
|
13
|
-
allow(configuration_resolver).to receive(:processes).and_return(
|
14
|
-
allow(configuration_resolver).to receive(:
|
15
|
-
stub_processes_launch
|
11
|
+
allow(configuration_resolver).to receive(:processes).and_return(["app1", "app2", "app3"])
|
12
|
+
allow(configuration_resolver).to receive(:dump_processes)
|
13
|
+
stub_processes_launch("app1" => 1, "app2" => 2, "app3" => 3)
|
16
14
|
|
17
15
|
subject.start
|
18
16
|
|
19
|
-
expect(configuration_resolver).to have_received(:
|
17
|
+
expect(configuration_resolver).to have_received(:dump_processes).with([
|
18
|
+
Styoe::RunningProcess.new("app1", 1),
|
19
|
+
Styoe::RunningProcess.new("app2", 2),
|
20
|
+
Styoe::RunningProcess.new("app3", 3)
|
21
|
+
])
|
20
22
|
end
|
21
23
|
|
22
24
|
it 'stops active processes' do
|
@@ -30,8 +32,8 @@ describe Styoe::Launcher do
|
|
30
32
|
|
31
33
|
private
|
32
34
|
|
33
|
-
def stub_processes_launch
|
34
|
-
processes.
|
35
|
+
def stub_processes_launch(processes)
|
36
|
+
processes.each do |process, pid|
|
35
37
|
allow(process_launcher).to receive(:launch).with(process).and_return(pid)
|
36
38
|
end
|
37
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: styoe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Antonio Scandurra
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -101,12 +101,13 @@ files:
|
|
101
101
|
- features/support/env.rb
|
102
102
|
- lib/styoe.rb
|
103
103
|
- lib/styoe/configuration_resolver.rb
|
104
|
+
- lib/styoe/dot_file_manager.rb
|
104
105
|
- lib/styoe/process_launcher.rb
|
105
106
|
- lib/styoe/version.rb
|
106
107
|
- script/bootstrap
|
107
108
|
- spec/.gitkeep
|
108
109
|
- spec/configuration_resolver_spec.rb
|
109
|
-
- spec/
|
110
|
+
- spec/styoe_spec.rb
|
110
111
|
- styoe.gemspec
|
111
112
|
homepage: https://github.com/as-cii/styoe
|
112
113
|
licenses:
|
@@ -138,4 +139,4 @@ test_files:
|
|
138
139
|
- features/support/env.rb
|
139
140
|
- spec/.gitkeep
|
140
141
|
- spec/configuration_resolver_spec.rb
|
141
|
-
- spec/
|
142
|
+
- spec/styoe_spec.rb
|