nephos-server 0.5.4 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +14 -9
- data/README.md +10 -11
- data/Rakefile +13 -0
- data/app/main.rb +19 -2
- data/bin/nephos-server +25 -0
- data/lib/nephos-server/bin-helpers.rb +39 -0
- data/lib/nephos-server/controller.rb +66 -14
- data/lib/nephos-server/params.rb +4 -0
- data/lib/nephos-server/router/load.rb +5 -8
- data/lib/nephos-server/router/main.rb +30 -42
- data/lib/nephos-server/server/main.rb +5 -3
- data/lib/nephos-server/server/responder.rb +27 -19
- data/nephos-server.gemspec +4 -1
- data/routes.rb +1 -1
- data/test/controller.rb +21 -16
- data/test/functional.rb +9 -0
- data/test/{generator.rb → functional/generator.rb} +0 -0
- data/test/functional/global.rb +6 -0
- data/test/functional/server.rb +37 -0
- data/test/responder.rb +46 -37
- data/test/router.rb +70 -26
- data/test/test.rb +0 -1
- data/version +1 -1
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: deb3406763cd858becf11305040bd3916c3151ef
|
4
|
+
data.tar.gz: 840624b4879a929ce7b1555d598b7555b28f1f50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ce1336de3d50ec9e9dc42b1c3dab71f071f61c87158770191a62b42642220156aa729446b739f2438e0f758dadc28781934e94ddf4dbd41eb0465d89ea6d865
|
7
|
+
data.tar.gz: a6c4b3d0cd26ed3d4c7f20d8ee81e4dee557df41d31b952225b9417cebcc075fc6b623f59c5b78351672fee16aad8c442918fb67064be51807826e94efdb98e0
|
data/CHANGELOG
CHANGED
@@ -1,24 +1,29 @@
|
|
1
|
-
v0.
|
1
|
+
v0.6.1
|
2
|
+
* Improve daemons
|
3
|
+
* Improve Rakefile and tests structure
|
4
|
+
* Add few functional (router, server, generator) tests
|
5
|
+
* Add new unitary tests
|
6
|
+
|
7
|
+
v0.6.0
|
8
|
+
* Big change (ea49dfb0b429f03327447477bfee9bef30dda7ad) on the architecture, massive usage of Rack::Request, review the global architecture, update all unitary tests
|
9
|
+
* add hook before_action and after_action
|
10
|
+
* improve params
|
11
|
+
* improve controller error handlement with STDERR message
|
12
|
+
* server can be daemonized
|
13
|
+
|
14
|
+
v0.5
|
2
15
|
* fix regression on empty response
|
3
16
|
* add unitary tests
|
4
17
|
* improve gemspec
|
5
18
|
* fix severe regression on responder
|
6
19
|
* fix environment bug
|
7
|
-
|
8
|
-
v0.5.3
|
9
20
|
* add continuous integration with gitlab
|
10
21
|
* fix executables requirements to be testable
|
11
22
|
* add cookies management
|
12
|
-
|
13
|
-
v0.5.2
|
14
23
|
* fix regression on content-type from v0.4
|
15
|
-
|
16
|
-
v0.5.1
|
17
24
|
* fix nephos gem (binaries can be used out of an application)
|
18
25
|
* improve code documentation (annotations above the methods and classes)
|
19
26
|
* fix content type for json to application/json
|
20
|
-
|
21
|
-
v0.5.0
|
22
27
|
* improve executables: version taking in count
|
23
28
|
|
24
29
|
v0.4
|
data/README.md
CHANGED
@@ -1,16 +1,6 @@
|
|
1
1
|
# Nephos Ruby Server
|
2
|
-
|
3
|
-
[![Gitlab Tests](https://gitlab.com/ci/projects/8973/status.png?ref=master)](https://gitlab.com/ci/projects/8973?ref=master)
|
4
|
-
|
5
|
-
[![GitHub version](https://badge.fury.io/gh/pouleta%2FNephosRubyServer.svg)](http://badge.fury.io/gh/pouleta%2FNephosRubyServer)
|
6
|
-
|
7
2
|
[![Gem Version](https://badge.fury.io/rb/nephos-server.svg)](http://badge.fury.io/rb/nephos-server)
|
8
3
|
|
9
|
-
[![Code Climate](https://codeclimate.com/github/pouleta/NephosRubyServer/badges/gpa.svg)](https://codeclimate.com/github/pouleta/NephosRubyServer)
|
10
|
-
|
11
|
-
[![Nephos Executables](https://badge.fury.io/rb/nephos.svg)](http://badge.fury.io/rb/nephos)
|
12
|
-
|
13
|
-
|
14
4
|
This is a minimal web server, based on [rack](https://github.com/rack/rack) and [puma](https://github.com/puma/puma).
|
15
5
|
It is written in ruby. It also gives you a minimal architecture
|
16
6
|
to speed up your application bootstrap.
|
@@ -42,6 +32,8 @@ nserver -p 8080 -h 0.0.0.0 # start the server. port is not required, neither hos
|
|
42
32
|
- ``-p``: port to listen
|
43
33
|
- ``-h``: host to listen (network address)
|
44
34
|
- ``-e``: environment (default is development, can be set to production)
|
35
|
+
- ``-d``: daemonize the process
|
36
|
+
- ``-k``: kill daemonized process
|
45
37
|
|
46
38
|
|
47
39
|
# Documentation
|
@@ -121,7 +113,6 @@ end
|
|
121
113
|
|
122
114
|
## TODO v0.6
|
123
115
|
- startable as daemon
|
124
|
-
- hooks for controller
|
125
116
|
- feature to change HTTP header from controller
|
126
117
|
- customisable default 404 errors and 500 errors
|
127
118
|
- functionnal tests
|
@@ -136,3 +127,11 @@ end
|
|
136
127
|
- Api Creation
|
137
128
|
- Database creation
|
138
129
|
- Web HTML with templating
|
130
|
+
|
131
|
+
[![Gitlab Tests](https://gitlab.com/ci/projects/8973/status.png?ref=master)](https://gitlab.com/ci/projects/8973?ref=master)
|
132
|
+
|
133
|
+
[![GitHub version](https://badge.fury.io/gh/pouleta%2FNephosRubyServer.svg)](http://badge.fury.io/gh/pouleta%2FNephosRubyServer)
|
134
|
+
|
135
|
+
[![Code Climate](https://codeclimate.com/github/pouleta/NephosRubyServer/badges/gpa.svg)](https://codeclimate.com/github/pouleta/NephosRubyServer)
|
136
|
+
|
137
|
+
[![Nephos Executables](https://badge.fury.io/rb/nephos.svg)](http://badge.fury.io/rb/nephos)
|
data/Rakefile
CHANGED
@@ -5,3 +5,16 @@ task :default => [:test]
|
|
5
5
|
task :test do
|
6
6
|
ruby "test/test.rb"
|
7
7
|
end
|
8
|
+
|
9
|
+
namespace :test do
|
10
|
+
|
11
|
+
desc "Unitary tests. Fasts and on the sources."
|
12
|
+
task :test do
|
13
|
+
ruby "test/test.rb"
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Functional tests. Slow, test real the features under real conditions of usage."
|
17
|
+
task :functional do
|
18
|
+
ruby "test/functional.rb"
|
19
|
+
end
|
20
|
+
end
|
data/app/main.rb
CHANGED
@@ -1,9 +1,26 @@
|
|
1
1
|
class MainController < Nephos::Controller
|
2
2
|
|
3
|
+
before_action :fct_before_all
|
4
|
+
before_action :fct_before_root, :root
|
5
|
+
after_action :fct_after_root, :root
|
6
|
+
|
7
|
+
def fct_before_all
|
8
|
+
# puts "BEFORE ALL"
|
9
|
+
end
|
10
|
+
|
11
|
+
def fct_before_root
|
12
|
+
# puts "BEFORE"
|
13
|
+
end
|
14
|
+
|
15
|
+
def fct_after_root
|
16
|
+
# puts "AFTER"
|
17
|
+
end
|
18
|
+
|
3
19
|
def root
|
20
|
+
# puts "ROOT"
|
4
21
|
cookies["a"] = "b"
|
5
22
|
cookies.delete("b").to_h
|
6
|
-
puts cookies
|
23
|
+
# puts "Cookies from the root:", cookies
|
7
24
|
{
|
8
25
|
json: {
|
9
26
|
list: $dataset,
|
@@ -39,7 +56,7 @@ class MainController < Nephos::Controller
|
|
39
56
|
|
40
57
|
AUTH_IMG_EXT = %w(.jpg .jpeg .png .gif)
|
41
58
|
def image
|
42
|
-
dir = File.expand_path('
|
59
|
+
dir = File.expand_path('app/')
|
43
60
|
file = File.expand_path(params["image"], dir)
|
44
61
|
if not file[0..(dir.size-1)] == dir or not AUTH_IMG_EXT.include?(File.extname(file))
|
45
62
|
return {status: 500, content: "invalid path #{params['image']}"}
|
data/bin/nephos-server
CHANGED
@@ -35,12 +35,30 @@ begin
|
|
35
35
|
$test = true
|
36
36
|
end
|
37
37
|
|
38
|
+
opts.on("-d", "--daemon", "Start in background") do
|
39
|
+
$daemon = true
|
40
|
+
end
|
41
|
+
|
42
|
+
opts.on("-k", "--kill", "Kill the daemon if started") do
|
43
|
+
$kill_daemon = true
|
44
|
+
end
|
45
|
+
|
38
46
|
end.parse!
|
39
47
|
|
40
48
|
Nephos.env = $server_env
|
41
49
|
|
42
50
|
Dir.chdir(opts[0]) if not opts.empty?
|
43
51
|
|
52
|
+
if $kill_daemon
|
53
|
+
raise "No Daemon started" if not Nephos::Bin::Daemon.started?
|
54
|
+
puts "Daemon #{Nephos::Bin::Daemon.get_pid} stopped"
|
55
|
+
Nephos::Bin::Daemon.kill!
|
56
|
+
exit 0
|
57
|
+
end
|
58
|
+
if $daemon and Nephos::Bin::Daemon.started?
|
59
|
+
raise "Unable to start the server: the daemon #{Nephos::Bin::Daemon.get_pid} already exists"
|
60
|
+
end
|
61
|
+
|
44
62
|
if $test
|
45
63
|
require_relative "../lib/nephos-server"
|
46
64
|
else
|
@@ -54,12 +72,19 @@ begin
|
|
54
72
|
end
|
55
73
|
|
56
74
|
puts "Running Nephos::Server version #{Nephos::VERSION} (#{Nephos.env})"
|
75
|
+
if $daemon
|
76
|
+
Nephos::Bin::Daemon.detach!
|
77
|
+
end
|
57
78
|
Nephos::Server.start($server_port, $server_host)
|
58
79
|
|
59
80
|
rescue RoutingError => err
|
60
81
|
puts "Routing Error: Check out the documentation and `routes.rb` file.".yellow
|
61
82
|
puts "#{err.class}: #{err.message}".red
|
83
|
+
puts "#{err.backtrace.join("\n")}".yellow if $debug
|
84
|
+
exit 1
|
62
85
|
|
63
86
|
rescue => err
|
64
87
|
puts "#{err.class}: #{err.message}".red
|
88
|
+
puts "#{err.backtrace.join("\n")}".yellow if $debug
|
89
|
+
exit 1
|
65
90
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module Nephos
|
2
|
+
|
2
3
|
module Bin
|
3
4
|
|
4
5
|
# @param dir [String]
|
@@ -18,7 +19,45 @@ module Nephos
|
|
18
19
|
return true
|
19
20
|
end
|
20
21
|
|
22
|
+
module Daemon
|
23
|
+
|
24
|
+
def self.started?
|
25
|
+
get_pid != nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.kill!
|
29
|
+
d = get_pid
|
30
|
+
return false unless d
|
31
|
+
begin
|
32
|
+
Process::kill(10, d)
|
33
|
+
rescue => err
|
34
|
+
raise "Cannot kill #{d} !"
|
35
|
+
ensure
|
36
|
+
File.delete(get_pid_file)
|
37
|
+
end
|
38
|
+
return true
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.detach!
|
42
|
+
Process::daemon(true, false)
|
43
|
+
File.write(get_pid_file, Process::pid.to_s)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.get_pid_file
|
47
|
+
return ".pid"
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.get_pid
|
51
|
+
return nil if not File.exists?(get_pid_file)
|
52
|
+
v = File.read(get_pid_file)
|
53
|
+
v = Integer(v) rescue nil
|
54
|
+
return v
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
21
59
|
end
|
60
|
+
|
22
61
|
end
|
23
62
|
|
24
63
|
class BinError < StandardError; end
|
@@ -6,28 +6,80 @@ module Nephos
|
|
6
6
|
# and the parameters.
|
7
7
|
class Controller
|
8
8
|
|
9
|
-
attr_reader :
|
10
|
-
attr_reader :req
|
9
|
+
attr_reader :req, :callpath, :params, :cookies
|
11
10
|
|
12
11
|
# @param env [Hash] env extracted from the http request
|
13
12
|
# @param parsed [Hash] pre-parsed env with parameters, ...
|
14
|
-
def initialize
|
15
|
-
raise ArgumentError, "
|
16
|
-
raise ArgumentError, "
|
17
|
-
|
18
|
-
raise ArgumentError, "Invalid Parsed. :path must be associated with an Array" unless parsed[:path].is_a? Array
|
19
|
-
raise ArgumentError, "Invalid Parsed. :params must be associated with a Hash" unless parsed[:params].is_a? Hash
|
20
|
-
raise ArgumentError, "Invalid Callpath. :params must be associated with an Array" unless callpath[:params].is_a? Array
|
21
|
-
@env= env
|
22
|
-
@req= Rack::Request.new(env)
|
23
|
-
@infos= parsed
|
13
|
+
def initialize req, callpath
|
14
|
+
raise ArgumentError, "req must be a Rack::Request" unless req.is_a? Rack::Request
|
15
|
+
raise ArgumentError, "call must be a Hash" unless callpath.is_a? Hash
|
16
|
+
@req= req
|
24
17
|
@callpath= callpath
|
25
|
-
@params=
|
26
|
-
|
18
|
+
@params= req.params rescue {}
|
19
|
+
|
20
|
+
params = @req.path.split("/")
|
21
|
+
params.shift
|
22
|
+
@params.merge! Hash[callpath[:params].zip(params)]
|
27
23
|
@params.select!{|k,v| not k.to_s.empty?}
|
24
|
+
|
25
|
+
|
28
26
|
@params = Params.new(@params)
|
29
27
|
@cookies = Params.new(@req.cookies)
|
30
28
|
end
|
31
29
|
|
30
|
+
@@before_action = {:'*' => []}
|
31
|
+
@@after_action = {:'*' => []}
|
32
|
+
|
33
|
+
def self.parse_action_opts(opt)
|
34
|
+
if opt.nil?
|
35
|
+
return :'*'
|
36
|
+
elsif opt.is_a? Hash
|
37
|
+
raise "No implemented yet"
|
38
|
+
# parse :only and :except
|
39
|
+
elsif opt.is_a? String or opt.is_a? Symbol
|
40
|
+
return opt.to_sym
|
41
|
+
else
|
42
|
+
raise ArgumentError, "Invalid opts"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param method [Symbol]
|
47
|
+
# @param opt [Nil, Hash, String, Symbol] define which method will call "method"
|
48
|
+
# - if nil, then all call will trigger the event
|
49
|
+
# - if Hash, it will be parsed with rules :only and :except
|
50
|
+
# - if String or Symbol, it will be parsed as :only
|
51
|
+
def self.before_action(method, opt=nil)
|
52
|
+
call = parse_action_opts(opt)
|
53
|
+
@@before_action[call] ||= []
|
54
|
+
@@before_action[call] << method.to_sym
|
55
|
+
end
|
56
|
+
|
57
|
+
# see {#self.before_action}
|
58
|
+
def self.after_action(method, opt=nil)
|
59
|
+
call = parse_action_opts(opt)
|
60
|
+
@@after_action[call] ||= []
|
61
|
+
@@after_action[call] << method.to_sym
|
62
|
+
end
|
63
|
+
|
64
|
+
def execute_before_action(call)
|
65
|
+
call = call.to_sym
|
66
|
+
methods = []
|
67
|
+
methods += Array(@@before_action[call])
|
68
|
+
methods += @@before_action[:'*']
|
69
|
+
methods.each do |method|
|
70
|
+
self.send(method)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def execute_after_action(call)
|
75
|
+
call = call.to_sym
|
76
|
+
methods = []
|
77
|
+
methods += Array(@@after_action[call])
|
78
|
+
methods += @@after_action[:'*']
|
79
|
+
methods.each do |method|
|
80
|
+
self.send(method)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
32
84
|
end
|
33
85
|
end
|
data/lib/nephos-server/params.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Nephos
|
2
|
-
|
2
|
+
|
3
|
+
class Router
|
3
4
|
|
4
5
|
def self.add(what, verb)
|
5
6
|
Nephos::Router::ROUTES << what.merge(verb: verb)
|
@@ -9,15 +10,13 @@ module Nephos
|
|
9
10
|
end
|
10
11
|
|
11
12
|
# @param what [Hash]
|
12
|
-
#
|
13
|
-
# TODO: doc
|
14
13
|
def self.add_params!(what)
|
15
14
|
params = what[:url].split('/').map do |p|
|
16
15
|
p.match(/:\w+/) ? {p: "[^\/]+", name: p} : {p: p, name: nil}
|
17
16
|
end
|
18
17
|
url = params.map{|e| e[:p]}.join("/")
|
19
18
|
url = "/" if url.empty?
|
20
|
-
what[:match] = /^#{url}
|
19
|
+
what[:match] = /^#{url}\/*$/
|
21
20
|
what[:params] = params.map{|e| e[:name] && e[:name][1..-1]}[1..-1] || []
|
22
21
|
end
|
23
22
|
|
@@ -35,9 +34,6 @@ module Nephos
|
|
35
34
|
|
36
35
|
# @param what [Hash]
|
37
36
|
#
|
38
|
-
# TODO:
|
39
|
-
# - Improve instanciation test
|
40
|
-
#
|
41
37
|
# Check if:
|
42
38
|
# - the what parameter contains a :controller
|
43
39
|
# - this controller exists
|
@@ -53,7 +49,7 @@ module Nephos
|
|
53
49
|
raise InvalidRouteController, "Class \"#{what[:controller]}\" is not a Nephos::Controller"
|
54
50
|
end
|
55
51
|
begin
|
56
|
-
instance = controller.new
|
52
|
+
instance = controller.new(Rack::Request.new({}), {params: []})
|
57
53
|
rescue => err
|
58
54
|
raise InvalidRouteController, "Cannot initialize controller"
|
59
55
|
end
|
@@ -77,6 +73,7 @@ module Nephos
|
|
77
73
|
end
|
78
74
|
|
79
75
|
end
|
76
|
+
|
80
77
|
end
|
81
78
|
|
82
79
|
require_relative 'helpers'
|
@@ -7,71 +7,59 @@ module Nephos
|
|
7
7
|
|
8
8
|
# The {Router} provides an interface between the {Controller} and the client
|
9
9
|
# queries.
|
10
|
-
|
10
|
+
class Router
|
11
11
|
|
12
12
|
ROUTES = []
|
13
13
|
|
14
|
-
# @param
|
15
|
-
#
|
16
|
-
#
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
return Responder.render *args
|
14
|
+
# @param opt [Hash] it contains optional parameters, via the keys (Symbol only)
|
15
|
+
# - :silent : if true, then there will be no puts on the stdin when a request is routed.
|
16
|
+
# Else, or by default, there will be information printed on stdin
|
17
|
+
def initialize(opt={})
|
18
|
+
@responder = Responder.new
|
19
|
+
@silent = !!opt[:silent]
|
22
20
|
end
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
# render the return of a call to Controller.new.method.
|
23
|
+
# Controller and method are stored on call via the keys :controller and :method
|
24
|
+
def render_controller req, call
|
25
|
+
return @responder.render_from_controller(req, call)
|
26
|
+
end
|
27
|
+
|
28
|
+
def render_error(req, code, err=nil)
|
29
|
+
if Nephos.env == "production"
|
30
|
+
return @responder.render(status: code)
|
27
31
|
elsif err
|
28
32
|
msg = err
|
29
33
|
if msg.is_a? Exception
|
30
34
|
msg = err.message + "\n"
|
31
|
-
msg += "--- Backtrace ---\n" + err.backtrace.join("\n") + "\n"
|
35
|
+
msg += "--- Backtrace ---\n" + err.backtrace.join("\n") + "\n"
|
32
36
|
end
|
33
|
-
return render(status: code,
|
34
|
-
content: "Error: #{code}\n#{msg}")
|
37
|
+
return @responder.render(status: code, content: "Error: #{code}\n#{msg}")
|
35
38
|
else
|
36
|
-
return render(status: code)
|
39
|
+
return @responder.render(status: code)
|
37
40
|
end
|
38
41
|
end
|
39
42
|
|
40
43
|
# @param path [Array]
|
41
44
|
#
|
42
45
|
# Find the right route to use from the url
|
43
|
-
def
|
44
|
-
|
45
|
-
return ROUTES.find{|e| e[:match] =~ route and e[:verb] == verb}
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.parse_env(env, route)
|
49
|
-
verb = env["REQUEST_METHOD"]
|
50
|
-
from = env["REMOTE_ADDR"]
|
51
|
-
path = route.path.split("/").select{|e|not e.to_s.empty?}
|
52
|
-
params = Rack::Request.new(env).params
|
53
|
-
# Hash[route.query.to_s.split("&").map{|e| e.split("=")}]
|
54
|
-
return {route: route, verb: verb, from: from, path: path, params: params}
|
46
|
+
def find_route req
|
47
|
+
return ROUTES.find{|e| e[:match] =~ req.path and e[:verb] == req.request_method}
|
55
48
|
end
|
56
49
|
|
57
50
|
# Interface which handle the client query (stored in env), create a new
|
58
51
|
# {Controller} instance, and call the render on it
|
59
|
-
def
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
return error(500, err)
|
65
|
-
end
|
66
|
-
parsed = parse_env(env, route)
|
67
|
-
puts "#{parsed[:from]} [#{parsed[:verb]}] \t ---> \t #{route}"
|
68
|
-
call = parse_path(parsed[:path], parsed[:verb])
|
69
|
-
return error(404, "404 not found \"#{route}\"") if call.nil?
|
52
|
+
def execute(req)
|
53
|
+
env = req.env
|
54
|
+
puts "#{req.env["REMOTE_ADDR"]} [#{req.request_method}] \t ---> \t #{req.path}" unless @silent
|
55
|
+
call = find_route(req)
|
56
|
+
return render_error(req, 404, "404 not found \"#{req.path}\"") if call.nil?
|
70
57
|
begin
|
71
|
-
|
72
|
-
return render(controller, call[:method])
|
58
|
+
return render_controller(req, call)
|
73
59
|
rescue => err
|
74
|
-
|
60
|
+
STDERR.puts "Error: #{err.message}"
|
61
|
+
STDERR.puts err.backtrace
|
62
|
+
return render_error(req, 500, err)
|
75
63
|
end
|
76
64
|
end
|
77
65
|
|
@@ -3,19 +3,21 @@ require_relative 'responder'
|
|
3
3
|
module Nephos
|
4
4
|
class Server
|
5
5
|
|
6
|
-
SERVER = lambda {|env| return Router.execute(env)}
|
7
|
-
|
8
6
|
attr_accessor :port, :host
|
9
7
|
|
10
8
|
# @param port [Integer] port to listen
|
11
9
|
def initialize port="8080", host="0.0.0.0"
|
12
10
|
@port = Integer(port)
|
13
11
|
@host = host.to_s
|
12
|
+
@server = lambda {|env|
|
13
|
+
router = Router.new
|
14
|
+
return router.execute(Rack::Request.new(env))
|
15
|
+
}
|
14
16
|
end
|
15
17
|
|
16
18
|
# start the Rack server
|
17
19
|
def start
|
18
|
-
Rack::Server.start :app =>
|
20
|
+
Rack::Server.start :app => @server, :Port => @port, :Host => @host
|
19
21
|
end
|
20
22
|
|
21
23
|
# start the Rack server on a instance of Nephos::Server
|
@@ -1,16 +1,17 @@
|
|
1
1
|
module Nephos
|
2
|
-
|
2
|
+
|
3
|
+
class Responder
|
3
4
|
|
4
5
|
class InvalidContentType < StandardError; end
|
5
6
|
|
6
7
|
CT_CHARSET_PREFIX = '; charset='
|
7
8
|
|
8
|
-
def
|
9
|
+
def content_type(kind, type, charset='UTF-8')
|
9
10
|
"#{kind}/#{type}" + CT_CHARSET_PREFIX + charset
|
10
11
|
end
|
11
12
|
|
12
13
|
# @param params [Hash] containing :type => "kind/type", example: "text/html"
|
13
|
-
def
|
14
|
+
def ct_specific(params)
|
14
15
|
kind, type = params[:type].to_s.match(/^(\w+)\/(\w+)$/) && Regexp.last_match[1..2]
|
15
16
|
if kind.nil? or type.nil?
|
16
17
|
raise InvalidContentType, "params[:type] must match with \"kind/type\""
|
@@ -24,20 +25,19 @@ module Nephos
|
|
24
25
|
json: "application/json",
|
25
26
|
}
|
26
27
|
|
27
|
-
private
|
28
28
|
# if not :status entry, set to 200
|
29
|
-
def
|
29
|
+
def set_default_params_status params
|
30
30
|
params[:status] ||= 200
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
33
|
+
def set_default_params_type params
|
34
34
|
if params[:type].nil?
|
35
35
|
params[:type] = PRESET_CT[(params.keys & [:plain, :html, :json]).first || :plain]
|
36
36
|
end
|
37
37
|
params[:type] = ct_specific(params)
|
38
38
|
end
|
39
39
|
|
40
|
-
def
|
40
|
+
def set_default_params_content params
|
41
41
|
type = (params.keys & [:plain, :html, :json, :content]).first
|
42
42
|
if type.nil?
|
43
43
|
if params[:status].to_s.match(/^[45]\d\d$/)
|
@@ -52,37 +52,44 @@ module Nephos
|
|
52
52
|
params[:content] = params[type]
|
53
53
|
end
|
54
54
|
end
|
55
|
-
public
|
56
55
|
|
57
56
|
# Fill params with default parameters (status, plain errors)
|
58
|
-
def
|
57
|
+
def set_default_params params
|
59
58
|
set_default_params_status(params)
|
60
59
|
set_default_params_type(params)
|
61
60
|
set_default_params_content(params)
|
62
|
-
params
|
61
|
+
return params
|
63
62
|
end
|
64
63
|
|
65
|
-
def
|
64
|
+
def empty_resp
|
66
65
|
resp = Rack::Response.new
|
67
66
|
resp.status = 204
|
68
67
|
resp["Content-Type"] = ct_specific({type: PRESET_CT[:plain]})
|
69
|
-
resp
|
68
|
+
return resp
|
70
69
|
end
|
71
70
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
71
|
+
def render_from_controller req, call
|
72
|
+
controller = Module.const_get(call[:controller]).new(req, call)
|
73
|
+
method_to_call = call[:method]
|
74
|
+
|
75
|
+
controller.execute_before_action(method_to_call)
|
76
|
+
# puts "Call #{controller} # #{method_to_call}"
|
77
|
+
params = controller.send(method_to_call)
|
78
|
+
controller.execute_after_action(method_to_call)
|
79
|
+
|
80
|
+
# puts "--- Params #{params.class} ---", "<<", params, ">>"
|
81
|
+
resp = render(params)
|
75
82
|
controller.cookies.each do |k, v|
|
76
83
|
resp.set_cookie k, v
|
77
84
|
end
|
78
85
|
return resp
|
79
86
|
end
|
80
87
|
|
81
|
-
|
82
|
-
|
83
|
-
def self.render params
|
84
|
-
return Responder.empty_resp if params == :empty
|
88
|
+
def render params
|
89
|
+
return empty_resp if params == :empty
|
85
90
|
return render(status: params) if params.is_a? Integer
|
91
|
+
raise "Not a valid params argument" unless params.is_a? Hash
|
92
|
+
|
86
93
|
resp = Rack::Response.new
|
87
94
|
params = set_default_params(params)
|
88
95
|
resp.status = params[:status]
|
@@ -92,4 +99,5 @@ module Nephos
|
|
92
99
|
end
|
93
100
|
|
94
101
|
end
|
102
|
+
|
95
103
|
end
|
data/nephos-server.gemspec
CHANGED
data/routes.rb
CHANGED
@@ -17,7 +17,7 @@ get url: "/rm", controller: "MainController", method: "rm_url"
|
|
17
17
|
get url: "/debug", controller: "MainController", method: "debug"
|
18
18
|
get url: "/hello", controller: "MainController", method: "hello"
|
19
19
|
|
20
|
-
get url: "/image", controller: "MainController", method: "image"
|
20
|
+
# get url: "/image", controller: "MainController", method: "image"
|
21
21
|
get url: "/image/:image", controller: "MainController", method: "image"
|
22
22
|
get url: "img/:image", controller: "MainController", method: "image"
|
23
23
|
|
data/test/controller.rb
CHANGED
@@ -1,25 +1,30 @@
|
|
1
|
+
class ReqWithWritableParams < Rack::Request
|
2
|
+
def params
|
3
|
+
return Hash[@env["REQUEST_URI"].gsub(/.*\?(.+)/, '\1').split('&').map{|d| d.split('=')}]
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
1
7
|
class TestNephosServerController < Test::Unit::TestCase
|
2
8
|
|
3
|
-
def
|
4
|
-
|
5
|
-
|
6
|
-
|
9
|
+
def test_initialize
|
10
|
+
assert_raise do Nephos::Controller.new() end
|
11
|
+
assert_raise do Nephos::Controller.new({}) end
|
12
|
+
assert_raise do Nephos::Controller.new({}, {}) end
|
7
13
|
|
8
|
-
|
9
|
-
assert_raise do Nephos::Controller.new(
|
10
|
-
assert_raise do Nephos::Controller.new(
|
11
|
-
assert_raise do Nephos::Controller.new(
|
12
|
-
|
13
|
-
assert_raise do Nephos::Controller.new({}, {path: [], params: {}}, {params: nil}) end
|
14
|
-
assert_raise do Nephos::Controller.new({}, {path: nil, params: nil}, params: nil) end
|
15
|
-
assert_raise do Nephos::Controller.new({}, {path: nil, params: {}}, {params: {}}) end
|
16
|
-
assert_raise do Nephos::Controller.new({}, {path: [], params: nil}, {params: {}}) end
|
14
|
+
r = Rack::Request.new({})
|
15
|
+
assert_raise do Nephos::Controller.new() end
|
16
|
+
assert_raise do Nephos::Controller.new(r) end
|
17
|
+
assert_raise do Nephos::Controller.new(r, {}) end
|
18
|
+
assert do Nephos::Controller.new(r, {params: []}) end
|
17
19
|
end
|
18
20
|
|
19
21
|
def test_controller_params
|
20
|
-
|
21
|
-
|
22
|
-
|
22
|
+
r = ReqWithWritableParams.new({"REQUEST_METHOD"=>"GET",
|
23
|
+
"PATH_INFO"=>"/index",
|
24
|
+
"REQUEST_URI"=>"/uri?k=v"})
|
25
|
+
c = Nephos::Controller.new(r, {params: []})
|
26
|
+
assert_equal "v", c.params[:k]
|
27
|
+
assert_equal "v", c.params["k"]
|
23
28
|
end
|
24
29
|
|
25
30
|
end
|
data/test/functional.rb
ADDED
File without changes
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class TestNephosServerBinServer < Test::Unit::TestCase
|
2
|
+
|
3
|
+
def test_daemon
|
4
|
+
# WARNING: be sure there is no instance before running theses tests
|
5
|
+
|
6
|
+
# test start and kill
|
7
|
+
`./bin/nephos-server --test -d`
|
8
|
+
assert_equal 0, $?.exitstatus
|
9
|
+
`./bin/nephos-server --test -k`
|
10
|
+
assert_equal 0, $?.exitstatus
|
11
|
+
|
12
|
+
# test kill after killed
|
13
|
+
`./bin/nephos-server --test -k`
|
14
|
+
assert_equal 1, $?.exitstatus
|
15
|
+
`./bin/nephos-server --test -k`
|
16
|
+
assert_equal 1, $?.exitstatus
|
17
|
+
|
18
|
+
# test start after killed
|
19
|
+
`./bin/nephos-server --test -d`
|
20
|
+
assert_equal 0, $?.exitstatus
|
21
|
+
|
22
|
+
# test start after started
|
23
|
+
`./bin/nephos-server --test -d`
|
24
|
+
assert_equal 1, $?.exitstatus
|
25
|
+
`./bin/nephos-server --test -d`
|
26
|
+
assert_equal 1, $?.exitstatus
|
27
|
+
|
28
|
+
# test kill after started N times
|
29
|
+
`./bin/nephos-server --test -k`
|
30
|
+
assert_equal 0, $?.exitstatus
|
31
|
+
|
32
|
+
# test kill after started N times and then killed
|
33
|
+
`./bin/nephos-server --test -k`
|
34
|
+
assert_equal 1, $?.exitstatus
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/test/responder.rb
CHANGED
@@ -3,7 +3,7 @@ class TestNephosServerResponder < Test::Unit::TestCase
|
|
3
3
|
def test_content_type
|
4
4
|
assert_equal(
|
5
5
|
"KIND/TYPE" "; charset=" "CHARSET",
|
6
|
-
Nephos::Responder.content_type("KIND", "TYPE", "CHARSET")
|
6
|
+
Nephos::Responder.new.content_type("KIND", "TYPE", "CHARSET")
|
7
7
|
)
|
8
8
|
end
|
9
9
|
|
@@ -18,16 +18,25 @@ class TestNephosServerResponder < Test::Unit::TestCase
|
|
18
18
|
p7 = {type: []}
|
19
19
|
p8 = {type: nil}
|
20
20
|
p9 = {}
|
21
|
-
assert Nephos::Responder.ct_specific(p0)
|
22
|
-
assert_raise Nephos::Responder::InvalidContentType do
|
23
|
-
|
24
|
-
assert_raise Nephos::Responder::InvalidContentType do
|
25
|
-
|
26
|
-
assert_raise Nephos::Responder::InvalidContentType do
|
27
|
-
|
28
|
-
assert_raise Nephos::Responder::InvalidContentType do
|
29
|
-
|
30
|
-
assert_raise Nephos::Responder::InvalidContentType do
|
21
|
+
assert Nephos::Responder.new.ct_specific(p0)
|
22
|
+
assert_raise Nephos::Responder::InvalidContentType do
|
23
|
+
Nephos::Responder.new.ct_specific(p1) end
|
24
|
+
assert_raise Nephos::Responder::InvalidContentType do
|
25
|
+
Nephos::Responder.new.ct_specific(p2) end
|
26
|
+
assert_raise Nephos::Responder::InvalidContentType do
|
27
|
+
Nephos::Responder.new.ct_specific(p3) end
|
28
|
+
assert_raise Nephos::Responder::InvalidContentType do
|
29
|
+
Nephos::Responder.new.ct_specific(p4) end
|
30
|
+
assert_raise Nephos::Responder::InvalidContentType do
|
31
|
+
Nephos::Responder.new.ct_specific(p5) end
|
32
|
+
assert_raise Nephos::Responder::InvalidContentType do
|
33
|
+
Nephos::Responder.new.ct_specific(p6) end
|
34
|
+
assert_raise Nephos::Responder::InvalidContentType do
|
35
|
+
Nephos::Responder.new.ct_specific(p7) end
|
36
|
+
assert_raise Nephos::Responder::InvalidContentType do
|
37
|
+
Nephos::Responder.new.ct_specific(p8) end
|
38
|
+
assert_raise Nephos::Responder::InvalidContentType do
|
39
|
+
Nephos::Responder.new.ct_specific(p9) end
|
31
40
|
end
|
32
41
|
|
33
42
|
def test_set_default_params_status
|
@@ -35,10 +44,10 @@ class TestNephosServerResponder < Test::Unit::TestCase
|
|
35
44
|
p2 = {status: 300}
|
36
45
|
p3 = {status: nil}
|
37
46
|
p4 = {}
|
38
|
-
Nephos::Responder.set_default_params_status(p1)
|
39
|
-
Nephos::Responder.set_default_params_status(p2)
|
40
|
-
Nephos::Responder.set_default_params_status(p3)
|
41
|
-
Nephos::Responder.set_default_params_status(p4)
|
47
|
+
Nephos::Responder.new.set_default_params_status(p1)
|
48
|
+
Nephos::Responder.new.set_default_params_status(p2)
|
49
|
+
Nephos::Responder.new.set_default_params_status(p3)
|
50
|
+
Nephos::Responder.new.set_default_params_status(p4)
|
42
51
|
assert_equal({status: 200}, p1)
|
43
52
|
assert_equal({status: 300}, p2)
|
44
53
|
assert_equal({status: 200}, p3)
|
@@ -46,15 +55,15 @@ class TestNephosServerResponder < Test::Unit::TestCase
|
|
46
55
|
end
|
47
56
|
|
48
57
|
def test_set_default_params_type_1
|
49
|
-
p_ref = {type: Nephos::Responder.ct_specific({type: "text/plain"})}
|
58
|
+
p_ref = {type: Nephos::Responder.new.ct_specific({type: "text/plain"})}
|
50
59
|
p1 = {type: "text/plain"}
|
51
60
|
p2 = {type: "text"}
|
52
61
|
p3 = {type: "text/plain"}
|
53
|
-
Nephos::Responder.set_default_params_type(p1)
|
62
|
+
Nephos::Responder.new.set_default_params_type(p1)
|
54
63
|
assert_equal p1, p_ref
|
55
64
|
assert_raise Nephos::Responder::InvalidContentType do
|
56
|
-
Nephos::Responder.set_default_params_type(p2) end
|
57
|
-
Nephos::Responder.set_default_params_type(p3)
|
65
|
+
Nephos::Responder.new.set_default_params_type(p2) end
|
66
|
+
Nephos::Responder.new.set_default_params_type(p3)
|
58
67
|
assert_equal p_ref, p3
|
59
68
|
end
|
60
69
|
|
@@ -64,14 +73,14 @@ class TestNephosServerResponder < Test::Unit::TestCase
|
|
64
73
|
p3 = {json: "bla", plain: "bla"}
|
65
74
|
p4 = {json: "bla", html: "bla"}
|
66
75
|
p5 = {json: "bla"}
|
67
|
-
Nephos::Responder.set_default_params_type(p1)
|
68
|
-
Nephos::Responder.set_default_params_type(p2)
|
69
|
-
Nephos::Responder.set_default_params_type(p3)
|
70
|
-
Nephos::Responder.set_default_params_type(p4)
|
71
|
-
Nephos::Responder.set_default_params_type(p5)
|
72
|
-
plain = Nephos::Responder.ct_specific({type: "text/plain"})
|
73
|
-
json = Nephos::Responder.ct_specific({type: "application/json"})
|
74
|
-
html = Nephos::Responder.ct_specific({type: "text/html"})
|
76
|
+
Nephos::Responder.new.set_default_params_type(p1)
|
77
|
+
Nephos::Responder.new.set_default_params_type(p2)
|
78
|
+
Nephos::Responder.new.set_default_params_type(p3)
|
79
|
+
Nephos::Responder.new.set_default_params_type(p4)
|
80
|
+
Nephos::Responder.new.set_default_params_type(p5)
|
81
|
+
plain = Nephos::Responder.new.ct_specific({type: "text/plain"})
|
82
|
+
json = Nephos::Responder.new.ct_specific({type: "application/json"})
|
83
|
+
html = Nephos::Responder.new.ct_specific({type: "text/html"})
|
75
84
|
assert_equal plain, p1[:type]
|
76
85
|
assert_equal html, p2[:type]
|
77
86
|
assert_equal json, p3[:type]
|
@@ -80,13 +89,13 @@ class TestNephosServerResponder < Test::Unit::TestCase
|
|
80
89
|
end
|
81
90
|
|
82
91
|
def test_render_simple
|
83
|
-
r1 = Nephos::Responder.render(:empty)
|
84
|
-
r2 = Nephos::Responder.render(200)
|
85
|
-
r3 = Nephos::Responder.render(201)
|
86
|
-
r4 = Nephos::Responder.render(status: 202)
|
87
|
-
r5 = Nephos::Responder.render(plain: "")
|
88
|
-
r6 = Nephos::Responder.render(json: "")
|
89
|
-
r7 = Nephos::Responder.render(html: "")
|
92
|
+
r1 = Nephos::Responder.new.render(:empty)
|
93
|
+
r2 = Nephos::Responder.new.render(200)
|
94
|
+
r3 = Nephos::Responder.new.render(201)
|
95
|
+
r4 = Nephos::Responder.new.render(status: 202)
|
96
|
+
r5 = Nephos::Responder.new.render(plain: "")
|
97
|
+
r6 = Nephos::Responder.new.render(json: "")
|
98
|
+
r7 = Nephos::Responder.new.render(html: "")
|
90
99
|
assert_equal(204, r1.status)
|
91
100
|
assert_equal(200, r2.status)
|
92
101
|
assert_equal(201, r3.status)
|
@@ -97,9 +106,9 @@ class TestNephosServerResponder < Test::Unit::TestCase
|
|
97
106
|
end
|
98
107
|
|
99
108
|
def test_render_advanced
|
100
|
-
r1 = Nephos::Responder.render(status: 201, plain: "plaaaain")
|
101
|
-
r2 = Nephos::Responder.render(status: 201, json: {data: [1, 2]})
|
102
|
-
r3 = Nephos::Responder.render(status: 201, html: "<p>p</p>")
|
109
|
+
r1 = Nephos::Responder.new.render(status: 201, plain: "plaaaain")
|
110
|
+
r2 = Nephos::Responder.new.render(status: 201, json: {data: [1, 2]})
|
111
|
+
r3 = Nephos::Responder.new.render(status: 201, html: "<p>p</p>")
|
103
112
|
assert_equal(201, r1.status)
|
104
113
|
assert_equal("text/plain; charset=UTF-8", r1["Content-type"])
|
105
114
|
assert_equal(["plaaaain"], r1.body)
|
data/test/router.rb
CHANGED
@@ -20,6 +20,21 @@ class TestNephosServerRouter < Test::Unit::TestCase
|
|
20
20
|
Nephos::Router::ROUTES.first
|
21
21
|
end
|
22
22
|
|
23
|
+
def test_init_router
|
24
|
+
r1= Nephos::Router.new
|
25
|
+
r2= Nephos::Router.new({})
|
26
|
+
r3= Nephos::Router.new({silent: false})
|
27
|
+
r4= Nephos::Router.new({silent: true})
|
28
|
+
assert r1
|
29
|
+
assert_equal(false, r1.instance_variable_get(:@silent))
|
30
|
+
assert r2
|
31
|
+
assert_equal(false, r2.instance_variable_get(:@silent))
|
32
|
+
assert r3
|
33
|
+
assert_equal(false, r3.instance_variable_get(:@silent))
|
34
|
+
assert r4
|
35
|
+
assert_equal(true, r4.instance_variable_get(:@silent))
|
36
|
+
end
|
37
|
+
|
23
38
|
def test_multi_routes
|
24
39
|
reset_routes!
|
25
40
|
get url: "/a", controller: "TestController", method: "method", silent: true
|
@@ -44,7 +59,7 @@ class TestNephosServerRouter < Test::Unit::TestCase
|
|
44
59
|
assert_equal "GET", first[:verb]
|
45
60
|
assert_equal "TestController", first[:controller]
|
46
61
|
assert_equal "method", first[:method]
|
47
|
-
assert_equal
|
62
|
+
assert_equal /^\/\/*$/, first[:match]
|
48
63
|
|
49
64
|
reset_routes!
|
50
65
|
post url: "/", controller: "TestController", method: "method", silent: true
|
@@ -52,7 +67,7 @@ class TestNephosServerRouter < Test::Unit::TestCase
|
|
52
67
|
assert_equal "POST", first[:verb]
|
53
68
|
assert_equal "TestController", first[:controller]
|
54
69
|
assert_equal "method", first[:method]
|
55
|
-
assert_equal
|
70
|
+
assert_equal /^\/\/*$/, first[:match]
|
56
71
|
|
57
72
|
reset_routes!
|
58
73
|
put url: "/", controller: "TestController", method: "method", silent: true
|
@@ -60,14 +75,14 @@ class TestNephosServerRouter < Test::Unit::TestCase
|
|
60
75
|
assert_equal "PUT", first[:verb]
|
61
76
|
assert_equal "TestController", first[:controller]
|
62
77
|
assert_equal "method", first[:method]
|
63
|
-
assert_equal
|
78
|
+
assert_equal /^\/\/*$/, first[:match]
|
64
79
|
end
|
65
80
|
|
66
81
|
def test_valid_routes_params
|
67
82
|
reset_routes!
|
68
83
|
get url: "/:what", controller: "TestController", method: "method", silent: true
|
69
84
|
assert_equal "/:what", first[:url]
|
70
|
-
assert_equal /^\/[^\/]
|
85
|
+
assert_equal /^\/[^\/]+\/*$/, first[:match]
|
71
86
|
end
|
72
87
|
|
73
88
|
def test_valid_resources
|
@@ -87,7 +102,7 @@ class TestNephosServerRouter < Test::Unit::TestCase
|
|
87
102
|
get url: "/:what", controller: "TestController", method: "method", silent: true
|
88
103
|
end
|
89
104
|
assert_equal "/home/:what", first[:url]
|
90
|
-
assert_equal /^\/home\/[^\/]
|
105
|
+
assert_equal /^\/home\/[^\/]+\/*$/, first[:match]
|
91
106
|
end
|
92
107
|
|
93
108
|
def test_valid_resources_params2
|
@@ -96,46 +111,75 @@ class TestNephosServerRouter < Test::Unit::TestCase
|
|
96
111
|
get url: "/show", controller: "TestController", method: "method", silent: true
|
97
112
|
end
|
98
113
|
assert_equal "/:id/show", first[:url]
|
99
|
-
assert_equal /^\/[^\/]+\/show
|
114
|
+
assert_equal /^\/[^\/]+\/show\/*$/, first[:match]
|
100
115
|
end
|
101
116
|
|
117
|
+
REQ_GET_INDEX = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/index"})
|
118
|
+
REQ_POST_INDEX = Rack::Request.new({"REQUEST_METHOD"=>"POST", "PATH_INFO"=>"/index"})
|
119
|
+
REQ_PUT_INDEX = Rack::Request.new({"REQUEST_METHOD"=>"PUT", "PATH_INFO"=>"/index"})
|
120
|
+
REQ_GET_INDEXX = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/indexx"})
|
121
|
+
REQ_GET_INDE = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/inde"})
|
122
|
+
|
102
123
|
def test_routing_matching_simple
|
103
124
|
reset_routes!
|
104
125
|
get url: "/index", controller: "TestController", method: "method", silent: true
|
105
126
|
post url: "/index", controller: "TestController", method: "method", silent: true
|
106
|
-
assert(Nephos::Router
|
107
|
-
assert(Nephos::Router
|
108
|
-
assert(Nephos::Router
|
109
|
-
assert(Nephos::Router
|
110
|
-
assert(Nephos::Router
|
127
|
+
assert(Nephos::Router.new.find_route(REQ_GET_INDEX))
|
128
|
+
assert(Nephos::Router.new.find_route(REQ_POST_INDEX))
|
129
|
+
assert(!Nephos::Router.new.find_route(REQ_PUT_INDEX))
|
130
|
+
assert(!Nephos::Router.new.find_route(REQ_GET_INDEXX))
|
131
|
+
assert(!Nephos::Router.new.find_route(REQ_GET_INDE))
|
111
132
|
end
|
112
133
|
|
134
|
+
REQ_GET_ID_INDEX = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/id/index"})
|
135
|
+
REQ_GET_XXX_INDEX = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/XXX/index"})
|
136
|
+
REQ_GET_ID = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/id"})
|
137
|
+
REQ_GET_XXX = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/XXX"})
|
138
|
+
REQ_GET_INDEX_ID = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/index/id"})
|
139
|
+
|
113
140
|
def test_routing_matching_simple_with_arguments1
|
114
141
|
reset_routes!
|
115
142
|
get url: "/:id", controller: "TestController", method: "method1", silent: true
|
116
143
|
get url: "/:id/index", controller: "TestController", method: "method2", silent: true
|
117
|
-
assert(Nephos::Router
|
118
|
-
assert(Nephos::Router
|
119
|
-
assert(Nephos::Router
|
120
|
-
assert(Nephos::Router
|
121
|
-
assert(Nephos::Router
|
144
|
+
assert(Nephos::Router.new.find_route(REQ_GET_ID_INDEX))
|
145
|
+
assert(Nephos::Router.new.find_route(REQ_GET_XXX_INDEX))
|
146
|
+
assert(Nephos::Router.new.find_route(REQ_GET_ID))
|
147
|
+
assert(Nephos::Router.new.find_route(REQ_GET_XXX))
|
148
|
+
assert(!Nephos::Router.new.find_route(REQ_GET_INDEX_ID))
|
122
149
|
end
|
123
150
|
|
151
|
+
REQ_GET_IDX_INDEX = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/idx/index"})
|
152
|
+
REQ_GET_XXX_INDEX = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/XXX/index"})
|
153
|
+
REQ_GET_ID = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/id"})
|
154
|
+
REQ_GET_XXX = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/XXX"})
|
155
|
+
|
156
|
+
REQ_GET_INDEX_ID = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/index/id"})
|
157
|
+
REQ_GET_INDEX_XXX = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/index/XXX"})
|
158
|
+
REQ_POST_INDEX_XXX_INDEX = Rack::Request.new({"REQUEST_METHOD"=>"POST", "PATH_INFO"=>"/index/XXX/index"})
|
159
|
+
|
160
|
+
REQ_GET_INDEX_XXX_INDEX = Rack::Request.new({"REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/index/XXX/index"})
|
161
|
+
REQ_POST_INDEX_XXX_ID = Rack::Request.new({"REQUEST_METHOD"=>"POST", "PATH_INFO"=>"/index/XXX/id"})
|
162
|
+
REQ_POST_INDEX_XXX_XXX = Rack::Request.new({"REQUEST_METHOD"=>"POST", "PATH_INFO"=>"/index/XXX/XXX"})
|
163
|
+
|
164
|
+
# TODO : FIX
|
124
165
|
def test_routing_matching_simple_with_arguments2
|
125
166
|
reset_routes!
|
126
167
|
get url: "/index", controller: "TestController", method: "method1", silent: true
|
127
168
|
get url: "/index/:id", controller: "TestController", method: "method1", silent: true
|
128
169
|
post url: "/index/:id/index", controller: "TestController", method: "method2", silent: true
|
129
|
-
|
130
|
-
assert(Nephos::Router
|
131
|
-
assert(Nephos::Router
|
132
|
-
assert(Nephos::Router
|
133
|
-
assert(Nephos::Router
|
134
|
-
|
135
|
-
assert(Nephos::Router
|
136
|
-
assert(Nephos::Router
|
137
|
-
assert(Nephos::Router
|
138
|
-
|
170
|
+
|
171
|
+
assert(!Nephos::Router.new.find_route(REQ_GET_IDX_INDEX))
|
172
|
+
assert(!Nephos::Router.new.find_route(REQ_GET_XXX_INDEX))
|
173
|
+
assert(!Nephos::Router.new.find_route(REQ_GET_ID))
|
174
|
+
assert(!Nephos::Router.new.find_route(REQ_GET_XXX))
|
175
|
+
|
176
|
+
assert(Nephos::Router.new.find_route(REQ_GET_INDEX_ID))
|
177
|
+
assert(Nephos::Router.new.find_route(REQ_GET_INDEX_XXX))
|
178
|
+
assert(Nephos::Router.new.find_route(REQ_POST_INDEX_XXX_INDEX))
|
179
|
+
|
180
|
+
assert(!Nephos::Router.new.find_route(REQ_GET_INDEX_XXX_INDEX))
|
181
|
+
assert(!Nephos::Router.new.find_route(REQ_POST_INDEX_XXX_ID))
|
182
|
+
assert(!Nephos::Router.new.find_route(REQ_POST_INDEX_XXX_XXX))
|
139
183
|
end
|
140
184
|
|
141
185
|
end
|
data/test/test.rb
CHANGED
data/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.1
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nephos-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- poulet_a
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nomorebeer
|
@@ -109,7 +109,10 @@ files:
|
|
109
109
|
- nephos-server.gemspec
|
110
110
|
- routes.rb
|
111
111
|
- test/controller.rb
|
112
|
-
- test/
|
112
|
+
- test/functional.rb
|
113
|
+
- test/functional/generator.rb
|
114
|
+
- test/functional/global.rb
|
115
|
+
- test/functional/server.rb
|
113
116
|
- test/params.rb
|
114
117
|
- test/responder.rb
|
115
118
|
- test/router.rb
|
@@ -138,7 +141,7 @@ rubyforge_project:
|
|
138
141
|
rubygems_version: 2.4.8
|
139
142
|
signing_key:
|
140
143
|
specification_version: 4
|
141
|
-
summary: "*
|
142
|
-
|
144
|
+
summary: "* Improve daemons * Improve Rakefile and tests structure * Add few functional
|
145
|
+
(router, server, generator) tests * Add new unitary tests"
|
143
146
|
test_files: []
|
144
147
|
has_rdoc:
|