flame 2.2.0 → 3.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/flame/application.rb +44 -16
- data/lib/flame/controller.rb +49 -0
- data/lib/flame/dispatcher.rb +52 -64
- data/lib/flame/errors.rb +15 -2
- data/lib/flame/render.rb +6 -2
- data/lib/flame/route.rb +6 -1
- data/lib/flame/router.rb +53 -27
- data/lib/flame/validators.rb +3 -3
- data/lib/flame.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c72f15f6e82b2b169b8e8db77fe10d1d3674e217
|
4
|
+
data.tar.gz: 319e24d36eacdbda8cd2454270cf6dea293d9d55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 414b88f416bc9ba7d7723d5df9d419c36865f3c08ce55f7f800e52f4b0371f8243d19800ccc37ef9194080be88296e0d832f0a95e3a4e4d76ddfcc6842b1b581
|
7
|
+
data.tar.gz: 96c70734f79a4a12040a3895445d18d97cad4a858b093a858d9f46399ebcf9aeb028526840238e5b9e860f4491263c2ace2368d36460fef9858fe8dc48916e61
|
data/lib/flame/application.rb
CHANGED
@@ -1,32 +1,35 @@
|
|
1
1
|
require_relative 'router'
|
2
|
+
require_relative 'request'
|
2
3
|
require_relative 'dispatcher'
|
3
4
|
|
4
5
|
module Flame
|
5
6
|
## Core class, like Framework::Application
|
6
7
|
class Application
|
7
|
-
|
8
|
-
|
9
|
-
@config ||= {}
|
8
|
+
class << self
|
9
|
+
attr_accessor :config
|
10
10
|
end
|
11
11
|
|
12
|
+
## Framework configuration
|
12
13
|
def config
|
13
14
|
self.class.config
|
14
15
|
end
|
15
16
|
|
16
17
|
def self.inherited(app)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
app.config = Config.new(
|
19
|
+
app,
|
20
|
+
default_config_dirs(
|
21
|
+
root_dir: File.dirname(caller[0].split(':')[0])
|
22
|
+
)
|
22
23
|
)
|
23
|
-
app.use Rack::Session::Pool
|
24
|
+
# app.use Rack::Session::Pool
|
24
25
|
end
|
25
26
|
|
26
27
|
def initialize
|
27
28
|
app = self
|
28
29
|
@builder = Rack::Builder.new do
|
29
|
-
app.class.middlewares.each
|
30
|
+
app.class.middlewares.each do |m|
|
31
|
+
use m[:class], *m[:args], &m[:block]
|
32
|
+
end
|
30
33
|
run app
|
31
34
|
end
|
32
35
|
end
|
@@ -34,7 +37,7 @@ module Flame
|
|
34
37
|
## Init function
|
35
38
|
def call(env)
|
36
39
|
if env[:FLAME_CALL]
|
37
|
-
Dispatcher.new(self, env).run!
|
40
|
+
Flame::Dispatcher.new(self, env).run!
|
38
41
|
else
|
39
42
|
env[:FLAME_CALL] = true
|
40
43
|
@builder.call env
|
@@ -45,21 +48,46 @@ module Flame
|
|
45
48
|
router.add_controller(ctrl, path, block)
|
46
49
|
end
|
47
50
|
|
51
|
+
def self.middlewares
|
52
|
+
@middlewares ||= []
|
53
|
+
end
|
54
|
+
|
48
55
|
def self.use(middleware, *args, &block)
|
49
56
|
middlewares << { class: middleware, args: args, block: block }
|
50
57
|
end
|
51
58
|
|
52
|
-
def self.
|
53
|
-
@
|
59
|
+
def self.helpers(*modules)
|
60
|
+
modules.empty? ? (@helpers ||= []) : @helpers = modules
|
54
61
|
end
|
55
62
|
|
56
63
|
## Router for routing
|
57
64
|
def self.router
|
58
|
-
@router ||= Flame::Router.new
|
65
|
+
@router ||= Flame::Router.new(self)
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.default_config_dirs(root_dir:)
|
69
|
+
{
|
70
|
+
root_dir: File.realpath(root_dir),
|
71
|
+
public_dir: proc { File.join(config[:root_dir], 'public') },
|
72
|
+
views_dir: proc { File.join(config[:root_dir], 'views') },
|
73
|
+
config_dir: proc { File.join(config[:root_dir], 'config') }
|
74
|
+
}
|
59
75
|
end
|
60
76
|
|
61
|
-
|
62
|
-
|
77
|
+
## Class for Flame::Application.config
|
78
|
+
class Config < Hash
|
79
|
+
def initialize(app, hash = {})
|
80
|
+
@app = app
|
81
|
+
replace(hash)
|
82
|
+
end
|
83
|
+
|
84
|
+
def [](key)
|
85
|
+
result = super(key)
|
86
|
+
if result.class <= Proc && result.parameters.empty?
|
87
|
+
result = @app.class_exec(&result)
|
88
|
+
end
|
89
|
+
result
|
90
|
+
end
|
63
91
|
end
|
64
92
|
end
|
65
93
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'rack'
|
2
|
+
require_relative 'render'
|
3
|
+
|
4
|
+
module Flame
|
5
|
+
## Class initialize when Dispatcher found route with it
|
6
|
+
## For new request and response
|
7
|
+
class Controller
|
8
|
+
def initialize(dispatcher)
|
9
|
+
@dispatcher = dispatcher
|
10
|
+
end
|
11
|
+
|
12
|
+
## Helpers
|
13
|
+
def path_to(*args)
|
14
|
+
args.unshift self.class if args[0].is_a? Symbol
|
15
|
+
@dispatcher.path_to(*args)
|
16
|
+
end
|
17
|
+
|
18
|
+
def redirect(*params)
|
19
|
+
response.redirect(
|
20
|
+
params[0].is_a?(String) ? params[0] : path_to(*params)
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
def view(path = nil, options = {})
|
25
|
+
Flame::Render.new(
|
26
|
+
self,
|
27
|
+
(path || caller_locations(1, 1)[0].label.to_sym),
|
28
|
+
options
|
29
|
+
).render
|
30
|
+
end
|
31
|
+
alias_method :render, :view
|
32
|
+
|
33
|
+
## Helpers from Flame::Dispatcher
|
34
|
+
def method_missing(m, *args, &block)
|
35
|
+
return super unless @dispatcher.respond_to?(m)
|
36
|
+
@dispatcher.send(m, *args, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
using GorillaPatch::StringExt
|
42
|
+
|
43
|
+
def self.default_path(last = false)
|
44
|
+
(name.split('::').last.underscore.split('_') - %w(controller ctrl))
|
45
|
+
.join('/').split('/')
|
46
|
+
.unshift(nil)[(last ? -1 : 0)..-1].join('/')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/flame/dispatcher.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
|
-
require 'rack'
|
2
|
-
require_relative 'request'
|
3
|
-
require_relative 'render'
|
4
|
-
|
5
1
|
module Flame
|
6
|
-
##
|
7
|
-
## For new request and response
|
2
|
+
## Helpers for dispatch Flame::Application#call
|
8
3
|
class Dispatcher
|
4
|
+
attr_reader :request, :response
|
5
|
+
|
9
6
|
def initialize(app, env)
|
10
7
|
@app = app
|
11
|
-
@
|
8
|
+
@request = Flame::Request.new(env)
|
9
|
+
@response = Rack::Response.new
|
12
10
|
end
|
13
11
|
|
14
12
|
def run!
|
@@ -18,38 +16,41 @@ module Flame
|
|
18
16
|
try_static(File.join(__dir__, '..', '..', 'public')) ||
|
19
17
|
halt(404)
|
20
18
|
end
|
19
|
+
# p body
|
21
20
|
response.write body
|
22
21
|
response.finish
|
23
22
|
end
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
def status(value = nil)
|
25
|
+
response.status ||= 200
|
26
|
+
value ? response.status = value : response.status
|
28
27
|
end
|
29
28
|
|
30
|
-
def
|
31
|
-
|
29
|
+
def params
|
30
|
+
request.params
|
32
31
|
end
|
33
32
|
|
34
|
-
def
|
35
|
-
|
33
|
+
def session
|
34
|
+
request.session
|
36
35
|
end
|
37
36
|
|
38
|
-
def
|
39
|
-
request.
|
37
|
+
def cookies
|
38
|
+
@cookies ||= Cookies.new(request.cookies, response)
|
40
39
|
end
|
41
40
|
|
42
|
-
def
|
43
|
-
@
|
41
|
+
def config
|
42
|
+
@app.config
|
44
43
|
end
|
45
44
|
|
46
|
-
def
|
47
|
-
|
48
|
-
|
45
|
+
def path_to(ctrl, action, args = {})
|
46
|
+
route = @app.class.router.find_route(controller: ctrl, action: action)
|
47
|
+
fail RouteNotFoundError.new(ctrl, action) unless route
|
48
|
+
path = route.assign_arguments(args)
|
49
|
+
path.empty? ? '/' : path
|
49
50
|
end
|
50
51
|
|
51
52
|
def halt(new_status, body = '', new_headers = {})
|
52
|
-
status new_status
|
53
|
+
new_status.is_a?(String) ? (body = new_status) : (status new_status)
|
53
54
|
response.headers.merge!(new_headers)
|
54
55
|
# p response.body
|
55
56
|
if body.empty? &&
|
@@ -59,36 +60,11 @@ module Flame
|
|
59
60
|
throw :halt, body
|
60
61
|
end
|
61
62
|
|
62
|
-
def path_to(ctrl, action, args = {})
|
63
|
-
route = router.find_route(controller: ctrl, action: action)
|
64
|
-
fail RouteNotFoundError.new(ctrl, action) unless route
|
65
|
-
path = route.assign_arguments(args)
|
66
|
-
path.empty? ? '/' : path
|
67
|
-
end
|
68
|
-
|
69
|
-
def redirect(*params)
|
70
|
-
throw :halt, response.redirect(
|
71
|
-
params[0].is_a?(String) ? params[0] : path_to(*params)
|
72
|
-
)
|
73
|
-
end
|
74
|
-
|
75
|
-
def session
|
76
|
-
request.session
|
77
|
-
end
|
78
|
-
|
79
|
-
def cookies
|
80
|
-
@cookies ||= Cookies.new(request.cookies, response)
|
81
|
-
end
|
82
|
-
|
83
|
-
def view(path, options = {})
|
84
|
-
Flame::Render.new(self, path, options).render
|
85
|
-
end
|
86
|
-
alias_method :render, :view
|
87
|
-
|
88
63
|
private
|
89
64
|
|
65
|
+
## Find route and try execute it
|
90
66
|
def try_route
|
91
|
-
route = router.find_route(
|
67
|
+
route = @app.class.router.find_route(
|
92
68
|
method: request.http_method,
|
93
69
|
path_parts: request.path_parts
|
94
70
|
)
|
@@ -101,28 +77,44 @@ module Flame
|
|
101
77
|
end
|
102
78
|
|
103
79
|
def execute_route(route)
|
104
|
-
|
105
|
-
|
106
|
-
result = send(route[:action], *route.arranged_params(params))
|
107
|
-
|
108
|
-
|
80
|
+
ctrl = route[:controller].new(self)
|
81
|
+
route[:befores].each { |before| ctrl.send(before) }
|
82
|
+
result = ctrl.send(route[:action], *route.arranged_params(params))
|
83
|
+
route[:afters].each { |after| result = execute_after(ctrl, after, result) }
|
84
|
+
result
|
85
|
+
end
|
86
|
+
|
87
|
+
def execute_after(ctrl, after, result)
|
88
|
+
case after.class.to_s.to_sym
|
89
|
+
when :Symbol, :String
|
90
|
+
result = ctrl.send(after.to_sym, result)
|
91
|
+
when :Proc
|
92
|
+
ctrl.instance_exec(result, &after)
|
93
|
+
else
|
94
|
+
fail UnexpectedTypeOfAfterError.new(after, route)
|
109
95
|
end
|
110
96
|
result
|
111
97
|
end
|
112
98
|
|
99
|
+
## Find static files and try return it
|
113
100
|
def try_static(dir = config[:public_dir])
|
114
|
-
|
101
|
+
file = File.join(dir, request.path_info)
|
115
102
|
# p static_file
|
116
|
-
return nil unless File.exist?(
|
117
|
-
return_static(
|
103
|
+
return nil unless File.exist?(file) && File.file?(file)
|
104
|
+
return_static(file)
|
105
|
+
end
|
106
|
+
|
107
|
+
def static_cached?(file_time)
|
108
|
+
since = request.env['HTTP_IF_MODIFIED_SINCE']
|
109
|
+
since && Time.httpdate(since).to_i >= file_time.to_i
|
118
110
|
end
|
119
111
|
|
120
112
|
def return_static(file)
|
121
|
-
since = @env['HTTP_IF_MODIFIED_SINCE']
|
122
113
|
file_time = File.mtime(file)
|
123
|
-
halt 304 if
|
114
|
+
halt 304 if static_cached?(file_time)
|
115
|
+
mime_type = Rack::Mime.mime_type(File.extname(file))
|
124
116
|
response.headers.merge!(
|
125
|
-
'Content-Type' =>
|
117
|
+
'Content-Type' => mime_type,
|
126
118
|
'Last-Modified' => file_time.httpdate
|
127
119
|
# 'Content-Disposition' => 'attachment;' \
|
128
120
|
# "filename=\"#{File.basename(static_file)}\"",
|
@@ -131,10 +123,6 @@ module Flame
|
|
131
123
|
halt 200, File.read(file)
|
132
124
|
end
|
133
125
|
|
134
|
-
def file_mime_type(file)
|
135
|
-
Rack::Mime.mime_type(File.extname(file))
|
136
|
-
end
|
137
|
-
|
138
126
|
## Helper class for cookies
|
139
127
|
class Cookies
|
140
128
|
def initialize(request_cookies, response)
|
data/lib/flame/errors.rb
CHANGED
@@ -67,14 +67,27 @@ module Flame
|
|
67
67
|
end
|
68
68
|
|
69
69
|
## Error for Flame::Controller.path_to
|
70
|
-
class
|
70
|
+
class ArgumentNotAssignedError < StandardError
|
71
71
|
def initialize(path, path_part)
|
72
72
|
@path = path
|
73
73
|
@path_part = path_part
|
74
74
|
end
|
75
75
|
|
76
76
|
def message
|
77
|
-
"Argument '#{@path_part}' for '#{@path}' is not assigned"
|
77
|
+
"Argument '#{@path_part}' for path '#{@path}' is not assigned"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
## Error for Flame::Router.find_path
|
82
|
+
class UnexpectedTypeOfAfterError < StandardError
|
83
|
+
def initialize(after, route)
|
84
|
+
@after = after
|
85
|
+
@route = route
|
86
|
+
end
|
87
|
+
|
88
|
+
def message
|
89
|
+
"Unexpected after-block class '#{@after.class}'" \
|
90
|
+
" in route '#{@route}'"
|
78
91
|
end
|
79
92
|
end
|
80
93
|
end
|
data/lib/flame/render.rb
CHANGED
@@ -52,9 +52,13 @@ module Flame
|
|
52
52
|
def controller_dirs
|
53
53
|
## Build controller_dirs
|
54
54
|
controller_dir = (
|
55
|
-
@ctrl.
|
55
|
+
@ctrl.class.name.underscore.split('_') - %w(controller ctrl)
|
56
56
|
).join('_')
|
57
|
-
|
57
|
+
controller_dir_parts = controller_dir.split('/')
|
58
|
+
[controller_dir,
|
59
|
+
controller_dir_parts[1..-1].join('/'),
|
60
|
+
controller_dir_parts[1..-2].join('/'),
|
61
|
+
controller_dir_parts.last]
|
58
62
|
end
|
59
63
|
|
60
64
|
def layout_render(result)
|
data/lib/flame/route.rb
CHANGED
@@ -13,6 +13,11 @@ module Flame
|
|
13
13
|
@attributes[attribute]
|
14
14
|
end
|
15
15
|
|
16
|
+
def merge(attrs)
|
17
|
+
dup.attributes.merge!(attrs)
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
16
21
|
## Compare attributes for `Router.find_route`
|
17
22
|
def compare_attributes(attrs)
|
18
23
|
attrs.each do |name, value|
|
@@ -90,7 +95,7 @@ module Flame
|
|
90
95
|
## Required argument
|
91
96
|
param = args[path_part[1..-1].to_sym]
|
92
97
|
## Required argument is nil
|
93
|
-
fail
|
98
|
+
fail ArgumentNotAssignedError.new(self[:path], path_part) if param.nil?
|
94
99
|
## All is ok
|
95
100
|
param
|
96
101
|
end
|
data/lib/flame/router.rb
CHANGED
@@ -4,28 +4,31 @@ require_relative 'validators'
|
|
4
4
|
module Flame
|
5
5
|
## Router class for routing
|
6
6
|
class Router
|
7
|
-
|
7
|
+
attr_reader :app, :routes, :befores, :afters
|
8
8
|
|
9
|
-
def initialize
|
9
|
+
def initialize(app)
|
10
|
+
@app = app
|
10
11
|
@routes = []
|
11
12
|
@befores, @afters = Array.new(2) { {} }
|
12
13
|
end
|
13
14
|
|
14
15
|
def add_controller(ctrl, path, block = nil)
|
15
16
|
## TODO: Add Regexp paths
|
16
|
-
## TODO: Add `before` and `after` methods
|
17
17
|
|
18
18
|
## Add routes from controller to glob array
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
befores[ctrl] = ctrl_routes.befores
|
23
|
-
afters[ctrl] = ctrl_routes.afters
|
19
|
+
ctrl.include(*@app.helpers)
|
20
|
+
route_refine = RouteRefine.new(self, ctrl, path, block)
|
21
|
+
concat_routes(route_refine) if ActionsValidator.new(route_refine).valid?
|
24
22
|
end
|
25
23
|
|
26
24
|
## Find route by any attributes
|
27
|
-
def find_route(attrs)
|
28
|
-
routes.find { |
|
25
|
+
def find_route(attrs, with_hooks = true)
|
26
|
+
route = routes.find { |r| r.compare_attributes(attrs) }
|
27
|
+
return route unless route && with_hooks
|
28
|
+
route.merge(
|
29
|
+
befores: find_befores(route),
|
30
|
+
afters: find_afters(route)
|
31
|
+
)
|
29
32
|
end
|
30
33
|
|
31
34
|
## Find before hook by Route
|
@@ -42,10 +45,16 @@ module Flame
|
|
42
45
|
|
43
46
|
private
|
44
47
|
|
48
|
+
def concat_routes(route_refine)
|
49
|
+
routes.concat(route_refine.routes)
|
50
|
+
befores[route_refine.ctrl] = route_refine.befores
|
51
|
+
afters[route_refine.ctrl] = route_refine.afters
|
52
|
+
end
|
53
|
+
|
45
54
|
## Helper module for routing refine
|
46
55
|
class RouteRefine
|
47
56
|
attr_accessor :rest_routes
|
48
|
-
attr_reader :routes, :befores, :afters
|
57
|
+
attr_reader :ctrl, :routes, :befores, :afters
|
49
58
|
|
50
59
|
def self.http_methods
|
51
60
|
[:GET, :POST, :PUT, :DELETE]
|
@@ -61,31 +70,34 @@ module Flame
|
|
61
70
|
]
|
62
71
|
end
|
63
72
|
|
64
|
-
def initialize(ctrl, path, block)
|
73
|
+
def initialize(router, ctrl, path, block)
|
74
|
+
@router = router
|
65
75
|
@ctrl = ctrl
|
66
|
-
@path = path ||
|
76
|
+
@path = path || @ctrl.default_path
|
67
77
|
@routes = []
|
68
78
|
@befores, @afters = Array.new(2) { {} }
|
69
|
-
|
70
|
-
# p @routes
|
71
|
-
@routes.sort! { |a, b| b[:path] <=> a[:path] }
|
79
|
+
execute(&block)
|
72
80
|
end
|
73
81
|
|
74
82
|
http_methods.each do |request_method|
|
75
|
-
define_method(request_method.downcase) do |path, action|
|
83
|
+
define_method(request_method.downcase) do |path, action = nil|
|
84
|
+
if action.nil?
|
85
|
+
action = path.to_sym
|
86
|
+
path = "/#{path}"
|
87
|
+
end
|
76
88
|
ArgumentsValidator.new(@ctrl, path, action).valid?
|
77
89
|
add_route(request_method, path, action)
|
78
90
|
end
|
79
91
|
end
|
80
92
|
|
81
|
-
def before(actions, action)
|
93
|
+
def before(actions, action = nil, &block)
|
82
94
|
actions = [actions] unless actions.is_a?(Array)
|
83
|
-
actions.each { |a| (@befores[a] ||= []).push(action) }
|
95
|
+
actions.each { |a| (@befores[a] ||= []).push(action || block) }
|
84
96
|
end
|
85
97
|
|
86
|
-
def after(actions, action)
|
98
|
+
def after(actions, action = nil, &block)
|
87
99
|
actions = [actions] unless actions.is_a?(Array)
|
88
|
-
actions.each { |a| (@afters[a] ||= []).push(action) }
|
100
|
+
actions.each { |a| (@afters[a] ||= []).push(action || block) }
|
89
101
|
end
|
90
102
|
|
91
103
|
def defaults
|
@@ -106,13 +118,23 @@ module Flame
|
|
106
118
|
end
|
107
119
|
end
|
108
120
|
|
109
|
-
|
121
|
+
def mount(ctrl, path = nil, &block)
|
122
|
+
path = path_merge(
|
123
|
+
@path,
|
124
|
+
(path || ctrl.default_path(true))
|
125
|
+
)
|
126
|
+
@router.add_controller(ctrl, path, block)
|
127
|
+
end
|
110
128
|
|
111
|
-
|
129
|
+
private
|
112
130
|
|
113
|
-
def
|
114
|
-
|
115
|
-
|
131
|
+
def execute(&block)
|
132
|
+
block.nil? ? defaults : instance_exec(&block)
|
133
|
+
@router.app.helpers.each do |helper|
|
134
|
+
instance_exec(&helper.mount) if helper.respond_to?(:mount)
|
135
|
+
end
|
136
|
+
# p @routes
|
137
|
+
@routes.sort! { |a, b| b[:path] <=> a[:path] }
|
116
138
|
end
|
117
139
|
|
118
140
|
def make_path(path, action = nil, force_params = false)
|
@@ -124,13 +146,17 @@ module Flame
|
|
124
146
|
.unshift(unshifted)
|
125
147
|
.join('/')
|
126
148
|
end
|
127
|
-
|
149
|
+
path_merge(@path, path)
|
128
150
|
end
|
129
151
|
|
130
152
|
def action_path(action)
|
131
153
|
action == :index ? '/' : action
|
132
154
|
end
|
133
155
|
|
156
|
+
def path_merge(*parts)
|
157
|
+
parts.join('/').gsub(%r{\/{2,}}, '/')
|
158
|
+
end
|
159
|
+
|
134
160
|
def add_route(method, path, action, force_params = false)
|
135
161
|
route = Route.new(
|
136
162
|
method: method,
|
data/lib/flame/validators.rb
CHANGED
@@ -57,9 +57,9 @@ module Flame
|
|
57
57
|
|
58
58
|
## Compare actions from routes and from controller
|
59
59
|
class ActionsValidator
|
60
|
-
def initialize(
|
61
|
-
@routes = routes
|
62
|
-
@ctrl = ctrl
|
60
|
+
def initialize(route_refine)
|
61
|
+
@routes = route_refine.routes
|
62
|
+
@ctrl = route_refine.ctrl
|
63
63
|
end
|
64
64
|
|
65
65
|
def valid?
|
data/lib/flame.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
|
+
version: 3.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Popov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -74,6 +74,7 @@ extra_rdoc_files: []
|
|
74
74
|
files:
|
75
75
|
- lib/flame.rb
|
76
76
|
- lib/flame/application.rb
|
77
|
+
- lib/flame/controller.rb
|
77
78
|
- lib/flame/dispatcher.rb
|
78
79
|
- lib/flame/errors.rb
|
79
80
|
- lib/flame/render.rb
|