merb 0.5.2 → 0.5.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.
- 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.
|