og 0.31.0 → 0.40.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/doc/{AUTHORS → CONTRIBUTORS} +26 -10
- data/doc/LICENSE +2 -3
- data/doc/RELEASES +56 -7
- data/doc/tutorial.txt +15 -15
- data/lib/glue/cacheable.rb +2 -5
- data/lib/glue/hierarchical.rb +1 -4
- data/lib/glue/optimistic_locking.rb +0 -2
- data/lib/glue/orderable.rb +79 -75
- data/lib/glue/revisable.rb +19 -24
- data/lib/glue/searchable.rb +0 -2
- data/lib/glue/taggable.rb +31 -29
- data/lib/glue/timestamped.rb +4 -2
- data/lib/og.rb +50 -29
- data/lib/og/adapter.rb +19 -0
- data/lib/og/adapter/mysql.rb +212 -0
- data/lib/og/adapter/mysql/override.rb +34 -0
- data/lib/og/adapter/mysql/script.rb +15 -0
- data/lib/og/adapter/mysql/utils.rb +40 -0
- data/lib/og/adapter/postgresql.rb +231 -0
- data/lib/og/adapter/postgresql/override.rb +117 -0
- data/lib/og/adapter/postgresql/script.rb +15 -0
- data/lib/og/adapter/postgresql/utils.rb +35 -0
- data/lib/og/adapter/sqlite.rb +132 -0
- data/lib/og/adapter/sqlite/override.rb +33 -0
- data/lib/og/adapter/sqlite/script.rb +15 -0
- data/lib/og/collection.rb +35 -7
- data/lib/og/{evolution.rb → dump.rb} +4 -5
- data/lib/og/entity.rb +102 -173
- data/lib/og/entity/clone.rb +119 -0
- data/lib/og/errors.rb +0 -2
- data/lib/og/manager.rb +85 -37
- data/lib/og/relation.rb +52 -34
- data/lib/og/relation/belongs_to.rb +0 -2
- data/lib/og/relation/has_many.rb +27 -4
- data/lib/og/relation/joins_many.rb +41 -14
- data/lib/og/relation/many_to_many.rb +10 -0
- data/lib/og/relation/refers_to.rb +22 -5
- data/lib/og/store.rb +80 -86
- data/lib/og/store/sql.rb +710 -713
- data/lib/og/store/sql/evolution.rb +119 -0
- data/lib/og/store/sql/join.rb +155 -0
- data/lib/og/store/sql/utils.rb +149 -0
- data/lib/og/test/assertions.rb +1 -3
- data/lib/og/test/testcase.rb +0 -2
- data/lib/og/types.rb +2 -5
- data/lib/og/validation.rb +6 -9
- data/test/{og/mixin → glue}/tc_hierarchical.rb +3 -13
- data/test/glue/tc_og_paginate.rb +47 -0
- data/test/{og/mixin → glue}/tc_optimistic_locking.rb +2 -12
- data/test/{og/mixin → glue}/tc_orderable.rb +15 -23
- data/test/glue/tc_orderable2.rb +47 -0
- data/test/glue/tc_revisable.rb +3 -3
- data/test/{og/mixin → glue}/tc_taggable.rb +20 -10
- data/test/{og/mixin → glue}/tc_timestamped.rb +2 -12
- data/test/glue/tc_webfile.rb +36 -0
- data/test/og/CONFIG.rb +8 -11
- data/test/og/multi_validations_model.rb +14 -0
- data/test/og/store/tc_filesys.rb +3 -1
- data/test/og/store/tc_kirby.rb +16 -13
- data/test/og/store/tc_sti.rb +11 -11
- data/test/og/store/tc_sti2.rb +79 -0
- data/test/og/tc_build.rb +41 -0
- data/test/og/tc_cacheable.rb +3 -2
- data/test/og/tc_has_many.rb +96 -0
- data/test/og/tc_inheritance.rb +6 -4
- data/test/og/tc_joins_many.rb +93 -0
- data/test/og/tc_multi_validations.rb +5 -7
- data/test/og/tc_multiple.rb +7 -6
- data/test/og/tc_override.rb +13 -7
- data/test/og/tc_primary_key.rb +30 -0
- data/test/og/tc_relation.rb +8 -14
- data/test/og/tc_reldelete.rb +163 -0
- data/test/og/tc_reverse.rb +17 -14
- data/test/og/tc_scoped.rb +3 -11
- data/test/og/tc_setup.rb +13 -11
- data/test/og/tc_store.rb +21 -28
- data/test/og/tc_validation2.rb +2 -2
- data/test/og/tc_validation_loop.rb +17 -15
- metadata +109 -103
- data/INSTALL +0 -91
- data/ProjectInfo +0 -51
- data/README +0 -177
- data/doc/config.txt +0 -28
- data/examples/README +0 -23
- data/examples/mysql_to_psql.rb +0 -71
- data/examples/run.rb +0 -271
- data/lib/glue/tree.rb +0 -218
- data/lib/og/store/alpha/filesys.rb +0 -110
- data/lib/og/store/alpha/memory.rb +0 -295
- data/lib/og/store/alpha/sqlserver.rb +0 -256
- data/lib/og/store/kirby.rb +0 -490
- data/lib/og/store/mysql.rb +0 -415
- data/lib/og/store/psql.rb +0 -875
- data/lib/og/store/sqlite.rb +0 -348
- data/lib/og/store/sqlite2.rb +0 -241
- data/setup.rb +0 -1585
- data/test/og/tc_sti_find.rb +0 -35
@@ -1,8 +1,22 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'CONFIG.rb')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
require 'glue'
|
6
|
+
require 'glue/validation'
|
7
|
+
require 'og/validation'
|
8
|
+
|
1
9
|
class TC_MultiValidation < Test::Unit::TestCase # :nodoc: all
|
2
10
|
class User
|
11
|
+
include Glue::Validation
|
12
|
+
|
3
13
|
property :name
|
4
14
|
|
5
15
|
validate_value :name
|
6
16
|
validate_unique :name
|
7
17
|
end
|
18
|
+
|
19
|
+
def test_empty
|
20
|
+
assert TC_MultiValidation.const_defined?('User')
|
21
|
+
end
|
8
22
|
end
|
data/test/og/store/tc_filesys.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
+
=begin FileSys is currently not available.
|
2
|
+
|
1
3
|
require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
|
2
4
|
require 'rubygems'
|
3
5
|
require 'facets'
|
4
6
|
require 'test/unit'
|
5
7
|
require 'og'
|
6
8
|
|
7
|
-
=begin FileSys is currently inaccessible through Og.setup?
|
8
9
|
class TestCaseOgFilesys < Test::Unit::TestCase # :nodoc: all
|
9
10
|
include Og
|
10
11
|
|
@@ -72,4 +73,5 @@ class TestCaseOgFilesys < Test::Unit::TestCase # :nodoc: all
|
|
72
73
|
end
|
73
74
|
|
74
75
|
end
|
76
|
+
|
75
77
|
=end
|
data/test/og/store/tc_kirby.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
|
2
|
-
require 'facets'
|
3
|
-
require 'test/unit'
|
4
|
-
require 'og'
|
1
|
+
=begin KirbyBase is currently not available.
|
5
2
|
|
6
|
-
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
|
7
4
|
|
8
|
-
|
9
|
-
class TC_Kirby < Test::Unit::TestCase # :nodoc: all
|
5
|
+
require 'test/unit'
|
10
6
|
|
11
|
-
|
7
|
+
begin
|
12
8
|
|
9
|
+
og = Og.setup( :destroy => true, :store => :kirby, :manual_management => true)
|
10
|
+
|
11
|
+
class TC_Kirby < Test::Unit::TestCase # :nodoc: all
|
12
|
+
|
13
13
|
class Track
|
14
|
-
|
14
|
+
attr_accessor :name, String
|
15
15
|
belongs_to Disc
|
16
16
|
end
|
17
17
|
|
18
18
|
class Disc
|
19
|
-
|
19
|
+
attr_accessor :name, String
|
20
20
|
has_many Track
|
21
21
|
end
|
22
22
|
|
@@ -26,11 +26,14 @@ class TC_Kirby < Test::Unit::TestCase # :nodoc: all
|
|
26
26
|
d = Disc.create
|
27
27
|
t = Track.create
|
28
28
|
d.tracks << t
|
29
|
-
|
29
|
+
|
30
30
|
assert_equal 1, d.tracks.size
|
31
31
|
end
|
32
32
|
|
33
33
|
end
|
34
|
-
=end
|
35
34
|
|
36
|
-
|
35
|
+
rescue LoadError => e
|
36
|
+
puts 'Skipping Kirby test, adapter not found.'
|
37
|
+
end
|
38
|
+
|
39
|
+
=end
|
data/test/og/store/tc_sti.rb
CHANGED
@@ -7,20 +7,20 @@ require 'og/store/sql'
|
|
7
7
|
|
8
8
|
class TC_Sti < Test::Unit::TestCase
|
9
9
|
class StiParent
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
is Og::SchemaInheritanceBase
|
11
|
+
|
12
|
+
property :one, String
|
13
|
+
property :two, String
|
14
14
|
end
|
15
15
|
|
16
16
|
class StiChild < StiParent
|
17
|
-
property :three
|
17
|
+
property :three, String
|
18
18
|
end
|
19
19
|
|
20
20
|
$og1.manage_classes(StiParent, StiChild)
|
21
21
|
|
22
22
|
def setup
|
23
|
-
@store =
|
23
|
+
@store = $og1.store
|
24
24
|
end
|
25
25
|
|
26
26
|
def teardown
|
@@ -56,9 +56,9 @@ end
|
|
56
56
|
|
57
57
|
class TC_Sti_OgType < Test::Unit::TestCase
|
58
58
|
class Human
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
is Og::SchemaInheritanceBase
|
60
|
+
|
61
|
+
property :name, String
|
62
62
|
|
63
63
|
def initialize(name)
|
64
64
|
@name = name
|
@@ -66,11 +66,11 @@ class TC_Sti_OgType < Test::Unit::TestCase
|
|
66
66
|
end
|
67
67
|
|
68
68
|
class Parent < Human
|
69
|
-
property :job
|
69
|
+
property :job, String
|
70
70
|
end
|
71
71
|
|
72
72
|
class Child < Human
|
73
|
-
property :toys
|
73
|
+
property :toys, String
|
74
74
|
end
|
75
75
|
|
76
76
|
$og1.manage_classes(Human, Parent, Child)
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'test/unit'
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
require 'og'
|
8
|
+
|
9
|
+
class TC_STI2 < Test::Unit::TestCase
|
10
|
+
|
11
|
+
class User
|
12
|
+
is Og::SchemaInheritanceBase
|
13
|
+
|
14
|
+
property :name, String
|
15
|
+
|
16
|
+
has_one Login
|
17
|
+
|
18
|
+
# This triggered a bug when called from a subclass
|
19
|
+
has_many :pets, Pet#, :foreign_name => 'user'
|
20
|
+
end
|
21
|
+
|
22
|
+
class Admin < User
|
23
|
+
property :admin_praise, String
|
24
|
+
end
|
25
|
+
|
26
|
+
class Login
|
27
|
+
property :pass, String
|
28
|
+
|
29
|
+
belongs_to User
|
30
|
+
end
|
31
|
+
|
32
|
+
class Pet
|
33
|
+
property :name, String
|
34
|
+
|
35
|
+
belongs_to User
|
36
|
+
end
|
37
|
+
|
38
|
+
def request
|
39
|
+
o = OpenStruct.new
|
40
|
+
o.params = {:name => 'George', :pass => 'Secret'}
|
41
|
+
return o
|
42
|
+
end
|
43
|
+
|
44
|
+
$og1.manage_classes User, Login, Admin, Pet
|
45
|
+
|
46
|
+
def setup
|
47
|
+
@user = Admin.create_with(request.params)
|
48
|
+
@login = Login.create_with(request.params)
|
49
|
+
end
|
50
|
+
|
51
|
+
def teardown
|
52
|
+
[User, Login, Pet].map {|x| x.delete_all}
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_setup
|
56
|
+
assert_equal 1, User.count
|
57
|
+
assert_equal 1, Login.count
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_assign
|
61
|
+
@user.login = @login
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_has_many
|
65
|
+
pets = nil
|
66
|
+
assert_nothing_raised do
|
67
|
+
pets = @user.pets.size
|
68
|
+
end
|
69
|
+
|
70
|
+
assert_equal 0, pets
|
71
|
+
|
72
|
+
p1 = Pet.create_with(:name => 'Ziza')
|
73
|
+
|
74
|
+
@user.pets << p1
|
75
|
+
|
76
|
+
assert_equal 1, @user.pets(:reload => true).size
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/test/og/tc_build.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'CONFIG.rb')
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'facets'
|
5
|
+
|
6
|
+
require 'test/unit'
|
7
|
+
require 'og'
|
8
|
+
require 'glue/timestamped'
|
9
|
+
|
10
|
+
class TC_OgAggrCalc < Test::Unit::TestCase # :nodoc: all
|
11
|
+
include Og
|
12
|
+
|
13
|
+
class Category
|
14
|
+
attr_accessor :name, String
|
15
|
+
end
|
16
|
+
|
17
|
+
class User
|
18
|
+
attr_accessor :name, String
|
19
|
+
joins_many Category
|
20
|
+
|
21
|
+
def initialize name
|
22
|
+
@name = name
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
$og1.manage_classes(User, Category)
|
27
|
+
|
28
|
+
def test_all
|
29
|
+
c1 = Category.create_with :name => 'one'
|
30
|
+
c2 = Category.create_with :name => 'two'
|
31
|
+
|
32
|
+
u = User.new 'gmosx'
|
33
|
+
u.categories << c1
|
34
|
+
u.categories << c2
|
35
|
+
u.save
|
36
|
+
|
37
|
+
g = User[1]
|
38
|
+
assert_equal 2, g.categories.size
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
data/test/og/tc_cacheable.rb
CHANGED
@@ -191,7 +191,8 @@ begin
|
|
191
191
|
end
|
192
192
|
end
|
193
193
|
end
|
194
|
-
rescue
|
195
|
-
|
194
|
+
rescue Errno::ECONNREFUSED => ex # FIXME: Lookup Win32/Linux/BSD error
|
195
|
+
Logger.warn "skipping memcached test: server not running"
|
196
|
+
#Logger.warn ex.class # FIXME: remove when all error types listed above
|
196
197
|
end
|
197
198
|
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'CONFIG.rb')
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'facets'
|
5
|
+
|
6
|
+
require 'test/unit'
|
7
|
+
require 'og'
|
8
|
+
require 'glue/timestamped'
|
9
|
+
|
10
|
+
class TC_JoinsMany < Test::Unit::TestCase # :nodoc: all
|
11
|
+
include Og
|
12
|
+
|
13
|
+
class Item
|
14
|
+
property :name, String
|
15
|
+
|
16
|
+
has_many Tag
|
17
|
+
end
|
18
|
+
|
19
|
+
class Tag
|
20
|
+
property :name, String
|
21
|
+
|
22
|
+
belongs_to Item
|
23
|
+
end
|
24
|
+
|
25
|
+
$og1.manage_classes(Item, Tag)
|
26
|
+
|
27
|
+
def setup
|
28
|
+
@conn = $og1.conn
|
29
|
+
|
30
|
+
@name = 'George'
|
31
|
+
end
|
32
|
+
|
33
|
+
def teardown
|
34
|
+
Item.delete_all
|
35
|
+
Tag.delete_all
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_assign_with_name
|
39
|
+
i = Item.create_with(:name => @name)
|
40
|
+
|
41
|
+
assert_equal @name, i.name
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_concat
|
45
|
+
tag = Tag.create_with(:name => 'Nitro')
|
46
|
+
i = Item.create_with(:name => @name)
|
47
|
+
|
48
|
+
i.tags << tag
|
49
|
+
|
50
|
+
assert_equal 1, i.tags.size
|
51
|
+
assert_equal tag, i.tags.first
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_add
|
55
|
+
tag = Tag.create_with(:name => 'Facets')
|
56
|
+
i = Item.create_with(:name => @name)
|
57
|
+
|
58
|
+
i.add_tag tag
|
59
|
+
|
60
|
+
assert_equal 1, i.tags.size
|
61
|
+
assert_equal tag, i.tags.first
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_assign_with_tag
|
65
|
+
tag = Tag.create_with(:name => 'Nitro')
|
66
|
+
|
67
|
+
assert_not_nil tag.saved?
|
68
|
+
|
69
|
+
i = Item.create_with(:name => @name, :tags => tag)
|
70
|
+
|
71
|
+
assert_not_nil i.saved?
|
72
|
+
assert_equal tag, i.tags.first
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_assign_with_tags
|
76
|
+
tags = [Tag.create_with(:name => 'Glue'), Tag.create_with(:name => 'Og')]
|
77
|
+
i = Item.create_with(:name => @name, :tags => tags)
|
78
|
+
|
79
|
+
assert_equal tags, i.tags.to_ary
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_assign_with_collection
|
83
|
+
coll = HasManyCollection.new(
|
84
|
+
Item,
|
85
|
+
Tag,
|
86
|
+
:add_tag,
|
87
|
+
:remove_tag,
|
88
|
+
:find_tags,
|
89
|
+
:count_tags
|
90
|
+
)
|
91
|
+
i = Item.create_with(:name => @name, :tags => coll)
|
92
|
+
|
93
|
+
assert_equal coll, i.instance_variable_get("@tags")
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
data/test/og/tc_inheritance.rb
CHANGED
@@ -37,7 +37,7 @@ class TC_OgInheritance < Test::Unit::TestCase # :nodoc: all
|
|
37
37
|
end
|
38
38
|
|
39
39
|
class Car
|
40
|
-
property :name
|
40
|
+
property :name, String
|
41
41
|
belongs_to :admin
|
42
42
|
end
|
43
43
|
|
@@ -49,7 +49,7 @@ class TC_OgInheritance < Test::Unit::TestCase # :nodoc: all
|
|
49
49
|
|
50
50
|
class Admin < User
|
51
51
|
property :password, String
|
52
|
-
has_one Car
|
52
|
+
#has_one Car
|
53
53
|
end
|
54
54
|
|
55
55
|
$og1.manage_classes(Document, Article, Document, Photo, Car, User, Admin)
|
@@ -102,7 +102,9 @@ class TC_OgInheritance < Test::Unit::TestCase # :nodoc: all
|
|
102
102
|
assert_equal 2, articles.size
|
103
103
|
|
104
104
|
# Bug report.
|
105
|
-
Admin
|
106
|
-
|
105
|
+
# This happens when creating a has_one Car in Admin, which is wrong
|
106
|
+
# because it overrides the joins_many from User.
|
107
|
+
#Admin.create
|
108
|
+
#Admin.create.car
|
107
109
|
end
|
108
110
|
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'CONFIG.rb')
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'facets'
|
5
|
+
|
6
|
+
require 'test/unit'
|
7
|
+
require 'og'
|
8
|
+
require 'glue/timestamped'
|
9
|
+
|
10
|
+
class TC_JoinsMany < Test::Unit::TestCase # :nodoc: all
|
11
|
+
include Og
|
12
|
+
|
13
|
+
class Item
|
14
|
+
property :name, String
|
15
|
+
|
16
|
+
joins_many Tag
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
@name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class Tag
|
24
|
+
property :name, String
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
@name
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def setup
|
32
|
+
$og1.manage_classes(Item, Tag)
|
33
|
+
@conn = $og1.conn
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_all
|
37
|
+
(1..3).each do |n|
|
38
|
+
t = Tag.new
|
39
|
+
t.name = "Tag_#{n}"
|
40
|
+
t.save
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_equal 3, Tag.all.size
|
44
|
+
|
45
|
+
# see if i can get a tag back from th db
|
46
|
+
t = Tag.find_by_name("Tag_1")
|
47
|
+
|
48
|
+
assert_not_nil t
|
49
|
+
|
50
|
+
i1 = Item.new
|
51
|
+
i1.name = "Item_1"
|
52
|
+
i1.save
|
53
|
+
i1.add_tag(Tag.find_by_name("Tag_1"))
|
54
|
+
i1.add_tag(Tag.find_by_name("Tag_2"))
|
55
|
+
i1.save
|
56
|
+
|
57
|
+
i2 = Item.new
|
58
|
+
i2.name = "Item_2"
|
59
|
+
i2.save
|
60
|
+
i2.add_tag(Tag.find_by_name("Tag_2"))
|
61
|
+
i2.add_tag(Tag.find_by_name("Tag_3"))
|
62
|
+
i2.save
|
63
|
+
|
64
|
+
# count SQL, note that the join table will change when test class changes
|
65
|
+
|
66
|
+
sql = 'SELECT count(*) FROM ogj_tc_joinsmany_item_tc_joinsmany_tag'
|
67
|
+
|
68
|
+
# after inserting 2 tags into the each of the 2 items, 4 relations
|
69
|
+
|
70
|
+
assert_equal 4, @conn.query(sql).first_value.to_i
|
71
|
+
|
72
|
+
i1.delete(true)
|
73
|
+
i2.delete(true)
|
74
|
+
|
75
|
+
# after deleting the 2 items, the relations are invalid
|
76
|
+
|
77
|
+
assert_equal 0, @conn.query(sql).first_value.to_i
|
78
|
+
|
79
|
+
# the following code is new and should not trigger an exception due to
|
80
|
+
# existing items in the mapping table
|
81
|
+
|
82
|
+
assert_nothing_raised do
|
83
|
+
i3 = Item.new
|
84
|
+
i3.name = "Item_3"
|
85
|
+
i3.save
|
86
|
+
i3.add_tag(Tag.find_by_name("Tag_1"))
|
87
|
+
i3.add_tag(Tag.find_by_name("Tag_2"))
|
88
|
+
i3.save
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|