strelka 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/ChangeLog +156 -9
  4. data/History.rdoc +15 -0
  5. data/IDEAS.rdoc +17 -1
  6. data/MILESTONES.rdoc +1 -1
  7. data/Manifest.txt +10 -2
  8. data/Plugins.rdoc +4 -4
  9. data/README.rdoc +3 -3
  10. data/Rakefile +5 -4
  11. data/bin/strelka +19 -10
  12. data/contrib/hoetemplate/data/project/apps/file_name_app +1 -0
  13. data/contrib/hoetemplate/lib/file_name.rb.erb +3 -2
  14. data/examples/apps/hello-world +1 -0
  15. data/examples/apps/ws-chat +69 -0
  16. data/examples/apps/ws-echo +61 -0
  17. data/examples/gen-config.rb +6 -5
  18. data/lib/strelka/app/auth.rb +2 -2
  19. data/lib/strelka/app/errors.rb +1 -1
  20. data/lib/strelka/app/filters.rb +3 -2
  21. data/lib/strelka/app/negotiation.rb +2 -2
  22. data/lib/strelka/app/parameters.rb +1 -2
  23. data/lib/strelka/app/restresources.rb +3 -2
  24. data/lib/strelka/app/routing.rb +1 -1
  25. data/lib/strelka/app/sessions.rb +2 -2
  26. data/lib/strelka/app/templating.rb +7 -3
  27. data/lib/strelka/app.rb +5 -145
  28. data/lib/strelka/behavior/plugin.rb +4 -4
  29. data/lib/strelka/discovery.rb +211 -0
  30. data/lib/strelka/httprequest.rb +1 -0
  31. data/lib/strelka/httpresponse/negotiation.rb +7 -1
  32. data/lib/strelka/mixins.rb +4 -1
  33. data/lib/strelka/paramvalidator.rb +1 -1
  34. data/lib/strelka/plugins.rb +8 -6
  35. data/lib/strelka/websocketserver/routing.rb +116 -0
  36. data/lib/strelka/websocketserver.rb +147 -0
  37. data/lib/strelka.rb +5 -4
  38. data/spec/{lib/constants.rb → constants.rb} +3 -2
  39. data/spec/{lib/helpers.rb → helpers.rb} +15 -14
  40. data/spec/strelka/app/auth_spec.rb +145 -142
  41. data/spec/strelka/app/errors_spec.rb +20 -26
  42. data/spec/strelka/app/filters_spec.rb +67 -54
  43. data/spec/strelka/app/negotiation_spec.rb +8 -14
  44. data/spec/strelka/app/parameters_spec.rb +23 -29
  45. data/spec/strelka/app/restresources_spec.rb +98 -100
  46. data/spec/strelka/app/routing_spec.rb +57 -57
  47. data/spec/strelka/app/sessions_spec.rb +11 -17
  48. data/spec/strelka/app/templating_spec.rb +36 -40
  49. data/spec/strelka/app_spec.rb +48 -147
  50. data/spec/strelka/authprovider/basic_spec.rb +5 -11
  51. data/spec/strelka/authprovider/hostaccess_spec.rb +9 -15
  52. data/spec/strelka/authprovider_spec.rb +3 -9
  53. data/spec/strelka/cookie_spec.rb +32 -38
  54. data/spec/strelka/cookieset_spec.rb +31 -37
  55. data/spec/strelka/discovery_spec.rb +144 -0
  56. data/spec/strelka/exceptions_spec.rb +2 -8
  57. data/spec/strelka/httprequest/acceptparams_spec.rb +74 -83
  58. data/spec/strelka/httprequest/auth_spec.rb +5 -15
  59. data/spec/strelka/httprequest/negotiation_spec.rb +93 -103
  60. data/spec/strelka/httprequest/session_spec.rb +12 -22
  61. data/spec/strelka/httprequest_spec.rb +1 -7
  62. data/spec/strelka/httpresponse/negotiation_spec.rb +84 -76
  63. data/spec/strelka/httpresponse/session_spec.rb +25 -35
  64. data/spec/strelka/httpresponse_spec.rb +20 -26
  65. data/spec/strelka/mixins_spec.rb +66 -61
  66. data/spec/strelka/multipartparser_spec.rb +31 -37
  67. data/spec/strelka/paramvalidator_spec.rb +389 -373
  68. data/spec/strelka/plugins_spec.rb +17 -23
  69. data/spec/strelka/router/default_spec.rb +32 -38
  70. data/spec/strelka/router/exclusive_spec.rb +28 -34
  71. data/spec/strelka/router_spec.rb +2 -8
  72. data/spec/strelka/session/db_spec.rb +17 -15
  73. data/spec/strelka/session/default_spec.rb +22 -28
  74. data/spec/strelka/session_spec.rb +3 -9
  75. data/spec/strelka/websocketserver/routing_spec.rb +119 -0
  76. data/spec/strelka/websocketserver_spec.rb +149 -0
  77. data/spec/strelka_spec.rb +11 -13
  78. data.tar.gz.sig +3 -3
  79. metadata +22 -14
  80. metadata.gz.sig +0 -0
@@ -1,16 +1,10 @@
1
1
  # -*- rspec -*-
2
2
  # vim: set nosta noet ts=4 sw=4:
3
3
 
4
- BEGIN {
5
- require 'pathname'
6
- basedir = Pathname.new( __FILE__ ).dirname.parent.parent.parent
7
- $LOAD_PATH.unshift( basedir ) unless $LOAD_PATH.include?( basedir )
8
- }
4
+ require_relative '../../helpers'
9
5
 
10
6
  require 'rspec'
11
7
 
12
- require 'spec/lib/helpers'
13
-
14
8
  require 'strelka'
15
9
  require 'strelka/session/default'
16
10
 
@@ -43,13 +37,13 @@ describe Strelka::Session::Default do
43
37
  original = Strelka::Session.create( 'default', 'the_session_id' )
44
38
  copy = original.dup
45
39
  copy[:foom] = 1
46
- original[:foom].should == {}
40
+ expect( original[:foom] ).to eq( {} )
47
41
  end
48
42
 
49
43
 
50
44
  it "can be configured to store its session ID in a different cookie" do
51
45
  described_class.configure( :cookie_name => 'buh-mahlon' )
52
- described_class.cookie_name.should == 'buh-mahlon'
46
+ expect( described_class.cookie_name ).to eq( 'buh-mahlon' )
53
47
  end
54
48
 
55
49
  it "can load sessions from and save sessions to its in-memory store" do
@@ -57,26 +51,26 @@ describe Strelka::Session::Default do
57
51
  described_class.save_session_data( 'the_key', session_data )
58
52
 
59
53
  loaded = described_class.load_session_data( 'the_key' )
60
- loaded.should_not equal( session_data )
61
- loaded.should == session_data
54
+ expect( loaded ).to_not equal( session_data )
55
+ expect( loaded ).to eq( session_data )
62
56
  end
63
57
 
64
58
  it "generates a session-id if one isn't available in the request" do
65
59
  req = @request_factory.get( '/hungry/what-is-in-a-fruit-bowl?' )
66
- described_class.get_session_id( req ).should =~ /^[[:xdigit:]]+$/
60
+ expect( described_class.get_session_id(req) ).to match( /^[[:xdigit:]]+$/ )
67
61
  end
68
62
 
69
63
  it "rejects invalid session-ids" do
70
64
  session_cookie = "%s=gibberish" % [ @cookie_name ]
71
65
  req = @request_factory.get( '/hungry/what-is-in-a-fruit-bowl?', :cookie => session_cookie )
72
- described_class.get_session_id( req ).should =~ /^[[:xdigit:]]+$/
66
+ expect( described_class.get_session_id(req) ).to match( /^[[:xdigit:]]+$/ )
73
67
  end
74
68
 
75
69
  it "accepts and reuses an existing valid session-id" do
76
70
  session_id = '3422067061a5790be374c81118d9ed3f'
77
71
  session_cookie = "%s=%s" % [ @cookie_name, session_id ]
78
72
  req = @request_factory.get( '/hungry/what-is-in-a-fruit-bowl?', :cookie => session_cookie )
79
- described_class.get_session_id( req ).should == session_id
73
+ expect( described_class.get_session_id(req) ).to eq( session_id )
80
74
  end
81
75
 
82
76
  it "knows that a request has a session if it has a cookie with an existing session id" do
@@ -84,7 +78,7 @@ describe Strelka::Session::Default do
84
78
  described_class.sessions[ session_id ] = {}
85
79
  session_cookie = "%s=%s" % [ @cookie_name, session_id ]
86
80
  req = @request_factory.get( '/hungry/what-is-in-a-fruit-bowl?', :cookie => session_cookie )
87
- described_class.should have_session_for( req )
81
+ expect( described_class ).to have_session_for( req )
88
82
  end
89
83
 
90
84
  it "can save itself to the store and set the response's session ID" do
@@ -96,8 +90,8 @@ describe Strelka::Session::Default do
96
90
 
97
91
  session.save( response )
98
92
 
99
- described_class.sessions.should == { session_id => session_data }
100
- response.header_data.should =~ /Set-Cookie: #{@cookie_name}=#{session_id}/i
93
+ expect( described_class.sessions ).to eq( { session_id => session_data } )
94
+ expect( response.header_data ).to match( /Set-Cookie: #{@cookie_name}=#{session_id}/i )
101
95
  end
102
96
 
103
97
  it "can remove itself from the store and expire the response's session ID" do
@@ -109,8 +103,8 @@ describe Strelka::Session::Default do
109
103
 
110
104
  session.destroy( response )
111
105
 
112
- described_class.sessions.should_not include({ session_id => session_data })
113
- response.header_data.should =~ /Set-Cookie: #{@cookie_name}=#{session_id}/i
106
+ expect( described_class.sessions ).to_not include({ session_id => session_data })
107
+ expect( response.header_data ).to match( /Set-Cookie: #{@cookie_name}=#{session_id}/i )
114
108
  end
115
109
 
116
110
  describe "with no namespace set (the 'nil' namespace)" do
@@ -134,8 +128,8 @@ describe Strelka::Session::Default do
134
128
 
135
129
  subject.namespace = nil
136
130
 
137
- subject[:foo][:number].should == 18
138
- subject[:bar][:number].should == 28
131
+ expect( subject[:foo][:number] ).to eq( 18 )
132
+ expect( subject[:bar][:number] ).to eq( 28 )
139
133
  end
140
134
 
141
135
  it "accesses namespaces via a struct-like interface" do
@@ -145,9 +139,9 @@ describe Strelka::Session::Default do
145
139
  subject.testkey = true
146
140
  subject.namespace = nil
147
141
 
148
- subject.meat[ :testkey ].should be_true
149
- subject.greet[ :testkey ].should be_true
150
- subject.pork[ :testkey ].should be_nil
142
+ expect( subject.meat[ :testkey ] ).to be_true
143
+ expect( subject.greet[ :testkey ] ).to be_true
144
+ expect( subject.pork[ :testkey ] ).to be_nil
151
145
  end
152
146
  end
153
147
 
@@ -169,15 +163,15 @@ describe Strelka::Session::Default do
169
163
  subject[:number] = 18
170
164
  subject[:not_a_number] = 'woo'
171
165
 
172
- subject[:number].should == 18
173
- subject[:not_a_number].should == 'woo'
166
+ expect( subject[:number] ).to eq( 18 )
167
+ expect( subject[:not_a_number] ).to eq( 'woo' )
174
168
  end
175
169
 
176
170
  it "accesses values via a struct-like interface" do
177
171
  subject.testkey = true
178
172
 
179
- subject.testkey.should be_true
180
- subject.i_do_not_exist.should be_nil
173
+ expect( subject.testkey ).to be_true
174
+ expect( subject.i_do_not_exist ).to be_nil
181
175
  end
182
176
  end
183
177
 
@@ -1,16 +1,10 @@
1
1
  # -*- rspec -*-
2
2
  # vim: set nosta noet ts=4 sw=4:
3
3
 
4
- BEGIN {
5
- require 'pathname'
6
- basedir = Pathname.new( __FILE__ ).dirname.parent.parent
7
- $LOAD_PATH.unshift( basedir ) unless $LOAD_PATH.include?( basedir )
8
- }
4
+ require_relative '../helpers'
9
5
 
10
6
  require 'rspec'
11
7
 
12
- require 'spec/lib/helpers'
13
-
14
8
  require 'strelka'
15
9
  require 'strelka/session'
16
10
 
@@ -32,7 +26,7 @@ describe Strelka::Session do
32
26
 
33
27
 
34
28
  it "looks for plugins under strelka/session" do
35
- described_class.plugin_prefixes.should include( 'strelka/session' )
29
+ expect( described_class.plugin_prefixes ).to include( 'strelka/session' )
36
30
  end
37
31
 
38
32
 
@@ -50,7 +44,7 @@ describe Strelka::Session do
50
44
 
51
45
  it "can be asked to load an instance of itself by session ID" do
52
46
  # By default, loading always fails
53
- described_class.load( 'the_session_id' ).should be_nil()
47
+ expect( described_class.load( 'the_session_id' ) ).to be_nil()
54
48
  end
55
49
 
56
50
 
@@ -0,0 +1,119 @@
1
+ # -*- ruby -*-
2
+ # vim: set nosta noet ts=4 sw=4:
3
+ # encoding: utf-8
4
+
5
+ require_relative '../../helpers'
6
+
7
+ require 'rspec'
8
+
9
+ require 'strelka'
10
+ require 'strelka/plugins'
11
+ require 'strelka/websocketserver/routing'
12
+
13
+ require 'strelka/behavior/plugin'
14
+
15
+
16
+ #####################################################################
17
+ ### C O N T E X T S
18
+ #####################################################################
19
+
20
+ describe Strelka::WebSocketServer::Routing do
21
+
22
+ before( :all ) do
23
+ setup_logging()
24
+ @frame_factory = Mongrel2::WebSocketFrameFactory.new( route: '/chat' )
25
+ end
26
+
27
+ after( :all ) do
28
+ reset_logging()
29
+ end
30
+
31
+
32
+ it_should_behave_like( "A Strelka Plugin" )
33
+
34
+
35
+ describe "an including App" do
36
+
37
+ before( :each ) do
38
+ @app = Class.new( Strelka::WebSocketServer ) do
39
+ plugin :routing
40
+ def initialize( appid='chat-test', sspec=TEST_SEND_SPEC, rspec=TEST_RECV_SPEC )
41
+ super
42
+ end
43
+ end
44
+ end
45
+
46
+
47
+ it "has an Hash of raw routes" do
48
+ expect( @app.op_callbacks ).to be_a( Hash )
49
+ end
50
+
51
+ it "knows what its route methods are" do
52
+ expect( @app.op_callbacks ).to eq( {} )
53
+ @app.class_eval do
54
+ on_text() {}
55
+ on_binary() {}
56
+ on_ping() {}
57
+ end
58
+
59
+ expect( @app.op_callbacks.keys ).to eq([ :text, :binary, :ping ])
60
+ end
61
+
62
+ it "allows the declaration of custom opcodes" do
63
+ @app.opcodes( 0x3 => :nick )
64
+ @app.class_eval do
65
+ on_nick() {}
66
+ end
67
+ expect( @app.op_callbacks ).to have( 1 ).member
68
+ expect( @app.op_callbacks[ :nick ] ).to be_a( UnboundMethod )
69
+ end
70
+
71
+
72
+ it "dispatches TEXT frames to a text handler if one is declared" do
73
+ @app.class_eval do
74
+ on_text do |frame|
75
+ res = frame.response
76
+ res.puts( "#{frame.body.read} Yep!" )
77
+ return res
78
+ end
79
+ end
80
+
81
+ frame = @frame_factory.text( "/chat", "Clowns?" )
82
+ response = @app.new.handle_websocket( frame )
83
+
84
+ expect( response ).to be_a( Mongrel2::WebSocket::Frame )
85
+ expect( response.opcode ).to eq( :text )
86
+ response.body.rewind
87
+ expect( response.body.read ).to eq( "Clowns? Yep!\n" )
88
+ end
89
+
90
+ it "dispatches custom frame type to its handler if one is declared" do
91
+ @app.class_eval do
92
+ opcodes 0xB => :refresh
93
+
94
+ on_refresh do |frame|
95
+ return frame.response
96
+ end
97
+ end
98
+
99
+ frame = @frame_factory.create( '/chat', '', 0xB )
100
+ response = @app.new.handle_websocket( frame )
101
+
102
+ expect( response ).to be_a( Mongrel2::WebSocket::Frame )
103
+ expect( response.opcode ).to eq( :reserved )
104
+ expect( response.numeric_opcode ).to eq( 0xB )
105
+ end
106
+
107
+
108
+ it "falls back to the defaults if a handler isn't declared for a frame" do
109
+ frame = @frame_factory.text( '/chat', '' )
110
+ response = @app.new.handle_websocket( frame )
111
+
112
+ expect( response ).to be_a( Mongrel2::WebSocket::Frame )
113
+ expect( response.opcode ).to eq( :close )
114
+ end
115
+
116
+ end
117
+
118
+ end
119
+
@@ -0,0 +1,149 @@
1
+ # -*- ruby -*-
2
+ # vim: set nosta noet ts=4 sw=4:
3
+ # encoding: utf-8
4
+
5
+ require_relative '../helpers'
6
+
7
+ require 'rspec'
8
+ require 'zmq'
9
+ require 'mongrel2'
10
+
11
+ require 'strelka'
12
+ require 'strelka/websocketserver'
13
+
14
+
15
+ #####################################################################
16
+ ### C O N T E X T S
17
+ #####################################################################
18
+
19
+ describe Strelka::WebSocketServer do
20
+
21
+ before( :all ) do
22
+ setup_logging( :fatal )
23
+ @initial_registry = described_class.loaded_plugins.dup
24
+ @frame_factory = Mongrel2::WebSocketFrameFactory.new( route: '/chat' )
25
+ Mongrel2::Config.db = Mongrel2::Config.in_memory_db
26
+ Mongrel2::Config.init_database
27
+
28
+ # Skip loading the 'strelka' gem, which probably doesn't exist in the right version
29
+ # in the dev environment
30
+ strelkaspec = make_gemspec( 'strelka', Strelka::VERSION, false )
31
+ loaded_specs = Gem.instance_variable_get( :@loaded_specs )
32
+ loaded_specs['strelka'] = strelkaspec
33
+
34
+ end
35
+
36
+ before( :each ) do
37
+ described_class.loaded_plugins.clear
38
+ @app = Class.new( described_class ) do
39
+ def initialize( appid=TEST_APPID, sspec=TEST_SEND_SPEC, rspec=TEST_RECV_SPEC )
40
+ super
41
+ end
42
+ def set_signal_handlers; end
43
+ def start_accepting_requests; end
44
+ def restore_signal_handlers; end
45
+ end
46
+ end
47
+
48
+ after( :each ) do
49
+ @app = nil
50
+ end
51
+
52
+ after( :all ) do
53
+ described_class.loaded_plugins = @initial_registry
54
+ reset_logging()
55
+ end
56
+
57
+
58
+ #
59
+ # Control frame defaults
60
+ #
61
+
62
+ it "returns a PONG for PING frames" do
63
+ ping = @frame_factory.ping( '/chat' )
64
+ res = @app.new.handle_websocket( ping )
65
+
66
+ expect( res ).to be_a( Mongrel2::WebSocket::Frame )
67
+ expect( res.opcode ).to eq( :pong )
68
+ expect( res.socket_id ).to eq( ping.socket_id )
69
+ end
70
+
71
+ it "ignores PONG frames" do
72
+ pong = @frame_factory.pong( '/chat' )
73
+ res = @app.new.handle_websocket( pong )
74
+
75
+ expect( res ).to be_nil()
76
+ end
77
+
78
+ it "closes the connection on CLOSE frames" do
79
+ app = @app.new
80
+ close = @frame_factory.close( '/chat' )
81
+
82
+ expect( app.conn ).to receive( :reply_close ).with( close )
83
+
84
+ res = app.handle_websocket( close )
85
+ expect( res ).to be_nil()
86
+ end
87
+
88
+ it "closes the connection with an appropriate error for reserved control opcodes" do
89
+ reserved = @frame_factory.create( '/chat', '', 0xB )
90
+ res = @app.new.handle_websocket( reserved )
91
+
92
+ expect( res ).to be_a( Mongrel2::WebSocket::Frame )
93
+ expect( res.opcode ).to eq( :close )
94
+ res.payload.rewind
95
+ expect( res.payload.read ).to match( /Unhandled data type/i )
96
+ expect( res.socket_id ).to eq( reserved.socket_id )
97
+ end
98
+
99
+ #
100
+ # Content frame defaults
101
+ #
102
+
103
+ it "replies with a close frame with a bad data type error for TEXT frames" do
104
+ app = @app.new
105
+ frame = @frame_factory.text( '/chat' )
106
+
107
+ res = app.handle_websocket( frame )
108
+ expect( res ).to be_a( Mongrel2::WebSocket::Frame )
109
+ expect( res.opcode ).to eq( :close )
110
+ res.payload.rewind
111
+ expect( res.payload.read ).to match( /Unhandled data type/i )
112
+ end
113
+
114
+ it "replies with a close frame with a bad data type error for BINARY frames" do
115
+ app = @app.new
116
+ frame = @frame_factory.binary( '/chat' )
117
+
118
+ res = app.handle_websocket( frame )
119
+ expect( res ).to be_a( Mongrel2::WebSocket::Frame )
120
+ expect( res.opcode ).to eq( :close )
121
+ res.payload.rewind
122
+ expect( res.payload.read ).to match( /Unhandled data type/i )
123
+ end
124
+
125
+ it "replies with a close frame with a bad data type error for CONTINUATION frames" do
126
+ app = @app.new
127
+ frame = @frame_factory.continuation( '/chat' )
128
+
129
+ res = app.handle_websocket( frame )
130
+ expect( res ).to be_a( Mongrel2::WebSocket::Frame )
131
+ expect( res.opcode ).to eq( :close )
132
+ res.payload.rewind
133
+ expect( res.payload.read ).to match( /Unhandled data type/i )
134
+ end
135
+
136
+ it "closes the connection with an appropriate error for reserved content opcodes" do
137
+ reserved = @frame_factory.create( '/chat', '', 0x3 )
138
+ res = @app.new.handle_websocket( reserved )
139
+
140
+ expect( res ).to be_a( Mongrel2::WebSocket::Frame )
141
+ expect( res.opcode ).to eq( :close )
142
+ res.payload.rewind
143
+ expect( res.payload.read ).to match( /Unhandled data type/i )
144
+ expect( res.socket_id ).to eq( reserved.socket_id )
145
+ end
146
+
147
+
148
+ end
149
+
data/spec/strelka_spec.rb CHANGED
@@ -1,13 +1,8 @@
1
1
  #!/usr/bin/env rspec -cfd -b
2
2
 
3
- BEGIN {
4
- require 'pathname'
5
- basedir = Pathname( __FILE__ ).dirname.parent
6
- $LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
7
- }
3
+ require_relative 'helpers'
8
4
 
9
5
  require 'rspec'
10
- require 'spec/lib/helpers'
11
6
  require 'strelka'
12
7
 
13
8
  describe Strelka do
@@ -23,24 +18,27 @@ describe Strelka do
23
18
 
24
19
  describe "version methods" do
25
20
  it "returns a version string if asked" do
26
- described_class.version_string.should =~ /\w+ [\d.]+/
21
+ expect( described_class.version_string ).to match( /\w+ [\d.]+/ )
27
22
  end
28
23
 
29
24
 
30
25
  it "returns a version string with a build number if asked" do
31
- described_class.version_string(true).should =~ /\w+ [\d.]+ \(build [[:xdigit:]]+\)/
26
+ expect( described_class.version_string(true) ).
27
+ to match(/\w+ [\d.]+ \(build [[:xdigit:]]+\)/)
32
28
  end
33
29
  end
34
30
 
35
31
  it "provides syntactic sugar for looking up an app class by name" do
36
32
  mox_app = nil
37
- Pathname.stub( :glob ).with( 'data/*/{apps,handlers}/**/*' ).
33
+ expect( Pathname ).to receive( :glob ).
34
+ with( 'data/*/{apps,handlers}/**/*' ).
38
35
  and_return([ Pathname('data/mox/apps/moxthefox') ])
39
- Kernel.stub( :load ).with( File.expand_path 'data/mox/apps/moxthefox' ).and_return do
40
- mox_app = Class.new( Strelka::App )
41
- end
42
36
 
43
- described_class::App( 'moxthefox' ).should == mox_app
37
+ expect( Kernel ).to receive( :load ).
38
+ with( File.expand_path 'data/mox/apps/moxthefox' ).
39
+ and_return { mox_app = Class.new(Strelka::App) }
40
+
41
+ expect( described_class::App('moxthefox') ).to be( mox_app )
44
42
  end
45
43
 
46
44
  end
data.tar.gz.sig CHANGED
@@ -1,3 +1,3 @@
1
- �3[�p�P�
2
- V�i�P�ư)閔�k�}���>�]U�^3��Tb E#�x|�#��DK��bh�����gM)ǰR�&8c
3
- J��}ǹY���X�
1
+ ���["*?(���7Pq Τļ�L �:��6�raa��]����T�s0��8�^����������P��$��/[� R�! \��>�g_�u�����Y@k��G��A
2
+ Fs;۬�q����p��j/@x_?�0�}��)ҍ�槦���c9*��5pi��ƮjZ�j�/w��X5<G[ F�莝���Ԑt�e�q����@�\��
3
+ 7|Mg�����n�^�l�/�!�-tb�1|�_
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strelka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mahlon E. Smith
@@ -31,7 +31,7 @@ cert_chain:
31
31
  6mKCwjpegytE0oifXfF8k75A9105cBnNiMZOe1tXiqYc/exCgWvbggurzDOcRkZu
32
32
  /YSusaiDXHKU2O3Akc3htA==
33
33
  -----END CERTIFICATE-----
34
- date: 2013-06-19 00:00:00.000000000 Z
34
+ date: 2013-11-08 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: configurability
@@ -109,14 +109,14 @@ dependencies:
109
109
  requirements:
110
110
  - - ~>
111
111
  - !ruby/object:Gem::Version
112
- version: '0.36'
112
+ version: '0.40'
113
113
  type: :runtime
114
114
  prerelease: false
115
115
  version_requirements: !ruby/object:Gem::Requirement
116
116
  requirements:
117
117
  - - ~>
118
118
  - !ruby/object:Gem::Version
119
- version: '0.36'
119
+ version: '0.40'
120
120
  - !ruby/object:Gem::Dependency
121
121
  name: pluggability
122
122
  requirement: !ruby/object:Gem::Requirement
@@ -235,28 +235,28 @@ dependencies:
235
235
  requirements:
236
236
  - - ~>
237
237
  - !ruby/object:Gem::Version
238
- version: '0.1'
238
+ version: '0.3'
239
239
  type: :development
240
240
  prerelease: false
241
241
  version_requirements: !ruby/object:Gem::Requirement
242
242
  requirements:
243
243
  - - ~>
244
244
  - !ruby/object:Gem::Version
245
- version: '0.1'
245
+ version: '0.3'
246
246
  - !ruby/object:Gem::Dependency
247
- name: rspec
247
+ name: hoe-bundler
248
248
  requirement: !ruby/object:Gem::Requirement
249
249
  requirements:
250
250
  - - ~>
251
251
  - !ruby/object:Gem::Version
252
- version: '0.14'
252
+ version: '1.2'
253
253
  type: :development
254
254
  prerelease: false
255
255
  version_requirements: !ruby/object:Gem::Requirement
256
256
  requirements:
257
257
  - - ~>
258
258
  - !ruby/object:Gem::Version
259
- version: '0.14'
259
+ version: '1.2'
260
260
  - !ruby/object:Gem::Dependency
261
261
  name: simplecov
262
262
  requirement: !ruby/object:Gem::Requirement
@@ -291,14 +291,14 @@ dependencies:
291
291
  requirements:
292
292
  - - ~>
293
293
  - !ruby/object:Gem::Version
294
- version: '3.5'
294
+ version: '3.7'
295
295
  type: :development
296
296
  prerelease: false
297
297
  version_requirements: !ruby/object:Gem::Requirement
298
298
  requirements:
299
299
  - - ~>
300
300
  - !ruby/object:Gem::Version
301
- version: '3.5'
301
+ version: '3.7'
302
302
  description: |-
303
303
  Strelka is a framework for creating and deploying
304
304
  Mongrel2[http://mongrel2.org/] web applications in Ruby.
@@ -352,6 +352,8 @@ files:
352
352
  - examples/apps/hello-world
353
353
  - examples/apps/sessions-demo
354
354
  - examples/apps/upload-demo
355
+ - examples/apps/ws-chat
356
+ - examples/apps/ws-echo
355
357
  - examples/config.yml
356
358
  - examples/gen-config.rb
357
359
  - examples/static/examples.css
@@ -380,6 +382,7 @@ files:
380
382
  - lib/strelka/constants.rb
381
383
  - lib/strelka/cookie.rb
382
384
  - lib/strelka/cookieset.rb
385
+ - lib/strelka/discovery.rb
383
386
  - lib/strelka/exceptions.rb
384
387
  - lib/strelka/httprequest.rb
385
388
  - lib/strelka/httprequest/acceptparams.rb
@@ -400,6 +403,9 @@ files:
400
403
  - lib/strelka/session/db.rb
401
404
  - lib/strelka/session/default.rb
402
405
  - lib/strelka/testing.rb
406
+ - lib/strelka/websocketserver.rb
407
+ - lib/strelka/websocketserver/routing.rb
408
+ - spec/constants.rb
403
409
  - spec/data/error.tmpl
404
410
  - spec/data/forms/2_images.form
405
411
  - spec/data/forms/singleupload.form
@@ -412,8 +418,7 @@ files:
412
418
  - spec/data/forms/testform_truncated_metadata.form
413
419
  - spec/data/layout.tmpl
414
420
  - spec/data/main.tmpl
415
- - spec/lib/constants.rb
416
- - spec/lib/helpers.rb
421
+ - spec/helpers.rb
417
422
  - spec/strelka/app/auth_spec.rb
418
423
  - spec/strelka/app/errors_spec.rb
419
424
  - spec/strelka/app/filters_spec.rb
@@ -429,6 +434,7 @@ files:
429
434
  - spec/strelka/authprovider_spec.rb
430
435
  - spec/strelka/cookie_spec.rb
431
436
  - spec/strelka/cookieset_spec.rb
437
+ - spec/strelka/discovery_spec.rb
432
438
  - spec/strelka/exceptions_spec.rb
433
439
  - spec/strelka/httprequest/acceptparams_spec.rb
434
440
  - spec/strelka/httprequest/auth_spec.rb
@@ -448,6 +454,8 @@ files:
448
454
  - spec/strelka/session/db_spec.rb
449
455
  - spec/strelka/session/default_spec.rb
450
456
  - spec/strelka/session_spec.rb
457
+ - spec/strelka/websocketserver/routing_spec.rb
458
+ - spec/strelka/websocketserver_spec.rb
451
459
  - spec/strelka_spec.rb
452
460
  homepage: http://deveiate.org/projects/Strelka
453
461
  licenses:
@@ -475,7 +483,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
475
483
  version: '0'
476
484
  requirements: []
477
485
  rubyforge_project: strelka
478
- rubygems_version: 2.0.3
486
+ rubygems_version: 2.1.10
479
487
  signing_key:
480
488
  specification_version: 4
481
489
  summary: Strelka is a framework for creating and deploying Mongrel2[http://mongrel2.org/]
metadata.gz.sig CHANGED
Binary file