flame 4.0.7.2 → 4.0.9
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/flame/dispatcher.rb +3 -3
- data/lib/flame/route.rb +39 -32
- data/lib/flame/router.rb +29 -50
- data/lib/flame/validators.rb +7 -3
- data/lib/flame/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 75e02998d8d17eae77b354d3e0f728bf0fbf37e6
|
4
|
+
data.tar.gz: c6e806c54b89f1f89e3bad8334f654fad103278b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 357ad3becd4d875377fa55c76b23eb4f2ab7d1c94e9c8f3493751b125f4d085e747bce14d0aeac8463d74095ab433dd6e6842fccb122f8b39c295f8b2784f42b
|
7
|
+
data.tar.gz: 7fda6f630bedcd1755161218e567a9c0741536145213ccef10579562210e560b9a5c58ebccc6cd673d19c733fd2ae366afd9be34a5de3836c632c30bc052862e
|
data/lib/flame/dispatcher.rb
CHANGED
@@ -171,15 +171,15 @@ module Flame
|
|
171
171
|
route = @app.router.find_nearest_route(request.path_parts)
|
172
172
|
## Halt with default body if the route not found
|
173
173
|
## or it's `not_found` method not defined
|
174
|
-
return halt unless route && route
|
174
|
+
return halt unless route && route.controller.method_defined?(:not_found)
|
175
175
|
## Execute `not_found` method for the founded route
|
176
176
|
route_exec(route, :not_found)
|
177
177
|
end
|
178
178
|
|
179
179
|
## Create controller object and execute method
|
180
180
|
def route_exec(route, method = nil)
|
181
|
-
method ||= route
|
182
|
-
route
|
181
|
+
method ||= route.action
|
182
|
+
route.controller.new(self).send(:execute, method)
|
183
183
|
end
|
184
184
|
end
|
185
185
|
end
|
data/lib/flame/route.rb
CHANGED
@@ -1,27 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Flame
|
2
4
|
class Router
|
5
|
+
ARG_CHAR = ':'.freeze
|
6
|
+
ARG_CHAR_OPT = '?'.freeze
|
7
|
+
|
3
8
|
## Class for Route in Router.routes
|
4
9
|
class Route
|
5
|
-
attr_reader :
|
6
|
-
|
7
|
-
def initialize(attrs = {})
|
8
|
-
@attributes = attrs.merge(
|
9
|
-
## Split path to parts (Array of String)
|
10
|
-
path_parts: attrs[:path].to_s.split('/').reject(&:empty?).freeze
|
11
|
-
)
|
12
|
-
end
|
10
|
+
attr_reader :method, :controller, :action, :path, :path_parts
|
13
11
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
@
|
12
|
+
def initialize(controller, action, method, path)
|
13
|
+
@controller = controller
|
14
|
+
@action = action
|
15
|
+
@method = method.to_sym.upcase
|
16
|
+
## MAKE PATH
|
17
|
+
@path = path
|
18
|
+
Validators::ArgumentsValidator.new(@controller, @path, @action).valid?
|
19
|
+
@path_parts = @path.to_s.split('/').reject(&:empty?)
|
20
|
+
freeze
|
18
21
|
end
|
19
22
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
@attributes[key] = value
|
23
|
+
def freeze
|
24
|
+
@path.freeze
|
25
|
+
@path_parts.freeze
|
26
|
+
super
|
25
27
|
end
|
26
28
|
|
27
29
|
## Compare attributes for `Router.find_route`
|
@@ -36,25 +38,30 @@ module Flame
|
|
36
38
|
## Assign arguments to path for `Controller.path_to`
|
37
39
|
## @param args [Hash] arguments for assigning
|
38
40
|
def assign_arguments(args = {})
|
39
|
-
|
40
|
-
|
41
|
-
.unshift('').join('/').gsub(%r{\/{2,}}, '/')
|
41
|
+
parts = @path_parts.map { |part| assign_argument(part, args) }
|
42
|
+
self.class.path_merge(parts.unshift(''))
|
42
43
|
end
|
43
44
|
|
44
45
|
## Extract arguments from request_parts for `execute`
|
45
46
|
## @param request_parts [Array] parts of the request (Array of String)
|
46
47
|
def arguments(request_parts)
|
47
|
-
|
48
|
+
@path_parts.each_with_index.with_object({}) do |(path_part, i), args|
|
48
49
|
request_part = request_parts[i]
|
49
|
-
path_part_opt = path_part[1] ==
|
50
|
-
next args unless path_part[0] ==
|
50
|
+
path_part_opt = path_part[1] == ARG_CHAR_OPT
|
51
|
+
next args unless path_part[0] == ARG_CHAR
|
51
52
|
break args if path_part_opt && request_part.nil?
|
52
53
|
args[
|
53
|
-
|
54
|
+
path_part[(path_part_opt ? 2 : 1)..-1].to_sym
|
54
55
|
] = URI.decode(request_part)
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
59
|
+
def self.path_merge(*parts)
|
60
|
+
parts.join('/').gsub(%r{\/{2,}}, '/')
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
58
65
|
## Helpers for `compare_attributes`
|
59
66
|
def compare_attribute(name, value)
|
60
67
|
case name
|
@@ -63,24 +70,24 @@ module Flame
|
|
63
70
|
when :path_parts
|
64
71
|
compare_path_parts(value)
|
65
72
|
else
|
66
|
-
|
73
|
+
send(name) == value
|
67
74
|
end
|
68
75
|
end
|
69
76
|
|
70
77
|
def compare_method(request_method)
|
71
|
-
|
78
|
+
method.upcase.to_sym == request_method.upcase.to_sym
|
72
79
|
end
|
73
80
|
|
74
81
|
def compare_path_parts(request_parts)
|
75
82
|
# p route_path
|
76
|
-
req_path_parts =
|
83
|
+
req_path_parts = @path_parts.select { |part| part[1] != ARG_CHAR_OPT }
|
77
84
|
return false if request_parts.count < req_path_parts.count
|
78
85
|
# compare_parts(request_parts, self[:path_parts])
|
79
86
|
request_parts.each_with_index do |request_part, i|
|
80
|
-
path_part =
|
87
|
+
path_part = @path_parts[i]
|
81
88
|
# p request_part, path_part
|
82
89
|
break false unless path_part
|
83
|
-
next if path_part[0] ==
|
90
|
+
next if path_part[0] == ARG_CHAR
|
84
91
|
break false unless request_part == path_part
|
85
92
|
end
|
86
93
|
end
|
@@ -88,13 +95,13 @@ module Flame
|
|
88
95
|
## Helpers for `assign_arguments`
|
89
96
|
def assign_argument(path_part, args = {})
|
90
97
|
## Not argument
|
91
|
-
return path_part unless path_part[0] ==
|
98
|
+
return path_part unless path_part[0] == ARG_CHAR
|
92
99
|
## Not required argument
|
93
|
-
return args[path_part[2..-1].to_sym] if path_part[1] ==
|
100
|
+
return args[path_part[2..-1].to_sym] if path_part[1] == ARG_CHAR_OPT
|
94
101
|
## Required argument
|
95
102
|
param = args[path_part[1..-1].to_sym]
|
96
103
|
## Required argument is nil
|
97
|
-
error = Errors::ArgumentNotAssignedError.new(
|
104
|
+
error = Errors::ArgumentNotAssignedError.new(path, path_part)
|
98
105
|
fail error if param.nil?
|
99
106
|
## All is ok
|
100
107
|
param
|
data/lib/flame/router.rb
CHANGED
@@ -67,9 +67,9 @@ module Flame
|
|
67
67
|
@rest_routes ||= [
|
68
68
|
{ method: :GET, path: '/', action: :index },
|
69
69
|
{ method: :POST, path: '/', action: :create },
|
70
|
-
{ method: :GET, path: '
|
71
|
-
{ method: :PUT, path: '
|
72
|
-
{ method: :DELETE, path: '
|
70
|
+
{ method: :GET, path: '/', action: :show },
|
71
|
+
{ method: :PUT, path: '/', action: :update },
|
72
|
+
{ method: :DELETE, path: '/', action: :delete }
|
73
73
|
]
|
74
74
|
end
|
75
75
|
|
@@ -94,13 +94,17 @@ module Flame
|
|
94
94
|
## @param action [Symbol] name of method for the request
|
95
95
|
## @example Set method to :POST for action `goodbye`
|
96
96
|
## post :goodbye
|
97
|
-
|
98
|
-
|
97
|
+
method = request_method.downcase
|
98
|
+
define_method(method) do |path, action = nil, prefix: false|
|
99
|
+
unless action
|
99
100
|
action = path.to_sym
|
100
|
-
path =
|
101
|
+
path = nil
|
101
102
|
end
|
102
|
-
|
103
|
-
|
103
|
+
path = default_action_path(action, path) if prefix || path.nil?
|
104
|
+
path = Route.path_merge(@path, path)
|
105
|
+
route = Route.new(@ctrl, action, method, path)
|
106
|
+
index = find_route_index(action: action)
|
107
|
+
index ? @routes[index] = route : @routes.push(route)
|
104
108
|
end
|
105
109
|
end
|
106
110
|
|
@@ -110,7 +114,7 @@ module Flame
|
|
110
114
|
rest
|
111
115
|
@ctrl.public_instance_methods(false).each do |action|
|
112
116
|
next if find_route_index(action: action)
|
113
|
-
|
117
|
+
send(:GET.downcase, action)
|
114
118
|
end
|
115
119
|
end
|
116
120
|
|
@@ -118,10 +122,9 @@ module Flame
|
|
118
122
|
def rest
|
119
123
|
rest_routes.each do |rest_route|
|
120
124
|
action = rest_route[:action]
|
121
|
-
|
125
|
+
next unless @ctrl.public_instance_methods.include?(action) &&
|
122
126
|
find_route_index(action: action).nil?
|
123
|
-
|
124
|
-
end
|
127
|
+
send(*rest_route.values.map(&:downcase), prefix: true)
|
125
128
|
end
|
126
129
|
end
|
127
130
|
|
@@ -130,10 +133,7 @@ module Flame
|
|
130
133
|
## @param path [String, nil] root path for mounting controller
|
131
134
|
## @yield Block of code for routes refine
|
132
135
|
def mount(ctrl, path = nil, &block)
|
133
|
-
path = path_merge(
|
134
|
-
@path,
|
135
|
-
(path || ctrl.default_path)
|
136
|
-
)
|
136
|
+
path = Route.path_merge(@path, path || ctrl.default_path)
|
137
137
|
@router.add_controller(ctrl, path, block)
|
138
138
|
end
|
139
139
|
|
@@ -142,48 +142,27 @@ module Flame
|
|
142
142
|
## Execute block of refinings end sorting routes
|
143
143
|
def execute(&block)
|
144
144
|
block.nil? ? defaults : instance_exec(&block)
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
@routes.sort! { |a, b| b[:path] <=> a[:path] }
|
145
|
+
@routes.sort! { |a, b| b.path <=> a.path }
|
146
|
+
end
|
147
|
+
|
148
|
+
def find_route_index(attrs)
|
149
|
+
@routes.find_index { |route| route.compare_attributes(attrs) }
|
151
150
|
end
|
152
151
|
|
153
152
|
## Build path for the action of controller
|
154
|
-
|
155
|
-
|
156
|
-
unshifted =
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
path = parameters.unshift(unshifted).join('/')
|
153
|
+
## @todo Add :arg:type support (:id:num, :name:str, etc.)
|
154
|
+
def default_action_path(action, prefix)
|
155
|
+
unshifted = prefix ? prefix : action_prefix(action)
|
156
|
+
parameters = @ctrl.instance_method(action).parameters
|
157
|
+
parameters.map! do |par|
|
158
|
+
":#{par[0] == :req ? '' : ARG_CHAR_OPT}#{par[1]}"
|
161
159
|
end
|
162
|
-
path_merge(
|
160
|
+
Route.path_merge(parameters.unshift(unshifted))
|
163
161
|
end
|
164
162
|
|
165
|
-
def
|
163
|
+
def action_prefix(action)
|
166
164
|
action == :index ? '/' : action
|
167
165
|
end
|
168
|
-
|
169
|
-
def path_merge(*parts)
|
170
|
-
parts.join('/').gsub(%r{\/{2,}}, '/')
|
171
|
-
end
|
172
|
-
|
173
|
-
def add_route(method, path, action, force_params = false)
|
174
|
-
route = Route.new(
|
175
|
-
method: method,
|
176
|
-
path: make_path(path, action, force_params),
|
177
|
-
controller: @ctrl,
|
178
|
-
action: action
|
179
|
-
)
|
180
|
-
index = find_route_index(action: action)
|
181
|
-
index ? @routes[index] = route : @routes.push(route)
|
182
|
-
end
|
183
|
-
|
184
|
-
def find_route_index(attrs)
|
185
|
-
@routes.find_index { |route| route.compare_attributes(attrs) }
|
186
|
-
end
|
187
166
|
end
|
188
167
|
end
|
189
168
|
end
|
data/lib/flame/validators.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require_relative 'route'
|
1
2
|
require_relative 'errors'
|
2
3
|
|
3
4
|
module Flame
|
@@ -23,8 +24,11 @@ module Flame
|
|
23
24
|
|
24
25
|
## Split path to args array
|
25
26
|
def path_arguments(path)
|
26
|
-
args = path.split('/').select { |part| part[0] ==
|
27
|
-
args.map
|
27
|
+
args = path.split('/').select { |part| part[0] == Router::ARG_CHAR }
|
28
|
+
args.map do |arg|
|
29
|
+
opt_arg = arg[1] == Router::ARG_CHAR_OPT
|
30
|
+
arg[(opt_arg ? 2 : 1)..-1].to_sym
|
31
|
+
end
|
28
32
|
end
|
29
33
|
|
30
34
|
## Take args from controller's action
|
@@ -59,7 +63,7 @@ module Flame
|
|
59
63
|
## Compare actions from routes and from controller
|
60
64
|
class ActionsValidator
|
61
65
|
def initialize(route_refine)
|
62
|
-
@routes_actions = route_refine.routes.map { |route| route
|
66
|
+
@routes_actions = route_refine.routes.map { |route| route.action }
|
63
67
|
@ctrl = route_refine.ctrl
|
64
68
|
@ctrl_actions = {
|
65
69
|
public: @ctrl.public_instance_methods(false),
|
data/lib/flame/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flame
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Popov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|