pancake 0.1.10 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/Rakefile +5 -1
  2. data/lib/pancake/bootloaders.rb +27 -27
  3. data/lib/pancake/defaults/configuration.rb +2 -1
  4. data/lib/pancake/errors.rb +8 -7
  5. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%.rb.tt +1 -0
  6. data/lib/pancake/generators/templates/short/%stack_name%/spec/%stack_name%_spec.rb.tt +4 -0
  7. data/lib/pancake/generators/templates/short/%stack_name%/spec/spec_helper.rb.tt +5 -1
  8. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%.rb.tt +1 -0
  9. data/lib/pancake/generators/templates/stack/%stack_name%/spec/%stack_name%_spec.rb.tt +4 -0
  10. data/lib/pancake/generators/templates/stack/%stack_name%/spec/spec_helper.rb.tt +5 -1
  11. data/lib/pancake/mixins/render/render.rb +10 -4
  12. data/lib/pancake/mixins/render.rb +37 -7
  13. data/lib/pancake/mixins/request_helper.rb +25 -0
  14. data/lib/pancake/mixins/response_helper.rb +6 -0
  15. data/lib/pancake/router.rb +81 -7
  16. data/lib/pancake/stack/bootloader.rb +40 -10
  17. data/lib/pancake/stack/router.rb +10 -2
  18. data/lib/pancake/stack/stack.rb +34 -1
  19. data/lib/pancake/stacks/short/bootloaders.rb +2 -2
  20. data/lib/pancake/stacks/short/controller.rb +17 -4
  21. data/lib/pancake/test/matchers.rb +39 -0
  22. data/lib/pancake.rb +5 -0
  23. data/spec/pancake/bootloaders_spec.rb +29 -28
  24. data/spec/pancake/defaults/configuration_spec.rb +1 -1
  25. data/spec/pancake/fixtures/render_templates/view_context/_basic.haml +3 -0
  26. data/spec/pancake/fixtures/render_templates/view_context/_basic.html.haml +4 -0
  27. data/spec/pancake/fixtures/render_templates/view_context/_foo_as_name.haml +1 -0
  28. data/spec/pancake/fixtures/render_templates/view_context/_local_as_name.haml +1 -0
  29. data/spec/pancake/fixtures/render_templates/view_context/_with_locals.haml +2 -0
  30. data/spec/pancake/fixtures/render_templates/view_context/collection_with_partial_name.haml +1 -0
  31. data/spec/pancake/fixtures/render_templates/view_context/contains_partial.haml +5 -0
  32. data/spec/pancake/middleware_spec.rb +5 -5
  33. data/spec/pancake/mixins/render/view_context_spec.rb +60 -0
  34. data/spec/pancake/stack/router_spec.rb +52 -13
  35. data/spec/pancake/stacks/short/controller_spec.rb +35 -0
  36. data/spec/pancake/stacks/short/router_spec.rb +4 -2
  37. data/spec/pancake/stacks/short/stack_spec.rb +4 -3
  38. metadata +51 -3
data/Rakefile CHANGED
@@ -11,7 +11,11 @@ begin
11
11
  gem.homepage = "http://github.com/hassox/pancake"
12
12
  gem.authors = ["Daniel Neighman"]
13
13
  gem.add_development_dependency "rspec"
14
- gem.add_dependency "usher", ">=0.5.5"
14
+ gem.add_dependency "usher", ">=0.5.10"
15
+ gem.add_dependency "extlib"
16
+ gem.add_dependency "thor"
17
+ gem.add_dependency "rack"
18
+ gem.add_dependency "tilt", ">=0.3"
15
19
  gem.add_dependency "mynyml-rack-accept-media-types"
16
20
  gem.require_path = 'lib'
17
21
  gem.autorequire = 'pancake'
@@ -5,7 +5,7 @@ module Pancake
5
5
  class Base
6
6
  # :api: :public
7
7
  attr_accessor :config
8
-
8
+
9
9
  # Sets options for the bootloder
10
10
  # By including conditions in the bootloader when you declare it
11
11
  # You can selectively run bootloaders later
@@ -14,38 +14,38 @@ module Pancake
14
14
  @options = opts
15
15
  @options[:level] ||= :default
16
16
  end
17
-
17
+
18
18
  # Provides access to the bootloader options
19
19
  # :api: private
20
20
  def self.options # :nodoc:
21
21
  @options ||= {}
22
22
  end
23
-
23
+
24
24
  def stack
25
25
  raise "No Stack Configured" unless @config[:stack]
26
26
  @config[:stack]
27
27
  end
28
-
28
+
29
29
  def stack_class
30
30
  raise "No Stack Class Configured" unless @config[:stack_class]
31
31
  @config[:stack_class]
32
32
  end
33
-
33
+
34
34
  def initialize(config)
35
35
  @config = config
36
36
  end
37
-
37
+
38
38
  # Creates a new instance and runs it
39
39
  # :api: private
40
40
  def self.call(config)
41
41
  new(config).run!
42
42
  end
43
-
43
+
44
44
  # Checks the conditions with the options of the bootloader
45
45
  # To see if this one should be run
46
46
  # Only the central bootloaders with the conditions will be checked
47
47
  # :api: private
48
- def self.run?(conditions = {})
48
+ def self.run?(conditions = {})
49
49
  opts = options
50
50
  if conditions.keys.include?(:only)
51
51
  return conditions[:only].all?{|k,v| opts[k] == v}
@@ -56,7 +56,7 @@ module Pancake
56
56
  true
57
57
  end
58
58
  end
59
-
59
+
60
60
  def self.extended(base)
61
61
  base.class_eval do
62
62
  class_inheritable_reader :_bootloaders, :_central_bootloaders, :_bootloader_map
@@ -64,14 +64,14 @@ module Pancake
64
64
  @_bootloader_map = Hash.new{|h,k| h[k] = {:before => [], :after => []}}
65
65
  end
66
66
  end
67
-
67
+
68
68
  # Provides access to an individual bootloader
69
69
  # :api: public
70
70
  def [](name)
71
71
  _bootloaders[name]
72
72
  end
73
-
74
- # Add a bootloader. Inside the block we're inside a class definition.
73
+
74
+ # Add a bootloader. Inside the block we're inside a class definition.
75
75
  # Requirements: define a +run!+ method
76
76
  #
77
77
  # Example
@@ -80,19 +80,19 @@ module Pancake
80
80
  # # stuff
81
81
  # end
82
82
  # end
83
- #
83
+ #
84
84
  # :api: public
85
85
  def add(name, opts = {}, &block)
86
86
  _bootloaders[name] = Class.new(Pancake::BootLoaderMixin::Base, &block)
87
87
  raise "You must declare a #run! method on your bootloader" unless _bootloaders[name].method_defined?(:run!)
88
88
  before = opts[:before]
89
89
  after = opts[:after]
90
-
90
+
91
91
  if opts[:level]
92
92
  levels << opts[:level]
93
93
  levels.uniq!
94
94
  end
95
-
95
+
96
96
  # If there are no before or after keys, add it to the central bootloaders
97
97
  if before
98
98
  _bootloader_map[before][:before] << name
@@ -103,10 +103,10 @@ module Pancake
103
103
  end
104
104
  _bootloaders[name].options = opts
105
105
  _bootloaders[name]
106
- end
107
-
106
+ end
107
+
108
108
  # Runs the bootloaders in order
109
- # :api: private
109
+ # :api: private
110
110
  def run!(options = {}) # :nodoc:
111
111
  unless options.keys.include?(:only) || options.keys.include?(:except)
112
112
  options[:only] = {:level => :default}
@@ -122,19 +122,19 @@ module Pancake
122
122
  bl.call(options)
123
123
  end
124
124
  end
125
-
125
+
126
126
  # Set the stack that this bootloader is responsible for.
127
127
  # :api: private
128
128
  def stack=(stack) # :nodoc:
129
129
  @stack = stack
130
130
  end
131
-
131
+
132
132
  # Access to the stack that this bootloader is responsible for
133
133
  # :api: public
134
134
  def stack
135
135
  @stack ||= Object.full_const_get(self.name.split("::")[0..-2].join("::"))
136
136
  end
137
-
137
+
138
138
  # Resets the bootloaders on the stack
139
139
  # :api: public
140
140
  def reset!
@@ -142,21 +142,21 @@ module Pancake
142
142
  _bootloaders.clear
143
143
  _bootloader_map.clear
144
144
  end
145
-
145
+
146
146
  # Yields each bootloader in order along with it's name
147
- #
147
+ #
148
148
  # Example
149
149
  # FooStack::BootLoader.each do |name, bootloader|
150
150
  # # do stuff
151
151
  # end
152
- #
152
+ #
153
153
  # :api: public
154
154
  def each(conditions = {})
155
155
  _map_bootloaders(_central_bootloaders, conditions).each do |n|
156
156
  yield n, _bootloaders[n]
157
157
  end
158
158
  end
159
-
159
+
160
160
  private
161
161
  # Map out the bootloaders by name to run.
162
162
  # :api: private
@@ -171,10 +171,10 @@ module Pancake
171
171
  end
172
172
  end.flatten.compact
173
173
  end
174
-
174
+
175
175
  def levels
176
176
  @levels ||= [:default]
177
177
  end
178
178
 
179
179
  end # BootLoaders
180
- end # Pancake
180
+ end # Pancake
@@ -10,7 +10,8 @@ class Pancake::PancakeConfig
10
10
  if Pancake.configuration.log_to_file
11
11
  log_dir = File.expand_path(File.join(Pancake.root, File.dirname(log_path)))
12
12
  FileUtils.mkdir_p(log_dir)
13
- File.join(log_dir, File.basename(log_path))
13
+ log = File.join(log_dir, File.basename(log_path))
14
+ File.open(log, (File::WRONLY | File::APPEND | File::CREAT))
14
15
  else
15
16
  STDOUT
16
17
  end
@@ -6,10 +6,11 @@ module Pancake
6
6
  def name; self.class.name; end
7
7
 
8
8
  def code; self.class.code; end
9
+ alias_method :status, :code
9
10
 
10
11
  def description; self.class.description; end
11
12
  end
12
-
13
+
13
14
  class NotFound < HttpError
14
15
  self.name = "Not Found"
15
16
  self.code = 404
@@ -19,17 +20,17 @@ module Pancake
19
20
  class UnknownRouter < NotFound
20
21
  self.description = "The router could not be found"
21
22
  end
22
-
23
+
23
24
  class UnknownConfiguration < NotFound
24
25
  self.description = "The configuration could not be found"
25
26
  end
26
-
27
+
27
28
  class Unauthorized < HttpError
28
29
  self.name = "Unauthorized"
29
30
  self.code = 401
30
31
  self.description = "Authentication is required to access this resource."
31
32
  end
32
-
33
+
33
34
  class Forbidden < HttpError
34
35
  self.name = "Forbidden"
35
36
  self.code = 403
@@ -54,8 +55,8 @@ module Pancake
54
55
  self.code = 406
55
56
  self.description = "The requeseted format could not be provided"
56
57
  end
57
-
58
-
59
-
58
+
59
+
60
+
60
61
  end
61
62
  end
@@ -1,5 +1,6 @@
1
1
  class <%= stack_name.camel_case %> < Pancake::Stacks::Short
2
2
  add_root(__FILE__, "<%= stack_name %>")
3
+ initialize_stack
3
4
  end
4
5
 
5
6
  require ::File.join(Pancake.get_root(__FILE__, "<%= stack_name %>"), "<%= stack_name %>")
@@ -1,6 +1,10 @@
1
1
  require ::File.expand_path(::File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "<%= stack_name %>" do
4
+ def app
5
+ <%= stack_name %>.stackup
6
+ end
7
+
4
8
  it "fails" do
5
9
  fail "hey buddy, you should probably rename this file and start specing for real"
6
10
  end
@@ -1,9 +1,13 @@
1
1
  require 'spec'
2
+ require 'rack/test'
3
+ require 'pancake'
4
+
2
5
 
3
6
  $LOAD_PATH.unshift(File.dirname(__FILE__))
4
7
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
8
  require '<%= stack_name -%>'
6
9
 
7
10
  Spec::Runner.configure do |config|
8
-
11
+ config.include(Rack::Test::Methods)
12
+ config.include(Pancake::Test::Matchers)
9
13
  end
@@ -1,3 +1,4 @@
1
1
  class <%= stack_name.camel_case %> < Pancake::Stack
2
2
  add_root __FILE__, "<%= stack_name %>"
3
+ initialize_stack
3
4
  end
@@ -1,6 +1,10 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "<%= stack_name %>" do
4
+ def app
5
+ <%= stack_name %>.stackup
6
+ end
7
+
4
8
  it "fails" do
5
9
  fail "hey buddy, you should probably rename this file and start specing for real"
6
10
  end
@@ -1,9 +1,13 @@
1
1
  require 'spec'
2
+ require 'rack/test'
3
+ require 'pancake'
4
+
2
5
 
3
6
  $LOAD_PATH.unshift(File.dirname(__FILE__))
4
7
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
8
  require '<%= stack_name -%>'
6
9
 
7
10
  Spec::Runner.configure do |config|
8
-
11
+ config.include(Rack::Test::Methods)
12
+ config.include(Pancake::Test::Matchers)
9
13
  end
@@ -32,10 +32,12 @@ module Pancake
32
32
  end
33
33
  end
34
34
 
35
- _capture_methods[Tilt::HamlTemplate] = :_haml_capture
36
- _capture_methods[Tilt::ERBTemplate ] = :_erb_capture
37
- _concat_methods[ Tilt::HamlTemplate] = :_haml_concat
38
- _concat_methods[ Tilt::ERBTemplate ] = :_erb_concat
35
+ _capture_methods[Tilt::HamlTemplate ] = :_haml_capture
36
+ _capture_methods[Tilt::ERBTemplate ] = :_erb_capture
37
+ _capture_methods[Tilt::ErubisTemplate ] = :_erb_capture
38
+ _concat_methods[ Tilt::HamlTemplate ] = :_haml_concat
39
+ _concat_methods[ Tilt::ERBTemplate ] = :_erb_concat
40
+ _concat_methods[ Tilt::ErubisTemplate ] = :_erb_concat
39
41
 
40
42
  module Renderer
41
43
  def render(template, opts = {})
@@ -55,6 +57,10 @@ module Pancake
55
57
  result
56
58
  end
57
59
 
60
+ def partial(*args)
61
+ _view_context_for.partial(*args)
62
+ end
63
+
58
64
  def _with_renderer(renderer)
59
65
  orig_renderer = @_current_renderer
60
66
  @_current_renderer = renderer
@@ -66,22 +66,47 @@ module Pancake
66
66
 
67
67
  module InstanceMethods
68
68
  def render(*args)
69
- opts = Hash === args.last ? args.pop : {}
70
- name = args.shift
71
-
69
+ opts = Hash === args.last ? args.pop : {}
70
+ name = args.shift
71
+ template_name = _template_name_for(name, opts)
72
72
  return opts[:text] if opts[:text]
73
73
 
74
- # Get the template name to use
75
- template = _template_name_for(name, opts)
76
-
77
74
  # Get the view context for the tempalte
78
- template, vc_class = self.class._renderer_and_view_context_class_for(template)
75
+ template, vc_class = self.class._renderer_and_view_context_class_for(template_name)
79
76
 
80
77
  view_context = vc_class.new(env, self)
81
78
  view_context_before_render(view_context)
82
79
  view_context.render(template, opts)
83
80
  end
84
81
 
82
+ def partial(*args)
83
+ opts = Hash === args.last ? args.pop : {}
84
+ opts = opts.dup
85
+ name = args.shift
86
+ with = opts.delete(:with)
87
+ as = opts.delete(:as)
88
+
89
+ partial_name = _partial_template_name_for(name, opts)
90
+ # Get the view context for the tempalte
91
+ template, vc_class = self.class._renderer_and_view_context_class_for(partial_name)
92
+
93
+ view_context = vc_class.new(env, self)
94
+ view_context_before_render(view_context)
95
+
96
+ out = ""
97
+ case with
98
+ when Array
99
+ with.each do |item|
100
+ as.nil? ? (opts[name] = item) : (opts[as] = item)
101
+ out << view_context.render(template, opts)
102
+ end
103
+ else
104
+ as.nil? ? (opts[name] = with) : (opts[as] = with)
105
+ out << view_context.render(template, opts)
106
+ end
107
+ out
108
+ end
109
+
85
110
  def template(name_or_template)
86
111
  case name_or_template
87
112
  when String, Symbol
@@ -93,6 +118,7 @@ module Pancake
93
118
  end
94
119
  end
95
120
 
121
+
96
122
  # A place holder method for any implementor that wants
97
123
  # to configure the view context prior to rendering occuring
98
124
  # any time this method is overwritten, it should call super!
@@ -106,6 +132,10 @@ module Pancake
106
132
  opts[:format] ||= params[:format] || :html
107
133
  "#{name}.#{opts[:format]}"
108
134
  end
135
+
136
+ def _partial_template_name_for(name, opts)
137
+ "_#{_template_name_for(name, opts)}"
138
+ end
109
139
  end # InstanceMethods
110
140
  end # Render
111
141
  end # Mixins
@@ -41,6 +41,31 @@ module Pancake
41
41
  konfig.router.generate(name, opts)
42
42
  end
43
43
 
44
+ # Generate the base url for the router that got you to this point.
45
+ #
46
+ # @example
47
+ # class MyApp
48
+ # router do |r|
49
+ # r.mount(SomeApp, "/some_app/:version")
50
+ # end
51
+ #
52
+ # include Pancake::RequestHelper
53
+ # def call(env)
54
+ # @env = env
55
+ # base_url(:version => "1.0" #=> "/some_app/1.0
56
+ # end
57
+ # end
58
+ #
59
+ # @see Usher
60
+ # @see Pancake::Router.base_url_for
61
+ # @see Pancake::Router#base_url
62
+ # @api public
63
+ # @author Daniel Neighman
64
+ def base_url(opts={})
65
+ konfig = request.env[Pancake::Router::CONFIGURATION_KEY]
66
+ konfig.router.base_url(opts)
67
+ end
68
+
44
69
  # Generate a url for any registered configuration with a router
45
70
  #
46
71
  # @example
@@ -12,6 +12,12 @@ module Pancake
12
12
  def status=(st)
13
13
  @status = st
14
14
  end
15
+
16
+ def redirect(location, status = 302)
17
+ r = Rack::Response.new
18
+ r.redirect(location, status)
19
+ r
20
+ end
15
21
  end
16
22
  end
17
23
  end
@@ -21,6 +21,16 @@ module Pancake
21
21
  the_router.url(name_or_opts, opts)
22
22
  end
23
23
 
24
+ def self.base_url_for(app_name, opts={})
25
+ config = Pancake.configuration.configs(app_name)
26
+ the_router = if config && config.router
27
+ config.router
28
+ elsif app_name.respond_to?(:router)
29
+ raise Pancake::Errors::UnknownRouter
30
+ end
31
+ the_router.base_url(opts)
32
+ end
33
+
24
34
  # The pancake router is a customized version of the Usher router.
25
35
  # Usher is a fast tree based router that can generate routes, have
26
36
  # nested routers, and even generate from nested routers.
@@ -28,21 +38,78 @@ module Pancake
28
38
  # @since 0.1.2
29
39
  # @author Daniel Neighman
30
40
  class Router < Usher::Interface::RackInterface
41
+ attr_writer :router
42
+
31
43
  CONFIGURATION_KEY = "pancake.request.configuration".freeze
44
+ ROUTE_KEY = "pancake.request.matching_route".freeze
32
45
 
33
46
  class RackApplicationExpected < ArgumentError; end
34
47
  attr_accessor :configuration
48
+ class_inheritable_accessor :mounted_applications
49
+ self.mounted_applications = []
50
+
51
+ class MountedApplication
52
+ attr_accessor :mounted_app, :mount_path, :args, :stackup_with, :options,:mounted
53
+ def initialize(mounted_app, mount_path, opts = {})
54
+ @mounted_app, @mount_path = mounted_app, mount_path
55
+ @stackup_with = opts.delete(:_stackup) || :stackup
56
+ @args = opts.delete(:_args) || []
57
+ @exact_match = opts.delete(:_exact_match) || false
58
+ @options = opts
59
+ end
60
+
61
+ def name(name = nil)
62
+ unless name.nil?
63
+ @name = name
64
+ end
65
+ @name
66
+ end
67
+
68
+ def mounted?
69
+ !!@mounted
70
+ end
71
+
72
+ def exact_match?
73
+ !!@exact_match
74
+ end
75
+
76
+ def mount!(route)
77
+ app = nil
78
+ route.consuming = true
79
+ route.match_partially! unless exact_match?
80
+ if mounted_app.respond_to?(stackup_with)
81
+ app = mounted_app.send(stackup_with, *args)
82
+ else
83
+ app = mounted_app
84
+ end
85
+ route.to(app)
86
+ route.name(@name) if @name
87
+ route
88
+ end
89
+ end
90
+
35
91
 
36
92
  # Mounts an application in the router as a sub application in the
37
93
  # url space. This will route directly to the sub application and
38
- # skip any middlewares etc.
94
+ # skip any middlewares etc defined on a stack
39
95
  def mount(mounted_app, path, options = {})
40
- raise RackApplicationExpected unless mounted_app.respond_to?(:call)
41
- exact_match = options.delete(:_exact)
42
- route = add(path, options)
43
- route.consuming = true
44
- route.match_partially! unless exact_match
45
- route.to(mounted_app)
96
+ mounted_app = MountedApplication.new(mounted_app, path, options)
97
+ self.class.mounted_applications << mounted_app
98
+ mounted_app
99
+ end
100
+
101
+ def mount_applications!
102
+ # need to set them as mounted here before we actually to mount them.
103
+ # if we just mounted them, the inheritance of the routes would mean that only the first would be mounted on this class
104
+ # and the rest would be mounted on the child class
105
+ apps = self.class.mounted_applications.select do |a|
106
+ a.mounted? ? false : (a.mounted = true)
107
+ end
108
+
109
+ apps.each do |app|
110
+ route = add(app.mount_path, app.options)
111
+ app.mount!(route)
112
+ end
46
113
  end
47
114
 
48
115
  # Adds a route to the router.
@@ -67,12 +134,18 @@ module Pancake
67
134
  generate(name, options)
68
135
  end
69
136
 
137
+ def base_url(opts = {})
138
+ router.generator.generate_base_url(opts)
139
+ end
140
+
70
141
  def call(env)
71
142
  orig_config = env[CONFIGURATION_KEY]
143
+ orig_route = env[ROUTE_KEY]
72
144
  env[CONFIGURATION_KEY] = configuration
73
145
  super(env)
74
146
  ensure
75
147
  env[CONFIGURATION_KEY] = orig_config
148
+ env[ROUTE_KEY] = orig_route
76
149
  end
77
150
 
78
151
  private
@@ -94,6 +167,7 @@ module Pancake
94
167
  super
95
168
  consume_path!(request, response) if !response.partial_match? && response.path.route.consuming
96
169
  request.params.merge!(request.env['usher.params']) unless request.env['usher.params'].empty?
170
+ request.env[ROUTE_KEY] = response.path.route
97
171
  end
98
172
  end
99
173
  end
@@ -15,7 +15,7 @@ end # Pancake
15
15
  # :level => :init bootloaders only have the stack class available
16
16
  # They do not have :stack available
17
17
  # These are not run directly, but are run from inherited stacks
18
- Pancake::Stack::BootLoader.add(:mount_applications, :level => :init) do
18
+ Pancake::Stack::BootLoader.add(:load_mounted_inits, :level => :init) do
19
19
  def run!
20
20
  # Mount any stacks this stack may have in it.
21
21
  stack_class.roots.each do |root|
@@ -42,15 +42,6 @@ Pancake::Stack::BootLoader.add(:load_application, :level => :init) do
42
42
  end
43
43
  end
44
44
 
45
- Pancake::Stack::BootLoader.add(:load_routes, :level => :init) do
46
- def run!
47
- stack_class.roots.each do |root|
48
- stack_class.paths_for(:router).each{|f| require f.join}
49
- end
50
- end
51
- end
52
-
53
- ###### -================== Stack Building BootLoaders
54
45
  # Pancake stacks need to be built with the following options
55
46
  # MyApp::BootLoader.run!({
56
47
  # :stack_class => self.class,
@@ -61,12 +52,45 @@ end
61
52
  #
62
53
  #
63
54
 
55
+
56
+ Pancake::Stack::BootLoader.add(:load_routes) do
57
+ def run!
58
+ stack_class.roots.each do |root|
59
+ stack_class.paths_for(:router).each{|f| require f.join}
60
+ end
61
+ end
62
+ end
63
+
64
+ Pancake::Stack::BootLoader.add(:before_mount_applicaions) do
65
+ def run!
66
+ stack_class.before_mount_applications.each{|blk| blk.call}
67
+ end
68
+ end
69
+
70
+ Pancake::Stack::BootLoader.add(:mount_applications) do
71
+ def run!
72
+ stack_class.router.mount_applications!
73
+ end
74
+ end
75
+
64
76
  Pancake::Stack::BootLoader.add(:initialize_application) do
65
77
  def run!
66
78
  config[:app] ||= stack_class.new_app_instance
67
79
  end
68
80
  end
69
81
 
82
+ Pancake::Stack::BootLoader.add(:after_initialize_application) do
83
+ def run!
84
+ stack_class.after_initialize_application.each{|blk| blk.call}
85
+ end
86
+ end
87
+
88
+ Pancake::Stack::BootLoader.add(:before_build_stack) do
89
+ def run!
90
+ stack_class.before_build_stack.each{|blk| blk.call}
91
+ end
92
+ end
93
+
70
94
  Pancake::Stack::BootLoader.add(:build_stack) do
71
95
  def run!
72
96
  mwares = stack_class.middlewares(Pancake.stack_labels)
@@ -77,3 +101,9 @@ Pancake::Stack::BootLoader.add(:build_stack) do
77
101
  app_config.router.configuration = app_config
78
102
  end
79
103
  end
104
+
105
+ Pancake::Stack::BootLoader.add(:after_build_stack) do
106
+ def run!
107
+ stack_class.after_build_stack.each{|blk| blk.call}
108
+ end
109
+ end