thingtank 0.3.3 → 0.3.5
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/README.md +2 -1
- data/VERSION +1 -1
- data/lib/thingtank/character.rb +1 -1
- data/lib/thingtank/validators.rb +74 -0
- data/lib/thingtank.rb +1 -0
- data/test/test_thingtank.rb +16 -2
- data/test/test_validators.rb +117 -0
- metadata +30 -28
data/README.md
CHANGED
@@ -92,10 +92,11 @@ when he is adult, he wants to marry. now things are getting a bit more complicat
|
|
92
92
|
we want easy access to the name of the spouse
|
93
93
|
|
94
94
|
class Spouse < ThingTank::Character
|
95
|
-
property :married
|
95
|
+
property :married
|
96
96
|
property :married_state
|
97
97
|
|
98
98
|
validate :spouse_should_be_married
|
99
|
+
validates :married, :character => Married # doc must have "married" character
|
99
100
|
|
100
101
|
def married
|
101
102
|
self["married"] # contains a Married character
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.5
|
data/lib/thingtank/character.rb
CHANGED
@@ -35,7 +35,7 @@ class ThingTank
|
|
35
35
|
|
36
36
|
def character_properties
|
37
37
|
if superclass.respond_to? :character_properties
|
38
|
-
(superclass.character_properties || []).concat(@character_properties || [])
|
38
|
+
(superclass.character_properties || []).concat(@character_properties || []).uniq
|
39
39
|
else
|
40
40
|
@character_properties
|
41
41
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
class ClassValidator < ActiveModel::EachValidator
|
2
|
+
def validate_single_class(record, attribute, values, options)
|
3
|
+
if options[:in] # validates :hosting_account, :class => [Hash, String]
|
4
|
+
valid = false
|
5
|
+
options[:in].each do |klass|
|
6
|
+
if values.is_a?(klass)
|
7
|
+
valid = true
|
8
|
+
end
|
9
|
+
end
|
10
|
+
unless valid
|
11
|
+
record.errors.add attribute, "invalid class is #{values.class.to_s}, should be one of #{options[:in].join(', ')}"
|
12
|
+
end
|
13
|
+
else # validates :hosting_account, :class => Hash
|
14
|
+
unless values.is_a?(options[:with])
|
15
|
+
record.errors.add attribute, "invalid class is #{values.class.to_s}, should be #{options[:with]}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def validate_each(record, attribute, values)
|
22
|
+
case values
|
23
|
+
when NilClass
|
24
|
+
return nil
|
25
|
+
when Array
|
26
|
+
if options[:with] && options[:with] == Array
|
27
|
+
validate_single_class(record, attribute, values, options)
|
28
|
+
else
|
29
|
+
values.each do |value|
|
30
|
+
validate_single_class(record, attribute, value, options)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
else
|
34
|
+
validate_single_class(record, attribute, values, options)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
class CharacterValidator < ActiveModel::EachValidator
|
41
|
+
def validate_single_character(record, attribute, values, options)
|
42
|
+
if options[:in] # validates :hosting_account, :character => [HostingAccount, ...]
|
43
|
+
valid = false
|
44
|
+
options[:in].each do |character|
|
45
|
+
character = character.new(values)
|
46
|
+
if character.valid?
|
47
|
+
valid = true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
unless valid
|
51
|
+
record.errors.add attribute, "invalid character is #{values.inspect}, should be one of #{options[:in].join(', ')}"
|
52
|
+
end
|
53
|
+
else
|
54
|
+
character = options[:with].new(values)
|
55
|
+
unless character.valid?
|
56
|
+
record.errors.add attribute, character.errors.messages
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def validate_each(record, attribute, values)
|
62
|
+
case values
|
63
|
+
when NilClass
|
64
|
+
return nil
|
65
|
+
when Array
|
66
|
+
values.each do |value|
|
67
|
+
validate_single_character(record, attribute, value, options)
|
68
|
+
end
|
69
|
+
else
|
70
|
+
validate_single_character(record, attribute, values, options)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
data/lib/thingtank.rb
CHANGED
@@ -19,6 +19,7 @@ require_relative File.join('thingtank', 'shared_methods.rb')
|
|
19
19
|
require_relative File.join('thingtank', 'instance_methods.rb')
|
20
20
|
require_relative File.join('thingtank', 'shortcuts.rb')
|
21
21
|
require_relative File.join('thingtank', 'character_handling.rb')
|
22
|
+
require_relative File.join('thingtank', 'validators.rb')
|
22
23
|
require_relative File.join('thingtank', 'character.rb')
|
23
24
|
require_relative File.join('thingtank', 'fakebase.rb')
|
24
25
|
|
data/test/test_thingtank.rb
CHANGED
@@ -42,6 +42,14 @@ describe "a general test" do
|
|
42
42
|
reset_test_db!
|
43
43
|
end
|
44
44
|
|
45
|
+
it "shoud save under a special id" do
|
46
|
+
doc = create :_id => ".config/projectname", :a => 'b'
|
47
|
+
doc.save
|
48
|
+
doc = db_load ".config/projectname"
|
49
|
+
assert_equal ".config/projectname", doc.id
|
50
|
+
assert_equal "b", doc["a"]
|
51
|
+
end
|
52
|
+
|
45
53
|
it "should inherit the properties" do
|
46
54
|
doc = create
|
47
55
|
doc.add_character CarSub do |c|
|
@@ -50,8 +58,14 @@ describe "a general test" do
|
|
50
58
|
end
|
51
59
|
doc.save
|
52
60
|
doc.reload
|
53
|
-
|
54
|
-
|
61
|
+
car_props = Car.character_properties.uniq
|
62
|
+
car_props.delete "name"
|
63
|
+
car_props.delete "project"
|
64
|
+
car_sub_props = CarSub.character_properties.uniq
|
65
|
+
car_sub_props.delete "name"
|
66
|
+
car_sub_props.delete "project"
|
67
|
+
assert_equal ["color", "model"], car_props.sort
|
68
|
+
assert_equal ["additional", "color", "model"], car_sub_props.sort
|
55
69
|
assert_equal false, doc.as(CarSub).valid?
|
56
70
|
assert_equal 'green', doc.as(CarSub).color
|
57
71
|
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestC < ThingTank::Character
|
4
|
+
property :propC
|
5
|
+
validates_presence_of :propC
|
6
|
+
end
|
7
|
+
|
8
|
+
class TestB < ThingTank::Character
|
9
|
+
property :propB
|
10
|
+
validates_presence_of :propB
|
11
|
+
end
|
12
|
+
|
13
|
+
class TestA < ThingTank::Character
|
14
|
+
property :prop1
|
15
|
+
property :prop2
|
16
|
+
property :foo1
|
17
|
+
property :foo2
|
18
|
+
|
19
|
+
validates :prop1, :class => Array
|
20
|
+
validates :prop2, :character => TestB
|
21
|
+
validates :foo1, :class => [Integer, String]
|
22
|
+
validates :foo2, :character => [TestB, TestC]
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "a classvalidator" do
|
26
|
+
it "should validate correctly single class" do
|
27
|
+
assert_equal true, TestA.new(:prop1 => ["Something"]).valid?
|
28
|
+
assert_equal false, TestA.new(:prop1 => "Something").valid?
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should validate correctly multiple classes" do
|
32
|
+
assert_equal true, TestA.new(:foo1 => "Something").valid?
|
33
|
+
assert_equal true, TestA.new(:foo1 => 5).valid?
|
34
|
+
assert_equal false, TestA.new(:foo1 => {:hi => "ho"}).valid?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "a charactervalidator" do
|
39
|
+
it "should validate correctly single valid character" do
|
40
|
+
doc = ThingTank.create
|
41
|
+
doc.add_character TestA do |c|
|
42
|
+
c.prop2 = {:propB => "bla"}
|
43
|
+
end
|
44
|
+
assert_equal true, doc.valid?
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should validate correctly single invalid character" do
|
48
|
+
doc = ThingTank.create
|
49
|
+
doc.add_character TestA do |c|
|
50
|
+
c.prop2 = {:prop5 => "bla"}
|
51
|
+
end
|
52
|
+
assert_equal false, doc.as(TestA).valid?
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should validate correctly multiple valid characters" do
|
56
|
+
doc = ThingTank.create
|
57
|
+
doc.add_character TestA do |c|
|
58
|
+
c.foo2 = {:propB => "bla"}
|
59
|
+
end
|
60
|
+
assert_equal true, doc.as(TestA).valid?
|
61
|
+
|
62
|
+
doc2 = ThingTank.create
|
63
|
+
doc2.add_character TestA do |c|
|
64
|
+
c.foo2 = {:propC => "bla"}
|
65
|
+
end
|
66
|
+
assert_equal true, doc2.as(TestA).valid?
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should validate correctly multiple invalid characters" do
|
70
|
+
doc = ThingTank.create
|
71
|
+
doc.add_character TestA do |c|
|
72
|
+
c.foo2 = {:prop5 => "bla"}
|
73
|
+
end
|
74
|
+
assert_equal false, doc.as(TestA).valid?
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
describe "a charactervalidator and an array of values" do
|
80
|
+
it "should validate correctly single valid character" do
|
81
|
+
doc = ThingTank.create
|
82
|
+
doc.add_character TestA do |c|
|
83
|
+
c.prop2 = [{:propB => "bla"}, {:propB => "blub"}]
|
84
|
+
end
|
85
|
+
assert_equal true, doc.valid?
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should validate correctly single invalid character" do
|
89
|
+
doc = ThingTank.create
|
90
|
+
doc.add_character TestA do |c|
|
91
|
+
c.prop2 = [{:prop5 => "bla"}, {:propB => "bla"}]
|
92
|
+
end
|
93
|
+
assert_equal false, doc.as(TestA).valid?
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should validate correctly multiple valid characters" do
|
97
|
+
doc = ThingTank.create
|
98
|
+
doc.add_character TestA do |c|
|
99
|
+
c.foo2 = [{:propB => "bla"}, {:propB => "blubb"}]
|
100
|
+
end
|
101
|
+
assert_equal true, doc.as(TestA).valid?
|
102
|
+
|
103
|
+
doc2 = ThingTank.create
|
104
|
+
doc2.add_character TestA do |c|
|
105
|
+
c.foo2 = [{:propC => "bla"}, {:propC => "bla"}]
|
106
|
+
end
|
107
|
+
assert_equal true, doc2.as(TestA).valid?
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should validate correctly multiple invalid characters" do
|
111
|
+
doc = ThingTank.create
|
112
|
+
doc.add_character TestA do |c|
|
113
|
+
c.foo2 = [{:prop5 => "bla"}, {:propB => "bla"}]
|
114
|
+
end
|
115
|
+
assert_equal false, doc.as(TestA).valid?
|
116
|
+
end
|
117
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thingtank
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-02-28 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
16
|
-
requirement: &
|
16
|
+
requirement: &25566040 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *25566040
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: couchrest
|
27
|
-
requirement: &
|
27
|
+
requirement: &25565060 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *25565060
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: couchrest_model
|
38
|
-
requirement: &
|
38
|
+
requirement: &25564240 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *25564240
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: defined
|
49
|
-
requirement: &
|
49
|
+
requirement: &25563260 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *25563260
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: guard
|
60
|
-
requirement: &
|
60
|
+
requirement: &25562380 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *25562380
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: libnotify
|
71
|
-
requirement: &
|
71
|
+
requirement: &25542460 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *25542460
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rb-inotify
|
82
|
-
requirement: &
|
82
|
+
requirement: &25541360 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *25541360
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: guard-minitest
|
93
|
-
requirement: &
|
93
|
+
requirement: &25540140 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *25540140
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: linecache19
|
104
|
-
requirement: &
|
104
|
+
requirement: &25539220 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *25539220
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: ruby-debug19
|
115
|
-
requirement: &
|
115
|
+
requirement: &25538420 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *25538420
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: yard
|
126
|
-
requirement: &
|
126
|
+
requirement: &25537540 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ~>
|
@@ -131,10 +131,10 @@ dependencies:
|
|
131
131
|
version: 0.6.0
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *25537540
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: bundler
|
137
|
-
requirement: &
|
137
|
+
requirement: &25536680 !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
140
|
- - ~>
|
@@ -142,10 +142,10 @@ dependencies:
|
|
142
142
|
version: 1.0.0
|
143
143
|
type: :development
|
144
144
|
prerelease: false
|
145
|
-
version_requirements: *
|
145
|
+
version_requirements: *25536680
|
146
146
|
- !ruby/object:Gem::Dependency
|
147
147
|
name: jeweler
|
148
|
-
requirement: &
|
148
|
+
requirement: &25535920 !ruby/object:Gem::Requirement
|
149
149
|
none: false
|
150
150
|
requirements:
|
151
151
|
- - ~>
|
@@ -153,7 +153,7 @@ dependencies:
|
|
153
153
|
version: 1.6.4
|
154
154
|
type: :development
|
155
155
|
prerelease: false
|
156
|
-
version_requirements: *
|
156
|
+
version_requirements: *25535920
|
157
157
|
description:
|
158
158
|
email: ! 'Base64.decode64(bGludXhAbWFyY3JlbmVhcm5zLmRl
|
159
159
|
|
@@ -190,6 +190,7 @@ files:
|
|
190
190
|
- lib/thingtank/shared_methods.rb
|
191
191
|
- lib/thingtank/shortcuts.rb
|
192
192
|
- lib/thingtank/thingtank.rb
|
193
|
+
- lib/thingtank/validators.rb
|
193
194
|
- test/examples/test_bear_julius.rb
|
194
195
|
- test/examples/test_first_marriage.rb
|
195
196
|
- test/examples/test_immortal_julius.rb
|
@@ -199,6 +200,7 @@ files:
|
|
199
200
|
- test/test_helper.rb
|
200
201
|
- test/test_lists.rb
|
201
202
|
- test/test_thingtank.rb
|
203
|
+
- test/test_validators.rb
|
202
204
|
- test/test_views.rb
|
203
205
|
homepage: http://github.com/metakeule/thingtank
|
204
206
|
licenses:
|
@@ -215,7 +217,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
215
217
|
version: '0'
|
216
218
|
segments:
|
217
219
|
- 0
|
218
|
-
hash:
|
220
|
+
hash: -2137838232803990585
|
219
221
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
220
222
|
none: false
|
221
223
|
requirements:
|