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,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,8 +0,0 @@
1
- require 'find'
2
- require 'rack'
3
- require 'rack/file'
4
- require 'logger'
5
- require 'cgi'
6
-
7
- require 'pakyow/support'
8
- require 'pakyow/core/base'
@@ -1 +0,0 @@
1
- require 'pakyow/core'