mack 0.5.0 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +19 -0
- data/bin/mack +3 -2
- data/bin/mack_ring_server +19 -1
- data/lib/{sea_level/controller_base.rb → controller/base.rb} +87 -128
- data/lib/{sea_level → controller}/cookie_jar.rb +3 -3
- data/lib/{sea_level → controller}/filter.rb +0 -0
- data/lib/{sea_level → controller}/request.rb +0 -0
- data/lib/{sea_level → controller}/response.rb +0 -0
- data/lib/{sea_level → controller}/session.rb +0 -0
- data/lib/{sea_level → controller}/uploaded_file.rb +0 -0
- data/lib/distributed/routing/urls.rb +1 -1
- data/lib/distributed/utils/rinda.rb +1 -1
- data/lib/errors/errors.rb +6 -4
- data/lib/generators/mack_application_generator/templates/config/initializers/mime_types.rb.template +3 -0
- data/lib/generators/mack_application_generator/templates/public/favicon.ico.template +0 -0
- data/lib/initialization/configuration.rb +2 -1
- data/lib/initialization/console.rb +2 -2
- data/lib/initialization/{initializers/logging.rb → logging.rb} +0 -0
- data/lib/initialization/{initializers/orm_support.rb → orm_support.rb} +0 -0
- data/lib/initialization/{initializers/plugins.rb → plugins.rb} +0 -0
- data/lib/mack.rb +107 -131
- data/lib/mack_tasks.rb +1 -1
- data/lib/rendering/engine/base.rb +26 -0
- data/lib/rendering/engine/builder.rb +30 -0
- data/lib/rendering/engine/erubis.rb +67 -0
- data/lib/rendering/engine/haml.rb +18 -0
- data/lib/rendering/engine/markaby.rb +27 -0
- data/lib/rendering/engine/registry.rb +48 -0
- data/lib/rendering/type/action.rb +37 -0
- data/lib/rendering/type/base.rb +59 -0
- data/lib/rendering/type/file_base.rb +32 -0
- data/lib/rendering/type/inline.rb +26 -0
- data/lib/rendering/type/layout.rb +26 -0
- data/lib/rendering/type/partial.rb +40 -0
- data/lib/rendering/type/public.rb +29 -0
- data/lib/rendering/type/template.rb +22 -0
- data/lib/rendering/type/text.rb +17 -0
- data/lib/rendering/type/url.rb +120 -0
- data/lib/rendering/type/xml.rb +34 -0
- data/lib/rendering/view_template.rb +168 -0
- data/lib/routing/route_map.rb +20 -11
- data/lib/runner.rb +137 -0
- data/lib/utils/mime_types.rb +56 -0
- data/lib/utils/mime_types.yml +449 -0
- data/lib/{sea_level/helpers/view_helpers → view_helpers}/html_helpers.rb +0 -0
- data/lib/{sea_level/helpers/view_helpers → view_helpers}/string_helpers.rb +0 -0
- metadata +58 -29
- data/lib/initialization/initializer.rb +0 -110
- data/lib/rendering/base.rb +0 -62
- data/lib/rendering/classes/action.rb +0 -26
- data/lib/rendering/classes/partial.rb +0 -12
- data/lib/rendering/classes/public.rb +0 -13
- data/lib/rendering/classes/text.rb +0 -12
- data/lib/rendering/classes/url.rb +0 -59
- data/lib/rendering/classes/xml.rb +0 -24
- data/lib/sea_level/view_binder.rb +0 -88
data/lib/errors/errors.rb
CHANGED
@@ -6,8 +6,8 @@ module Mack
|
|
6
6
|
# Example:
|
7
7
|
# class FooController < Mack::Controller::Base
|
8
8
|
# def index
|
9
|
-
# render(:text
|
10
|
-
# render(:action
|
9
|
+
# render(:text, "Hello World")
|
10
|
+
# render(:action, "edit")
|
11
11
|
# end
|
12
12
|
# end
|
13
13
|
class DoubleRender < StandardError
|
@@ -86,12 +86,14 @@ module Mack
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
-
# Potentially raised if a render(:url
|
89
|
+
# Potentially raised if a render(:url, "....") is a status other than 200.
|
90
90
|
# This is only raised if :raise_exception is passed in as true to the render options.
|
91
91
|
class UnsuccessfulRenderUrl < StandardError
|
92
92
|
# Takes the uri trying to be rendered the Net::HTTP response object.
|
93
93
|
def initialize(uri, response)
|
94
|
-
|
94
|
+
code = response.code if response.respond_to?(:code)
|
95
|
+
code = response.status if response.respond_to?(:status)
|
96
|
+
super("URI: #{uri}; status: #{code}")
|
95
97
|
end
|
96
98
|
end
|
97
99
|
|
File without changes
|
@@ -59,7 +59,8 @@ module Mack
|
|
59
59
|
DEFAULTS_TEST = {
|
60
60
|
"log::level" => "error",
|
61
61
|
"run_remote_tests" => true,
|
62
|
-
"mack::drb_timeout" => 0
|
62
|
+
"mack::drb_timeout" => 0,
|
63
|
+
"mack::cookie_values" => {}
|
63
64
|
} unless self.const_defined?("DEFAULTS_TEST")
|
64
65
|
|
65
66
|
unless self.const_defined?("DEFAULTS")
|
@@ -5,10 +5,10 @@
|
|
5
5
|
# * Mack::TestHelpers
|
6
6
|
# * Mack::Routes::Urls
|
7
7
|
|
8
|
-
require File.join(File.dirname(__FILE__), "initializer")
|
9
|
-
|
10
8
|
fl = File.join(File.dirname(__FILE__), "..")
|
11
9
|
|
10
|
+
require File.join(fl, "mack")
|
11
|
+
|
12
12
|
require File.join(fl, "test_extensions", "test_helpers")
|
13
13
|
|
14
14
|
# self.send(:include, Mack::TestHelpers)
|
File without changes
|
File without changes
|
File without changes
|
data/lib/mack.rb
CHANGED
@@ -1,139 +1,115 @@
|
|
1
|
-
require
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rack'
|
3
|
+
require 'digest'
|
4
|
+
require 'mack_ruby_core_extensions'
|
5
|
+
require 'application_configuration'
|
6
|
+
require 'cachetastic'
|
7
|
+
require 'fileutils'
|
8
|
+
require 'log4r'
|
9
|
+
require 'crypt/rijndael'
|
10
|
+
require 'singleton'
|
11
|
+
require 'uri'
|
12
|
+
require 'drb'
|
13
|
+
require 'rinda/ring'
|
14
|
+
require 'rinda/tuplespace'
|
15
|
+
require 'builder'
|
16
|
+
require 'erubis'
|
17
|
+
require 'erb'
|
18
|
+
require 'markaby'
|
19
|
+
require 'haml'
|
20
|
+
require 'genosaurus'
|
21
|
+
require 'net/http'
|
2
22
|
|
3
|
-
|
4
|
-
# This is the heart and soul of the Mack framework! This class interfaces with the Rack framework.
|
5
|
-
# It handles all the dispatching back and forth between the Rack framework and a Mack application.
|
6
|
-
class Runner
|
7
|
-
include Mack::Routes::Urls
|
8
|
-
|
9
|
-
attr_reader :response # :nodoc:
|
10
|
-
attr_reader :request # :nodoc:
|
11
|
-
attr_reader :cookies # :nodoc:
|
12
|
-
# This method needs to be defined as part of the Rack framework. As is noted for the Mack::Runner
|
13
|
-
# class, this is where the center of the Mack framework lies.
|
14
|
-
def call(env)
|
15
|
-
# pp env
|
16
|
-
begin
|
17
|
-
setup(env) do
|
18
|
-
begin
|
19
|
-
route = Mack::Routes::RouteMap.instance.get_route_from_request(self.request)
|
20
|
-
if route[:redirect_to]
|
21
|
-
# because the route is specified to be a redirect, let's do that:
|
22
|
-
redirect_to(route)
|
23
|
-
else
|
24
|
-
# let's handle a normal request:
|
25
|
-
begin
|
26
|
-
cont = "#{route[:controller].to_s.camelcase}Controller".constantize
|
27
|
-
rescue NameError => e
|
28
|
-
raise Mack::Errors::ResourceNotFound.new(self.request.path_info)
|
29
|
-
end
|
30
|
-
c = cont.new(self.request, self.response, self.cookies)
|
31
|
-
self.response.controller = c
|
32
|
-
self.response.write(c.run)
|
33
|
-
end
|
34
|
-
rescue Mack::Errors::ResourceNotFound, Mack::Errors::UndefinedRoute => e
|
35
|
-
return try_to_find_resource(env, e)
|
36
|
-
end
|
37
|
-
end # setup
|
38
|
-
rescue Exception => e
|
39
|
-
MACK_DEFAULT_LOGGER.error(e)
|
40
|
-
raise e
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
def log_request
|
46
|
-
s_time = Time.now
|
47
|
-
x = yield
|
48
|
-
e_time = Time.now
|
49
|
-
p_time = e_time - s_time
|
50
|
-
if app_config.log.detailed_requests
|
51
|
-
msg = "\n\t[#{@request.request_method.upcase}] '#{@request.path_info}'\n"
|
52
|
-
msg << "\tSession ID: #{@request.session.id}\n"
|
53
|
-
msg << "\tParameters: #{@request.all_params.inspect}\n"
|
54
|
-
msg << "\tCompleted in #{p_time} (#{(1 / p_time).round} reqs/sec) | #{@response.status} [#{@request.full_host}]"
|
55
|
-
else
|
56
|
-
msg = "[#{@request.request_method.upcase}] '#{@request.path_info}' (#{p_time})"
|
57
|
-
end
|
58
|
-
MACK_DEFAULT_LOGGER.info(msg)
|
59
|
-
x
|
60
|
-
end
|
61
|
-
|
62
|
-
# Setup the request, response, cookies, session, etc...
|
63
|
-
# yield up, and then clean things up afterwards.
|
64
|
-
def setup(env)
|
65
|
-
exception = nil
|
66
|
-
log_request do
|
67
|
-
@request = Mack::Request.new(env)
|
68
|
-
@response = Mack::Response.new
|
69
|
-
@cookies = Mack::CookieJar.new(self.request, self.response)
|
70
|
-
session do
|
71
|
-
begin
|
72
|
-
yield
|
73
|
-
rescue Exception => e
|
74
|
-
exception = e
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
raise exception if exception
|
79
|
-
self.response.finish
|
80
|
-
end
|
81
|
-
|
82
|
-
def session
|
83
|
-
sess_id = self.cookies[app_config.mack.session_id]
|
84
|
-
unless sess_id
|
85
|
-
sess_id = create_new_session
|
86
|
-
else
|
87
|
-
sess = Cachetastic::Caches::MackSessionCache.get(sess_id)
|
88
|
-
if sess
|
89
|
-
self.request.session = sess
|
90
|
-
else
|
91
|
-
# we couldn't find it in the store, so we need to create it:
|
92
|
-
sess_id = create_new_session
|
93
|
-
end
|
94
|
-
end
|
23
|
+
require File.join(File.dirname(__FILE__), "initialization", "configuration.rb")
|
95
24
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
25
|
+
unless Mack::Configuration.initialized
|
26
|
+
|
27
|
+
puts "Starting application in #{Mack::Configuration.env} mode."
|
28
|
+
puts "Mack root: #{Mack::Configuration.root}"
|
29
|
+
|
30
|
+
require File.join(File.dirname(__FILE__), "initialization", "logging.rb")
|
31
|
+
|
32
|
+
require File.join(File.dirname(__FILE__), "initialization", "orm_support.rb")
|
33
|
+
|
34
|
+
fl = File.join(File.dirname(__FILE__))
|
35
|
+
|
36
|
+
# Require all the necessary files to make Mack actually work!
|
37
|
+
["distributed", "errors", "core_extensions", "utils", "test_extensions", "routing", "view_helpers", "rendering", "controller", "tasks", "initialization/server", "generators"].each do |dir|
|
38
|
+
dir_globs = Dir.glob(File.join(fl, dir, "**/*.rb"))
|
39
|
+
dir_globs.each do |d|
|
40
|
+
require d
|
108
41
|
end
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
# ------------------------------------------------------------------------
|
47
|
+
|
48
|
+
# set up application stuff:
|
49
|
+
|
50
|
+
# set up routes:
|
51
|
+
require File.join(Mack::Configuration.config_directory, "routes")
|
52
|
+
|
53
|
+
# set up initializers:
|
54
|
+
Dir.glob(File.join(Mack::Configuration.config_directory, "initializers", "**/*.rb")) do |d|
|
55
|
+
require d
|
56
|
+
end
|
57
|
+
Mack::Utils::GemManager.instance.do_requires
|
58
|
+
|
59
|
+
# require 'plugins':
|
60
|
+
require File.join(File.dirname(__FILE__), "initialization", "plugins.rb")
|
61
|
+
|
62
|
+
# make sure that default_controller is available to other controllers
|
63
|
+
path = File.join(Mack::Configuration.app_directory, "controllers", "default_controller.rb")
|
64
|
+
require path if File.exists?(path)
|
65
|
+
|
66
|
+
# require 'app' files:
|
67
|
+
Dir.glob(File.join(Mack::Configuration.app_directory, "**/*.rb")).each do |d|
|
68
|
+
# puts "d: #{d}"
|
69
|
+
begin
|
70
|
+
require d
|
71
|
+
rescue NameError => e
|
72
|
+
if e.message.match("uninitialized constant")
|
73
|
+
mod = e.message.gsub("uninitialized constant ", "")
|
74
|
+
x =%{
|
75
|
+
module ::#{mod}
|
76
|
+
end
|
77
|
+
}
|
78
|
+
eval(x)
|
79
|
+
require d
|
118
80
|
else
|
119
|
-
raise
|
81
|
+
raise e
|
120
82
|
end
|
121
83
|
end
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
84
|
+
end
|
85
|
+
|
86
|
+
# require 'lib' files:
|
87
|
+
Dir.glob(File.join(Mack::Configuration.lib_directory, "**/*.rb")).each do |d|
|
88
|
+
require d
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
# ------------------------------------------------------------------------
|
93
|
+
|
94
|
+
# Include ApplicationHelper into all controllers:
|
95
|
+
if Object.const_defined?("ApplicationHelper")
|
96
|
+
ApplicationHelper.include_safely_into(Mack::Controller::Base, Mack::Rendering::ViewTemplate)
|
97
|
+
end
|
98
|
+
# Find other Helpers and include them into their respective controllers.
|
99
|
+
Object.constants.collect {|c| c if c.match(/Controller$/)}.compact.each do |cont|
|
100
|
+
if Object.const_defined?("#{cont}Helper")
|
101
|
+
h = "#{cont}Helper".constantize
|
102
|
+
h.include_safely_into(cont, Mack::Rendering::ViewTemplate)
|
136
103
|
end
|
137
|
-
|
138
104
|
end
|
139
|
-
|
105
|
+
|
106
|
+
# Find view level Helpers and include them into the Mack::Rendering::ViewTemplate
|
107
|
+
Mack::ViewHelpers.constants.each do |cont|
|
108
|
+
h = "Mack::ViewHelpers::#{cont}".constantize
|
109
|
+
h.include_safely_into(Mack::Rendering::ViewTemplate)
|
110
|
+
end
|
111
|
+
|
112
|
+
Mack::Configuration.set(:initialized, "true") if Mack::Configuration.initialized.nil?
|
113
|
+
end
|
114
|
+
|
115
|
+
require File.join(File.dirname(__FILE__), "runner")
|
data/lib/mack_tasks.rb
CHANGED
@@ -5,7 +5,7 @@ require 'rubygems'
|
|
5
5
|
require 'application_configuration'
|
6
6
|
|
7
7
|
require File.join(File.dirname(__FILE__), "initialization", "configuration.rb")
|
8
|
-
require File.join(File.dirname(__FILE__), "initialization", "
|
8
|
+
require File.join(File.dirname(__FILE__), "initialization", "orm_support.rb")
|
9
9
|
|
10
10
|
# Requires all rake tasks that ship with the Mack framework.
|
11
11
|
[File.join(File.dirname(__FILE__)), File.join(FileUtils.pwd, "lib"), File.join(FileUtils.pwd, "vendor", "plugins")].each do |dir|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Mack
|
2
|
+
module Rendering # :nodoc:
|
3
|
+
module Engine # :nodoc:
|
4
|
+
# Engines are used to transform a IO, using a supplied binding to a String.
|
5
|
+
#
|
6
|
+
# The method 'render' needs to be implemented as render(io, binding) in all subclasses.
|
7
|
+
class Base
|
8
|
+
|
9
|
+
# The Mack::Rendering::ViewTemplate object to be used with this engine.
|
10
|
+
attr_reader :view_template
|
11
|
+
|
12
|
+
def initialize(view_template)
|
13
|
+
@view_template = view_template
|
14
|
+
end
|
15
|
+
|
16
|
+
# See Mack::Rendering::ViewTemplate content_for for more details.
|
17
|
+
def capture(*args, &block)
|
18
|
+
yield
|
19
|
+
end
|
20
|
+
|
21
|
+
needs_method :render
|
22
|
+
|
23
|
+
end # Base
|
24
|
+
end # Engines
|
25
|
+
end # Rendering
|
26
|
+
end # Mack
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "view_template")
|
2
|
+
module Mack
|
3
|
+
module Rendering # :nodoc:
|
4
|
+
module Engine # :nodoc:
|
5
|
+
# Allows use of the Builder::XmlMarkup engine to be used with rendering.
|
6
|
+
class Builder < Mack::Rendering::Engine::Base
|
7
|
+
|
8
|
+
def render(io, binding)
|
9
|
+
@_xml = ::Builder::XmlMarkup.new(:target => @_xml_output, :indent => 1)
|
10
|
+
view_template.instance_variable_set("@_xml", @_xml)
|
11
|
+
eval(io, binding)
|
12
|
+
end
|
13
|
+
|
14
|
+
def extension
|
15
|
+
:builder
|
16
|
+
end
|
17
|
+
|
18
|
+
# Used to give XmlBuilder templates access to a 'root' xml object.
|
19
|
+
module ViewTemplateHelpers
|
20
|
+
def xml
|
21
|
+
@_xml
|
22
|
+
end
|
23
|
+
end # ViewTemplateHelpers
|
24
|
+
|
25
|
+
end # Builder
|
26
|
+
end # Engine
|
27
|
+
end # Rendering
|
28
|
+
end # Mack
|
29
|
+
|
30
|
+
Mack::Rendering::ViewTemplate.send(:include, Mack::Rendering::Engine::Builder::ViewTemplateHelpers)
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Mack
|
2
|
+
module Rendering # :nodoc:
|
3
|
+
module Engine # :nodoc:
|
4
|
+
# Allows use of the Builder::XmlMarkup engine to be used with rendering.
|
5
|
+
class Erubis < Mack::Rendering::Engine::Base
|
6
|
+
|
7
|
+
def render(io, binding)
|
8
|
+
src = Mack::Rendering::Engine::Erubis::TemplateCache.instance.cache[io]
|
9
|
+
if src.nil?
|
10
|
+
src = ::Erubis::Eruby.new(io).src
|
11
|
+
Mack::Rendering::Engine::Erubis::TemplateCache.instance.cache[io] = src
|
12
|
+
end
|
13
|
+
eval(src, binding)
|
14
|
+
end
|
15
|
+
|
16
|
+
def extension
|
17
|
+
:erb
|
18
|
+
end
|
19
|
+
|
20
|
+
def concat(txt, b)
|
21
|
+
eval( "_buf", b) << txt
|
22
|
+
end
|
23
|
+
|
24
|
+
# See Mack::Rendering::ViewTemplate content_for for more details.
|
25
|
+
# Thanks Merb.
|
26
|
+
def capture(*args, &block)
|
27
|
+
# get the buffer from the block's binding
|
28
|
+
buffer = _erb_buffer( block.binding ) rescue nil
|
29
|
+
|
30
|
+
# If there is no buffer, just call the block and get the contents
|
31
|
+
if buffer.nil?
|
32
|
+
block.call(*args)
|
33
|
+
# If there is a buffer, execute the block, then extract its contents
|
34
|
+
else
|
35
|
+
pos = buffer.length
|
36
|
+
block.call(*args)
|
37
|
+
|
38
|
+
# extract the block
|
39
|
+
data = buffer[pos..-1]
|
40
|
+
|
41
|
+
# replace it in the original with empty string
|
42
|
+
buffer[pos..-1] = ''
|
43
|
+
|
44
|
+
data
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def _erb_buffer( the_binding ) # :nodoc:
|
50
|
+
eval( "_buf", the_binding, __FILE__, __LINE__)
|
51
|
+
end
|
52
|
+
|
53
|
+
class TemplateCache # :nodoc:
|
54
|
+
include Singleton
|
55
|
+
|
56
|
+
attr_reader :cache
|
57
|
+
|
58
|
+
def initialize
|
59
|
+
@cache = {}
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end # Erubis
|
65
|
+
end # Engines
|
66
|
+
end # Rendering
|
67
|
+
end # Mack
|