raw 0.49.0
Sign up to get free protection for your applications and to get access to all the features.
- data/doc/CONTRIBUTORS +106 -0
- data/doc/LICENSE +32 -0
- data/doc/coding_conventions.txt +11 -0
- data/lib/raw.rb +42 -0
- data/lib/raw/adapter.rb +113 -0
- data/lib/raw/adapter/cgi.rb +41 -0
- data/lib/raw/adapter/fastcgi.rb +48 -0
- data/lib/raw/adapter/mongrel.rb +146 -0
- data/lib/raw/adapter/script.rb +94 -0
- data/lib/raw/adapter/webrick.rb +144 -0
- data/lib/raw/adapter/webrick/vcr.rb +91 -0
- data/lib/raw/cgi.rb +323 -0
- data/lib/raw/cgi/cookie.rb +47 -0
- data/lib/raw/cgi/http.rb +62 -0
- data/lib/raw/compiler.rb +138 -0
- data/lib/raw/compiler/filter/cleanup.rb +21 -0
- data/lib/raw/compiler/filter/elements.rb +166 -0
- data/lib/raw/compiler/filter/elements/element.rb +210 -0
- data/lib/raw/compiler/filter/localization.rb +23 -0
- data/lib/raw/compiler/filter/markup.rb +32 -0
- data/lib/raw/compiler/filter/morph.rb +123 -0
- data/lib/raw/compiler/filter/morph/each.rb +34 -0
- data/lib/raw/compiler/filter/morph/for.rb +11 -0
- data/lib/raw/compiler/filter/morph/if.rb +26 -0
- data/lib/raw/compiler/filter/morph/selected_if.rb +43 -0
- data/lib/raw/compiler/filter/morph/standard.rb +55 -0
- data/lib/raw/compiler/filter/morph/times.rb +27 -0
- data/lib/raw/compiler/filter/script.rb +116 -0
- data/lib/raw/compiler/filter/squeeze.rb +16 -0
- data/lib/raw/compiler/filter/static_include.rb +74 -0
- data/lib/raw/compiler/filter/template.rb +121 -0
- data/lib/raw/compiler/reloader.rb +96 -0
- data/lib/raw/context.rb +154 -0
- data/lib/raw/context/flash.rb +157 -0
- data/lib/raw/context/global.rb +88 -0
- data/lib/raw/context/request.rb +338 -0
- data/lib/raw/context/response.rb +57 -0
- data/lib/raw/context/session.rb +198 -0
- data/lib/raw/context/session/drb.rb +11 -0
- data/lib/raw/context/session/file.rb +15 -0
- data/lib/raw/context/session/memcached.rb +13 -0
- data/lib/raw/context/session/memory.rb +12 -0
- data/lib/raw/context/session/og.rb +15 -0
- data/lib/raw/context/session/pstore.rb +13 -0
- data/lib/raw/control.rb +18 -0
- data/lib/raw/control/attribute.rb +91 -0
- data/lib/raw/control/attribute/checkbox.rb +25 -0
- data/lib/raw/control/attribute/datetime.rb +21 -0
- data/lib/raw/control/attribute/file.rb +20 -0
- data/lib/raw/control/attribute/fixnum.rb +26 -0
- data/lib/raw/control/attribute/float.rb +26 -0
- data/lib/raw/control/attribute/options.rb +38 -0
- data/lib/raw/control/attribute/password.rb +16 -0
- data/lib/raw/control/attribute/text.rb +16 -0
- data/lib/raw/control/attribute/textarea.rb +16 -0
- data/lib/raw/control/none.rb +16 -0
- data/lib/raw/control/relation.rb +59 -0
- data/lib/raw/control/relation/belongs_to.rb +0 -0
- data/lib/raw/control/relation/has_many.rb +97 -0
- data/lib/raw/control/relation/joins_many.rb +0 -0
- data/lib/raw/control/relation/many_to_many.rb +0 -0
- data/lib/raw/control/relation/refers_to.rb +29 -0
- data/lib/raw/controller.rb +37 -0
- data/lib/raw/controller/publishable.rb +160 -0
- data/lib/raw/dispatcher.rb +209 -0
- data/lib/raw/dispatcher/format.rb +108 -0
- data/lib/raw/dispatcher/format/atom.rb +31 -0
- data/lib/raw/dispatcher/format/css.rb +0 -0
- data/lib/raw/dispatcher/format/html.rb +42 -0
- data/lib/raw/dispatcher/format/json.rb +31 -0
- data/lib/raw/dispatcher/format/rss.rb +33 -0
- data/lib/raw/dispatcher/format/xoxo.rb +31 -0
- data/lib/raw/dispatcher/mounter.rb +60 -0
- data/lib/raw/dispatcher/router.rb +111 -0
- data/lib/raw/errors.rb +19 -0
- data/lib/raw/helper.rb +86 -0
- data/lib/raw/helper/benchmark.rb +23 -0
- data/lib/raw/helper/buffer.rb +60 -0
- data/lib/raw/helper/cookie.rb +32 -0
- data/lib/raw/helper/debug.rb +28 -0
- data/lib/raw/helper/default.rb +16 -0
- data/lib/raw/helper/feed.rb +451 -0
- data/lib/raw/helper/form.rb +284 -0
- data/lib/raw/helper/javascript.rb +59 -0
- data/lib/raw/helper/layout.rb +40 -0
- data/lib/raw/helper/navigation.rb +87 -0
- data/lib/raw/helper/pager.rb +305 -0
- data/lib/raw/helper/table.rb +247 -0
- data/lib/raw/helper/xhtml.rb +218 -0
- data/lib/raw/helper/xml.rb +125 -0
- data/lib/raw/mixin/magick.rb +35 -0
- data/lib/raw/mixin/sweeper.rb +71 -0
- data/lib/raw/mixin/thumbnails.rb +1 -0
- data/lib/raw/mixin/webfile.rb +165 -0
- data/lib/raw/render.rb +271 -0
- data/lib/raw/render/builder.rb +26 -0
- data/lib/raw/render/caching.rb +81 -0
- data/lib/raw/render/call.rb +43 -0
- data/lib/raw/render/send_file.rb +46 -0
- data/lib/raw/render/stream.rb +39 -0
- data/lib/raw/scaffold.rb +13 -0
- data/lib/raw/scaffold/controller.rb +25 -0
- data/lib/raw/scaffold/model.rb +157 -0
- data/lib/raw/test.rb +5 -0
- data/lib/raw/test/assertions.rb +169 -0
- data/lib/raw/test/context.rb +55 -0
- data/lib/raw/test/testcase.rb +79 -0
- data/lib/raw/util/attr.rb +128 -0
- data/lib/raw/util/encode_uri.rb +149 -0
- data/lib/raw/util/html_filter.rb +538 -0
- data/lib/raw/util/markup.rb +130 -0
- data/test/glue/tc_webfile.rb +1 -0
- data/test/nitro/CONFIG.rb +3 -0
- data/test/nitro/adapter/raw_post1.bin +9 -0
- data/test/nitro/adapter/tc_webrick.rb +16 -0
- data/test/nitro/cgi/tc_cookie.rb +14 -0
- data/test/nitro/cgi/tc_request.rb +61 -0
- data/test/nitro/compiler/tc_client_morpher.rb +47 -0
- data/test/nitro/compiler/tc_compiler.rb +25 -0
- data/test/nitro/dispatcher/tc_mounter.rb +47 -0
- data/test/nitro/helper/tc_feed.rb +135 -0
- data/test/nitro/helper/tc_navbar.rb +74 -0
- data/test/nitro/helper/tc_pager.rb +35 -0
- data/test/nitro/helper/tc_table.rb +68 -0
- data/test/nitro/helper/tc_xhtml.rb +19 -0
- data/test/nitro/tc_caching.rb +19 -0
- data/test/nitro/tc_cgi.rb +222 -0
- data/test/nitro/tc_context.rb +17 -0
- data/test/nitro/tc_controller.rb +103 -0
- data/test/nitro/tc_controller_aspect.rb +32 -0
- data/test/nitro/tc_controller_params.rb +885 -0
- data/test/nitro/tc_dispatcher.rb +109 -0
- data/test/nitro/tc_element.rb +85 -0
- data/test/nitro/tc_flash.rb +59 -0
- data/test/nitro/tc_helper.rb +47 -0
- data/test/nitro/tc_render.rb +119 -0
- data/test/nitro/tc_router.rb +61 -0
- data/test/nitro/tc_server.rb +35 -0
- data/test/nitro/tc_session.rb +66 -0
- data/test/nitro/tc_template.rb +71 -0
- data/test/nitro/util/tc_encode_url.rb +87 -0
- data/test/nitro/util/tc_markup.rb +31 -0
- data/test/public/blog/another/very_litle/index.xhtml +1 -0
- data/test/public/blog/inc1.xhtml +2 -0
- data/test/public/blog/inc2.xhtml +1 -0
- data/test/public/blog/list.xhtml +9 -0
- data/test/public/dummy_mailer/registration.xhtml +5 -0
- metadata +244 -0
@@ -0,0 +1,130 @@
|
|
1
|
+
require "redcloth"
|
2
|
+
require "cgi"
|
3
|
+
|
4
|
+
require "facets/core/module/class_extension"
|
5
|
+
|
6
|
+
require "raw/util/html_filter"
|
7
|
+
|
8
|
+
module Raw
|
9
|
+
|
10
|
+
# Generalised Markup transformations.
|
11
|
+
#
|
12
|
+
# The expand methods evaluate (expand) the markup
|
13
|
+
# code to produce the final content. The compact
|
14
|
+
# methods reverse this process to create the original
|
15
|
+
# markup code. Not all markup transformations are
|
16
|
+
# reversible.
|
17
|
+
#
|
18
|
+
# When this library is included, the default PropertyUtils
|
19
|
+
# implementation is overriden to add markup support.
|
20
|
+
#
|
21
|
+
# === Examples
|
22
|
+
#
|
23
|
+
# Define your custom markup methods like this:
|
24
|
+
#
|
25
|
+
# module Markup
|
26
|
+
# def markup_simple
|
27
|
+
# ...
|
28
|
+
# end
|
29
|
+
# def markup_special
|
30
|
+
# ...
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# # maps the {{..}} macro
|
34
|
+
# alias_method :sanitize, :markup_simple
|
35
|
+
# # maps the {|..|} macro
|
36
|
+
# alias_method :markup, :markup_special
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# here comes the #{obj.body} # => prints the expanded version.
|
40
|
+
#
|
41
|
+
# obj.body = markup(@params['body'])
|
42
|
+
|
43
|
+
module Markup
|
44
|
+
|
45
|
+
private
|
46
|
+
# The default markup method. You should override this method
|
47
|
+
# in your application to call your custom markup
|
48
|
+
# methods.
|
49
|
+
|
50
|
+
def expand(str)
|
51
|
+
if str
|
52
|
+
xstr = str.dup
|
53
|
+
xstr.gsub!(/</, '<')
|
54
|
+
xstr.gsub!(/>/, '>')
|
55
|
+
xstr.gsub!(/\r/, '<br />')
|
56
|
+
return xstr.html_filter
|
57
|
+
end
|
58
|
+
return nil
|
59
|
+
end
|
60
|
+
alias_method :sanitize, :expand
|
61
|
+
|
62
|
+
# ...
|
63
|
+
begin
|
64
|
+
require 'redcloth'
|
65
|
+
# Translates a String with Textile/Markdown formatting
|
66
|
+
# into XHTML. Depends on the RedCloth gem to work properly
|
67
|
+
|
68
|
+
def expand_redcloth(str)
|
69
|
+
if str
|
70
|
+
return RedCloth.new(expand(str)).to_html
|
71
|
+
end
|
72
|
+
return nil
|
73
|
+
end
|
74
|
+
rescue LoadError
|
75
|
+
def expand_redcloth(str) # :nodoc:
|
76
|
+
"You called expand_redcloth(), but it needs RedCloth installed to work"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
alias_method :markup, :expand_redcloth
|
80
|
+
|
81
|
+
# Compact (reverse) the content to the origial markup
|
82
|
+
# code. Not all markup transformations are reversible.
|
83
|
+
# You should override this method in your application
|
84
|
+
# to call your custom markup methods.
|
85
|
+
#
|
86
|
+
# NOT IMPLEMENTED.
|
87
|
+
|
88
|
+
def compact(str, meth = nil)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Remove markup code from the input string.
|
92
|
+
#
|
93
|
+
# NOT IMPLEMENTED.
|
94
|
+
|
95
|
+
def clear(str)
|
96
|
+
end
|
97
|
+
|
98
|
+
def escape(str)
|
99
|
+
CGI.escape(str.gsub(/ /, '_'))
|
100
|
+
end
|
101
|
+
|
102
|
+
def unescape(str)
|
103
|
+
CGI.unescape(str.gsub(/_/, ' '))
|
104
|
+
end
|
105
|
+
|
106
|
+
class_extension do
|
107
|
+
# Helper method for manipulating the sanitize transformation.
|
108
|
+
|
109
|
+
def setup_sanitize_transform(&block)
|
110
|
+
self.send :define_method, :sanitize, block
|
111
|
+
end
|
112
|
+
alias_method :setup_sanitize_transformation, :setup_sanitize_transform
|
113
|
+
|
114
|
+
# Helper method for manipulating the markup transformation.
|
115
|
+
|
116
|
+
def setup_markup_transform(&block)
|
117
|
+
self.send :define_method, :markup, block
|
118
|
+
end
|
119
|
+
alias_method :setup_markup_transformation, :setup_markup_transform
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# An abstract Markup class.
|
124
|
+
|
125
|
+
class MarkupKit
|
126
|
+
extend Markup
|
127
|
+
include Markup
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# Please add me!
|
@@ -0,0 +1,9 @@
|
|
1
|
+
-----------------------------277124474474241471962886717
|
2
|
+
Content-Disposition: form-data; name="title"
|
3
|
+
|
4
|
+
dsadsad
|
5
|
+
-----------------------------277124474474241471962886717
|
6
|
+
Content-Disposition: form-data; name="file"; filename="nitro.png"
|
7
|
+
Content-Type: image/png
|
8
|
+
|
9
|
+
�PNG
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
require 'glue'
|
7
|
+
require 'nitro'
|
8
|
+
require 'nitro/adapter/webrick'
|
9
|
+
|
10
|
+
class TC_AdaptersWebrick < Test::Unit::TestCase # :nodoc: all
|
11
|
+
include Nitro
|
12
|
+
|
13
|
+
def test_adaptor
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
require 'nitro/cgi/cookie'
|
6
|
+
|
7
|
+
class TC_Cookie < Test::Unit::TestCase # :nodoc: all
|
8
|
+
include Nitro
|
9
|
+
|
10
|
+
def test_init
|
11
|
+
c = Cookie.new('hello', 'world')
|
12
|
+
assert_equal '/', c.path
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
require 'nitro/cgi/request'
|
6
|
+
|
7
|
+
class TC_Request < Test::Unit::TestCase # :nodoc: all
|
8
|
+
class DummyRequest
|
9
|
+
include Nitro::Request
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@headers = {}
|
13
|
+
@params = {}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_all
|
18
|
+
req = DummyRequest.new
|
19
|
+
|
20
|
+
req.headers['HTTP_HOST'] = 'www.nitroproject.org'
|
21
|
+
assert_equal 'nitroproject.org', req.domain
|
22
|
+
assert_equal 'www', req.subdomains.first
|
23
|
+
|
24
|
+
req.headers['HTTP_HOST'] = 'www.nitroproject.co.uk'
|
25
|
+
assert_equal 'nitroproject.co.uk', req.domain(2)
|
26
|
+
|
27
|
+
req.headers['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
28
|
+
assert req.xhr?
|
29
|
+
|
30
|
+
req.headers['REQUEST_METHOD'] = 'POST'
|
31
|
+
|
32
|
+
req.headers['CONTENT_TYPE'] = 'application/x-yaml'
|
33
|
+
assert req.yaml_post?
|
34
|
+
|
35
|
+
req.instance_variable_set '@post_format', nil
|
36
|
+
req.headers['CONTENT_TYPE'] = 'text/xml'
|
37
|
+
assert req.xml_post?
|
38
|
+
|
39
|
+
req['test'] = 'hello'
|
40
|
+
assert req['test']
|
41
|
+
assert_equal 'hello', req['test']
|
42
|
+
assert req.has?('test')
|
43
|
+
|
44
|
+
assert !req.has?('phantom')
|
45
|
+
|
46
|
+
req['bug'] = nil
|
47
|
+
assert !req.has?('bug')
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_local_net?
|
51
|
+
req = DummyRequest.new
|
52
|
+
|
53
|
+
local_ips = ["192.168.1.1", "192.168.20.1", "192.168.99.1", "192.168.200.1", "192.168.21.245", "192.168.90.34", "192.168.254.254", "172.16.1.1", "172.18.1.1", "172.31.254.1", "172.21.1.254", "10.16.1.1", "10.0.1.1", "10.254.1.254", "10.192.1.192", "10.254.254.254", "10.10.10.10"]
|
54
|
+
|
55
|
+
not_local_ips = ["191.168.1.1", "192.169.20.1", "193.168.254.254", "172.15.1.1", "171.18.1.1", "172.32.0.0", "173.21.1.254", "11.16.1.1", "66.249.93.104", "72.14.221.104", "66.102.9.104", "17.254.3.183", "207.46.250.119", "207.46.130.108", "207.68.160.190", "65.54.240.126", "213.199.144.151", "65.55.238.126"]
|
56
|
+
|
57
|
+
assert_equal true, local_ips.map { |ip| req.local_net?(ip) }.all?
|
58
|
+
assert_equal true, not_local_ips.map { |ip| req.local_net?(ip) }.all?{|v|!v}
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -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,25 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
require 'nitro/test/testcase'
|
6
|
+
|
7
|
+
require 'nitro'
|
8
|
+
require 'nitro/test/context'
|
9
|
+
|
10
|
+
class TC_Compiler < Test::Unit::TestCase
|
11
|
+
class TestController < Nitro::Controller
|
12
|
+
def test(arg1, arg2); end
|
13
|
+
end
|
14
|
+
|
15
|
+
def setup
|
16
|
+
Server.map['/'] = TestController
|
17
|
+
reset_context()
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_no_param_specified
|
21
|
+
assert_nothing_raised do
|
22
|
+
process(:uri => '/test/two')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "CONFIG.rb")
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "nitro/dispatcher"
|
6
|
+
|
7
|
+
class TC_DispatcherMounter < Test::Unit::TestCase # :nodoc: all
|
8
|
+
|
9
|
+
include Nitro
|
10
|
+
|
11
|
+
class RootController
|
12
|
+
end
|
13
|
+
|
14
|
+
class LinkController
|
15
|
+
end
|
16
|
+
|
17
|
+
class LinkCommentController
|
18
|
+
end
|
19
|
+
|
20
|
+
class UserController
|
21
|
+
end
|
22
|
+
|
23
|
+
def setup
|
24
|
+
@d = Dispatcher.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def teardown
|
28
|
+
@d = nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_mount
|
32
|
+
@d.root = RootController
|
33
|
+
assert_equal RootController, @d["/"]
|
34
|
+
|
35
|
+
@d.root.links = LinkController
|
36
|
+
assert_equal LinkController, @d["/links"]
|
37
|
+
assert_equal RootController, LinkController.ann(:self, :parent)
|
38
|
+
|
39
|
+
@d.root.links.comments = LinkCommentController
|
40
|
+
assert_equal LinkCommentController, @d["/links/comments"]
|
41
|
+
assert_equal LinkController, LinkCommentController.ann(:self, :parent)
|
42
|
+
|
43
|
+
@d.root.users = UserController
|
44
|
+
assert_equal UserController, @d["/users"]
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,135 @@
|
|
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
|