pakyow-core 0.8rc1 → 0.8.rc4
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 +7 -0
- data/pakyow-core/lib/core/app.rb +448 -0
- data/pakyow-core/lib/core/base.rb +35 -12
- data/pakyow-core/lib/core/{configuration → config}/app.rb +38 -35
- data/pakyow-core/lib/core/config/base.rb +30 -0
- data/pakyow-core/lib/core/config/cookies.rb +21 -0
- data/pakyow-core/lib/core/config/logger.rb +37 -0
- data/pakyow-core/lib/core/{configuration → config}/server.rb +3 -1
- data/pakyow-core/lib/core/exceptions.rb +3 -0
- data/pakyow-core/lib/core/helpers.rb +20 -16
- data/pakyow-core/lib/core/loader.rb +1 -1
- data/pakyow-core/lib/core/middleware/logger.rb +170 -16
- data/pakyow-core/lib/core/middleware/static.rb +20 -8
- data/pakyow-core/lib/core/multilog.rb +19 -0
- data/pakyow-core/lib/core/request.rb +52 -30
- data/pakyow-core/lib/core/route_eval.rb +390 -0
- data/pakyow-core/lib/core/route_lookup.rb +17 -5
- data/pakyow-core/lib/core/route_set.rb +17 -210
- data/pakyow-core/lib/core/route_template_defaults.rb +18 -12
- data/pakyow-core/lib/core/router.rb +41 -31
- data/pakyow-core/lib/utils/dir.rb +19 -0
- data/pakyow-core/lib/utils/hash.rb +14 -4
- data/pakyow-core/lib/views/errors/404.html +77 -0
- data/pakyow-core/lib/views/errors/500.html +56 -0
- metadata +30 -53
- data/pakyow-core/bin/pakyow +0 -18
- data/pakyow-core/lib/commands/USAGE +0 -9
- data/pakyow-core/lib/commands/USAGE-CONSOLE +0 -12
- data/pakyow-core/lib/commands/USAGE-NEW +0 -11
- data/pakyow-core/lib/commands/USAGE-SERVER +0 -12
- data/pakyow-core/lib/commands/console.rb +0 -18
- data/pakyow-core/lib/commands/server.rb +0 -8
- data/pakyow-core/lib/core/application.rb +0 -330
- data/pakyow-core/lib/core/cache.rb +0 -25
- data/pakyow-core/lib/core/configuration/base.rb +0 -31
- data/pakyow-core/lib/core/fn_context.rb +0 -5
- data/pakyow-core/lib/core/log.rb +0 -39
- data/pakyow-core/lib/core/middleware/not_found.rb +0 -40
- data/pakyow-core/lib/core/middleware/presenter.rb +0 -25
- data/pakyow-core/lib/core/middleware/router.rb +0 -33
- data/pakyow-core/lib/core/middleware/setup.rb +0 -15
- data/pakyow-core/lib/core/presenter_base.rb +0 -11
- data/pakyow-core/lib/core/route_template.rb +0 -77
- data/pakyow-core/lib/generators/pakyow/app/app_generator.rb +0 -36
- data/pakyow-core/lib/generators/pakyow/app/templates/README +0 -54
- data/pakyow-core/lib/generators/pakyow/app/templates/app.rb +0 -12
- data/pakyow-core/lib/generators/pakyow/app/templates/config.ru +0 -3
- data/pakyow-core/lib/generators/pakyow/app/templates/public/favicon.ico +0 -0
- data/pakyow-core/lib/generators/pakyow/app/templates/rakefile +0 -2
- data/pakyow-core/lib/generators/pakyow/app/templates/views/main.html +0 -1
- data/pakyow-core/lib/generators/pakyow/app/templates/views/pakyow.html +0 -12
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6603c6f6c576749182546ee51b5f99a237ba2ab2
|
4
|
+
data.tar.gz: a986e3adf2e4c33a16e8565b48984947bc1e00e5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 13942daed315f9bf380e9ff718d07458c89d630918d781377117e11aec1dfcab916c5692c769e6148ea37ec74e931c402ae303be62db75f2a77005b293b95d5c
|
7
|
+
data.tar.gz: 81cddf4aadc79a683129e3420cdf95e42f1e863cbfc123dbe93b92685ac830e533f3f76ca0cae149cc02b4300c5c9a5cb08419023763c7192f5b234ed07da3cf
|
@@ -0,0 +1,448 @@
|
|
1
|
+
module Pakyow
|
2
|
+
class App
|
3
|
+
class << self
|
4
|
+
def reset
|
5
|
+
@@routes = {}
|
6
|
+
@@config = {}
|
7
|
+
|
8
|
+
@@stacks = {:before => {}, :after => {}}
|
9
|
+
%w(init load process route match error).each {|name|
|
10
|
+
@@stacks[:before][name.to_sym] = []
|
11
|
+
@@stacks[:after][name.to_sym] = []
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
# Defines an app
|
16
|
+
#
|
17
|
+
def define(&block)
|
18
|
+
# sets the path to the app file so it can be reloaded later
|
19
|
+
config.app.path = StringUtils.parse_path_from_caller(caller[0])
|
20
|
+
|
21
|
+
self.instance_eval(&block)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Defines a route set.
|
25
|
+
#
|
26
|
+
#TODO default route set should be config option (also for bindings)
|
27
|
+
def routes(set_name = :main, &block)
|
28
|
+
if set_name && block
|
29
|
+
@@routes[set_name] = block
|
30
|
+
else
|
31
|
+
@@routes
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Defines middleware to be loaded.
|
36
|
+
#
|
37
|
+
def middleware(&block)
|
38
|
+
# prevents middleware from being loaded on each
|
39
|
+
# request when auto_reload is enabled
|
40
|
+
return if prepared?
|
41
|
+
|
42
|
+
# tell builder about the middleware
|
43
|
+
builder.instance_eval(&block)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Creates an environment.
|
47
|
+
#
|
48
|
+
def configure(env, &block)
|
49
|
+
@@config[env] = block
|
50
|
+
end
|
51
|
+
|
52
|
+
# Fetches a stack (before | after) by name.
|
53
|
+
#
|
54
|
+
def stack(which, name)
|
55
|
+
@@stacks[which][name]
|
56
|
+
end
|
57
|
+
|
58
|
+
# Adds a block to the before stack for `stack_name`.
|
59
|
+
#
|
60
|
+
def before(stack_name, &block)
|
61
|
+
@@stacks[:before][stack_name.to_sym] << block
|
62
|
+
end
|
63
|
+
|
64
|
+
# Adds a block to the after stack for `stack_name`.
|
65
|
+
#
|
66
|
+
def after(stack_name, &block)
|
67
|
+
@@stacks[:after][stack_name.to_sym] << block
|
68
|
+
end
|
69
|
+
|
70
|
+
# Runs the application. Accepts the environment(s) to run, for example:
|
71
|
+
# run(:development)
|
72
|
+
# run([:development, :staging])
|
73
|
+
#
|
74
|
+
def run(*args)
|
75
|
+
return if running?
|
76
|
+
|
77
|
+
@running = true
|
78
|
+
builder.run(prepare(args))
|
79
|
+
detect_handler.run(builder, :Host => config.server.host, :Port => config.server.port) do |server|
|
80
|
+
trap(:INT) { stop(server) }
|
81
|
+
trap(:TERM) { stop(server) }
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Stages the application. Everything is loaded but the application is
|
86
|
+
# not started. Accepts the same arguments as #run.
|
87
|
+
#
|
88
|
+
def stage(*args)
|
89
|
+
return if staged?
|
90
|
+
@staged = true
|
91
|
+
prepare(args)
|
92
|
+
end
|
93
|
+
|
94
|
+
def builder
|
95
|
+
@builder ||= Rack::Builder.new
|
96
|
+
end
|
97
|
+
|
98
|
+
def prepared?
|
99
|
+
@prepared
|
100
|
+
end
|
101
|
+
|
102
|
+
# Returns true if the application is running.
|
103
|
+
#
|
104
|
+
def running?
|
105
|
+
@running
|
106
|
+
end
|
107
|
+
|
108
|
+
# Returns true if the application is staged.
|
109
|
+
#
|
110
|
+
def staged?
|
111
|
+
@staged
|
112
|
+
end
|
113
|
+
|
114
|
+
# Convenience method for base configuration class.
|
115
|
+
#
|
116
|
+
def config
|
117
|
+
Pakyow::Config::Base
|
118
|
+
end
|
119
|
+
|
120
|
+
def load_config(envs)
|
121
|
+
# run global config first
|
122
|
+
if global_proc = @@config[:global]
|
123
|
+
config.instance_eval(&global_proc)
|
124
|
+
end
|
125
|
+
|
126
|
+
# then run other envs
|
127
|
+
|
128
|
+
envs.each do |env|
|
129
|
+
next unless config_proc = @@config[env.to_sym]
|
130
|
+
config.instance_eval(&config_proc)
|
131
|
+
end
|
132
|
+
|
133
|
+
config.app.loaded_envs = envs
|
134
|
+
end
|
135
|
+
|
136
|
+
protected
|
137
|
+
|
138
|
+
# Prepares the application for running or staging and returns an instance
|
139
|
+
# of the application.
|
140
|
+
def prepare(envs)
|
141
|
+
return if prepared?
|
142
|
+
|
143
|
+
# configure
|
144
|
+
envs = envs.empty? || envs.first.nil? ? [config.app.default_environment] : envs
|
145
|
+
load_config(envs)
|
146
|
+
|
147
|
+
# load middleware
|
148
|
+
builder.use(Rack::MethodOverride)
|
149
|
+
builder.use(Middleware::Static) if config.app.static
|
150
|
+
builder.use(Middleware::Logger) if config.app.log
|
151
|
+
builder.use(Middleware::Reloader) if config.app.auto_reload
|
152
|
+
|
153
|
+
@prepared = true
|
154
|
+
|
155
|
+
$:.unshift(Dir.pwd) unless $:.include? Dir.pwd
|
156
|
+
|
157
|
+
return self.new
|
158
|
+
end
|
159
|
+
|
160
|
+
def detect_handler
|
161
|
+
handlers = ['puma', 'thin', 'mongrel', 'webrick']
|
162
|
+
handlers.unshift(config.server.handler) if config.server.handler
|
163
|
+
|
164
|
+
handlers.each do |handler|
|
165
|
+
begin
|
166
|
+
return Rack::Handler.get(handler)
|
167
|
+
rescue LoadError
|
168
|
+
rescue NameError
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def stop(server)
|
174
|
+
if server.respond_to?('stop!')
|
175
|
+
server.stop!
|
176
|
+
elsif server.respond_to?('stop')
|
177
|
+
server.stop
|
178
|
+
else
|
179
|
+
# exit ungracefully if necessary...
|
180
|
+
Process.exit!
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
include Helpers
|
186
|
+
include AppHelpers
|
187
|
+
|
188
|
+
attr_accessor :request, :response
|
189
|
+
|
190
|
+
def initialize
|
191
|
+
Pakyow.app = self
|
192
|
+
Pakyow.configure_logger
|
193
|
+
|
194
|
+
call_stack(:before, :init)
|
195
|
+
|
196
|
+
load_app
|
197
|
+
|
198
|
+
call_stack(:after, :init)
|
199
|
+
end
|
200
|
+
|
201
|
+
# Returns the primary (first) loaded env.
|
202
|
+
#
|
203
|
+
def env
|
204
|
+
config.app.loaded_envs[0]
|
205
|
+
end
|
206
|
+
|
207
|
+
def app
|
208
|
+
self
|
209
|
+
end
|
210
|
+
|
211
|
+
def call(env)
|
212
|
+
dup.process(env)
|
213
|
+
end
|
214
|
+
|
215
|
+
# Called on every request.
|
216
|
+
#
|
217
|
+
def process(env)
|
218
|
+
call_stack(:before, :process)
|
219
|
+
|
220
|
+
@response = Response.new
|
221
|
+
@request = Request.new(env)
|
222
|
+
@request.app = self
|
223
|
+
@request.setup
|
224
|
+
|
225
|
+
set_initial_cookies
|
226
|
+
|
227
|
+
@found = false
|
228
|
+
catch(:halt) {
|
229
|
+
unless config.app.ignore_routes
|
230
|
+
call_stack(:before, :route)
|
231
|
+
|
232
|
+
@found = @router.perform(@request, self) {
|
233
|
+
call_stack(:after, :match)
|
234
|
+
}
|
235
|
+
|
236
|
+
call_stack(:after, :route)
|
237
|
+
end
|
238
|
+
|
239
|
+
unless found?
|
240
|
+
handle(404, false)
|
241
|
+
|
242
|
+
if config.app.errors_in_browser
|
243
|
+
@response["Content-Type"] = 'text/html'
|
244
|
+
|
245
|
+
view_file = File.join(File.expand_path('../../', __FILE__), 'views', 'errors', '404.html')
|
246
|
+
content = File.open(view_file).read
|
247
|
+
|
248
|
+
path = StringUtils.normalize_path(request.path)
|
249
|
+
path = '/' if path.empty?
|
250
|
+
|
251
|
+
content.gsub!('{view_path}', path == '/' ? 'index.html' : "#{path}.html")
|
252
|
+
content.gsub!('{route_path}', path)
|
253
|
+
|
254
|
+
@response.body = []
|
255
|
+
@response.body << content
|
256
|
+
end
|
257
|
+
end
|
258
|
+
}
|
259
|
+
|
260
|
+
set_cookies
|
261
|
+
|
262
|
+
call_stack(:after, :process)
|
263
|
+
|
264
|
+
@response.finish
|
265
|
+
rescue StandardError => error
|
266
|
+
call_stack(:before, :error)
|
267
|
+
|
268
|
+
@request.error = error
|
269
|
+
|
270
|
+
handle(500, false) unless found?
|
271
|
+
|
272
|
+
if config.app.errors_in_browser
|
273
|
+
@response["Content-Type"] = 'text/html'
|
274
|
+
|
275
|
+
view_file = File.join(File.expand_path('../../', __FILE__), 'views', 'errors', '500.html')
|
276
|
+
content = File.open(view_file).read
|
277
|
+
|
278
|
+
path = StringUtils.normalize_path(request.path)
|
279
|
+
path = '/' if path.empty?
|
280
|
+
|
281
|
+
nice_source = error.backtrace[0].match(/^(.+?):(\d+)(|:in `(.+)')$/)
|
282
|
+
|
283
|
+
content.gsub!('{file}', nice_source[1].gsub(File.expand_path(Config::App.root) + '/', ''))
|
284
|
+
content.gsub!('{line}', nice_source[2])
|
285
|
+
|
286
|
+
content.gsub!('{msg}', error.to_s)
|
287
|
+
content.gsub!('{trace}', error.backtrace.join('<br>'))
|
288
|
+
|
289
|
+
@response.body = []
|
290
|
+
@response.body << content
|
291
|
+
end
|
292
|
+
|
293
|
+
call_stack(:after, :error)
|
294
|
+
|
295
|
+
@response.finish
|
296
|
+
end
|
297
|
+
|
298
|
+
def found?
|
299
|
+
@found
|
300
|
+
end
|
301
|
+
|
302
|
+
# This is NOT a useless method, it's a part of the external api
|
303
|
+
def reload
|
304
|
+
# reload the app file
|
305
|
+
load(config.app.path)
|
306
|
+
|
307
|
+
# reset config
|
308
|
+
envs = config.app.loaded_envs
|
309
|
+
config.reset!
|
310
|
+
|
311
|
+
# reload config
|
312
|
+
self.class.load_config(envs)
|
313
|
+
|
314
|
+
load_app
|
315
|
+
end
|
316
|
+
|
317
|
+
# APP ACTIONS
|
318
|
+
|
319
|
+
# Interrupts the application and returns response immediately.
|
320
|
+
#
|
321
|
+
def halt
|
322
|
+
throw :halt, @response
|
323
|
+
end
|
324
|
+
|
325
|
+
# Routes the request to different logic.
|
326
|
+
#
|
327
|
+
def reroute(path, method = nil)
|
328
|
+
@request.setup(path, method)
|
329
|
+
|
330
|
+
call_stack(:before, :route)
|
331
|
+
call_stack(:after, :match)
|
332
|
+
@router.reroute(@request)
|
333
|
+
call_stack(:after, :route)
|
334
|
+
end
|
335
|
+
|
336
|
+
# Sends data in the response (immediately). Accepts a string of data or a File,
|
337
|
+
# mime-type (auto-detected; defaults to octet-stream), and optional file name.
|
338
|
+
#
|
339
|
+
# If a File, mime type will be guessed. Otherwise mime type and file name will
|
340
|
+
# default to whatever is set in the response.
|
341
|
+
#
|
342
|
+
def send(file_or_data, type = nil, send_as = nil)
|
343
|
+
if file_or_data.class == File
|
344
|
+
data = file_or_data.read
|
345
|
+
|
346
|
+
# auto set type based on file type
|
347
|
+
type = Rack::Mime.mime_type("." + StringUtils.split_at_last_dot(file_or_data.path)[1])
|
348
|
+
else
|
349
|
+
data = file_or_data
|
350
|
+
end
|
351
|
+
|
352
|
+
headers = {}
|
353
|
+
headers["Content-Type"] = type if type
|
354
|
+
headers["Content-disposition"] = "attachment; filename=#{send_as}" if send_as
|
355
|
+
|
356
|
+
@response = Response.new(data, @response.status, @response.header.merge(headers))
|
357
|
+
halt
|
358
|
+
end
|
359
|
+
|
360
|
+
# Redirects to location (immediately).
|
361
|
+
#
|
362
|
+
def redirect(location, status_code = 302)
|
363
|
+
location = router.path(location) if location.is_a?(Symbol)
|
364
|
+
|
365
|
+
headers = response ? response.header : {}
|
366
|
+
headers = headers.merge({'Location' => location})
|
367
|
+
|
368
|
+
app.response = Response.new('', status_code, headers)
|
369
|
+
halt
|
370
|
+
end
|
371
|
+
|
372
|
+
def handle(name_or_code, from_logic = true)
|
373
|
+
call_stack(:before, :route)
|
374
|
+
@router.handle(name_or_code, self, from_logic)
|
375
|
+
call_stack(:after, :route)
|
376
|
+
end
|
377
|
+
|
378
|
+
# Convenience method for defining routes on an app instance.
|
379
|
+
#
|
380
|
+
def routes(set_name = :main, &block)
|
381
|
+
self.class.routes(set_name, &block)
|
382
|
+
load_routes
|
383
|
+
end
|
384
|
+
|
385
|
+
protected
|
386
|
+
|
387
|
+
def call_stack(which, stack)
|
388
|
+
self.class.stack(which, stack).each {|block|
|
389
|
+
self.instance_exec(&block)
|
390
|
+
}
|
391
|
+
end
|
392
|
+
|
393
|
+
# Reloads all application files in path and presenter (if specified).
|
394
|
+
#
|
395
|
+
def load_app
|
396
|
+
call_stack(:before, :load)
|
397
|
+
|
398
|
+
# load src files
|
399
|
+
@loader = Loader.new
|
400
|
+
@loader.load_from_path(config.app.src_dir)
|
401
|
+
|
402
|
+
# load the routes
|
403
|
+
load_routes
|
404
|
+
|
405
|
+
call_stack(:after, :load)
|
406
|
+
end
|
407
|
+
|
408
|
+
def load_routes
|
409
|
+
@router = Router.instance.reset
|
410
|
+
self.class.routes.each_pair {|set_name, block|
|
411
|
+
@router.set(set_name, &block)
|
412
|
+
}
|
413
|
+
end
|
414
|
+
|
415
|
+
def set_cookies
|
416
|
+
@request.cookies.each_pair {|k, v|
|
417
|
+
@response.unset_cookie(k) if v.nil?
|
418
|
+
|
419
|
+
# cookie is already set with value, ignore
|
420
|
+
next if @initial_cookies.include?(k.to_s) && @initial_cookies[k.to_s] == v
|
421
|
+
|
422
|
+
# set cookie with defaults
|
423
|
+
@response.set_cookie(k, {
|
424
|
+
:path => config.cookies.path,
|
425
|
+
:expires => config.cookies.expiration,
|
426
|
+
:value => v
|
427
|
+
})
|
428
|
+
}
|
429
|
+
|
430
|
+
# delete cookies that are no longer present
|
431
|
+
@initial_cookies.each {|k|
|
432
|
+
@response.delete_cookie(k) unless @request.cookies.key?(k.to_s)
|
433
|
+
}
|
434
|
+
end
|
435
|
+
|
436
|
+
# Stores set cookies at beginning of request cycle
|
437
|
+
# for comparison at the end of the cycle
|
438
|
+
def set_initial_cookies
|
439
|
+
@initial_cookies = {}
|
440
|
+
@request.cookies.each {|k,v|
|
441
|
+
@initial_cookies[k] = v
|
442
|
+
}
|
443
|
+
end
|
444
|
+
|
445
|
+
end
|
446
|
+
|
447
|
+
App.reset
|
448
|
+
end
|
@@ -1,27 +1,25 @@
|
|
1
|
-
require 'core/
|
1
|
+
require 'core/config/base'
|
2
|
+
require 'core/config/app'
|
3
|
+
require 'core/config/server'
|
4
|
+
require 'core/config/cookies'
|
5
|
+
require 'core/config/logger'
|
2
6
|
require 'core/helpers'
|
3
|
-
require 'core/
|
7
|
+
require 'core/multilog'
|
4
8
|
require 'core/request'
|
5
9
|
require 'core/response'
|
6
10
|
require 'core/loader'
|
7
11
|
require 'core/router'
|
8
12
|
require 'core/route_set'
|
9
|
-
require 'core/
|
13
|
+
require 'core/route_eval'
|
10
14
|
require 'core/route_template_defaults'
|
11
15
|
require 'core/route_lookup'
|
12
|
-
require 'core/
|
13
|
-
require 'core/
|
14
|
-
require 'core/presenter_base'
|
15
|
-
require 'core/fn_context'
|
16
|
+
require 'core/app'
|
17
|
+
require 'core/exceptions'
|
16
18
|
|
17
19
|
# middlewares
|
18
20
|
require 'core/middleware/logger'
|
19
21
|
require 'core/middleware/static'
|
20
22
|
require 'core/middleware/reloader'
|
21
|
-
require 'core/middleware/presenter'
|
22
|
-
require 'core/middleware/not_found'
|
23
|
-
require 'core/middleware/router'
|
24
|
-
require 'core/middleware/setup'
|
25
23
|
|
26
24
|
# utils
|
27
25
|
require 'utils/string'
|
@@ -29,5 +27,30 @@ require 'utils/hash'
|
|
29
27
|
require 'utils/dir'
|
30
28
|
|
31
29
|
module Pakyow
|
32
|
-
attr_accessor :app
|
30
|
+
attr_accessor :app, :logger
|
31
|
+
|
32
|
+
def configure_logger
|
33
|
+
conf = Config::Base
|
34
|
+
|
35
|
+
logs = []
|
36
|
+
|
37
|
+
if File.directory?(conf.logger.path)
|
38
|
+
log_path = File.join(conf.logger.path, conf.logger.name)
|
39
|
+
|
40
|
+
begin
|
41
|
+
log = File.open(log_path, 'a')
|
42
|
+
log.sync if conf.logger.sync
|
43
|
+
|
44
|
+
logs << log
|
45
|
+
rescue StandardError => e
|
46
|
+
warn "Error opening '#{log_path}' for writing"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
logs << $stdout if conf.app.log_output
|
51
|
+
|
52
|
+
io = logs.count > 1 ? MultiLog.new(*logs) : logs[0]
|
53
|
+
|
54
|
+
Pakyow.logger = Logger.new(io, conf.logger.level, conf.logger.colorize, conf.logger.auto_flush)
|
55
|
+
end
|
33
56
|
end
|
@@ -1,59 +1,58 @@
|
|
1
1
|
module Pakyow
|
2
|
-
module
|
2
|
+
module Config
|
3
3
|
class App
|
4
|
+
Config::Base.register_config(:app, self)
|
5
|
+
|
4
6
|
class << self
|
5
|
-
attr_accessor :
|
6
|
-
:
|
7
|
-
:
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
attr_accessor :log, :resources, :root, :default_action, :ignore_routes,
|
8
|
+
:default_environment, :path, :src_dir, :auto_reload, :errors_in_browser,
|
9
|
+
:static, :all_views_visible, :loaded_envs, :log_output
|
10
|
+
|
11
|
+
def method_missing(name, *args)
|
12
|
+
if name[-1,1] == '='
|
13
|
+
name = name[0..-2]
|
14
|
+
instance_variable_set("@#{name}", *args)
|
15
|
+
else
|
16
|
+
instance_variable_get("@#{name}")
|
17
|
+
end
|
14
18
|
end
|
15
|
-
|
19
|
+
|
16
20
|
def auto_reload
|
17
21
|
@auto_reload.nil? ? true : @auto_reload
|
18
22
|
end
|
19
|
-
|
23
|
+
|
20
24
|
def errors_in_browser
|
21
25
|
@errors_in_browser.nil? ? true : @errors_in_browser
|
22
26
|
end
|
23
|
-
|
27
|
+
|
24
28
|
# Log requests?
|
25
29
|
def log
|
26
30
|
@log.nil? ? true : @log
|
27
31
|
end
|
28
|
-
|
32
|
+
|
33
|
+
def log_output
|
34
|
+
@log_output || true
|
35
|
+
end
|
36
|
+
|
29
37
|
# Root directory
|
30
38
|
def root
|
31
39
|
@root || File.dirname('')
|
32
40
|
end
|
33
|
-
|
34
|
-
# Public directory
|
35
|
-
def public_dir
|
36
|
-
@public_dir || "#{root}/public"
|
37
|
-
end
|
38
|
-
|
39
|
-
# Log directory
|
40
|
-
def log_dir
|
41
|
-
@log_dir || "#{root}/logs"
|
42
|
-
end
|
43
41
|
|
44
|
-
|
45
|
-
|
42
|
+
# Resources directory
|
43
|
+
def resources
|
44
|
+
@resources ||= { :default => "#{root}/public" }
|
46
45
|
end
|
47
46
|
|
48
47
|
def src_dir
|
49
|
-
@src_dir || "#{root}/lib"
|
48
|
+
@src_dir || "#{root}/app/lib"
|
50
49
|
end
|
51
|
-
|
50
|
+
|
52
51
|
# Default action
|
53
52
|
def default_action
|
54
53
|
@default_action || :index
|
55
54
|
end
|
56
|
-
|
55
|
+
|
57
56
|
# Mockup mode
|
58
57
|
def ignore_routes
|
59
58
|
@ignore_routes.nil? ? false : @ignore_routes
|
@@ -62,24 +61,28 @@ module Pakyow
|
|
62
61
|
def all_views_visible
|
63
62
|
@all_views_visible.nil? ? true : @all_views_visible
|
64
63
|
end
|
65
|
-
|
64
|
+
|
66
65
|
def default_environment
|
67
66
|
@default_environment || :development
|
68
67
|
end
|
69
|
-
|
68
|
+
|
70
69
|
# The path to the application class
|
71
|
-
def
|
72
|
-
@
|
70
|
+
def path
|
71
|
+
@path
|
73
72
|
end
|
74
|
-
|
73
|
+
|
75
74
|
# Handle static files?
|
76
75
|
#
|
77
|
-
# For best performance, should be set to false if static files are
|
76
|
+
# For best performance, should be set to false if static files are
|
78
77
|
# handled by a web server (e.g. Nginx)
|
79
78
|
#
|
80
79
|
def static
|
81
80
|
@static || true
|
82
81
|
end
|
82
|
+
|
83
|
+
def loaded_envs
|
84
|
+
@loaded_envs
|
85
|
+
end
|
83
86
|
end
|
84
87
|
end
|
85
88
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Pakyow
|
2
|
+
module Config
|
3
|
+
class Base
|
4
|
+
@@configs = {}
|
5
|
+
def self.register_config(name, klass)
|
6
|
+
@@configs[name] = klass
|
7
|
+
|
8
|
+
define_singleton_method name do
|
9
|
+
@@configs[name]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Resets all config
|
14
|
+
def self.reset!
|
15
|
+
@@configs.keys.each do |type|
|
16
|
+
klass = self.send(type.to_sym)
|
17
|
+
klass.instance_variables.each do |var|
|
18
|
+
# Assumes path shouldn't be reset, since it's only set
|
19
|
+
# once when Pakyow::Application is inherited.
|
20
|
+
next if var.to_sym == :'@path'
|
21
|
+
begin
|
22
|
+
klass.send("#{var.to_s.gsub('@', '')}=", nil)
|
23
|
+
rescue
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pakyow
|
2
|
+
module Config
|
3
|
+
class Cookies
|
4
|
+
Config::Base.register_config(:cookies, self)
|
5
|
+
|
6
|
+
class << self
|
7
|
+
attr_accessor :path, :expiration
|
8
|
+
|
9
|
+
# What path should the cookie be created for?
|
10
|
+
def path
|
11
|
+
@path || '/'
|
12
|
+
end
|
13
|
+
|
14
|
+
# When does the cookie expire?
|
15
|
+
def expiration
|
16
|
+
@expiration || Time.now + 60 * 60 * 24 * 7 # one week
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|