nitro 0.29.0 → 0.30.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +410 -0
- data/ProjectInfo +36 -44
- data/README +5 -5
- data/doc/AUTHORS +6 -0
- data/doc/RELEASES +159 -2
- data/lib/glue/sweeper.rb +2 -2
- data/lib/glue/webfile.rb +14 -1
- data/lib/nitro.rb +6 -9
- data/lib/nitro/adapter/mongrel.rb +36 -43
- data/lib/nitro/adapter/scgi.rb +1 -1
- data/lib/nitro/adapter/webrick.rb +96 -24
- data/lib/nitro/caching/actions.rb +2 -1
- data/lib/nitro/caching/fragments.rb +1 -8
- data/lib/nitro/caching/output.rb +14 -4
- data/lib/nitro/cgi.rb +19 -21
- data/lib/nitro/cgi/cookie.rb +5 -1
- data/lib/nitro/cgi/request.rb +20 -4
- data/lib/nitro/compiler.rb +74 -28
- data/lib/nitro/compiler/cleanup.rb +1 -1
- data/lib/nitro/compiler/elements.rb +1 -2
- data/lib/nitro/compiler/localization.rb +1 -1
- data/lib/nitro/compiler/markup.rb +1 -1
- data/lib/nitro/compiler/script.rb +52 -44
- data/lib/nitro/compiler/squeeze.rb +4 -3
- data/lib/nitro/compiler/xslt.rb +7 -6
- data/lib/nitro/context.rb +39 -20
- data/lib/nitro/controller.rb +24 -5
- data/lib/nitro/dispatcher.rb +13 -5
- data/lib/nitro/global.rb +63 -0
- data/lib/nitro/helper/feed.rb +432 -0
- data/lib/nitro/helper/form.rb +11 -3
- data/lib/nitro/helper/form/builder.rb +140 -0
- data/lib/nitro/helper/form/controls.rb +2 -1
- data/lib/nitro/helper/javascript.rb +6 -0
- data/lib/nitro/helper/javascript/morphing.rb +13 -6
- data/lib/nitro/helper/xhtml.rb +42 -6
- data/lib/nitro/helper/xml.rb +3 -0
- data/lib/nitro/part.rb +2 -2
- data/lib/nitro/render.rb +7 -2
- data/lib/nitro/router.rb +57 -16
- data/lib/nitro/scaffolding.rb +29 -20
- data/lib/nitro/server.rb +4 -10
- data/lib/nitro/server/drb.rb +1 -1
- data/lib/nitro/server/runner.rb +10 -0
- data/lib/nitro/session.rb +31 -12
- data/lib/nitro/session/drb.rb +13 -1
- data/lib/nitro/session/file.rb +1 -1
- data/lib/nitro/session/memcached.rb +1 -1
- data/lib/nitro/session/memory.rb +1 -1
- data/lib/nitro/session/og.rb +1 -1
- data/lib/nitro/test/testcase.rb +3 -0
- data/proto/public/error.xhtml +5 -5
- data/proto/public/js/controls.js +2 -2
- data/proto/public/js/dragdrop.js +320 -79
- data/proto/public/js/effects.js +200 -152
- data/proto/public/js/prototype.js +284 -63
- data/proto/public/js/scriptaculous.js +7 -5
- data/proto/public/js/unittest.js +11 -0
- data/proto/public/scaffold/advanced_search.xhtml +30 -0
- data/proto/public/scaffold/list.xhtml +8 -1
- data/proto/public/scaffold/search.xhtml +2 -1
- data/proto/script/scgi_service +1 -1
- data/src/part/admin/controller.rb +1 -1
- data/src/part/admin/skin.rb +1 -1
- data/test/nitro/CONFIG.rb +3 -0
- data/test/nitro/adapter/tc_webrick.rb +1 -1
- data/test/nitro/cgi/tc_cookie.rb +1 -1
- data/test/nitro/cgi/tc_request.rb +5 -5
- data/test/nitro/compiler/tc_client_morpher.rb +47 -0
- data/test/nitro/compiler/tc_compiler.rb +2 -0
- data/test/nitro/helper/tc_feed.rb +138 -0
- data/test/nitro/helper/tc_pager.rb +1 -1
- data/test/nitro/helper/tc_rss.rb +1 -1
- data/test/nitro/helper/tc_table.rb +1 -1
- data/test/nitro/helper/tc_xhtml.rb +1 -1
- data/test/nitro/tc_caching.rb +1 -1
- data/test/nitro/tc_cgi.rb +1 -1
- data/test/nitro/tc_context.rb +1 -1
- data/test/nitro/tc_controller.rb +31 -3
- data/test/nitro/tc_controller_aspect.rb +1 -1
- data/test/nitro/tc_dispatcher.rb +1 -1
- data/test/nitro/tc_element.rb +1 -1
- data/test/nitro/tc_flash.rb +1 -1
- data/test/nitro/tc_helper.rb +1 -1
- data/test/nitro/tc_render.rb +6 -6
- data/test/nitro/tc_router.rb +8 -4
- data/test/nitro/tc_server.rb +1 -3
- data/test/nitro/tc_session.rb +1 -3
- metadata +107 -104
- data/Rakefile +0 -232
- data/lib/nitro/adapter/acgi.rb +0 -237
- data/proto/public/Makefile.acgi +0 -40
- data/proto/public/acgi.c +0 -138
@@ -20,16 +20,18 @@
|
|
20
20
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
21
|
|
22
22
|
var Scriptaculous = {
|
23
|
-
Version: '1.
|
23
|
+
Version: '1.6.1',
|
24
24
|
require: function(libraryName) {
|
25
25
|
// inserting via DOM fails in Safari 2.0, so brute force approach
|
26
26
|
document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
|
27
27
|
},
|
28
28
|
load: function() {
|
29
|
-
if((typeof Prototype=='undefined') ||
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
if((typeof Prototype=='undefined') ||
|
30
|
+
(typeof Element == 'undefined') ||
|
31
|
+
(typeof Element.Methods=='undefined') ||
|
32
|
+
parseFloat(Prototype.Version.split(".")[0] + "." +
|
33
|
+
Prototype.Version.split(".")[1]) < 1.5)
|
34
|
+
throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
|
33
35
|
|
34
36
|
$A(document.getElementsByTagName("script")).findAll( function(s) {
|
35
37
|
return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
|
data/proto/public/js/unittest.js
CHANGED
@@ -258,6 +258,9 @@ Test.Unit.Assertions.prototype = {
|
|
258
258
|
this.failures++;
|
259
259
|
this.messages.push("Failure: " + message);
|
260
260
|
},
|
261
|
+
info: function(message) {
|
262
|
+
this.messages.push("Info: " + message);
|
263
|
+
},
|
261
264
|
error: function(error) {
|
262
265
|
this.errors++;
|
263
266
|
this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
|
@@ -336,6 +339,14 @@ Test.Unit.Assertions.prototype = {
|
|
336
339
|
},
|
337
340
|
assertVisible: function(element) {
|
338
341
|
this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
|
342
|
+
},
|
343
|
+
benchmark: function(operation, iterations) {
|
344
|
+
var startAt = new Date();
|
345
|
+
(iterations || 1).times(operation);
|
346
|
+
var timeTaken = ((new Date())-startAt);
|
347
|
+
this.info((arguments[2] || 'Operation') + ' finished ' +
|
348
|
+
iterations + ' iterations in ' + (timeTaken/1000)+'s' );
|
349
|
+
return timeTaken;
|
339
350
|
}
|
340
351
|
}
|
341
352
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<SystemPage>
|
2
|
+
<?r base = "#{@base}/%base%" ?>
|
3
|
+
<h1><a href="/"> Home</a> > <a href="#@base">System</a> > <a href="#{base}/list">#{"%plural%".humanize}</a> > Advanced Search</h1>
|
4
|
+
<p>
|
5
|
+
<form action="#{base}/search">
|
6
|
+
Search #{"%plural%".humanize}: <input type="text" name="q" /> <input type="submit" value="Search" />
|
7
|
+
<a href="#{base}/advanced_search">Advanced search</a>
|
8
|
+
</form>
|
9
|
+
</p>
|
10
|
+
<?r if @list.nil? ?>
|
11
|
+
<h3>Enter properties for advanced search:</h3>
|
12
|
+
#{form_for %klass%.new, :submit => 'Search', :action => :self, :no_relations => true}
|
13
|
+
<?r else ?>
|
14
|
+
<table>
|
15
|
+
<?r for obj in @list ?>
|
16
|
+
<tr>
|
17
|
+
<td width="100%"><a href="#{base}/edit/#{obj.oid}">#(obj.to_s)</a></td>
|
18
|
+
<?r if obj.respond_to?(:update_time) ?>
|
19
|
+
<td nowrap="1">#{obj.update_time.stamp(:db)}</td>
|
20
|
+
<?r end ?>
|
21
|
+
<td><a href="#{base}/edit/#{obj.oid}">edit</a></td>
|
22
|
+
<td><a href="#{base}/delete/#{obj.oid}">del</a></td>
|
23
|
+
</tr>
|
24
|
+
<?r end ?>
|
25
|
+
</table>
|
26
|
+
<div class="pager" if="@pager and @pager.navigation?">
|
27
|
+
#{@pager.navigation}
|
28
|
+
</div>
|
29
|
+
<?r end ?>
|
30
|
+
</SystemPage>
|
@@ -4,7 +4,8 @@
|
|
4
4
|
<a href="#{base}/new">New #{"%name%".humanize}</a>
|
5
5
|
<p>
|
6
6
|
<form action="#{base}/search">
|
7
|
-
Search #{"%plural%".humanize}: <input type="text" name="q" /> <input type="submit" value="Search" />
|
7
|
+
Search #{"%plural%".humanize}: <input type="text" name="q" /> <input type="submit" value="Search" />
|
8
|
+
<a href="#{base}/advanced_search">Advanced search</a>
|
8
9
|
</form>
|
9
10
|
</p>
|
10
11
|
<table>
|
@@ -14,6 +15,12 @@
|
|
14
15
|
<?r if obj.respond_to?(:update_time) ?>
|
15
16
|
<td nowrap="1">#{obj.update_time.stamp(:db)}</td>
|
16
17
|
<?r end ?>
|
18
|
+
<?r if Glue.const_defined?(:Orderable) and @klass.include?(Glue::Orderable) ?>
|
19
|
+
<td><a href="#">Top</a></td>
|
20
|
+
<td><a href="#">Up</a></td>
|
21
|
+
<td><a href="#">Down</a></td>
|
22
|
+
<td><a href="#">Bottom</a></td>
|
23
|
+
<?r end ?>
|
17
24
|
<td><a href="#{base}/edit/#{obj.oid}">edit</a></td>
|
18
25
|
<td><a href="#{base}/delete/#{obj.oid}" onclick="confirm('Are you sure?')">del</a></td>
|
19
26
|
</tr>
|
@@ -3,7 +3,8 @@
|
|
3
3
|
<h1><a href="/"> Home</a> > <a href="#@base">System</a> > <a href="#{base}/list">#{"%plural%".humanize}</a> > Search for '#@query'</h1>
|
4
4
|
<p>
|
5
5
|
<form action="#{base}/search">
|
6
|
-
Search #{"%plural%".humanize}: <input type="text" name="q" /> <input type="submit" value="Search" />
|
6
|
+
Search #{"%plural%".humanize}: <input type="text" name="q" /> <input type="submit" value="Search" />
|
7
|
+
<a href="#{base}/advanced_search">Advanced search</a>
|
7
8
|
</form>
|
8
9
|
</p>
|
9
10
|
<?r if @list.nil? ?>
|
data/proto/script/scgi_service
CHANGED
@@ -24,7 +24,7 @@ class NitroProcessor < SCGIProcessor
|
|
24
24
|
cgi.stdinput.rewind
|
25
25
|
cgi.env["QUERY_STRING"] = (cgi.env["REQUEST_URI"] =~ /^[^?]+\?(.+)$/ and $1).to_s
|
26
26
|
Nitro::Cgi.process($server, cgi, cgi.stdinput, cgi.stdoutput)
|
27
|
-
Og.manager.put_store if defined?(Og) and Og.respond_to?(:manager)
|
27
|
+
Og.manager.put_store if defined?(Og) and Og.respond_to?(:manager) and Og.manager
|
28
28
|
end
|
29
29
|
rescue IOError
|
30
30
|
@log.error("received IOError #$! when handling client. Your web server doesn't like me.")
|
data/src/part/admin/skin.rb
CHANGED
@@ -13,7 +13,7 @@ class SystemPage < Nitro::Element
|
|
13
13
|
<body>
|
14
14
|
<h1>#@title</h1>
|
15
15
|
#{content}
|
16
|
-
<p>Powered by <a href="http://www.
|
16
|
+
<p>Powered by <a href="http://www.nitroproject.org">Nitro</a> version #{Nitro::Version}</p>
|
17
17
|
</body>
|
18
18
|
</html>
|
19
19
|
~
|
data/test/nitro/cgi/tc_cookie.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
|
2
2
|
|
3
3
|
require 'test/unit'
|
4
4
|
|
@@ -16,12 +16,12 @@ class TC_Request < Test::Unit::TestCase # :nodoc: all
|
|
16
16
|
def test_all
|
17
17
|
req = DummyRequest.new
|
18
18
|
|
19
|
-
req.headers['HTTP_HOST'] = 'www.
|
20
|
-
assert_equal '
|
19
|
+
req.headers['HTTP_HOST'] = 'www.nitroproject.org'
|
20
|
+
assert_equal 'nitroproject.org', req.domain
|
21
21
|
assert_equal 'www', req.subdomains.first
|
22
22
|
|
23
|
-
req.headers['HTTP_HOST'] = 'www.
|
24
|
-
assert_equal '
|
23
|
+
req.headers['HTTP_HOST'] = 'www.nitroproject.co.uk'
|
24
|
+
assert_equal 'nitroproject.co.uk', req.domain(2)
|
25
25
|
|
26
26
|
req.headers['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
27
27
|
assert req.xhr?
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
require 'nitro/test/testcase'
|
6
|
+
require 'nitro/compiler'
|
7
|
+
|
8
|
+
class TC_ClientMorpher < Test::Unit::TestCase
|
9
|
+
class MyController < Nitro::Controller
|
10
|
+
class Client
|
11
|
+
def check_album
|
12
|
+
ajax_update 'tools_block', {
|
13
|
+
:action => 'checked_albums',
|
14
|
+
:params => 'some parameters'
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Action_Name = :an_object_responding_to_the_method_to_sym_is_now_required_when_compiling_a_template
|
21
|
+
|
22
|
+
def setup
|
23
|
+
@compiler = Nitro::Compiler.new(MyController)
|
24
|
+
end
|
25
|
+
|
26
|
+
def teardown
|
27
|
+
@compiler = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_javascript_no_params
|
31
|
+
template = '<a href="#" client="check_album">Test</a>'
|
32
|
+
result = @compiler.transform_template(Action_Name, template)
|
33
|
+
assert_match(/__nc_check_album\(\)/, result)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_javascript_one_param
|
37
|
+
template = '<a href="#" client="check_album" params="this.id">Test</a>'
|
38
|
+
result = @compiler.transform_template(Action_Name, template)
|
39
|
+
assert_match(/__nc_check_album\(this\.id\)/, result)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_javascript_multi_params
|
43
|
+
template = '<a href="#" client="check_album" params="this.id, this.class">Test</a>'
|
44
|
+
result = @compiler.transform_template(Action_Name, template)
|
45
|
+
assert_match(/__nc_check_album\(this\.id, this\.class\)/, result)
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'nitro/helper/feed'
|
5
|
+
|
6
|
+
class TC_FeedHelper < Test::Unit::TestCase # :nodoc: all
|
7
|
+
include Nitro
|
8
|
+
include FeedHelper
|
9
|
+
|
10
|
+
Blog = Struct.new(:title, :body, :to_href)
|
11
|
+
Blog2 = Struct.new(:title, :body, :to_href, :update_time)
|
12
|
+
# TODO: add more (all)
|
13
|
+
FullBlown = Struct.new(:title, :body, :full_content, :to_href, :update_time, :create_time, :author)
|
14
|
+
|
15
|
+
# RSS Testing
|
16
|
+
def test_rss
|
17
|
+
blogs = []
|
18
|
+
blogs << Blog.new('Hello1', 'World1', 'uri1');
|
19
|
+
blogs << Blog.new('Hello2', 'World2', 'uri2');
|
20
|
+
blogs << Blog.new('Hello3', 'World3', 'uri3');
|
21
|
+
blogs2 = []
|
22
|
+
updated = Time.now
|
23
|
+
blogs2 << Blog2.new('Hello1', 'World1', 'uri1', updated);
|
24
|
+
blogs2 << Blog2.new('Hello2', 'World2', 'uri2', updated);
|
25
|
+
blogs2 << Blog2.new('Hello3', 'World3', 'uri3', updated);
|
26
|
+
|
27
|
+
# rss without version (0.9)
|
28
|
+
rss = build_rss(blogs, :base => 'http://oxyliquit.de')
|
29
|
+
|
30
|
+
assert_match %r{<link>http://oxyliquit.de/uri1</link>}, rss
|
31
|
+
assert_match %r{<link>http://oxyliquit.de/uri2</link>}, rss
|
32
|
+
|
33
|
+
# rss 0.9
|
34
|
+
rss09 = build_rss(blogs, :version => "0.91", :link => 'http://oxyliquit.de')
|
35
|
+
assert_match %r{<link>http://oxyliquit.de/uri1</link>}, rss09
|
36
|
+
assert_match %r{<link>http://oxyliquit.de/uri2</link>}, rss09
|
37
|
+
|
38
|
+
# rss 1.0
|
39
|
+
rss10 = build_rss(blogs, :version => "1.0", :link => 'http://oxyliquit.de')
|
40
|
+
assert_match %r{<link>http://oxyliquit.de/uri1</link>}, rss10
|
41
|
+
assert_match %r{<link>http://oxyliquit.de/uri2</link>}, rss10
|
42
|
+
|
43
|
+
# rss 2.0
|
44
|
+
rss20 = build_rss(blogs2, :version => "2.0", :link => 'http://oxyliquit.de')
|
45
|
+
assert_match %r{<link>http://oxyliquit.de/uri1</link>}, rss20
|
46
|
+
assert_match %r{<link>http://oxyliquit.de/uri2</link>}, rss20
|
47
|
+
|
48
|
+
# rss full blown
|
49
|
+
rssfull = build_rss(blogs, :version => "0.9", :base => 'http://oxyliquit.de', :link => 'http://oxyliquit.de/feed', :title => "Oxyliquit feed", :language => 'en', :about => 'http://ox.li/about.rdf', :description => "Example feed of Oxyliquit", :search_title => "Oxyliquit search", :search_description => "Search through Oxyliqit", :search_input_name => "q", :search_form_action => "http://oxyliquit.de/search")
|
50
|
+
assert_match %r{<link>http://oxyliquit.de/uri1</link>}, rssfull
|
51
|
+
assert_match %r{<link>http://oxyliquit.de/uri2</link>}, rssfull
|
52
|
+
# TODO: there should be some more
|
53
|
+
|
54
|
+
# rss with full blown object
|
55
|
+
update_time = Time.now
|
56
|
+
create_time = Time.now - 360
|
57
|
+
author = Hash.new
|
58
|
+
author[:name] = "Bill"
|
59
|
+
author[:link] = "http://bills.url"
|
60
|
+
author[:email] = "bill@email.com"
|
61
|
+
fullblownobject = []
|
62
|
+
fullblownobject << FullBlown.new('Hello1', 'World1', 'Fullsize text with lots of words..', 'uri1', update_time, create_time, author)
|
63
|
+
fullblownobject << FullBlown.new('Hello2', 'World2', ' text with lots of words..', 'uri2', update_time, create_time, author)
|
64
|
+
rss_f_o = build_rss(fullblownobject, :version => "0.9", :base => 'http://oxyliquit.de', :link => 'http://oxyliquit.de/feed', :title => "Oxyliquit feed", :language => 'en', :about => 'http://ox.li/about.rdf', :description => "Example feed of Oxyliquit", :search_title => "Oxyliquit search", :search_description => "Search through Oxyliqit", :search_input_name => "q", :search_form_action => "http://oxyliquit.de/search")
|
65
|
+
assert_match %r{<link>http://oxyliquit.de/uri1</link>}, rss_f_o
|
66
|
+
assert_match %r{<link>http://oxyliquit.de/uri2</link>}, rss_f_o
|
67
|
+
|
68
|
+
# rss with wrong version
|
69
|
+
assert_raise(RuntimeError) do
|
70
|
+
build_rss(blogs, :version => "0.5", :link => 'http://oxyliquit.de')
|
71
|
+
end
|
72
|
+
|
73
|
+
end # test_rss
|
74
|
+
|
75
|
+
# Atom Testing
|
76
|
+
def test_atom
|
77
|
+
blogs = []
|
78
|
+
updated = Time.now
|
79
|
+
blogs << Blog2.new('Hello1', 'World1', 'uri1', updated);
|
80
|
+
blogs << Blog2.new('Hello2', 'World2', 'uri2', updated);
|
81
|
+
blogs << Blog2.new('Hello3', 'World3', 'uri3', updated);
|
82
|
+
|
83
|
+
# atom small
|
84
|
+
atom = build_atom(blogs, :base => 'http://oxyliquit.de')
|
85
|
+
|
86
|
+
assert_match %r{<id>http://oxyliquit.de/uri1</id>}, atom
|
87
|
+
assert_match %r{<id>http://oxyliquit.de/uri2</id>}, atom
|
88
|
+
|
89
|
+
# atom big
|
90
|
+
atom = build_atom(blogs, :title => "Oxyliquit Feed", :base => "http://oxyliquit.de", :link => "http://oxyliquit.de/atomfeed", :author_name => "Fabian Buch", :author_email => "fabian@fabian-buch.de", :author_link => "http://fabian-buch.de")
|
91
|
+
|
92
|
+
assert_match %r{<id>http://oxyliquit.de/uri1</id>}, atom
|
93
|
+
assert_match %r{<id>http://oxyliquit.de/uri2</id>}, atom
|
94
|
+
assert_match %r{<title>Oxyliquit Feed</title>}, atom
|
95
|
+
assert_match %r{<updated>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(Z|[+-]\d{2}:\d{2})</updated>}, atom
|
96
|
+
|
97
|
+
# atom with full blown object
|
98
|
+
update_time = Time.now
|
99
|
+
create_time = Time.now - 360
|
100
|
+
author = Hash.new
|
101
|
+
author[:name] = "Bill"
|
102
|
+
author[:link] = "http://bills.url"
|
103
|
+
author[:email] = "bill@email.com"
|
104
|
+
fullblownobject = []
|
105
|
+
fullblownobject << FullBlown.new('Hello1', 'World1', 'Fullsize text with lots of words..', 'uri1', update_time, create_time, author)
|
106
|
+
fullblownobject << FullBlown.new('Hello2', 'World2', ' text with lots of words..', 'uri2', update_time, create_time, author)
|
107
|
+
atom_f_o = build_atom(fullblownobject, :title => "Oxyliquit Feed", :base => "http://oxyliquit.de", :link => "http://oxyliquit.de/atomfeed", :author_name => "Fabian Buch", :author_email => "fabian@fabian-buch.de", :author_link => "http://fabian-buch.de")
|
108
|
+
assert_match %r{<id>http://oxyliquit.de/uri1</id>}, atom_f_o
|
109
|
+
assert_match %r{<id>http://oxyliquit.de/uri2</id>}, atom_f_o
|
110
|
+
assert_match %r{<title>Oxyliquit Feed</title>}, atom_f_o
|
111
|
+
assert_match %r{<summary>\w+</summary>}, atom_f_o
|
112
|
+
assert_match %r{<updated>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(Z|[+-]\d{2}:\d{2})</updated>}, atom_f_o
|
113
|
+
assert_match %r{<published>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(Z|[+-]\d{2}:\d{2})</published>}, atom_f_o
|
114
|
+
assert_match %r{<author><name>Bill</name><email>bill@email.com</email><uri>http://bills.url</uri></author>}, atom_f_o
|
115
|
+
|
116
|
+
end # test_atom
|
117
|
+
|
118
|
+
# OPML Testing
|
119
|
+
def test_opml
|
120
|
+
|
121
|
+
opml = build_opml(
|
122
|
+
{
|
123
|
+
"http://oxyliquit.de/feed" => "rss",
|
124
|
+
"http://oxyliquit.de/feed/questions" => "rss",
|
125
|
+
"http://oxyliquit.de/feed/tips" => "rss",
|
126
|
+
"http://oxyliquit.de/feed/tutorials" => "rss"
|
127
|
+
},
|
128
|
+
:title => "My feeds"
|
129
|
+
)
|
130
|
+
|
131
|
+
assert_match %r{<outline xmlUrl='http://oxyliquit.de/feed/tips' type='rss'/>}, opml
|
132
|
+
|
133
|
+
end # test_opml
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
# * Fabian Buch <fabian@fabian-buch.de>
|
138
|
+
# * George Moschovitis <gm@navel.gr>
|
data/test/nitro/helper/tc_rss.rb
CHANGED
data/test/nitro/tc_caching.rb
CHANGED
data/test/nitro/tc_cgi.rb
CHANGED
data/test/nitro/tc_context.rb
CHANGED
data/test/nitro/tc_controller.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
$NITRO_NO_ENVIRONMENT = true
|
1
|
+
require File.join(File.dirname(__FILE__), 'CONFIG.rb')
|
4
2
|
|
5
3
|
require 'test/unit'
|
6
4
|
require 'ostruct'
|
@@ -12,6 +10,11 @@ require 'nitro'
|
|
12
10
|
class TC_Controller < Test::Unit::TestCase # :nodoc: all
|
13
11
|
include Nitro
|
14
12
|
|
13
|
+
class Blog1Controller < Controller
|
14
|
+
def list
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
15
18
|
class Blog2Controller < Controller
|
16
19
|
attr_reader :aqflag, :tflag
|
17
20
|
|
@@ -22,11 +25,26 @@ class TC_Controller < Test::Unit::TestCase # :nodoc: all
|
|
22
25
|
def list
|
23
26
|
@aqflag = true
|
24
27
|
end
|
28
|
+
|
29
|
+
def another(oid)
|
30
|
+
# nop
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def encode_myself
|
36
|
+
encode_url :list
|
37
|
+
end
|
38
|
+
|
39
|
+
def encode_blog1
|
40
|
+
encode_url Blog1Controller, :list
|
41
|
+
end
|
25
42
|
end
|
26
43
|
|
27
44
|
def setup
|
28
45
|
@disp = Dispatcher.new({
|
29
46
|
'/blog' => Blog2Controller,
|
47
|
+
'/blog1' => Blog1Controller
|
30
48
|
})
|
31
49
|
@conf = OpenStruct.new
|
32
50
|
@conf.dispatcher = @disp
|
@@ -47,6 +65,12 @@ class TC_Controller < Test::Unit::TestCase # :nodoc: all
|
|
47
65
|
# drink
|
48
66
|
end
|
49
67
|
|
68
|
+
assert_equal('/blog/list', c.send(:encode_myself))
|
69
|
+
assert_equal('/blog1/list', c.send(:encode_blog1))
|
70
|
+
|
71
|
+
# handle action with arity.
|
72
|
+
assert_equal('/blog/another/32', c.send(:encode_url, :another, :oid, 32))
|
73
|
+
|
50
74
|
assert_equal true, c.aqflag
|
51
75
|
assert_equal true, $include1
|
52
76
|
assert_equal true, $include2
|
@@ -63,4 +87,8 @@ class TC_Controller < Test::Unit::TestCase # :nodoc: all
|
|
63
87
|
assert Blog2Controller.action_methods.include?('list')
|
64
88
|
end
|
65
89
|
|
90
|
+
def test_encode_decode_methods
|
91
|
+
|
92
|
+
end
|
93
|
+
|
66
94
|
end
|