ohm-contrib 0.1.2 → 1.0.rc0
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/lib/ohm/{contrib/callbacks.rb → callbacks.rb} +20 -65
- data/lib/ohm/contrib.rb +9 -17
- data/lib/ohm/datatypes.rb +38 -0
- data/lib/ohm/{contrib/locking.rb → locking.rb} +1 -2
- data/lib/ohm/plugin.rb +54 -0
- data/lib/ohm/{contrib/scope.rb → scope.rb} +7 -6
- data/lib/ohm/{contrib/slug.rb → slug.rb} +11 -6
- data/lib/ohm/{contrib/soft_delete.rb → softdelete.rb} +23 -19
- data/lib/ohm/timestamping.rb +41 -0
- data/ohm-contrib.gemspec +30 -0
- data/rakefile +6 -0
- data/test/{instance_callbacks_test.rb → instance_callbacks.rb} +2 -6
- data/test/{macro_callbacks_test.rb → macro_callbacks.rb} +1 -9
- data/test/plugin.rb +212 -0
- data/test/{scope_test.rb → scope.rb} +2 -3
- data/test/slug.rb +24 -0
- data/test/{soft_delete_test.rb → soft_delete.rb} +13 -3
- data/test/{timestamping_test.rb → timestamping.rb} +5 -6
- metadata +33 -70
- data/Rakefile +0 -8
- data/lib/ohm/contrib/active_model_extension.rb +0 -87
- data/lib/ohm/contrib/boundaries.rb +0 -41
- data/lib/ohm/contrib/date_validations.rb +0 -23
- data/lib/ohm/contrib/extra_validations.rb +0 -48
- data/lib/ohm/contrib/fulltext_searching.rb +0 -80
- data/lib/ohm/contrib/length_validations.rb +0 -32
- data/lib/ohm/contrib/number_validations.rb +0 -14
- data/lib/ohm/contrib/timestamping.rb +0 -38
- data/lib/ohm/contrib/typecast.rb +0 -350
- data/lib/ohm/contrib/web_validations.rb +0 -52
- data/test/activemodel_test.rb +0 -27
- data/test/boundaries_test.rb +0 -45
- data/test/callbacks_lint.rb +0 -141
- data/test/date_validations_test.rb +0 -29
- data/test/fixtures/ascii8bit.txt +0 -1
- data/test/fulltext_searching_test.rb +0 -63
- data/test/length_validations_test.rb +0 -31
- data/test/membership_validation_test.rb +0 -31
- data/test/number_validations_test.rb +0 -37
- data/test/slug_test.rb +0 -30
- data/test/typecast_array_test.rb +0 -146
- data/test/typecast_boolean_test.rb +0 -43
- data/test/typecast_date_test.rb +0 -82
- data/test/typecast_decimal_test.rb +0 -82
- data/test/typecast_existing_attribute_test.rb +0 -22
- data/test/typecast_float_test.rb +0 -57
- data/test/typecast_hash_test.rb +0 -120
- data/test/typecast_integer_test.rb +0 -71
- data/test/typecast_string_test.rb +0 -43
- data/test/typecast_time_test.rb +0 -72
- data/test/typecast_timezone_test.rb +0 -37
- data/test/web_validations_test.rb +0 -79
@@ -1,82 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :price, Decimal
|
9
|
-
end
|
10
|
-
|
11
|
-
test "handles nil case correctly" do
|
12
|
-
post = Post.create(:price => nil)
|
13
|
-
post = Post[post.id]
|
14
|
-
|
15
|
-
assert nil == post.price
|
16
|
-
end
|
17
|
-
|
18
|
-
test "handles empty string case correctly" do
|
19
|
-
post = Post.create(:price => "")
|
20
|
-
post = Post[post.id]
|
21
|
-
|
22
|
-
assert "" == post.price.to_s
|
23
|
-
end
|
24
|
-
|
25
|
-
test "allows for real arithmetic" do
|
26
|
-
post = Post.create(:price => "0.01")
|
27
|
-
post = Post[post.id]
|
28
|
-
|
29
|
-
assert 0.02 == post.price + post.price
|
30
|
-
assert 0.0 == post.price - post.price
|
31
|
-
assert 0.0001 == post.price * post.price
|
32
|
-
assert 1.0 == post.price / post.price
|
33
|
-
end
|
34
|
-
|
35
|
-
test "is accurate accdg to the decimal spec" do
|
36
|
-
post = Post.create(:price => "0.0001")
|
37
|
-
post = Post[post.id]
|
38
|
-
|
39
|
-
sum = 0
|
40
|
-
1_000.times { sum += post.price }
|
41
|
-
assert 0.1 == sum
|
42
|
-
end
|
43
|
-
|
44
|
-
test "using += with price" do
|
45
|
-
post = Post.create(:price => "0.0001")
|
46
|
-
post = Post[post.id]
|
47
|
-
|
48
|
-
post.price += 1
|
49
|
-
assert 1.0001 == post.price.to_f
|
50
|
-
end
|
51
|
-
|
52
|
-
test "assigning a raw BigDecimal" do
|
53
|
-
post = Post.create(:price => BigDecimal("399.50"))
|
54
|
-
post = Post[post.id]
|
55
|
-
|
56
|
-
assert post.price.to_s.kind_of?(String)
|
57
|
-
end
|
58
|
-
|
59
|
-
test "equality and comparable matching" do
|
60
|
-
post = Post.create(:price => "399.50")
|
61
|
-
assert (post.price == "399.50")
|
62
|
-
assert (post.price < 399.51)
|
63
|
-
assert (post.price > 399.49)
|
64
|
-
assert (post.price <= 399.50)
|
65
|
-
assert (post.price <= 399.51)
|
66
|
-
assert (post.price >= 399.50)
|
67
|
-
assert (post.price >= 399.49)
|
68
|
-
end
|
69
|
-
|
70
|
-
test "inspecting a Decimal" do
|
71
|
-
post = Post.new(:price => 399.50)
|
72
|
-
assert '"399.5"' == post.price.inspect
|
73
|
-
|
74
|
-
post.price = 'FooBar'
|
75
|
-
assert '"FooBar"' == post.price.inspect
|
76
|
-
end
|
77
|
-
|
78
|
-
test "type is BigDecimal" do
|
79
|
-
post = Post.new(:price => 399.50)
|
80
|
-
assert BigDecimal == post.price.type
|
81
|
-
end
|
82
|
-
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Timestamping
|
7
|
-
include Ohm::Typecast
|
8
|
-
|
9
|
-
typecast :created_at, Time
|
10
|
-
typecast :updated_at, Time
|
11
|
-
end
|
12
|
-
|
13
|
-
test "created_at and updated_at are typecasted" do
|
14
|
-
post = Post.create
|
15
|
-
|
16
|
-
assert post.created_at.respond_to?(:strftime)
|
17
|
-
assert post.updated_at.respond_to?(:strftime)
|
18
|
-
|
19
|
-
assert NOW.strftime("%Y-%m-%d") == post.created_at.strftime("%Y-%m-%d")
|
20
|
-
assert NOW.strftime("%Y-%m-%d") == post.updated_at.strftime("%Y-%m-%d")
|
21
|
-
end
|
22
|
-
|
data/test/typecast_float_test.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :price, Float
|
9
|
-
end
|
10
|
-
|
11
|
-
test "handles nil case correctly" do
|
12
|
-
post = Post.create(:price => nil)
|
13
|
-
post = Post[post.id]
|
14
|
-
|
15
|
-
assert nil == post.price
|
16
|
-
end
|
17
|
-
|
18
|
-
test "handles empty string case correctly" do
|
19
|
-
post = Post.create(:price => "")
|
20
|
-
post = Post[post.id]
|
21
|
-
|
22
|
-
assert "" == post.price.to_s
|
23
|
-
end
|
24
|
-
|
25
|
-
test "allows for real arithmetic" do
|
26
|
-
post = Post.create(:price => "3")
|
27
|
-
post = Post[post.id]
|
28
|
-
|
29
|
-
assert 6.0 == post.price + post.price
|
30
|
-
assert 0.0 == post.price - post.price
|
31
|
-
assert 9.0 == post.price * post.price
|
32
|
-
assert 1.0 == post.price / post.price
|
33
|
-
end
|
34
|
-
|
35
|
-
test "raises when trying to do arithmetic ops on a non-float" do
|
36
|
-
|
37
|
-
post = Post.create(:price => "FooBar")
|
38
|
-
post = Post[post.id]
|
39
|
-
|
40
|
-
assert_raise ArgumentError do
|
41
|
-
post.price * post.price
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
test "inspecting" do
|
46
|
-
post = Post.new(:price => "12345.67890")
|
47
|
-
assert '"12345.67890"' == post.price.inspect
|
48
|
-
|
49
|
-
post.price = 'FooBar'
|
50
|
-
assert '"FooBar"' == post.price.inspect
|
51
|
-
end
|
52
|
-
|
53
|
-
test "type is Float" do
|
54
|
-
post = Post.new(:price => 399.50)
|
55
|
-
assert Float == post.price.type
|
56
|
-
end
|
57
|
-
|
data/test/typecast_hash_test.rb
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :address, Hash
|
9
|
-
|
10
|
-
def hash
|
11
|
-
Hash.new
|
12
|
-
end
|
13
|
-
|
14
|
-
def top_level_hash
|
15
|
-
Hash
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
test "importing" do
|
20
|
-
assert Hash.new == Ohm::Types::Hash[nil]
|
21
|
-
assert Hash.new == Ohm::Types::Hash[""]
|
22
|
-
assert Hash.new == Ohm::Types::Hash[{}]
|
23
|
-
|
24
|
-
expected = Hash[:a => "b", :c => "d"]
|
25
|
-
assert expected == Ohm::Types::Hash[{ :a => "b", :c => "d" }]
|
26
|
-
end
|
27
|
-
|
28
|
-
test "exporting / dumping" do
|
29
|
-
assert "{}" == Ohm::Types::Hash[nil].to_s
|
30
|
-
assert "{}" == Ohm::Types::Hash[""].to_s
|
31
|
-
assert "{}" == Ohm::Types::Hash[{}].to_s
|
32
|
-
|
33
|
-
expected = %q{{"a":"b","c":"d"}}
|
34
|
-
assert expected == Ohm::Types::Hash[{ :a => "b", :c => "d" }].to_s
|
35
|
-
end
|
36
|
-
|
37
|
-
test "still able to get top level methods" do
|
38
|
-
assert Post.new.hash == {}
|
39
|
-
assert Hash == Post.new.top_level_hash
|
40
|
-
end
|
41
|
-
|
42
|
-
test "handles nil case correctly" do
|
43
|
-
post = Post.create(:address => nil)
|
44
|
-
assert post.address == {}
|
45
|
-
|
46
|
-
post = Post[post.id]
|
47
|
-
assert post.address == {}
|
48
|
-
end
|
49
|
-
|
50
|
-
test "handles empty string case correctly" do
|
51
|
-
post = Post.create(:address => "")
|
52
|
-
assert post.address == {}
|
53
|
-
|
54
|
-
post = Post[post.id]
|
55
|
-
assert post.address == {}
|
56
|
-
end
|
57
|
-
|
58
|
-
test "handles populated hashes" do
|
59
|
-
address = { "address1" => "#123", "city" => "Singapore", "country" => "SG"}
|
60
|
-
post = Post.create(:address => address)
|
61
|
-
assert address == post.address
|
62
|
-
|
63
|
-
post = Post[post.id]
|
64
|
-
assert address == post.address
|
65
|
-
end
|
66
|
-
|
67
|
-
test "allows for hash operations" do
|
68
|
-
address = { "address1" => "#123", "city" => "Singapore", "country" => "SG"}
|
69
|
-
post = Post.create(:address => address)
|
70
|
-
|
71
|
-
assert ["address1", "city", "country"] == post.address.keys
|
72
|
-
assert ["#123", "Singapore", "SG"] == post.address.values
|
73
|
-
|
74
|
-
post = Post[post.id]
|
75
|
-
assert ["address1", "city", "country"] == post.address.keys
|
76
|
-
assert ["#123", "Singapore", "SG"] == post.address.values
|
77
|
-
end
|
78
|
-
|
79
|
-
test "handles mutation" do
|
80
|
-
address = { "address1" => "#123", "city" => "Singapore", "country" => "SG"}
|
81
|
-
post = Post.create(:address => address)
|
82
|
-
|
83
|
-
post.address["address1"] = "#456"
|
84
|
-
post.save
|
85
|
-
|
86
|
-
assert ["address1", "city", "country"] == post.address.keys
|
87
|
-
assert ["#456", "Singapore", "SG"] == post.address.values
|
88
|
-
|
89
|
-
post = Post[post.id]
|
90
|
-
assert ["address1", "city", "country"] == post.address.keys
|
91
|
-
assert ["#456", "Singapore", "SG"] == post.address.values
|
92
|
-
end
|
93
|
-
|
94
|
-
Address = Class.new(Struct.new(:city, :country))
|
95
|
-
|
96
|
-
test "raises when trying to assign a non-hash" do
|
97
|
-
assert_raise TypeError do
|
98
|
-
Post.new(:address => [])
|
99
|
-
end
|
100
|
-
|
101
|
-
assert_raise TypeError do
|
102
|
-
Post.new(:address => Address.new)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
test "type is Hash" do
|
107
|
-
post = Post.new(:address => { "address1" => "#456" })
|
108
|
-
assert Hash == post.address.type
|
109
|
-
end
|
110
|
-
|
111
|
-
test "ascii 8bit encoding" do
|
112
|
-
txt = File.expand_path("fixtures/ascii8bit.txt", File.dirname(__FILE__))
|
113
|
-
|
114
|
-
data = File.read(txt, :encoding => "ascii-8bit")
|
115
|
-
|
116
|
-
post = Post.create(:address => { "address1" => data.force_encoding("UTF-8") })
|
117
|
-
post = Post[post.id]
|
118
|
-
|
119
|
-
assert_equal post.address["address1"], data.force_encoding("UTF-8")
|
120
|
-
end if defined?(Encoding)
|
@@ -1,71 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :price, Integer
|
9
|
-
end
|
10
|
-
|
11
|
-
test "handles nil case correctly" do
|
12
|
-
post = Post.create(:price => nil)
|
13
|
-
post = Post[post.id]
|
14
|
-
|
15
|
-
assert nil == post.price
|
16
|
-
end
|
17
|
-
|
18
|
-
test "handles empty string case correctly" do
|
19
|
-
post = Post.create(:price => "")
|
20
|
-
post = Post[post.id]
|
21
|
-
|
22
|
-
assert "" == post.price.to_s
|
23
|
-
end
|
24
|
-
|
25
|
-
test "allows respond_to on an invalid integer" do
|
26
|
-
post = Post.new(:price => "FooBar")
|
27
|
-
|
28
|
-
assert_nothing_raised ArgumentError do
|
29
|
-
post.price.respond_to?(:**)
|
30
|
-
end
|
31
|
-
|
32
|
-
assert ! post.price.respond_to?(:**)
|
33
|
-
end
|
34
|
-
|
35
|
-
test "falls back to String#respond_to? when invalid" do
|
36
|
-
post = Post.new(:price => "FooBar")
|
37
|
-
assert post.price.respond_to?(:capitalize)
|
38
|
-
end
|
39
|
-
|
40
|
-
test "allows for real arithmetic" do
|
41
|
-
post = Post.create(:price => "3")
|
42
|
-
post = Post[post.id]
|
43
|
-
|
44
|
-
assert 6 == post.price + post.price
|
45
|
-
assert 0 == post.price - post.price
|
46
|
-
assert 9 == post.price * post.price
|
47
|
-
assert 1 == post.price / post.price
|
48
|
-
end
|
49
|
-
|
50
|
-
test "raises when trying to do arithmetic ops on a non-int" do
|
51
|
-
post = Post.create(:price => "FooBar")
|
52
|
-
post = Post[post.id]
|
53
|
-
|
54
|
-
assert_raise ArgumentError do
|
55
|
-
post.price * post.price
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
test "inspecting" do
|
60
|
-
post = Post.new(:price => "50000")
|
61
|
-
assert '"50000"' == post.price.inspect
|
62
|
-
|
63
|
-
post.price = 'FooBar'
|
64
|
-
assert '"FooBar"' == post.price.inspect
|
65
|
-
end
|
66
|
-
|
67
|
-
test "type is Fixnum" do
|
68
|
-
post = Post.new(:price => 399)
|
69
|
-
assert Fixnum == post.price.type
|
70
|
-
end
|
71
|
-
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :content
|
9
|
-
end
|
10
|
-
|
11
|
-
test "handles nil case correctly" do
|
12
|
-
post = Post.create(:content => nil)
|
13
|
-
post = Post[post.id]
|
14
|
-
|
15
|
-
assert nil == post.content
|
16
|
-
end
|
17
|
-
|
18
|
-
test "still responds to string methods properly" do
|
19
|
-
post = Post.create(:content => "FooBar")
|
20
|
-
post = Post[post.id]
|
21
|
-
|
22
|
-
assert "foobar" == post.content.downcase
|
23
|
-
end
|
24
|
-
|
25
|
-
test "mutating methods like upcase!" do
|
26
|
-
post = Post.create(:content => "FooBar")
|
27
|
-
post = Post[post.id]
|
28
|
-
|
29
|
-
post.content.upcase!
|
30
|
-
|
31
|
-
assert "FOOBAR" == post.content.to_s
|
32
|
-
end
|
33
|
-
|
34
|
-
test "inspecting" do
|
35
|
-
post = Post.new(:content => "FooBar")
|
36
|
-
assert 'FooBar' == post.content
|
37
|
-
end
|
38
|
-
|
39
|
-
test "type is String" do
|
40
|
-
post = Post.new(:content => "FooBar")
|
41
|
-
assert String == post.content.type
|
42
|
-
end
|
43
|
-
|
data/test/typecast_time_test.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :created_at, Time
|
9
|
-
|
10
|
-
def now
|
11
|
-
Time.now
|
12
|
-
end
|
13
|
-
|
14
|
-
def new_time
|
15
|
-
Time.new
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
test "still able to access top level Time" do
|
20
|
-
assert Post.new.now.to_s == Time.now.to_s
|
21
|
-
end
|
22
|
-
|
23
|
-
test "should be able to use Time.new inside the class" do
|
24
|
-
assert Post.new.new_time.to_s == Time.new.to_s
|
25
|
-
end
|
26
|
-
|
27
|
-
test "handles nil case correctly" do
|
28
|
-
post = Post.create(:created_at => nil)
|
29
|
-
post = Post[post.id]
|
30
|
-
|
31
|
-
assert nil == post.created_at
|
32
|
-
end
|
33
|
-
|
34
|
-
test "handles empty string case correctly" do
|
35
|
-
post = Post.create(:created_at => "")
|
36
|
-
post = Post[post.id]
|
37
|
-
|
38
|
-
assert "" == post.created_at.to_s
|
39
|
-
end
|
40
|
-
|
41
|
-
test "allows for real time operations" do
|
42
|
-
post = Post.create(:created_at => "2010-05-10T00:00Z")
|
43
|
-
post = Post[post.id]
|
44
|
-
|
45
|
-
assert post.created_at.respond_to?(:strftime)
|
46
|
-
assert "2010-05-10" == post.created_at.strftime('%Y-%m-%d')
|
47
|
-
end
|
48
|
-
|
49
|
-
test "raises when trying to do non-time operations" do
|
50
|
-
post = Post.create(:created_at => "FooBar")
|
51
|
-
post = Post[post.id]
|
52
|
-
|
53
|
-
assert ! post.created_at.respond_to?(:abs)
|
54
|
-
|
55
|
-
assert_raise NoMethodError do
|
56
|
-
post.created_at.abs
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
test "inspecting" do
|
61
|
-
post = Post.create(:created_at => Time.utc(2010, 05, 05))
|
62
|
-
assert '"2010-05-05 00:00:00 UTC"' == post.created_at.inspect
|
63
|
-
|
64
|
-
post.created_at = 'FooBar'
|
65
|
-
assert '"FooBar"' == post.created_at.inspect
|
66
|
-
end
|
67
|
-
|
68
|
-
test "type is Time" do
|
69
|
-
post = Post.create(:created_at => Time.utc(2010, 05, 05))
|
70
|
-
assert Time == post.created_at.type
|
71
|
-
end
|
72
|
-
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :printed_at, Time
|
9
|
-
end
|
10
|
-
|
11
|
-
test "2010-08-07T00:00Z is parsed as 2010-08-07 00:00:00 UTC" do
|
12
|
-
post = Post.new(:printed_at => "2010-08-07T00:00Z")
|
13
|
-
assert Time.utc(2010, 8, 7).to_s == post.printed_at.utc.to_s
|
14
|
-
|
15
|
-
post.save
|
16
|
-
post = Post[post.id]
|
17
|
-
assert Time.utc(2010, 8, 7).to_s == post.printed_at.utc.to_s
|
18
|
-
end
|
19
|
-
|
20
|
-
test "2010-08-07 18:29Z is parsed as 2010-08-07 18:29:00 UTC" do
|
21
|
-
post = Post.new(:printed_at => "2010-08-07 18:29Z")
|
22
|
-
assert Time.utc(2010, 8, 7, 18, 29).to_s == post.printed_at.utc.to_s
|
23
|
-
|
24
|
-
post.save
|
25
|
-
post = Post[post.id]
|
26
|
-
assert Time.utc(2010, 8, 7, 18, 29).to_s == post.printed_at.utc.to_s
|
27
|
-
end
|
28
|
-
|
29
|
-
test "2010-08-07T18:29:31Z is parsed as 2010-08-07 18:29:31 UTC" do
|
30
|
-
post = Post.new(:printed_at => "2010-08-07T18:29:31Z")
|
31
|
-
assert Time.utc(2010, 8, 7, 18, 29, 31).to_s == post.printed_at.utc.to_s
|
32
|
-
|
33
|
-
post.save
|
34
|
-
post = Post[post.id]
|
35
|
-
assert Time.utc(2010, 8, 7, 18, 29, 31).to_s == post.printed_at.utc.to_s
|
36
|
-
end
|
37
|
-
|
@@ -1,79 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class BlogPost < Ohm::Model
|
6
|
-
include Ohm::WebValidations
|
7
|
-
|
8
|
-
attribute :slug
|
9
|
-
|
10
|
-
index :slug
|
11
|
-
|
12
|
-
def validate
|
13
|
-
assert_slug :slug
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class Comment < Ohm::Model
|
18
|
-
include Ohm::WebValidations
|
19
|
-
|
20
|
-
attribute :ip_address
|
21
|
-
attribute :homepage
|
22
|
-
attribute :email
|
23
|
-
|
24
|
-
def validate
|
25
|
-
assert_ipaddr :ip_address
|
26
|
-
assert_url :homepage
|
27
|
-
assert_email :email
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
test "invalid slug scenario" do
|
32
|
-
p = BlogPost.new(:slug => "This is a title, not a SLUG")
|
33
|
-
assert ! p.valid?
|
34
|
-
assert [[:slug, :not_slug]] == p.errors
|
35
|
-
end
|
36
|
-
|
37
|
-
test "valid slug scenario" do
|
38
|
-
p = BlogPost.new(:slug => "this-is-a-valid-slug")
|
39
|
-
assert p.valid?
|
40
|
-
end
|
41
|
-
|
42
|
-
test "slug uniqueness validation" do
|
43
|
-
p1 = BlogPost.create(:slug => "this-is-a-valid-slug")
|
44
|
-
p2 = BlogPost.create(:slug => "this-is-a-valid-slug")
|
45
|
-
|
46
|
-
assert ! p2.valid?
|
47
|
-
assert [[:slug, :not_unique]] == p2.errors
|
48
|
-
end
|
49
|
-
|
50
|
-
test "ip address validation" do
|
51
|
-
c = Comment.new(:ip_address => "400.500.600.700")
|
52
|
-
assert ! c.valid?
|
53
|
-
assert c.errors.include?([:ip_address, :not_ipaddr])
|
54
|
-
end
|
55
|
-
|
56
|
-
test "email address validation" do
|
57
|
-
c = Comment.new(:email => "something.com")
|
58
|
-
assert ! c.valid?
|
59
|
-
assert c.errors.include?([:email, :not_email])
|
60
|
-
|
61
|
-
c = Comment.new(:email => "john@doe.com")
|
62
|
-
c.valid?
|
63
|
-
assert ! c.errors.include?([:email, :not_email])
|
64
|
-
end
|
65
|
-
|
66
|
-
test "url validaiton" do
|
67
|
-
c = Comment.new(:homepage => "somehing")
|
68
|
-
assert ! c.valid?
|
69
|
-
assert c.errors.include?([:homepage, :not_url])
|
70
|
-
|
71
|
-
c = Comment.new(:homepage => "irc://irc.freenode.net/something")
|
72
|
-
assert ! c.valid?
|
73
|
-
assert c.errors.include?([:homepage, :not_url])
|
74
|
-
|
75
|
-
c = Comment.new(:homepage => "http://test.com")
|
76
|
-
c.valid?
|
77
|
-
assert ! c.errors.include?([:homepage, :not_url])
|
78
|
-
end
|
79
|
-
|