sanford 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +0 -3
- data/lib/sanford/host.rb +5 -0
- data/lib/sanford/host_data.rb +6 -1
- data/lib/sanford/runner.rb +43 -21
- data/lib/sanford/service_handler.rb +1 -1
- data/lib/sanford/test_runner.rb +12 -11
- data/lib/sanford/version.rb +1 -1
- data/lib/sanford/worker.rb +1 -1
- data/lib/sanford.rb +2 -0
- data/sanford.gemspec +1 -1
- data/test/support/helpers.rb +1 -27
- data/test/system/request_handling_test.rb +1 -1
- data/test/unit/host_data_test.rb +2 -2
- data/test/unit/host_test.rb +2 -1
- data/test/unit/manager_test.rb +0 -3
- data/test/unit/runner_test.rb +3 -3
- metadata +7 -9
- data/test/system/managing_test.rb +0 -94
data/Rakefile
CHANGED
data/lib/sanford/host.rb
CHANGED
@@ -25,6 +25,7 @@ module Sanford
|
|
25
25
|
option :logger, :default => proc{ Sanford.config.logger }
|
26
26
|
option :verbose_logging, :default => true
|
27
27
|
option :receives_keep_alive, :default => false
|
28
|
+
option :runner, :default => proc{ Sanford.config.runner }
|
28
29
|
option :error_proc, Proc, :default => proc{ }
|
29
30
|
option :init_proc, Proc, :default => proc{ }
|
30
31
|
|
@@ -77,6 +78,10 @@ module Sanford
|
|
77
78
|
self.configuration.receives_keep_alive *args
|
78
79
|
end
|
79
80
|
|
81
|
+
def runner(*args)
|
82
|
+
self.configuration.runner *args
|
83
|
+
end
|
84
|
+
|
80
85
|
def error(&block)
|
81
86
|
self.configuration.error_proc = block
|
82
87
|
end
|
data/lib/sanford/host_data.rb
CHANGED
@@ -11,7 +11,7 @@ module Sanford
|
|
11
11
|
|
12
12
|
# NOTE: The `name` attribute shouldn't be removed, it is used to identify
|
13
13
|
# a `HostData`, particularly in error handlers
|
14
|
-
attr_reader :name, :logger, :verbose, :keep_alive, :error_proc
|
14
|
+
attr_reader :name, :logger, :verbose, :keep_alive, :runner, :error_proc
|
15
15
|
|
16
16
|
def initialize(service_host, options = nil)
|
17
17
|
service_host.configuration.init_proc.call
|
@@ -23,6 +23,7 @@ module Sanford
|
|
23
23
|
@logger = configuration[:logger]
|
24
24
|
@verbose = configuration[:verbose_logging]
|
25
25
|
@keep_alive = configuration[:receives_keep_alive]
|
26
|
+
@runner = configuration[:runner]
|
26
27
|
@error_proc = configuration[:error_proc]
|
27
28
|
|
28
29
|
@handlers = service_host.versioned_services.inject({}) do |hash, (version, services)|
|
@@ -30,6 +31,10 @@ module Sanford
|
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
34
|
+
def run(handler_class, request)
|
35
|
+
self.runner.new(handler_class, request, self.logger).run
|
36
|
+
end
|
37
|
+
|
33
38
|
def handler_class_for(version, service)
|
34
39
|
version_group = @handlers[version] || {}
|
35
40
|
version_group[service] || raise(Sanford::NotFoundError)
|
data/lib/sanford/runner.rb
CHANGED
@@ -3,50 +3,72 @@ require 'sanford-protocol'
|
|
3
3
|
|
4
4
|
module Sanford
|
5
5
|
|
6
|
-
|
6
|
+
module Runner
|
7
7
|
|
8
8
|
ResponseArgs = Struct.new(:status, :data)
|
9
9
|
|
10
10
|
attr_reader :handler_class, :request, :logger
|
11
11
|
|
12
|
-
def self.
|
13
|
-
|
14
|
-
self.new(handler_class, request, logger).run
|
12
|
+
def self.included(klass)
|
13
|
+
klass.class_eval{ extend ClassMethods }
|
15
14
|
end
|
16
15
|
|
17
16
|
def initialize(handler_class, request, logger = nil)
|
18
17
|
@handler_class, @request = handler_class, request
|
19
18
|
@logger = logger || Sanford.config.logger
|
20
19
|
@handler = @handler_class.new(self)
|
20
|
+
self.init
|
21
|
+
end
|
22
|
+
|
23
|
+
def init
|
24
|
+
self.init!
|
25
|
+
end
|
26
|
+
|
27
|
+
def init!
|
21
28
|
end
|
22
29
|
|
23
30
|
def run
|
24
|
-
response_args = catch_halt
|
25
|
-
@handler.init
|
26
|
-
@handler.run
|
27
|
-
end
|
31
|
+
response_args = catch_halt{ self.run!(@handler) }
|
28
32
|
Sanford::Protocol::Response.new(response_args.status, response_args.data)
|
29
33
|
end
|
30
34
|
|
31
|
-
|
35
|
+
def run!
|
36
|
+
raise NotImplementedError
|
37
|
+
end
|
32
38
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
39
|
+
# It's best to keep what `halt` and `catch_halt` return in the same format.
|
40
|
+
# Currently this is a `ResponseArgs` object. This is so no matter how the
|
41
|
+
# block returns (either by throwing or running normally), you get the same
|
42
|
+
# thing kind of object.
|
37
43
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
44
|
+
def halt(status, options = nil)
|
45
|
+
options = OpenStruct.new(options || {})
|
46
|
+
response_status = [ status, options.message ]
|
47
|
+
throw :halt, ResponseArgs.new(response_status, options.data)
|
48
|
+
end
|
43
49
|
|
44
|
-
|
45
|
-
|
50
|
+
def catch_halt(&block)
|
51
|
+
catch(:halt){ ResponseArgs.new(*block.call) }
|
52
|
+
end
|
53
|
+
|
54
|
+
module ClassMethods
|
55
|
+
|
56
|
+
def run(handler_class, params = nil, logger = nil)
|
57
|
+
request = Sanford::Protocol::Request.new('version', 'name', params || {})
|
58
|
+
self.new(handler_class, request, logger).run
|
46
59
|
end
|
47
60
|
|
48
61
|
end
|
49
|
-
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
class DefaultRunner
|
66
|
+
include Sanford::Runner
|
67
|
+
|
68
|
+
def run!(handler)
|
69
|
+
handler.init
|
70
|
+
handler.run
|
71
|
+
end
|
50
72
|
|
51
73
|
end
|
52
74
|
|
data/lib/sanford/test_runner.rb
CHANGED
@@ -5,19 +5,20 @@ require 'sanford/runner'
|
|
5
5
|
module Sanford
|
6
6
|
|
7
7
|
class TestRunner
|
8
|
-
include Sanford::Runner
|
8
|
+
include Sanford::Runner
|
9
9
|
|
10
|
-
attr_reader :handler, :response
|
10
|
+
attr_reader :handler, :response
|
11
11
|
|
12
|
-
def
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
@handler = @handler_class.new(self)
|
12
|
+
def init!
|
13
|
+
if !@request.kind_of?(Sanford::Protocol::Request)
|
14
|
+
@request = test_request(@request)
|
15
|
+
end
|
18
16
|
@response = build_response catch(:halt){ @handler.init; nil }
|
19
17
|
end
|
20
18
|
|
19
|
+
# we override the `run` method because the TestRunner wants to control
|
20
|
+
# storing any generated response. If `init` generated a response, we don't
|
21
|
+
# want to `run` at all.
|
21
22
|
def run
|
22
23
|
@response ||= build_response catch_halt{ @handler.run }
|
23
24
|
end
|
@@ -25,7 +26,7 @@ module Sanford
|
|
25
26
|
protected
|
26
27
|
|
27
28
|
def test_request(params)
|
28
|
-
Sanford::Protocol::Request.new('
|
29
|
+
Sanford::Protocol::Request.new('version', 'name', params)
|
29
30
|
end
|
30
31
|
|
31
32
|
def build_response(response_args)
|
@@ -35,8 +36,8 @@ module Sanford
|
|
35
36
|
module Helpers
|
36
37
|
module_function
|
37
38
|
|
38
|
-
def test_runner(
|
39
|
-
TestRunner.new(
|
39
|
+
def test_runner(handler_class, params = nil, logger = nil)
|
40
|
+
TestRunner.new(handler_class, params || {}, logger)
|
40
41
|
end
|
41
42
|
|
42
43
|
end
|
data/lib/sanford/version.rb
CHANGED
data/lib/sanford/worker.rb
CHANGED
@@ -44,7 +44,7 @@ module Sanford
|
|
44
44
|
self.log_handler_class(handler_class)
|
45
45
|
service.handler_class = handler_class
|
46
46
|
|
47
|
-
response =
|
47
|
+
response = @host_data.run(handler_class, request)
|
48
48
|
service.response = response
|
49
49
|
rescue Exception => exception
|
50
50
|
self.handle_exception(service, exception, @host_data)
|
data/lib/sanford.rb
CHANGED
@@ -6,6 +6,7 @@ require 'set'
|
|
6
6
|
|
7
7
|
require 'sanford/host'
|
8
8
|
require 'sanford/logger'
|
9
|
+
require 'sanford/runner'
|
9
10
|
require 'sanford/server'
|
10
11
|
require 'sanford/service_handler'
|
11
12
|
require 'sanford/version'
|
@@ -40,6 +41,7 @@ module Sanford
|
|
40
41
|
include NsOptions::Proxy
|
41
42
|
option :services_file, Pathname, :default => ENV['SANFORD_SERVICES_FILE']
|
42
43
|
option :logger, :default => Sanford::NullLogger.new
|
44
|
+
option :runner, :default => Sanford::DefaultRunner
|
43
45
|
end
|
44
46
|
|
45
47
|
class Hosts
|
data/sanford.gemspec
CHANGED
@@ -21,6 +21,6 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.add_dependency("ns-options", ["~>1.0"])
|
22
22
|
gem.add_dependency("sanford-protocol", ["~>0.5"])
|
23
23
|
|
24
|
-
gem.add_development_dependency("assert", ["~>
|
24
|
+
gem.add_development_dependency("assert", ["~>2.0"])
|
25
25
|
gem.add_development_dependency("assert-mocha", ["~>1.0"])
|
26
26
|
end
|
data/test/support/helpers.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Test
|
2
2
|
|
3
|
-
module
|
3
|
+
module SpawnServerHelper
|
4
4
|
|
5
5
|
def start_server(host, &block)
|
6
6
|
begin
|
@@ -16,30 +16,4 @@ module Test
|
|
16
16
|
|
17
17
|
end
|
18
18
|
|
19
|
-
module ManagerHelper
|
20
|
-
|
21
|
-
# start a Sanford server using Sanford's manager in a forked process
|
22
|
-
def fork_and_call(proc, &block)
|
23
|
-
pid = fork do
|
24
|
-
STDOUT.reopen('/dev/null') unless ENV['SANFORD_DEBUG']
|
25
|
-
manager = proc.call
|
26
|
-
trap("TERM"){ manager.stop }
|
27
|
-
end
|
28
|
-
sleep 0.3 # give time for the command to run
|
29
|
-
yield
|
30
|
-
ensure
|
31
|
-
if pid
|
32
|
-
Process.kill("TERM", pid)
|
33
|
-
Process.wait(pid)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def open_socket(host, port)
|
38
|
-
socket = TCPSocket.new(host, port)
|
39
|
-
ensure
|
40
|
-
socket.close rescue false
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
19
|
end
|
data/test/unit/host_data_test.rb
CHANGED
@@ -13,8 +13,8 @@ class Sanford::HostData
|
|
13
13
|
end
|
14
14
|
subject{ @host_data }
|
15
15
|
|
16
|
-
should have_instance_methods :name, :logger, :verbose, :
|
17
|
-
:handler_class_for
|
16
|
+
should have_instance_methods :name, :logger, :verbose, :keep_alive, :runner,
|
17
|
+
:error_proc, :run, :handler_class_for
|
18
18
|
|
19
19
|
should "default it's configuration from the service host, but allow overrides" do
|
20
20
|
host_data = Sanford::HostData.new(TestHost, :verbose_logging => false)
|
data/test/unit/host_test.rb
CHANGED
@@ -13,7 +13,8 @@ module Sanford::Host
|
|
13
13
|
subject{ MyHost.instance }
|
14
14
|
|
15
15
|
should have_instance_methods :configuration, :name, :ip, :port, :pid_file,
|
16
|
-
:logger, :verbose_logging, :error, :init, :version,
|
16
|
+
:logger, :verbose_logging, :runner, :error, :init, :version,
|
17
|
+
:versioned_services
|
17
18
|
|
18
19
|
should "get and set it's configuration options with their matching methods" do
|
19
20
|
subject.name 'my_awesome_host'
|
data/test/unit/manager_test.rb
CHANGED
data/test/unit/runner_test.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'assert'
|
2
2
|
|
3
|
-
|
3
|
+
module Sanford::Runner
|
4
4
|
|
5
5
|
class BaseTest < Assert::Context
|
6
6
|
desc "Sanford::Runner"
|
7
7
|
setup do
|
8
8
|
request = Sanford::Protocol::Request.new('v1', 'test', {})
|
9
|
-
@runner = Sanford::
|
9
|
+
@runner = Sanford::DefaultRunner.new(BasicServiceHandler, request)
|
10
10
|
end
|
11
11
|
subject{ @runner }
|
12
12
|
|
@@ -25,7 +25,7 @@ class Sanford::Runner
|
|
25
25
|
should "be able to build a runner with a handler class and params" do
|
26
26
|
response = nil
|
27
27
|
assert_nothing_raised do
|
28
|
-
response = Sanford::
|
28
|
+
response = Sanford::DefaultRunner.run(BasicServiceHandler, {})
|
29
29
|
end
|
30
30
|
|
31
31
|
assert_equal 200, response.code
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sanford
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 5
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 0.6.
|
9
|
+
- 1
|
10
|
+
version: 0.6.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Collin Redding
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2013-02-
|
19
|
+
date: 2013-02-27 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
prerelease: false
|
@@ -70,11 +70,11 @@ dependencies:
|
|
70
70
|
requirements:
|
71
71
|
- - ~>
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
hash:
|
73
|
+
hash: 3
|
74
74
|
segments:
|
75
|
-
-
|
75
|
+
- 2
|
76
76
|
- 0
|
77
|
-
version: "
|
77
|
+
version: "2.0"
|
78
78
|
requirement: *id004
|
79
79
|
name: assert
|
80
80
|
type: :development
|
@@ -135,7 +135,6 @@ files:
|
|
135
135
|
- test/support/service_handlers.rb
|
136
136
|
- test/support/services.rb
|
137
137
|
- test/support/simple_client.rb
|
138
|
-
- test/system/managing_test.rb
|
139
138
|
- test/system/request_handling_test.rb
|
140
139
|
- test/unit/config_test.rb
|
141
140
|
- test/unit/error_handler_test.rb
|
@@ -190,7 +189,6 @@ test_files:
|
|
190
189
|
- test/support/service_handlers.rb
|
191
190
|
- test/support/services.rb
|
192
191
|
- test/support/simple_client.rb
|
193
|
-
- test/system/managing_test.rb
|
194
192
|
- test/system/request_handling_test.rb
|
195
193
|
- test/unit/config_test.rb
|
196
194
|
- test/unit/error_handler_test.rb
|
@@ -1,94 +0,0 @@
|
|
1
|
-
require 'assert'
|
2
|
-
|
3
|
-
require 'sanford/cli'
|
4
|
-
|
5
|
-
class ManagingTest < Assert::Context
|
6
|
-
include Test::ManagerHelper
|
7
|
-
desc "Using Sanford's Manager"
|
8
|
-
setup do
|
9
|
-
@start_options = { :host => 'MyHost', :ip => 'localhost', :port => 12345 }
|
10
|
-
end
|
11
|
-
|
12
|
-
class RunTest < ManagingTest
|
13
|
-
desc "to run a server"
|
14
|
-
setup do
|
15
|
-
@proc = proc{ Sanford::Manager.call(:run, @start_options) }
|
16
|
-
end
|
17
|
-
|
18
|
-
should "run the server specified and write a PID file" do
|
19
|
-
self.fork_and_call(@proc) do
|
20
|
-
assert_nothing_raised{ self.open_socket('localhost', 12345) }
|
21
|
-
assert File.exists?('tmp/my_host.pid')
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
class StartTest < ManagingTest
|
28
|
-
desc "to start a daemonized server"
|
29
|
-
setup do
|
30
|
-
@proc = proc{ Sanford::Manager.call(:start, @start_options) }
|
31
|
-
end
|
32
|
-
teardown do
|
33
|
-
Sanford::Manager.call(:stop, @start_options)
|
34
|
-
end
|
35
|
-
|
36
|
-
should "run the server specified and write a PID file" do
|
37
|
-
self.fork_and_call(@proc) do
|
38
|
-
assert_nothing_raised{ self.open_socket('localhost', 12345) }
|
39
|
-
assert File.exists?('tmp/my_host.pid')
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
class StopTest < ManagingTest
|
46
|
-
desc "to stop a daemonized server"
|
47
|
-
setup do
|
48
|
-
@start_proc = proc{ Sanford::Manager.call(:start, @start_options) }
|
49
|
-
end
|
50
|
-
|
51
|
-
should "stop the server specified and remove the PID file" do
|
52
|
-
self.fork_and_call(@start_proc) do
|
53
|
-
Sanford::Manager.call(:stop, @start_options)
|
54
|
-
sleep 1
|
55
|
-
|
56
|
-
assert_raises{ self.open_socket('localhost', 12345) }
|
57
|
-
assert_not File.exists?('tmp/my_host_localhost_12345.pid')
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
class RestartTest < ManagingTest
|
64
|
-
desc "to restart a daemonized server"
|
65
|
-
setup do
|
66
|
-
@start_proc = proc{ Sanford::Manager.call(:start, @start_options) }
|
67
|
-
end
|
68
|
-
|
69
|
-
should "stop the server specified and remove the PID file" do
|
70
|
-
self.fork_and_call(@start_proc) do
|
71
|
-
exception = nil
|
72
|
-
stop = false
|
73
|
-
thread = Thread.new do
|
74
|
-
while !stop do
|
75
|
-
begin
|
76
|
-
self.open_socket('localhost', 12345)
|
77
|
-
sleep 0.1
|
78
|
-
rescue Exception => exception
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
Sanford::Manager.call(:restart, @start_options)
|
83
|
-
thread.join(1)
|
84
|
-
|
85
|
-
# make sure we didn't lost the ability to connect
|
86
|
-
assert_nil exception
|
87
|
-
|
88
|
-
stop = true
|
89
|
-
thread.join
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|