web_router 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/web_router/controller.rb +35 -0
- data/lib/web_router/router.rb +65 -0
- data/lib/web_router/version.rb +3 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b21f3a0a70b75d14c32662c7f2adf56be54bc73
|
4
|
+
data.tar.gz: 9c5686f3512a30a0abb8a5e600d296c92b9bdf39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 582974781d57cf044d3c3e4b994ea547760983c25c886962cf0bec571225173303905ca8866d5b09f0e535292e6b552d385544b0cb5da584b79377d1e378b86f
|
7
|
+
data.tar.gz: 94f274182e0aca6323e057feab5741fa18e8adbd10600c64498758728d1b97da0396605e025cb12b96e29773e56c4bab5143498a8a578120e30902348cbcda33
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class WebRouter::Controller
|
2
|
+
RESPONSE_TYPES = {
|
3
|
+
text: ['text/plain', -> (c) { c.to_s }],
|
4
|
+
json: ['application/json', -> (c) { Oj.dump(c) }],
|
5
|
+
}
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
@env = env
|
9
|
+
@request = Rack::Request.new(env)
|
10
|
+
@request.params.merge!(env['router.params'] || {})
|
11
|
+
send(@action_name)
|
12
|
+
[200, @response_headers, [@response_body]]
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.action(action_name)
|
16
|
+
proc { |env| new(action_name).call(env)}
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
attr_reader :request
|
21
|
+
|
22
|
+
def initialize(action_name)
|
23
|
+
@action_name = action_name
|
24
|
+
end
|
25
|
+
|
26
|
+
def params
|
27
|
+
request.params
|
28
|
+
end
|
29
|
+
|
30
|
+
def response(type, content)
|
31
|
+
@response_headers ||= {}
|
32
|
+
@response_headers.merge!('Content-Type' => RESPONSE_TYPES[type][0] )
|
33
|
+
@response_body = RESPONSE_TYPES[type][1].call(content)
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class WebRouter::Router
|
2
|
+
def call(env)
|
3
|
+
find_route(env).call(env)
|
4
|
+
end
|
5
|
+
|
6
|
+
def configure(&block)
|
7
|
+
instance_exec(&block)
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
attr_reader :routes
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@routes = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def get(path, rack_app) match('GET', path, rack_app) end
|
19
|
+
def post(path, rack_app) match('POST', path, rack_app) end
|
20
|
+
def put(path, rack_app) match('PUT', path, rack_app) end
|
21
|
+
def delete(path, rack_app) match('DELETE', path, rack_app) end
|
22
|
+
|
23
|
+
def match(http_method, path, rack_app)
|
24
|
+
rack_app = get_controller_action(rack_app) if rack_app.is_a? String
|
25
|
+
routes << { pattern: path, app: rack_app, regexp: path_to_regexp(path), method: http_method}
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_controller_action(str)
|
29
|
+
controller_name, action_name = str.split('#') # tests#show => ['tests', 'show']
|
30
|
+
controller_name = to_upper_camel_case(controller_name)
|
31
|
+
Kernel.const_get(controller_name).send(:action, action_name)
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_upper_camel_case(str)
|
35
|
+
str # 'public_pages/tests' => PublicPages::TestsController
|
36
|
+
.split('/') # ['public_pages', 'test']
|
37
|
+
.map { |part| part.split('_').map(&:capitalize).join } # ['PublicPages', 'Test']
|
38
|
+
.join('::') + 'Controller'
|
39
|
+
end
|
40
|
+
|
41
|
+
def find_route(env)
|
42
|
+
routes.each do |route|
|
43
|
+
if env['REQUEST_METHOD'] == route[:method] && env['REQUEST_PATH'] =~ route[:regexp]
|
44
|
+
env['router.params'] = extract_params(route[:pattern], env['REQUEST_PATH'])
|
45
|
+
return route[:app]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
->(_env) { [404, {}, ['not found']] }
|
50
|
+
end
|
51
|
+
|
52
|
+
def path_to_regexp(path)
|
53
|
+
Regexp.new('\A' + path.gsub(/:[\w-]+/, '[\w-]+') + '\Z')
|
54
|
+
end
|
55
|
+
|
56
|
+
# pattern: "post/:name", route: "post/about_ruby"
|
57
|
+
def extract_params(pattern, path)
|
58
|
+
pattern
|
59
|
+
.split('/') # ['post', ':name']
|
60
|
+
.zip(path.split('/')) # [['post', 'post'],[':name', 'post']]
|
61
|
+
.reject { |e| e.first == e.last } # [[':name', 'post']]
|
62
|
+
.map { |e| [e.first[1..-1], e.last] } # [['name', 'post']]
|
63
|
+
.to_h
|
64
|
+
end
|
65
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: web_router
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- superedriver
|
@@ -102,6 +102,9 @@ extensions: []
|
|
102
102
|
extra_rdoc_files: []
|
103
103
|
files:
|
104
104
|
- lib/web_router.rb
|
105
|
+
- lib/web_router/controller.rb
|
106
|
+
- lib/web_router/router.rb
|
107
|
+
- lib/web_router/version.rb
|
105
108
|
homepage: https://github.com/superedriver/web_router
|
106
109
|
licenses:
|
107
110
|
- MIT
|
@@ -110,10 +113,7 @@ metadata:
|
|
110
113
|
post_install_message:
|
111
114
|
rdoc_options: []
|
112
115
|
require_paths:
|
113
|
-
- lib
|
114
|
-
- lib/web_router/controller.rb
|
115
|
-
- lib/web_router/router.rb
|
116
|
-
- lib/web_router/version.rb
|
116
|
+
- lib
|
117
117
|
required_ruby_version: !ruby/object:Gem::Requirement
|
118
118
|
requirements:
|
119
119
|
- - ">="
|