sanford 0.6.0 → 0.6.1
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/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
|