pakyow-core 0.11.3 → 1.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +0 -0
- data/LICENSE +4 -0
- data/{pakyow-core/README.md → README.md} +3 -4
- data/commands/pakyow +13 -0
- data/lib/pakyow/app/connection/behavior/session.rb +33 -0
- data/lib/pakyow/app/connection/behavior/values.rb +42 -0
- data/lib/pakyow/app/connection/behavior/verifier.rb +34 -0
- data/lib/pakyow/app/connection/session/abstract.rb +24 -0
- data/lib/pakyow/app/connection/session/cookie.rb +56 -0
- data/lib/pakyow/app/connection.rb +57 -0
- data/lib/pakyow/app.rb +219 -0
- data/lib/pakyow/behavior/aspects.rb +45 -0
- data/lib/pakyow/behavior/config.rb +72 -0
- data/lib/pakyow/behavior/endpoints.rb +41 -0
- data/lib/pakyow/behavior/frameworks.rb +45 -0
- data/lib/pakyow/behavior/helpers.rb +107 -0
- data/lib/pakyow/behavior/initializers.rb +19 -0
- data/lib/pakyow/behavior/isolating.rb +69 -0
- data/lib/pakyow/behavior/operations.rb +46 -0
- data/lib/pakyow/behavior/pipeline.rb +58 -0
- data/lib/pakyow/behavior/plugins.rb +148 -0
- data/lib/pakyow/behavior/rescuing.rb +51 -0
- data/lib/pakyow/behavior/restarting.rb +68 -0
- data/lib/pakyow/behavior/sessions.rb +34 -0
- data/lib/pakyow/behavior/verification.rb +47 -0
- data/lib/pakyow/cli.rb +199 -0
- data/lib/pakyow/connection/multipart_input.rb +24 -0
- data/lib/pakyow/connection/multipart_parser.rb +112 -0
- data/lib/pakyow/connection/params.rb +29 -0
- data/lib/pakyow/connection/query_parser.rb +174 -0
- data/lib/pakyow/connection/statuses.rb +119 -0
- data/lib/pakyow/connection.rb +568 -0
- data/lib/pakyow/endpoints.rb +94 -0
- data/lib/pakyow/environment/actions/dispatch.rb +37 -0
- data/lib/pakyow/environment/actions/input_parser.rb +21 -0
- data/lib/pakyow/environment/actions/logger.rb +33 -0
- data/lib/pakyow/environment/actions/normalizer.rb +73 -0
- data/lib/pakyow/environment/behavior/config.rb +166 -0
- data/lib/pakyow/environment/behavior/initializers.rb +21 -0
- data/lib/pakyow/environment/behavior/input_parsing.rb +54 -0
- data/lib/pakyow/environment/behavior/plugins.rb +23 -0
- data/lib/pakyow/environment/behavior/restarting.rb +54 -0
- data/lib/pakyow/environment/behavior/running.rb +129 -0
- data/lib/pakyow/environment/behavior/silencing.rb +23 -0
- data/lib/pakyow/environment/behavior/timezone.rb +21 -0
- data/lib/pakyow/environment/behavior/watching.rb +75 -0
- data/lib/pakyow/environment.rb +381 -0
- data/lib/pakyow/error.rb +273 -0
- data/lib/pakyow/errors.rb +97 -0
- data/lib/pakyow/framework.rb +39 -0
- data/lib/pakyow/generator.rb +138 -0
- data/lib/pakyow/generators/project/default/%dot%env.erb +1 -0
- data/lib/pakyow/generators/project/default/%dot%gitignore +11 -0
- data/lib/pakyow/generators/project/default/%dot%ruby-version.erb +1 -0
- data/lib/pakyow/generators/project/default/Gemfile.erb +28 -0
- data/lib/pakyow/generators/project/default/README.md +14 -0
- data/lib/pakyow/generators/project/default/config/application.rb.erb +17 -0
- data/lib/pakyow/generators/project/default/config/environment.rb +11 -0
- data/lib/pakyow/generators/project/default/config/initializers/application/keep +0 -0
- data/lib/pakyow/generators/project/default/config/initializers/environment/keep +0 -0
- data/lib/pakyow/generators/project/default/database/keep +0 -0
- data/lib/pakyow/generators/project/default/frontend/assets/images/keep +0 -0
- data/lib/pakyow/generators/project/default/frontend/assets/packs/keep +0 -0
- data/lib/pakyow/generators/project/default/frontend/assets/styles/keep +0 -0
- data/lib/pakyow/generators/project/default/frontend/includes/keep +0 -0
- data/lib/pakyow/generators/project/default/frontend/layouts/default.html.erb +19 -0
- data/lib/pakyow/generators/project/default/frontend/pages/keep +0 -0
- data/lib/pakyow/generators/project/default/public/favicon.ico +0 -0
- data/lib/pakyow/generators/project/default/public/robots.txt +1 -0
- data/lib/pakyow/generators/project.rb +29 -0
- data/lib/pakyow/helpers/app.rb +28 -0
- data/lib/pakyow/helpers/connection.rb +45 -0
- data/lib/pakyow/info.rb +26 -0
- data/lib/pakyow/integrations/bootsnap.rb +18 -0
- data/lib/pakyow/integrations/bundler/require.rb +7 -0
- data/lib/pakyow/integrations/bundler/setup.rb +7 -0
- data/lib/pakyow/integrations/dotenv.rb +9 -0
- data/lib/pakyow/loader.rb +31 -0
- data/lib/pakyow/logger/colorizer.rb +38 -0
- data/lib/pakyow/logger/destination.rb +17 -0
- data/lib/pakyow/logger/formatter.rb +22 -0
- data/lib/pakyow/logger/formatters/human.rb +101 -0
- data/lib/pakyow/logger/formatters/json.rb +99 -0
- data/lib/pakyow/logger/formatters/logfmt.rb +50 -0
- data/lib/pakyow/logger/multiplexed.rb +19 -0
- data/lib/pakyow/logger/thread_local.rb +29 -0
- data/lib/pakyow/logger/timekeeper.rb +64 -0
- data/lib/pakyow/logger.rb +125 -0
- data/lib/pakyow/operation.rb +71 -0
- data/lib/pakyow/plugin/helper_caller.rb +20 -0
- data/lib/pakyow/plugin/lookup.rb +33 -0
- data/lib/pakyow/plugin/state.rb +68 -0
- data/lib/pakyow/plugin.rb +367 -0
- data/lib/pakyow/process_manager.rb +53 -0
- data/lib/pakyow/processes/proxy.rb +67 -0
- data/lib/pakyow/processes/server.rb +32 -0
- data/lib/pakyow/rack/compatibility.rb +68 -0
- data/lib/pakyow/task.rb +315 -0
- data/lib/pakyow/tasks/boot.rake +21 -0
- data/lib/pakyow/tasks/create.rake +32 -0
- data/lib/pakyow/tasks/help.rake +17 -0
- data/lib/pakyow/tasks/info/endpoints.rake +72 -0
- data/lib/pakyow/tasks/info.rake +31 -0
- data/lib/pakyow/tasks/irb.rake +11 -0
- data/lib/pakyow/tasks/prelaunch.rake +37 -0
- data/lib/pakyow/types.rb +32 -0
- data/lib/pakyow/validations/acceptance.rb +37 -0
- data/lib/pakyow/validations/email.rb +28 -0
- data/lib/pakyow/validations/inline.rb +32 -0
- data/lib/pakyow/validations/length.rb +44 -0
- data/lib/pakyow/validations/presence.rb +41 -0
- data/lib/pakyow/validations.rb +8 -0
- data/lib/pakyow/validator.rb +81 -0
- data/lib/pakyow/verifier.rb +177 -0
- data/lib/pakyow.rb +5 -0
- metadata +267 -65
- data/pakyow-core/CHANGELOG.md +0 -128
- data/pakyow-core/LICENSE +0 -20
- data/pakyow-core/lib/pakyow/core/app.rb +0 -82
- data/pakyow-core/lib/pakyow/core/app_context.rb +0 -10
- data/pakyow-core/lib/pakyow/core/base.rb +0 -61
- data/pakyow-core/lib/pakyow/core/call_context.rb +0 -171
- data/pakyow-core/lib/pakyow/core/config/app.rb +0 -49
- data/pakyow-core/lib/pakyow/core/config/cookies.rb +0 -4
- data/pakyow-core/lib/pakyow/core/config/logger.rb +0 -34
- data/pakyow-core/lib/pakyow/core/config/reloader.rb +0 -10
- data/pakyow-core/lib/pakyow/core/config/server.rb +0 -10
- data/pakyow-core/lib/pakyow/core/config/session.rb +0 -41
- data/pakyow-core/lib/pakyow/core/config.rb +0 -95
- data/pakyow-core/lib/pakyow/core/errors.rb +0 -16
- data/pakyow-core/lib/pakyow/core/helpers/configuring.rb +0 -142
- data/pakyow-core/lib/pakyow/core/helpers/hooks.rb +0 -106
- data/pakyow-core/lib/pakyow/core/helpers/running.rb +0 -124
- data/pakyow-core/lib/pakyow/core/helpers.rb +0 -61
- data/pakyow-core/lib/pakyow/core/loader.rb +0 -32
- data/pakyow-core/lib/pakyow/core/middleware/logger.rb +0 -146
- data/pakyow-core/lib/pakyow/core/middleware/override.rb +0 -3
- data/pakyow-core/lib/pakyow/core/middleware/reloader.rb +0 -23
- data/pakyow-core/lib/pakyow/core/middleware/req_path_normalizer.rb +0 -49
- data/pakyow-core/lib/pakyow/core/middleware/session.rb +0 -5
- data/pakyow-core/lib/pakyow/core/middleware/static.rb +0 -76
- data/pakyow-core/lib/pakyow/core/multilog.rb +0 -19
- data/pakyow-core/lib/pakyow/core/request.rb +0 -119
- data/pakyow-core/lib/pakyow/core/response.rb +0 -135
- data/pakyow-core/lib/pakyow/core/route_eval.rb +0 -254
- data/pakyow-core/lib/pakyow/core/route_expansion_eval.rb +0 -115
- data/pakyow-core/lib/pakyow/core/route_lookup.rb +0 -41
- data/pakyow-core/lib/pakyow/core/route_merger.rb +0 -76
- data/pakyow-core/lib/pakyow/core/route_module.rb +0 -21
- data/pakyow-core/lib/pakyow/core/route_set.rb +0 -74
- data/pakyow-core/lib/pakyow/core/route_template_defaults.rb +0 -43
- data/pakyow-core/lib/pakyow/core/route_template_eval.rb +0 -72
- data/pakyow-core/lib/pakyow/core/router.rb +0 -181
- data/pakyow-core/lib/pakyow/core.rb +0 -8
- data/pakyow-core/lib/pakyow-core.rb +0 -1
@@ -1,76 +0,0 @@
|
|
1
|
-
module Pakyow
|
2
|
-
module RouteMerger
|
3
|
-
private
|
4
|
-
|
5
|
-
def merge(route_eval)
|
6
|
-
merge_fns(route_eval.fns)
|
7
|
-
merge_routes(route_eval.routes)
|
8
|
-
merge_handlers(route_eval.handlers)
|
9
|
-
merge_lookup(route_eval.lookup)
|
10
|
-
merge_templates(route_eval.templates)
|
11
|
-
end
|
12
|
-
|
13
|
-
def merge_fns(fns)
|
14
|
-
@fns.merge!(fns)
|
15
|
-
end
|
16
|
-
|
17
|
-
def merge_routes(routes)
|
18
|
-
@routes[:get].concat(routes[:get])
|
19
|
-
@routes[:put].concat(routes[:put])
|
20
|
-
@routes[:patch].concat(routes[:patch])
|
21
|
-
@routes[:post].concat(routes[:post])
|
22
|
-
@routes[:delete].concat(routes[:delete])
|
23
|
-
end
|
24
|
-
|
25
|
-
def merge_handlers(handlers)
|
26
|
-
@handlers.concat(handlers)
|
27
|
-
end
|
28
|
-
|
29
|
-
def merge_lookup(lookup)
|
30
|
-
@lookup[:routes].merge!(lookup[:routes])
|
31
|
-
@lookup[:grouped].deep_merge!(lookup[:grouped])
|
32
|
-
end
|
33
|
-
|
34
|
-
def merge_templates(templates)
|
35
|
-
@templates.merge!(templates)
|
36
|
-
end
|
37
|
-
|
38
|
-
#TODO should this accept one or two args?
|
39
|
-
def merge_hooks(h1, h2)
|
40
|
-
# normalize
|
41
|
-
h1 = normalize_hooks(h1)
|
42
|
-
h2 = normalize_hooks(h2)
|
43
|
-
|
44
|
-
# merge
|
45
|
-
h1[:before].concat(h2[:before])
|
46
|
-
h1[:after].concat(h2[:after])
|
47
|
-
h1[:around].concat(h2[:around])
|
48
|
-
|
49
|
-
return h1
|
50
|
-
end
|
51
|
-
|
52
|
-
def copy_hooks(hooks)
|
53
|
-
{
|
54
|
-
:before => (hooks[:before] || []).dup,
|
55
|
-
:after => (hooks[:after] || []).dup,
|
56
|
-
:around => (hooks[:around] || []).dup,
|
57
|
-
}
|
58
|
-
end
|
59
|
-
|
60
|
-
def normalize_hooks(hooks)
|
61
|
-
hooks ||= {}
|
62
|
-
|
63
|
-
[:before, :after, :around].each do |type|
|
64
|
-
# force array
|
65
|
-
hooks[type] = Array(hooks[type])
|
66
|
-
|
67
|
-
# lookup hook fns if not already a Proc
|
68
|
-
hooks[type] = hooks[type].map do |hook|
|
69
|
-
hook.is_a?(Symbol) ? fn(hook) : hook
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
return hooks
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
|
-
module Pakyow
|
4
|
-
# Include in a module to define route mixins
|
5
|
-
# that can be included into route sets.
|
6
|
-
module Routes
|
7
|
-
def self.included(base)
|
8
|
-
raise StandardError, "Pakyow::Routes is intended to be included only in other modules" if base.is_a?(Class)
|
9
|
-
|
10
|
-
base.extend(ClassMethods)
|
11
|
-
base.instance_variable_set(:@route_eval, RouteEval.new)
|
12
|
-
end
|
13
|
-
|
14
|
-
module ClassMethods
|
15
|
-
attr_reader :route_eval
|
16
|
-
extend Forwardable
|
17
|
-
def_delegators :@route_eval, :fn, :default, :get, :put, :post, :delete,
|
18
|
-
:handler, :group, :namespace, :template, :action, :expand
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,74 +0,0 @@
|
|
1
|
-
module Pakyow
|
2
|
-
class RouteSet
|
3
|
-
include RouteMerger
|
4
|
-
|
5
|
-
attr_reader :routes, :lookup
|
6
|
-
|
7
|
-
def initialize
|
8
|
-
@routes = {:get => [], :post => [], :put => [], :patch => [], :delete => []}
|
9
|
-
@lookup = { :routes => {}, :grouped => {}}
|
10
|
-
@handlers = []
|
11
|
-
@fns = {}
|
12
|
-
@templates = {}
|
13
|
-
end
|
14
|
-
|
15
|
-
def eval(&block)
|
16
|
-
evaluator = RouteEval.with_defaults
|
17
|
-
evaluator.eval(&block)
|
18
|
-
merge(evaluator)
|
19
|
-
end
|
20
|
-
|
21
|
-
# Returns a route tuple:
|
22
|
-
# [regex, vars, name, fns, path]
|
23
|
-
#
|
24
|
-
def match(path, method)
|
25
|
-
path = String.normalize_path(path)
|
26
|
-
|
27
|
-
# want the request to still knows it's a head, but match as get
|
28
|
-
method = method.to_sym
|
29
|
-
method = :get if method == :head
|
30
|
-
|
31
|
-
(@routes[method] || []).each do |r|
|
32
|
-
#TODO can we do this without conditionals? fall-through?
|
33
|
-
case r[0]
|
34
|
-
when Regexp
|
35
|
-
if data = r[0].match(path)
|
36
|
-
return r, data
|
37
|
-
end
|
38
|
-
when String
|
39
|
-
if r[0] == path
|
40
|
-
return r, nil
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
nil
|
46
|
-
end
|
47
|
-
|
48
|
-
def handle(name_or_code)
|
49
|
-
@handlers.each{ |h|
|
50
|
-
return h if h[0] == name_or_code || h[1] == name_or_code
|
51
|
-
}
|
52
|
-
|
53
|
-
#TODO raise error
|
54
|
-
nil
|
55
|
-
end
|
56
|
-
|
57
|
-
# Name based route lookup
|
58
|
-
def route(name, group = nil)
|
59
|
-
return @lookup[:routes][name] if group.nil?
|
60
|
-
|
61
|
-
if grouped_routes = @lookup[:grouped][group]
|
62
|
-
return grouped_routes[name]
|
63
|
-
else
|
64
|
-
#TODO error (perhaps a set-specific exception rescued by router)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Name based fn lookup
|
69
|
-
def fn(name)
|
70
|
-
return @fns[name]
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module Pakyow
|
2
|
-
module Routes
|
3
|
-
module Restful
|
4
|
-
include Pakyow::Routes
|
5
|
-
|
6
|
-
template :restful do
|
7
|
-
resource_id = ":#{@group}_id"
|
8
|
-
|
9
|
-
nested_path { |path| File.join(path, resource_id) }
|
10
|
-
view_path = nested_path.gsub(/:[^\/]+/, '').split('/').reject { |p| p.empty? }.join('/')
|
11
|
-
|
12
|
-
fn :reset_view_path do
|
13
|
-
begin
|
14
|
-
presenter.path = File.join(view_path, 'show') if @presenter
|
15
|
-
rescue Presenter::MissingView
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
get :list, '/'
|
20
|
-
get :new, '/new'
|
21
|
-
get :show, "/#{resource_id}", before: [:reset_view_path]
|
22
|
-
|
23
|
-
post :create, '/'
|
24
|
-
|
25
|
-
get :edit, "/#{resource_id}/edit"
|
26
|
-
patch :update, "/#{resource_id}"
|
27
|
-
put :replace, "/#{resource_id}"
|
28
|
-
delete :remove, "/#{resource_id}"
|
29
|
-
|
30
|
-
group :collection
|
31
|
-
namespace :member, resource_id
|
32
|
-
|
33
|
-
post_process do
|
34
|
-
# the show route is weird; move it to the end of get routes to avoid conflicts
|
35
|
-
if show_index = @routes[:get].find_index { |route| route[2] == :show }
|
36
|
-
@routes[:get] << @routes[:get].delete_at(show_index)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module Pakyow
|
2
|
-
class RouteTemplateEval < RouteEval
|
3
|
-
attr_accessor :direct_path
|
4
|
-
|
5
|
-
def initialize(*args)
|
6
|
-
super
|
7
|
-
|
8
|
-
@groups = {}
|
9
|
-
@namespaces = {}
|
10
|
-
|
11
|
-
@routes_path = path
|
12
|
-
@nested_path = path
|
13
|
-
end
|
14
|
-
|
15
|
-
def has_action?(name)
|
16
|
-
!route_for_action(name).nil?
|
17
|
-
end
|
18
|
-
|
19
|
-
def has_group?(name)
|
20
|
-
!group_named(name).nil?
|
21
|
-
end
|
22
|
-
|
23
|
-
def has_namespace?(name)
|
24
|
-
!namespace_named(name).nil?
|
25
|
-
end
|
26
|
-
|
27
|
-
def route_for_action(name)
|
28
|
-
lookup.fetch(:grouped, {}).fetch(@group, {})[name]
|
29
|
-
end
|
30
|
-
|
31
|
-
def namespace_named(name)
|
32
|
-
@namespaces[name]
|
33
|
-
end
|
34
|
-
|
35
|
-
def group_named(name)
|
36
|
-
@groups[name]
|
37
|
-
end
|
38
|
-
|
39
|
-
def build_fns(fns, hooks)
|
40
|
-
{
|
41
|
-
fns: fns,
|
42
|
-
hooks: hooks,
|
43
|
-
}
|
44
|
-
end
|
45
|
-
|
46
|
-
def namespace(*args)
|
47
|
-
path, name, hooks = self.class.parse_namespace_args(args)
|
48
|
-
@namespaces[name] = [path, hooks]
|
49
|
-
end
|
50
|
-
|
51
|
-
def group(*args)
|
52
|
-
name, hooks = self.class.parse_group_args(args)
|
53
|
-
@groups[name] = [hooks]
|
54
|
-
end
|
55
|
-
|
56
|
-
def routes_path(&block)
|
57
|
-
return @routes_path unless block_given?
|
58
|
-
@routes_path = yield(@routes_path)
|
59
|
-
@path = @routes_path
|
60
|
-
end
|
61
|
-
|
62
|
-
def nested_path(&block)
|
63
|
-
return @nested_path unless block_given?
|
64
|
-
@nested_path = yield(@nested_path)
|
65
|
-
end
|
66
|
-
|
67
|
-
def post_process(&block)
|
68
|
-
return @post_process unless block_given?
|
69
|
-
@post_process = block
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,181 +0,0 @@
|
|
1
|
-
require 'singleton'
|
2
|
-
|
3
|
-
module Pakyow
|
4
|
-
# A singleton that manages route sets.
|
5
|
-
#
|
6
|
-
class Router
|
7
|
-
include Singleton
|
8
|
-
|
9
|
-
attr_reader :sets
|
10
|
-
|
11
|
-
def initialize
|
12
|
-
@sets = {}
|
13
|
-
end
|
14
|
-
|
15
|
-
#TODO want to do this for all sets?
|
16
|
-
def reset
|
17
|
-
@sets = {}
|
18
|
-
self
|
19
|
-
end
|
20
|
-
|
21
|
-
# Creates a new set.
|
22
|
-
#
|
23
|
-
def set(name, &block)
|
24
|
-
@sets[name] = RouteSet.new
|
25
|
-
@sets[name].eval(&block)
|
26
|
-
end
|
27
|
-
|
28
|
-
# Iterates through route sets and returns the first matching route.
|
29
|
-
#
|
30
|
-
def route(name, group = nil)
|
31
|
-
@sets.each { |set|
|
32
|
-
if r = set[1].route(name, group)
|
33
|
-
return r
|
34
|
-
end
|
35
|
-
}
|
36
|
-
|
37
|
-
raise MissingRoute, "Could not find route '#{name}'"
|
38
|
-
end
|
39
|
-
|
40
|
-
def exists?(context)
|
41
|
-
!match(context.request).empty?
|
42
|
-
end
|
43
|
-
|
44
|
-
# Performs the initial routing for a request.
|
45
|
-
#
|
46
|
-
def perform(context, app = Pakyow.app, &after_match)
|
47
|
-
fns = match(context.request)
|
48
|
-
after_match.call if block_given?
|
49
|
-
|
50
|
-
trampoline(fns, app)
|
51
|
-
end
|
52
|
-
|
53
|
-
# Reroutes a request.
|
54
|
-
#
|
55
|
-
def reroute(request)
|
56
|
-
throw :fns, self.match(request)
|
57
|
-
end
|
58
|
-
|
59
|
-
# Finds and invokes a handler by name or by status code.
|
60
|
-
#
|
61
|
-
def handle(name_or_code, app = Pakyow.app, from_logic = false)
|
62
|
-
app.response.status = name_or_code if name_or_code.is_a?(Integer)
|
63
|
-
|
64
|
-
@sets.each { |set|
|
65
|
-
if h = set[1].handle(name_or_code)
|
66
|
-
app.response.status = h[1]
|
67
|
-
from_logic ? throw(:fns, h[2]) : self.trampoline(h[2], app)
|
68
|
-
break
|
69
|
-
end
|
70
|
-
}
|
71
|
-
end
|
72
|
-
|
73
|
-
# Looks up and populates a path with data
|
74
|
-
#
|
75
|
-
def path(name_or_path, data = nil)
|
76
|
-
if name_or_path.is_a?(String)
|
77
|
-
return name_or_path
|
78
|
-
elsif name_or_path.is_a?(Hash)
|
79
|
-
RouteLookup.new.group(name_or_path.keys[0]).path(name_or_path.values[0], data)
|
80
|
-
else
|
81
|
-
RouteLookup.new.path(name_or_path, data)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
# Looks up a route grouping
|
86
|
-
#
|
87
|
-
def group(name)
|
88
|
-
RouteLookup.new.group(name)
|
89
|
-
end
|
90
|
-
|
91
|
-
# Calls a defined fn
|
92
|
-
#
|
93
|
-
def fn(name, app = nil)
|
94
|
-
@sets.each { |set|
|
95
|
-
if fn = set[1].fn(name)
|
96
|
-
if app.nil?
|
97
|
-
fn.call
|
98
|
-
else
|
99
|
-
app.instance_exec(&fn)
|
100
|
-
end
|
101
|
-
|
102
|
-
break
|
103
|
-
end
|
104
|
-
}
|
105
|
-
end
|
106
|
-
|
107
|
-
protected
|
108
|
-
|
109
|
-
# Calls a list of route functions in order (in a shared context).
|
110
|
-
#
|
111
|
-
def call_fns(fns, app)
|
112
|
-
fns.each {|fn| app.instance_exec(&fn)}
|
113
|
-
end
|
114
|
-
|
115
|
-
# Finds the first matching route for the request path/method and
|
116
|
-
# returns the list of route functions for that route.
|
117
|
-
#
|
118
|
-
def match(request)
|
119
|
-
path = String.normalize_path(request.path)
|
120
|
-
method = request.method
|
121
|
-
|
122
|
-
match, data = nil
|
123
|
-
@sets.each { |set|
|
124
|
-
match, data = set[1].match(path, method)
|
125
|
-
break if match
|
126
|
-
}
|
127
|
-
|
128
|
-
fns = []
|
129
|
-
if match
|
130
|
-
fns = match[3]
|
131
|
-
|
132
|
-
# handle route params
|
133
|
-
#TODO where to do this?
|
134
|
-
request.params.merge!(Hash.strhash(self.data_from_path(path, data, match[1])))
|
135
|
-
|
136
|
-
#TODO where to do this?
|
137
|
-
request.route_path = match[4]
|
138
|
-
end
|
139
|
-
|
140
|
-
fns
|
141
|
-
end
|
142
|
-
|
143
|
-
# Calls route functions and catches new functions as
|
144
|
-
# they're thrown (e.g. by reroute).
|
145
|
-
#
|
146
|
-
def trampoline(fns, app)
|
147
|
-
routed = false
|
148
|
-
until fns.empty?
|
149
|
-
fns = catch(:fns) {
|
150
|
-
self.call_fns(fns, app)
|
151
|
-
|
152
|
-
# Getting here means that call() returned normally (not via a throw)
|
153
|
-
:fall_through
|
154
|
-
} # end :fns catch block
|
155
|
-
|
156
|
-
# If reroute! or invoke_handler! was called in the block, block will have a new value (nil or block).
|
157
|
-
# If neither was called, block will be :fall_through
|
158
|
-
|
159
|
-
routed = case fns
|
160
|
-
when [] then false
|
161
|
-
when :fall_through then fns = [] and true
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
return routed
|
166
|
-
end
|
167
|
-
|
168
|
-
# Extracts the data from a path.
|
169
|
-
#
|
170
|
-
def data_from_path(path, matches, vars)
|
171
|
-
data = {}
|
172
|
-
return data unless matches
|
173
|
-
|
174
|
-
matches.names.each {|var|
|
175
|
-
data[var.to_sym] = matches[var]
|
176
|
-
}
|
177
|
-
|
178
|
-
data
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
require 'pakyow/core'
|