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.
Files changed (156) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +0 -0
  3. data/LICENSE +4 -0
  4. data/{pakyow-core/README.md → README.md} +3 -4
  5. data/commands/pakyow +13 -0
  6. data/lib/pakyow/app/connection/behavior/session.rb +33 -0
  7. data/lib/pakyow/app/connection/behavior/values.rb +42 -0
  8. data/lib/pakyow/app/connection/behavior/verifier.rb +34 -0
  9. data/lib/pakyow/app/connection/session/abstract.rb +24 -0
  10. data/lib/pakyow/app/connection/session/cookie.rb +56 -0
  11. data/lib/pakyow/app/connection.rb +57 -0
  12. data/lib/pakyow/app.rb +219 -0
  13. data/lib/pakyow/behavior/aspects.rb +45 -0
  14. data/lib/pakyow/behavior/config.rb +72 -0
  15. data/lib/pakyow/behavior/endpoints.rb +41 -0
  16. data/lib/pakyow/behavior/frameworks.rb +45 -0
  17. data/lib/pakyow/behavior/helpers.rb +107 -0
  18. data/lib/pakyow/behavior/initializers.rb +19 -0
  19. data/lib/pakyow/behavior/isolating.rb +69 -0
  20. data/lib/pakyow/behavior/operations.rb +46 -0
  21. data/lib/pakyow/behavior/pipeline.rb +58 -0
  22. data/lib/pakyow/behavior/plugins.rb +148 -0
  23. data/lib/pakyow/behavior/rescuing.rb +51 -0
  24. data/lib/pakyow/behavior/restarting.rb +68 -0
  25. data/lib/pakyow/behavior/sessions.rb +34 -0
  26. data/lib/pakyow/behavior/verification.rb +47 -0
  27. data/lib/pakyow/cli.rb +199 -0
  28. data/lib/pakyow/connection/multipart_input.rb +24 -0
  29. data/lib/pakyow/connection/multipart_parser.rb +112 -0
  30. data/lib/pakyow/connection/params.rb +29 -0
  31. data/lib/pakyow/connection/query_parser.rb +174 -0
  32. data/lib/pakyow/connection/statuses.rb +119 -0
  33. data/lib/pakyow/connection.rb +568 -0
  34. data/lib/pakyow/endpoints.rb +94 -0
  35. data/lib/pakyow/environment/actions/dispatch.rb +37 -0
  36. data/lib/pakyow/environment/actions/input_parser.rb +21 -0
  37. data/lib/pakyow/environment/actions/logger.rb +33 -0
  38. data/lib/pakyow/environment/actions/normalizer.rb +73 -0
  39. data/lib/pakyow/environment/behavior/config.rb +166 -0
  40. data/lib/pakyow/environment/behavior/initializers.rb +21 -0
  41. data/lib/pakyow/environment/behavior/input_parsing.rb +54 -0
  42. data/lib/pakyow/environment/behavior/plugins.rb +23 -0
  43. data/lib/pakyow/environment/behavior/restarting.rb +54 -0
  44. data/lib/pakyow/environment/behavior/running.rb +129 -0
  45. data/lib/pakyow/environment/behavior/silencing.rb +23 -0
  46. data/lib/pakyow/environment/behavior/timezone.rb +21 -0
  47. data/lib/pakyow/environment/behavior/watching.rb +75 -0
  48. data/lib/pakyow/environment.rb +381 -0
  49. data/lib/pakyow/error.rb +273 -0
  50. data/lib/pakyow/errors.rb +97 -0
  51. data/lib/pakyow/framework.rb +39 -0
  52. data/lib/pakyow/generator.rb +138 -0
  53. data/lib/pakyow/generators/project/default/%dot%env.erb +1 -0
  54. data/lib/pakyow/generators/project/default/%dot%gitignore +11 -0
  55. data/lib/pakyow/generators/project/default/%dot%ruby-version.erb +1 -0
  56. data/lib/pakyow/generators/project/default/Gemfile.erb +28 -0
  57. data/lib/pakyow/generators/project/default/README.md +14 -0
  58. data/lib/pakyow/generators/project/default/config/application.rb.erb +17 -0
  59. data/lib/pakyow/generators/project/default/config/environment.rb +11 -0
  60. data/lib/pakyow/generators/project/default/config/initializers/application/keep +0 -0
  61. data/lib/pakyow/generators/project/default/config/initializers/environment/keep +0 -0
  62. data/lib/pakyow/generators/project/default/database/keep +0 -0
  63. data/lib/pakyow/generators/project/default/frontend/assets/images/keep +0 -0
  64. data/lib/pakyow/generators/project/default/frontend/assets/packs/keep +0 -0
  65. data/lib/pakyow/generators/project/default/frontend/assets/styles/keep +0 -0
  66. data/lib/pakyow/generators/project/default/frontend/includes/keep +0 -0
  67. data/lib/pakyow/generators/project/default/frontend/layouts/default.html.erb +19 -0
  68. data/lib/pakyow/generators/project/default/frontend/pages/keep +0 -0
  69. data/lib/pakyow/generators/project/default/public/favicon.ico +0 -0
  70. data/lib/pakyow/generators/project/default/public/robots.txt +1 -0
  71. data/lib/pakyow/generators/project.rb +29 -0
  72. data/lib/pakyow/helpers/app.rb +28 -0
  73. data/lib/pakyow/helpers/connection.rb +45 -0
  74. data/lib/pakyow/info.rb +26 -0
  75. data/lib/pakyow/integrations/bootsnap.rb +18 -0
  76. data/lib/pakyow/integrations/bundler/require.rb +7 -0
  77. data/lib/pakyow/integrations/bundler/setup.rb +7 -0
  78. data/lib/pakyow/integrations/dotenv.rb +9 -0
  79. data/lib/pakyow/loader.rb +31 -0
  80. data/lib/pakyow/logger/colorizer.rb +38 -0
  81. data/lib/pakyow/logger/destination.rb +17 -0
  82. data/lib/pakyow/logger/formatter.rb +22 -0
  83. data/lib/pakyow/logger/formatters/human.rb +101 -0
  84. data/lib/pakyow/logger/formatters/json.rb +99 -0
  85. data/lib/pakyow/logger/formatters/logfmt.rb +50 -0
  86. data/lib/pakyow/logger/multiplexed.rb +19 -0
  87. data/lib/pakyow/logger/thread_local.rb +29 -0
  88. data/lib/pakyow/logger/timekeeper.rb +64 -0
  89. data/lib/pakyow/logger.rb +125 -0
  90. data/lib/pakyow/operation.rb +71 -0
  91. data/lib/pakyow/plugin/helper_caller.rb +20 -0
  92. data/lib/pakyow/plugin/lookup.rb +33 -0
  93. data/lib/pakyow/plugin/state.rb +68 -0
  94. data/lib/pakyow/plugin.rb +367 -0
  95. data/lib/pakyow/process_manager.rb +53 -0
  96. data/lib/pakyow/processes/proxy.rb +67 -0
  97. data/lib/pakyow/processes/server.rb +32 -0
  98. data/lib/pakyow/rack/compatibility.rb +68 -0
  99. data/lib/pakyow/task.rb +315 -0
  100. data/lib/pakyow/tasks/boot.rake +21 -0
  101. data/lib/pakyow/tasks/create.rake +32 -0
  102. data/lib/pakyow/tasks/help.rake +17 -0
  103. data/lib/pakyow/tasks/info/endpoints.rake +72 -0
  104. data/lib/pakyow/tasks/info.rake +31 -0
  105. data/lib/pakyow/tasks/irb.rake +11 -0
  106. data/lib/pakyow/tasks/prelaunch.rake +37 -0
  107. data/lib/pakyow/types.rb +32 -0
  108. data/lib/pakyow/validations/acceptance.rb +37 -0
  109. data/lib/pakyow/validations/email.rb +28 -0
  110. data/lib/pakyow/validations/inline.rb +32 -0
  111. data/lib/pakyow/validations/length.rb +44 -0
  112. data/lib/pakyow/validations/presence.rb +41 -0
  113. data/lib/pakyow/validations.rb +8 -0
  114. data/lib/pakyow/validator.rb +81 -0
  115. data/lib/pakyow/verifier.rb +177 -0
  116. data/lib/pakyow.rb +5 -0
  117. metadata +267 -65
  118. data/pakyow-core/CHANGELOG.md +0 -128
  119. data/pakyow-core/LICENSE +0 -20
  120. data/pakyow-core/lib/pakyow/core/app.rb +0 -82
  121. data/pakyow-core/lib/pakyow/core/app_context.rb +0 -10
  122. data/pakyow-core/lib/pakyow/core/base.rb +0 -61
  123. data/pakyow-core/lib/pakyow/core/call_context.rb +0 -171
  124. data/pakyow-core/lib/pakyow/core/config/app.rb +0 -49
  125. data/pakyow-core/lib/pakyow/core/config/cookies.rb +0 -4
  126. data/pakyow-core/lib/pakyow/core/config/logger.rb +0 -34
  127. data/pakyow-core/lib/pakyow/core/config/reloader.rb +0 -10
  128. data/pakyow-core/lib/pakyow/core/config/server.rb +0 -10
  129. data/pakyow-core/lib/pakyow/core/config/session.rb +0 -41
  130. data/pakyow-core/lib/pakyow/core/config.rb +0 -95
  131. data/pakyow-core/lib/pakyow/core/errors.rb +0 -16
  132. data/pakyow-core/lib/pakyow/core/helpers/configuring.rb +0 -142
  133. data/pakyow-core/lib/pakyow/core/helpers/hooks.rb +0 -106
  134. data/pakyow-core/lib/pakyow/core/helpers/running.rb +0 -124
  135. data/pakyow-core/lib/pakyow/core/helpers.rb +0 -61
  136. data/pakyow-core/lib/pakyow/core/loader.rb +0 -32
  137. data/pakyow-core/lib/pakyow/core/middleware/logger.rb +0 -146
  138. data/pakyow-core/lib/pakyow/core/middleware/override.rb +0 -3
  139. data/pakyow-core/lib/pakyow/core/middleware/reloader.rb +0 -23
  140. data/pakyow-core/lib/pakyow/core/middleware/req_path_normalizer.rb +0 -49
  141. data/pakyow-core/lib/pakyow/core/middleware/session.rb +0 -5
  142. data/pakyow-core/lib/pakyow/core/middleware/static.rb +0 -76
  143. data/pakyow-core/lib/pakyow/core/multilog.rb +0 -19
  144. data/pakyow-core/lib/pakyow/core/request.rb +0 -119
  145. data/pakyow-core/lib/pakyow/core/response.rb +0 -135
  146. data/pakyow-core/lib/pakyow/core/route_eval.rb +0 -254
  147. data/pakyow-core/lib/pakyow/core/route_expansion_eval.rb +0 -115
  148. data/pakyow-core/lib/pakyow/core/route_lookup.rb +0 -41
  149. data/pakyow-core/lib/pakyow/core/route_merger.rb +0 -76
  150. data/pakyow-core/lib/pakyow/core/route_module.rb +0 -21
  151. data/pakyow-core/lib/pakyow/core/route_set.rb +0 -74
  152. data/pakyow-core/lib/pakyow/core/route_template_defaults.rb +0 -43
  153. data/pakyow-core/lib/pakyow/core/route_template_eval.rb +0 -72
  154. data/pakyow-core/lib/pakyow/core/router.rb +0 -181
  155. data/pakyow-core/lib/pakyow/core.rb +0 -8
  156. data/pakyow-core/lib/pakyow-core.rb +0 -1
@@ -1,119 +0,0 @@
1
- require 'json'
2
- require 'rack'
3
-
4
- module Pakyow
5
-
6
- # The Request object.
7
- class Request < Rack::Request
8
- attr_accessor :restful, :route_path, :controller, :action, :format,
9
- :error, :path, :method, :paths, :methods, :formats
10
-
11
- def initialize(*args)
12
- super
13
-
14
- @paths = []
15
- @methods = []
16
- @formats = []
17
-
18
- @path = path_info
19
- @method = request_method.downcase.to_sym
20
-
21
- setup
22
- end
23
-
24
- def path=(path)
25
- @paths << path
26
- @path = path
27
- end
28
-
29
- def method=(method)
30
- @methods << method
31
- @method = method
32
- end
33
-
34
- def format=(format)
35
- format = format ? format.to_sym : :html
36
- @formats << format
37
- @format = format
38
- end
39
-
40
- def first_path
41
- @paths[0]
42
- end
43
-
44
- def first_method
45
- @methods[0]
46
- end
47
-
48
- def first_format
49
- @formats[0]
50
- end
51
-
52
- def session
53
- self.env['rack.session'] || {}
54
- end
55
-
56
- def cookies
57
- @cookies ||= Hash.strhash(super)
58
- end
59
-
60
- # Returns indifferent params (see {HashUtils.strhash} for more info on indifferent hashes).
61
- def params
62
- return @params unless @params.nil?
63
-
64
- @params = super
65
- @params.merge!(env['pakyow.data']) if env['pakyow.data'].is_a?(Hash)
66
- @params.merge!(JSON.parse(body.read.to_s)) if format == :json
67
- @params = Hash.strhash(@params)
68
- end
69
-
70
- # Returns array of url components.
71
- def path_parts
72
- @url ||= path ? self.class.split_url(path) : []
73
- end
74
-
75
- def referer
76
- @referer ||= env['HTTP_REFERER']
77
- end
78
-
79
- # Returns array of referer components.
80
- def referer_parts
81
- @referer_parts ||= referer ? self.class.split_url(referer) : []
82
- end
83
-
84
- def setup(path = self.path, method = nil)
85
- set_request_format_from_path(path)
86
- set_working_path_from_path(path, method)
87
- end
88
-
89
- #TODO move to util class
90
- def self.split_url(url)
91
- arr = []
92
- url.split('/').each { |r|
93
- arr << r unless r.empty?
94
- }
95
-
96
- return arr
97
- end
98
-
99
- def has_route_vars?
100
- return false if @route_path.nil?
101
- return false if @route_path.is_a?(Regexp)
102
- return true if @route_path.index(':')
103
- end
104
-
105
- protected
106
-
107
- def set_working_path_from_path(path, method)
108
- base_route, ignore_format = String.split_at_last_dot(path)
109
-
110
- self.path = base_route
111
- self.method = method || self.method
112
- end
113
-
114
- def set_request_format_from_path(path)
115
- path, format = String.split_at_last_dot(path)
116
- self.format = ((format && (format[format.length - 1, 1] == '/')) ? format[0, format.length - 1] : format)
117
- end
118
- end
119
- end
@@ -1,135 +0,0 @@
1
- module Pakyow
2
-
3
- # The Response object.
4
- class Response < Rack::Response
5
- attr_reader :format
6
-
7
- DEFAULT_CONTENT_TYPE = 'text/html;charset=utf-8'.freeze
8
-
9
- STATUS_CODE_NAMES = {
10
- 100 => 'Continue',
11
- 101 => 'Switching Protocols',
12
-
13
- 200 => 'OK',
14
- 201 => 'Created',
15
- 202 => 'Accepted',
16
- 203 => 'Non-Authoritative Information',
17
- 204 => 'No Content',
18
- 205 => 'Reset Content',
19
- 206 => 'Partial Content',
20
-
21
- 300 => 'Multiple Choices',
22
- 301 => 'Moved Permanently',
23
- 302 => 'Found',
24
- 303 => 'See Other',
25
- 304 => 'Not Modified',
26
- 305 => 'Use Proxy',
27
- 306 => 'Switch Proxy',
28
- 307 => 'Temporary Redirect',
29
-
30
- 400 => 'Bad Request',
31
- 401 => 'Unauthorized',
32
- 402 => 'Payment Required',
33
- 403 => 'Forbidden',
34
- 404 => 'Not Found',
35
- 405 => 'Method Not Allowed',
36
- 406 => 'Not Acceptable',
37
- 407 => 'Proxy Authentication Required',
38
- 408 => 'Request Timeout',
39
- 409 => 'Conflict',
40
- 410 => 'Gone',
41
- 411 => 'Length Required',
42
- 412 => 'Precondition Failed',
43
- 413 => 'Request Entity Too Large',
44
- 414 => 'Request-URI Too Long',
45
- 415 => 'Unsupported Media Type',
46
- 416 => 'Requested Range Not Satisfiable',
47
- 417 => 'Expectation Failed',
48
- 418 => 'I\'m a teapot',
49
-
50
- 500 => 'Internal Server Error',
51
- 501 => 'Not Implemented',
52
- 502 => 'Bad Gateway',
53
- 503 => 'Service Unavailable',
54
- 504 => 'Gateway Timeout',
55
- 505 => 'HTTP Version Not Supported',
56
- 506 => 'Variant Also Negotiates',
57
- 507 => 'Insufficient Storage',
58
- 508 => 'Loop Detected',
59
- 509 => 'Bandwidth Limit Exceeded',
60
- 510 => 'Not Extended',
61
- 511 => 'Network Authentication Required'
62
- }
63
-
64
- STATUS_CODE_LOOKUP = {
65
- continue: 100,
66
- switching_protocols: 101,
67
-
68
- ok: 200,
69
- created: 201,
70
- accepted: 202,
71
- non_authoritative_information: 203,
72
- no_content: 204,
73
- reset_content: 205,
74
- partial_content: 206,
75
-
76
- multiple_choices: 300,
77
- moved_permanently: 301,
78
- found: 302,
79
- see_other: 303,
80
- not_modified: 304,
81
- use_proxy: 305,
82
- reserved: 306,
83
- temporary_redirect: 307,
84
-
85
- bad_request: 400,
86
- unauthorized: 401,
87
- payment_required: 402,
88
- forbidden: 403,
89
- not_found: 404,
90
- method_not_allowed: 405,
91
- not_acceptable: 406,
92
- proxy_authentication_required: 407,
93
- request_timeout: 408,
94
- conflict: 409,
95
- gone: 410,
96
- length_required: 411,
97
- precondition_failed: 412,
98
- request_entity_too_large: 413,
99
- request_uri_too_long: 414,
100
- unsupported_media_type: 415,
101
- requested_range_not_satisfiable: 416,
102
- expectation_failed: 417,
103
- teapot: 418,
104
-
105
- internal_server_error: 500,
106
- not_implemented: 501,
107
- bad_gateway: 502,
108
- service_unavailable: 503,
109
- gateway_timeout: 504,
110
- http_version_not_supported: 505,
111
- variant_also_negotiates: 506,
112
- insufficient_storage: 507,
113
- loop_detected: 508,
114
- bandwidth_exceeded: 509,
115
- not_extended: 510,
116
- network_authentication_required: 511
117
- }
118
-
119
- def initialize(*args)
120
- super
121
-
122
- self["Content-Type"] ||= DEFAULT_CONTENT_TYPE
123
- @format = Rack::Mime::MIME_TYPES.key(type)
124
- end
125
-
126
- def format=(format)
127
- @format = format
128
- self["Content-Type"] = format == :html ? DEFAULT_CONTENT_TYPE : Rack::Mime.mime_type(".#{format}")
129
- end
130
-
131
- def type
132
- self["Content-Type"]
133
- end
134
- end
135
- end
@@ -1,254 +0,0 @@
1
- module Pakyow
2
- class RouteEval
3
- include RouteMerger
4
-
5
- attr_reader :path, :fns, :hooks, :group, :routes, :handlers, :lookup, :templates
6
-
7
- HTTP_METHODS = [:get, :post, :put, :patch, :delete]
8
- DEFAULT_MIXINS = ['Restful']
9
-
10
- class << self
11
- def with_defaults(*args)
12
- instance = self.new(*args)
13
-
14
- # Mixin defaults
15
- DEFAULT_MIXINS.each { |mixin| instance.include(Pakyow::Routes.const_get(mixin)) }
16
-
17
- return instance
18
- end
19
-
20
- def from_scope(route_eval, args = {})
21
- [:path, :fns, :hooks, :templates, :group].each do |arg|
22
- next unless value = route_eval.instance_variable_get(:"@#{arg}")
23
- args[arg] ||= value.dup
24
- end
25
-
26
- self.new(args)
27
- end
28
- end
29
-
30
- def initialize(path: '/', fns: {}, hooks: { before: [], after: [] }, templates: {}, group: nil)
31
- @path = path
32
- @fns = fns
33
- @hooks = hooks
34
- @templates = templates
35
- @group = group
36
-
37
- @routes = HTTP_METHODS.inject({}) { |acc, m| acc[m] = []; acc }
38
- @lookup = { routes: {}, grouped: {} }
39
- @handlers = []
40
- end
41
-
42
- # Path for evals within this eval
43
- #
44
- def descendent_path
45
- @descendent_path || @path
46
- end
47
-
48
- def include(route_module)
49
- merge(route_module.route_eval)
50
- end
51
-
52
- def eval(&block)
53
- instance_exec(&block)
54
- end
55
-
56
- # Creates or retreives a named route function.
57
- #
58
- def fn(name, &block)
59
- if block_given?
60
- @fns[name] = block
61
- else
62
- @fns[name]
63
- end
64
- end
65
-
66
- # Creates a handler.
67
- #
68
- def handler(*args, &block)
69
- args = Aargv.normalize(args, name: Symbol, code: Integer, fn: Proc, hooks: Hash)
70
-
71
- fns = []
72
- # add the passed proc
73
- fns << args[:fn] unless args[:fn].nil?
74
- # add passed block to fns
75
- fns << block if block_given?
76
-
77
- # build the final list of fns
78
- fns = build_fns(fns, args[:hooks])
79
-
80
- @handlers.unshift([args[:name], args[:code], fns])
81
- end
82
-
83
- def group(*args, &block)
84
- name, hooks = self.class.parse_group_args(args)
85
-
86
- evaluator = RouteEval.from_scope(self, path: descendent_path, group: name, hooks: hooks)
87
- evaluator.eval(&block)
88
-
89
- merge(evaluator)
90
- end
91
-
92
- def namespace(*args, &block)
93
- path, name, hooks = self.class.parse_namespace_args(args)
94
-
95
- evaluator = RouteEval.from_scope(self, path: File.join(descendent_path, path), group: name, hooks: hooks)
96
- evaluator.eval(&block)
97
-
98
- merge(evaluator)
99
- end
100
-
101
- def template(*args, &block)
102
- args = Aargv.normalize(args, name: Symbol, hooks: Hash)
103
- @templates[args[:name]] = [args[:hooks], block]
104
- end
105
-
106
- def expand(t_name, g_name = nil, *args, &block)
107
- args = Aargv.normalize(args, path: [String, ''], hooks: Hash)
108
- path = args[:path]
109
- hooks = args[:hooks]
110
- template = @templates[t_name]
111
-
112
- evaluator = RouteExpansionEval.from_scope(self, path: File.join(descendent_path, path), group: g_name, hooks: hooks)
113
- evaluator.direct_path = path
114
- evaluator.set_template(g_name, template)
115
- evaluator.eval(&block)
116
-
117
- merge(evaluator)
118
- end
119
-
120
- def default(*args, &block)
121
- build_route(:get, '/', :default, *args, &block)
122
- end
123
-
124
- HTTP_METHODS.each do |method|
125
- define_method method do |*args, &block|
126
- build_route(method, *args, &block)
127
- end
128
- end
129
-
130
- # For the expansion of templates
131
- def method_missing(method, *args, &block)
132
- if template_defined?(method)
133
- expand(method, *args, &block)
134
- else
135
- super
136
- end
137
- end
138
-
139
- def template_defined?(template)
140
- !@templates[template].nil?
141
- end
142
-
143
- protected
144
-
145
- def build_route(method, *args, &block)
146
- args = Aargv.normalize(args, path: String, regex_path: Regexp, name: Symbol, fn: Proc, fns: Array, hooks: Hash)
147
-
148
- path = args[:path] || args[:regex_path]
149
- name = args[:name]
150
-
151
- fns = args[:fns] || []
152
- # add passed fn
153
- fns << args[:fn] unless args[:fn].nil?
154
- # add passed block to fns
155
- fns << block if block_given?
156
-
157
- # merge route hooks with scoped hooks
158
- hooks = merge_hooks(@hooks.dup, args[:hooks] || {})
159
-
160
- # build the final list of fns
161
- fns = build_fns(fns, hooks)
162
-
163
- if path.is_a?(Regexp)
164
- regex = path
165
- vars = []
166
- else
167
- # prepend scope path if we're in a scope
168
- path = File.join(@path, path)
169
- path = String.normalize_path(path)
170
-
171
- # get regex and vars for path
172
- regex, vars = build_route_matcher(path)
173
- end
174
-
175
- register_route([regex, vars, name, fns, path, method])
176
- end
177
-
178
- def register_route(route)
179
- @routes[route[5]] << route
180
-
181
- if group?
182
- bucket = (@lookup[:grouped][@group] ||= {})
183
- else
184
- bucket = @lookup[:routes]
185
- end
186
-
187
- bucket[route[2]] = route
188
- end
189
-
190
- def build_route_matcher(path)
191
- return path, [] if path.is_a?(Regexp)
192
-
193
- # check for vars
194
- return path, [] unless path[0,1] == ':' || path.index('/:')
195
-
196
- # we have vars
197
- vars = []
198
- regex_route = path
199
- route_segments = path.split('/')
200
- route_segments.each_with_index { |segment, i|
201
- if segment.include?(':')
202
- var = segment.gsub(':', '')
203
- vars << { :var => var.to_sym, :url_position => i }
204
- regex_route = regex_route.sub(segment, '(?<' + var + '>(\w|[-.~:@!$\'\(\)\*\+,;])*)')
205
- end
206
- }
207
- reg = Regexp.new("^#{regex_route}$")
208
- return reg, vars
209
- end
210
-
211
- def group?
212
- !@group.nil?
213
- end
214
-
215
- def build_fns(main_fns, hooks)
216
- hooks = normalize_hooks(hooks)
217
- fns = []
218
- fns.concat(hooks[:around]) if hooks && hooks[:around]
219
- fns.concat(hooks[:before]) if hooks && hooks[:before]
220
- fns.concat(main_fns) if main_fns
221
- fns.concat(hooks[:after]) if hooks && hooks[:after]
222
- fns.concat(hooks[:around]) if hooks && hooks[:around]
223
- fns
224
- end
225
-
226
- class << self
227
- def parse_namespace_args(args)
228
- ret = []
229
- args.each { |arg|
230
- if arg.is_a?(Hash) # we have hooks
231
- ret[2] = arg
232
- elsif arg.is_a?(Symbol) # we have a name
233
- ret[1] = arg
234
- elsif !arg.nil? # we have a path
235
- ret[0] = arg
236
- end
237
- }
238
- ret
239
- end
240
-
241
- def parse_group_args(args)
242
- ret = []
243
- args.each { |arg|
244
- if arg.is_a?(Hash) # we have hooks
245
- ret[1] = arg
246
- elsif !arg.nil? # we have a name
247
- ret[0] = arg
248
- end
249
- }
250
- ret
251
- end
252
- end
253
- end
254
- end
@@ -1,115 +0,0 @@
1
- module Pakyow
2
- class RouteExpansionEval < RouteEval
3
- attr_writer :direct_path
4
-
5
- def eval(&block)
6
- @template_eval = RouteTemplateEval.from_scope(self, path: path, group: @group, hooks: @hooks)
7
- @template_eval.direct_path = @direct_path
8
- @template_eval.eval(&@template_block)
9
-
10
- @path = @template_eval.routes_path
11
-
12
- super
13
-
14
- instance_exec(&@template_eval.post_process) if @template_eval.post_process
15
- end
16
-
17
- def set_template(expansion_name, template)
18
- @expansion_name = expansion_name
19
- @template_block = template[1]
20
-
21
- @hooks = merge_hooks(@hooks, template[0])
22
- end
23
-
24
- def action(method, *args, &block)
25
- fn, hooks = self.class.parse_action_args(args)
26
- fn = block if block_given?
27
-
28
- # get route info from template
29
- route = @template_eval.route_for_action(method)
30
-
31
- all_fns = route[3]
32
- all_fns[:fns].unshift(fn) if fn
33
-
34
- hooks = merge_hooks(all_fns[:hooks], hooks)
35
- route[3] = build_fns(all_fns[:fns], hooks)
36
-
37
- register_route(route)
38
- end
39
-
40
- def action_group(*args, &block)
41
- name, hooks = self.class.parse_action_group_args(args)
42
- group = @template_eval.group_named(name)
43
-
44
- hooks = merge_hooks(hooks, group[0])
45
- group(@expansion_name, hooks, &block)
46
- end
47
-
48
- def action_namespace(*args, &block)
49
- name, hooks = self.class.parse_action_namespace_args(args)
50
- namespace = @template_eval.namespace_named(name)
51
-
52
- hooks = merge_hooks(hooks, namespace[1])
53
- namespace(@expansion_name, namespace[0], hooks, &block)
54
- end
55
-
56
- def method_missing(method, *args, &block)
57
- if @template_eval.has_action?(method)
58
- action(method, *args, &block)
59
- elsif @template_eval.has_namespace?(method)
60
- action_namespace(method, *args, &block)
61
- elsif @template_eval.has_group?(method)
62
- action_group(method, *args, &block)
63
- else
64
- super
65
- end
66
- rescue NoMethodError
67
- raise UnknownTemplatePart, "No action, namespace, or group named '#{method}'"
68
- end
69
-
70
- def expand(*args, &block)
71
- args[2] = File.join(@template_eval.nested_path.gsub(@path, ''), args[2])
72
- super(*args, &block)
73
- end
74
-
75
- private
76
-
77
- class << self
78
- def parse_action_args(args)
79
- ret = []
80
- args.each { |arg|
81
- if arg.is_a?(Hash) # we have hooks
82
- ret[1] = arg
83
- elsif arg.is_a?(Proc) # we have a fn
84
- ret[0] = arg
85
- end
86
- }
87
- ret
88
- end
89
-
90
- def parse_action_namespace_args(args)
91
- ret = []
92
- args.each { |arg|
93
- if arg.is_a?(Hash) # we have hooks
94
- ret[1] = arg
95
- elsif arg.is_a?(Symbol) # we have a name
96
- ret[0] = arg
97
- end
98
- }
99
- ret
100
- end
101
-
102
- def parse_action_group_args(args)
103
- ret = []
104
- args.each { |arg|
105
- if arg.is_a?(Hash) # we have hooks
106
- ret[1] = arg
107
- elsif !arg.nil? # we have a name
108
- ret[0] = arg
109
- end
110
- }
111
- ret
112
- end
113
- end
114
- end
115
- end
@@ -1,41 +0,0 @@
1
- module Pakyow
2
-
3
- # Handles looking up paths for named routes and populating
4
- # the path with data.
5
- #
6
- class RouteLookup
7
- include Helpers
8
-
9
- def path(name, data = nil)
10
- route = get_named_route(name)
11
- data ? populate(route, data) : File.join('/', route[4])
12
- end
13
-
14
- def group(name)
15
- @group = name
16
- self
17
- end
18
-
19
- protected
20
-
21
- def get_named_route(name)
22
- if defined? @group
23
- Router.instance.route(name, @group)
24
- else
25
- Router.instance.route(name)
26
- end
27
- end
28
-
29
- def populate(route, data = {})
30
- vars = route[1]
31
-
32
- split_path = Request.split_url(route[4])
33
-
34
- vars.each {|v|
35
- split_path[v[:url_position]] = data.delete(v[:var])
36
- }
37
-
38
- File.join('/', split_path.join('/'))
39
- end
40
- end
41
- end