og 0.40.0 → 0.41.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/RELEASES +26 -0
- data/lib/glue/taggable.rb +17 -8
- data/lib/og.rb +1 -1
- data/lib/og/adapter/mysql.rb +6 -6
- data/lib/og/adapter/oracle.old.rb +509 -0
- data/lib/og/adapter/oracle.rb +299 -0
- data/lib/og/adapter/oracle/override.rb +23 -0
- data/lib/og/adapter/oracle/utils.rb +9 -0
- data/lib/og/adapter/postgresql.rb +0 -16
- data/lib/og/adapter/postgresql/script.rb +2 -2
- data/lib/og/entity.rb +36 -13
- data/lib/og/markers.rb +10 -2
- data/lib/og/store/sql.rb +11 -14
- data/lib/og/store/sql/evolution.rb +1 -1
- data/test/glue/tc_taggable.rb +47 -12
- data/test/og/CONFIG.rb +1 -1
- data/test/og/store/tc_sti2.rb +23 -2
- data/test/og/tc_inheritance2.rb +5 -3
- data/test/og/tc_polymorphic.rb +40 -13
- data/test/og/tc_reldelete.rb +11 -2
- metadata +9 -4
data/lib/og/markers.rb
CHANGED
@@ -7,7 +7,7 @@ module Og
|
|
7
7
|
# Marker module. If included in a class, the Og automanager
|
8
8
|
# ignores this class.
|
9
9
|
|
10
|
-
module Unmanageable
|
10
|
+
module Unmanageable
|
11
11
|
def self.included(base)
|
12
12
|
Og.unmanageable_classes << base
|
13
13
|
end
|
@@ -18,6 +18,14 @@ end
|
|
18
18
|
# pattern. Ie, all the subclasses of the base
|
19
19
|
# class are stored in the same schema (table).
|
20
20
|
|
21
|
-
module SchemaInheritanceBase
|
21
|
+
module SchemaInheritanceBase
|
22
|
+
def self.included(base)
|
23
|
+
|
24
|
+
# This class is a superclass in a single table inheritance
|
25
|
+
# chain. So inject a special class ogtype field that
|
26
|
+
# holds the class name.
|
27
|
+
base.attr_accessor :ogtype, String, :sql => 'VARCHAR(30)'
|
28
|
+
end
|
29
|
+
end
|
22
30
|
|
23
31
|
end
|
data/lib/og/store/sql.rb
CHANGED
@@ -350,7 +350,7 @@ class SqlStore < Store
|
|
350
350
|
if table_type = @options[:table_type]
|
351
351
|
sql << ") TYPE = #{table_type};"
|
352
352
|
else
|
353
|
-
sql << ")
|
353
|
+
sql << ")"
|
354
354
|
end
|
355
355
|
|
356
356
|
# Create indices.
|
@@ -639,7 +639,7 @@ class SqlStore < Store
|
|
639
639
|
if klass.schema_inheritance?
|
640
640
|
for desc in klass.schema_inheritance_root_class.descendents
|
641
641
|
attrs.concat desc.serializable_attributes
|
642
|
-
end
|
642
|
+
end
|
643
643
|
end
|
644
644
|
return attrs.uniq
|
645
645
|
end
|
@@ -679,15 +679,6 @@ class SqlStore < Store
|
|
679
679
|
fields = []
|
680
680
|
attrs = serializable_attributes_for_class(klass)
|
681
681
|
|
682
|
-
# FIXME: move to serializable attributes.
|
683
|
-
|
684
|
-
if klass.schema_inheritance?
|
685
|
-
# This class is a superclass in a single table inheritance
|
686
|
-
# chain. So inject a special class ogtype field that
|
687
|
-
# holds the class name.
|
688
|
-
fields << "ogtype VARCHAR(30)"
|
689
|
-
end
|
690
|
-
|
691
682
|
for a in attrs
|
692
683
|
anno = klass.ann[a]
|
693
684
|
if anno.null?
|
@@ -867,8 +858,7 @@ class SqlStore < Store
|
|
867
858
|
# an ogtype serializable attribute.
|
868
859
|
|
869
860
|
if klass.schema_inheritance?
|
870
|
-
fields
|
871
|
-
values << quote(klass.name)
|
861
|
+
values[fields.index(:ogtype)] = quote(klass.name)
|
872
862
|
end
|
873
863
|
|
874
864
|
fields = fields.join(', ')
|
@@ -1007,7 +997,14 @@ class SqlStore < Store
|
|
1007
997
|
if klass.schema_inheritance?
|
1008
998
|
klass.module_eval %{
|
1009
999
|
def self.og_allocate(res, row = 0)
|
1010
|
-
Object.constant(res[
|
1000
|
+
Object.constant(res['ogtype']).allocate
|
1001
|
+
rescue TypeError => e
|
1002
|
+
# TODO: use res['ogtype'] here, this is slow!
|
1003
|
+
# But res['ogtype'] isn't implemented in -pr and some mysql exts,
|
1004
|
+
# create compat layer
|
1005
|
+
col = ogmanager.store.create_field_map(self)[:ogtype]
|
1006
|
+
ogmanager.put_store
|
1007
|
+
Object.constant(res[col]).allocate
|
1011
1008
|
end
|
1012
1009
|
}
|
1013
1010
|
else
|
data/test/glue/tc_taggable.rb
CHANGED
@@ -18,22 +18,38 @@ class TestOgTaggable < Test::Unit::TestCase # :nodoc: all
|
|
18
18
|
@title = title
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
class Second
|
23
|
+
attr_accessor :haha, String
|
24
|
+
is Taggable
|
25
|
+
end
|
21
26
|
|
22
|
-
$og1.manage_classes(Article, Tag)
|
23
|
-
|
24
|
-
def
|
25
|
-
a1 = Article.create('Hello')
|
26
|
-
a1.tag('great gmosx sexy')
|
27
|
-
a1.save
|
27
|
+
$og1.manage_classes(Article, Tag, Second)
|
28
|
+
|
29
|
+
def setup
|
30
|
+
@a1 = Article.create('Hello')
|
31
|
+
@a1.tag('great gmosx sexy')
|
32
|
+
@a1.save
|
28
33
|
|
29
|
-
a2 = Article.create('Other')
|
30
|
-
a2.tag('gmosx rain')
|
31
|
-
a2.save
|
34
|
+
@a2 = Article.create('Other')
|
35
|
+
@a2.tag('gmosx rain')
|
36
|
+
@a2.save
|
32
37
|
|
33
|
-
a3 = Article.create('George')
|
34
|
-
a3.tag('phd name')
|
35
|
-
a3.save
|
38
|
+
@a3 = Article.create('George')
|
39
|
+
@a3.tag('phd name')
|
40
|
+
@a3.save
|
41
|
+
|
42
|
+
@s1 = Second.create
|
43
|
+
@s1.tag('gmosx')
|
44
|
+
@s1.save
|
45
|
+
end
|
46
|
+
|
47
|
+
def teardown
|
48
|
+
[Tag, Article, Second].each {|x| x.delete_all }
|
49
|
+
end
|
36
50
|
|
51
|
+
def test_all
|
52
|
+
a1, a2, a3 = @a1, @a2, @a3
|
37
53
|
|
38
54
|
assert_equal 6, Tag.count
|
39
55
|
assert_equal 3, a1.tags.size
|
@@ -71,6 +87,13 @@ class TestOgTaggable < Test::Unit::TestCase # :nodoc: all
|
|
71
87
|
assert n, tag.count
|
72
88
|
end
|
73
89
|
|
90
|
+
a = Second.create
|
91
|
+
b = Second.create
|
92
|
+
b.tag('hello world heh')
|
93
|
+
a.tag('hello heh george gmosx')
|
94
|
+
|
95
|
+
assert_equal 2, Second.find_with_tags('hello', 'heh').size
|
96
|
+
|
74
97
|
=begin
|
75
98
|
TODO:
|
76
99
|
Article.fing_with_no_tag('gmosx')
|
@@ -78,5 +101,17 @@ class TestOgTaggable < Test::Unit::TestCase # :nodoc: all
|
|
78
101
|
Article.find_by_tags(:with => '', :any => '', :no => '')
|
79
102
|
=end
|
80
103
|
end
|
104
|
+
|
105
|
+
def test_tag_tagged
|
106
|
+
t = Tag.find_by_name('gmosx')
|
107
|
+
|
108
|
+
assert_not_nil t
|
109
|
+
assert_equal 'gmosx', t.name
|
110
|
+
|
111
|
+
a = Article.relations.reject {|x| x.name != :tags }.first
|
112
|
+
assert_equal Article, a.owner_class
|
113
|
+
|
114
|
+
assert_equal [@a1, @a2, @s1], t.tagged
|
115
|
+
end
|
81
116
|
|
82
117
|
end
|
data/test/og/CONFIG.rb
CHANGED
data/test/og/store/tc_sti2.rb
CHANGED
@@ -22,7 +22,7 @@ class TC_STI2 < Test::Unit::TestCase
|
|
22
22
|
class Admin < User
|
23
23
|
property :admin_praise, String
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
class Login
|
27
27
|
property :pass, String
|
28
28
|
|
@@ -35,13 +35,23 @@ class TC_STI2 < Test::Unit::TestCase
|
|
35
35
|
belongs_to User
|
36
36
|
end
|
37
37
|
|
38
|
+
# This has .initialize overridden, Bugreport from Rayman
|
39
|
+
class PoorUser < User
|
40
|
+
property :poorness, Integer
|
41
|
+
|
42
|
+
def initialize(name = nil)
|
43
|
+
@poorness = 26
|
44
|
+
@name = name
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
38
48
|
def request
|
39
49
|
o = OpenStruct.new
|
40
50
|
o.params = {:name => 'George', :pass => 'Secret'}
|
41
51
|
return o
|
42
52
|
end
|
43
53
|
|
44
|
-
$og1.manage_classes User, Login, Admin, Pet
|
54
|
+
$og1.manage_classes User, Login, Admin, Pet, PoorUser
|
45
55
|
|
46
56
|
def setup
|
47
57
|
@user = Admin.create_with(request.params)
|
@@ -76,4 +86,15 @@ class TC_STI2 < Test::Unit::TestCase
|
|
76
86
|
assert_equal 1, @user.pets(:reload => true).size
|
77
87
|
end
|
78
88
|
|
89
|
+
def test_bugreport_rayman
|
90
|
+
p1 = PoorUser.create("JoJo")
|
91
|
+
p2 = PoorUser.find_one(:where => "name = 'JoJo'")
|
92
|
+
assert_equal p1.class, p2.class
|
93
|
+
assert_equal p1.oid, p2.oid
|
94
|
+
|
95
|
+
p3 = User.find_one(:where => "name = 'JoJo'")
|
96
|
+
assert_equal p1.class, p3.class
|
97
|
+
assert_equal p1.oid, p3.oid
|
98
|
+
end
|
99
|
+
|
79
100
|
end
|
data/test/og/tc_inheritance2.rb
CHANGED
@@ -27,8 +27,10 @@ class TC_OgInheritance2 < Test::Unit::TestCase # :nodoc: all
|
|
27
27
|
$og1.manage_classes(Project, FProject, DProject)
|
28
28
|
|
29
29
|
def test_all
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
assert_nothing_raised do
|
31
|
+
Project.create
|
32
|
+
FProject.create
|
33
|
+
DProject.create
|
34
|
+
end
|
33
35
|
end
|
34
36
|
end
|
data/test/og/tc_polymorphic.rb
CHANGED
@@ -8,6 +8,15 @@ require 'og'
|
|
8
8
|
|
9
9
|
class TC_OgPolymorphic < Test::Unit::TestCase # :nodoc: all
|
10
10
|
include Og
|
11
|
+
|
12
|
+
module Stuff
|
13
|
+
property :ahah, String
|
14
|
+
end
|
15
|
+
|
16
|
+
class Article
|
17
|
+
include Stuff
|
18
|
+
property :title, String
|
19
|
+
end
|
11
20
|
|
12
21
|
# This class is a polymorphic parent. Ie' it acts as template
|
13
22
|
# to generate customized versions of this class.
|
@@ -20,10 +29,22 @@ class TC_OgPolymorphic < Test::Unit::TestCase # :nodoc: all
|
|
20
29
|
@body = body
|
21
30
|
end
|
22
31
|
end
|
32
|
+
|
33
|
+
class Component
|
34
|
+
include Og::EntityMixin
|
35
|
+
|
36
|
+
belongs_to Article
|
37
|
+
end
|
23
38
|
|
24
39
|
class Article
|
25
|
-
property :title, String
|
26
40
|
has_many Comment
|
41
|
+
has_many Component
|
42
|
+
|
43
|
+
class Comment < TC_OgPolymorphic::Comment
|
44
|
+
def to_href
|
45
|
+
'/article'
|
46
|
+
end
|
47
|
+
end
|
27
48
|
|
28
49
|
def initialize(title)
|
29
50
|
@title = title
|
@@ -40,21 +61,27 @@ class TC_OgPolymorphic < Test::Unit::TestCase # :nodoc: all
|
|
40
61
|
end
|
41
62
|
|
42
63
|
$og1.manage_classes(Comment, Article, User)
|
43
|
-
|
44
|
-
def
|
45
|
-
u = User.create('gmosx')
|
46
|
-
|
47
|
-
u.comments << User::Comment.create('Hello')
|
48
|
-
u.comments << User::Comment.create('World')
|
49
|
-
|
50
|
-
assert_equal 2, u.comments.size
|
64
|
+
|
65
|
+
def setup
|
66
|
+
@u = User.create('gmosx')
|
51
67
|
|
52
|
-
|
68
|
+
@u.comments << User::Comment.create('Hello')
|
69
|
+
@u.comments << User::Comment.create('World')
|
53
70
|
|
54
|
-
a
|
55
|
-
a.comments << Article::Comment.create('World2')
|
71
|
+
@a = Article.create('test')
|
56
72
|
|
57
|
-
|
73
|
+
@a.comments << Article::Comment.create('Hello2')
|
74
|
+
@a.comments << Article::Comment.create('World2')
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_basic
|
78
|
+
assert_equal 2, @u.comments.size
|
79
|
+
assert_equal 2, @a.comments.size
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_nested
|
83
|
+
assert_equal 2, Article.relations.size
|
84
|
+
assert_equal 3, Article.serializable_attributes.size
|
58
85
|
end
|
59
86
|
|
60
87
|
end
|
data/test/og/tc_reldelete.rb
CHANGED
@@ -80,8 +80,8 @@ class TC_DeletesRelationship < Test::Unit::TestCase # :nodoc: all
|
|
80
80
|
|
81
81
|
@u = User.create_with(:name => 'George')
|
82
82
|
|
83
|
-
@i.category = @c
|
84
|
-
@i.tag = @t
|
83
|
+
@i.category = @c; @c.save
|
84
|
+
@i.tag = @t; @t.save
|
85
85
|
|
86
86
|
@i.pictures << @p1
|
87
87
|
@p2.item = @i
|
@@ -160,4 +160,13 @@ class TC_DeletesRelationship < Test::Unit::TestCase # :nodoc: all
|
|
160
160
|
assert_equal 0, n;
|
161
161
|
end
|
162
162
|
|
163
|
+
#####
|
164
|
+
# Bug Reports
|
165
|
+
#####
|
166
|
+
|
167
|
+
def test_jo_category_foreign_key_na
|
168
|
+
assert_not_nil @i.category
|
169
|
+
assert_equal @i.pk, @i.category.item_oid
|
170
|
+
end
|
171
|
+
|
163
172
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: og
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.41.0
|
7
|
+
date: 2006-12-12 12:36:44 +02:00
|
8
8
|
summary: State of the art object-relational mapping system
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -65,6 +65,9 @@ files:
|
|
65
65
|
- lib/og/adapter/postgresql.rb
|
66
66
|
- lib/og/adapter/sqlite
|
67
67
|
- lib/og/adapter/sqlite.rb
|
68
|
+
- lib/og/adapter/oracle
|
69
|
+
- lib/og/adapter/oracle.old.rb
|
70
|
+
- lib/og/adapter/oracle.rb
|
68
71
|
- lib/og/adapter/mysql/override.rb
|
69
72
|
- lib/og/adapter/mysql/script.rb
|
70
73
|
- lib/og/adapter/mysql/utils.rb
|
@@ -73,6 +76,8 @@ files:
|
|
73
76
|
- lib/og/adapter/postgresql/utils.rb
|
74
77
|
- lib/og/adapter/sqlite/override.rb
|
75
78
|
- lib/og/adapter/sqlite/script.rb
|
79
|
+
- lib/og/adapter/oracle/override.rb
|
80
|
+
- lib/og/adapter/oracle/utils.rb
|
76
81
|
- lib/og/entity/clone.rb
|
77
82
|
- lib/og/ez/clause.rb
|
78
83
|
- lib/og/ez/condition.rb
|
@@ -141,10 +146,10 @@ files:
|
|
141
146
|
- test/og/store/tc_sti.rb
|
142
147
|
- test/og/store/tc_sti2.rb
|
143
148
|
- doc/CHANGELOG.1
|
149
|
+
- doc/tutorial.txt
|
144
150
|
- doc/CONTRIBUTORS
|
145
151
|
- doc/LICENSE
|
146
152
|
- doc/RELEASES
|
147
|
-
- doc/tutorial.txt
|
148
153
|
test_files: []
|
149
154
|
|
150
155
|
rdoc_options: []
|
@@ -165,5 +170,5 @@ dependencies:
|
|
165
170
|
requirements:
|
166
171
|
- - "="
|
167
172
|
- !ruby/object:Gem::Version
|
168
|
-
version: 0.
|
173
|
+
version: 0.41.0
|
169
174
|
version:
|