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 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
  - - ">="