web_router 0.1.5 → 0.1.6
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/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
|
- - ">="
|