rack-app 0.19.0 → 0.20.0
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/README.md +2 -2
- data/VERSION +1 -1
- data/lib/rack/app.rb +8 -5
- data/lib/rack/app/endpoint.rb +1 -0
- data/lib/rack/app/router.rb +22 -17
- data/lib/rack/app/router/base.rb +31 -0
- data/lib/rack/app/router/dynamic.rb +39 -48
- data/lib/rack/app/router/static.rb +9 -20
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 657c3f30f9056e50b3fe23c9ff0eb15b921f9828
|
4
|
+
data.tar.gz: fd681b8d00dff5cb31a25217e2868861c3ae2235
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2a0dda2158f2a2c328c30bdaeac5d0e730781de5fc8d654937796fd681b9da24546aad6afa397052bfb35731c99addb0256f81a58334c687a9e17683c5f1004
|
7
|
+
data.tar.gz: dad53fa0a014e003153179ed8c67b9e56c9f1177c592bcde190dce0f93df41247db95627a184a0c219198d92a02ab65476ccf123b730858e5e4bad3552366a7c
|
data/README.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.20.0
|
data/lib/rack/app.rb
CHANGED
@@ -62,12 +62,14 @@ class Rack::App
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def root(endpoint_path)
|
65
|
+
normalized_path = Rack::App::Utils.normalize_path(endpoint_path)
|
66
|
+
|
65
67
|
options '/' do
|
66
|
-
endpoint = self.class.router.fetch_endpoint('OPTIONS',
|
68
|
+
endpoint = self.class.router.fetch_endpoint('OPTIONS', normalized_path)
|
67
69
|
endpoint.get_response_body(request, response)
|
68
70
|
end
|
69
71
|
get '/' do
|
70
|
-
endpoint = self.class.router.fetch_endpoint('GET',
|
72
|
+
endpoint = self.class.router.fetch_endpoint('GET', normalized_path)
|
71
73
|
endpoint.get_response_body(request, response)
|
72
74
|
end
|
73
75
|
end
|
@@ -96,7 +98,7 @@ class Rack::App
|
|
96
98
|
)
|
97
99
|
|
98
100
|
endpoint = Rack::App::Endpoint.new(properties)
|
99
|
-
router.
|
101
|
+
router.register_endpoint!(request_method, request_path, @last_description, endpoint)
|
100
102
|
|
101
103
|
@last_description = nil
|
102
104
|
return endpoint
|
@@ -107,7 +109,8 @@ class Rack::App
|
|
107
109
|
options.merge!(endpoint_properties)
|
108
110
|
file_server = Rack::App::File::Server.new(relative_path, options)
|
109
111
|
request_path = Rack::App::Utils.join(file_server.namespace, '**', '*')
|
110
|
-
router.
|
112
|
+
router.register_endpoint!('GET', request_path, @last_description, file_server)
|
113
|
+
@last_description = nil
|
111
114
|
end
|
112
115
|
|
113
116
|
def mount(api_class)
|
@@ -171,7 +174,7 @@ class Rack::App
|
|
171
174
|
|
172
175
|
payload = ''
|
173
176
|
while chunk = @request.body.gets
|
174
|
-
payload
|
177
|
+
payload << chunk
|
175
178
|
end
|
176
179
|
@request.body.rewind
|
177
180
|
|
data/lib/rack/app/endpoint.rb
CHANGED
data/lib/rack/app/router.rb
CHANGED
@@ -1,43 +1,47 @@
|
|
1
1
|
class Rack::App::Router
|
2
2
|
|
3
|
+
require 'rack/app/router/base'
|
3
4
|
require 'rack/app/router/static'
|
4
5
|
require 'rack/app/router/dynamic'
|
5
6
|
|
7
|
+
def endpoints
|
8
|
+
(@static.endpoints + @dynamic.endpoints)
|
9
|
+
end
|
10
|
+
|
6
11
|
def show_endpoints
|
7
|
-
endpoints = (@static.show_endpoints + @dynamic.show_endpoints)
|
8
12
|
|
9
|
-
|
10
|
-
|
11
|
-
|
13
|
+
endpoints = self.endpoints
|
14
|
+
wd0 = endpoints.map { |endpoint| endpoint[:request_method].to_s.length }.max
|
15
|
+
wd1 = endpoints.map { |endpoint| endpoint[:request_path].to_s.length }.max
|
16
|
+
wd2 = endpoints.map { |endpoint| endpoint[:description].to_s.length }.max
|
12
17
|
|
13
|
-
return endpoints.map do |
|
18
|
+
return endpoints.sort_by { |endpoint| [endpoint[:request_method], endpoint[:request_path]] }.map do |endpoint|
|
14
19
|
[
|
15
|
-
|
16
|
-
|
17
|
-
|
20
|
+
endpoint[:request_method].to_s.ljust(wd0),
|
21
|
+
endpoint[:request_path].to_s.ljust(wd1),
|
22
|
+
endpoint[:description].to_s.ljust(wd2)
|
18
23
|
].join(' ')
|
19
24
|
end
|
20
25
|
|
21
26
|
end
|
22
27
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
else
|
27
|
-
@static.add_endpoint(request_method, request_path, endpoint)
|
28
|
-
end
|
28
|
+
def register_endpoint!(request_method, request_path, description, endpoint)
|
29
|
+
router = defined_path_is_dynamic?(request_path) ? @dynamic : @static
|
30
|
+
router.register_endpoint!(request_method, request_path, description, endpoint)
|
29
31
|
end
|
30
32
|
|
31
33
|
def fetch_endpoint(request_method, request_path)
|
32
34
|
@static.fetch_endpoint(request_method, request_path) or
|
33
35
|
@dynamic.fetch_endpoint(request_method, request_path) or
|
34
36
|
Rack::App::Endpoint::NOT_FOUND
|
37
|
+
|
35
38
|
end
|
36
39
|
|
37
40
|
def merge!(router)
|
38
|
-
raise(ArgumentError,
|
39
|
-
|
40
|
-
|
41
|
+
raise(ArgumentError, 'invalid router object, must implement :endpoints interface') unless router.respond_to?(:endpoints)
|
42
|
+
router.endpoints.each do |endpoint|
|
43
|
+
register_endpoint!(endpoint[:request_method], endpoint[:request_path], endpoint[:description], endpoint[:endpoint])
|
44
|
+
end
|
41
45
|
nil
|
42
46
|
end
|
43
47
|
|
@@ -49,6 +53,7 @@ class Rack::App::Router
|
|
49
53
|
end
|
50
54
|
|
51
55
|
def defined_path_is_dynamic?(path_str)
|
56
|
+
path_str = Rack::App::Utils.normalize_path(path_str)
|
52
57
|
!!(path_str.to_s =~ /\/:\w+/i) or !!(path_str.to_s =~ /\/\*/i)
|
53
58
|
end
|
54
59
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Rack::App::Router::Base
|
2
|
+
|
3
|
+
def endpoints
|
4
|
+
@endpoints ||= []
|
5
|
+
end
|
6
|
+
|
7
|
+
def register_endpoint!(request_method, request_path, description, endpoint)
|
8
|
+
endpoints.push(
|
9
|
+
{
|
10
|
+
:request_method => request_method.to_s.upcase,
|
11
|
+
:request_path => Rack::App::Utils.normalize_path(request_path),
|
12
|
+
:description => description,
|
13
|
+
:endpoint => endpoint
|
14
|
+
}
|
15
|
+
)
|
16
|
+
|
17
|
+
compile_registered_endpoints!
|
18
|
+
return endpoint
|
19
|
+
end
|
20
|
+
|
21
|
+
def fetch_endpoint(request_method, request_path)
|
22
|
+
raise('IMPLEMENTATION MISSING ERROR')
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def compile_registered_endpoints!
|
28
|
+
raise('IMPLEMENTATION MISSING ERROR')
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -1,44 +1,8 @@
|
|
1
|
-
class Rack::App::Router::Dynamic
|
1
|
+
class Rack::App::Router::Dynamic < Rack::App::Router::Base
|
2
2
|
|
3
3
|
PATH_PARAM = :"#{self}::PATH_PARAM".freeze
|
4
4
|
PARTIAL = :"#{self}::PARTIAL".freeze
|
5
5
|
|
6
|
-
# def endpoint_paths
|
7
|
-
# end
|
8
|
-
|
9
|
-
def add_endpoint(request_method, request_path, endpoint)
|
10
|
-
request_path = Rack::App::Utils.normalize_path(request_path)
|
11
|
-
@endpoint_paths << [request_method, request_path, endpoint.properties[:description]]
|
12
|
-
|
13
|
-
current_cluster = main_cluster(request_method)
|
14
|
-
path_params = {}
|
15
|
-
break_build = false
|
16
|
-
|
17
|
-
request_path.split('/').each.with_index do |path_part, index|
|
18
|
-
|
19
|
-
new_cluster_name = if path_part_is_dynamic?(path_part)
|
20
|
-
path_params[index]= path_part.sub(/^:/, '')
|
21
|
-
PATH_PARAM
|
22
|
-
|
23
|
-
elsif path_part_is_a_partial?(path_part)
|
24
|
-
break_build = true
|
25
|
-
PARTIAL
|
26
|
-
|
27
|
-
else
|
28
|
-
path_part
|
29
|
-
end
|
30
|
-
|
31
|
-
current_cluster = (current_cluster[new_cluster_name] ||= {})
|
32
|
-
break if break_build
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
current_cluster[:endpoint]= endpoint
|
37
|
-
current_cluster[:endpoint].register_path_params_matcher(path_params)
|
38
|
-
|
39
|
-
endpoint
|
40
|
-
end
|
41
|
-
|
42
6
|
def fetch_endpoint(request_method, request_path)
|
43
7
|
normalized_request_path = Rack::App::Utils.normalize_path(request_path)
|
44
8
|
|
@@ -59,21 +23,10 @@ class Rack::App::Router::Dynamic
|
|
59
23
|
current_cluster[:endpoint]
|
60
24
|
end
|
61
25
|
|
62
|
-
def merge!(router)
|
63
|
-
raise(ArgumentError, "invalid route object, must be instance of #{self.class.to_s}") unless router.is_a?(self.class)
|
64
|
-
deep_merge!(@http_method_cluster, router.instance_variable_get(:@http_method_cluster))
|
65
|
-
nil
|
66
|
-
end
|
67
|
-
|
68
|
-
def show_endpoints
|
69
|
-
@endpoint_paths
|
70
|
-
end
|
71
|
-
|
72
26
|
protected
|
73
27
|
|
74
28
|
def initialize
|
75
29
|
@http_method_cluster = {}
|
76
|
-
@endpoint_paths = []
|
77
30
|
end
|
78
31
|
|
79
32
|
def path_part_is_dynamic?(path_part_str)
|
@@ -103,4 +56,42 @@ class Rack::App::Router::Dynamic
|
|
103
56
|
(path_part == '**' or path_part == '*')
|
104
57
|
end
|
105
58
|
|
59
|
+
def compile_registered_endpoints!
|
60
|
+
@http_method_cluster.clear
|
61
|
+
endpoints.each do |endpoint_prop|
|
62
|
+
compile_endpoint(endpoint_prop[:request_method],endpoint_prop[:request_path],endpoint_prop[:endpoint])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def compile_endpoint(request_method, request_path, endpoint)
|
67
|
+
|
68
|
+
current_cluster = main_cluster(request_method)
|
69
|
+
path_params = {}
|
70
|
+
break_build = false
|
71
|
+
|
72
|
+
request_path.split('/').each.with_index do |path_part, index|
|
73
|
+
|
74
|
+
new_cluster_name = if path_part_is_dynamic?(path_part)
|
75
|
+
path_params[index]= path_part.sub(/^:/, '')
|
76
|
+
PATH_PARAM
|
77
|
+
|
78
|
+
elsif path_part_is_a_partial?(path_part)
|
79
|
+
break_build = true
|
80
|
+
PARTIAL
|
81
|
+
|
82
|
+
else
|
83
|
+
path_part
|
84
|
+
end
|
85
|
+
|
86
|
+
current_cluster = (current_cluster[new_cluster_name] ||= {})
|
87
|
+
break if break_build
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
current_cluster[:endpoint]= endpoint
|
92
|
+
current_cluster[:endpoint].register_path_params_matcher(path_params)
|
93
|
+
|
94
|
+
endpoint
|
95
|
+
end
|
96
|
+
|
106
97
|
end
|
@@ -1,32 +1,21 @@
|
|
1
|
-
class Rack::App::Router::Static
|
2
|
-
|
3
|
-
#TD
|
4
|
-
attr_reader :endpoints
|
5
|
-
|
6
|
-
def add_endpoint(request_method, request_path, endpoint)
|
7
|
-
@endpoints[[request_method.to_s.upcase, Rack::App::Utils.normalize_path(request_path)]]= endpoint
|
8
|
-
end
|
1
|
+
class Rack::App::Router::Static < Rack::App::Router::Base
|
9
2
|
|
10
3
|
def fetch_endpoint(request_method, request_path)
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
def merge!(static_router)
|
15
|
-
raise(ArgumentError, "Invalid argument given, must be instance of a #{self.class.to_s}") unless static_router.is_a?(self.class)
|
16
|
-
@endpoints.merge!(static_router.instance_variable_get(:@endpoints))
|
17
|
-
nil
|
4
|
+
mapped_endpoint_routes[[request_method, request_path]]
|
18
5
|
end
|
19
6
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
7
|
+
def compile_registered_endpoints!
|
8
|
+
mapped_endpoint_routes.clear
|
9
|
+
endpoints.each do |endpoint|
|
10
|
+
request_method, request_path, endpoint_object = endpoint[:request_method], endpoint[:request_path], endpoint[:endpoint]
|
11
|
+
mapped_endpoint_routes[[request_method.to_s.upcase, request_path]]= endpoint_object
|
23
12
|
end
|
24
13
|
end
|
25
14
|
|
26
15
|
protected
|
27
16
|
|
28
|
-
def
|
29
|
-
@
|
17
|
+
def mapped_endpoint_routes
|
18
|
+
@mapped_endpoint_routes ||= {}
|
30
19
|
end
|
31
20
|
|
32
21
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.20.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Luzsi
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-02-
|
12
|
+
date: 2016-02-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -100,6 +100,7 @@ files:
|
|
100
100
|
- lib/rack/app/params.rb
|
101
101
|
- lib/rack/app/request_configurator.rb
|
102
102
|
- lib/rack/app/router.rb
|
103
|
+
- lib/rack/app/router/base.rb
|
103
104
|
- lib/rack/app/router/dynamic.rb
|
104
105
|
- lib/rack/app/router/static.rb
|
105
106
|
- lib/rack/app/serializer.rb
|