racket-mvc 0.3.2 → 0.3.3
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/lib/racket/application.rb +19 -8
- data/lib/racket/controller.rb +26 -7
- data/lib/racket/current.rb +4 -13
- data/lib/racket/response.rb +9 -0
- data/lib/racket/router.rb +1 -3
- data/lib/racket/settings/application.rb +7 -2
- data/lib/racket/utils/helpers.rb +21 -0
- data/lib/racket/utils/routing.rb +7 -1
- data/lib/racket/utils/views.rb +41 -33
- data/lib/racket/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63921b5e05aa5980041e8817c71bcd43b015834d
|
4
|
+
data.tar.gz: 1f98ea84f965aa6c36707dd515c16b9d7ff7ae29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 306ae0910122403e2adff6a1cab12d01bea39e17d7142e7b07a2ef0aa1a48e1b61c38e1debf2f2ffff3f38bebc1d9d12cd3f2770dd0509ac44e0bdb2e95c92c2
|
7
|
+
data.tar.gz: 3fdeac0f87e45d5cefda65f18ebc61d831028a09ce75ffe371f2024838e6b5f06087fe655f64fb8d405fc1e0515167d27b42f74c5c8bcf472c0371ebf05bd11a
|
data/lib/racket/application.rb
CHANGED
@@ -33,6 +33,12 @@ module Racket
|
|
33
33
|
@application ||= Utils.build_application(self)
|
34
34
|
end
|
35
35
|
|
36
|
+
def self.calculate_url_path(file)
|
37
|
+
url_path = "/#{file.relative_path_from(@settings.controller_dir).dirname}"
|
38
|
+
url_path = '' if url_path == '/.'
|
39
|
+
url_path
|
40
|
+
end
|
41
|
+
|
36
42
|
# Called whenever Rack sends a request to the application.
|
37
43
|
#
|
38
44
|
# @param [Hash] env Rack environment
|
@@ -111,9 +117,7 @@ module Racket
|
|
111
117
|
def self.load_controllers
|
112
118
|
inform_dev('Loading controllers.')
|
113
119
|
@settings.store(:last_added_controller, [])
|
114
|
-
|
115
|
-
load_controller_file(path)
|
116
|
-
end
|
120
|
+
load_controller_files
|
117
121
|
@settings.delete(:last_added_controller)
|
118
122
|
inform_dev('Done loading controllers.') && nil
|
119
123
|
end
|
@@ -124,9 +128,15 @@ module Racket
|
|
124
128
|
# @return nil
|
125
129
|
def self.load_controller_file(file)
|
126
130
|
::Kernel.require file
|
127
|
-
|
128
|
-
|
129
|
-
@router.map(
|
131
|
+
klass = @settings.fetch(:last_added_controller).pop
|
132
|
+
Utils.apply_helpers(klass)
|
133
|
+
@router.map(calculate_url_path(file), klass) && nil
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.load_controller_files
|
137
|
+
Utils.paths_by_longest_path(@settings.controller_dir, File.join('**', '*.rb')).each do |path|
|
138
|
+
load_controller_file(path)
|
139
|
+
end
|
130
140
|
end
|
131
141
|
|
132
142
|
# Reloads the application, making any changes to the controller configuration visible
|
@@ -195,7 +205,8 @@ module Racket
|
|
195
205
|
@view_manager ||= ViewManager.new(@settings.layout_dir, @settings.view_dir)
|
196
206
|
end
|
197
207
|
|
198
|
-
private_class_method :application, :inform, :init, :load_controller_file,
|
199
|
-
:
|
208
|
+
private_class_method :application, :calculate_url_path, :inform, :init, :load_controller_file,
|
209
|
+
:load_controller_files, :load_controllers, :setup_routes,
|
210
|
+
:setup_static_server
|
200
211
|
end
|
201
212
|
end
|
data/lib/racket/controller.rb
CHANGED
@@ -37,13 +37,22 @@ module Racket
|
|
37
37
|
# @param [Proc] blk
|
38
38
|
# @return [nil]
|
39
39
|
def self.__register_hook(type, methods, blk)
|
40
|
-
key = "#{type}_hooks".to_sym
|
41
40
|
meths = public_instance_methods(false)
|
42
41
|
meths &= methods.map(&:to_sym) unless methods.empty?
|
43
|
-
|
42
|
+
__update_hooks("#{type}_hooks".to_sym, meths, blk)
|
43
|
+
Application.inform_dev("Adding #{type} hook #{blk} for actions #{meths} for #{self}.")
|
44
|
+
end
|
45
|
+
|
46
|
+
# Updates hooks in settings object.
|
47
|
+
#
|
48
|
+
# @param [Symbol] hook_key
|
49
|
+
# @param [Array] meths
|
50
|
+
# @param [Proc] blk
|
51
|
+
# @return [nil]
|
52
|
+
def self.__update_hooks(hook_key, meths, blk)
|
53
|
+
hooks = settings.fetch(hook_key, {})
|
44
54
|
meths.each { |meth| hooks[meth] = blk }
|
45
|
-
setting(
|
46
|
-
nil
|
55
|
+
setting(hook_key, hooks) && nil
|
47
56
|
end
|
48
57
|
|
49
58
|
# Adds a before hook to one or more actions. Actions should be given as a list of symbols.
|
@@ -73,6 +82,7 @@ module Racket
|
|
73
82
|
#
|
74
83
|
# @param [Array] helpers An array of symbols representing classes living in the Racket::Helpers
|
75
84
|
# namespace.
|
85
|
+
# @return [nil]
|
76
86
|
def self.helper(*helpers)
|
77
87
|
helper_modules = {}
|
78
88
|
unless settings.fetch(:helpers)
|
@@ -82,10 +92,19 @@ module Racket
|
|
82
92
|
)
|
83
93
|
end
|
84
94
|
# Load new helpers
|
85
|
-
helpers.map
|
95
|
+
__load_helpers(helpers.map(&:to_sym), helper_modules)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Loads new helpers and stores the list of helpers associated with the currenct controller
|
99
|
+
# in the settings.
|
100
|
+
#
|
101
|
+
# @param [Array] helpers Requested helpers
|
102
|
+
# @param [Array] helper_modules Helper modules already loaded
|
103
|
+
# @return nil
|
104
|
+
def self.__load_helpers(helpers, helper_modules)
|
86
105
|
helpers.reject! { |helper| helper_modules.key?(helper) }
|
87
106
|
helper_modules.merge!(__helper_cache.load_helpers(helpers))
|
88
|
-
setting(:helpers, helper_modules)
|
107
|
+
setting(:helpers, helper_modules) && nil
|
89
108
|
end
|
90
109
|
|
91
110
|
# :nodoc:
|
@@ -109,7 +128,7 @@ module Racket
|
|
109
128
|
settings.store(key, value)
|
110
129
|
end
|
111
130
|
|
112
|
-
private_class_method :__helper_cache, :__register_hook
|
131
|
+
private_class_method :__helper_cache, :__load_helpers, :__register_hook, :__update_hooks
|
113
132
|
|
114
133
|
# Returns the settings for a controller instance.
|
115
134
|
#
|
data/lib/racket/current.rb
CHANGED
@@ -27,23 +27,14 @@ module Racket
|
|
27
27
|
|
28
28
|
# Called whenever a new request needs to be processed.
|
29
29
|
#
|
30
|
-
# @param [
|
31
|
-
# @param [Class] klass Target klass, needed because we are copying stuff from the class to the
|
32
|
-
# instance.
|
33
|
-
# @param [Symbol] action Keeps track of which action was called on the controller
|
34
|
-
# @param [Array] params Parameters sent to the action
|
30
|
+
# @param [RouterParams] router_params
|
35
31
|
# @return [Module] A module encapsulating all state relating to the current request
|
36
|
-
def self.init(
|
37
|
-
|
38
|
-
klass.helper unless settings.fetch(:helpers) # Makes sure default helpers are loaded.
|
39
|
-
helpers = settings.fetch(:helpers)
|
40
|
-
properties = init_properties(action, params, env)
|
41
|
-
init_module(helpers, properties)
|
32
|
+
def self.init(router_params)
|
33
|
+
init_module(init_properties(*router_params.to_a))
|
42
34
|
end
|
43
35
|
|
44
|
-
def self.init_module(
|
36
|
+
def self.init_module(properties)
|
45
37
|
Module.new do
|
46
|
-
helpers.each_value { |helper| include helper }
|
47
38
|
properties.each_pair { |key, value| define_method(key) { value } }
|
48
39
|
end
|
49
40
|
end
|
data/lib/racket/response.rb
CHANGED
@@ -19,5 +19,14 @@
|
|
19
19
|
module Racket
|
20
20
|
# Represents a response from the application
|
21
21
|
class Response < Rack::Response
|
22
|
+
# Generates a basic error response.
|
23
|
+
#
|
24
|
+
# @param [Fixnum] status
|
25
|
+
# @return [Array]
|
26
|
+
def self.generate_error_response(status)
|
27
|
+
response = new([], status, 'Content-Type' => 'text/plain')
|
28
|
+
response.write("#{status} #{Rack::Utils::HTTP_STATUS_CODES[status]}")
|
29
|
+
response.finish
|
30
|
+
end
|
22
31
|
end
|
23
32
|
end
|
data/lib/racket/router.rb
CHANGED
@@ -72,9 +72,7 @@ module Racket
|
|
72
72
|
fail(error) if error && Application.dev_mode?
|
73
73
|
|
74
74
|
# Not running in dev mode, let us handle the error ourselves.
|
75
|
-
|
76
|
-
response.write("#{status} #{Rack::Utils::HTTP_STATUS_CODES[status]}")
|
77
|
-
response.finish
|
75
|
+
Response.generate_error_response(status)
|
78
76
|
end
|
79
77
|
|
80
78
|
# Routes a request and renders it.
|
@@ -56,13 +56,16 @@ module Racket
|
|
56
56
|
# @param [String] directory
|
57
57
|
# @return [nil]
|
58
58
|
def self.directory_setting(symbol, directory)
|
59
|
-
|
59
|
+
define_directory_method(symbol, "@#{symbol}".to_sym, directory)
|
60
|
+
attr_writer(symbol) && nil
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.define_directory_method(symbol, ivar, directory)
|
60
64
|
define_method symbol do
|
61
65
|
instance_variable_set(ivar, directory) unless instance_variables.include?(ivar)
|
62
66
|
return nil unless (value = instance_variable_get(ivar))
|
63
67
|
Utils.build_path(value)
|
64
68
|
end
|
65
|
-
attr_writer(symbol) && nil
|
66
69
|
end
|
67
70
|
|
68
71
|
directory_setting(:controller_dir, 'controllers')
|
@@ -70,6 +73,8 @@ module Racket
|
|
70
73
|
directory_setting(:layout_dir, 'layouts')
|
71
74
|
directory_setting(:public_dir, 'public')
|
72
75
|
directory_setting(:view_dir, 'views')
|
76
|
+
|
77
|
+
private_class_method :define_directory_method
|
73
78
|
end
|
74
79
|
end
|
75
80
|
end
|
data/lib/racket/utils/helpers.rb
CHANGED
@@ -69,6 +69,27 @@ module Racket
|
|
69
69
|
helper_module
|
70
70
|
end
|
71
71
|
end
|
72
|
+
|
73
|
+
# Applies helpers to a controller class by including the modules in the class.
|
74
|
+
#
|
75
|
+
# @param [Class] klass
|
76
|
+
def self.apply_helpers(klass)
|
77
|
+
klass.helper unless klass.settings.fetch(:helpers) # Makes sure default helpers are loaded.
|
78
|
+
__apply_helpers(klass)
|
79
|
+
nil
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.__apply_helpers(klass)
|
83
|
+
klass.settings.fetch(:helpers).reverse_each do |pair|
|
84
|
+
helper_key, helper = pair
|
85
|
+
::Racket::Application.inform_dev(
|
86
|
+
"Adding helper module #{helper_key.inspect} to #{klass}"
|
87
|
+
)
|
88
|
+
klass.send(:include, helper)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
private_class_method :__apply_helpers
|
72
93
|
end
|
73
94
|
end
|
74
95
|
end
|
data/lib/racket/utils/routing.rb
CHANGED
@@ -20,6 +20,9 @@ module Racket
|
|
20
20
|
module Utils
|
21
21
|
# Utility functions for routing.
|
22
22
|
module Routing
|
23
|
+
# Struct for keeping track router parameters.
|
24
|
+
RouterParams = Struct.new(:action, :params, :env)
|
25
|
+
|
23
26
|
# Class for caching actions
|
24
27
|
class ActionCache
|
25
28
|
attr_reader :items
|
@@ -96,7 +99,10 @@ module Racket
|
|
96
99
|
update_path_info(env, params.length)
|
97
100
|
|
98
101
|
# Initialize and render target
|
99
|
-
call_controller(
|
102
|
+
call_controller(
|
103
|
+
controller_class,
|
104
|
+
Current.init(RouterParams.new(action, params, env))
|
105
|
+
)
|
100
106
|
end
|
101
107
|
|
102
108
|
# Updates the PATH_INFO environment variable.
|
data/lib/racket/utils/views.rb
CHANGED
@@ -22,15 +22,31 @@ module Racket
|
|
22
22
|
module Utils
|
23
23
|
# Utility functions for views.
|
24
24
|
module Views
|
25
|
+
# Cache for storing templates
|
26
|
+
class TemplateCache
|
27
|
+
def initialize
|
28
|
+
@cache = {}
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns a cached template. If the template has not been cached yet, this method will run a
|
32
|
+
# lookup against the provided parameters.
|
33
|
+
#
|
34
|
+
# @param [String] path
|
35
|
+
# @param [TemplateParams] template_params
|
36
|
+
# @return [String|Proc|nil]
|
37
|
+
def ensure_in_cache(path, template_params)
|
38
|
+
return @cache[path] if @cache.key?(path)
|
39
|
+
@cache[path] = TemplateLocator.calculate_path(path, template_params)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
25
43
|
# Class used for locating templates.
|
26
44
|
class TemplateLocator
|
27
|
-
# Struct for holding template data.
|
28
|
-
TemplateParams = Struct.new(:type, :controller, :base_dir, :cache)
|
29
45
|
def initialize(layout_base_dir, view_base_dir)
|
30
46
|
@layout_base_dir = layout_base_dir
|
31
47
|
@view_base_dir = view_base_dir
|
32
|
-
@layout_cache =
|
33
|
-
@view_cache =
|
48
|
+
@layout_cache = TemplateCache.new
|
49
|
+
@view_cache = TemplateCache.new
|
34
50
|
end
|
35
51
|
|
36
52
|
# Returns the layout associated with the current request. On the first request to any action
|
@@ -53,28 +69,6 @@ module Racket
|
|
53
69
|
|
54
70
|
private
|
55
71
|
|
56
|
-
def calculate_path(template_params, path)
|
57
|
-
type, controller, base_dir = template_params.to_a
|
58
|
-
default_template = controller.settings.fetch("default_#{type}".to_sym)
|
59
|
-
template =
|
60
|
-
self.class.lookup_template_with_default(Utils.fs_path(base_dir, path), default_template)
|
61
|
-
::Racket::Application.inform_dev(
|
62
|
-
"Using #{type} #{template.inspect} for #{controller.class}.#{controller.racket.action}."
|
63
|
-
)
|
64
|
-
template
|
65
|
-
end
|
66
|
-
|
67
|
-
# Returns a cached template. If the template has not been cached yet, this method will run a
|
68
|
-
# lookup against the provided parameters.
|
69
|
-
#
|
70
|
-
# @param [TemplateParams] template_params
|
71
|
-
# @return [String|Proc|nil]
|
72
|
-
def ensure_in_cache(template_params, path)
|
73
|
-
cache = template_params.cache
|
74
|
-
return cache[path] if cache.key?(path)
|
75
|
-
cache[path] = calculate_path(template_params, path)
|
76
|
-
end
|
77
|
-
|
78
72
|
# Tries to locate a template matching +path+ in the file system and returns the path if a
|
79
73
|
# matching file is found. If no matching file is found, +nil+ is returned. The result is
|
80
74
|
# cached, meaning that the filesystem lookup for a specific path will only happen once.
|
@@ -84,11 +78,24 @@ module Racket
|
|
84
78
|
def get_template(template_params)
|
85
79
|
klass = self.class
|
86
80
|
path = klass.get_template_path(template_params.controller)
|
87
|
-
template = ensure_in_cache(
|
88
|
-
klass.resolve_template(
|
81
|
+
template = template_params.cache.ensure_in_cache(path, template_params)
|
82
|
+
klass.resolve_template(path, template, template_params)
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.calculate_path(path, template_params)
|
86
|
+
type, controller, base_dir = template_params.to_a
|
87
|
+
default_template = controller.settings.fetch("default_#{type}".to_sym)
|
88
|
+
template =
|
89
|
+
TemplateLocator.lookup_template_with_default(
|
90
|
+
Utils.fs_path(base_dir, path), default_template
|
91
|
+
)
|
92
|
+
::Racket::Application.inform_dev(
|
93
|
+
"Using #{type} #{template.inspect} for #{controller.class}.#{controller.racket.action}."
|
94
|
+
)
|
95
|
+
template
|
89
96
|
end
|
90
97
|
|
91
|
-
def self.resolve_template(
|
98
|
+
def self.resolve_template(path, template, template_params)
|
92
99
|
return template unless template.is_a?(Proc)
|
93
100
|
_, controller, base_dir = template_params.to_a
|
94
101
|
lookup_template(
|
@@ -112,10 +119,8 @@ module Racket
|
|
112
119
|
# @param [Racket::Controller] controller
|
113
120
|
# @return [String]
|
114
121
|
def self.call_template_proc(proc, controller)
|
115
|
-
|
116
|
-
|
117
|
-
proc_args = []
|
118
|
-
1.upto(proc.arity) { proc_args.push(possible_proc_args.shift) }
|
122
|
+
racket = controller.racket
|
123
|
+
proc_args = [racket.action, racket.params, controller.request].slice(0...proc.arity)
|
119
124
|
proc.call(*proc_args).to_s
|
120
125
|
end
|
121
126
|
|
@@ -195,6 +200,9 @@ module Racket
|
|
195
200
|
|
196
201
|
private_class_method :render_template, :send_response
|
197
202
|
end
|
203
|
+
|
204
|
+
# Struct for holding template data.
|
205
|
+
TemplateParams = Struct.new(:type, :controller, :base_dir, :cache)
|
198
206
|
end
|
199
207
|
end
|
200
208
|
end
|
data/lib/racket/version.rb
CHANGED
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.3.
|
4
|
+
version: 0.3.3
|
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-
|
11
|
+
date: 2015-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http_router
|