rack-app 0.10.1 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/VERSION +1 -1
- data/lib/rack/app/file.rb +0 -3
- data/lib/rack/app/file/server.rb +24 -20
- data/lib/rack/app/router.rb +15 -5
- data/lib/rack/app/router/dynamic.rb +40 -10
- data/lib/rack/app/router/static.rb +6 -1
- metadata +2 -5
- data/lib/rack/app/file/parser.rb +0 -24
- data/lib/rack/app/file/parser/erb.rb +0 -18
- data/lib/rack/app/file/parser/factory.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d90aa076001c7ddbd654f22791f34854fbcd1d80
|
4
|
+
data.tar.gz: df0aa5a38c939340419270aae93830def72f84f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de99d24d08255b30a9962f0307da406558ab7e3212a19116ef4fff00aadeede2b74b8fe008244dc19f11d7d8fa87bb201b22c0b620d90f61bb50bc53e25547b1
|
7
|
+
data.tar.gz: 6d2e15dd8548668f67786b7c96c89b9bdce77adce5dc006fcf250965fa958b1deaf8a14ed905e2a0dc9541f243492cb9e8e0be33879e8e4aa0a76027e4d48cdf
|
data/README.md
CHANGED
@@ -4,6 +4,8 @@
|
|
4
4
|
[travis-link]: http://travis-ci.org/adamluzsi/rack-app.rb
|
5
5
|
[travis-home]: http://travis-ci.org/
|
6
6
|
|
7
|
+
![Rack::App](http://rack-app-website.herokuapp.com/image/msruby.png)
|
8
|
+
|
7
9
|
Your next favourite rack based micro framework that is totally addition free!
|
8
10
|
Have a cup of awesomeness with your performance designed framework!
|
9
11
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.11.0
|
data/lib/rack/app/file.rb
CHANGED
data/lib/rack/app/file/server.rb
CHANGED
@@ -1,32 +1,36 @@
|
|
1
|
-
|
1
|
+
class Rack::App::File::Server
|
2
2
|
|
3
|
-
|
3
|
+
def initialize(root_folder, options={})
|
4
|
+
require 'rack/file'
|
4
5
|
|
5
|
-
|
6
|
+
namespace = formatted_namespace(options)
|
7
|
+
namespace.freeze
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
+
@namespace_rgx = /#{Regexp.escape(namespace)}/.freeze
|
10
|
+
@rack_file_server = ::Rack::File.new(Rack::App::Utils.pwd(root_folder), {})
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
raw_endpoint_name = file_path.sub(source_folder, '').split(File::Separator).join('/')
|
13
|
-
request_path = file_parser_class.format_request_path(raw_endpoint_name)
|
14
|
-
|
15
|
-
options request_path do
|
16
|
-
response.finish
|
17
|
-
end
|
12
|
+
end
|
18
13
|
|
19
|
-
|
20
|
-
|
14
|
+
def call(env)
|
15
|
+
env[::Rack::PATH_INFO]= clean_path_info(env).sub(@namespace_rgx, '')
|
16
|
+
@rack_file_server.call(env)
|
17
|
+
end
|
21
18
|
|
22
|
-
|
23
|
-
response.headers[Rack::CONTENT_TYPE]= Rack::Mime.mime_type(file_parser.file_type(file_path)).to_s
|
19
|
+
protected
|
24
20
|
|
25
|
-
|
26
|
-
|
21
|
+
def raw_namespace(options)
|
22
|
+
options[:to] || '/'
|
23
|
+
end
|
27
24
|
|
28
|
-
|
25
|
+
def formatted_namespace(options)
|
26
|
+
namespace = raw_namespace(options).to_s.sub(/^\//, '').sub(/\/$/, '')
|
27
|
+
namespace += '/' unless namespace.empty?
|
28
|
+
namespace
|
29
|
+
end
|
29
30
|
|
31
|
+
def clean_path_info(env)
|
32
|
+
path_info = ::Rack::Utils.unescape(env[::Rack::PATH_INFO])
|
33
|
+
return clean_path_info = ::Rack::Utils.clean_path_info(path_info)
|
30
34
|
end
|
31
35
|
|
32
36
|
end
|
data/lib/rack/app/router.rb
CHANGED
@@ -3,11 +3,21 @@ class Rack::App::Router
|
|
3
3
|
require 'rack/app/router/static'
|
4
4
|
require 'rack/app/router/dynamic'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
def show_endpoints
|
7
|
+
endpoints = (@static.show_endpoints + @dynamic.show_endpoints)
|
8
|
+
|
9
|
+
wd0 = endpoints.map { |row| row[0].to_s.length }.max
|
10
|
+
wd1 = endpoints.map { |row| row[1].to_s.length }.max
|
11
|
+
wd2 = endpoints.map { |row| row[2].to_s.length }.max
|
12
|
+
|
13
|
+
return endpoints.map do |row|
|
14
|
+
[
|
15
|
+
row[0].to_s.ljust(wd0),
|
16
|
+
row[1].to_s.ljust(wd1),
|
17
|
+
row[2].to_s.ljust(wd2)
|
18
|
+
].join(' ')
|
10
19
|
end
|
20
|
+
|
11
21
|
end
|
12
22
|
|
13
23
|
def add_endpoint(request_method, request_path, endpoint)
|
@@ -39,7 +49,7 @@ class Rack::App::Router
|
|
39
49
|
end
|
40
50
|
|
41
51
|
def defined_path_is_dynamic?(path_str)
|
42
|
-
!!(path_str.to_s =~ /\/:\w+/i)
|
52
|
+
!!(path_str.to_s =~ /\/:\w+/i) or !!(path_str.to_s =~ /\/\*/i)
|
43
53
|
end
|
44
54
|
|
45
55
|
end
|
@@ -1,22 +1,35 @@
|
|
1
1
|
class Rack::App::Router::Dynamic
|
2
2
|
|
3
|
-
|
3
|
+
PATH_PARAM = :"#{self}::PATH_PARAM".freeze
|
4
|
+
PARTIAL = :"#{self}::PARTIAL".freeze
|
5
|
+
|
6
|
+
# def endpoint_paths
|
7
|
+
# end
|
4
8
|
|
5
9
|
def add_endpoint(request_method, request_path, endpoint)
|
6
10
|
request_path = Rack::App::Utils.normalize_path(request_path)
|
11
|
+
@endpoint_paths << [request_method, request_path, endpoint.properties[:description]]
|
7
12
|
|
8
13
|
current_cluster = main_cluster(request_method)
|
9
14
|
path_params = {}
|
15
|
+
break_build = false
|
16
|
+
|
10
17
|
request_path.split('/').each.with_index do |path_part, index|
|
11
18
|
|
12
19
|
new_cluster_name = if path_part_is_dynamic?(path_part)
|
13
|
-
path_params[index]= path_part.sub(/^:/,'')
|
14
|
-
|
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
|
+
|
15
27
|
else
|
16
28
|
path_part
|
17
29
|
end
|
18
30
|
|
19
31
|
current_cluster = (current_cluster[new_cluster_name] ||= {})
|
32
|
+
break if break_build
|
20
33
|
|
21
34
|
end
|
22
35
|
|
@@ -31,38 +44,51 @@ class Rack::App::Router::Dynamic
|
|
31
44
|
|
32
45
|
current_cluster = main_cluster(request_method)
|
33
46
|
normalized_request_path.split('/').each do |path_part|
|
34
|
-
|
35
|
-
|
47
|
+
previous_cluster = current_cluster
|
48
|
+
current_cluster = current_cluster[path_part] || current_cluster[PATH_PARAM]
|
49
|
+
if current_cluster.nil?
|
50
|
+
if previous_cluster[PARTIAL]
|
51
|
+
current_cluster = previous_cluster[PARTIAL]
|
52
|
+
break
|
53
|
+
else
|
54
|
+
return nil
|
55
|
+
end
|
56
|
+
end
|
36
57
|
end
|
37
58
|
|
38
59
|
current_cluster[:endpoint]
|
39
60
|
end
|
40
61
|
|
41
62
|
def merge!(router)
|
42
|
-
raise(ArgumentError,"invalid route object, must be instance of #{self.class.to_s}") unless router.is_a?(self.class)
|
43
|
-
deep_merge!(@http_method_cluster,router.instance_variable_get(:@http_method_cluster))
|
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))
|
44
65
|
nil
|
45
66
|
end
|
46
67
|
|
68
|
+
def show_endpoints
|
69
|
+
@endpoint_paths
|
70
|
+
end
|
71
|
+
|
47
72
|
protected
|
48
73
|
|
49
74
|
def initialize
|
50
75
|
@http_method_cluster = {}
|
76
|
+
@endpoint_paths = []
|
51
77
|
end
|
52
78
|
|
53
79
|
def path_part_is_dynamic?(path_part_str)
|
54
80
|
!!(path_part_str.to_s =~ /^:\w+$/i)
|
55
81
|
end
|
56
82
|
|
57
|
-
def deep_merge!(hash,other_hash)
|
83
|
+
def deep_merge!(hash, other_hash)
|
58
84
|
other_hash.each_pair do |current_key, other_value|
|
59
85
|
|
60
86
|
this_value = hash[current_key]
|
61
87
|
|
62
88
|
hash[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
|
63
|
-
deep_merge!(this_value,other_value)
|
89
|
+
deep_merge!(this_value, other_value)
|
64
90
|
else
|
65
|
-
|
91
|
+
other_value
|
66
92
|
end
|
67
93
|
end
|
68
94
|
|
@@ -73,4 +99,8 @@ class Rack::App::Router::Dynamic
|
|
73
99
|
(@http_method_cluster[request_method.to_s.upcase] ||= {})
|
74
100
|
end
|
75
101
|
|
102
|
+
def path_part_is_a_partial?(path_part)
|
103
|
+
(path_part == '**' or path_part == '*')
|
104
|
+
end
|
105
|
+
|
76
106
|
end
|
@@ -12,11 +12,16 @@ class Rack::App::Router::Static
|
|
12
12
|
end
|
13
13
|
|
14
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)
|
15
|
+
raise(ArgumentError, "Invalid argument given, must be instance of a #{self.class.to_s}") unless static_router.is_a?(self.class)
|
16
16
|
@endpoints.merge!(static_router.instance_variable_get(:@endpoints))
|
17
17
|
nil
|
18
18
|
end
|
19
19
|
|
20
|
+
def show_endpoints
|
21
|
+
@endpoints.map do |identifiers, endpoint|
|
22
|
+
[identifiers, endpoint.properties[:description]].flatten
|
23
|
+
end
|
24
|
+
end
|
20
25
|
|
21
26
|
protected
|
22
27
|
|
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.11.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-01-
|
12
|
+
date: 2016-01-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -92,9 +92,6 @@ files:
|
|
92
92
|
- lib/rack/app/endpoint.rb
|
93
93
|
- lib/rack/app/endpoint/not_found.rb
|
94
94
|
- lib/rack/app/file.rb
|
95
|
-
- lib/rack/app/file/parser.rb
|
96
|
-
- lib/rack/app/file/parser/erb.rb
|
97
|
-
- lib/rack/app/file/parser/factory.rb
|
98
95
|
- lib/rack/app/file/server.rb
|
99
96
|
- lib/rack/app/file/streamer.rb
|
100
97
|
- lib/rack/app/file/version.rb
|
data/lib/rack/app/file/parser.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
class Rack::App::File::Parser
|
2
|
-
|
3
|
-
require 'rack/app/file/parser/factory'
|
4
|
-
require 'rack/app/file/parser/erb'
|
5
|
-
|
6
|
-
def self.format_request_path(request_path)
|
7
|
-
request_path
|
8
|
-
end
|
9
|
-
|
10
|
-
def parse(file_path)
|
11
|
-
Rack::App::File::Streamer.new(file_path)
|
12
|
-
end
|
13
|
-
|
14
|
-
def file_type(file_path)
|
15
|
-
File.extname(file_path)
|
16
|
-
end
|
17
|
-
|
18
|
-
protected
|
19
|
-
|
20
|
-
def initialize(app)
|
21
|
-
@app = app
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
class Rack::App::File::Parser::ERB < Rack::App::File::Parser
|
3
|
-
|
4
|
-
require 'erb'
|
5
|
-
|
6
|
-
def parse(file_path)
|
7
|
-
[::ERB.new(File.read(file_path)).result(@app.instance_eval { binding })]
|
8
|
-
end
|
9
|
-
|
10
|
-
def file_type(file_path)
|
11
|
-
super(file_path.sub(/\.erb$/, ''))
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.format_request_path(request_path)
|
15
|
-
request_path.sub(/\.erb$/, '')
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Rack::App::File::Parser::Factory
|
2
|
-
|
3
|
-
def use_file_parser(parser_class, *extensions)
|
4
|
-
extensions.each do |extension|
|
5
|
-
file_parser_classes[extension.to_s]= parser_class
|
6
|
-
end
|
7
|
-
nil
|
8
|
-
end
|
9
|
-
|
10
|
-
def find_file_parser_class_for(extension)
|
11
|
-
file_parser_classes[extension.to_s] || Rack::App::File::Parser
|
12
|
-
end
|
13
|
-
|
14
|
-
protected
|
15
|
-
|
16
|
-
def file_parser_classes
|
17
|
-
@file_parser_classes ||= {
|
18
|
-
'.erb' => Rack::App::File::Parser::ERB
|
19
|
-
}
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|