thingtank 0.3.3 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
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 # doc must have "married" property (should be of class married, we don't check this at the moment)
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.3
1
+ 0.3.5
@@ -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
 
@@ -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
- assert_equal ["color", "model"], Car.character_properties.sort
54
- assert_equal ["additional", "color", "model"], CarSub.character_properties.sort
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.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: &11805880 !ruby/object:Gem::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: *11805880
24
+ version_requirements: *25566040
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: couchrest
27
- requirement: &11804860 !ruby/object:Gem::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: *11804860
35
+ version_requirements: *25565060
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: couchrest_model
38
- requirement: &11777420 !ruby/object:Gem::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: *11777420
46
+ version_requirements: *25564240
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: defined
49
- requirement: &11776640 !ruby/object:Gem::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: *11776640
57
+ version_requirements: *25563260
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: guard
60
- requirement: &11775540 !ruby/object:Gem::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: *11775540
68
+ version_requirements: *25562380
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: libnotify
71
- requirement: &11773820 !ruby/object:Gem::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: *11773820
79
+ version_requirements: *25542460
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rb-inotify
82
- requirement: &11770240 !ruby/object:Gem::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: *11770240
90
+ version_requirements: *25541360
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: guard-minitest
93
- requirement: &11744560 !ruby/object:Gem::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: *11744560
101
+ version_requirements: *25540140
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: linecache19
104
- requirement: &11743740 !ruby/object:Gem::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: *11743740
112
+ version_requirements: *25539220
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: ruby-debug19
115
- requirement: &11743100 !ruby/object:Gem::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: *11743100
123
+ version_requirements: *25538420
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: yard
126
- requirement: &11742460 !ruby/object:Gem::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: *11742460
134
+ version_requirements: *25537540
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: bundler
137
- requirement: &11741460 !ruby/object:Gem::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: *11741460
145
+ version_requirements: *25536680
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: jeweler
148
- requirement: &11740740 !ruby/object:Gem::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: *11740740
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: 3630717306101485163
220
+ hash: -2137838232803990585
219
221
  required_rubygems_version: !ruby/object:Gem::Requirement
220
222
  none: false
221
223
  requirements: