merb 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- data/SVN_REVISION +1 -1
- data/app_generators/merb/templates/app/views/exceptions/internal_server_error.html.erb +1 -1
- data/app_generators/merb/templates/script/destroy +1 -0
- data/app_generators/merb/templates/script/generate +4 -0
- data/lib/merb.rb +1 -0
- data/lib/merb/abstract_controller.rb +168 -55
- data/lib/merb/assets.rb +57 -16
- data/lib/merb/assets.rb.orig +119 -0
- data/lib/merb/boot_loader.rb +55 -4
- data/lib/merb/boot_loader.rb.orig +235 -0
- data/lib/merb/controller.rb +1 -1
- data/lib/merb/cookies.rb +95 -0
- data/lib/merb/mixins/controller.rb +1 -1
- data/lib/merb/mixins/render.rb +17 -4
- data/lib/merb/server.rb +23 -6
- data/lib/merb/test/helper.rb +6 -2
- data/lib/merb/version.rb +7 -4
- data/lib/tasks/merb.rake +1 -1
- data/spec/fixtures/controllers/render_spec_controllers.rb +10 -0
- data/spec/merb/controller_filters_spec.rb +1 -1
- data/spec/merb/cookie_store_spec.rb +1 -1
- data/spec/merb/cookies_spec.rb +96 -0
- data/spec/merb/render_spec.rb +17 -0
- metadata +7 -3
@@ -140,7 +140,7 @@ module Merb
|
|
140
140
|
# If you need to set a cookie, then use the +cookies+ hash.
|
141
141
|
#
|
142
142
|
def set_cookie(name, value, expires)
|
143
|
-
(headers['Set-Cookie'] ||=
|
143
|
+
(headers['Set-Cookie'] ||=[]) << (Merb::Const::SET_COOKIE % [
|
144
144
|
name.to_s,
|
145
145
|
escape(value.to_s),
|
146
146
|
# Cookie expiration time must be GMT. See RFC 2109
|
data/lib/merb/mixins/render.rb
CHANGED
@@ -117,9 +117,22 @@ module Merb
|
|
117
117
|
# end
|
118
118
|
# end
|
119
119
|
#
|
120
|
-
#
|
121
|
-
#
|
122
|
-
#
|
120
|
+
# This will first check to see if a index.xml.* template extists, if not
|
121
|
+
# it will call @people.to_xml (as defined in the add_mime_type method) on the passed
|
122
|
+
# in object if such a method exists for the current content_type
|
123
|
+
#
|
124
|
+
# Conversely, there may be situations where you prefer to be more literal
|
125
|
+
# such as when you desire to render a Hash, for those occasions, the
|
126
|
+
# the following syntax exists:
|
127
|
+
#
|
128
|
+
# class People < Application
|
129
|
+
# provides :xml
|
130
|
+
#
|
131
|
+
# def index
|
132
|
+
# @people = User.all
|
133
|
+
# render :obj => @people
|
134
|
+
# end
|
135
|
+
# end
|
123
136
|
#
|
124
137
|
# When using multiple calls to render in one action, the context of the render is cached for performance reasons
|
125
138
|
# That is, all instance variables are loaded into the view_context object only on the first call and then this is re-used.
|
@@ -139,7 +152,7 @@ module Merb
|
|
139
152
|
choose_template_format(Merb.available_mime_types, opts)
|
140
153
|
|
141
154
|
# Handles the case where render is called with an object
|
142
|
-
if obj = args.first
|
155
|
+
if obj = args.first || opts[:obj]
|
143
156
|
# Check for a template
|
144
157
|
unless find_template({:action => action}.merge(opts))
|
145
158
|
fmt = content_type
|
data/lib/merb/server.rb
CHANGED
@@ -32,14 +32,22 @@ module Merb
|
|
32
32
|
::Merb::Config.parse_args
|
33
33
|
|
34
34
|
if Merb::Config[:cluster]
|
35
|
-
delete_pidfiles
|
36
35
|
Merb::Config[:port].to_i.upto(Merb::Config[:port].to_i+Merb::Config[:cluster].to_i-1) do |port|
|
37
|
-
|
38
|
-
|
36
|
+
unless alive?(port)
|
37
|
+
delete_pidfiles(port)
|
38
|
+
puts "Starting merb server on port: #{port}"
|
39
|
+
start(port)
|
40
|
+
else
|
41
|
+
raise "Merb is already running on port: #{port}"
|
42
|
+
end
|
39
43
|
end
|
40
44
|
elsif Merb::Config[:daemonize]
|
41
|
-
|
42
|
-
|
45
|
+
unless alive?(Merb::Config[:port])
|
46
|
+
delete_pidfiles(Merb::Config[:port])
|
47
|
+
start(Merb::Config[:port])
|
48
|
+
else
|
49
|
+
raise "Merb is already running on port: #{port}"
|
50
|
+
end
|
43
51
|
else
|
44
52
|
trap('TERM') { exit }
|
45
53
|
mongrel_start(Merb::Config[:port])
|
@@ -49,7 +57,16 @@ module Merb
|
|
49
57
|
|
50
58
|
def store_pid(pid,port)
|
51
59
|
File.open("#{Merb::Config[:merb_root]}/log/merb.#{port}.pid", 'w'){|f| f.write("#{Process.pid}\n")}
|
52
|
-
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def alive?(port)
|
63
|
+
f = Merb::Config[:merb_root] + "/log/merb.#{port}.pid"
|
64
|
+
pid = IO.read(f).chomp.to_i
|
65
|
+
Process.kill(0, pid)
|
66
|
+
true
|
67
|
+
rescue
|
68
|
+
false
|
69
|
+
end
|
53
70
|
|
54
71
|
def kill(ports, sig=9)
|
55
72
|
begin
|
data/lib/merb/test/helper.rb
CHANGED
@@ -40,9 +40,10 @@ module Merb
|
|
40
40
|
def request(verb, path, opts = {}, &block)
|
41
41
|
response = StringIO.new
|
42
42
|
|
43
|
-
request = opts.delete(:fake_request) || Merb::Test::FakeRequest.with(path, opts.merge(:request_method => (verb.to_s.upcase rescue 'GET')))
|
44
43
|
yield_to_controller = opts.delete(:yields)
|
45
44
|
|
45
|
+
request = opts.delete(:fake_request) || Merb::Test::FakeRequest.with(path_with_options(path, opts), :request_method => (verb.to_s.upcase rescue 'GET'))
|
46
|
+
|
46
47
|
if yield_to_controller == :controller
|
47
48
|
request_yielding_controller(request, response, &block)
|
48
49
|
else
|
@@ -215,7 +216,10 @@ module Merb
|
|
215
216
|
@controller = klass.build(request, response, status)
|
216
217
|
|
217
218
|
@controller.send(:setup_session)
|
218
|
-
|
219
|
+
# This will be a mock framework agnostic way of ensuring setup_session is not done again
|
220
|
+
class << @controller
|
221
|
+
def setup_session; true; end
|
222
|
+
end
|
219
223
|
|
220
224
|
yield @controller if block_given?
|
221
225
|
|
data/lib/merb/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Merb
|
2
|
-
VERSION = '0.5.
|
2
|
+
VERSION = '0.5.3' unless defined?(::Merb::VERSION)
|
3
3
|
|
4
4
|
class << self
|
5
5
|
def svn_revision
|
@@ -22,6 +22,8 @@ module Merb
|
|
22
22
|
end
|
23
23
|
# catch permissions error when packaged as gem
|
24
24
|
rescue Errno::EACCES
|
25
|
+
# ... or packaged as gem, mounted on a Read-Only filesystem
|
26
|
+
rescue Errno::EROFS
|
25
27
|
end
|
26
28
|
|
27
29
|
unless (rev = File.read(svn_revision_file_path).strip).empty?
|
@@ -40,7 +42,8 @@ module Merb
|
|
40
42
|
# nil : released
|
41
43
|
# You should never check in to trunk with this changed. It should
|
42
44
|
# stay 'svn'. Change it to nil in release tags.
|
43
|
-
|
44
|
-
|
45
|
-
|
45
|
+
RELEASE=nil
|
46
|
+
# unless defined?(::Merb::RELEASE)
|
47
|
+
# RELEASE = "svn#{" r#{svn_revision_from_file}" if svn_revision_from_file}"
|
48
|
+
# end
|
46
49
|
end
|
data/lib/tasks/merb.rake
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
def install_merb_script
|
2
2
|
script_filepath = Merb.root / 'script/merb'
|
3
3
|
FileUtils.rm script_filepath if File.exist? script_filepath
|
4
|
-
tmpl = "#!/usr/bin/env ruby\nrequire File.expand_path(File.dirname(__FILE__)+'/../config/
|
4
|
+
tmpl = "#!/usr/bin/env ruby\nrequire File.expand_path(File.dirname(__FILE__)+'/../config/boot')\nrequire File.expand_path(File.dirname(__FILE__)+'/../framework/merb/server')\nMerb::Server.run\n"
|
5
5
|
File.open(script_filepath, 'wb') {|f|
|
6
6
|
f.write tmpl
|
7
7
|
f.chmod(0744)
|
@@ -62,6 +62,16 @@ class RenderObjectController < Merb::Controller
|
|
62
62
|
|
63
63
|
end
|
64
64
|
|
65
|
+
class RenderHashObjectController < Merb::Controller
|
66
|
+
|
67
|
+
def render_object
|
68
|
+
provides :xml,:json
|
69
|
+
@foo = {:foo => 'bar', :baz => 'quuz'}
|
70
|
+
render :obj => @foo
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
65
75
|
class RenderObjectWithArgumentsController < Merb::Controller
|
66
76
|
|
67
77
|
provides :xml, :foo => 'bar'
|
@@ -158,7 +158,7 @@ describe "Dispatch and before/after filters" do
|
|
158
158
|
|
159
159
|
it "should be able to see instance variables" do
|
160
160
|
call_filter_action "one"
|
161
|
-
@c.cookies.should be_is_a(
|
161
|
+
@c.cookies.should be_is_a(Merb::Cookies)
|
162
162
|
@c.session.data.should == {}
|
163
163
|
@c.response.read.should == ""
|
164
164
|
@c.instance_variable_get("@filter1").should eql( 'called')
|
@@ -24,7 +24,7 @@ describe Merb::SessionMixin do
|
|
24
24
|
it "should set the cookie if the cookie is changed" do
|
25
25
|
c = new_controller( 'change', TestCookieSessionController)
|
26
26
|
c.dispatch(:change)
|
27
|
-
c.headers['Set-Cookie'].should =~ %r{_session_id=} # this could be better
|
27
|
+
c.headers['Set-Cookie'].each {|c| c.should =~ %r{_session_id=} }# this could be better
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
module CookiesSpecModule
|
4
|
+
def cookie_time(time)
|
5
|
+
time.gmtime.strftime(Merb::Const::COOKIE_EXPIRATION_FORMAT)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Merb::Cookies do
|
10
|
+
include CookiesSpecModule
|
11
|
+
|
12
|
+
before do
|
13
|
+
@_cookies = Mash.new
|
14
|
+
@_headers = {}
|
15
|
+
@cookies = Merb::Cookies.new(@_cookies, @_headers)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should respond to []" do
|
19
|
+
@cookies.should respond_to(:[])
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should respond to []=" do
|
23
|
+
@cookies.should respond_to(:[]=)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should respond to delete" do
|
27
|
+
@cookies.should respond_to(:delete)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should accept simple cookies that expire at end of session" do
|
31
|
+
@cookies[:foo] = 'bar'
|
32
|
+
|
33
|
+
@_headers['Set-Cookie'].should == ['foo=bar; path=/;']
|
34
|
+
|
35
|
+
@cookies[:foo].should == 'bar'
|
36
|
+
@cookies['foo'].should == 'bar'
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should accept cookies with expiry dates" do
|
40
|
+
expires = Time.now + 2.weeks
|
41
|
+
@cookies[:dozen] = {
|
42
|
+
:value => 'twelve',
|
43
|
+
:expires => expires
|
44
|
+
}
|
45
|
+
|
46
|
+
@_headers['Set-Cookie'].should ==
|
47
|
+
["dozen=twelve; expires=%s; path=/;" % cookie_time(expires)]
|
48
|
+
|
49
|
+
@cookies[:dozen].should == 'twelve'
|
50
|
+
@cookies['dozen'].should == 'twelve'
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should accept multiple cookies" do
|
54
|
+
expires = Time.now + 2.weeks
|
55
|
+
@cookies[:foo] = 'bar'
|
56
|
+
@cookies[:dozen] = {
|
57
|
+
:value => 'twelve',
|
58
|
+
:expires => expires
|
59
|
+
}
|
60
|
+
|
61
|
+
@_headers['Set-Cookie'].should == [
|
62
|
+
'foo=bar; path=/;',
|
63
|
+
"dozen=twelve; expires=%s; path=/;" % cookie_time(expires)
|
64
|
+
]
|
65
|
+
|
66
|
+
@cookies[:dozen].should == 'twelve'
|
67
|
+
@cookies['dozen'].should == 'twelve'
|
68
|
+
@cookies[:foo].should == 'bar'
|
69
|
+
@cookies['foo'].should == 'bar'
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should give access to currently saved cookies" do
|
73
|
+
@_cookies[:original] = 'accessible'
|
74
|
+
@cookies[:original].should == 'accessible'
|
75
|
+
|
76
|
+
@cookies[:foo] = 'bar'
|
77
|
+
@cookies[:foo].should == 'bar'
|
78
|
+
@cookies[:original].should == 'accessible'
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should overwrite old cookies with new cookies" do
|
82
|
+
@_cookies[:foo] = 'bar'
|
83
|
+
@cookies[:foo].should == 'bar'
|
84
|
+
|
85
|
+
@cookies[:foo] = 'new'
|
86
|
+
@cookies[:foo].should == 'new'
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should allow deleting of cookies" do
|
90
|
+
@_cookies[:foo] = 'bar'
|
91
|
+
@cookies[:foo].should == 'bar'
|
92
|
+
|
93
|
+
@cookies.delete(:foo)
|
94
|
+
@cookies[:foo].should == nil
|
95
|
+
end
|
96
|
+
end
|
data/spec/merb/render_spec.rb
CHANGED
@@ -412,6 +412,23 @@ describe "Merb rendering with an object calls to_json or to_xml on the object (u
|
|
412
412
|
|
413
413
|
end
|
414
414
|
|
415
|
+
describe "Merb rendering with a hash object calls to_json or to_xml on the object" do
|
416
|
+
|
417
|
+
it "render :obj => @foo should call @foo.to_json when json is requested" do
|
418
|
+
c = new_spec_controller(:format => 'json', :controller => 'RenderHashObjectController')
|
419
|
+
c.dispatch(:render_object)
|
420
|
+
JSON.load(c.body).should == {'baz' => "quuz", "foo" => "bar"}
|
421
|
+
end
|
422
|
+
|
423
|
+
it "render @foo should call @foo.to_xml when xml is requested" do
|
424
|
+
c = new_spec_controller(:format => 'xml', :controller => 'RenderHashObjectController')
|
425
|
+
c.dispatch(:render_object)
|
426
|
+
c.body.should match(/<\?xml version="1.0" encoding="UTF-8"\?>\n<hash>/m)
|
427
|
+
c.body.should match(/(<baz>quuz<\/baz>\n\s+<foo>bar<\/foo>\n<\/hash>)|(<foo>bar<\/foo>\n\s+<baz>quuz<\/baz>\n<\/hash>)/m)
|
428
|
+
end
|
429
|
+
|
430
|
+
end
|
431
|
+
|
415
432
|
describe "Merb rendering with an object and using a block/lambda for provides" do
|
416
433
|
|
417
434
|
it "render @foo should use the default block when xml is requested" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: merb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ezra Zygmuntowicz
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-01-
|
12
|
+
date: 2008-01-28 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -212,6 +212,7 @@ files:
|
|
212
212
|
- spec/merb/controller_filters_spec.rb
|
213
213
|
- spec/merb/controller_spec.rb
|
214
214
|
- spec/merb/cookie_store_spec.rb
|
215
|
+
- spec/merb/cookies_spec.rb
|
215
216
|
- spec/merb/core_ext
|
216
217
|
- spec/merb/core_ext/class_spec.rb
|
217
218
|
- spec/merb/core_ext/enumerable_spec.rb
|
@@ -251,7 +252,9 @@ files:
|
|
251
252
|
- lib/merb
|
252
253
|
- lib/merb/abstract_controller.rb
|
253
254
|
- lib/merb/assets.rb
|
255
|
+
- lib/merb/assets.rb.orig
|
254
256
|
- lib/merb/boot_loader.rb
|
257
|
+
- lib/merb/boot_loader.rb.orig
|
255
258
|
- lib/merb/caching
|
256
259
|
- lib/merb/caching/action_cache.rb
|
257
260
|
- lib/merb/caching/fragment_cache.rb
|
@@ -262,6 +265,7 @@ files:
|
|
262
265
|
- lib/merb/config.rb
|
263
266
|
- lib/merb/constants.rb
|
264
267
|
- lib/merb/controller.rb
|
268
|
+
- lib/merb/cookies.rb
|
265
269
|
- lib/merb/core_ext
|
266
270
|
- lib/merb/core_ext/array.rb
|
267
271
|
- lib/merb/core_ext/class.rb
|
@@ -480,7 +484,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
480
484
|
requirements:
|
481
485
|
- install the json gem to get faster json parsing
|
482
486
|
rubyforge_project:
|
483
|
-
rubygems_version: 0.
|
487
|
+
rubygems_version: 1.0.1
|
484
488
|
signing_key:
|
485
489
|
specification_version: 2
|
486
490
|
summary: Merb == Mongrel + Erb. Pocket rocket web framework.
|