plezi 0.10.12 → 0.10.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/README.md +15 -19
- data/lib/plezi.rb +1 -0
- data/lib/plezi/common/api.rb +9 -5
- data/lib/plezi/common/redis.rb +1 -1
- data/lib/plezi/common/settings.rb +1 -1
- data/lib/plezi/handlers/controller_core.rb +2 -38
- data/lib/plezi/handlers/controller_magic.rb +1 -119
- data/lib/plezi/handlers/placebo old.rb +161 -0
- data/lib/plezi/handlers/placebo.rb +8 -45
- data/lib/plezi/handlers/ws_object.rb +204 -0
- data/lib/plezi/helpers/http_sender.rb +1 -1
- data/lib/plezi/version.rb +1 -1
- data/plezi.gemspec +3 -3
- data/resources/404.erb +93 -36
- data/resources/404.haml +91 -34
- data/resources/404.html +83 -26
- data/resources/404.slim +83 -26
- data/resources/500.erb +109 -52
- data/resources/500.haml +84 -27
- data/resources/500.html +109 -51
- data/resources/500.slim +83 -26
- data/resources/controller.rb +2 -1
- data/resources/mini_app.rb +8 -5
- data/resources/welcome_page.html +4 -4
- data/test/plezi_tests.rb +82 -38
- metadata +10 -8
data/resources/mini_app.rb
CHANGED
@@ -7,11 +7,15 @@
|
|
7
7
|
Root ||= Pathname.new(File.dirname(__FILE__)).expand_path
|
8
8
|
## make sure all file access and file loading is relative to the application's root folder
|
9
9
|
# Dir.chdir Root.to_s
|
10
|
+
## load code from a subfolder called 'code'
|
11
|
+
# Dir[File.join "{code}", "**" , "*.rb"].each {|file| load File.expand_path(file)}
|
10
12
|
|
11
|
-
## Commet the following in order to use use your original app's Gemfile.
|
12
13
|
## If this app is independant, use bundler to load gems (including the plezi gem).
|
13
|
-
|
14
|
-
|
14
|
+
## Else, use the original app's Gemfile and start Plezi's Rack mode.
|
15
|
+
require 'bundler'
|
16
|
+
Bundler.require(:default, ENV['ENV'].to_s.to_sym)
|
17
|
+
## OR:
|
18
|
+
# Plesi.start_rack # remember
|
15
19
|
|
16
20
|
## Uncomment to create a log file
|
17
21
|
# GReactor.create_logger File.expand_path(Root.join('server.log').to_s)
|
@@ -58,8 +62,7 @@ end
|
|
58
62
|
listen host: :default,
|
59
63
|
# root: Root.join('public').to_s,
|
60
64
|
# assets: Root.join('assets').to_s,
|
61
|
-
#
|
62
|
-
# templates: Root.join('app','views').to_s,
|
65
|
+
# templates: Root.join('templates').to_s,
|
63
66
|
ssl: false
|
64
67
|
|
65
68
|
## Optional stuff:
|
data/resources/welcome_page.html
CHANGED
@@ -175,13 +175,13 @@ input[type=submit]:active
|
|
175
175
|
</style>
|
176
176
|
<script type="text/javascript">
|
177
177
|
// Your websocket URI should be an absolute path. The following sets the base URI.
|
178
|
-
|
179
|
-
|
180
|
-
ws_uri
|
178
|
+
// remember to update to the specific controller's path to your websocket URI.
|
179
|
+
var ws_controller_path = '/' // window.location.pathname; // change to '/controller/path'
|
180
|
+
var ws_uri = (window.location.protocol.match(/https/) ? 'wss' : 'ws') + '://' + window.location.hostname + (window.location.port == '' ? '' : (':' + window.location.port) ) + ws_controller_path
|
181
181
|
// websocket variable.
|
182
182
|
var websocket = NaN
|
183
183
|
// count failed attempts
|
184
|
-
var
|
184
|
+
var websocket_fail_count = 0
|
185
185
|
|
186
186
|
function init_websocket()
|
187
187
|
{
|
data/test/plezi_tests.rb
CHANGED
@@ -312,28 +312,32 @@ module PleziTestTasks
|
|
312
312
|
PL.on_shutdown {puts " * Websocket unicast message test: #{RESULTS[unicast_test]}"}
|
313
313
|
end
|
314
314
|
def test_websocket_sizes
|
315
|
-
should_disconnect = false
|
316
|
-
ws = GRHttp::WSClient.connect_to("ws://localhost:3000/ws/size") do |ws|
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
end
|
324
|
-
ws.on_close do
|
325
|
-
|
326
|
-
end
|
327
|
-
str = 'a'
|
328
|
-
time_now = Time.now
|
329
|
-
8.times {|i| str = str * 2**i;puts " * Websocket message size test: sending #{str.bytesize} bytes"; ws << str; }
|
330
|
-
str.clear
|
331
|
-
to_sleep = (Time.now - time_now)*2 + 1
|
332
|
-
puts "will now sleep for #{to_sleep} seconds, waiting allowing the server to respond"
|
333
|
-
sleep to_sleep rescue true
|
334
|
-
should_disconnect = true
|
335
|
-
Plezi::Settings.ws_message_size_limit = 1024
|
336
|
-
ws << ('0123'*258)
|
315
|
+
# should_disconnect = false
|
316
|
+
# ws = GRHttp::WSClient.connect_to("ws://localhost:3000/ws/size") do |ws|
|
317
|
+
# if should_disconnect
|
318
|
+
# puts " * Websocket size disconnection test: #{RESULTS[false]}"
|
319
|
+
# else
|
320
|
+
# puts " * Websocket message size test: got #{ws.data.bytesize} bytes"
|
321
|
+
# end
|
322
|
+
|
323
|
+
# end
|
324
|
+
# ws.on_close do
|
325
|
+
# puts " * Websocket size disconnection test: #{RESULTS[should_disconnect]}"
|
326
|
+
# end
|
327
|
+
# str = 'a'
|
328
|
+
# time_now = Time.now
|
329
|
+
# 8.times {|i| str = str * 2**i;puts " * Websocket message size test: sending #{str.bytesize} bytes"; ws << str; }
|
330
|
+
# str.clear
|
331
|
+
# to_sleep = (Time.now - time_now)*2 + 1
|
332
|
+
# puts "will now sleep for #{to_sleep} seconds, waiting allowing the server to respond"
|
333
|
+
# sleep to_sleep rescue true
|
334
|
+
# should_disconnect = true
|
335
|
+
# Plezi::Settings.ws_message_size_limit = 1024
|
336
|
+
# ws << ('0123'*258)
|
337
|
+
end
|
338
|
+
def test_broadcast_stress
|
339
|
+
PlaceboStressTestCtrl.create_listeners
|
340
|
+
PlaceboStressTestCtrl.run_test
|
337
341
|
end
|
338
342
|
def test_404
|
339
343
|
puts " * 404 not found and router continuity tests: #{RESULTS[ Net::HTTP.get_response(URI.parse "http://localhost:3000/get404" ).code == '404' ]}"
|
@@ -343,17 +347,17 @@ module PleziTestTasks
|
|
343
347
|
puts e
|
344
348
|
end
|
345
349
|
def test_500
|
346
|
-
|
347
|
-
|
348
|
-
#
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
350
|
+
workers = GReactor.instance_exec {@threads.select {|t| t.alive?} .count}
|
351
|
+
print " * 500 internal error test: #{RESULTS[ Net::HTTP.get_response(URI.parse "http://localhost:3000/fail" ).code == '500' ]}"
|
352
|
+
# cause 10 more exceptions to be raised... testing thread survival.
|
353
|
+
10.times { putc "."; Net::HTTP.get_response(URI.parse "http://localhost:3000/fail" ).code }
|
354
|
+
putc "\n"
|
355
|
+
workers_after_test = GReactor.instance_exec {@threads.select {|t| t.alive?} .count}
|
356
|
+
puts " * Worker survival test: #{RESULTS[workers_after_test == workers]} (#{workers_after_test} out of #{workers})"
|
357
|
+
|
358
|
+
rescue => e
|
359
|
+
puts " **** 500 internal error test FAILED TO RUN!!!"
|
360
|
+
puts e
|
357
361
|
end
|
358
362
|
end
|
359
363
|
|
@@ -388,6 +392,40 @@ class PlaceboCtrl
|
|
388
392
|
end
|
389
393
|
end
|
390
394
|
|
395
|
+
|
396
|
+
class PlaceboStressTestCtrl
|
397
|
+
def review start_time, fin = false, uni = false
|
398
|
+
if fin
|
399
|
+
time_now = Time.now
|
400
|
+
average = (((time_now - start_time)*1.0/(LISTENERS*REPEATS))*1000.0).round(4)
|
401
|
+
total = (time_now - start_time).round(3)
|
402
|
+
puts " * Placebo stress test - Total of #{LISTENERS*REPEATS} events) finished in #{total} seconds"
|
403
|
+
puts " * Placebo stress test - average: (#{average} seconds per event."
|
404
|
+
PlaceboStressTestCtrl.run_unicast_test unless uni
|
405
|
+
end
|
406
|
+
end
|
407
|
+
def self.run_test
|
408
|
+
puts "\n * Placebo Broadcast stress test starting - (#{LISTENERS} listening objects with #{REPEATS} messages."
|
409
|
+
start_time = Time.now
|
410
|
+
(REPEATS - 1).times {|i| PlaceboStressTestCtrl.broadcast :review, start_time}
|
411
|
+
PlaceboStressTestCtrl.unicast @uuid, :review, start_time, true
|
412
|
+
puts " * Placebo stress test - sending messages required: (#{Time.now - start_time} seconds."
|
413
|
+
end
|
414
|
+
def self.run_unicast_test
|
415
|
+
puts "\n * Placebo Unicast stress test starting - (#{LISTENERS} listening objects with #{REPEATS} messages."
|
416
|
+
start_time = Time.now
|
417
|
+
(REPEATS - 1).times {|i| PlaceboStressTestCtrl.unicast @uuid, :review, start_time, false, true}
|
418
|
+
PlaceboStressTestCtrl.unicast @uuid, :review, start_time, true, true
|
419
|
+
puts " * Placebo stress test - sending messages required: (#{Time.now - start_time} seconds."
|
420
|
+
end
|
421
|
+
def self.create_listeners
|
422
|
+
@uuid = nil
|
423
|
+
LISTENERS.times {@uuid = Plezi::Placebo.new(PlaceboStressTestCtrl).uuid}
|
424
|
+
end
|
425
|
+
REPEATS = 1000
|
426
|
+
LISTENERS = 600
|
427
|
+
end
|
428
|
+
|
391
429
|
PL.create_logger nil
|
392
430
|
# PL::Settings.max_threads = 4
|
393
431
|
|
@@ -401,6 +439,9 @@ shared_route 'ws/no', Nothing
|
|
401
439
|
shared_route 'ws/placebo', PlaceboTestCtrl
|
402
440
|
shared_route 'ws/size', WSsizeTestCtrl
|
403
441
|
|
442
|
+
|
443
|
+
# puts Nothing.ancestors.join "\n"
|
444
|
+
|
404
445
|
shared_route '/some/:multi{path|another_path}/(:option){route|test}/(:id)/(:optional)', TestCtrl
|
405
446
|
shared_route '/', TestCtrl
|
406
447
|
|
@@ -418,23 +459,26 @@ end
|
|
418
459
|
|
419
460
|
|
420
461
|
|
421
|
-
r = Plezi::Placebo.new PlaceboCtrl
|
422
|
-
puts " * Create Placebo test: #{PleziTestTasks::RESULTS[r && true]}"
|
423
462
|
|
424
|
-
Plezi.start_async
|
425
463
|
puts " --- Plezi will ran async, performing some tests that than hang"
|
426
464
|
|
427
465
|
puts " --- Starting tests"
|
428
466
|
puts " --- Failed tests should read: #{PleziTestTasks::RESULTS[false]}"
|
467
|
+
Plezi.start_async
|
429
468
|
PleziTestTasks.run_tests
|
430
|
-
puts "\n --- Press ^C to complete tests."
|
431
469
|
|
470
|
+
r = Plezi::Placebo.new PlaceboCtrl
|
471
|
+
puts " * Create Placebo test: #{PleziTestTasks::RESULTS[r && true]}"
|
472
|
+
|
473
|
+
# ENV['PL_REDIS_URL'] ||= ENV['REDIS_URL'] || ENV['REDISCLOUD_URL'] || ENV['REDISTOGO_URL'] || "redis://test:1234@pub-redis-11008.us-east-1-4.5.ec2.garantiadata.com:11008"
|
474
|
+
# # GReactor::Settings.set_forking 4
|
475
|
+
# GR.run_async { PleziTestTasks.run_tests }
|
432
476
|
# start_services
|
433
477
|
|
434
478
|
shoutdown_test = false
|
435
|
-
# GReactor::Settings.set_forking 4
|
436
479
|
Plezi.on_shutdown { shoutdown_test = true }
|
437
480
|
|
481
|
+
puts "\n --- Press ^C to complete tests."
|
438
482
|
Plezi.start
|
439
483
|
# Plezi::EventMachine.clear_timers
|
440
484
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plezi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Boaz Segev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: grhttp
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.0.
|
19
|
+
version: 0.0.16
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.0.
|
26
|
+
version: 0.0.16
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,8 +52,8 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '10.0'
|
55
|
-
description: Plezi
|
56
|
-
to
|
55
|
+
description: Plezi - the easy way to add Websockets, RESTful routing and HTTP streaming
|
56
|
+
serviced to Ruby Web-Apps.
|
57
57
|
email:
|
58
58
|
- boaz@2be.co.il
|
59
59
|
executables:
|
@@ -78,9 +78,11 @@ files:
|
|
78
78
|
- lib/plezi/handlers/controller_core.rb
|
79
79
|
- lib/plezi/handlers/controller_magic.rb
|
80
80
|
- lib/plezi/handlers/http_router.rb
|
81
|
+
- lib/plezi/handlers/placebo old.rb
|
81
82
|
- lib/plezi/handlers/placebo.rb
|
82
83
|
- lib/plezi/handlers/route.rb
|
83
84
|
- lib/plezi/handlers/stubs.rb
|
85
|
+
- lib/plezi/handlers/ws_object.rb
|
84
86
|
- lib/plezi/helpers/http_sender.rb
|
85
87
|
- lib/plezi/helpers/magic_helpers.rb
|
86
88
|
- lib/plezi/helpers/mime_types.rb
|
@@ -145,8 +147,8 @@ rubyforge_project:
|
|
145
147
|
rubygems_version: 2.4.7
|
146
148
|
signing_key:
|
147
149
|
specification_version: 4
|
148
|
-
summary: Plezi
|
149
|
-
|
150
|
+
summary: Plezi - the easy way to add Websockets, RESTful routing and HTTP streaming
|
151
|
+
serviced to Ruby Web-Apps.
|
150
152
|
test_files:
|
151
153
|
- test/console
|
152
154
|
- test/plezi_tests.rb
|