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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 659718b9ac4defa62c847f7ce4bf055164a54380
4
- data.tar.gz: 355c1d64e734f1d23220d3f0c37b2feb3b51a8a7
3
+ metadata.gz: 8b21f3a0a70b75d14c32662c7f2adf56be54bc73
4
+ data.tar.gz: 9c5686f3512a30a0abb8a5e600d296c92b9bdf39
5
5
  SHA512:
6
- metadata.gz: bf4c1cbcd544c624bd8c0102b47ec16809888bf48bacc471f6bc909883bdfc67552d8e45053c2945ceb3b1b633218924f43918f0c5ce2a44cab75a673710861c
7
- data.tar.gz: 9a95b7f4c331e78748903b0e8d7e649afdad77f1fa6b3eee01f8f90b259c04b9ac7d45672d228af6b4fafa2e7e18a7554d0ad61c233d4e1ad656751dfed196d2
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
@@ -0,0 +1,3 @@
1
+ module WebRouter
2
+ VERSION = "0.1.6"
3
+ 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.5
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/web_router.rb
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
  - - ">="