mack 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +4 -0
- data/lib/errors/errors.rb +17 -0
- data/lib/generators/plugin_generator/plugin_generator.rb +1 -1
- data/lib/generators/scaffold_generator/scaffold_generator.rb +1 -6
- data/lib/initialization/configuration.rb +6 -0
- data/lib/initialization/initializer.rb +1 -1
- data/lib/rendering/base.rb +58 -0
- data/lib/rendering/classes/action.rb +26 -0
- data/lib/rendering/classes/partial.rb +12 -0
- data/lib/rendering/classes/public.rb +13 -0
- data/lib/rendering/classes/text.rb +12 -0
- data/lib/rendering/classes/url.rb +58 -0
- data/lib/sea_level/controller_base.rb +26 -0
- data/lib/sea_level/view_binder.rb +8 -38
- data/lib/test_extensions/test_helpers.rb +6 -0
- metadata +8 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
===0.2.0
|
2
|
+
* ticket: 3 Render url in Controllers/Views
|
3
|
+
* ticket: 5 Render Extension System.
|
4
|
+
|
1
5
|
===0.1.0
|
2
6
|
* Added an inflections system. The default inflections are from Jeremy McAnally's great Rails plugin, acts_as_good_speeler. Thanks Jeremy! http://www.jeremymcanally.com/
|
3
7
|
* Added a to_params method to Hash to help with testing.
|
data/lib/errors/errors.rb
CHANGED
@@ -83,5 +83,22 @@ module Mack
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
+
# Potentially raised if a render(:url => "....") is a status other than 200.
|
87
|
+
# This is only raised if :raise_exception is passed in as true to the render options.
|
88
|
+
class UnsuccessfulRenderUrl < StandardError
|
89
|
+
# Takes the uri trying to be rendered the Net::HTTP response object.
|
90
|
+
def initialize(uri, response)
|
91
|
+
super("URI: #{uri}; status: #{response.code}; body: #{response.body}")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Raised if an unsupported method, ie post or delete, is used with render url.
|
96
|
+
class UnsupportRenderUrlMethodType < StandardError
|
97
|
+
# Takes the method tried.
|
98
|
+
def initialize(method)
|
99
|
+
super("METHOD: #{method.to_s.upcase} is unsupported by render url.")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
86
103
|
end # Errors
|
87
104
|
end # Mack
|
@@ -11,7 +11,7 @@ class PluginGenerator < Mack::Generator::Base
|
|
11
11
|
|
12
12
|
require_param :name
|
13
13
|
|
14
|
-
def generate
|
14
|
+
def generate # :nodoc:
|
15
15
|
plugin_dir = File.join(MACK_ROOT, "vendor", "plugins", param(:name).downcase)
|
16
16
|
template_dir = File.join(File.dirname(__FILE__), "templates")
|
17
17
|
|
@@ -2,16 +2,11 @@
|
|
2
2
|
#
|
3
3
|
# Example:
|
4
4
|
# rake generate:scaffold name=post
|
5
|
-
# This will generate the following in your mack application:
|
6
|
-
# vendor/plugins/my_cool_plugin
|
7
|
-
# vendor/plugins/my_cool_plugin/init.rb
|
8
|
-
# vendor/plugins/my_cool_plugin/lib
|
9
|
-
# vendor/plugins/my_cool_plugin/lib/my_cool_plugin.rb
|
10
5
|
class ScaffoldGenerator < Mack::Generator::Base
|
11
6
|
|
12
7
|
require_param :name
|
13
8
|
|
14
|
-
def generate
|
9
|
+
def generate # :nodoc:
|
15
10
|
@name_singular = param(:name).singular
|
16
11
|
@name_plural = param(:name).plural
|
17
12
|
@name_singular_camel = @name_singular.camelcase
|
@@ -40,6 +40,7 @@ module Mack
|
|
40
40
|
# use local memory and store stuff for 5 minutes:
|
41
41
|
DEFAULTS_DEVELOPMENT = {
|
42
42
|
"mack::cache_classes" => false,
|
43
|
+
"mack::default_domain" => "http://localhost:3000",
|
43
44
|
"log::level" => "debug",
|
44
45
|
"log::console" => true,
|
45
46
|
"cachetastic_default_options" => {
|
@@ -57,7 +58,10 @@ module Mack
|
|
57
58
|
|
58
59
|
# use local memory and store stuff for 1 hour:
|
59
60
|
DEFAULTS_TEST = {
|
61
|
+
"mack::default_domain" => "http://localhost",
|
62
|
+
"mack::default_domain_port" => 6666,
|
60
63
|
"log::level" => "error",
|
64
|
+
"run_remote_tests" => true,
|
61
65
|
"cachetastic_default_options" => {
|
62
66
|
"debug" => false,
|
63
67
|
"adapter" => "local_memory",
|
@@ -73,10 +77,12 @@ module Mack
|
|
73
77
|
|
74
78
|
unless self.const_defined?("DEFAULTS")
|
75
79
|
DEFAULTS = {
|
80
|
+
"mack::render_url_timeout" => 5,
|
76
81
|
"mack::cache_classes" => true,
|
77
82
|
"mack::use_lint" => true,
|
78
83
|
"mack::show_exceptions" => true,
|
79
84
|
"mack::session_id" => "_mack_session_id",
|
85
|
+
"mack::rendering_systems" => [:action, :text, :partial, :public, :url],
|
80
86
|
"mack::cookie_values" => {
|
81
87
|
"path" => "/"
|
82
88
|
},
|
@@ -40,7 +40,7 @@ unless Object.const_defined?("MACK_INITIALIZED")
|
|
40
40
|
fl = File.join(File.dirname(__FILE__), "..")
|
41
41
|
|
42
42
|
# Require all the necessary files to make Mack actually work!
|
43
|
-
["errors", "core_extensions", "utils", "test_extensions", "routing", "sea_level", "tasks", "initialization/server", "generators"].each do |dir|
|
43
|
+
["errors", "core_extensions", "utils", "test_extensions", "routing", "rendering", "sea_level", "tasks", "initialization/server", "generators"].each do |dir|
|
44
44
|
dir_globs = Dir.glob(File.join(fl, dir, "**/*.rb"))
|
45
45
|
dir_globs.each do |d|
|
46
46
|
require d
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Mack
|
2
|
+
module Rendering
|
3
|
+
# This is the base class from which all rendering systems need to extend.
|
4
|
+
#
|
5
|
+
# Example:
|
6
|
+
# class Mack::Rendering::Pdf < Mack::Rendering::Base
|
7
|
+
# def render
|
8
|
+
# # do work to render stuff as a PDF
|
9
|
+
# end
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# Now add this to the list of available render systems:
|
13
|
+
# app_config.mack.rendering_systems << :pdf
|
14
|
+
#
|
15
|
+
# You should now be able to do this in your controller:
|
16
|
+
#
|
17
|
+
# class MyAwesomeController < Mack::Controller::Base
|
18
|
+
# def pdf
|
19
|
+
# render(:pdf => "my_pdf_template")
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
class Base
|
23
|
+
|
24
|
+
attr_accessor :view_binder # The Mack::ViewBinder that called this rendering system.
|
25
|
+
attr_accessor :options # The options associated with this render call
|
26
|
+
|
27
|
+
def initialize(view_binder, options)
|
28
|
+
self.view_binder = view_binder
|
29
|
+
self.options = options
|
30
|
+
end
|
31
|
+
|
32
|
+
# This is the only method that needs to be implemented by a rendering system.
|
33
|
+
# It should return a String.
|
34
|
+
def render
|
35
|
+
raise MethodNotImplemented.new("render")
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
# Used to render a file from disk.
|
40
|
+
def render_file(f, options = {})
|
41
|
+
options = {:is_partial => false, :ext => ".html.erb", :dir => MACK_VIEWS}.merge(options)
|
42
|
+
partial = f.to_s
|
43
|
+
parts = partial.split("/")
|
44
|
+
if parts.size == 1
|
45
|
+
# it's local to this controller
|
46
|
+
partial = "_" << partial if options[:is_partial]
|
47
|
+
partial = File.join(options[:dir], self.view_binder.controller.controller_name, partial + options[:ext])
|
48
|
+
else
|
49
|
+
# it's elsewhere
|
50
|
+
parts[parts.size - 1] = "_" << parts.last if options[:is_partial]
|
51
|
+
partial = File.join(options[:dir], parts.join("/") + options[:ext])
|
52
|
+
end
|
53
|
+
return Mack::ViewBinder.render(File.open(partial).read, self.view_binder.controller, options)
|
54
|
+
end
|
55
|
+
|
56
|
+
end # Base
|
57
|
+
end # Rendering
|
58
|
+
end # Mack
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Mack
|
2
|
+
module Rendering
|
3
|
+
# Used when someone calls render(:action => "index")
|
4
|
+
class Action < Base
|
5
|
+
|
6
|
+
def render
|
7
|
+
begin
|
8
|
+
# Try to render the action:
|
9
|
+
return render_file(options[:action], options)
|
10
|
+
rescue Errno::ENOENT => e
|
11
|
+
begin
|
12
|
+
# If the action doesn't exist on disk, try to render it from the public directory:
|
13
|
+
t = render_file(options[:action], {:dir => MACK_PUBLIC, :ext => ".html", :layout => false}.merge(options))
|
14
|
+
# Because it's being served from public don't wrap a layout around it!
|
15
|
+
# self.controller.instance_variable_get("@render_options").merge!({:layout => false})
|
16
|
+
return t
|
17
|
+
rescue Errno::ENOENT => ex
|
18
|
+
end
|
19
|
+
# Raise the original exception because something bad has happened!
|
20
|
+
raise e
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Mack
|
2
|
+
module Rendering
|
3
|
+
# Used when someone calls render(:public => "index")
|
4
|
+
# This renders a file from the public directory.
|
5
|
+
class Public < Base
|
6
|
+
|
7
|
+
def render
|
8
|
+
render_file(options[:public], {:dir => MACK_PUBLIC, :ext => ".html", :layout => false}.merge(options))
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
module Mack
|
3
|
+
module Rendering
|
4
|
+
# Used when someone calls render(:url => "http://www.mackframework.com")
|
5
|
+
class Url < Base
|
6
|
+
|
7
|
+
def render
|
8
|
+
options = {:method => :get, :domain => app_config.mack.default_domain, :raise_exception => false}.merge(self.options)
|
9
|
+
case options[:method]
|
10
|
+
when :get
|
11
|
+
do_render_url(options) do |uri, options|
|
12
|
+
unless options[:parameters].empty?
|
13
|
+
uri = uri.to_s
|
14
|
+
uri << "?"
|
15
|
+
options[:parameters].each_pair do |k,v|
|
16
|
+
uri << URI.encode(k.to_s)
|
17
|
+
uri << "="
|
18
|
+
uri << URI.encode(v.to_s)
|
19
|
+
uri << "&"
|
20
|
+
end
|
21
|
+
uri.gsub!(/&$/, "")
|
22
|
+
uri = URI.parse(uri)
|
23
|
+
end
|
24
|
+
Net::HTTP.get_response(uri)
|
25
|
+
end
|
26
|
+
when :post
|
27
|
+
do_render_url(options) do |uri, options|
|
28
|
+
Net::HTTP.post_form(uri, options[:parameters] || {})
|
29
|
+
end
|
30
|
+
else
|
31
|
+
raise Mack::Errors::UnsupportRenderUrlMethodType.new(options[:method])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def do_render_url(options)
|
37
|
+
Timeout::timeout(app_config.mack.render_url_timeout || 5) do
|
38
|
+
url = options[:url]
|
39
|
+
unless url.match(/^[a-zA-Z]+:\/\//)
|
40
|
+
url = File.join(options[:domain], options[:url])
|
41
|
+
end
|
42
|
+
uri = URI.parse(url)
|
43
|
+
response = yield uri, options
|
44
|
+
if response.code == "200"
|
45
|
+
return response.body
|
46
|
+
else
|
47
|
+
if options[:raise_exception]
|
48
|
+
raise Mack::Errors::UnsuccessfulRenderUrl.new(uri, response)
|
49
|
+
else
|
50
|
+
return ""
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -148,6 +148,32 @@ module Mack
|
|
148
148
|
# def latest_news
|
149
149
|
# render(:partial => "some_other/old_news")
|
150
150
|
# end
|
151
|
+
#
|
152
|
+
# # This will render a url. If the url does not return a status code of '200',
|
153
|
+
# # an empty string will be returned by default. The default method for rendering
|
154
|
+
# # urls is a get.
|
155
|
+
# def yahoo
|
156
|
+
# render(:url => "http://www.yahoo.com")
|
157
|
+
# end
|
158
|
+
#
|
159
|
+
# # This will render a url. If the url does not return a status code of '200',
|
160
|
+
# # a Mack::Errors::UnsuccessfulRenderUrl exception will be raised.
|
161
|
+
# def idontexist
|
162
|
+
# render(:url => "http://www.idontexist.com", :raise_exception => true)
|
163
|
+
# end
|
164
|
+
#
|
165
|
+
# # This will render a url with a post.
|
166
|
+
# def post_to_somewhere
|
167
|
+
# render(:url => "http://www.mackframework.com/post_to_me", :method => :post,
|
168
|
+
# :parameters => {:id => 1, :user => "markbates"})
|
169
|
+
# end
|
170
|
+
#
|
171
|
+
# # This will render a 'local' url. If a domain is not present render url will
|
172
|
+
# # reach out for the config parameter "mack::default_domain" and prepend that
|
173
|
+
# # to the url. This can be overridden locally with the :domain option.
|
174
|
+
# def get_index
|
175
|
+
# render(:url => "/")
|
176
|
+
# end
|
151
177
|
# end
|
152
178
|
def render(options = {:action => self.action_name})
|
153
179
|
raise Mack::Errors::DoubleRender.new if render_performed?
|
@@ -32,52 +32,22 @@ class Mack::ViewBinder
|
|
32
32
|
# <%= render(:text => "Hello") %>
|
33
33
|
# <%= render(:action => "show") %>
|
34
34
|
# <%= render(:partial => :latest_news) %>
|
35
|
+
# <%= render(:url => "http://www.mackframework.com") %>
|
35
36
|
def render(options = {})
|
36
|
-
|
37
|
-
|
38
|
-
# Try to render the action:
|
39
|
-
return render_file(options[:action], options)
|
40
|
-
rescue Errno::ENOENT => e
|
37
|
+
app_config.mack.rendering_systems.each do |render_option|
|
38
|
+
if options[render_option]
|
41
39
|
begin
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
# self.controller.instance_variable_get("@render_options").merge!({:layout => false})
|
46
|
-
return t
|
47
|
-
rescue Errno::ENOENT => ex
|
40
|
+
rc = "Mack::Rendering::#{render_option.to_s.camelcase}".constantize.new(self, options)
|
41
|
+
rescue Exception => e
|
42
|
+
raise Mack::Errors::UnknownRenderOption.new(options)
|
48
43
|
end
|
49
|
-
|
50
|
-
raise e
|
44
|
+
return rc.render
|
51
45
|
end
|
52
|
-
elsif options[:text]
|
53
|
-
return Mack::ViewBinder.render(options[:text], self.controller, options)
|
54
|
-
elsif options[:partial]
|
55
|
-
return render_file(options[:partial], {:is_partial => true}.merge(options))
|
56
|
-
elsif options[:public]
|
57
|
-
t = render_file(options[:public], {:dir => MACK_PUBLIC, :ext => ".html", :layout => false}.merge(options))
|
58
|
-
# self.controller.instance_variable_get("@render_options").merge!({:layout => false})
|
59
|
-
return t
|
60
|
-
else
|
61
|
-
raise Mack::UnknownRenderOption.new(options)
|
62
46
|
end
|
47
|
+
raise Mack::Errors::UnknownRenderOption.new(options)
|
63
48
|
end
|
64
49
|
|
65
50
|
private
|
66
|
-
def render_file(f, options = {})
|
67
|
-
options = {:is_partial => false, :ext => ".html.erb", :dir => MACK_VIEWS}.merge(options)
|
68
|
-
partial = f.to_s
|
69
|
-
parts = partial.split("/")
|
70
|
-
if parts.size == 1
|
71
|
-
# it's local to this controller
|
72
|
-
partial = "_" << partial if options[:is_partial]
|
73
|
-
partial = File.join(options[:dir], self.controller.controller_name, partial + options[:ext])
|
74
|
-
else
|
75
|
-
# it's elsewhere
|
76
|
-
parts[parts.size - 1] = "_" << parts.last if options[:is_partial]
|
77
|
-
partial = File.join(options[:dir], parts.join("/") + options[:ext])
|
78
|
-
end
|
79
|
-
return Mack::ViewBinder.render(File.open(partial).read, self.controller, options)
|
80
|
-
end
|
81
51
|
|
82
52
|
# Transfer instance variables from the controller to the view.
|
83
53
|
def transfer_vars(x)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- markbates
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-03-
|
12
|
+
date: 2008-03-11 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -122,6 +122,12 @@ files:
|
|
122
122
|
- lib/initialization/server/simple_server.rb
|
123
123
|
- lib/mack.rb
|
124
124
|
- lib/mack_tasks.rb
|
125
|
+
- lib/rendering/base.rb
|
126
|
+
- lib/rendering/classes/action.rb
|
127
|
+
- lib/rendering/classes/partial.rb
|
128
|
+
- lib/rendering/classes/public.rb
|
129
|
+
- lib/rendering/classes/text.rb
|
130
|
+
- lib/rendering/classes/url.rb
|
125
131
|
- lib/routing/route_map.rb
|
126
132
|
- lib/routing/urls.rb
|
127
133
|
- lib/sea_level/controller_base.rb
|