racket-mvc 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/Rakefile +7 -0
- data/lib/racket.rb +18 -19
- data/lib/racket/application.rb +47 -36
- data/lib/racket/controller.rb +105 -59
- data/lib/racket/current.rb +22 -20
- data/lib/racket/helpers/routing.rb +48 -0
- data/lib/racket/helpers/view.rb +35 -0
- data/lib/racket/request.rb +17 -19
- data/lib/racket/response.rb +17 -19
- data/lib/racket/router.rb +45 -46
- data/lib/racket/session.rb +19 -21
- data/lib/racket/utils.rb +24 -20
- data/lib/racket/version.rb +18 -20
- data/lib/racket/view_cache.rb +21 -24
- data/spec/_custom.rb +12 -1
- data/spec/_default.rb +1 -1
- data/spec/test_custom_app/controllers/sub2/custom_sub_controller_2.rb +2 -0
- data/spec/test_custom_app/controllers/sub3/custom_sub_controller_3.rb +14 -0
- data/spec/test_custom_app/files/secret.erb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa507274155a8638944da1b19957b0423499a3aa
|
4
|
+
data.tar.gz: 54631b41e9a2ec392b7bb41fd23a87c93ea1df02
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1e402abcbadc38764b851c7b014e39493692b71247f0db412d75d063b5c844c9048c2faa2dc695f37cb53ee9809d8386a2cae994d0b76afa10952f0889af03e
|
7
|
+
data.tar.gz: 65c154fb5ecdb60e364500614f7f7eb1346d3054a1923ec092a0cf52c874a16b150cd383d2aca07cd0ad9dd8455a4500bdde53a24e26b87601f80f946d8bfe29
|
data/README.md
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# Racket - The noisy Rack MVC framework
|
2
2
|
|
3
|
-
[](https://travis-ci.org/lasso/racket) [](https://codecov.io/github/lasso/racket?branch=master)
|
4
|
-
|
3
|
+
[](https://travis-ci.org/lasso/racket) [](https://codecov.io/github/lasso/racket?branch=master) [](http://badge.fury.io/rb/racket-mvc)
|
5
4
|
|
6
5
|
## Say what?
|
7
6
|
Yes. It is yet another framework built on rack. Using MVC. Doing silly stuff while you look the other way.
|
data/Rakefile
CHANGED
data/lib/racket.rb
CHANGED
@@ -1,22 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
20
18
|
|
21
19
|
require 'pathname'
|
22
20
|
require 'rack'
|
@@ -31,6 +29,7 @@ require_relative 'racket/session.rb'
|
|
31
29
|
require_relative 'racket/view_cache.rb'
|
32
30
|
require_relative 'racket/utils.rb'
|
33
31
|
|
32
|
+
# Racket main namespace
|
34
33
|
module Racket
|
35
34
|
# Requires a file using the current application directory as a base path.
|
36
35
|
#
|
data/lib/racket/application.rb
CHANGED
@@ -1,29 +1,26 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
20
18
|
|
21
19
|
require 'logger'
|
22
20
|
|
23
21
|
module Racket
|
24
22
|
# Racket main application class.
|
25
23
|
class Application
|
26
|
-
|
27
24
|
@options = nil
|
28
25
|
|
29
26
|
# Returns the internal application object. When called for the first time this method will use
|
@@ -32,13 +29,16 @@ module Racket
|
|
32
29
|
# @return [Rack::Builder]
|
33
30
|
def self.application
|
34
31
|
return @application if @application
|
32
|
+
@options[:middleware].unshift(@options[:session_handler]) if @options[:session_handler]
|
33
|
+
@options[:middleware].unshift([Rack::ContentType, @options[:default_content_type]]) if
|
34
|
+
@options[:default_content_type]
|
35
35
|
@options[:middleware].unshift([Rack::ShowExceptions]) if dev_mode?
|
36
36
|
instance = self
|
37
37
|
@application = Rack::Builder.new do
|
38
38
|
instance.options[:middleware].each do |middleware|
|
39
39
|
klass, opts = middleware
|
40
|
-
instance.inform_dev("Loading middleware #{klass} with options #{opts}.")
|
41
|
-
use
|
40
|
+
instance.inform_dev("Loading middleware #{klass} with options #{opts.inspect}.")
|
41
|
+
use(*middleware)
|
42
42
|
end
|
43
43
|
run lambda { |env|
|
44
44
|
static_result = instance.serve_static_file(env)
|
@@ -64,23 +64,25 @@ module Racket
|
|
64
64
|
{
|
65
65
|
controller_dir: Utils.build_path(root_dir, 'controllers'),
|
66
66
|
default_action: :index,
|
67
|
+
default_content_type: 'text/html',
|
68
|
+
default_controller_helpers: [:routing, :view],
|
67
69
|
default_layout: '_default.*',
|
68
70
|
default_view: nil,
|
71
|
+
helper_dir: Utils.build_path(root_dir, 'helpers'),
|
69
72
|
layout_dir: Utils.build_path(root_dir, 'layouts'),
|
70
73
|
logger: Logger.new($stdout),
|
71
|
-
middleware: [
|
72
|
-
[
|
73
|
-
Rack::Session::Cookie,
|
74
|
-
{
|
75
|
-
key: 'racket.session',
|
76
|
-
old_secret: SecureRandom.hex(16),
|
77
|
-
secret: SecureRandom.hex(16)
|
78
|
-
}
|
79
|
-
]
|
80
|
-
],
|
74
|
+
middleware: [],
|
81
75
|
mode: :live,
|
82
76
|
public_dir: Utils.build_path(root_dir, 'public'),
|
83
77
|
root_dir: root_dir,
|
78
|
+
session_handler: [
|
79
|
+
Rack::Session::Cookie,
|
80
|
+
{
|
81
|
+
key: 'racket.session',
|
82
|
+
old_secret: SecureRandom.hex(16),
|
83
|
+
secret: SecureRandom.hex(16)
|
84
|
+
}
|
85
|
+
],
|
84
86
|
view_dir: Utils.build_path(root_dir, 'views')
|
85
87
|
}
|
86
88
|
end
|
@@ -110,6 +112,15 @@ module Racket
|
|
110
112
|
init({}, reboot)
|
111
113
|
end
|
112
114
|
|
115
|
+
# Expands all paths defined in the application, but only if it is set to something usable.
|
116
|
+
#
|
117
|
+
# @return [nil]
|
118
|
+
def self.expand_paths
|
119
|
+
[:controller_dir, :helper_dir, :layout_dir, :public_dir, :view_dir].each do |dir|
|
120
|
+
@options[dir] = Utils.build_path(@options[dir]) if @options[dir]
|
121
|
+
end && nil
|
122
|
+
end
|
123
|
+
|
113
124
|
# Writes a message to the logger if there is one present.
|
114
125
|
#
|
115
126
|
# @param [String] message
|
@@ -146,6 +157,7 @@ module Racket
|
|
146
157
|
instance_variables.each { |ivar| instance_variable_set(ivar, nil) } if reboot
|
147
158
|
fail 'Application has already been initialized!' if @options
|
148
159
|
@options = default_options.merge(options)
|
160
|
+
expand_paths
|
149
161
|
setup_static_server
|
150
162
|
reload
|
151
163
|
self
|
@@ -159,8 +171,7 @@ module Racket
|
|
159
171
|
@options[:last_added_controller] = []
|
160
172
|
@controller = nil
|
161
173
|
Dir.chdir(@options[:controller_dir]) do
|
162
|
-
files = Pathname.glob(File.join('**', '*.rb'))
|
163
|
-
files.map! { |file| file.to_s }
|
174
|
+
files = Pathname.glob(File.join('**', '*.rb')).map!(&:to_s)
|
164
175
|
# Sort by longest path so that the longer paths gets matched first
|
165
176
|
# HttpRouter claims to be doing this already, but this "hack" is needed in order
|
166
177
|
# for the router to work.
|
@@ -252,7 +263,7 @@ module Racket
|
|
252
263
|
@view_cache ||= ViewCache.new(@options[:layout_dir], @options[:view_dir])
|
253
264
|
end
|
254
265
|
|
255
|
-
private_class_method
|
256
|
-
|
266
|
+
private_class_method :application, :default_options, :expand_paths, :inform, :init,
|
267
|
+
:load_controllers, :setup_routes, :setup_static_server
|
257
268
|
end
|
258
269
|
end
|
data/lib/racket/controller.rb
CHANGED
@@ -1,27 +1,52 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
20
18
|
|
21
19
|
module Racket
|
22
|
-
|
23
20
|
# Base controller class. Your controllers should inherit this class.
|
24
21
|
class Controller
|
22
|
+
def self.__load_helpers(helpers)
|
23
|
+
helper_dir = Application.options.fetch(:helper_dir, nil)
|
24
|
+
helper_modules = {}
|
25
|
+
helpers.each do |helper|
|
26
|
+
helper_module = helper.to_s.split('_').collect(&:capitalize).join.to_sym
|
27
|
+
begin
|
28
|
+
begin
|
29
|
+
require "racket/helpers/#{helper}"
|
30
|
+
rescue LoadError
|
31
|
+
if helper_dir
|
32
|
+
begin
|
33
|
+
require Utils.build_path(helper_dir, helper)
|
34
|
+
rescue LoadError
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
helper_modules[helper] = Racket::Helpers.const_get(helper_module)
|
39
|
+
Application.inform_dev("Added helper module #{helper.inspect} to class #{self}.")
|
40
|
+
rescue NameError
|
41
|
+
Application.inform_dev(
|
42
|
+
"Failed to add helper module #{helper.inspect} to class #{self}.", :warn
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
helper_modules
|
47
|
+
end
|
48
|
+
|
49
|
+
private_class_method :__load_helpers
|
25
50
|
|
26
51
|
# Adds a hook to one or more actions.
|
27
52
|
#
|
@@ -32,7 +57,7 @@ module Racket
|
|
32
57
|
def self.__register_hook(type, methods, blk)
|
33
58
|
key = "#{type}_hooks".to_sym
|
34
59
|
meths = public_instance_methods(false)
|
35
|
-
meths
|
60
|
+
meths &= methods.map(&:to_sym) unless methods.empty?
|
36
61
|
hooks = get_option(key) || {}
|
37
62
|
meths.each { |meth| hooks[meth] = blk }
|
38
63
|
set_option(key, hooks)
|
@@ -59,6 +84,30 @@ module Racket
|
|
59
84
|
__register_hook(:before, methods, blk) if block_given?
|
60
85
|
end
|
61
86
|
|
87
|
+
# Adds one or more helpers to the controller. All controllers get some default helpers
|
88
|
+
# (see Application.default_options), but if you have your own helpers you want to load this
|
89
|
+
# is the preferred method.
|
90
|
+
#
|
91
|
+
# By default Racket will look for your helpers in the helpers directory, but you can specify
|
92
|
+
# another location by setting the helper_dir option.
|
93
|
+
#
|
94
|
+
# @param [Array] helpers An array of symbols representing classes living in the Racket::Helpers
|
95
|
+
# namespace.
|
96
|
+
def self.helper(*helpers)
|
97
|
+
helper_modules = {}
|
98
|
+
existing_helpers = get_option(:helpers)
|
99
|
+
if existing_helpers.nil?
|
100
|
+
# No helpers has been loaded yet. Load the default helpers.
|
101
|
+
existing_helpers = Application.options.fetch(:default_controller_helpers, [])
|
102
|
+
helper_modules.merge!(__load_helpers(existing_helpers))
|
103
|
+
end
|
104
|
+
# Load new helpers
|
105
|
+
helpers.map! { |helper| helper.to_sym }
|
106
|
+
helpers.reject! { |helper| helper_modules.key?(helper) }
|
107
|
+
helper_modules.merge!(__load_helpers(helpers))
|
108
|
+
set_option(:helpers, helper_modules)
|
109
|
+
end
|
110
|
+
|
62
111
|
# :nodoc:
|
63
112
|
def self.inherited(klass)
|
64
113
|
Application.options[:last_added_controller].push(klass)
|
@@ -83,7 +132,7 @@ module Racket
|
|
83
132
|
# @param [Object] value
|
84
133
|
def self.set_option(key, value)
|
85
134
|
@options ||= {}
|
86
|
-
@options[key] = value
|
135
|
+
(@options[key] = value) && nil
|
87
136
|
end
|
88
137
|
|
89
138
|
# Returns an option from the current controller class.
|
@@ -94,72 +143,69 @@ module Racket
|
|
94
143
|
self.class.get_option(key)
|
95
144
|
end
|
96
145
|
|
97
|
-
#
|
146
|
+
# Redirects the client. After hooks are run.
|
98
147
|
#
|
99
|
-
# @param [
|
100
|
-
# @param [
|
101
|
-
# @return [
|
102
|
-
def
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
# Returns a route to an action within another controller.
|
107
|
-
#
|
108
|
-
# @param [Class] controller
|
109
|
-
# @param [Symbol] action
|
110
|
-
# @param [Array] params
|
111
|
-
# @return [String]
|
112
|
-
def r(controller, action, *params)
|
113
|
-
Application.get_route(controller, action, params)
|
148
|
+
# @param [String] target URL to redirect to
|
149
|
+
# @param [Fixnum] status HTTP status to send
|
150
|
+
# @return [Object]
|
151
|
+
def redirect(target, status = 302)
|
152
|
+
response.redirect(target, status)
|
153
|
+
respond(response.status, response.headers, '')
|
114
154
|
end
|
115
155
|
|
116
|
-
# Redirects the client. After hooks are
|
156
|
+
# Redirects the client. After hooks are *NOT* run.
|
117
157
|
#
|
118
158
|
# @param [String] target URL to redirect to
|
119
159
|
# @param [Fixnum] status HTTP status to send
|
120
|
-
# @param [true|false] run_after_hook Whether after hook should be run before redirecting
|
121
160
|
# @return [Object]
|
122
|
-
def redirect(target, status = 302
|
161
|
+
def redirect!(target, status = 302)
|
123
162
|
response.redirect(target, status)
|
124
|
-
respond(response.status, response.headers, ''
|
163
|
+
respond!(response.status, response.headers, '')
|
164
|
+
end
|
165
|
+
|
166
|
+
# Stop processing request and send a custom response. After calling this method, after hooks
|
167
|
+
# (but no rendering) will be run.
|
168
|
+
#
|
169
|
+
# @param [Fixnum] status
|
170
|
+
# @param [Hash] headers
|
171
|
+
# @param [String] body
|
172
|
+
def respond(status = 200, headers = {}, body = '')
|
173
|
+
__run_hook(:after)
|
174
|
+
respond!(status, headers, body)
|
125
175
|
end
|
126
176
|
|
127
177
|
# Stop processing request and send a custom response. After calling this method, no further
|
128
|
-
# processing of the request is done
|
129
|
-
# is set to true, any after hook associated with the action (but no other code) will be run.
|
178
|
+
# processing of the request is done.
|
130
179
|
#
|
131
180
|
# @param [Fixnum] status
|
132
181
|
# @param [Hash] headers
|
133
182
|
# @param [String] body
|
134
|
-
|
135
|
-
def respond(status = 200, headers = {}, body = '', run_after_hook = false)
|
136
|
-
__run_hook(:after, racket.action) if run_after_hook
|
183
|
+
def respond!(status = 200, headers = {}, body = '')
|
137
184
|
throw :response, [status, headers, body]
|
138
185
|
end
|
139
186
|
|
140
|
-
#
|
187
|
+
# Calls hooks, action and renderer.
|
141
188
|
#
|
142
|
-
# @param [Symbol] action
|
143
189
|
# @return [String]
|
144
|
-
def
|
145
|
-
|
190
|
+
def __run
|
191
|
+
__run_hook(:before)
|
192
|
+
__run_action
|
193
|
+
__run_hook(:after)
|
146
194
|
Application.view_cache.render(self)
|
147
195
|
end
|
148
196
|
|
149
197
|
private
|
150
198
|
|
151
|
-
def
|
152
|
-
|
153
|
-
meth = method(action)
|
199
|
+
def __run_action
|
200
|
+
meth = method(racket.action)
|
154
201
|
params = racket.params[0...meth.parameters.length]
|
155
|
-
racket.action_result = meth.call(*params)
|
156
|
-
__run_hook(:after, action)
|
202
|
+
(racket.action_result = meth.call(*params)) && nil
|
157
203
|
end
|
158
204
|
|
159
|
-
def __run_hook(type
|
205
|
+
def __run_hook(type)
|
160
206
|
hooks = controller_option("#{type}_hooks".to_sym) || {}
|
161
|
-
|
207
|
+
blk = hooks.fetch(racket.action, nil)
|
208
|
+
(instance_eval(&blk) if blk) && nil
|
162
209
|
end
|
163
|
-
|
164
210
|
end
|
165
211
|
end
|
data/lib/racket/current.rb
CHANGED
@@ -1,22 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
20
18
|
|
21
19
|
module Racket
|
22
20
|
# Represents the current state of Racket while processing a request. The state gets mixed into
|
@@ -30,15 +28,19 @@ module Racket
|
|
30
28
|
# Called whenever a new request needs to be processed.
|
31
29
|
#
|
32
30
|
# @param [Hash] env Rack environment
|
31
|
+
# @param [Class] klass Target klass, needed because we are copying stuff from the class to the
|
32
|
+
# instance.
|
33
33
|
# @param [Symbol] action Keeps track of which action was called on the controller
|
34
34
|
# @param [Array] params Parameters sent to the action
|
35
35
|
# @return [Module] A module encapsulating all state relating to the current request
|
36
|
-
def self.init(env, action, params)
|
36
|
+
def self.init(env, klass, action, params)
|
37
|
+
klass.helper if klass.get_option(:helpers).nil? # Makes sure default helpers are loaded.
|
37
38
|
racket = State.new(action, nil, params)
|
38
39
|
request = Request.new(env)
|
39
40
|
response = Response.new
|
40
41
|
session = Session.new(env['rack.session']) if env.key?('rack.session')
|
41
42
|
Module.new do
|
43
|
+
klass.get_option(:helpers).each_value { |helper| include helper }
|
42
44
|
define_method(:racket) { racket }
|
43
45
|
define_method(:request) { request }
|
44
46
|
define_method(:response) { response }
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module Racket
|
20
|
+
# Helpers module
|
21
|
+
module Helpers
|
22
|
+
# Helper module that handles routing
|
23
|
+
module Routing
|
24
|
+
# Returns a route to an action within another controller.
|
25
|
+
#
|
26
|
+
# @param [Class] controller
|
27
|
+
# @param [Symbol] action
|
28
|
+
# @param [Array] params
|
29
|
+
# @return [String]
|
30
|
+
def route(controller, action, *params)
|
31
|
+
Application.get_route(controller, action, params)
|
32
|
+
end
|
33
|
+
|
34
|
+
alias_method(:r, :route)
|
35
|
+
|
36
|
+
# Returns a route to an action within the current controller.
|
37
|
+
#
|
38
|
+
# @param [Symbol] action
|
39
|
+
# @param [Array] params
|
40
|
+
# @return [String]
|
41
|
+
def route_self(action, *params)
|
42
|
+
Application.get_route(self.class, action, params)
|
43
|
+
end
|
44
|
+
|
45
|
+
alias_method(:rs, :route_self)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module Racket
|
20
|
+
# Helpers module
|
21
|
+
module Helpers
|
22
|
+
# Helper module that handles views
|
23
|
+
module View
|
24
|
+
# Renders a template file using the specified context.
|
25
|
+
#
|
26
|
+
# @param [String] template
|
27
|
+
# @param [Object] context
|
28
|
+
# @return [String|nil]
|
29
|
+
def render_template(template, context = self)
|
30
|
+
return nil unless Utils.file_readable?(template)
|
31
|
+
Tilt.new(template).render(context)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/racket/request.rb
CHANGED
@@ -1,22 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
20
18
|
|
21
19
|
module Racket
|
22
20
|
# Represents an incoming request. Mostly matches Rack::Request but removes some methods that
|
data/lib/racket/response.rb
CHANGED
@@ -1,22 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
20
18
|
|
21
19
|
module Racket
|
22
20
|
# Represents a response from the application
|
data/lib/racket/router.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
4
18
|
|
5
|
-
|
6
|
-
|
7
|
-
Racket is free software: you can redistribute it and/or modify
|
8
|
-
it under the terms of the GNU Affero General Public License as published by
|
9
|
-
the Free Software Foundation, either version 3 of the License, or
|
10
|
-
(at your option) any later version.
|
11
|
-
|
12
|
-
Racket is distributed in the hope that it will be useful,
|
13
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
-
GNU Affero General Public License for more details.
|
16
|
-
|
17
|
-
You should have received a copy of the GNU Affero General Public License
|
18
|
-
along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
19
|
+
require 'set'
|
20
20
|
|
21
21
|
require 'http_router'
|
22
22
|
|
@@ -35,7 +35,7 @@ module Racket
|
|
35
35
|
# @param [Class] controller
|
36
36
|
# @return [nil]
|
37
37
|
def cache_actions(controller)
|
38
|
-
actions =
|
38
|
+
actions = SortedSet.new
|
39
39
|
current = controller
|
40
40
|
while current < Controller
|
41
41
|
actions.merge(current.instance_methods(false))
|
@@ -76,10 +76,10 @@ module Racket
|
|
76
76
|
# @todo: Allow the user to set custom handlers for different errors
|
77
77
|
def render_error(status, error = nil)
|
78
78
|
# If running in dev mode, let Rack::ShowExceptions handle the error.
|
79
|
-
|
79
|
+
fail(error) if error && Application.dev_mode?
|
80
80
|
|
81
81
|
# Not running in dev mode, let us handle the error ourselves.
|
82
|
-
response = Response.new([], status,
|
82
|
+
response = Response.new([], status, 'Content-Type' => 'text/plain')
|
83
83
|
response.write("#{status} #{Rack::Utils::HTTP_STATUS_CODES[status]}")
|
84
84
|
response.finish
|
85
85
|
end
|
@@ -89,36 +89,35 @@ module Racket
|
|
89
89
|
# @param [Hash] env Rack environment
|
90
90
|
# @return [Array] A Rack response triplet
|
91
91
|
def route(env)
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
params = matching_routes.first.first.param_values.first.reject { |e| e.empty? }
|
101
|
-
action = params.empty? ? target_klass.get_option(:default_action) : params.shift.to_sym
|
92
|
+
catch :response do # Catches early exits from Controller.respond.
|
93
|
+
# Find controller in map
|
94
|
+
# If controller exists, call it
|
95
|
+
# Otherwise, send a 404
|
96
|
+
matching_routes = @router.recognize(env)
|
97
|
+
|
98
|
+
# Exit early if no controller is responsible for the route
|
99
|
+
return render_error(404) if matching_routes.first.nil?
|
102
100
|
|
103
|
-
|
104
|
-
|
101
|
+
# Some controller is claiming to be responsible for the route
|
102
|
+
target_klass = matching_routes.first.first.route.dest
|
103
|
+
params = matching_routes.first.first.param_values.first.reject(&:empty?)
|
104
|
+
action = params.empty? ? target_klass.get_option(:default_action) : params.shift.to_sym
|
105
105
|
|
106
|
-
|
107
|
-
|
108
|
-
.split('/')[0...-params.count]
|
109
|
-
.join('/') unless params.empty?
|
106
|
+
# Check if action is available on target
|
107
|
+
return render_error(404) unless @actions_by_controller[target_klass].include?(action)
|
110
108
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
109
|
+
# Rewrite PATH_INFO to reflect that we split out the parameters
|
110
|
+
env['PATH_INFO'] = env['PATH_INFO']
|
111
|
+
.split('/')[0...-params.count]
|
112
|
+
.join('/') unless params.empty?
|
113
|
+
|
114
|
+
# Initialize and render target
|
115
|
+
target = target_klass.new
|
116
|
+
target.extend(Current.init(env, target_klass, action, params))
|
117
|
+
target.__run
|
118
|
+
end
|
119
119
|
rescue => err
|
120
120
|
render_error(500, err)
|
121
|
-
end
|
122
121
|
end
|
123
122
|
end
|
124
123
|
end
|
data/lib/racket/session.rb
CHANGED
@@ -1,22 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
20
18
|
|
21
19
|
module Racket
|
22
20
|
# Racket::Session is just a thin wrapper around whetever object that is implementing the session
|
@@ -31,7 +29,7 @@ module Racket
|
|
31
29
|
def inspect
|
32
30
|
"#<#{self.class}:#{object_id}>"
|
33
31
|
end
|
34
|
-
|
35
|
-
|
32
|
+
alias_method(:to_s, :inspect)
|
33
|
+
alias_method(:to_str, :inspect)
|
36
34
|
end
|
37
35
|
end
|
data/lib/racket/utils.rb
CHANGED
@@ -1,22 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
20
18
|
|
21
19
|
module Racket
|
22
20
|
# Collects utilities needed by different objects in Racket.
|
@@ -28,9 +26,10 @@ module Racket
|
|
28
26
|
# @param [Array] args
|
29
27
|
# @return [String]
|
30
28
|
def self.build_path(*args)
|
31
|
-
if
|
29
|
+
if args.empty?
|
32
30
|
path = Pathname.pwd
|
33
31
|
else
|
32
|
+
args.map! { |arg| arg.to_s }
|
34
33
|
path = Pathname.new(args.shift)
|
35
34
|
path = Pathname.new(Application.options[:root_dir]).join(path) if path.relative?
|
36
35
|
args.each do |arg|
|
@@ -46,5 +45,10 @@ module Racket
|
|
46
45
|
pathname = Pathname.new(path)
|
47
46
|
pathname.exist? && pathname.directory? && pathname.readable?
|
48
47
|
end
|
48
|
+
|
49
|
+
def self.file_readable?(path)
|
50
|
+
pathname = Pathname.new(path)
|
51
|
+
pathname.exist? && pathname.file? && pathname.readable?
|
52
|
+
end
|
49
53
|
end
|
50
54
|
end
|
data/lib/racket/version.rb
CHANGED
@@ -1,22 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
20
18
|
|
21
19
|
module Racket
|
22
20
|
# The only purpose of this module is to keep track of the current Racket version. It is *not*
|
@@ -27,7 +25,7 @@ module Racket
|
|
27
25
|
# Minor version
|
28
26
|
MINOR = 1
|
29
27
|
# Teeny version
|
30
|
-
TEENY =
|
28
|
+
TEENY = 1
|
31
29
|
# Prerelease ?
|
32
30
|
PRERELEASE = false
|
33
31
|
|
data/lib/racket/view_cache.rb
CHANGED
@@ -1,29 +1,26 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
19
|
-
=end
|
1
|
+
# Racket - The noisy Rack MVC framework
|
2
|
+
# Copyright (C) 2015 Lars Olsson <lasso@lassoweb.se>
|
3
|
+
#
|
4
|
+
# This file is part of Racket.
|
5
|
+
#
|
6
|
+
# Racket is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Racket is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with Racket. If not, see <http://www.gnu.org/licenses/>.
|
20
18
|
|
21
19
|
require 'tilt'
|
22
20
|
|
23
21
|
module Racket
|
24
22
|
# Handles rendering in Racket applications.
|
25
23
|
class ViewCache
|
26
|
-
|
27
24
|
def initialize(layout_base_dir, template_base_dir)
|
28
25
|
@layout_base_dir = layout_base_dir
|
29
26
|
@template_base_dir = template_base_dir
|
@@ -95,14 +92,14 @@ module Racket
|
|
95
92
|
if default_file
|
96
93
|
files = Pathname.glob(default_file)
|
97
94
|
return nil if files.empty? # No default file found
|
98
|
-
|
95
|
+
final_path = File.join(file_path, files.first.to_s)
|
96
|
+
return Utils.file_readable?(final_path) ? final_path : nil
|
99
97
|
end
|
100
98
|
return nil # Neither default file or specified file found
|
101
99
|
end
|
102
|
-
File.join(file_path, files.first.to_s)
|
100
|
+
final_path = File.join(file_path, files.first.to_s)
|
101
|
+
return Utils.file_readable?(final_path) ? final_path : nil
|
103
102
|
end
|
104
103
|
end
|
105
|
-
|
106
104
|
end
|
107
|
-
|
108
105
|
end
|
data/spec/_custom.rb
CHANGED
@@ -9,7 +9,7 @@ describe 'A custom Racket test Application' do
|
|
9
9
|
|
10
10
|
it 'should set requested options' do
|
11
11
|
app.options[:default_layout].should.equal('zebra.*')
|
12
|
-
app.options[:view_dir].should.equal('templates')
|
12
|
+
app.options[:view_dir].should.equal(Racket::Utils.build_path('templates'))
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'should be able to get/set options on controller' do
|
@@ -17,6 +17,10 @@ describe 'A custom Racket test Application' do
|
|
17
17
|
last_response.status.should.equal(302)
|
18
18
|
last_response.headers['Location'].should.equal('/sub3/a_secret_place/42')
|
19
19
|
last_response.body.length.should.equal(0)
|
20
|
+
get '/sub3/not_so_secret'
|
21
|
+
last_response.status.should.equal(302)
|
22
|
+
last_response.headers['Location'].should.equal('/sub3/not_so_secret/21')
|
23
|
+
last_response.body.length.should.equal(0)
|
20
24
|
end
|
21
25
|
|
22
26
|
it 'should return a 404 on a nonexisting url' do
|
@@ -55,4 +59,11 @@ describe 'A custom Racket test Application' do
|
|
55
59
|
last_response.headers['Content-Type'].should.equal('text/plain')
|
56
60
|
last_response.body.should.match(%r(^RuntimeError: Epic fail!))
|
57
61
|
end
|
62
|
+
|
63
|
+
it 'should be able to render custom files' do
|
64
|
+
get '/sub3/render_a_file'
|
65
|
+
last_response.status.should.equal(200)
|
66
|
+
last_response.headers['Content-Type'].should.equal('text/html')
|
67
|
+
last_response.body.should.equal("The secret is 42!\n")
|
68
|
+
end
|
58
69
|
end
|
data/spec/_default.rb
CHANGED
@@ -11,7 +11,7 @@ describe 'A default Racket test Application' do
|
|
11
11
|
|
12
12
|
it 'has mapped controllers correctly' do
|
13
13
|
routes_by_controller = actions_by_controller = nil
|
14
|
-
|
14
|
+
app.instance_eval do
|
15
15
|
router.instance_eval do
|
16
16
|
routes_by_controller = @routes_by_controller
|
17
17
|
actions_by_controller = @actions_by_controller
|
@@ -10,4 +10,18 @@ class CustomSubController3 < Racket::Controller
|
|
10
10
|
redirect(rs(__method__, controller_option(:top_secret)))
|
11
11
|
end
|
12
12
|
|
13
|
+
def not_so_secret
|
14
|
+
redirect!(rs(__method__, 21))
|
15
|
+
end
|
16
|
+
|
17
|
+
after :not_so_secret do
|
18
|
+
fail 'Should not happen!'
|
19
|
+
end
|
20
|
+
|
21
|
+
def render_a_file
|
22
|
+
obj = Object.new
|
23
|
+
obj.instance_eval { @secret = 42 }
|
24
|
+
render_template('files/secret.erb', obj)
|
25
|
+
end
|
26
|
+
|
13
27
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
The secret is <%=@secret%>!
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: racket-mvc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lars Olsson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http_router
|
@@ -149,6 +149,8 @@ files:
|
|
149
149
|
- lib/racket/application.rb
|
150
150
|
- lib/racket/controller.rb
|
151
151
|
- lib/racket/current.rb
|
152
|
+
- lib/racket/helpers/routing.rb
|
153
|
+
- lib/racket/helpers/view.rb
|
152
154
|
- lib/racket/request.rb
|
153
155
|
- lib/racket/response.rb
|
154
156
|
- lib/racket/router.rb
|
@@ -166,6 +168,7 @@ files:
|
|
166
168
|
- spec/test_custom_app/controllers/sub3/inherited/custom_inherited_controller.rb
|
167
169
|
- spec/test_custom_app/extra/blob.rb
|
168
170
|
- spec/test_custom_app/extra/blob/inner_blob.rb
|
171
|
+
- spec/test_custom_app/files/secret.erb
|
169
172
|
- spec/test_custom_app/layouts/sub2/zebra.erb
|
170
173
|
- spec/test_custom_app/templates/sub2/template.erb
|
171
174
|
- spec/test_default_app/controllers/default_root_controller.rb
|