plezi 0.8.4 → 0.8.5
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +48 -1
- data/Rakefile +7 -1
- data/bin/plezi +7 -0
- data/lib/plezi.rb +2 -0
- data/lib/plezi/eventmachine/ssl_connection.rb +9 -3
- data/lib/plezi/handlers/controller_magic.rb +43 -1
- data/lib/plezi/handlers/magic_helpers.rb +9 -2
- data/lib/plezi/handlers/route.rb +108 -51
- data/lib/plezi/oauth.rb +3 -2
- data/lib/plezi/oauth/auth_controller.rb +48 -27
- data/lib/plezi/server/http_protocol.rb +11 -0
- data/lib/plezi/server/websocket_client.rb +172 -0
- data/lib/plezi/version.rb +1 -1
- data/resources/Gemfile +1 -0
- data/resources/database.yml +33 -0
- data/resources/db_ac_config.rb +34 -33
- data/resources/environment.rb +2 -2
- data/resources/oauth_config.rb +2 -2
- data/resources/rakefile +3 -3
- data/test/plezi_tests.rb +104 -27
- metadata +4 -3
- data/TODO.md +0 -15
data/resources/environment.rb
CHANGED
@@ -11,14 +11,14 @@ Root ||= Pathname.new(File.dirname(__FILE__)).expand_path
|
|
11
11
|
Dir.chdir Root.to_s
|
12
12
|
|
13
13
|
# ensure development mode? (comment before production, environment dependent)
|
14
|
-
ENV["RACK_ENV"] ||= "development"
|
14
|
+
ENV['ENV'] ||= ENV["RACK_ENV"] ||= "development"
|
15
15
|
|
16
16
|
# save the process id (pid) to file - notice Heroku doesn't allow to write files.
|
17
17
|
(IO.write File.expand_path(File.join 'tmp','pid'), Process.pid unless ENV["DYNO"]) rescue true
|
18
18
|
|
19
19
|
# using bundler to load gems (including the plezi gem)
|
20
20
|
require 'bundler'
|
21
|
-
Bundler.require
|
21
|
+
Bundler.require(:default, ENV['ENV'].to_s.to_sym)
|
22
22
|
|
23
23
|
# require tilt/sass in a thread safe way (before multi-threading cycle begins)
|
24
24
|
require 'tilt/sass' if defined?(::Slim) && defined?(::Sass)
|
data/resources/oauth_config.rb
CHANGED
@@ -16,8 +16,8 @@
|
|
16
16
|
# #
|
17
17
|
# require 'plezi/oauth'
|
18
18
|
# #
|
19
|
-
# # Last, but not least, remember to add the authentication route in the
|
20
|
-
# create_auth_shared_route do |service_name, remote_user_id, remote_user_email, remote_response|
|
19
|
+
# # Last, but not least, remember to add the authentication route in the 'routes.rb' (remember path priority placement):
|
20
|
+
# create_auth_shared_route do |service_name, auth_token, remote_user_id, remote_user_email, remote_response|
|
21
21
|
# # ...callback for authentication.
|
22
22
|
# # This callback should return the app user object or false
|
23
23
|
# # This callback hass access to the magic controller methods (request, cookies, etc')
|
data/resources/rakefile
CHANGED
@@ -5,8 +5,8 @@ load ::File.expand_path(File.join("..", "environment.rb"), __FILE__)
|
|
5
5
|
NO_PLEZI_AUTO_START = true
|
6
6
|
|
7
7
|
# create a default task
|
8
|
-
desc "The default task
|
8
|
+
desc "The default task will simply remind you to call 'rake -T'."
|
9
9
|
task :default do
|
10
|
-
|
11
|
-
|
10
|
+
puts "I don't know what to do. Please choose a task..."
|
11
|
+
puts "You can print a list of all avaiulable tasks using: rake -T"
|
12
12
|
end
|
data/test/plezi_tests.rb
CHANGED
@@ -4,14 +4,31 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'open-uri'
|
5
5
|
require 'plezi'
|
6
6
|
|
7
|
+
def report_before_filter(result= true)
|
8
|
+
return true if $before_tested
|
9
|
+
puts(" * Before filter test: #{PleziTestTasks::RESULTS[result]}")
|
10
|
+
$before_tested = true
|
11
|
+
true
|
12
|
+
end
|
13
|
+
def report_after_filter(result= true)
|
14
|
+
return true if $after_tested
|
15
|
+
puts(" * After filter test: #{PleziTestTasks::RESULTS[result]}")
|
16
|
+
$after_tested = true
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
7
20
|
class TestCtrl
|
8
21
|
|
22
|
+
|
23
|
+
|
9
24
|
# this will be called before every request.
|
10
25
|
def before
|
26
|
+
report_before_filter
|
11
27
|
end
|
12
28
|
|
13
29
|
# this will be called after every request.
|
14
30
|
def after
|
31
|
+
report_after_filter
|
15
32
|
end
|
16
33
|
|
17
34
|
# shouldn't be available (return 404).
|
@@ -21,7 +38,15 @@ class TestCtrl
|
|
21
38
|
def index
|
22
39
|
"test"
|
23
40
|
end
|
41
|
+
def headers
|
42
|
+
"HTTP request: #{request[:method]} #{request[:query]} - version: #{request[:version]}\n" + (request.headers.map {|k, v| "#{k}: #{v}"} .join "\n")
|
43
|
+
end
|
24
44
|
|
45
|
+
# returns the url used to access this method
|
46
|
+
def my_url
|
47
|
+
dest = params.dup
|
48
|
+
url_for dest
|
49
|
+
end
|
25
50
|
# should return a 500 internal server error message.
|
26
51
|
def fail
|
27
52
|
raise "Hell!"
|
@@ -103,19 +128,23 @@ end
|
|
103
128
|
module PleziTestTasks
|
104
129
|
module_function
|
105
130
|
|
106
|
-
|
131
|
+
|
132
|
+
RESULTS = {true => "\e[32mpassed\e[0m"}
|
133
|
+
RESULTS.default = "\e[31mFAILED!\e[0m"
|
107
134
|
|
108
135
|
def run_tests
|
109
136
|
(public_methods(false)).each {|m| method(m).call if m.to_s.match /^test_/}
|
137
|
+
report_before_filter false
|
138
|
+
report_after_filter false
|
110
139
|
true
|
111
140
|
end
|
112
141
|
def test_sleep
|
113
142
|
Plezi.run_async do
|
114
143
|
begin
|
115
|
-
puts "Sleeper test: #{RESULTS[URI.parse("http://localhost:3000/sleeper").read == 'slept']}"
|
116
|
-
puts "ASync tasks test: #{RESULTS[true]}"
|
144
|
+
puts " * Sleeper test: #{RESULTS[URI.parse("http://localhost:3000/sleeper").read == 'slept']}"
|
145
|
+
puts " * ASync tasks test: #{RESULTS[true]}"
|
117
146
|
rescue => e
|
118
|
-
puts "Sleeper test FAILED TO RUN!!!"
|
147
|
+
puts " **** Sleeper test FAILED TO RUN!!!"
|
119
148
|
puts e
|
120
149
|
end
|
121
150
|
end
|
@@ -123,84 +152,126 @@ module PleziTestTasks
|
|
123
152
|
|
124
153
|
def test_index
|
125
154
|
begin
|
126
|
-
puts "
|
155
|
+
puts " * Index test: #{RESULTS[URI.parse("http://localhost:3000/").read == 'test']}"
|
127
156
|
rescue => e
|
128
|
-
puts "Index test FAILED TO RUN!!!"
|
157
|
+
puts " **** Index test FAILED TO RUN!!!"
|
129
158
|
puts e
|
130
159
|
end
|
131
160
|
end
|
132
161
|
def test_ssl
|
133
|
-
puts "Connection to non-ssl and unique route test: #{RESULTS[URI.parse("http://localhost:3000/ssl").read == 'false']}"
|
162
|
+
puts " * Connection to non-ssl and unique route test: #{RESULTS[URI.parse("http://localhost:3000/ssl").read == 'false']}"
|
134
163
|
uri = URI.parse("https://localhost:3030/ssl")
|
135
164
|
Net::HTTP.start(uri.host, uri.port, use_ssl: (uri.scheme == "https"), verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http|
|
136
|
-
puts "Connection to ssl and unique ssl route test: #{RESULTS[ http.request(Net::HTTP::Get.new(uri)).body == 'true' ]}"
|
165
|
+
puts " * Connection to ssl and unique ssl route test: #{RESULTS[ http.request(Net::HTTP::Get.new(uri)).body == 'true' ]}"
|
137
166
|
end
|
138
167
|
rescue => e
|
139
|
-
puts "SSL Tests FAILED to complete!!!"
|
168
|
+
puts " **** SSL Tests FAILED to complete!!!"
|
140
169
|
puts e
|
141
170
|
end
|
142
171
|
def test_new
|
143
|
-
puts "New RESTful path test: #{RESULTS[URI.parse("http://localhost:3000/new").read == 'new']}"
|
172
|
+
puts " * New RESTful path test: #{RESULTS[URI.parse("http://localhost:3000/new").read == 'new']}"
|
144
173
|
|
145
174
|
rescue => e
|
146
|
-
puts "New RESTful path test FAILED TO RUN!!!"
|
175
|
+
puts " **** New RESTful path test FAILED TO RUN!!!"
|
147
176
|
puts e
|
148
177
|
end
|
149
178
|
def test_show
|
150
|
-
puts "Show RESTful path test: #{RESULTS[URI.parse("http://localhost:3000/3").read == 'show 3']}"
|
179
|
+
puts " * Show RESTful path test: #{RESULTS[URI.parse("http://localhost:3000/3").read == 'show 3']}"
|
151
180
|
|
152
181
|
rescue => e
|
153
|
-
puts "Show RESTful path test FAILED TO RUN!!!"
|
182
|
+
puts " **** Show RESTful path test FAILED TO RUN!!!"
|
154
183
|
puts e
|
155
184
|
end
|
156
185
|
def test_update
|
157
|
-
puts "Update RESTful path test: #{RESULTS[Net::HTTP.post_form( URI.parse("http://localhost:3000/"), id: 3).body == 'update 3']}"
|
186
|
+
puts " * Update RESTful path test: #{RESULTS[Net::HTTP.post_form( URI.parse("http://localhost:3000/"), id: 3).body == 'update 3']}"
|
158
187
|
|
159
188
|
rescue => e
|
160
|
-
puts "Update RESTful path test FAILED TO RUN!!!"
|
189
|
+
puts " **** Update RESTful path test FAILED TO RUN!!!"
|
161
190
|
puts e
|
162
191
|
end
|
163
192
|
def test_delete
|
164
|
-
puts "Delete RESTful path test: #{RESULTS[Net::HTTP.post_form( URI.parse("http://localhost:3000/"), id: 3, _method: :delete).body == 'delete 3']}"
|
193
|
+
puts " * Delete RESTful path test: #{RESULTS[Net::HTTP.post_form( URI.parse("http://localhost:3000/"), id: 3, _method: :delete).body == 'delete 3']}"
|
165
194
|
|
166
195
|
rescue => e
|
167
|
-
puts "Delete RESTful path test FAILED TO RUN!!!"
|
196
|
+
puts " **** Delete RESTful path test FAILED TO RUN!!!"
|
168
197
|
puts e
|
169
198
|
end
|
170
199
|
def test_save
|
171
|
-
puts "Save RESTful path test: #{RESULTS[Net::HTTP.post_form( URI.parse("http://localhost:3000/new"), data: "passed").body == 'passed']}"
|
200
|
+
puts " * Save RESTful path test: #{RESULTS[Net::HTTP.post_form( URI.parse("http://localhost:3000/new"), data: "passed").body == 'passed']}"
|
172
201
|
|
173
202
|
rescue => e
|
174
|
-
puts "Save RESTful path test FAILED TO RUN!!!"
|
203
|
+
puts " **** Save RESTful path test FAILED TO RUN!!!"
|
175
204
|
puts e
|
176
205
|
end
|
177
206
|
def test_streamed
|
178
207
|
begin
|
179
|
-
puts "Streaming test: #{RESULTS[URI.parse("http://localhost:3000/streamer").read == 'streamed']}"
|
208
|
+
puts " * Streaming test: #{RESULTS[URI.parse("http://localhost:3000/streamer").read == 'streamed']}"
|
180
209
|
rescue => e
|
181
|
-
puts "Streaming test FAILED TO RUN!!!"
|
210
|
+
puts " **** Streaming test FAILED TO RUN!!!"
|
182
211
|
puts e
|
183
212
|
end
|
184
213
|
end
|
214
|
+
def test_url_for
|
215
|
+
test_url = "/some/path/test/my_url/ask/"
|
216
|
+
puts " * simple #url_for test: #{RESULTS[URI.parse("http://localhost:3000" + test_url).read == test_url]}"
|
217
|
+
test_url = "/some/another_path/my_url/ask/"
|
218
|
+
puts " * missing arguments #url_for test: #{RESULTS[URI.parse("http://localhost:3000" + test_url).read == test_url]}"
|
219
|
+
|
220
|
+
rescue => e
|
221
|
+
puts " **** #url_for test FAILED TO RUN!!!"
|
222
|
+
puts e
|
223
|
+
end
|
185
224
|
def test_404
|
186
|
-
puts "404 not found and router continuity tests: #{RESULTS[ Net::HTTP.get_response(URI.parse "http://localhost:3000/get404" ).code == '404' ]}"
|
225
|
+
puts " * 404 not found and router continuity tests: #{RESULTS[ Net::HTTP.get_response(URI.parse "http://localhost:3000/get404" ).code == '404' ]}"
|
187
226
|
|
188
227
|
rescue => e
|
189
|
-
puts "404 not found test FAILED TO RUN!!!"
|
228
|
+
puts " **** 404 not found test FAILED TO RUN!!!"
|
190
229
|
puts e
|
191
230
|
end
|
192
231
|
def test_500
|
193
232
|
workers = Plezi::EventMachine.count_living_workers
|
194
|
-
puts "500 internal error test: #{RESULTS[ Net::HTTP.get_response(URI.parse "http://localhost:3000/fail" ).code == '500' ]}"
|
233
|
+
puts " * 500 internal error test: #{RESULTS[ Net::HTTP.get_response(URI.parse "http://localhost:3000/fail" ).code == '500' ]}"
|
195
234
|
# cause 10 more exceptions to be raised... testing thread survival.
|
196
235
|
10.times { Net::HTTP.get_response(URI.parse "http://localhost:3000/fail" ).code }
|
197
236
|
workers_after_test = Plezi::EventMachine.count_living_workers
|
198
|
-
puts "Worker survival test: #{RESULTS[workers_after_test == workers]} (#{workers_after_test} out of #{workers})"
|
237
|
+
puts " * Worker survival test: #{RESULTS[workers_after_test == workers]} (#{workers_after_test} out of #{workers})"
|
199
238
|
|
200
239
|
rescue => e
|
201
|
-
puts "
|
240
|
+
puts " **** 500 internal error test FAILED TO RUN!!!"
|
202
241
|
puts e
|
203
242
|
end
|
243
|
+
def test_websocket
|
244
|
+
connection_test = broadcast_test = echo_test = false
|
245
|
+
begin
|
246
|
+
ws2 = Plezi::WebsocketClient.connect_to("wss://localhost:3030") do |msg|
|
247
|
+
break unless @is_connected || !(@is_connected = true)
|
248
|
+
puts " * Websocket broadcast message test: #{RESULTS[broadcast_test = (msg == 'echo test')]}"
|
249
|
+
response.close
|
250
|
+
go_test = false
|
251
|
+
end
|
252
|
+
puts " * Websocket SSL client test: #{RESULTS[ws2 && true]}"
|
253
|
+
ws1 = Plezi::WebsocketClient.connect_to("ws://localhost:3000") do |msg|
|
254
|
+
unless @connected
|
255
|
+
puts " * Websocket connection message test: #{RESULTS[connection_test = (msg == 'connected')]}"
|
256
|
+
@connected = true
|
257
|
+
response << "echo test"
|
258
|
+
break
|
259
|
+
end
|
260
|
+
puts " * Websocket echo message test: #{RESULTS[echo_test = (msg == 'echo test')]}"
|
261
|
+
response.close
|
262
|
+
end
|
263
|
+
|
264
|
+
rescue => e
|
265
|
+
puts " **** Websocket tests FAILED TO RUN!!!"
|
266
|
+
puts e.message
|
267
|
+
end
|
268
|
+
remote = Plezi::WebsocketClient.connect_to("wss://echo.websocket.org/") {|msg| puts " * Extra Websocket Remote test (SSL: echo.websocket.org): #{RESULTS[msg == 'Hello websockets!']}"; response.close}
|
269
|
+
remote << "Hello websockets!"
|
270
|
+
sleep 0.3
|
271
|
+
PL.on_shutdown {puts " * Websocket connection message test: #{RESULTS[connection_test]}" unless connection_test}
|
272
|
+
PL.on_shutdown {puts " * Websocket echo message test: #{RESULTS[echo_test]}" unless echo_test}
|
273
|
+
PL.on_shutdown {puts " * Websocket broadcast message test: #{RESULTS[broadcast_test]}" unless broadcast_test}
|
274
|
+
end
|
204
275
|
end
|
205
276
|
|
206
277
|
NO_PLEZI_AUTO_START = true
|
@@ -213,6 +284,7 @@ route("/ssl") {|req, res| res << "false" }
|
|
213
284
|
listen port: 3030, ssl: true
|
214
285
|
route("/ssl") {|req, res| res << "true" }
|
215
286
|
|
287
|
+
shared_route '/some/:multi{path|another_path}/(:option){route|test}/(:id)/(:optional)', TestCtrl
|
216
288
|
shared_route '/', TestCtrl
|
217
289
|
|
218
290
|
|
@@ -221,15 +293,20 @@ Plezi::EventMachine.start Plezi.max_threads
|
|
221
293
|
shoutdown_test = false
|
222
294
|
Plezi.on_shutdown { shoutdown_test = true }
|
223
295
|
|
296
|
+
puts " --- Starting tests"
|
297
|
+
puts " --- Failed tests should read: #{PleziTestTasks::RESULTS[false]}"
|
224
298
|
PleziTestTasks.run_tests
|
225
299
|
|
300
|
+
|
226
301
|
Plezi::EventMachine.clear_timers
|
227
302
|
|
303
|
+
sleep PLEZI_TEST_TIME if defined? PLEZI_TEST_TIME
|
304
|
+
|
228
305
|
Plezi::DSL.stop_services
|
229
306
|
|
230
307
|
Plezi::EventMachine.shutdown
|
231
308
|
|
232
309
|
|
233
|
-
puts "Shutdown test: #{ PleziTestTasks::RESULTS[shoutdown_test] }"
|
310
|
+
puts " * Shutdown test: #{ PleziTestTasks::RESULTS[shoutdown_test] }"
|
234
311
|
|
235
312
|
|
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.8.
|
4
|
+
version: 0.8.5
|
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-06-
|
11
|
+
date: 2015-06-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,7 +53,6 @@ files:
|
|
53
53
|
- LICENSE.txt
|
54
54
|
- README.md
|
55
55
|
- Rakefile
|
56
|
-
- TODO.md
|
57
56
|
- bin/plezi
|
58
57
|
- lib/plezi.rb
|
59
58
|
- lib/plezi/common/cache.rb
|
@@ -82,6 +81,7 @@ files:
|
|
82
81
|
- lib/plezi/server/http_response.rb
|
83
82
|
- lib/plezi/server/mime_types.rb
|
84
83
|
- lib/plezi/server/websocket.rb
|
84
|
+
- lib/plezi/server/websocket_client.rb
|
85
85
|
- lib/plezi/server/ws_response.rb
|
86
86
|
- lib/plezi/version.rb
|
87
87
|
- plezi.gemspec
|
@@ -97,6 +97,7 @@ files:
|
|
97
97
|
- resources/code.rb
|
98
98
|
- resources/config.ru
|
99
99
|
- resources/controller.rb
|
100
|
+
- resources/database.yml
|
100
101
|
- resources/db_ac_config.rb
|
101
102
|
- resources/db_dm_config.rb
|
102
103
|
- resources/db_sequel_config.rb
|
data/TODO.md
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# HTTPHost
|
2
|
-
|
3
|
-
Folder Listing:: add folder listing option?
|
4
|
-
|
5
|
-
# Template
|
6
|
-
|
7
|
-
update gem file (remove erb).
|
8
|
-
|
9
|
-
# HTTPProtocol
|
10
|
-
|
11
|
-
XML::
|
12
|
-
support for XML HTTP body types?
|
13
|
-
|
14
|
-
Charset::
|
15
|
-
parse chareset for incoming content-type in the multipart request body? (or leave if binary?)
|