flame 4.18.0 → 4.18.1
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/controller.rb +5 -4
- data/lib/flame/dispatcher.rb +1 -1
- data/lib/flame/dispatcher/static.rb +44 -13
- data/lib/flame/errors/route_arguments_order_error.rb +19 -0
- data/lib/flame/errors/{route_arguments_error.rb → route_extra_arguments_error.rb} +1 -1
- data/lib/flame/errors/template_not_found_error.rb +18 -0
- data/lib/flame/path.rb +3 -1
- data/lib/flame/render.rb +5 -2
- data/lib/flame/validators.rb +48 -19
- data/lib/flame/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9fbe52ed5ac3bee05b2739396b58c83dce8f6969
|
4
|
+
data.tar.gz: b54f7a5c830967546d696a4fcccf93e22dcab9c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c384ad693932e066041d145885cace94ebe75a3eaa1830853df0bb6ddacbcb423f9f69c36d5c2bcca2297079ab636529f9aa6294c1389378a43444b16dd72c1
|
7
|
+
data.tar.gz: 4747eaf2eb6651776abf63ccd809e174ff747006be9289e1ff6aa564e55e4f7aa475ffbe7dee6d1b3b21fa382dbe69d787c452c183fceacbab7a48052472d1c9
|
data/lib/flame/controller.rb
CHANGED
@@ -19,7 +19,7 @@ module Flame
|
|
19
19
|
def_delegators(
|
20
20
|
:@dispatcher,
|
21
21
|
:config, :request, :params, :halt, :session, :response, :status, :body,
|
22
|
-
:default_body, :cached_tilts
|
22
|
+
:default_body, :cached_tilts, :find_static
|
23
23
|
)
|
24
24
|
|
25
25
|
## Initialize the controller for request execution
|
@@ -35,13 +35,14 @@ module Flame
|
|
35
35
|
end
|
36
36
|
|
37
37
|
## Build a URI to the given controller and action, or path
|
38
|
-
def url_to(*args)
|
38
|
+
def url_to(*args, **options)
|
39
39
|
first_arg = args.first
|
40
40
|
path =
|
41
41
|
if first_arg.is_a?(String) || first_arg.is_a?(Flame::Path)
|
42
|
-
first_arg
|
42
|
+
static_file = find_static(first_arg)
|
43
|
+
static_file.path(with_version: options[:version])
|
43
44
|
else
|
44
|
-
path_to(*args)
|
45
|
+
path_to(*args, **options)
|
45
46
|
end
|
46
47
|
"#{request.scheme}://#{request.host_with_port}#{path}"
|
47
48
|
end
|
data/lib/flame/dispatcher.rb
CHANGED
@@ -4,27 +4,58 @@ module Flame
|
|
4
4
|
class Dispatcher
|
5
5
|
## Module for working with static files
|
6
6
|
module Static
|
7
|
+
def find_static(filename = request.path_info, dir: config[:public_dir])
|
8
|
+
StaticFile.new(filename, dir)
|
9
|
+
end
|
10
|
+
|
7
11
|
private
|
8
12
|
|
9
13
|
## Find static files and try return it
|
10
|
-
def try_static(
|
11
|
-
file =
|
12
|
-
return nil unless
|
14
|
+
def try_static(*args)
|
15
|
+
file = find_static(*args)
|
16
|
+
return nil unless file.exist?
|
13
17
|
return_static(file)
|
14
18
|
end
|
15
19
|
|
16
|
-
def static_cached?(file_time)
|
17
|
-
since = request.env['HTTP_IF_MODIFIED_SINCE']
|
18
|
-
since && Time.httpdate(since).to_i >= file_time.to_i
|
19
|
-
end
|
20
|
-
|
21
20
|
def return_static(file)
|
22
|
-
|
23
|
-
|
24
|
-
response.content_type = File.extname(file)
|
21
|
+
halt 304 if file.newer? request.env['HTTP_IF_MODIFIED_SINCE']
|
22
|
+
response.content_type = file.extname
|
25
23
|
response[Rack::CACHE_CONTROL] = 'no-cache'
|
26
|
-
response['Last-Modified'] =
|
27
|
-
body
|
24
|
+
response['Last-Modified'] = file.mtime.httpdate
|
25
|
+
body file.content
|
26
|
+
end
|
27
|
+
|
28
|
+
## Class for static files with helpers methods
|
29
|
+
class StaticFile
|
30
|
+
def initialize(filename, dir)
|
31
|
+
@filename = filename.to_s
|
32
|
+
@path = File.join dir, URI.decode(@filename)
|
33
|
+
end
|
34
|
+
|
35
|
+
def exist?
|
36
|
+
File.exist?(@path) && File.file?(@path)
|
37
|
+
end
|
38
|
+
|
39
|
+
def mtime
|
40
|
+
File.mtime(@path)
|
41
|
+
end
|
42
|
+
|
43
|
+
def extname
|
44
|
+
File.extname(@path)
|
45
|
+
end
|
46
|
+
|
47
|
+
def newer?(http_since)
|
48
|
+
http_since && Time.httpdate(http_since).to_i >= mtime.to_i
|
49
|
+
end
|
50
|
+
|
51
|
+
def content
|
52
|
+
File.read(@path)
|
53
|
+
end
|
54
|
+
|
55
|
+
def path(with_version: false)
|
56
|
+
path = @filename
|
57
|
+
with_version ? "#{path}?v=#{mtime.to_i}" : path
|
58
|
+
end
|
28
59
|
end
|
29
60
|
end
|
30
61
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Flame
|
4
|
+
module Errors
|
5
|
+
## Error for Route initialization
|
6
|
+
class RouteArgumentsOrderError < StandardError
|
7
|
+
def initialize(path, wrong_ordered_arguments)
|
8
|
+
@path = path
|
9
|
+
@wrong_ordered_arguments = wrong_ordered_arguments
|
10
|
+
end
|
11
|
+
|
12
|
+
def message
|
13
|
+
"Path '#{@path}' should have" \
|
14
|
+
" '#{@wrong_ordered_arguments.first}' argument before" \
|
15
|
+
" '#{@wrong_ordered_arguments.last}'"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Flame
|
4
|
+
module Errors
|
5
|
+
## Error for not found template file in Render
|
6
|
+
class TemplateNotFoundError < StandardError
|
7
|
+
def initialize(controller, path)
|
8
|
+
@controller = controller
|
9
|
+
@controller = @controller.class unless @controller.is_a? Class
|
10
|
+
@path = path
|
11
|
+
end
|
12
|
+
|
13
|
+
def message
|
14
|
+
"Template '#{@path}' not found for '#{@controller}'"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/flame/path.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'forwardable'
|
4
|
+
|
3
5
|
require_relative 'errors/argument_not_assigned_error'
|
4
6
|
|
5
7
|
module Flame
|
@@ -53,7 +55,7 @@ module Flame
|
|
53
55
|
path_part = PathPart.new parameter_name, arg: parameter_type
|
54
56
|
path_part unless parts.include? path_part
|
55
57
|
end
|
56
|
-
self.class.new @path.empty? ? "/#{action}" : self, *parameters
|
58
|
+
self.class.new @path.empty? ? "/#{action}" : self, *parameters.compact
|
57
59
|
end
|
58
60
|
|
59
61
|
## Can recieve other as String
|
data/lib/flame/render.rb
CHANGED
@@ -8,6 +8,8 @@ require 'tilt/erb'
|
|
8
8
|
|
9
9
|
require 'gorilla-patch/inflections'
|
10
10
|
|
11
|
+
require_relative 'errors/template_not_found_error'
|
12
|
+
|
11
13
|
module Flame
|
12
14
|
## Helper for render functionality
|
13
15
|
class Render
|
@@ -21,8 +23,9 @@ module Flame
|
|
21
23
|
@locals = options.merge(options.delete(:locals) || {})
|
22
24
|
## Find filename
|
23
25
|
@filename = find_file(path)
|
24
|
-
|
25
|
-
|
26
|
+
unless @filename
|
27
|
+
raise Flame::Errors::TemplateNotFoundError.new(controller, path)
|
28
|
+
end
|
26
29
|
@layout = nil if File.basename(@filename)[0] == '_'
|
27
30
|
end
|
28
31
|
|
data/lib/flame/validators.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'errors/
|
3
|
+
require_relative 'errors/route_extra_arguments_error'
|
4
|
+
require_relative 'errors/route_arguments_order_error'
|
4
5
|
|
5
6
|
module Flame
|
6
7
|
module Validators
|
@@ -13,21 +14,28 @@ module Flame
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def valid?
|
16
|
-
|
17
|
-
extra = %i[req opt].find do |type|
|
18
|
-
found = extra_arguments(type).find do |place, args|
|
19
|
-
break { place: place, type: type, args: args } if args.any?
|
20
|
-
end
|
21
|
-
break found if found
|
22
|
-
end
|
23
|
-
## Return true if no any extra argument
|
24
|
-
return true unless extra
|
25
|
-
## Raise error with extra arguments
|
26
|
-
raise Errors::RouteArgumentsError.new(@ctrl, @action, @path, extra)
|
17
|
+
extra_valid? && order_valid?
|
27
18
|
end
|
28
19
|
|
29
20
|
private
|
30
21
|
|
22
|
+
def extra_valid?
|
23
|
+
extra_arguments = first_extra_arguments
|
24
|
+
## Raise error if extra arguments
|
25
|
+
return true unless extra_arguments
|
26
|
+
raise Errors::RouteExtraArgumentsError.new(
|
27
|
+
@ctrl, @action, @path, extra_arguments
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def order_valid?
|
32
|
+
wrong_ordered_arguments = first_wrong_ordered_arguments
|
33
|
+
return true unless wrong_ordered_arguments
|
34
|
+
raise Errors::RouteArgumentsOrderError.new(
|
35
|
+
@path, wrong_ordered_arguments
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
31
39
|
## Split path to args array
|
32
40
|
def path_arguments
|
33
41
|
@path_arguments ||= @path.parts
|
@@ -41,10 +49,9 @@ module Flame
|
|
41
49
|
|
42
50
|
## Take args from controller's action
|
43
51
|
def action_arguments
|
44
|
-
return @action_arguments if @action_arguments
|
45
52
|
## Get all parameters (arguments) from method
|
46
53
|
## Than collect and sort parameters into hash
|
47
|
-
@ctrl.instance_method(@action).parameters
|
54
|
+
@action_arguments ||= @ctrl.instance_method(@action).parameters
|
48
55
|
.each_with_object(req: [], opt: []) do |param, hash|
|
49
56
|
## Only required parameters must be in `:req`
|
50
57
|
hash[param[0]] << param[1]
|
@@ -52,11 +59,33 @@ module Flame
|
|
52
59
|
end
|
53
60
|
|
54
61
|
## Calculate path and action extra arguments
|
55
|
-
def
|
56
|
-
{
|
57
|
-
|
58
|
-
|
59
|
-
|
62
|
+
def all_extra_arguments
|
63
|
+
%i[req opt].each_with_object({}) do |type, extra_arguments|
|
64
|
+
extra_arguments[type] = {
|
65
|
+
ctrl: action_arguments[type] - path_arguments[type],
|
66
|
+
path: path_arguments[type] - action_arguments[type]
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def first_extra_arguments
|
72
|
+
## Get hash of any extra arguments
|
73
|
+
all_extra_arguments.find do |type, extra_arguments|
|
74
|
+
found = extra_arguments.find do |place, args|
|
75
|
+
break { place: place, type: type, args: args } if args.any?
|
76
|
+
end
|
77
|
+
break found if found
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def first_wrong_ordered_arguments
|
82
|
+
opt_arguments = action_arguments[:opt].zip(path_arguments[:opt])
|
83
|
+
opt_arguments.map! do |args|
|
84
|
+
args.map { |arg| Flame::Path::PathPart.new(arg, arg: :opt) }
|
85
|
+
end
|
86
|
+
opt_arguments.find do |action_argument, path_argument|
|
87
|
+
action_argument != path_argument
|
88
|
+
end
|
60
89
|
end
|
61
90
|
end
|
62
91
|
end
|
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.18.
|
4
|
+
version: 4.18.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: 2017-
|
11
|
+
date: 2017-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -230,8 +230,10 @@ files:
|
|
230
230
|
- lib/flame/dispatcher/response.rb
|
231
231
|
- lib/flame/dispatcher/static.rb
|
232
232
|
- lib/flame/errors/argument_not_assigned_error.rb
|
233
|
-
- lib/flame/errors/
|
233
|
+
- lib/flame/errors/route_arguments_order_error.rb
|
234
|
+
- lib/flame/errors/route_extra_arguments_error.rb
|
234
235
|
- lib/flame/errors/route_not_found_error.rb
|
236
|
+
- lib/flame/errors/template_not_found_error.rb
|
235
237
|
- lib/flame/path.rb
|
236
238
|
- lib/flame/render.rb
|
237
239
|
- lib/flame/router.rb
|