flame 4.10.0 → 4.11.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8395ff4675716dc3fb9aa3aa58b997624ca10d57
4
- data.tar.gz: c612ae674eeb4571b71f42fcb39e60ccc8fc4f1f
3
+ metadata.gz: 3091319c3472e5cbf2fd06a7f771df6b2728e9fb
4
+ data.tar.gz: 1f379f843e562ff2c734b8260e60e8c9aaf44132
5
5
  SHA512:
6
- metadata.gz: 639a69107187f6e64953d34c99abf822058c35ec320db0f0f54d84692f0810070825eec83bfeec11276e84e5f506277fa517d6f3a93a5e04bcfe08b684ecdd51
7
- data.tar.gz: eed88fd30af185d4590519ad5e817744287082e7bedbb23de02c33662f3cc0b075d71b48a0d5c59300e81495036ba544b62eb6d1191a7f3755b44e7d592dac39
6
+ metadata.gz: 878cd581f5f128f2152e71e379cf2beff8cc162da4d5b9e3b26d6cf5022d6ece235e4076f211818b8e112f0d62fea683b5eab6aa83910c8ed60cf8adae6c1135
7
+ data.tar.gz: 0fefbfc57c4ef14a2899e700c9bfef0429ee500ace9d2bf28455cbb2df20f68fc302d77818b907ff5eb94e8b1e04291163d8e5355926862f224fb0d0017362e7
@@ -1,16 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'forwardable'
3
4
  require_relative 'render'
4
5
 
5
6
  module Flame
6
7
  ## Class initialize when Dispatcher found route with it
7
8
  ## For new request and response
8
9
  class Controller
10
+ extend Forwardable
11
+
9
12
  ## Shortcut for not-inherited public methods: actions
10
13
  def self.actions
11
14
  public_instance_methods(false)
12
15
  end
13
16
 
17
+ def_delegators(
18
+ :@dispatcher,
19
+ :config, :request, :params, :halt, :session, :response, :status, :body,
20
+ :default_body, :content_type
21
+ )
22
+
14
23
  ## Initialize the controller for request execution
15
24
  ## @param dispatcher [Flame::Dispatcher] dispatcher object
16
25
  def initialize(dispatcher)
@@ -54,7 +63,7 @@ module Flame
54
63
  return unless filename
55
64
  response[content_dis] << "; filename=\"#{File.basename(filename)}\""
56
65
  ext = File.extname(filename)
57
- content_type(ext) unless response[Rack::CONTENT_TYPE] || ext.empty?
66
+ content_type(ext) unless ext.empty?
58
67
  end
59
68
 
60
69
  ## Render a template with `Flame::Render` (based on Tilt-engine)
@@ -73,38 +82,32 @@ module Flame
73
82
  end
74
83
  alias render view
75
84
 
85
+ protected
86
+
76
87
  ## Execute the method of the controller with hooks (may be overloaded)
77
88
  ## @param method [Symbol] name of the controller method
78
89
  def execute(method)
79
90
  # send method
80
- body send(
81
- method,
82
- *params.values_at(
83
- *self.class.instance_method(method).parameters.map { |par| par[1] }
84
- )
85
- )
86
- rescue => exception
87
- # p 'rescue from controller'
88
- status 500
89
- dump_error(exception)
90
-
91
- ## Re-raise exception for inherited controllers or `Flame::Dispatcher`
92
- raise exception
91
+ body send(method, *select_args(method))
93
92
  end
94
93
 
95
- ## Call helpers methods from `Flame::Dispatcher`
96
- def method_missing(m, *args, &block)
97
- return super unless @dispatcher.respond_to?(m)
98
- @dispatcher.send(m, *args, &block)
99
- end
100
-
101
- ## Respond to Dispatcher methods
102
- def respond_to_missing?(m, *)
103
- @dispatcher.respond_to?(m) || super
94
+ ## Default method for Internal Server Error, can be inherited
95
+ def server_error(_exception)
96
+ body default_body
104
97
  end
105
98
 
106
99
  private
107
100
 
101
+ def select_args(method)
102
+ parameters = self.class.instance_method(method).parameters
103
+ params_select = proc do |type|
104
+ params.values_at(
105
+ *parameters.select { |par| par.first == type }.map(&:last)
106
+ )
107
+ end
108
+ params_select.call(:req) + params_select.call(:opt).compact
109
+ end
110
+
108
111
  def add_controller_class(args)
109
112
  args.unshift(self.class) if args[0].is_a?(Symbol)
110
113
  args.insert(1, :index) if args[0].is_a?(Class) && !args[1].is_a?(Symbol)
@@ -25,7 +25,7 @@ module Flame
25
25
  ## Start of execution the request
26
26
  def run!
27
27
  catch :halt do
28
- try_fix_slashes ||
28
+ # try_fix_slashes ||
29
29
  try_route ||
30
30
  try_static ||
31
31
  try_static(File.join(__dir__, '..', '..', 'public')) ||
@@ -130,12 +130,12 @@ module Flame
130
130
  ## Add error's backtrace to @env['rack.errors'] (terminal or file)
131
131
  ## @param error [Exception] exception for class, message and backtrace
132
132
  def dump_error(error)
133
- @error_message = [
133
+ error_message = [
134
134
  "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} - " \
135
135
  "#{error.class} - #{error.message}:",
136
136
  *error.backtrace
137
137
  ].join("\n\t")
138
- @env['rack.errors'].puts(@error_message)
138
+ @env['rack.errors'].puts(error_message)
139
139
  end
140
140
 
141
141
  ## Generate default body of error page
@@ -168,12 +168,13 @@ module Flame
168
168
  status 200
169
169
  params.merge!(route.arguments(request.path_parts))
170
170
  # route.execute(self)
171
- route_exec(route)
171
+ controller = route.controller.new(self)
172
+ controller.send(:execute, route.action)
172
173
  rescue => exception
173
174
  # p 'rescue from dispatcher'
174
- dump_error(exception) unless @error_message
175
- halt 500
176
-
175
+ dump_error(exception)
176
+ status 500
177
+ controller.send(:server_error, exception)
177
178
  # p 're raise exception from dispatcher'
178
179
  # raise exception
179
180
  end
@@ -188,13 +189,8 @@ module Flame
188
189
  ## or it's `default_body` method not defined
189
190
  return default_body unless route
190
191
  ## Execute `default_body` method for the founded route
191
- route_exec(route, :default_body)
192
+ route.controller.new(self).send(:execute, :default_body)
192
193
  body default_body if body.empty?
193
194
  end
194
-
195
- ## Create controller object and execute method with arguments
196
- def route_exec(route, method = route.action)
197
- route.controller.new(self).send(:execute, method)
198
- end
199
195
  end
200
196
  end
@@ -67,9 +67,14 @@ module Flame
67
67
  paths = [path]
68
68
  paths.push(dirs.last) if path.to_sym == :index
69
69
  dirs.push(nil)
70
- Dir[
70
+ files = Dir[
71
71
  File.join(views_dir, "{#{dirs.join(',')}}", "{#{paths.join(',')}}.*")
72
- ].uniq
72
+ ]
73
+ clean_paths files
74
+ end
75
+
76
+ def clean_paths(paths)
77
+ paths.map! { |path| Pathname.new(path).cleanpath.to_s }.uniq
73
78
  end
74
79
 
75
80
  ## Find template-file by path
@@ -2,6 +2,8 @@ module Flame
2
2
  class Dispatcher
3
3
  ## Module for working with static files
4
4
  module Static
5
+ private
6
+
5
7
  ## Find static files and try return it
6
8
  def try_static(dir = config[:public_dir])
7
9
  file = File.join(dir, URI.decode(request.path_info))
@@ -18,11 +20,9 @@ module Flame
18
20
  file_time = File.mtime(file)
19
21
  halt 304 if static_cached?(file_time)
20
22
  content_type File.extname(file)
23
+ response[Rack::CACHE_CONTROL] = 'no-cache'
21
24
  response['Last-Modified'] = file_time.httpdate
22
- # 'Content-Disposition' => 'attachment;' \
23
- # "filename=\"#{File.basename(static_file)}\"",
24
- # 'Content-Length' => File.size?(static_file).to_s
25
- halt 200, File.read(file)
25
+ body File.read(file)
26
26
  end
27
27
  end
28
28
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Flame
4
- VERSION = '4.10.0'.freeze
4
+ VERSION = '4.11.3.1'.freeze
5
5
  end
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.10.0
4
+ version: 4.11.3.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-01-24 00:00:00.000000000 Z
11
+ date: 2017-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -155,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
155
  version: '0'
156
156
  requirements: []
157
157
  rubyforge_project:
158
- rubygems_version: 2.6.8
158
+ rubygems_version: 2.6.10
159
159
  signing_key:
160
160
  specification_version: 4
161
161
  summary: Web-framework, based on MVC-pattern