socky 0.0.8 → 0.0.9
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/CHANGELOG.textile +13 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/em-websocket_hacks.rb +7 -1
- data/lib/socky.rb +5 -1
- data/lib/socky/connection.rb +16 -7
- data/lib/socky/connection/authentication.rb +2 -2
- data/lib/socky/message.rb +2 -12
- data/lib/socky/misc.rb +4 -0
- data/lib/socky/options.rb +2 -1
- data/lib/socky/options/config.rb +12 -3
- data/lib/socky/options/parser.rb +19 -1
- data/lib/socky/runner.rb +43 -3
- data/spec/files/default.yml +2 -0
- data/spec/socky/connection/authentication_spec.rb +14 -5
- data/spec/socky/connection_spec.rb +11 -3
- data/spec/socky/message_spec.rb +5 -39
- data/spec/socky/options/config_spec.rb +16 -9
- data/spec/socky/options/parser_spec.rb +18 -1
- data/spec/socky/options_spec.rb +16 -21
- data/spec/socky/runner_spec.rb +12 -1
- data/spec/socky_spec.rb +10 -3
- metadata +6 -6
data/CHANGELOG.textile
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
h1. Changelog
|
2
2
|
|
3
|
+
h2. 0.0.9 / 2010-06-20
|
4
|
+
|
5
|
+
*IMPORTANT! This version will not work with plugin version lower than 0.0.9*
|
6
|
+
|
7
|
+
* new features:
|
8
|
+
** support for next version of em-websocket debug options(based on mloughran branch)
|
9
|
+
** support for websocket draft 76
|
10
|
+
** support for wss/SSL connections
|
11
|
+
** socky can now be started in 'daemon' mode
|
12
|
+
** socky now sending all messages in JSON format
|
13
|
+
* bugfixes:
|
14
|
+
** socky will no longer crash when when request query is invalid - i.e. chrome 6.0.*(with websocket draft76) and em-websocket 0.0.6
|
15
|
+
|
3
16
|
h2. 0.0.8 / 2010-06-06
|
4
17
|
|
5
18
|
* new features:
|
data/Rakefile
CHANGED
@@ -17,7 +17,7 @@ begin
|
|
17
17
|
gemspec.email = "b.potocki@imanel.org"
|
18
18
|
gemspec.homepage = "http://github.com/imanel/socky_gem"
|
19
19
|
gemspec.authors = ["Bernard Potocki"]
|
20
|
-
gemspec.add_dependency('em-websocket', '>= 0.
|
20
|
+
gemspec.add_dependency('em-websocket', '>= 0.1.2')
|
21
21
|
gemspec.add_dependency('em-http-request')
|
22
22
|
gemspec.files.exclude ".gitignore"
|
23
23
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.9
|
data/lib/em-websocket_hacks.rb
CHANGED
@@ -1,4 +1,10 @@
|
|
1
|
-
EventMachine::WebSocket::
|
1
|
+
if defined?(EventMachine::WebSocket::Debugger)
|
2
|
+
klass = EventMachine::WebSocket::Debugger
|
3
|
+
else
|
4
|
+
klass = EventMachine::WebSocket::Connection
|
5
|
+
end
|
6
|
+
|
7
|
+
klass.class_eval do
|
2
8
|
|
3
9
|
def debug(*data)
|
4
10
|
if @debug
|
data/lib/socky.rb
CHANGED
data/lib/socky/connection.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'json'
|
1
2
|
require 'socky/connection/authentication'
|
2
3
|
require 'socky/connection/finders'
|
3
4
|
|
@@ -19,20 +20,24 @@ module Socky
|
|
19
20
|
@socket = socket
|
20
21
|
end
|
21
22
|
|
23
|
+
def query
|
24
|
+
socket.request["Query"] || {}
|
25
|
+
end
|
26
|
+
|
22
27
|
def admin
|
23
|
-
["true","1"].include?(
|
28
|
+
["true","1"].include?(query["admin"])
|
24
29
|
end
|
25
30
|
|
26
31
|
def client
|
27
|
-
|
32
|
+
query["client_id"]
|
28
33
|
end
|
29
34
|
|
30
35
|
def secret
|
31
|
-
|
36
|
+
query["client_secret"]
|
32
37
|
end
|
33
38
|
|
34
39
|
def channels
|
35
|
-
@channels ||=
|
40
|
+
@channels ||= query["channels"].to_s.split(",").collect(&:strip).reject(&:empty?)
|
36
41
|
end
|
37
42
|
|
38
43
|
def subscribe
|
@@ -46,7 +51,7 @@ module Socky
|
|
46
51
|
end
|
47
52
|
|
48
53
|
def process_message(msg)
|
49
|
-
if admin
|
54
|
+
if admin && authenticated?
|
50
55
|
Socky::Message.process(self, msg)
|
51
56
|
else
|
52
57
|
self.send_message "You are not authorized to post messages"
|
@@ -54,8 +59,12 @@ module Socky
|
|
54
59
|
end
|
55
60
|
|
56
61
|
def send_message(msg)
|
57
|
-
|
58
|
-
|
62
|
+
send_data({:type => :message, :body => msg})
|
63
|
+
end
|
64
|
+
|
65
|
+
def send_data(data)
|
66
|
+
debug [self.name, "sending data", data.inspect]
|
67
|
+
socket.send data.to_json
|
59
68
|
end
|
60
69
|
|
61
70
|
def disconnect
|
@@ -13,7 +13,7 @@ module Socky
|
|
13
13
|
debug [self.name, "authentication failed"]
|
14
14
|
disconnect
|
15
15
|
end
|
16
|
-
end unless authenticated?
|
16
|
+
end unless admin || authenticated?
|
17
17
|
end
|
18
18
|
|
19
19
|
def unsubscribe_request
|
@@ -28,7 +28,7 @@ module Socky
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def authenticate_as_admin
|
31
|
-
|
31
|
+
options[:secret].nil? || secret == options[:secret]
|
32
32
|
end
|
33
33
|
|
34
34
|
def authenticate_as_user
|
data/lib/socky/message.rb
CHANGED
@@ -16,7 +16,7 @@ module Socky
|
|
16
16
|
message.process
|
17
17
|
rescue SockyError => error
|
18
18
|
error connection.name, error
|
19
|
-
connection.send_message(error.message
|
19
|
+
connection.send_message(error.message)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
@@ -28,16 +28,6 @@ module Socky
|
|
28
28
|
def process
|
29
29
|
debug [self.name, "processing", params.inspect]
|
30
30
|
|
31
|
-
verify_secret!
|
32
|
-
|
33
|
-
execute
|
34
|
-
end
|
35
|
-
|
36
|
-
def verify_secret!
|
37
|
-
raise(UnauthorisedQuery, "invalid secret") unless options[:secret].nil? || options[:secret] == params[:secret]
|
38
|
-
end
|
39
|
-
|
40
|
-
def execute
|
41
31
|
case params[:command].to_sym
|
42
32
|
when :broadcast then broadcast
|
43
33
|
when :query then query
|
@@ -93,7 +83,7 @@ module Socky
|
|
93
83
|
end
|
94
84
|
|
95
85
|
def respond(message)
|
96
|
-
creator.send_message(message
|
86
|
+
creator.send_message(message)
|
97
87
|
end
|
98
88
|
|
99
89
|
end
|
data/lib/socky/misc.rb
CHANGED
data/lib/socky/options.rb
CHANGED
@@ -12,11 +12,12 @@ module Socky
|
|
12
12
|
:port => 8080,
|
13
13
|
:debug => false,
|
14
14
|
:deep_debug => false,
|
15
|
+
:secure => false,
|
15
16
|
:log_path => log_path
|
16
17
|
}
|
17
18
|
|
18
19
|
parsed_options = Parser.parse(argv)
|
19
|
-
config_options = Config.read(parsed_options[:config_path] || config_path)
|
20
|
+
config_options = Config.read(parsed_options[:config_path] || config_path, :kill => parsed_options[:kill])
|
20
21
|
|
21
22
|
self.options.merge!(config_options)
|
22
23
|
self.options.merge!(parsed_options)
|
data/lib/socky/options/config.rb
CHANGED
@@ -21,14 +21,18 @@ module Socky
|
|
21
21
|
end
|
22
22
|
|
23
23
|
class << self
|
24
|
-
def read(path)
|
24
|
+
def read(path, args = {})
|
25
25
|
raise(NoConfigFile, "You must generate a config file (socky -g filename.yml)") unless File.exists?(path)
|
26
26
|
result = YAML::load(ERB.new(IO.read(path)).result)
|
27
27
|
raise(InvalidConfig, "Provided config file is invalid.") unless result.is_a?(Hash)
|
28
28
|
result
|
29
29
|
rescue SockyError => error
|
30
|
-
|
31
|
-
|
30
|
+
if args[:kill]
|
31
|
+
return {}
|
32
|
+
else
|
33
|
+
puts error.message
|
34
|
+
exit
|
35
|
+
end
|
32
36
|
end
|
33
37
|
|
34
38
|
def generate(path)
|
@@ -51,7 +55,12 @@ module Socky
|
|
51
55
|
|
52
56
|
:secret: my_secret_key
|
53
57
|
|
58
|
+
:secure: false
|
59
|
+
|
54
60
|
# :timeout: 3
|
61
|
+
|
62
|
+
# :log_path: /var/log/socky.log
|
63
|
+
# :pid_path: /var/run/socky.pid
|
55
64
|
EOF
|
56
65
|
end
|
57
66
|
|
data/lib/socky/options/parser.rb
CHANGED
@@ -29,9 +29,27 @@ module Socky
|
|
29
29
|
result[:port] = port
|
30
30
|
end
|
31
31
|
|
32
|
+
opts.on("-s", "--secure", "Run in wss/ssl mode") do
|
33
|
+
result[:secure] = true
|
34
|
+
end
|
35
|
+
|
36
|
+
opts.separator ""; opts.separator "Daemonization:"
|
37
|
+
|
38
|
+
opts.on("-d", "--daemon", "Daemonize mode") do
|
39
|
+
result[:daemonize] = true
|
40
|
+
end
|
41
|
+
|
42
|
+
opts.on("-P", "--pid FILE", String, "Path to PID file when using -d option") do |path|
|
43
|
+
result[:pid_path] = File.expand_path(path)
|
44
|
+
end
|
45
|
+
|
46
|
+
opts.on("-k", "--kill", "Kill daemon from specified pid file path") do
|
47
|
+
result[:kill] = true
|
48
|
+
end
|
49
|
+
|
32
50
|
opts.separator ""; opts.separator "Logging:"
|
33
51
|
|
34
|
-
opts.on("-l", "--log FILE", String, "Path to print debugging information.", "(
|
52
|
+
opts.on("-l", "--log FILE", String, "Path to print debugging information.", "(Print to STDOUT if empty)") do |path|
|
35
53
|
result[:log_path] = File.expand_path(path)
|
36
54
|
end
|
37
55
|
|
data/lib/socky/runner.rb
CHANGED
@@ -5,7 +5,14 @@ module Socky
|
|
5
5
|
class << self
|
6
6
|
def run(argv = ARGV)
|
7
7
|
server = self.new(argv)
|
8
|
-
|
8
|
+
|
9
|
+
if options[:kill]
|
10
|
+
server.kill_pid
|
11
|
+
elsif options[:daemonize]
|
12
|
+
server.daemonize
|
13
|
+
else
|
14
|
+
server.start
|
15
|
+
end
|
9
16
|
end
|
10
17
|
end
|
11
18
|
|
@@ -21,8 +28,8 @@ module Socky
|
|
21
28
|
trap("TERM") { stop }
|
22
29
|
trap("INT") { stop }
|
23
30
|
|
24
|
-
EventMachine::start_server("0.0.0.0", options[:port],
|
25
|
-
|
31
|
+
EventMachine::start_server("0.0.0.0", options[:port], EventMachine::WebSocket::Connection,
|
32
|
+
:debug => options[:deep_debug], :secure => options[:secure]) do |ws|
|
26
33
|
|
27
34
|
connection = Socky::Connection.new(ws)
|
28
35
|
ws.onopen { connection.subscribe }
|
@@ -40,5 +47,38 @@ module Socky
|
|
40
47
|
EventMachine.stop
|
41
48
|
end
|
42
49
|
|
50
|
+
def store_pid(pid)
|
51
|
+
FileUtils.mkdir_p(File.dirname(pid_path))
|
52
|
+
File.open(pid_path, 'w'){|f| f.write("#{pid}\n")}
|
53
|
+
rescue => e
|
54
|
+
puts e
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
|
58
|
+
def daemonize
|
59
|
+
fork do
|
60
|
+
Process.setsid
|
61
|
+
exit if fork
|
62
|
+
store_pid(Process.pid)
|
63
|
+
# Dir.chdir "/" # Mucks up logs
|
64
|
+
File.umask 0000
|
65
|
+
STDIN.reopen "/dev/null"
|
66
|
+
STDOUT.reopen "/dev/null", "a"
|
67
|
+
STDERR.reopen STDOUT
|
68
|
+
start
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def kill_pid
|
73
|
+
begin
|
74
|
+
pid = IO.read(pid_path).chomp.to_i
|
75
|
+
FileUtils.rm pid_path
|
76
|
+
Process.kill(9, pid)
|
77
|
+
puts "killed PID: #{pid}"
|
78
|
+
rescue => e
|
79
|
+
puts e
|
80
|
+
end
|
81
|
+
exit
|
82
|
+
end
|
43
83
|
end
|
44
84
|
end
|
data/spec/files/default.yml
CHANGED
@@ -5,6 +5,9 @@ describe Socky::Connection::Authentication do
|
|
5
5
|
|
6
6
|
context "instance" do
|
7
7
|
context "#subscribe_request" do
|
8
|
+
before(:each) do
|
9
|
+
stub!(:admin).and_return(false)
|
10
|
+
end
|
8
11
|
it "should not call #send_subscribe_request if already authenticated" do
|
9
12
|
stub!(:authenticated?).and_return(true)
|
10
13
|
should_not_receive(:send_subscribe_request)
|
@@ -29,7 +32,6 @@ describe Socky::Connection::Authentication do
|
|
29
32
|
authenticated_by_url?.should be_true
|
30
33
|
end
|
31
34
|
it "should disconnect if #send_subscribe_request block is false" do
|
32
|
-
stub!(:admin).and_return(false)
|
33
35
|
stub!(:send_subscribe_request).and_yield(false)
|
34
36
|
should_receive(:disconnect)
|
35
37
|
subscribe_request
|
@@ -75,14 +77,21 @@ describe Socky::Connection::Authentication do
|
|
75
77
|
end
|
76
78
|
end
|
77
79
|
context "#authenticate_as_admin" do
|
78
|
-
it "should return true if
|
79
|
-
stub!(:
|
80
|
+
it "should return true if client secret is equal server secret" do
|
81
|
+
stub!(:secret).and_return("test")
|
82
|
+
Socky.stub!(:options).and_return({:secret => "test"})
|
80
83
|
authenticate_as_admin.should be_true
|
81
84
|
end
|
82
|
-
it "should return false if not
|
83
|
-
stub!(:
|
85
|
+
it "should return false if client secret is not equal server secret" do
|
86
|
+
stub!(:secret).and_return("abstract")
|
87
|
+
Socky.stub!(:options).and_return({:secret => "test"})
|
84
88
|
authenticate_as_admin.should be_false
|
85
89
|
end
|
90
|
+
it "should return true if server secret is nil" do
|
91
|
+
stub!(:secret).and_return("abstract")
|
92
|
+
Socky.stub!(:options).and_return({:secret => nil})
|
93
|
+
authenticate_as_admin.should be_true
|
94
|
+
end
|
86
95
|
end
|
87
96
|
it "#authenticate_as_user should call #authenticated_by_url?" do
|
88
97
|
should_receive(:authenticated_by_url?)
|
@@ -37,6 +37,10 @@ describe Socky::Connection do
|
|
37
37
|
@connection.admin.should be_false
|
38
38
|
end
|
39
39
|
end
|
40
|
+
it "should return false if socket request data is nil" do
|
41
|
+
@connection.socket.request["Query"] = nil
|
42
|
+
@connection.admin.should be_false
|
43
|
+
end
|
40
44
|
end
|
41
45
|
it "#client should return client_id from socket request data" do
|
42
46
|
@connection.socket.request["Query"]["client_id"] = "abstract"
|
@@ -92,11 +96,15 @@ describe Socky::Connection do
|
|
92
96
|
@connection.process_message("abstract")
|
93
97
|
end
|
94
98
|
end
|
95
|
-
it "#send_message should
|
96
|
-
@connection.
|
97
|
-
@connection.socket.should_receive(:send).with("abstract")
|
99
|
+
it "#send_message should call #send_data with hashed form of message" do
|
100
|
+
@connection.should_receive(:send_data).with({:type => :message, :body => "abstract"})
|
98
101
|
@connection.send_message("abstract")
|
99
102
|
end
|
103
|
+
it "#send_data should send message by socket in json format" do
|
104
|
+
@connection.socket.stub!(:send)
|
105
|
+
@connection.socket.should_receive(:send).with({:test => "abstract"}.to_json)
|
106
|
+
@connection.send_data({:test => "abstract"})
|
107
|
+
end
|
100
108
|
it "#disconnect should close connection after writing" do
|
101
109
|
@connection.socket.stub!(:close_connection_after_writing)
|
102
110
|
@connection.socket.should_receive(:close_connection_after_writing)
|
data/spec/socky/message_spec.rb
CHANGED
@@ -47,61 +47,31 @@ describe Socky::Message do
|
|
47
47
|
context "instance" do
|
48
48
|
before(:each) { @message = described_class.new(@connection, {}.to_json) }
|
49
49
|
context "#process" do
|
50
|
-
before(:each) do
|
51
|
-
@message.stub!(:verify_secret!)
|
52
|
-
@message.stub!(:execute)
|
53
|
-
end
|
54
|
-
it "should verify secret" do
|
55
|
-
@message.should_receive(:verify_secret!)
|
56
|
-
@message.process
|
57
|
-
end
|
58
|
-
it "should execute" do
|
59
|
-
@message.should_receive(:execute)
|
60
|
-
@message.process
|
61
|
-
end
|
62
|
-
end
|
63
|
-
context "#verify_secret!" do
|
64
|
-
it "should not raise error if socky option :secret is nil" do
|
65
|
-
Socky.stub!(:options).and_return({:secret => nil})
|
66
|
-
lambda{ @message.verify_secret! }.should_not raise_error Socky::SockyError
|
67
|
-
end
|
68
|
-
it "should raise error if socky options :secret is not nil but message secret have different value" do
|
69
|
-
Socky.stub!(:options).and_return({:secret => "test"})
|
70
|
-
@message.stub!(:options).and_return({:secret => "another"})
|
71
|
-
lambda{ @message.verify_secret! }.should raise_error Socky::SockyError
|
72
|
-
end
|
73
|
-
it "should not raise error if socky options :secret is not nil and message secret have the some value" do
|
74
|
-
Socky.stub!(:options).and_return({:secret => "test"})
|
75
|
-
@message.stub!(:params).and_return({:secret => "test"})
|
76
|
-
lambda{ @message.verify_secret! }.should_not raise_error Socky::SockyError
|
77
|
-
end
|
78
|
-
end
|
79
|
-
context "#execute" do
|
80
50
|
it "should call #broadcast if message command is :broadcast" do
|
81
51
|
@message.stub!(:params).and_return({:command => :broadcast})
|
82
52
|
@message.stub!(:broadcast)
|
83
53
|
@message.should_receive(:broadcast)
|
84
|
-
@message.
|
54
|
+
@message.process
|
85
55
|
end
|
86
56
|
it "should not distinguish between string and symbol in command" do
|
87
57
|
@message.stub!(:params).and_return({:command => 'broadcast'})
|
88
58
|
@message.stub!(:broadcast)
|
89
59
|
@message.should_receive(:broadcast)
|
90
|
-
@message.
|
60
|
+
@message.process
|
91
61
|
end
|
92
62
|
it "should call #query if message command is :query" do
|
93
63
|
@message.stub!(:params).and_return({:command => :query})
|
94
64
|
@message.stub!(:query)
|
95
65
|
@message.should_receive(:query)
|
96
|
-
@message.
|
66
|
+
@message.process
|
97
67
|
end
|
98
68
|
it "should raise error if message command is nil" do
|
99
69
|
@message.stub!(:params).and_return({:command => nil})
|
100
|
-
lambda {@message.
|
70
|
+
lambda {@message.process}.should raise_error Socky::SockyError
|
101
71
|
end
|
102
72
|
it "should raise error if message command is neither :broadcast nor :query" do
|
103
73
|
@message.stub!(:params).and_return({:command => "invalid"})
|
104
|
-
lambda {@message.
|
74
|
+
lambda {@message.process}.should raise_error Socky::SockyError
|
105
75
|
end
|
106
76
|
end
|
107
77
|
context "#broadcast" do
|
@@ -250,10 +220,6 @@ describe Socky::Message do
|
|
250
220
|
@connection.should_receive(:send_message)
|
251
221
|
@message.respond({:test => true})
|
252
222
|
end
|
253
|
-
it "should convert message to json" do
|
254
|
-
@connection.should_receive(:send_message).with({:test => true}.to_json)
|
255
|
-
@message.respond({:test => true})
|
256
|
-
end
|
257
223
|
end
|
258
224
|
|
259
225
|
end
|
@@ -18,6 +18,10 @@ describe Socky::Options::Config do
|
|
18
18
|
described_class.should_receive(:puts).with("Provided config file is invalid.")
|
19
19
|
lambda { described_class.read(FILES_DIR + "/invalid.yml") }.should raise_error SystemExit
|
20
20
|
end
|
21
|
+
it "should not raise error if :kill option is provided" do
|
22
|
+
described_class.should_not_receive(:puts).with("Provided config file is invalid.")
|
23
|
+
lambda { described_class.read(FILES_DIR + "/invalid.yml", :kill => true) }.should_not raise_error SystemExit
|
24
|
+
end
|
21
25
|
it "should return valid options if file is valid" do
|
22
26
|
lambda { described_class.read(FILES_DIR + "/default.yml") }.should_not raise_error SystemExit
|
23
27
|
described_class.read(FILES_DIR + "/default.yml").should eql(default_options)
|
@@ -55,13 +59,16 @@ describe Socky::Options::Config do
|
|
55
59
|
end
|
56
60
|
end
|
57
61
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
62
|
+
|
63
|
+
def default_options
|
64
|
+
{
|
65
|
+
:port => 8080,
|
66
|
+
:debug => false,
|
67
|
+
:subscribe_url => "http://localhost:3000/socky/subscribe",
|
68
|
+
:unsubscribe_url => "http://localhost:3000/socky/unsubscribe",
|
69
|
+
:secret => "my_secret_key",
|
70
|
+
:secure => false
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
67
74
|
end
|
@@ -28,7 +28,24 @@ describe Socky::Options::Parser do
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
it "on -p or --port should set port" do
|
31
|
-
|
31
|
+
["-p","--port"].each do |function|
|
32
|
+
described_class.parse([function,"222"]).should eql({:port => 222})
|
33
|
+
end
|
34
|
+
end
|
35
|
+
it "on -s or --secure should set secure mode on" do
|
36
|
+
["-s","--secure"].each do |function|
|
37
|
+
described_class.parse([function]).should eql({:secure => true})
|
38
|
+
end
|
39
|
+
end
|
40
|
+
it "on -P or --pid should set pid_path to provided path" do
|
41
|
+
["-P","--pid"].each do |function|
|
42
|
+
described_class.parse([function,"/tmp/socky.pid"]).should eql({:pid_path => "/tmp/socky.pid"})
|
43
|
+
end
|
44
|
+
end
|
45
|
+
it "on -d or --daemon should set daemon mode on" do
|
46
|
+
["-d","--daemon"].each do |function|
|
47
|
+
described_class.parse([function]).should eql({:daemonize => true})
|
48
|
+
end
|
32
49
|
end
|
33
50
|
it "on -l or --log should set log_path to provided path" do
|
34
51
|
["-l","--log"].each do |function|
|
data/spec/socky/options_spec.rb
CHANGED
@@ -20,46 +20,41 @@ describe Socky::Options do
|
|
20
20
|
Socky::Options.prepare([:a,:b,:c])
|
21
21
|
end
|
22
22
|
it "should call read_config with patch" do
|
23
|
-
Socky::Options::Config.should_receive(:read).with("/var/run/socky.yml")
|
23
|
+
Socky::Options::Config.should_receive(:read).with("/var/run/socky.yml", :kill => nil)
|
24
24
|
Socky::Options.prepare([])
|
25
25
|
end
|
26
26
|
it "should set Socky options to default hash when parse_options and read_config don't do anything" do
|
27
27
|
Socky::Options.prepare([])
|
28
|
-
Socky.options.should eql(
|
29
|
-
:log_path=>"/var/run/socky.log",
|
30
|
-
:debug=>false,
|
31
|
-
:deep_debug=>false,
|
32
|
-
:config_path=>"/var/run/socky.yml"})
|
28
|
+
Socky.options.should eql(default_options)
|
33
29
|
end
|
34
30
|
it "should value parse_options over default values" do
|
35
31
|
Socky::Options::Parser.stub!(:parse).and_return(:log_path => "parsed")
|
36
32
|
Socky::Options.prepare([])
|
37
|
-
Socky.options.should eql(
|
38
|
-
:log_path=>"parsed",
|
39
|
-
:debug=>false,
|
40
|
-
:deep_debug=>false,
|
41
|
-
:config_path=>"/var/run/socky.yml"})
|
33
|
+
Socky.options.should eql(default_options.merge(:log_path=>"parsed"))
|
42
34
|
end
|
43
35
|
it "should value read_config over default values" do
|
44
36
|
Socky::Options::Config.stub!(:read).and_return(:log_path => "from config")
|
45
37
|
Socky::Options.prepare([])
|
46
|
-
Socky.options.should eql(
|
47
|
-
:log_path=>"from config",
|
48
|
-
:debug=>false,
|
49
|
-
:deep_debug=>false,
|
50
|
-
:config_path=>"/var/run/socky.yml"})
|
38
|
+
Socky.options.should eql(default_options.merge(:log_path=>"from config"))
|
51
39
|
end
|
52
40
|
it "should value parse_options over read_config" do
|
53
41
|
Socky::Options::Config.stub!(:read).and_return(:log_path => "from config")
|
54
42
|
Socky::Options::Parser.stub!(:parse).and_return(:log_path => "parsed")
|
55
43
|
Socky::Options.prepare([])
|
56
|
-
Socky.options.should eql(
|
57
|
-
:log_path=>"parsed",
|
58
|
-
:debug=>false,
|
59
|
-
:deep_debug=>false,
|
60
|
-
:config_path=>"/var/run/socky.yml"})
|
44
|
+
Socky.options.should eql(default_options.merge(:log_path=>"parsed"))
|
61
45
|
end
|
62
46
|
end
|
63
47
|
end
|
48
|
+
|
49
|
+
def default_options
|
50
|
+
{
|
51
|
+
:port => 8080,
|
52
|
+
:log_path => nil,
|
53
|
+
:debug => false,
|
54
|
+
:deep_debug => false,
|
55
|
+
:secure => false,
|
56
|
+
:config_path => "/var/run/socky.yml"
|
57
|
+
}
|
58
|
+
end
|
64
59
|
|
65
60
|
end
|
data/spec/socky/runner_spec.rb
CHANGED
@@ -12,10 +12,21 @@ describe Socky::Runner do
|
|
12
12
|
described_class.should_receive(:new).with("some args")
|
13
13
|
described_class.run("some args")
|
14
14
|
end
|
15
|
-
it "should call #start on new instance of self" do
|
15
|
+
it "should call #start on new instance of self if daemonize option is false" do
|
16
|
+
Socky.stub(:options).and_return({:daemonize => false})
|
16
17
|
@server.should_receive(:start)
|
17
18
|
described_class.run
|
18
19
|
end
|
20
|
+
it "should call #daemonize on new instance of self if daemonize option is true" do
|
21
|
+
Socky.stub(:options).and_return({:daemonize => true})
|
22
|
+
@server.should_receive(:daemonize)
|
23
|
+
described_class.run
|
24
|
+
end
|
25
|
+
it "should call #kill_pid on new instance of self if kill option is true" do
|
26
|
+
Socky.stub(:options).and_return({:kill => true})
|
27
|
+
@server.should_receive(:kill_pid)
|
28
|
+
described_class.run
|
29
|
+
end
|
19
30
|
end
|
20
31
|
context "#new" do
|
21
32
|
it "should prepare options from args" do
|
data/spec/socky_spec.rb
CHANGED
@@ -50,9 +50,8 @@ describe Socky do
|
|
50
50
|
Socky.logger = nil
|
51
51
|
end
|
52
52
|
end
|
53
|
-
it "should have default log path" do
|
54
|
-
Socky.log_path.
|
55
|
-
Socky.log_path.should eql("/var/run/socky.log")
|
53
|
+
it "should not have default log path" do
|
54
|
+
Socky.log_path.should be_nil
|
56
55
|
end
|
57
56
|
it "should be able to change log path by settion log_path option" do
|
58
57
|
Socky.stub!(:options).and_return({:log_path => "abstract"})
|
@@ -68,6 +67,14 @@ describe Socky do
|
|
68
67
|
Socky.options = {}
|
69
68
|
end
|
70
69
|
end
|
70
|
+
it "should have default pid path" do
|
71
|
+
Socky.pid_path.should_not be_nil
|
72
|
+
Socky.pid_path.should eql("/var/run/socky.pid")
|
73
|
+
end
|
74
|
+
it "should be able to change pid path by settion pid_path option" do
|
75
|
+
Socky.stub!(:options).and_return({:pid_path => "abstract"})
|
76
|
+
Socky.pid_path.should eql("abstract")
|
77
|
+
end
|
71
78
|
it "should have default config path" do
|
72
79
|
Socky.config_path.should_not be_nil
|
73
80
|
Socky.config_path.should eql("/var/run/socky.yml")
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 9
|
9
|
+
version: 0.0.9
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Bernard Potocki
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-06-
|
17
|
+
date: 2010-06-20 00:00:00 +02:00
|
18
18
|
default_executable: socky
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -26,9 +26,9 @@ dependencies:
|
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
segments:
|
28
28
|
- 0
|
29
|
-
-
|
30
|
-
-
|
31
|
-
version: 0.
|
29
|
+
- 1
|
30
|
+
- 2
|
31
|
+
version: 0.1.2
|
32
32
|
type: :runtime
|
33
33
|
version_requirements: *id001
|
34
34
|
- !ruby/object:Gem::Dependency
|