nitro 0.7.0 → 0.8.0
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/AUTHORS +14 -4
- data/ChangeLog +192 -1
- data/README +50 -6
- data/RELEASES +60 -0
- data/Rakefile +1 -1
- data/bin/cluster.rb +2 -2
- data/bin/new_form.rb +1 -1
- data/examples/blog/config.rb +5 -4
- data/examples/blog/lib/blog.rb +56 -36
- data/examples/blog/root/comments.xhtml +5 -2
- data/examples/blog/root/entry_form.xhtml +7 -2
- data/examples/blog/root/login.xhtml +1 -1
- data/examples/blog/root/style.xsl +7 -0
- data/examples/og/mock_example.rb +6 -9
- data/examples/og/mysql_to_psql.rb +100 -0
- data/examples/og/run.rb +8 -17
- data/lib/glue.rb +7 -8
- data/lib/glue/array.rb +1 -1
- data/lib/glue/attribute.rb +86 -0
- data/lib/glue/cache.rb +1 -1
- data/lib/glue/hash.rb +1 -1
- data/lib/glue/inflector.rb +1 -1
- data/lib/glue/logger.rb +118 -18
- data/lib/glue/mixins.rb +1 -1
- data/lib/glue/number.rb +1 -1
- data/lib/glue/pool.rb +1 -1
- data/lib/glue/property.rb +48 -31
- data/lib/glue/string.rb +1 -1
- data/lib/glue/time.rb +2 -2
- data/lib/glue/validation.rb +400 -0
- data/lib/nitro/application.rb +6 -6
- data/lib/nitro/builders/form.rb +5 -5
- data/lib/nitro/builders/rss.rb +1 -1
- data/lib/nitro/builders/xhtml.rb +119 -0
- data/lib/nitro/builders/xml.rb +111 -0
- data/lib/nitro/config.rb +6 -6
- data/lib/nitro/events.rb +1 -1
- data/lib/nitro/html.rb +1 -1
- data/lib/nitro/markup.rb +15 -20
- data/lib/nitro/scaffold.rb +2 -2
- data/lib/nitro/server/appserver.rb +3 -3
- data/lib/nitro/server/cluster.rb +2 -2
- data/lib/nitro/server/dispatcher.rb +2 -2
- data/lib/nitro/server/filters/autologin.rb +1 -1
- data/lib/nitro/server/fragment.rb +2 -2
- data/lib/nitro/server/handlers.rb +2 -2
- data/lib/nitro/server/render.rb +17 -15
- data/lib/nitro/server/request.rb +6 -6
- data/lib/nitro/server/script.rb +2 -2
- data/lib/nitro/server/server.rb +2 -2
- data/lib/nitro/server/session.rb +6 -6
- data/lib/nitro/server/shaders.rb +2 -2
- data/lib/nitro/server/webrick.rb +1 -1
- data/lib/nitro/sitemap.rb +2 -2
- data/lib/nitro/uri.rb +1 -1
- data/lib/nitro/version.rb +7 -5
- data/lib/og.rb +95 -129
- data/lib/og/backend.rb +47 -46
- data/lib/og/backends/mysql.rb +64 -63
- data/lib/og/backends/psql.rb +73 -72
- data/lib/og/connection.rb +7 -8
- data/lib/og/enchant.rb +80 -0
- data/lib/og/meta.rb +21 -21
- data/lib/og/mock.rb +31 -88
- data/lib/og/version.rb +6 -5
- data/lib/parts/README +9 -0
- data/lib/parts/content.rb +23 -9
- data/test/glue/tc_attribute.rb +22 -0
- data/test/glue/tc_cache.rb +4 -6
- data/test/glue/tc_hash.rb +2 -2
- data/test/glue/tc_logger.rb +36 -0
- data/test/glue/tc_numbers.rb +2 -2
- data/test/glue/tc_property_mixins.rb +35 -4
- data/test/glue/tc_strings.rb +32 -32
- data/test/glue/tc_validation.rb +186 -0
- data/test/nitro/builders/tc_xhtml.rb +38 -0
- data/test/nitro/builders/tc_xml.rb +47 -0
- data/test/nitro/server/tc_request.rb +2 -2
- data/test/nitro/server/tc_session.rb +1 -1
- data/test/nitro/tc_sitemap.rb +1 -1
- data/test/nitro/ui/tc_pager.rb +1 -10
- data/test/tc_og.rb +3 -3
- data/vendor/blankslate.rb +53 -0
- data/vendor/extensions/_base.rb +153 -0
- data/vendor/extensions/_template.rb +36 -0
- data/vendor/extensions/all.rb +21 -0
- data/vendor/extensions/array.rb +68 -0
- data/vendor/extensions/binding.rb +224 -0
- data/vendor/extensions/class.rb +50 -0
- data/vendor/extensions/continuation.rb +71 -0
- data/vendor/extensions/enumerable.rb +250 -0
- data/vendor/extensions/hash.rb +23 -0
- data/vendor/extensions/io.rb +58 -0
- data/vendor/extensions/kernel.rb +42 -0
- data/vendor/extensions/module.rb +114 -0
- data/vendor/extensions/numeric.rb +230 -0
- data/vendor/extensions/object.rb +164 -0
- data/vendor/extensions/ostruct.rb +41 -0
- data/vendor/extensions/string.rb +316 -0
- data/vendor/extensions/symbol.rb +28 -0
- metadata +35 -13
- data/lib/glue/property.rb.old +0 -307
data/lib/parts/README
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
= Parts
|
|
2
|
+
|
|
3
|
+
Parts are 'modules of functionality'. This is a higher level concept.
|
|
4
|
+
Examples of parts could be a Forum, a Content/User management system,
|
|
5
|
+
etc.
|
|
6
|
+
|
|
7
|
+
Nitro is a low level framework and does not include functionality parts
|
|
8
|
+
in the standard distribution. Libraries of modules will be available from
|
|
9
|
+
Navel and other vendors.
|
data/lib/parts/content.rb
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
# = Content
|
|
2
|
-
#
|
|
3
|
-
# Content Management Foundation
|
|
1
|
+
# = Content
|
|
4
2
|
#
|
|
5
|
-
#
|
|
6
|
-
# * George Moschovitis <gm@navel.gr>
|
|
3
|
+
# Content management foundation.
|
|
7
4
|
#
|
|
5
|
+
# George Moschovitis <gm@navel.gr>
|
|
8
6
|
# (c) 2004 Navel, all rights reserved.
|
|
9
7
|
# $Id$
|
|
10
8
|
|
|
@@ -23,15 +21,31 @@ module BaseContent
|
|
|
23
21
|
prop_accessor :body, String, :markup => true, :ui => :textarea
|
|
24
22
|
end
|
|
25
23
|
|
|
24
|
+
# = CreateTime mixin.
|
|
25
|
+
#
|
|
26
|
+
module CreateTime
|
|
27
|
+
prop_accessor :create_time, Time
|
|
28
|
+
prop_accessor :update_time, Time
|
|
29
|
+
|
|
30
|
+
def og_pre_insert(conn)
|
|
31
|
+
@create_time = @update_time = Time.now
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def og_pre_update(conn)
|
|
35
|
+
@update_time = Time.now
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
26
39
|
# = Content
|
|
27
40
|
#
|
|
28
41
|
# The foundamental Content Unit.
|
|
29
|
-
#
|
|
30
42
|
#--
|
|
31
43
|
# THINK: rename this to Entity?
|
|
32
44
|
#++
|
|
45
|
+
|
|
33
46
|
module Content
|
|
34
47
|
include N::BaseContent
|
|
48
|
+
prop_accessor :name, String
|
|
35
49
|
prop_accessor :ctime, Time
|
|
36
50
|
prop_accessor :mtime, Time
|
|
37
51
|
|
|
@@ -41,7 +55,7 @@ module Content
|
|
|
41
55
|
end
|
|
42
56
|
|
|
43
57
|
# = Category
|
|
44
|
-
|
|
58
|
+
|
|
45
59
|
class Category
|
|
46
60
|
include N::BaseContent
|
|
47
61
|
end
|
|
@@ -49,7 +63,7 @@ end
|
|
|
49
63
|
# = ACL
|
|
50
64
|
#
|
|
51
65
|
# Unix style permissions.
|
|
52
|
-
|
|
66
|
+
|
|
53
67
|
module ACL
|
|
54
68
|
# bits:
|
|
55
69
|
# 0, 1, 2: owner read, write, execute
|
|
@@ -58,4 +72,4 @@ module ACL
|
|
|
58
72
|
prop_accessor :permissions
|
|
59
73
|
end
|
|
60
74
|
|
|
61
|
-
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
|
|
2
|
+
|
|
3
|
+
require 'test/unit'
|
|
4
|
+
require 'glue/attribute'
|
|
5
|
+
|
|
6
|
+
class TC_Attribute < Test::Unit::TestCase # :nodoc: all
|
|
7
|
+
|
|
8
|
+
class Dummy
|
|
9
|
+
cattr_accessor :value, 'Default'
|
|
10
|
+
cattr_reader :reader, 3
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_attr
|
|
14
|
+
assert_equal 'Default', Dummy.value
|
|
15
|
+
assert_nothing_raised { Dummy.value = 2 }
|
|
16
|
+
assert_equal 2, Dummy.value
|
|
17
|
+
|
|
18
|
+
assert_equal 3, Dummy.reader
|
|
19
|
+
assert_raise(NoMethodError) { Dummy.reader = 19 }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
data/test/glue/tc_cache.rb
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
# :nodoc: all
|
|
2
|
-
|
|
3
1
|
require "test/unit"
|
|
4
2
|
require "glue/cache"
|
|
5
3
|
|
|
6
|
-
class
|
|
4
|
+
class TC_Glue_Cache < Test::Unit::TestCase
|
|
7
5
|
# :nodoc: all
|
|
8
6
|
|
|
9
7
|
class Dummy
|
|
10
|
-
include
|
|
8
|
+
include N::LRUCache::Item
|
|
11
9
|
end
|
|
12
10
|
|
|
13
11
|
def setup
|
|
14
|
-
@cache =
|
|
12
|
+
@cache = N::LRUCache.new(maxitems = 3)
|
|
15
13
|
end
|
|
16
14
|
|
|
17
15
|
def teardown
|
|
@@ -44,4 +42,4 @@ class TC_N_Utils_Cache < Test::Unit::TestCase
|
|
|
44
42
|
assert_equal(d4, @cache.first)
|
|
45
43
|
end
|
|
46
44
|
|
|
47
|
-
end
|
|
45
|
+
end
|
data/test/glue/tc_hash.rb
CHANGED
|
@@ -7,7 +7,7 @@ class TC_N2_Utils_Cache < Test::Unit::TestCase
|
|
|
7
7
|
# :nodoc: all
|
|
8
8
|
|
|
9
9
|
def setup
|
|
10
|
-
@safe_cache =
|
|
10
|
+
@safe_cache = N::SafeHash.new(Hash.new)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def teardown
|
|
@@ -35,4 +35,4 @@ class TC_N2_Utils_Cache < Test::Unit::TestCase
|
|
|
35
35
|
assert_equal(3, @safe_cache.values.size)
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
|
|
2
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'vendor')
|
|
3
|
+
|
|
4
|
+
require 'stringio'
|
|
5
|
+
|
|
6
|
+
require 'test/unit'
|
|
7
|
+
require 'glue/logger'
|
|
8
|
+
|
|
9
|
+
class TC_Logger < Test::Unit::TestCase # :nodoc: all
|
|
10
|
+
|
|
11
|
+
def setup
|
|
12
|
+
@io = StringIO.new('')
|
|
13
|
+
Logger.set(Logger.new(@io))
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_logger
|
|
17
|
+
Logger.info 'hello'
|
|
18
|
+
assert_equal(" INFO: hello\n", @io.string)
|
|
19
|
+
|
|
20
|
+
# bug: Binding.of_caller thinks Logger is the caller.
|
|
21
|
+
a = 14
|
|
22
|
+
b = 13
|
|
23
|
+
Logger.trace 'a * b'
|
|
24
|
+
assert_equal(" INFO: hello\nDEBUG: a * b = 182\n", @io.string)
|
|
25
|
+
|
|
26
|
+
@io.string = ''
|
|
27
|
+
Logger.debug 'hello'
|
|
28
|
+
assert_equal("DEBUG: hello\n", @io.string)
|
|
29
|
+
|
|
30
|
+
# test logging level.
|
|
31
|
+
Logger.get.level = Logger::INFO
|
|
32
|
+
Logger.debug 'world'
|
|
33
|
+
assert_equal("DEBUG: hello\n", @io.string)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
data/test/glue/tc_numbers.rb
CHANGED
|
@@ -13,8 +13,8 @@ class TC_N_NumberUtils < Test::Unit::TestCase
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def test_ceil_multiple
|
|
16
|
-
assert_equal(20,
|
|
17
|
-
assert_equal(10,
|
|
16
|
+
assert_equal(20, N::NumberUtils.ceil_multiple(15, 10))
|
|
17
|
+
assert_equal(10, N::NumberUtils.ceil_multiple(1, 10))
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
end
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#! /usr/bin/env ruby
|
|
2
2
|
# vim:sw=2:ai
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
4
|
+
#--
|
|
5
|
+
# Thomas Quas <tquas@yahoo.com>
|
|
6
|
+
# George Moschovitis <gm@navel.gr>
|
|
8
7
|
# $Id$
|
|
8
|
+
#++
|
|
9
9
|
|
|
10
10
|
$LOAD_PATH.unshift 'lib'
|
|
11
11
|
|
|
@@ -14,9 +14,16 @@ require 'glue/property'
|
|
|
14
14
|
|
|
15
15
|
module Mixin
|
|
16
16
|
prop_accessor :date
|
|
17
|
+
meta :dummy, [123]
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
class MixedOnly
|
|
21
|
+
include Mixin
|
|
22
|
+
__meta[:dummy] << 5
|
|
23
|
+
__meta[:dummy] << 3
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class MixedOnly2
|
|
20
27
|
include Mixin
|
|
21
28
|
end
|
|
22
29
|
|
|
@@ -33,6 +40,18 @@ end
|
|
|
33
40
|
class Empty
|
|
34
41
|
end
|
|
35
42
|
|
|
43
|
+
class Base
|
|
44
|
+
prop_accessor :date
|
|
45
|
+
meta :dummy, [123]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class Child1 < Base
|
|
49
|
+
__meta[:dummy].first << 5
|
|
50
|
+
__meta[:dummy].first << 3
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class Child2 < Base
|
|
54
|
+
end
|
|
36
55
|
|
|
37
56
|
# Tests auto management.
|
|
38
57
|
class TC_MixinsTest < ::Test::Unit::TestCase
|
|
@@ -59,4 +78,16 @@ class TC_MixinsTest < ::Test::Unit::TestCase
|
|
|
59
78
|
assert( obj.respond_to?( :date ) )
|
|
60
79
|
assert( obj.respond_to?( :dummy ) )
|
|
61
80
|
end
|
|
81
|
+
|
|
82
|
+
def test_crosspolination
|
|
83
|
+
assert_equal 3, MixedOnly.__meta[:dummy].size
|
|
84
|
+
assert_equal 1, MixedOnly2.__meta[:dummy].size
|
|
85
|
+
assert_equal 1, Mixin.__meta[:dummy].size
|
|
86
|
+
=begin
|
|
87
|
+
gmosx: THINK!
|
|
88
|
+
assert_equal 3, Child1.__meta[:dummy].first.size
|
|
89
|
+
assert_equal 1, Child2.__meta[:dummy].first.size
|
|
90
|
+
assert_equal 1, Base.__meta[:dummy].first.size
|
|
91
|
+
=end
|
|
92
|
+
end
|
|
62
93
|
end
|
data/test/glue/tc_strings.rb
CHANGED
|
@@ -11,20 +11,20 @@ class TC_StringUtilsUtils < Test::Unit::TestCase
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def test_valid?
|
|
14
|
-
assert_equal(true,
|
|
15
|
-
assert_equal(false,
|
|
16
|
-
assert_equal(false,
|
|
14
|
+
assert_equal(true, N::StringUtils.valid?("test"))
|
|
15
|
+
assert_equal(false, N::StringUtils.valid?(""))
|
|
16
|
+
assert_equal(false, N::StringUtils.valid?(nil))
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def test_head
|
|
20
|
-
assert_equal(nil,
|
|
21
|
-
assert_equal("this...",
|
|
22
|
-
assert_equal("this+++",
|
|
23
|
-
assert_equal("thi...",
|
|
24
|
-
assert_equal("this is...",
|
|
25
|
-
assert_equal(nil,
|
|
26
|
-
assert_equal(nil,
|
|
27
|
-
assert_equal("this is...",
|
|
20
|
+
assert_equal(nil, N::StringUtils.head(nil))
|
|
21
|
+
assert_equal("this...", N::StringUtils.head(@s, 3))
|
|
22
|
+
assert_equal("this+++", N::StringUtils.head(@s, 3, false, "+++"))
|
|
23
|
+
assert_equal("thi...", N::StringUtils.head(@s, 3, true))
|
|
24
|
+
assert_equal("this is...", N::StringUtils.head(@s, 8))
|
|
25
|
+
assert_equal(nil, N::StringUtils.head(@s, 0))
|
|
26
|
+
assert_equal(nil, N::StringUtils.head(@s, 0, true))
|
|
27
|
+
assert_equal("this is...", N::StringUtils.head(@s, 8, true))
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def test_rewrite
|
|
@@ -34,65 +34,65 @@ class TC_StringUtilsUtils < Test::Unit::TestCase
|
|
|
34
34
|
[/^games/, "../../games"],
|
|
35
35
|
[/^tmp/, "/n/theseas/var/tmp"],
|
|
36
36
|
]
|
|
37
|
-
string =
|
|
37
|
+
string = N::StringUtils.rewrite("games/arkanoid.html", rules)
|
|
38
38
|
assert_equal("../../games/arkanoid.html", string)
|
|
39
|
-
string =
|
|
39
|
+
string = N::StringUtils.rewrite("tmp/garbage.html", rules)
|
|
40
40
|
assert_equal("/n/theseas/var/tmp/garbage.html", string)
|
|
41
|
-
string =
|
|
41
|
+
string = N::StringUtils.rewrite("root/index.html", rules)
|
|
42
42
|
assert_equal("root/index.html", string)
|
|
43
|
-
assert_equal(nil,
|
|
44
|
-
assert_equal("",
|
|
43
|
+
assert_equal(nil, N::StringUtils.rewrite(nil, rules))
|
|
44
|
+
assert_equal("", N::StringUtils.rewrite("", rules))
|
|
45
45
|
|
|
46
46
|
assert_raises(ArgumentError) {
|
|
47
|
-
assert_equal("koko",
|
|
47
|
+
assert_equal("koko", N::StringUtils.rewrite("koko", nil))
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
# bug: should keep order
|
|
51
|
-
s =
|
|
51
|
+
s = N::StringUtils.rewrite("/$/koko.html", rules)
|
|
52
52
|
assert_equal("../n1/koko.html", s)
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
def test_wrap
|
|
56
56
|
s = "1234567890abcdefghijklmnopqrstu"
|
|
57
57
|
r = "1234 5678 90ab cdef ghij klmn opqr stu"
|
|
58
|
-
assert_equal(r,
|
|
58
|
+
assert_equal(r, N::StringUtils::wrap(s, 4, " "))
|
|
59
59
|
|
|
60
60
|
s = "111111111111111111111111111111111111111111111111"
|
|
61
61
|
r = "1111111111 1111111111 1111111111 1111111111 11111111"
|
|
62
|
-
assert_equal(r,
|
|
62
|
+
assert_equal(r, N::StringUtils::wrap(s, 10, " "))
|
|
63
63
|
|
|
64
64
|
s = "jackdaws love my big sphinx of quartz"
|
|
65
65
|
r = "jackdaws love my big sphinx of quartz"
|
|
66
|
-
assert_equal(r,
|
|
66
|
+
assert_equal(r, N::StringUtils::wrap(s, 10, " "))
|
|
67
67
|
|
|
68
68
|
s = "jackdaws love my big sphinx of quartz"
|
|
69
69
|
r = "jack daws love my big sphi nx of quar tz"
|
|
70
|
-
assert_equal(r,
|
|
70
|
+
assert_equal(r, N::StringUtils::wrap(s, 4, " "))
|
|
71
71
|
|
|
72
72
|
s = "jack.daws love my big sphinx of quartz"
|
|
73
73
|
r = "jack .daw s love my big sphi nx of quar tz"
|
|
74
|
-
assert_equal(r,
|
|
74
|
+
assert_equal(r, N::StringUtils::wrap(s, 4, " "))
|
|
75
75
|
|
|
76
|
-
assert_equal("",
|
|
77
|
-
assert_equal(nil,
|
|
76
|
+
assert_equal("", N::StringUtils::wrap("", 4, " "))
|
|
77
|
+
assert_equal(nil, N::StringUtils::wrap(nil, 4, " "))
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
def test_rationalize_filename
|
|
81
|
-
filename =
|
|
81
|
+
filename = N::StringUtils.rationalize_filename("hello my friend!.gif")
|
|
82
82
|
assert_equal("hello-my-friend.gif", filename)
|
|
83
|
-
filename =
|
|
83
|
+
filename = N::StringUtils.rationalize_filename("���� ����.gif")
|
|
84
84
|
assert_equal("pame-pali.gif", filename)
|
|
85
|
-
filename =
|
|
85
|
+
filename = N::StringUtils.rationalize_filename("�� ���.gif")
|
|
86
86
|
assert_equal("ti-les.gif", filename)
|
|
87
87
|
|
|
88
88
|
# bug:
|
|
89
|
-
filename =
|
|
89
|
+
filename = N::StringUtils.rationalize_filename("image-(10).gif")
|
|
90
90
|
assert_equal("image-10.gif", filename)
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
def test_random_string
|
|
94
|
-
s1 =
|
|
95
|
-
s2 =
|
|
94
|
+
s1 = N::StringUtils.random()
|
|
95
|
+
s2 = N::StringUtils.random()
|
|
96
96
|
assert_not_equal(s1, s2)
|
|
97
97
|
assert(s1.size == s2.size)
|
|
98
98
|
end
|
|
@@ -100,4 +100,4 @@ class TC_StringUtilsUtils < Test::Unit::TestCase
|
|
|
100
100
|
def teardown
|
|
101
101
|
@s = nil
|
|
102
102
|
end
|
|
103
|
-
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
|
|
2
|
+
|
|
3
|
+
require 'test/unit'
|
|
4
|
+
|
|
5
|
+
require 'glue'
|
|
6
|
+
require 'glue/validation'
|
|
7
|
+
|
|
8
|
+
class TC_Validation < Test::Unit::TestCase # :nodoc: all
|
|
9
|
+
|
|
10
|
+
# Override the default error message
|
|
11
|
+
N::Validation::Errors.invalid_format = 'INVALID'
|
|
12
|
+
|
|
13
|
+
module Mixin
|
|
14
|
+
prop_accessor :value, String
|
|
15
|
+
validate_format :value, :format => /123/, :msg => 'mixin error'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class User
|
|
19
|
+
include Mixin
|
|
20
|
+
|
|
21
|
+
prop_accessor :name, String
|
|
22
|
+
validate_format :name, :format => /Leo/, :msg => 'per class override'
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class Article
|
|
26
|
+
prop_accessor :name, String
|
|
27
|
+
validate_format :name, :format => /news/
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class Dummy1
|
|
31
|
+
prop_accessor :test, Fixnum
|
|
32
|
+
prop_accessor :str, String
|
|
33
|
+
validate_value :test, :str
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class Dummy2
|
|
37
|
+
prop_accessor :password, String
|
|
38
|
+
validate_confirmation :password
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class Dummy3
|
|
42
|
+
prop_accessor :vmin, String
|
|
43
|
+
validate_length :vmin, :min => 2
|
|
44
|
+
|
|
45
|
+
prop_accessor :vmax, String
|
|
46
|
+
validate_length :vmax, :max => 3, :msg => 'LOOONG'
|
|
47
|
+
|
|
48
|
+
prop_accessor :vran, String
|
|
49
|
+
validate_length :vran, :range => 2..4, :msg_long => 'argh'
|
|
50
|
+
|
|
51
|
+
prop_accessor :vlen, String
|
|
52
|
+
validate_length :vlen, :length => 3, :msg => 'argh'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class Dummy4
|
|
56
|
+
prop_accessor :sex, String
|
|
57
|
+
validate_inclusion :sex, :in => %w{ Male Female }, :msg => 'huh?'
|
|
58
|
+
|
|
59
|
+
prop_accessor :age, Fixnum
|
|
60
|
+
validate_inclusion :age, :in => 5..99
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# bug
|
|
64
|
+
|
|
65
|
+
class NoProp
|
|
66
|
+
include Mixin
|
|
67
|
+
validate_length :value, :min => 3
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_validate_value
|
|
71
|
+
d = Dummy1.new
|
|
72
|
+
|
|
73
|
+
assert !d.valid?
|
|
74
|
+
assert_equal 2, d.errors.count
|
|
75
|
+
d.test = 1
|
|
76
|
+
assert !d.valid?
|
|
77
|
+
assert_equal 1, d.errors.count
|
|
78
|
+
d.str = 'yeah'
|
|
79
|
+
assert d.valid?
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_validate_confirmation
|
|
83
|
+
d = Dummy2.new
|
|
84
|
+
|
|
85
|
+
assert_respond_to d, :password_confirmation
|
|
86
|
+
|
|
87
|
+
d.password = 'hello'
|
|
88
|
+
assert !d.valid?
|
|
89
|
+
d.password_confirmation = 'hel'
|
|
90
|
+
assert !d.valid?
|
|
91
|
+
d.password_confirmation = 'hello'
|
|
92
|
+
assert d.valid?
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test_validate_format
|
|
96
|
+
u = User.new
|
|
97
|
+
|
|
98
|
+
u.value = '1234'
|
|
99
|
+
|
|
100
|
+
u.name = 'George'
|
|
101
|
+
assert !u.valid?
|
|
102
|
+
|
|
103
|
+
assert_equal 'per class override', u.errors[:name].first
|
|
104
|
+
|
|
105
|
+
u.name = 'Leonard'
|
|
106
|
+
assert u.valid?
|
|
107
|
+
|
|
108
|
+
a = Article.new
|
|
109
|
+
|
|
110
|
+
a.name = 'In the news'
|
|
111
|
+
assert a.valid?
|
|
112
|
+
|
|
113
|
+
a.name = 'Sports'
|
|
114
|
+
assert !a.valid?
|
|
115
|
+
|
|
116
|
+
assert_equal 1, a.errors.count
|
|
117
|
+
assert_equal 1, a.errors.on(:name).size
|
|
118
|
+
assert_kind_of Array, a.errors[:name]
|
|
119
|
+
|
|
120
|
+
assert_equal 'INVALID', a.errors[:name].first
|
|
121
|
+
|
|
122
|
+
# test mixin
|
|
123
|
+
|
|
124
|
+
u.value = '543'
|
|
125
|
+
assert !u.valid?
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_validate_length
|
|
129
|
+
d = Dummy3.new
|
|
130
|
+
|
|
131
|
+
d.vmin = 'q'
|
|
132
|
+
d.vmax = '2'
|
|
133
|
+
d.vlen = '123'
|
|
134
|
+
d.vran = '123'
|
|
135
|
+
|
|
136
|
+
assert !d.valid?
|
|
137
|
+
assert_equal 'Too short, must be more than 2 characters long', d.errors.on(:vmin).first
|
|
138
|
+
d.vmin = 'longer'
|
|
139
|
+
assert d.valid?
|
|
140
|
+
|
|
141
|
+
d.vmax = 'loooooooooooong'
|
|
142
|
+
assert !d.valid?
|
|
143
|
+
assert_equal 'LOOONG', d.errors.on(:vmax).first
|
|
144
|
+
|
|
145
|
+
d.vmax = nil
|
|
146
|
+
assert !d.valid?
|
|
147
|
+
assert_equal 'No value provided', d.errors.on(:vmax).first
|
|
148
|
+
|
|
149
|
+
d.vlen = '12'
|
|
150
|
+
assert !d.valid?
|
|
151
|
+
assert_equal 'argh', d.errors.on(:vlen).first
|
|
152
|
+
|
|
153
|
+
d.vlen = '1234565'
|
|
154
|
+
assert !d.valid?
|
|
155
|
+
|
|
156
|
+
d.vran = '1'
|
|
157
|
+
assert !d.valid?
|
|
158
|
+
assert_equal 'Too short, must be more than 2 characters long', d.errors.on(:vran).first
|
|
159
|
+
|
|
160
|
+
d.vran = '11111111'
|
|
161
|
+
assert !d.valid?
|
|
162
|
+
assert_equal 'argh', d.errors.on(:vran).first
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def test_validate_inclusion
|
|
166
|
+
d = Dummy4.new
|
|
167
|
+
|
|
168
|
+
d.sex = 'Alien'
|
|
169
|
+
d.age = 1
|
|
170
|
+
|
|
171
|
+
assert !d.valid?
|
|
172
|
+
assert_equal 2, d.errors.count
|
|
173
|
+
|
|
174
|
+
d.sex = 'Male'
|
|
175
|
+
assert !d.valid?
|
|
176
|
+
assert_equal 1, d.errors.count
|
|
177
|
+
|
|
178
|
+
d.age = 110
|
|
179
|
+
assert !d.valid?
|
|
180
|
+
assert_equal 1, d.errors.count
|
|
181
|
+
|
|
182
|
+
d.age = 90
|
|
183
|
+
assert d.valid?
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
end
|