lux-fw 0.2.1 → 0.2.3
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/.version +1 -1
- data/lib/common/class_callbacks.rb +18 -16
- data/lib/lux/application/application.rb +23 -11
- data/lib/lux/application/lib/render.rb +17 -7
- data/lib/lux/current/lib/static_file.rb +15 -13
- data/lib/lux/lux.rb +6 -5
- data/lib/lux/response/response.rb +6 -27
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f17bf48ba9c67072d7a9cba132b0c8c29fb25f79bc424e39f0d4bc39b16981e
|
4
|
+
data.tar.gz: ea0a19540ee7c21cebea07b6ea6ad27e967a448d1865a51097b7fe22f305e244
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a286aecb1572cb1b7929449c914f4bed7faae1b199c63e663300eae36a5a58d40cb3c8480a59974d8a74a1dbc2a3a2269130f070bd2e3eafc6cf5dc64e4729f0
|
7
|
+
data.tar.gz: 4490adeaa98e7ac83bf413511baa383f152ded339ee0fa8c97d29cab141653da1eea76059f210296b4c3e465259e484c68c20bd7d172fe94420c4c9863b688cd
|
data/.version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
@@ -21,34 +21,36 @@ module ClassCallbacks
|
|
21
21
|
@@pointers = {}
|
22
22
|
|
23
23
|
def add klass, unique_id, action, method
|
24
|
-
|
24
|
+
klass = klass.to_s
|
25
|
+
key = Crypt.sha1(unique_id)
|
26
|
+
|
25
27
|
@@pointers[key] = method
|
26
|
-
|
27
|
-
@@methods[klass
|
28
|
-
@@methods[klass
|
28
|
+
|
29
|
+
@@methods[klass] ||= {}
|
30
|
+
@@methods[klass][action] ||= []
|
31
|
+
@@methods[klass][action].tap { |it| it.push(key) unless it.include?(key) }
|
29
32
|
end
|
30
33
|
|
31
34
|
def execute instance_object, action, object=nil
|
32
35
|
object ? instance_object.send(action, object) : instance_object.send(action)
|
33
36
|
|
34
|
-
# execute for self and
|
35
|
-
|
36
|
-
next if
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
37
|
+
# execute for self and parents
|
38
|
+
instance_object.class.ancestors.reverse.map(&:to_s).each do |name|
|
39
|
+
next if name == 'Object'
|
40
|
+
next unless actions = @@methods.dig(name, action)
|
41
|
+
|
42
|
+
for el in actions.map { |o| @@pointers[o] }
|
43
|
+
if el.kind_of?(Symbol)
|
44
|
+
object ? instance_object.send(el, object) : instance_object.send(el)
|
45
|
+
else
|
46
|
+
object ? instance_object.instance_exec(object, &el) : instance_object.instance_exec(&el)
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
48
50
|
end
|
49
51
|
|
50
52
|
def define(klass, *args)
|
51
|
-
|
53
|
+
args.each do |action|
|
52
54
|
klass.class_eval %[
|
53
55
|
def #{action}(duck=nil)
|
54
56
|
end
|
@@ -8,7 +8,8 @@ class Lux::Application
|
|
8
8
|
|
9
9
|
###
|
10
10
|
|
11
|
-
def initialize
|
11
|
+
def initialize current
|
12
|
+
@current = current
|
12
13
|
@route_test = Lux::Application::RouteTest.new self
|
13
14
|
end
|
14
15
|
|
@@ -17,31 +18,32 @@ class Lux::Application
|
|
17
18
|
end
|
18
19
|
|
19
20
|
def body?
|
20
|
-
|
21
|
+
@current.response.body ? true : false
|
21
22
|
end
|
22
23
|
|
23
24
|
def body data
|
24
|
-
|
25
|
+
@current.response.body data
|
25
26
|
end
|
26
27
|
|
27
28
|
def current
|
28
|
-
Lux.current
|
29
|
+
# Lux.current
|
30
|
+
@current
|
29
31
|
end
|
30
32
|
|
31
33
|
def nav
|
32
|
-
|
34
|
+
@current.nav
|
33
35
|
end
|
34
36
|
|
35
37
|
def params
|
36
|
-
|
38
|
+
@current.params
|
37
39
|
end
|
38
40
|
|
39
41
|
def redirect where, msgs={}
|
40
|
-
|
42
|
+
@current.redirect where, msgs
|
41
43
|
end
|
42
44
|
|
43
45
|
def request
|
44
|
-
|
46
|
+
@current.request
|
45
47
|
end
|
46
48
|
|
47
49
|
# gets only root
|
@@ -55,15 +57,15 @@ class Lux::Application
|
|
55
57
|
end
|
56
58
|
|
57
59
|
def done?
|
58
|
-
throw :done if
|
60
|
+
throw :done if @current.response.body
|
59
61
|
end
|
60
62
|
|
61
63
|
def get?
|
62
|
-
|
64
|
+
@current.request.request_method == 'GET'
|
63
65
|
end
|
64
66
|
|
65
67
|
def post?
|
66
|
-
|
68
|
+
@current.request.request_method == 'POST'
|
67
69
|
end
|
68
70
|
|
69
71
|
def plug name, &block
|
@@ -179,4 +181,14 @@ class Lux::Application
|
|
179
181
|
end
|
180
182
|
end
|
181
183
|
|
184
|
+
def render
|
185
|
+
Lux.log "\n#{current.request.request_method.white} #{current.request.path.white}"
|
186
|
+
|
187
|
+
Lux::Config.live_require_check! if Lux.config(:auto_code_reload)
|
188
|
+
|
189
|
+
main
|
190
|
+
|
191
|
+
current.response.render
|
192
|
+
end
|
193
|
+
|
182
194
|
end
|
@@ -4,6 +4,16 @@
|
|
4
4
|
# Hash :qs, Hash :post, String :method, Hash :cookies, Hash :session
|
5
5
|
# https://github.com/rack/rack/blob/master/test/spec_request.rb
|
6
6
|
|
7
|
+
# Lux.app.render('/admin') -> { status: 403, ... }
|
8
|
+
# Lux.app.render('/admin', session: { user_id: User.is_admin.first.id })
|
9
|
+
# {
|
10
|
+
# time: '1ms'
|
11
|
+
# status: 200,
|
12
|
+
# headers: {...},
|
13
|
+
# session: {...},
|
14
|
+
# body: '<html> ...'
|
15
|
+
# }.h
|
16
|
+
|
7
17
|
Lux::Application.class_eval do
|
8
18
|
def self.render path='/mock', in_opts={}, &block
|
9
19
|
allowed_opts = [:qs, :post, :method, :session, :cookies]
|
@@ -35,14 +45,14 @@ Lux::Application.class_eval do
|
|
35
45
|
env[k.to_s.upcase] = v
|
36
46
|
end
|
37
47
|
|
38
|
-
|
39
|
-
|
48
|
+
current = Lux::Current.new(env)
|
49
|
+
current.session.merge!(in_opts[:session]) if in_opts[:session]
|
40
50
|
|
41
|
-
|
42
|
-
|
43
|
-
|
51
|
+
app = new current
|
52
|
+
|
53
|
+
return app.instance_exec &block if block_given?
|
44
54
|
|
45
|
-
response =
|
55
|
+
response = app.render
|
46
56
|
|
47
57
|
body = response[2].join('')
|
48
58
|
body = JSON.parse body if response[1]['content-type'].index('/json')
|
@@ -51,7 +61,7 @@ Lux::Application.class_eval do
|
|
51
61
|
time: response[1]['x-lux-speed'],
|
52
62
|
status: response[0],
|
53
63
|
headers: response[1],
|
54
|
-
session:
|
64
|
+
session: current.session,
|
55
65
|
body: body
|
56
66
|
}.h
|
57
67
|
end
|
@@ -55,6 +55,18 @@ class Lux::Current::StaticFile
|
|
55
55
|
true
|
56
56
|
end
|
57
57
|
|
58
|
+
def resolve_content_type
|
59
|
+
mimme = MIMME_TYPES[@ext.to_sym]
|
60
|
+
|
61
|
+
unless mimme
|
62
|
+
c.response.body('Mimme type not supported')
|
63
|
+
c.response.status(406)
|
64
|
+
return
|
65
|
+
end
|
66
|
+
|
67
|
+
c.response.content_type = mimme
|
68
|
+
end
|
69
|
+
|
58
70
|
def deliver data=nil
|
59
71
|
file = File.exist?(@file) ? @file : Lux.root.join("public#{@file}")
|
60
72
|
|
@@ -66,16 +78,9 @@ class Lux::Current::StaticFile
|
|
66
78
|
end
|
67
79
|
end
|
68
80
|
|
69
|
-
ext = file.to_s.split('.').last
|
70
|
-
mimme = MIMME_TYPES[ext.to_sym]
|
71
|
-
|
72
|
-
unless mimme
|
73
|
-
c.response.body('Mimme type not supported')
|
74
|
-
c.response.status(404)
|
75
|
-
return
|
76
|
-
end
|
81
|
+
@ext = file.to_s.split('.').last
|
77
82
|
|
78
|
-
|
83
|
+
resolve_content_type
|
79
84
|
|
80
85
|
file_mtime = File.mtime(file).utc.to_s
|
81
86
|
key = Crypt.sha1(file+file_mtime.to_s)
|
@@ -91,10 +96,7 @@ class Lux::Current::StaticFile
|
|
91
96
|
return
|
92
97
|
end
|
93
98
|
|
94
|
-
|
95
|
-
|
96
|
-
data ||= File.read(file)
|
97
|
-
c.response.body(data)
|
99
|
+
c.response.body data || File.read(file)
|
98
100
|
|
99
101
|
true
|
100
102
|
end
|
data/lib/lux/lux.rb
CHANGED
@@ -25,11 +25,12 @@ module Lux
|
|
25
25
|
define_method(:cache) { Lux::Cache }
|
26
26
|
|
27
27
|
# main rack response
|
28
|
-
def call
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
def call env=nil
|
29
|
+
state = Lux::Current.new env
|
30
|
+
app = Lux::Application.new state
|
31
|
+
app.render
|
32
|
+
rescue => e
|
33
|
+
raise e if Lux.config(:show_server_errors)
|
33
34
|
|
34
35
|
[500, {}, ['Lux server error']]
|
35
36
|
end
|
@@ -165,34 +165,23 @@ class Lux::Response
|
|
165
165
|
|
166
166
|
def write_response_header
|
167
167
|
domain =
|
168
|
-
if
|
169
|
-
cookie_domain
|
170
|
-
elsif cookie_multidomain && current.domain.index('.')
|
168
|
+
if cookie_multidomain && current.domain.index('.')
|
171
169
|
".#{current.domain}"
|
172
170
|
else
|
173
|
-
current.request.host
|
171
|
+
cookie_domain || current.request.host
|
174
172
|
end
|
175
173
|
|
176
174
|
# cache-control
|
177
175
|
@headers['cache-control'] ||= Proc.new do
|
178
|
-
cc
|
179
|
-
|
180
|
-
if max_age > 0
|
181
|
-
cc.push 'public, no-cache'
|
182
|
-
else
|
183
|
-
cc.push 'private, must-revalidate'
|
184
|
-
end
|
185
|
-
|
176
|
+
cc = ['max-age=%d' % max_age]
|
177
|
+
cc.push max_age > 0 ? 'public, no-cache' : 'private, must-revalidate'
|
186
178
|
cc.join(', ')
|
187
179
|
end.call
|
188
180
|
|
189
181
|
current.session[:lux_flash] = flash.to_h
|
190
182
|
|
191
183
|
# dont annd cookies to public pages (images, etc..)
|
192
|
-
|
193
|
-
add_cookies = false if @headers['cache-control'].index('public')
|
194
|
-
|
195
|
-
if add_cookies
|
184
|
+
unless @headers['cache-control'].index('public')
|
196
185
|
encrypted = Crypt.encrypt(current.session.to_json)
|
197
186
|
|
198
187
|
if current.cookies[Lux.config.session_cookie_name] != encrypted
|
@@ -208,7 +197,7 @@ class Lux::Response
|
|
208
197
|
# if "no-store" is present then HTTP_IF_NONE_MATCH is not sent from browser
|
209
198
|
end
|
210
199
|
|
211
|
-
def
|
200
|
+
def render
|
212
201
|
write_response_body
|
213
202
|
write_response_header
|
214
203
|
|
@@ -224,14 +213,4 @@ class Lux::Response
|
|
224
213
|
[@status, @headers.to_h, [@body]]
|
225
214
|
end
|
226
215
|
|
227
|
-
def render
|
228
|
-
Lux.log "\n#{current.request.request_method.white} #{Lux.current.request.path.white}"
|
229
|
-
|
230
|
-
Lux::Config.live_require_check! if Lux.config(:auto_code_reload)
|
231
|
-
|
232
|
-
Lux::Application.new.main
|
233
|
-
|
234
|
-
write_response
|
235
|
-
end
|
236
|
-
|
237
216
|
end
|