mack 0.8.0.101 → 0.8.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.
- data/CHANGELOG +29 -0
- data/bin/mackery-console +6 -5
- data/bin/mackery-server +23 -7
- data/lib/mack.rb +0 -3
- data/lib/mack/application.rb +161 -0
- data/lib/mack/assets/asset_helpers.rb +8 -0
- data/lib/mack/assets/assets_mgr.rb +0 -10
- data/lib/mack/boot/app.rb +46 -0
- data/lib/mack/boot/assets.rb +10 -0
- data/lib/mack/boot/configuration.rb +87 -0
- data/lib/mack/boot/console.rb +36 -0
- data/lib/mack/boot/core.rb +21 -0
- data/lib/mack/boot/environment.rb +22 -0
- data/lib/mack/boot/extensions.rb +13 -0
- data/lib/mack/boot/gem_tasks.rb +20 -0
- data/lib/mack/boot/gems.rb +18 -0
- data/lib/mack/boot/hello.rb +11 -0
- data/lib/mack/{initialization → boot}/helpers.rb +8 -3
- data/lib/mack/boot/initializers.rb +17 -0
- data/lib/mack/boot/lib.rb +19 -0
- data/lib/mack/{initialization → boot}/logging.rb +16 -9
- data/lib/mack/{initialization → boot}/logging/basic_layout.rb +0 -0
- data/lib/mack/{initialization → boot}/logging/color_layout.rb +1 -1
- data/lib/mack/{initialization → boot}/logging/filter.rb +0 -0
- data/lib/mack/boot/paths.rb +234 -0
- data/lib/mack/boot/plugins.rb +26 -0
- data/lib/mack/boot/portlets.rb +20 -0
- data/lib/mack/boot/routes.rb +15 -0
- data/lib/mack/boot/version.rb +7 -0
- data/lib/mack/controller/request.rb +5 -2
- data/lib/mack/controller/uploaded_file.rb +4 -0
- data/lib/mack/core_extensions/kernel.rb +26 -0
- data/lib/mack/core_extensions/object.rb +16 -0
- data/lib/mack/generators/mack_application_generator/manifest.yml +5 -3
- data/lib/mack/generators/mack_application_generator/templates/config/initializers/portlets.rb.template +9 -0
- data/lib/mack/generators/mack_application_generator/templates/public/stylesheets/scaffold.css.template +4 -0
- data/lib/mack/generators/portlet_generator/portlet_generator.rb +2 -0
- data/lib/mack/generators/portlet_generator/templates/README.template +3 -0
- data/lib/mack/generators/portlet_generator/templates/portlet_config/portlet.spec.template +28 -0
- data/lib/mack/portlets/manager.rb +27 -0
- data/lib/mack/portlets/portlet.rb +93 -0
- data/lib/mack/portlets/unpacker.rb +34 -0
- data/lib/mack/rendering/engine/erubis.rb +2 -2
- data/lib/mack/rendering/type/file_base.rb +8 -4
- data/lib/mack/rendering/type/public.rb +4 -2
- data/lib/mack/routing/resource_proxy.rb +30 -4
- data/lib/mack/routing/route_map.rb +28 -15
- data/lib/mack/routing/route_object.rb +57 -24
- data/lib/mack/routing/urls.rb +12 -2
- data/lib/mack/runner.rb +6 -154
- data/lib/mack/sessions/cookie_session_store.rb +2 -1
- data/lib/mack/tasks/mack_dump_tasks.rake +62 -18
- data/lib/mack/tasks/mack_tasks.rake +1 -15
- data/lib/mack/tasks/portlet_tasks.rake +33 -0
- data/lib/mack/tasks/rake_rules.rake +6 -0
- data/lib/mack/tasks/test_tasks.rake +4 -6
- data/lib/mack/testing/helpers.rb +12 -4
- data/lib/mack/utils/server.rb +7 -1
- data/lib/mack/utils/static.rb +19 -0
- data/lib/mack/version.rb +1 -1
- data/lib/mack/view_helpers/all_helpers.rb +0 -8
- data/lib/mack/view_helpers/date_time_helpers.rb +18 -12
- data/lib/mack/view_helpers/form_helpers.rb +9 -0
- data/lib/mack/view_helpers/html_helpers.rb +18 -7
- data/lib/mack/view_helpers/link_helpers.rb +2 -1
- data/lib/mack/view_helpers/object_helpers.rb +1 -1
- data/lib/mack_app.rb +26 -14
- data/lib/mack_core.rb +50 -39
- data/lib/mack_tasks.rb +46 -19
- metadata +37 -18
- data/lib/mack/initialization/application.rb +0 -53
- data/lib/mack/initialization/boot_loader.rb +0 -72
- data/lib/mack/initialization/configuration.rb +0 -101
- data/lib/mack/initialization/console.rb +0 -29
- data/lib/mack/initialization/environment.rb +0 -16
- data/lib/mack/initialization/plugins.rb +0 -16
- data/lib/mack/initialization/server/simple_server.rb +0 -19
- data/lib/mack/tasks/mack_server_tasks.rake +0 -24
- data/lib/mack/utils/paths.rb +0 -154
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'mack-facets'
|
2
|
+
|
3
|
+
run_once do
|
4
|
+
|
5
|
+
require File.join_from_here('gems.rb')
|
6
|
+
|
7
|
+
init_message('plugins')
|
8
|
+
|
9
|
+
plugins = [] # a list of all plugins
|
10
|
+
|
11
|
+
Mack.search_path(:plugins).each do |path|
|
12
|
+
Dir.glob(File.join(path, '*')).each do |d|
|
13
|
+
plugins << d
|
14
|
+
$: << File.join(d, "lib") # add the lib for this plugin to the global load path
|
15
|
+
end
|
16
|
+
end
|
17
|
+
plugins.sort.each do |plug|
|
18
|
+
begin
|
19
|
+
require File.join(plug, "init.rb") # load the init.rb for each plugin.
|
20
|
+
rescue Exception => e
|
21
|
+
puts e.message
|
22
|
+
end
|
23
|
+
$:.delete(File.join(plug, "lib")) # remove the plugins lib directory from the global load path.
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
run_once do
|
2
|
+
|
3
|
+
require File.join_from_here('paths.rb')
|
4
|
+
|
5
|
+
Dir.glob(File.join_from_here('..', 'portlets', '**/*.rb')).each do |d|
|
6
|
+
require File.expand_path(d)
|
7
|
+
end
|
8
|
+
|
9
|
+
Mack.search_path(:initializers).each do |path|
|
10
|
+
f = File.join(path, 'portlets.rb')
|
11
|
+
require f if File.exists?(f)
|
12
|
+
end
|
13
|
+
|
14
|
+
required_portlets_list.each do |p|
|
15
|
+
puts "portlet: #{p}"
|
16
|
+
gem p.to_s
|
17
|
+
require p.to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'mack-facets'
|
2
|
+
|
3
|
+
run_once do
|
4
|
+
|
5
|
+
require File.join_from_here('lib')
|
6
|
+
|
7
|
+
init_message('routes')
|
8
|
+
|
9
|
+
# We want local routes to be first
|
10
|
+
Mack.search_path_local_first(:config).each do |path|
|
11
|
+
f = File.join(path, 'routes.rb')
|
12
|
+
require f if File.exists?(f)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -6,13 +6,14 @@ module Mack
|
|
6
6
|
alias_instance_method :[], :old_hash
|
7
7
|
alias_instance_method :store
|
8
8
|
def [](key)
|
9
|
-
|
9
|
+
key = key.to_s.downcase
|
10
|
+
data = old_hash(key.to_sym) || old_hash(key)
|
10
11
|
data = data.to_s if data.is_a?(Symbol)
|
11
12
|
return data
|
12
13
|
end
|
13
14
|
|
14
15
|
def []=(key, value)
|
15
|
-
_original_store(key.to_sym, value)
|
16
|
+
_original_store(key.downcase.to_sym, value)
|
16
17
|
end
|
17
18
|
|
18
19
|
def to_s
|
@@ -135,6 +136,8 @@ module Mack
|
|
135
136
|
if k.to_s.match(/.+\[.+\]/)
|
136
137
|
nv = k.to_s.match(/.+\[(.+)\]/).captures.first
|
137
138
|
nk = k.to_s.match(/(.+)\[.+\]/).captures.first
|
139
|
+
nk.downcase!
|
140
|
+
nv.downcase!
|
138
141
|
@mack_params[nk.to_sym] = {} if @mack_params[nk.to_sym].nil?
|
139
142
|
v = v.uri_unescape if v.is_a?(String)
|
140
143
|
@mack_params[nk.to_sym].merge!(nv.to_sym => v)
|
@@ -1,5 +1,31 @@
|
|
1
1
|
module Kernel
|
2
2
|
|
3
|
+
def init_message(message) # :nodoc:
|
4
|
+
message = "Initializing '#{message}' ..."
|
5
|
+
if Mack.methods.include?('logger')
|
6
|
+
Mack.logger.debug(message) unless configatron.mack.log.disable_initialization_logging
|
7
|
+
else
|
8
|
+
puts message
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns Mack::Portlets::Manager
|
13
|
+
def require_portlets
|
14
|
+
yield Mack::Portlet::Manager.instance
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns an Array of gems required by the Mack::Portlets::Manager
|
18
|
+
def required_portlets_list
|
19
|
+
Mack::Portlet::Manager.instance.required_portlet_list
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
# Return the instance of the AssetManager class.
|
24
|
+
#
|
25
|
+
def assets_mgr
|
26
|
+
return Mack::Assets::Manager.instance
|
27
|
+
end
|
28
|
+
|
3
29
|
# Returns Mack::Utils::GemManager
|
4
30
|
def require_gems
|
5
31
|
yield Mack::Utils::GemManager.instance
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Object
|
2
|
+
|
3
|
+
def errors_for(meth_name)
|
4
|
+
if self.respond_to?("errors") and self.errors
|
5
|
+
return self.errors[meth_name.to_sym]
|
6
|
+
end
|
7
|
+
return nil
|
8
|
+
end
|
9
|
+
|
10
|
+
def has_errors?(meth_name)
|
11
|
+
res = errors_for(meth_name)
|
12
|
+
return !res.empty? if res.is_a?(Array)
|
13
|
+
return !res.blank?
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -35,10 +35,12 @@ database_yml:
|
|
35
35
|
template_path: <%= File.join(templates_directory_path, "config", "#{f}.template") %>
|
36
36
|
output_path: <%= File.join(app_name, "config", f) %>
|
37
37
|
<% end -%>
|
38
|
-
|
38
|
+
<% [:gems, :inflections, :mime_types, :portlets].each do |f| -%>
|
39
|
+
initializers_<%= f %>_rb:
|
39
40
|
type: file
|
40
|
-
template_path: <%= File.join(templates_directory_path, "config", "initializers", "
|
41
|
-
output_path: <%= File.join(app_name, "config", "initializers", "
|
41
|
+
template_path: <%= File.join(templates_directory_path, "config", "initializers", "#{f}.rb.template") %>
|
42
|
+
output_path: <%= File.join(app_name, "config", "initializers", "#{f}.rb") %>
|
43
|
+
<% end -%>
|
42
44
|
favicon:
|
43
45
|
type: file
|
44
46
|
template_path: <%= File.join(templates_directory_path, "public", "favicon.ico.template") %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# Using this file you can Portlets to your application.
|
2
|
+
# Portlets are Mack applications that have been packaged as Gems using
|
3
|
+
# a few simple Rake tasks. These Portlets can extend your application
|
4
|
+
# and bring new functionality to them very, very easily.
|
5
|
+
require_portlets do |p|
|
6
|
+
# examples:
|
7
|
+
# p.add :my_cool_portlet, :version => "1.2.2"
|
8
|
+
# p.add :my_cool_portlet, :source => "http://gems.rubyforge.org"
|
9
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
Mack::Portlet.portlet_spec = Gem::Specification.new do |s|
|
2
|
+
s.name = "<%= File.basename(Mack.root) %>"
|
3
|
+
s.version = "0.0.1"
|
4
|
+
s.summary = "<%= File.basename(Mack.root) %> portlet for the Mack Framework"
|
5
|
+
s.description = "<%= File.basename(Mack.root) %> portlet for the Mack Framework"
|
6
|
+
s.author = "<%= (ENV["USERNAME"] || ENV["USER"]) %>"
|
7
|
+
s.email = ""
|
8
|
+
s.homepage = ""
|
9
|
+
|
10
|
+
s.test_files = FileList['test/**/*']
|
11
|
+
|
12
|
+
s.files = FileList['lib/**/*', 'README', 'doc/**/*.*', 'bin/**/*']
|
13
|
+
s.require_paths << 'lib'
|
14
|
+
|
15
|
+
s.bindir = "bin"
|
16
|
+
# s.executables << ""
|
17
|
+
#s.default_executable = ""
|
18
|
+
#s.add_dependency("", "")
|
19
|
+
#s.add_dependency("", "")
|
20
|
+
#s.extensions << ""
|
21
|
+
s.extra_rdoc_files = ["README"]
|
22
|
+
s.has_rdoc = true
|
23
|
+
#s.platform = "Gem::Platform::Ruby"
|
24
|
+
#s.required_ruby_version = ">= 1.8.6"
|
25
|
+
#s.requirements << "An ice cold beer."
|
26
|
+
#s.requirements << "Some free time!"
|
27
|
+
s.rubyforge_project = "<%= File.basename(Mack.root) %>"
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.join_from_here('..', 'utils', 'gem_manager.rb')
|
2
|
+
|
3
|
+
module Mack
|
4
|
+
module Portlet # :nodoc:
|
5
|
+
|
6
|
+
# Used to manage the Portlets associated with the application.
|
7
|
+
class Manager
|
8
|
+
include Singleton
|
9
|
+
|
10
|
+
attr_accessor :required_portlet_list
|
11
|
+
|
12
|
+
def initialize # :nodoc:
|
13
|
+
@required_portlet_list = []
|
14
|
+
end
|
15
|
+
|
16
|
+
# Adds a Portlet to the application. This takes the same parameters as
|
17
|
+
# Mack::Utils::GemManager.instance.add
|
18
|
+
def add(name, options = {})
|
19
|
+
@required_portlet_list << name
|
20
|
+
@required_portlet_list.uniq!
|
21
|
+
Mack::Utils::GemManager.instance.add(name, options)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
end # Manager
|
26
|
+
end # Portlet
|
27
|
+
end # Mack
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Mack
|
2
|
+
|
3
|
+
module Portlet # :nodoc:
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
attr_accessor :portlet_spec # :nodoc:
|
8
|
+
|
9
|
+
def clean # :nodoc:
|
10
|
+
FileUtils.rm_rf(Mack::Paths.portlet_package, :verbose => configatron.mack.portlet.verbose)
|
11
|
+
end
|
12
|
+
|
13
|
+
def prepare # :nodoc:
|
14
|
+
unless File.exists?(Mack::Paths.portlet_config)
|
15
|
+
PortletGenerator.run
|
16
|
+
end
|
17
|
+
load Mack::Paths.portlet_config('portlet.spec')
|
18
|
+
FileUtils.mkdir_p(Mack::Paths.portlet_package('lib'), :verbose => configatron.mack.portlet.verbose)
|
19
|
+
files = []
|
20
|
+
File.open(Mack::Paths.portlet_package('lib', "#{@portlet_spec.name}.rb"), 'w') do |f|
|
21
|
+
|
22
|
+
f.puts %{
|
23
|
+
Mack.add_search_path(:app, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'app'))
|
24
|
+
Mack.add_search_path(:controllers, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'app', 'controllers'))
|
25
|
+
Mack.add_search_path(:helpers, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'app', 'helpers'))
|
26
|
+
Mack.add_search_path(:models, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'app', 'models'))
|
27
|
+
Mack.add_search_path(:views, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'app', 'views'))
|
28
|
+
Mack.add_search_path(:config, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'config'))
|
29
|
+
Mack.add_search_path(:configatron, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'config', 'configatron'))
|
30
|
+
Mack.add_search_path(:initializers, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'config', 'initializers'))
|
31
|
+
Mack.add_search_path(:db, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'db'))
|
32
|
+
Mack.add_search_path(:lib, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'lib'))
|
33
|
+
Mack.add_search_path(:public, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'public'))
|
34
|
+
Mack.add_search_path(:vendor, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'vendor'))
|
35
|
+
Mack.add_search_path(:plugins, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}', 'vendor', 'plugins'))
|
36
|
+
|
37
|
+
Mack.set_base_path(:#{@portlet_spec.name.methodize}, File.join(File.dirname(__FILE__), '#{@portlet_spec.name}'))
|
38
|
+
}.strip
|
39
|
+
|
40
|
+
end # File.open
|
41
|
+
|
42
|
+
files << Dir.glob(Mack::Paths.app('**/*.*'))
|
43
|
+
files << Dir.glob(Mack::Paths.config('**/*.*'))
|
44
|
+
files << Dir.glob(Mack::Paths.db('**/*.*'))
|
45
|
+
files << Dir.glob(Mack::Paths.lib('**/*.*'))
|
46
|
+
files << Dir.glob(Mack::Paths.public('**/*.*'))
|
47
|
+
files << Dir.glob(Mack::Paths.plugins('**/*.*'))
|
48
|
+
|
49
|
+
files.flatten.compact.uniq.each do |file|
|
50
|
+
copy_file(file)
|
51
|
+
end
|
52
|
+
|
53
|
+
Dir.glob(Mack::Paths.bin('**/*')).each do |file|
|
54
|
+
copy_bin_file(file)
|
55
|
+
end
|
56
|
+
|
57
|
+
copy_bin_file(Mack::Paths.root('README'))
|
58
|
+
|
59
|
+
end # prepare
|
60
|
+
|
61
|
+
def package # :nodoc:
|
62
|
+
FileUtils.rm_rf(Mack::Paths.root('pkg'), :verbose => configatron.mack.portlet.verbose)
|
63
|
+
FileUtils.cd(Mack::Paths.portlet_package, :verbose => configatron.mack.portlet.verbose)
|
64
|
+
load Mack::Paths.portlet_config('portlet.spec')
|
65
|
+
Rake::GemPackageTask.new(Mack::Portlet.portlet_spec) do |pkg|
|
66
|
+
pkg.need_zip = configatron.mack.portlet.need_zip
|
67
|
+
pkg.need_tar = configatron.mack.portlet.need_tar
|
68
|
+
pkg.package_dir = Mack::Paths.root('pkg')
|
69
|
+
end
|
70
|
+
Rake::Task['package'].invoke
|
71
|
+
FileUtils.cd(Mack.root, :verbose => configatron.mack.portlet.verbose)
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
def copy_file(file)
|
76
|
+
n_path = file.gsub(Mack.root, '')
|
77
|
+
n_path = Mack::Paths.portlet_package('lib', @portlet_spec.name, n_path)
|
78
|
+
FileUtils.mkdir_p(File.dirname(n_path), :verbose => configatron.mack.portlet.verbose)
|
79
|
+
FileUtils.cp(file, n_path, :verbose => configatron.mack.portlet.verbose)
|
80
|
+
end
|
81
|
+
|
82
|
+
def copy_bin_file(file)
|
83
|
+
n_path = file.gsub(Mack.root, '')
|
84
|
+
n_path = Mack::Paths.portlet_package(n_path)
|
85
|
+
FileUtils.mkdir_p(File.dirname(n_path), :verbose => configatron.mack.portlet.verbose)
|
86
|
+
FileUtils.cp(file, n_path, :verbose => configatron.mack.portlet.verbose)
|
87
|
+
end
|
88
|
+
|
89
|
+
end # class << self
|
90
|
+
|
91
|
+
end # Portlet
|
92
|
+
|
93
|
+
end # Mack
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Mack
|
2
|
+
module Portlet
|
3
|
+
class Unpacker < Mack::Utils::RegistryMap
|
4
|
+
|
5
|
+
def unpack(key, force = false)
|
6
|
+
m = self.registered_items[key.to_sym]
|
7
|
+
if m
|
8
|
+
m.call((force || false))
|
9
|
+
else
|
10
|
+
Mack.search_path(key.to_sym, false).each do |path|
|
11
|
+
Dir.glob(File.join(path, '**/*')).each do |f|
|
12
|
+
f = File.expand_path(f)
|
13
|
+
dest = f.gsub(path, Mack::Paths.send(key))
|
14
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
15
|
+
if File.file?(f)
|
16
|
+
cp = File.exists?(dest) ? force : true
|
17
|
+
if cp
|
18
|
+
FileUtils.cp(f, f.gsub(path, Mack::Paths.send(key)), :verbose => true) if cp
|
19
|
+
else
|
20
|
+
puts "Skipping: #{dest}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def initial_state
|
29
|
+
{}
|
30
|
+
end
|
31
|
+
|
32
|
+
end # Unpacker
|
33
|
+
end # Portlet
|
34
|
+
end # Mack
|
@@ -22,14 +22,14 @@ module Mack
|
|
22
22
|
eruby.result(binding)
|
23
23
|
rescue NoMethodError => e
|
24
24
|
if file_name
|
25
|
-
m = NoMethodError.new("undefined method `#{e.name}' for #{e.backtrace[0].match(/(^.+:\d)/).captures.first}")
|
25
|
+
m = NoMethodError.new("undefined method `#{e.name}' for #{e.backtrace[0].match(/(^.+:\d+)/).captures.first}")
|
26
26
|
m.set_backtrace(e.backtrace)
|
27
27
|
raise m
|
28
28
|
end
|
29
29
|
raise e
|
30
30
|
rescue NameError => e
|
31
31
|
if file_name
|
32
|
-
m = NameError.new("undefined local variable or method `#{e.name}' for #{e.backtrace[0].match(/(^.+:\d)/).captures.first}")
|
32
|
+
m = NameError.new("undefined local variable or method `#{e.name}' for #{e.backtrace[0].match(/(^.+:\d+)/).captures.first}")
|
33
33
|
m.set_backtrace(e.backtrace)
|
34
34
|
raise m
|
35
35
|
end
|
@@ -10,10 +10,14 @@ module Mack
|
|
10
10
|
# Since engines are stored in an array, the are looped through until a template is found on disk.
|
11
11
|
# If no template is found then a Mack::Errors::ResourceNotFound exception is thrown.
|
12
12
|
def render_file(file, type = :action)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
# we want to look local first, hence the reverse
|
14
|
+
Mack.search_path_local_first(:app).each do |path|
|
15
|
+
tfile = file.gsub(Mack::Paths.app, path)
|
16
|
+
Mack::Rendering::Engine::Registry.engines[type].each do |e|
|
17
|
+
@engine = find_engine(e).new(self.view_template)
|
18
|
+
find_file(tfile + ".#{@engine.extension}") do |f|
|
19
|
+
return @engine.render(File.new(f), self._binder)
|
20
|
+
end
|
17
21
|
end
|
18
22
|
end
|
19
23
|
raise Mack::Errors::ResourceNotFound.new(file + ".*")
|
@@ -13,8 +13,10 @@ module Mack
|
|
13
13
|
if File.extname(p_file).blank?
|
14
14
|
p_file = "#{p_file}.#{self._options[:format]}"
|
15
15
|
end
|
16
|
-
|
17
|
-
|
16
|
+
Mack.search_path(:public).each do |path|
|
17
|
+
find_file(File.join(path, p_file)) do |f|
|
18
|
+
return File.open(f).read
|
19
|
+
end
|
18
20
|
end
|
19
21
|
raise Mack::Errors::ResourceNotFound.new(p_file)
|
20
22
|
end
|
@@ -6,27 +6,53 @@ module Mack
|
|
6
6
|
|
7
7
|
attr_accessor :controller
|
8
8
|
attr_accessor :routes
|
9
|
+
attr_accessor :resources
|
9
10
|
|
10
|
-
def initialize(controller)
|
11
|
+
def initialize(controller, resources = [])
|
11
12
|
self.controller = controller
|
12
13
|
self.routes = []
|
14
|
+
self.resources = resources
|
13
15
|
end
|
14
16
|
|
15
17
|
def method_missing(sym, *args)
|
16
18
|
connect(sym, *args)
|
17
19
|
end
|
18
20
|
|
21
|
+
def resource(name, options = {}, &block)
|
22
|
+
if block_given?
|
23
|
+
proxy = Mack::Routes::ResourceProxy.new(name, [self.resources, name].flatten)
|
24
|
+
yield proxy
|
25
|
+
proxy.routes.each do |route|
|
26
|
+
Mack::Routes::RouteMap.instance.connect_with_name("#{name}_#{route[:name]}", route[:path], options.merge(route[:options]))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
Mack::Routes::RouteMap.instance.build_resource_routes(name, compile_path(name, self.resources), name, options)
|
30
|
+
end
|
31
|
+
|
19
32
|
private
|
20
33
|
def connect(name, path, options = {})
|
21
34
|
route = {}
|
22
35
|
route[:name] = name.to_s.gsub(/^#{self.controller}/, '')
|
23
36
|
route[:options] = {:controller => self.controller, :action => route[:name].to_sym, :method => :get}.merge(options)
|
24
|
-
paths =
|
25
|
-
paths.
|
26
|
-
|
37
|
+
paths = compile_path(self.controller, self.resources.reject{|m| m === self.resources.last}).split('/')
|
38
|
+
paths << path.split('/')
|
39
|
+
paths.flatten!
|
40
|
+
paths.compact!
|
41
|
+
paths.uniq!
|
42
|
+
route[:path] = paths.reject{|m| m.blank?}.join('/')
|
27
43
|
routes << route
|
28
44
|
end
|
29
45
|
|
46
|
+
def compile_path(name, res)
|
47
|
+
x = []
|
48
|
+
res.each do |r|
|
49
|
+
x << r
|
50
|
+
x << ":#{r.to_s.singular}_id"
|
51
|
+
end
|
52
|
+
x << name
|
53
|
+
x.compact.join('/')
|
54
|
+
end
|
55
|
+
|
30
56
|
end # ResourceProxy
|
31
57
|
|
32
58
|
end # Routes
|