pancake 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/pancake +96 -0
- data/lib/pancake.rb +5 -7
- data/lib/pancake/configuration.rb +2 -23
- data/lib/pancake/core_ext/object.rb +1 -1
- data/lib/pancake/defaults/configuration.rb +21 -1
- data/lib/pancake/generators.rb +0 -3
- data/lib/pancake/hooks/inheritable_inner_classes.rb +15 -2
- data/lib/pancake/master.rb +34 -1
- data/lib/pancake/mixins/render.rb +1 -2
- data/lib/pancake/mixins/stack_helper.rb +1 -1
- data/lib/pancake/router.rb +18 -63
- data/lib/pancake/stack/configuration.rb +3 -5
- data/lib/pancake/stack/router.rb +10 -33
- data/lib/pancake/stack/stack.rb +70 -50
- data/{spec/helpers → lib/pancake/test}/helpers.rb +3 -3
- data/lib/pancake/test/matchers.rb +20 -0
- data/lib/pancake/vendor/hashie/.document +5 -0
- data/lib/pancake/vendor/hashie/.gitignore +7 -0
- data/lib/pancake/vendor/hashie/Gemfile +11 -0
- data/lib/pancake/vendor/hashie/Gemfile.lock +25 -0
- data/lib/pancake/{generators/templates/short/%stack_name%/LICENSE.tt → vendor/hashie/LICENSE} +1 -1
- data/lib/pancake/vendor/hashie/README.rdoc +101 -0
- data/lib/pancake/{generators/templates/micro/%stack_name%/Rakefile.tt → vendor/hashie/Rakefile} +3 -13
- data/lib/pancake/vendor/hashie/VERSION +1 -0
- data/lib/pancake/vendor/hashie/hashie.gemspec +33 -0
- data/lib/pancake/vendor/hashie/lib/hashie.rb +5 -0
- data/lib/pancake/vendor/hashie/lib/hashie/clash.rb +86 -0
- data/lib/pancake/vendor/hashie/lib/hashie/dash.rb +108 -0
- data/lib/pancake/vendor/hashie/lib/hashie/hash.rb +22 -0
- data/lib/pancake/vendor/hashie/lib/hashie/hash_extensions.rb +49 -0
- data/lib/pancake/vendor/hashie/lib/hashie/mash.rb +148 -0
- data/lib/pancake/vendor/hashie/spec/hashie/clash_spec.rb +42 -0
- data/lib/pancake/vendor/hashie/spec/hashie/dash_spec.rb +103 -0
- data/lib/pancake/vendor/hashie/spec/hashie/hash_spec.rb +22 -0
- data/lib/pancake/vendor/hashie/spec/hashie/mash_spec.rb +135 -0
- data/lib/pancake/vendor/hashie/spec/spec.opts +2 -0
- data/lib/pancake/{generators/templates/short/%stack_name%/spec/spec_helper.rb.tt → vendor/hashie/spec/spec_helper.rb} +7 -7
- data/spec/pancake/configuration_spec.rb +1 -1
- data/spec/pancake/constants_spec.rb +1 -1
- data/spec/pancake/defaults/configuration_spec.rb +1 -1
- data/spec/pancake/hooks/on_inherit_spec.rb +13 -13
- data/spec/pancake/inheritance_spec.rb +22 -22
- data/spec/pancake/middleware_spec.rb +6 -5
- data/spec/pancake/middlewares/logger_spec.rb +1 -1
- data/spec/pancake/middlewares/static_spec.rb +1 -1
- data/spec/pancake/mime_types_spec.rb +1 -1
- data/spec/pancake/mixins/publish_spec.rb +24 -24
- data/spec/pancake/mixins/render/template_spec.rb +1 -1
- data/spec/pancake/mixins/render/view_context_spec.rb +1 -1
- data/spec/pancake/mixins/render_spec.rb +1 -1
- data/spec/pancake/mixins/request_helper_spec.rb +1 -1
- data/spec/pancake/mixins/stack_helper_spec.rb +3 -3
- data/spec/pancake/pancake_spec.rb +1 -1
- data/spec/pancake/paths_spec.rb +30 -30
- data/spec/pancake/stack/router_spec.rb +24 -62
- data/spec/pancake/stack/stack_configuration_spec.rb +1 -1
- data/spec/pancake/stack/stack_spec.rb +47 -4
- data/spec/spec_helper.rb +3 -3
- metadata +56 -128
- data/bin/pancake-gen +0 -30
- data/lib/pancake/bootloaders.rb +0 -187
- data/lib/pancake/generators/base.rb +0 -12
- data/lib/pancake/generators/micro_generator.rb +0 -17
- data/lib/pancake/generators/short_generator.rb +0 -18
- data/lib/pancake/generators/templates/common/dotgitignore +0 -22
- data/lib/pancake/generators/templates/common/dothtaccess +0 -17
- data/lib/pancake/generators/templates/micro/%stack_name%/%stack_name%.rb.tt +0 -8
- data/lib/pancake/generators/templates/micro/%stack_name%/config.ru.tt +0 -12
- data/lib/pancake/generators/templates/micro/%stack_name%/pancake_init.rb.tt +0 -1
- data/lib/pancake/generators/templates/micro/%stack_name%/public/.empty_directory +0 -0
- data/lib/pancake/generators/templates/micro/%stack_name%/tmp/.empty_directory +0 -0
- data/lib/pancake/generators/templates/micro/%stack_name%/views/root.html.haml +0 -1
- data/lib/pancake/generators/templates/short/%stack_name%/README.tt +0 -7
- data/lib/pancake/generators/templates/short/%stack_name%/Rakefile.tt +0 -56
- data/lib/pancake/generators/templates/short/%stack_name%/VERSION.tt +0 -1
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%.rb.tt +0 -12
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/%stack_name%.rb.tt +0 -6
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config.ru.tt +0 -10
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config/config.rb.tt +0 -23
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config/environments/development.rb.tt +0 -15
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config/environments/production.rb.tt +0 -16
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config/environments/staging.rb.tt +0 -17
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/models/.empty_directory +0 -0
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/mounts/.empty_directory +0 -0
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/public/.empty_directory +0 -0
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/tasks/%stack_name%.rake.tt +0 -4
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/tmp/.empty_directory +0 -0
- data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/views/root.html.haml +0 -2
- data/lib/pancake/generators/templates/short/%stack_name%/pancake_init.rb.tt +0 -1
- data/lib/pancake/generators/templates/short/%stack_name%/spec/%stack_name%_spec.rb.tt +0 -11
- data/lib/pancake/stack/app.rb +0 -10
- data/lib/pancake/stack/bootloader.rb +0 -114
- data/lib/pancake/stack/middleware.rb +0 -0
- data/lib/pancake/stacks/short.rb +0 -3
- data/lib/pancake/stacks/short/bootloaders.rb +0 -5
- data/lib/pancake/stacks/short/controller.rb +0 -184
- data/lib/pancake/stacks/short/default/views/base.html.haml +0 -5
- data/lib/pancake/stacks/short/default/views/error.html.haml +0 -12
- data/lib/pancake/stacks/short/stack.rb +0 -207
- data/spec/helpers/matchers.rb +0 -25
- data/spec/pancake/bootloaders_spec.rb +0 -119
- data/spec/pancake/stack/app_spec.rb +0 -28
- data/spec/pancake/stack/bootloader_spec.rb +0 -41
- data/spec/pancake/stack/middleware_spec.rb +0 -0
- data/spec/pancake/stacks/short/controller_spec.rb +0 -442
- data/spec/pancake/stacks/short/middlewares_spec.rb +0 -22
- data/spec/pancake/stacks/short/router_spec.rb +0 -150
- data/spec/pancake/stacks/short/stack_spec.rb +0 -117
@@ -1,16 +0,0 @@
|
|
1
|
-
Pancake.logger.info "Loading Production Environment"
|
2
|
-
|
3
|
-
Pancake.handle_errors!(true) # uncomment to have the stack handle any errors that occur
|
4
|
-
|
5
|
-
class <%= stack_name.camel_case %>
|
6
|
-
# include middleware for the development stack
|
7
|
-
# stack(:middleware_name).use(MiddlewareClass)
|
8
|
-
end
|
9
|
-
|
10
|
-
# Add code to hooks. Default available hooks:
|
11
|
-
# :before_build_stack, :before_mount_applications, :after_initialize_application, :after_build_stack
|
12
|
-
|
13
|
-
# <%= stack_name.camel_case %>.before_build_stack do
|
14
|
-
# # stuff to do
|
15
|
-
# end
|
16
|
-
|
@@ -1,17 +0,0 @@
|
|
1
|
-
Pancake.logger.info "Loading Staging Environment"
|
2
|
-
|
3
|
-
Pancake.handle_errors!(true) # uncomment to have the stack handle any errors that occur
|
4
|
-
|
5
|
-
class <%= stack_name.camel_case %>
|
6
|
-
# include middleware for the development stack
|
7
|
-
# stack(:middleware_name).use(MiddlewareClass)
|
8
|
-
end
|
9
|
-
|
10
|
-
# Add code to hooks. Default available hooks:
|
11
|
-
# :before_build_stack, :before_mount_applications, :after_initialize_application, :after_build_stack
|
12
|
-
|
13
|
-
# <%= stack_name.camel_case %>.before_build_stack do
|
14
|
-
# # stuff to do
|
15
|
-
# end
|
16
|
-
|
17
|
-
|
data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/models/.empty_directory
DELETED
File without changes
|
data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/mounts/.empty_directory
DELETED
File without changes
|
data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/public/.empty_directory
DELETED
File without changes
|
data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/tmp/.empty_directory
DELETED
File without changes
|
@@ -1 +0,0 @@
|
|
1
|
-
require ::File.join(::File.expand_path(::File.dirname(__FILE__)), "lib", "<%= stack_name %>")
|
@@ -1,11 +0,0 @@
|
|
1
|
-
require ::File.expand_path(::File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe "<%= stack_name %>" do
|
4
|
-
def app
|
5
|
-
<%= stack_name %>.stackup
|
6
|
-
end
|
7
|
-
|
8
|
-
it "fails" do
|
9
|
-
fail "hey buddy, you should probably rename this file and start specing for real"
|
10
|
-
end
|
11
|
-
end
|
data/lib/pancake/stack/app.rb
DELETED
@@ -1,114 +0,0 @@
|
|
1
|
-
module Pancake
|
2
|
-
class Stack
|
3
|
-
inheritable_inner_classes :BootLoader
|
4
|
-
|
5
|
-
# The default bootloader is where the stack default bootloaders are stored
|
6
|
-
# These are shared across all bootloaders
|
7
|
-
class BootLoader # :nodoc:
|
8
|
-
extend ::Pancake::BootLoaderMixin
|
9
|
-
end
|
10
|
-
|
11
|
-
end # Stack
|
12
|
-
end # Pancake
|
13
|
-
|
14
|
-
#################### Define the bootloaders here #############################
|
15
|
-
# :level => :init bootloaders only have the stack class available
|
16
|
-
# They do not have :stack available
|
17
|
-
# These are not run directly, but are run from inherited stacks
|
18
|
-
|
19
|
-
Pancake::Stack::BootLoader.add(:load_configuration, :level => :init) do
|
20
|
-
def run!
|
21
|
-
stack_class.paths_for(:config).each{|f| require f.join}
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
Pancake::Stack::BootLoader.add(:load_mounted_inits, :level => :init) do
|
26
|
-
def run!
|
27
|
-
# Mount any stacks this stack may have in it.
|
28
|
-
stack_class.paths_for(:mounts).each{|f| require f.join}
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
Pancake::Stack::BootLoader.add(:before_stack_loads) do
|
33
|
-
def run!
|
34
|
-
stack_class.before_stack_loads.each{|blk| blk.call}
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
Pancake::Stack::BootLoader.add(:load_application, :level => :init) do
|
39
|
-
def run!
|
40
|
-
[:models, :controllers].each do |type|
|
41
|
-
stack_class.paths_for(type).each{|f| require f.join}
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Pancake stacks need to be built with the following options
|
47
|
-
# MyApp::BootLoader.run!({
|
48
|
-
# :stack_class => self.class,
|
49
|
-
# :stack => self,
|
50
|
-
# :app => app,
|
51
|
-
# :app_name => app_name,
|
52
|
-
# })
|
53
|
-
#
|
54
|
-
#
|
55
|
-
|
56
|
-
|
57
|
-
Pancake::Stack::BootLoader.add(:load_routes, :level => :init) do
|
58
|
-
def run!
|
59
|
-
stack_class.paths_for(:router).each{|f| require f.join}
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
Pancake::Stack::BootLoader.add(:before_mount_applicaions) do
|
64
|
-
def run!
|
65
|
-
stack_class.before_mount_applications.each{|blk| blk.call}
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
Pancake::Stack::BootLoader.add(:load_middlewares) do
|
70
|
-
def run!
|
71
|
-
stack_class.paths_for(:middlewares).each{|f| require f.join}
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
Pancake::Stack::BootLoader.add(:mount_applications) do
|
76
|
-
def run!
|
77
|
-
stack_class.router.mount_applications!
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
Pancake::Stack::BootLoader.add(:initialize_application) do
|
82
|
-
def run!
|
83
|
-
config[:app] ||= stack_class.new_app_instance
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
Pancake::Stack::BootLoader.add(:after_initialize_application) do
|
88
|
-
def run!
|
89
|
-
stack_class.after_initialize_application.each{|blk| blk.call}
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
Pancake::Stack::BootLoader.add(:before_build_stack) do
|
94
|
-
def run!
|
95
|
-
stack_class.before_build_stack.each{|blk| blk.call}
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
Pancake::Stack::BootLoader.add(:build_stack) do
|
100
|
-
def run!
|
101
|
-
mwares = stack_class.middlewares
|
102
|
-
app = Pancake::Middleware.build(config[:app], mwares)
|
103
|
-
app_config = Pancake.configuration.configs(config[:app_name])
|
104
|
-
app_config.app = app
|
105
|
-
app_config.stack = stack_class
|
106
|
-
app_config.router.configuration = app_config
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
Pancake::Stack::BootLoader.add(:after_build_stack) do
|
111
|
-
def run!
|
112
|
-
stack_class.after_build_stack.each{|blk| blk.call}
|
113
|
-
end
|
114
|
-
end
|
File without changes
|
data/lib/pancake/stacks/short.rb
DELETED
@@ -1,184 +0,0 @@
|
|
1
|
-
module Pancake
|
2
|
-
module Stacks
|
3
|
-
class Short
|
4
|
-
inheritable_inner_classes :Controller
|
5
|
-
class Controller
|
6
|
-
extend Mixins::Publish
|
7
|
-
include Mixins::Render
|
8
|
-
include Mixins::RequestHelper
|
9
|
-
include Mixins::ResponseHelper
|
10
|
-
include Mixins::StackHelper
|
11
|
-
|
12
|
-
class self::ViewContext
|
13
|
-
include Mixins::RequestHelper
|
14
|
-
include AnyView
|
15
|
-
|
16
|
-
# No way to get the env into the view context... this is not good :(
|
17
|
-
def env
|
18
|
-
_view_context_for.env
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.template(name_or_template, opts = {})
|
22
|
-
opts[:format] ||= content_type
|
23
|
-
super
|
24
|
-
end
|
25
|
-
|
26
|
-
def template(name_or_template, opts={})
|
27
|
-
opts[:format] ||= content_type
|
28
|
-
super
|
29
|
-
end
|
30
|
-
|
31
|
-
def _template_name_for(name, opts = {})
|
32
|
-
opts[:format] ||= :html
|
33
|
-
"#{name}.#{opts[:format]}"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
extlib_inheritable_accessor :_handle_exception
|
38
|
-
|
39
|
-
push_paths(:views, ["app/views", "views"], "**/*")
|
40
|
-
|
41
|
-
DEFAULT_EXCEPTION_HANDLER = lambda do |error|
|
42
|
-
use_layout = env[Router::LAYOUT_KEY]
|
43
|
-
if use_layout
|
44
|
-
layout = env['layout']
|
45
|
-
layout.content = render :error, :error => error
|
46
|
-
layout
|
47
|
-
else
|
48
|
-
render :error, :error => error
|
49
|
-
end
|
50
|
-
end unless defined?(DEFAULT_EXCEPTION_HANDLER)
|
51
|
-
|
52
|
-
# @api private
|
53
|
-
def self.call(env)
|
54
|
-
app = new(env)
|
55
|
-
app.dispatch!
|
56
|
-
end
|
57
|
-
|
58
|
-
def layout
|
59
|
-
env['layout']
|
60
|
-
end
|
61
|
-
|
62
|
-
# @api public
|
63
|
-
attr_accessor :status
|
64
|
-
|
65
|
-
def initialize(env)
|
66
|
-
@env, @request = env, Rack::Request.new(env)
|
67
|
-
@status = 200
|
68
|
-
end
|
69
|
-
|
70
|
-
# Provides access to the request params
|
71
|
-
# @api public
|
72
|
-
def params
|
73
|
-
request.params
|
74
|
-
end
|
75
|
-
|
76
|
-
# Dispatches to an action based on the params["action"] parameter
|
77
|
-
def dispatch!
|
78
|
-
|
79
|
-
params["action"] ||= params[:action]
|
80
|
-
params[:format] ||= params["format"]
|
81
|
-
|
82
|
-
if logger
|
83
|
-
logger.info "Request: #{request.path}"
|
84
|
-
logger.info "Params: #{params.inspect}"
|
85
|
-
end
|
86
|
-
|
87
|
-
# Check that the action is available
|
88
|
-
raise Errors::NotFound, "No Action Found" unless allowed_action?(params["action"])
|
89
|
-
|
90
|
-
@action_opts = actions[params["action"]]
|
91
|
-
|
92
|
-
negotiate_content_type!(@action_opts.formats, params)
|
93
|
-
|
94
|
-
# Setup the layout
|
95
|
-
use_layout = env[Router::LAYOUT_KEY]
|
96
|
-
layout = env['layout']
|
97
|
-
|
98
|
-
# Set the layout defaults before the action is rendered
|
99
|
-
if use_layout && stack_class.default_layout
|
100
|
-
layout.template_name = stack_class.default_layout
|
101
|
-
end
|
102
|
-
layout.format = params['format'] if use_layout
|
103
|
-
|
104
|
-
logger.info "Dispatching to #{params["action"].inspect}" if logger
|
105
|
-
|
106
|
-
result = catch(:halt){ self.send(params['action']) }
|
107
|
-
|
108
|
-
case result
|
109
|
-
when Array
|
110
|
-
result
|
111
|
-
when Rack::Response
|
112
|
-
result.finish
|
113
|
-
when String
|
114
|
-
out = if use_layout
|
115
|
-
layout.content = result
|
116
|
-
layout
|
117
|
-
else
|
118
|
-
result
|
119
|
-
end
|
120
|
-
Rack::Response.new(out, status, headers).finish
|
121
|
-
else
|
122
|
-
Rack::Response.new((result || ""), status, headers).finish
|
123
|
-
end
|
124
|
-
|
125
|
-
rescue Errors::HttpError => e
|
126
|
-
if logger && log_http_error?(e)
|
127
|
-
logger.error "Exception: #{e.message}"
|
128
|
-
logger.error e.backtrace.join("\n")
|
129
|
-
end
|
130
|
-
handle_request_exception(e)
|
131
|
-
rescue Exception => e
|
132
|
-
if Pancake.handle_errors?
|
133
|
-
server_error = Errors::Server.new(e.message)
|
134
|
-
server_error.exceptions << e
|
135
|
-
server_error.set_backtrace e.backtrace
|
136
|
-
else
|
137
|
-
server_error = e
|
138
|
-
end
|
139
|
-
handle_request_exception(server_error)
|
140
|
-
end
|
141
|
-
|
142
|
-
def log_http_error?(error)
|
143
|
-
true
|
144
|
-
end
|
145
|
-
|
146
|
-
def self.handle_exception(&block)
|
147
|
-
if block_given?
|
148
|
-
self._handle_exception = block
|
149
|
-
else
|
150
|
-
self._handle_exception || DEFAULT_EXCEPTION_HANDLER
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
def handle_request_exception(error)
|
155
|
-
raise(error.class, error.message, error.backtrace) unless Pancake.handle_errors?
|
156
|
-
self.status = error.code
|
157
|
-
result = instance_exec error, &self.class.handle_exception
|
158
|
-
Rack::Response.new(result, status, headers).finish
|
159
|
-
end
|
160
|
-
|
161
|
-
private
|
162
|
-
def allowed_action?(action)
|
163
|
-
self.class.actions.include?(action.to_s)
|
164
|
-
end
|
165
|
-
|
166
|
-
public
|
167
|
-
def self.roots
|
168
|
-
stack_class.roots
|
169
|
-
end
|
170
|
-
|
171
|
-
def self._template_name_for(name, opts)
|
172
|
-
opts[:format] ||= :html
|
173
|
-
"#{name}.#{opts[:format]}"
|
174
|
-
end
|
175
|
-
|
176
|
-
def _tempate_name_for(name, opts = {})
|
177
|
-
opts[:format] ||= content_type
|
178
|
-
self.class._template_name_for(name, opts)
|
179
|
-
end
|
180
|
-
end # Controller
|
181
|
-
|
182
|
-
end # Short
|
183
|
-
end # Stacks
|
184
|
-
end # Pancake
|
@@ -1,207 +0,0 @@
|
|
1
|
-
module Pancake
|
2
|
-
module Stacks
|
3
|
-
class Short < Pancake::Stack
|
4
|
-
add_root(__FILE__, "default")
|
5
|
-
|
6
|
-
push_paths(:models,"models", "**/*.rb")
|
7
|
-
|
8
|
-
def self.new_app_instance
|
9
|
-
self::Controller
|
10
|
-
end
|
11
|
-
|
12
|
-
# Marks a method as published.
|
13
|
-
# This is done implicitly when using the get, post, put, delete methods on a Stacks::Short
|
14
|
-
# But can be done explicitly
|
15
|
-
#
|
16
|
-
# @see Pancake::Mixins::Publish#publish
|
17
|
-
# @api public
|
18
|
-
def self.publish(*args)
|
19
|
-
@published = true
|
20
|
-
self::Controller.publish(*args)
|
21
|
-
end
|
22
|
-
|
23
|
-
# @see Pancake::Mixins::Publish#as
|
24
|
-
def self.as(*args)
|
25
|
-
self::Controller.as(*args)
|
26
|
-
end
|
27
|
-
|
28
|
-
# @see Pancake::Mixins::Publish#provides
|
29
|
-
def self.provides(*formats)
|
30
|
-
self::Controller.provides(*formats)
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.handle_exception(*args, &block)
|
34
|
-
self::Controller.handle_exception(*args, &block)
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.helpers(&blk)
|
38
|
-
m = Module.new(&blk)
|
39
|
-
self::Controller.class_eval{ include m }
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.template(*args)
|
43
|
-
self::Controller.template(*args)
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.base_template_name
|
47
|
-
self::Controller.base_template_name
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
# Gets a resource at a given path
|
52
|
-
#
|
53
|
-
# The block should finish with the final result of the action
|
54
|
-
#
|
55
|
-
# @param [String] path - a url path that conforms to Usher match path.
|
56
|
-
# @param block - the contents of the block are executed when the path is matched.
|
57
|
-
#
|
58
|
-
# @example
|
59
|
-
# get "/posts(/:year(/:month(/:date))" do
|
60
|
-
# # do stuff to get posts and render them
|
61
|
-
# end
|
62
|
-
#
|
63
|
-
# @see Usher
|
64
|
-
# @api public
|
65
|
-
# @author Daniel Neighman
|
66
|
-
def self.get(path, opts = {}, &block)
|
67
|
-
define_published_action(:get, path, opts, block)
|
68
|
-
end
|
69
|
-
|
70
|
-
# Posts a resource to a given path
|
71
|
-
#
|
72
|
-
# The block should finish with the final result of the action
|
73
|
-
#
|
74
|
-
# @param [String] path - a url path that conforms to Usher match path.
|
75
|
-
# @param block - the contents of the block are executed when the path is matched.
|
76
|
-
#
|
77
|
-
# @example
|
78
|
-
# post "/posts" do
|
79
|
-
# # do stuff to post /posts and render them
|
80
|
-
# end
|
81
|
-
#
|
82
|
-
# @see Usher
|
83
|
-
# @api public
|
84
|
-
# @author Daniel Neighman
|
85
|
-
def self.post(path, opts = {}, &block)
|
86
|
-
define_published_action(:post, path, opts, block)
|
87
|
-
end
|
88
|
-
|
89
|
-
# Puts a resource to a given path
|
90
|
-
#
|
91
|
-
# The block should finish with the final result of the action
|
92
|
-
#
|
93
|
-
# @param [String] path - a url path that conforms to Usher match path.
|
94
|
-
# @param block - the contents of the block are executed when the path is matched.
|
95
|
-
#
|
96
|
-
# @example
|
97
|
-
# put "/posts" do
|
98
|
-
# # do stuff to post /posts and render them
|
99
|
-
# end
|
100
|
-
#
|
101
|
-
# @see Usher
|
102
|
-
# @api public
|
103
|
-
# @author Daniel Neighman
|
104
|
-
def self.put(path, opts = {}, &block)
|
105
|
-
define_published_action(:put, path, opts, block)
|
106
|
-
end
|
107
|
-
|
108
|
-
# Deletes the resource at a given path
|
109
|
-
#
|
110
|
-
# The block should finish with the final result of the action
|
111
|
-
#
|
112
|
-
# @param [String] path - a url path that conforms to Usher match path.
|
113
|
-
# @param block - the contents of the block are executed when the path is matched.
|
114
|
-
#
|
115
|
-
# @example
|
116
|
-
# delete "/posts/foo-is-post" do
|
117
|
-
# # do stuff to post foo-is-post and render the result
|
118
|
-
# end
|
119
|
-
#
|
120
|
-
# @see Usher
|
121
|
-
# @api public
|
122
|
-
# @author Daniel Neighman
|
123
|
-
def self.delete(path, opts = {}, &block)
|
124
|
-
define_published_action(:delete, path, opts, block)
|
125
|
-
end
|
126
|
-
|
127
|
-
# Matches any method to the route
|
128
|
-
# @api public
|
129
|
-
def self.any(path, opts={}, &block)
|
130
|
-
define_published_action(:any, path, opts, block)
|
131
|
-
end
|
132
|
-
|
133
|
-
private
|
134
|
-
# Defines an action on the inner Controller class of this stack.
|
135
|
-
# Also sets it as published if it's not already published.
|
136
|
-
#
|
137
|
-
# @param [Symbol] method - a smbol specifying the HTTP method
|
138
|
-
# @param [String] path - a string specifying the path to map the url to
|
139
|
-
# @api private
|
140
|
-
# @author Daniel Neighman
|
141
|
-
def self.define_published_action(method, path, opts, block)
|
142
|
-
self::Controller.publish unless @published
|
143
|
-
@published = nil
|
144
|
-
|
145
|
-
action_name = controller_method_name(method,path)
|
146
|
-
attach_action(action_name, block)
|
147
|
-
attach_route(method, path, action_name, opts)
|
148
|
-
end
|
149
|
-
|
150
|
-
# Does the work of actually defining the action on the Controller Class
|
151
|
-
#
|
152
|
-
# @param [String] - the name of the method to create on the Controller class
|
153
|
-
# @api private
|
154
|
-
# @author Daniel Neighman
|
155
|
-
def self.attach_action(method_name, block)
|
156
|
-
self::Controller.class_eval do
|
157
|
-
define_method(method_name, &block)
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
# Supplies the path as a route to the stack router
|
162
|
-
#
|
163
|
-
# @param method [Symbol]
|
164
|
-
#
|
165
|
-
# @example
|
166
|
-
# attach_route(:get, "/foo/bar", "get__foo_bar")
|
167
|
-
#
|
168
|
-
# @api private
|
169
|
-
# @author Daniel Neighman
|
170
|
-
def self.attach_route(method, path, action_name, options)
|
171
|
-
name = options.delete(:_name)
|
172
|
-
options[:conditions] ||= {}
|
173
|
-
options[:conditions][:request_method] = method.to_s.upcase unless method == :any
|
174
|
-
r = router.add(path, options)
|
175
|
-
r.to(:action => action_name)
|
176
|
-
r.name(name) if name
|
177
|
-
r
|
178
|
-
end
|
179
|
-
|
180
|
-
# provides for methods of the following form on Controller
|
181
|
-
# :<method>_<sanitized_path>
|
182
|
-
#
|
183
|
-
# @param [Symbol] method - the HTTP method to look for
|
184
|
-
# @param [String] path - the url path expression to encode into the method name
|
185
|
-
#
|
186
|
-
# @return [String] - The actual controller method name to use for the action
|
187
|
-
#
|
188
|
-
# @api private
|
189
|
-
# @author Daniel Neighman
|
190
|
-
def self.controller_method_name(method, path)
|
191
|
-
"#{method}_#{sanitize_path(path)}"
|
192
|
-
end
|
193
|
-
|
194
|
-
# sanitizes a path so it's able to be used as a method name
|
195
|
-
#
|
196
|
-
# @param [String] path - the path to sanitize
|
197
|
-
#
|
198
|
-
# @return [String] the sanitized version of the path safe to use as a method name
|
199
|
-
# @api private
|
200
|
-
# @author Daniel Neighman
|
201
|
-
def self.sanitize_path(path)
|
202
|
-
path.gsub(/\W/, "_")
|
203
|
-
end
|
204
|
-
|
205
|
-
end # Short
|
206
|
-
end # Stacks
|
207
|
-
end # Pancake
|