og 0.31.0 → 0.40.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/doc/{AUTHORS → CONTRIBUTORS} +26 -10
  2. data/doc/LICENSE +2 -3
  3. data/doc/RELEASES +56 -7
  4. data/doc/tutorial.txt +15 -15
  5. data/lib/glue/cacheable.rb +2 -5
  6. data/lib/glue/hierarchical.rb +1 -4
  7. data/lib/glue/optimistic_locking.rb +0 -2
  8. data/lib/glue/orderable.rb +79 -75
  9. data/lib/glue/revisable.rb +19 -24
  10. data/lib/glue/searchable.rb +0 -2
  11. data/lib/glue/taggable.rb +31 -29
  12. data/lib/glue/timestamped.rb +4 -2
  13. data/lib/og.rb +50 -29
  14. data/lib/og/adapter.rb +19 -0
  15. data/lib/og/adapter/mysql.rb +212 -0
  16. data/lib/og/adapter/mysql/override.rb +34 -0
  17. data/lib/og/adapter/mysql/script.rb +15 -0
  18. data/lib/og/adapter/mysql/utils.rb +40 -0
  19. data/lib/og/adapter/postgresql.rb +231 -0
  20. data/lib/og/adapter/postgresql/override.rb +117 -0
  21. data/lib/og/adapter/postgresql/script.rb +15 -0
  22. data/lib/og/adapter/postgresql/utils.rb +35 -0
  23. data/lib/og/adapter/sqlite.rb +132 -0
  24. data/lib/og/adapter/sqlite/override.rb +33 -0
  25. data/lib/og/adapter/sqlite/script.rb +15 -0
  26. data/lib/og/collection.rb +35 -7
  27. data/lib/og/{evolution.rb → dump.rb} +4 -5
  28. data/lib/og/entity.rb +102 -173
  29. data/lib/og/entity/clone.rb +119 -0
  30. data/lib/og/errors.rb +0 -2
  31. data/lib/og/manager.rb +85 -37
  32. data/lib/og/relation.rb +52 -34
  33. data/lib/og/relation/belongs_to.rb +0 -2
  34. data/lib/og/relation/has_many.rb +27 -4
  35. data/lib/og/relation/joins_many.rb +41 -14
  36. data/lib/og/relation/many_to_many.rb +10 -0
  37. data/lib/og/relation/refers_to.rb +22 -5
  38. data/lib/og/store.rb +80 -86
  39. data/lib/og/store/sql.rb +710 -713
  40. data/lib/og/store/sql/evolution.rb +119 -0
  41. data/lib/og/store/sql/join.rb +155 -0
  42. data/lib/og/store/sql/utils.rb +149 -0
  43. data/lib/og/test/assertions.rb +1 -3
  44. data/lib/og/test/testcase.rb +0 -2
  45. data/lib/og/types.rb +2 -5
  46. data/lib/og/validation.rb +6 -9
  47. data/test/{og/mixin → glue}/tc_hierarchical.rb +3 -13
  48. data/test/glue/tc_og_paginate.rb +47 -0
  49. data/test/{og/mixin → glue}/tc_optimistic_locking.rb +2 -12
  50. data/test/{og/mixin → glue}/tc_orderable.rb +15 -23
  51. data/test/glue/tc_orderable2.rb +47 -0
  52. data/test/glue/tc_revisable.rb +3 -3
  53. data/test/{og/mixin → glue}/tc_taggable.rb +20 -10
  54. data/test/{og/mixin → glue}/tc_timestamped.rb +2 -12
  55. data/test/glue/tc_webfile.rb +36 -0
  56. data/test/og/CONFIG.rb +8 -11
  57. data/test/og/multi_validations_model.rb +14 -0
  58. data/test/og/store/tc_filesys.rb +3 -1
  59. data/test/og/store/tc_kirby.rb +16 -13
  60. data/test/og/store/tc_sti.rb +11 -11
  61. data/test/og/store/tc_sti2.rb +79 -0
  62. data/test/og/tc_build.rb +41 -0
  63. data/test/og/tc_cacheable.rb +3 -2
  64. data/test/og/tc_has_many.rb +96 -0
  65. data/test/og/tc_inheritance.rb +6 -4
  66. data/test/og/tc_joins_many.rb +93 -0
  67. data/test/og/tc_multi_validations.rb +5 -7
  68. data/test/og/tc_multiple.rb +7 -6
  69. data/test/og/tc_override.rb +13 -7
  70. data/test/og/tc_primary_key.rb +30 -0
  71. data/test/og/tc_relation.rb +8 -14
  72. data/test/og/tc_reldelete.rb +163 -0
  73. data/test/og/tc_reverse.rb +17 -14
  74. data/test/og/tc_scoped.rb +3 -11
  75. data/test/og/tc_setup.rb +13 -11
  76. data/test/og/tc_store.rb +21 -28
  77. data/test/og/tc_validation2.rb +2 -2
  78. data/test/og/tc_validation_loop.rb +17 -15
  79. metadata +109 -103
  80. data/INSTALL +0 -91
  81. data/ProjectInfo +0 -51
  82. data/README +0 -177
  83. data/doc/config.txt +0 -28
  84. data/examples/README +0 -23
  85. data/examples/mysql_to_psql.rb +0 -71
  86. data/examples/run.rb +0 -271
  87. data/lib/glue/tree.rb +0 -218
  88. data/lib/og/store/alpha/filesys.rb +0 -110
  89. data/lib/og/store/alpha/memory.rb +0 -295
  90. data/lib/og/store/alpha/sqlserver.rb +0 -256
  91. data/lib/og/store/kirby.rb +0 -490
  92. data/lib/og/store/mysql.rb +0 -415
  93. data/lib/og/store/psql.rb +0 -875
  94. data/lib/og/store/sqlite.rb +0 -348
  95. data/lib/og/store/sqlite2.rb +0 -241
  96. data/setup.rb +0 -1585
  97. data/test/og/tc_sti_find.rb +0 -35
@@ -1,20 +1,18 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
1
+ require File.join(File.dirname(__FILE__), 'CONFIG.rb')
2
2
 
3
3
  require 'test/unit'
4
4
 
5
5
  require 'glue'
6
- require 'glue/property'
7
6
  require 'glue/validation'
8
7
  require 'og/validation'
9
8
 
10
9
  class TC_MultiValidation < Test::Unit::TestCase # :nodoc: all
11
10
 
12
- MultiValidationsModel = File.expand_path(File.join(File.dirname(__FILE__), 'multi_validations_model.rb'))
13
-
14
- def test_all
15
- load MultiValidationsModel
11
+ def test_all
12
+ file = File.join(File.dirname(__FILE__), 'multi_validations_model.rb')
13
+ load file
16
14
  assert_equal 2, TC_MultiValidation::User.validations.size
17
- load MultiValidationsModel
15
+ load file
18
16
  assert_equal 2, TC_MultiValidation::User.validations.size
19
17
  end
20
18
 
@@ -28,13 +28,14 @@ class TestMultiple < Test::Unit::TestCase # :nodoc: all
28
28
  @title = title
29
29
  end
30
30
  end
31
-
32
- def test_all
33
- $og1.manage_class Article
34
- $og2.manage_class User
35
31
 
36
- assert Article.ogmanager.store.is_a?($og1.store.class)
37
- assert User.ogmanager.store.is_a?($og2.store.class)
32
+ # Order is important, User has to be managed first!
33
+ $og2.manage_class User
34
+ $og1.manage_class Article
35
+
36
+ def test_all
37
+ assert_equal Article.ogmanager.store.class, $og1.store.class
38
+ assert_equal User.ogmanager.store.class, $og2.store.class
38
39
 
39
40
  a1 = Article.create('hello')
40
41
  a2 = Article.create('world')
@@ -6,12 +6,12 @@ require 'test/unit'
6
6
 
7
7
  require 'og'
8
8
 
9
- class TestOg < Test::Unit::TestCase
9
+ class TC_Override < Test::Unit::TestCase
10
10
  include Og
11
11
 
12
12
  class Book
13
- property :title
14
- belongs_to :owner, Person # this creates a problem?
13
+ property :title, String
14
+ belongs_to :owner, Person
15
15
  end
16
16
 
17
17
  class Person
@@ -22,7 +22,7 @@ class TestOg < Test::Unit::TestCase
22
22
  def setup
23
23
  @old_prefix = Og.table_prefix
24
24
  Og.table_prefix = nil
25
- og = Og.start
25
+ $og1.manage_classes(Book, Person)
26
26
  end
27
27
 
28
28
  def teardown
@@ -34,10 +34,16 @@ class TestOg < Test::Unit::TestCase
34
34
  book = Book.create
35
35
  person = Person.create
36
36
  person.books << book
37
+
38
+ assert_equal person.books.size, 1
37
39
  end
38
-
39
- def test_not_an_exact_duplicate
40
- # This is supposed to test Og.table_prefix, see setup below.
40
+
41
+ # This tests, if the tables are without prefix, note that changing the
42
+ # Class of the testcase will change the table name.
43
+
44
+ def test_og_prefix
45
+ assert_equal Book.table, 'tc_override_book'
46
+ assert_equal Person.table, 'tc_override_person'
41
47
  end
42
48
 
43
49
  end
@@ -0,0 +1,30 @@
1
+ require File.join(File.dirname(__FILE__), 'CONFIG.rb')
2
+
3
+ require 'rubygems'
4
+ require 'test/unit'
5
+
6
+ require 'og'
7
+
8
+ class TC_Key < Test::Unit::TestCase # :nodoc: all
9
+
10
+ class User
11
+ @@pk = $og1.store.primary_key_type
12
+ attr_accessor :newid, Fixnum, :primary_key => true, :sql => @@pk
13
+ attr_accessor :name, String
14
+ attr_accessor :age, Fixnum
15
+ end
16
+
17
+ $og1.manage_classes(User)
18
+
19
+ def test_all
20
+ User.create_with :name => 'George', :age => 14
21
+ User.create_with :name => 'Renos', :age => 20
22
+ User.create_with :name => 'Stella', :age => 23
23
+
24
+ User.all.each do |u|
25
+ assert_raise(NoMethodError) { u.oid }
26
+ assert_not_nil u.pk
27
+ assert_not_nil u.newid
28
+ end
29
+ end
30
+ end
@@ -7,12 +7,15 @@ require 'test/unit'
7
7
  require 'og'
8
8
  require 'og/relation'
9
9
 
10
- =begin
10
+ class Dummer
11
+ property :dum, String
12
+ end
13
+
11
14
  class TestCaseOgRelation < Test::Unit::TestCase # :nodoc: all
12
15
  include Og
13
-
16
+
14
17
  class User
15
- property :name
18
+ property :name, String
16
19
  has_many Dummer
17
20
  has_many Article
18
21
  def initialize(name)
@@ -27,6 +30,8 @@ class TestCaseOgRelation < Test::Unit::TestCase # :nodoc: all
27
30
  @body = body
28
31
  end
29
32
  end
33
+
34
+ $og1.manage_classes(Dummer, Article, User)
30
35
 
31
36
  def test_all
32
37
  # no-namespace case.
@@ -40,15 +45,9 @@ class TestCaseOgRelation < Test::Unit::TestCase # :nodoc: all
40
45
  assert_equal TestCaseOgRelation::Article, rel.target_class
41
46
 
42
47
  # bug: test the no belongs_to case in Article
43
-
44
- og = Og.setup($og_config)
45
- og.manage_classes
46
48
  end
47
49
 
48
50
  def test_refers_to
49
- og = Og.setup($og_config)
50
- og.manage_classes
51
-
52
51
  # test refers_to accessor is correctly updated
53
52
  u = User.create("George")
54
53
  a = Article.create("Og is a good thing!")
@@ -79,8 +78,3 @@ class TestCaseOgRelation < Test::Unit::TestCase # :nodoc: all
79
78
  assert_equal(u2.oid, a.active_user_oid)
80
79
  end
81
80
  end
82
-
83
- class Dummer
84
- property :dum, String
85
- end
86
- =end
@@ -0,0 +1,163 @@
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_DeletesRelationship < Test::Unit::TestCase # :nodoc: all
11
+ include Og
12
+
13
+ class Item
14
+ property :name, String
15
+
16
+ has_one Category
17
+ has_one Tag
18
+
19
+ has_many Picture
20
+ has_many :figures
21
+
22
+ joins_many User
23
+ end
24
+
25
+ ######
26
+ # Single
27
+ ######
28
+
29
+ class Category
30
+ property :name, String
31
+
32
+ belongs_to Item
33
+ end
34
+
35
+ class Tag
36
+ property :name, String
37
+
38
+ refers_to Item
39
+ end
40
+
41
+ ######
42
+ # Many
43
+ ######
44
+
45
+ class Picture
46
+ property :name, String
47
+
48
+ belongs_to Item
49
+ end
50
+
51
+ class Figure
52
+ property :name, String
53
+
54
+ refers_to Item
55
+ end
56
+
57
+ ######
58
+ # Many Many
59
+ ######
60
+
61
+ class User
62
+ property :name, String
63
+
64
+ many_to_many Item
65
+ end
66
+
67
+ $og1.manage_classes(Item, Tag, Category, Picture, Figure, User)
68
+
69
+ def setup
70
+ @conn = $og1.conn
71
+
72
+ @i = Item.create_with(:name => 'Copter')
73
+ @c = Category.create_with(:name => 'blabla')
74
+ @t = Tag.create_with(:name => 'blabla')
75
+
76
+ @p1 = Picture.create_with(:name => 'blabla1')
77
+ @p2 = Picture.create_with(:name => 'blabla2')
78
+ @f1 = Figure.create_with(:name => 'blabla1')
79
+ @f2 = Figure.create_with(:name => 'blabla2')
80
+
81
+ @u = User.create_with(:name => 'George')
82
+
83
+ @i.category = @c
84
+ @i.tag = @t
85
+
86
+ @i.pictures << @p1
87
+ @p2.item = @i
88
+
89
+ @i.figures << @f1
90
+ @f1.item = @i
91
+
92
+ @i.add_user @u
93
+ end
94
+
95
+ def teardown
96
+ [Tag, Item, Category, Picture, Figure, User].map {|x| x.delete_all }
97
+ @conn.exec("DELETE FROM #{Og::JoinsMany::OgTempJ_ogj_tc_deletesrelationship_item_tc_deletesrelationship_user::OGTABLE}")
98
+ end
99
+
100
+ def test_setup
101
+ assert_equal 1, Item.count, 'There should be 1 Item'
102
+ assert_equal 1, Category.count
103
+ assert_equal 1, Tag.count
104
+ assert_equal 2, Picture.count
105
+ assert_equal 2, Figure.count
106
+
107
+ assert_equal @t, @i.tag
108
+ assert_equal @c, @i.category
109
+ end
110
+
111
+ def test_relationship_intact
112
+ assert_equal @i.oid, @t.instance_variable_get('@item_oid')
113
+ assert_equal @i.oid, @c.instance_variable_get('@item_oid')
114
+ end
115
+
116
+ def test_descendants
117
+ assert_equal [
118
+ [Og::JoinsMany::OgTempJ_ogj_tc_deletesrelationship_item_tc_deletesrelationship_user, "item_oid"],
119
+ [Category, "item_oid"], [Picture, "item_oid"]],
120
+ Item.ann.self.descendants
121
+ end
122
+
123
+ ######
124
+ # Single
125
+ ######
126
+
127
+ def test_deletes_category
128
+ @i.delete
129
+ assert_equal 0, Category.count, "Category should be deleted"
130
+ end
131
+
132
+ def test_no_deletes_tag
133
+ @i.delete
134
+ assert_equal 1, Tag.count, 'Tag shouldn\'t be deleted'
135
+ end
136
+
137
+ ######
138
+ # Many
139
+ ######
140
+
141
+ def test_deletes_picture
142
+ @i.delete
143
+ assert_equal 0, Picture.count, "Pictures should be deleted"
144
+ end
145
+
146
+ def test_no_deletes_figure
147
+ @i.delete
148
+ assert_equal 2, Figure.count, 'Figures shouldn\'t be deleted'
149
+ end
150
+
151
+ #####
152
+ # Many Many
153
+ #####
154
+
155
+ def test_deletes_rel_in_join_table
156
+ @i.delete
157
+ tbl = Og::JoinsMany::OgTempJ_ogj_tc_deletesrelationship_item_tc_deletesrelationship_user::OGTABLE
158
+ n = @conn.query("SELECT COUNT(*) FROM #{tbl}").first_value.to_i
159
+
160
+ assert_equal 0, n;
161
+ end
162
+
163
+ end
@@ -10,11 +10,6 @@ require 'og'
10
10
  # to our objects.
11
11
 
12
12
 
13
- # create a 'legacy' schema.
14
-
15
- $og2.store.exec "create table my_users (thename VARCHAR(32) PRIMARY KEY, password TEXT, age3 INTEGER);"
16
- $og2.store.exec "create table my_comments (cid MEDIUMINT NOT NULL AUTO_INCREMENT, body TEXT, user VARCHAR(32), PRIMARY KEY(cid));"
17
-
18
13
  class TestReverse < Test::Unit::TestCase # :nodoc: all
19
14
  include Og
20
15
 
@@ -22,8 +17,8 @@ class TestReverse < Test::Unit::TestCase # :nodoc: all
22
17
  property :name, String, :field => :thename, :uniq => true
23
18
  property :password, String
24
19
  property :age, Fixnum, :field => :age3
25
- has_many Comment, :foreign_field => :user
26
- set_table :my_users
20
+ has_many Comment, :foreign_field => :usr
21
+ set_table :my_usrs
27
22
  set_primary_key :name, String
28
23
 
29
24
  def initialize(name, password, age)
@@ -32,9 +27,11 @@ class TestReverse < Test::Unit::TestCase # :nodoc: all
32
27
  end
33
28
 
34
29
  class Comment
35
- property :cid, Fixnum
30
+ @@pk = $og1.store.primary_key_type
31
+
32
+ property :cid, Fixnum, :sql => @@pk
36
33
  property :body, String
37
- belongs_to User, :field => :user
34
+ belongs_to User, :field => :usr
38
35
  set_table :my_comments
39
36
  set_primary_key :cid
40
37
 
@@ -43,13 +40,21 @@ class TestReverse < Test::Unit::TestCase # :nodoc: all
43
40
  end
44
41
  end
45
42
 
46
- $og2.manage_classes(User, Comment)
43
+ def setup
44
+ # create a 'legacy' schema.
45
+ store = $og1.store
46
+ pk = store.primary_key_type
47
+ store.exec "create table my_usrs (thename VARCHAR(32) PRIMARY KEY, password TEXT, age3 INTEGER)"
48
+ store.exec "create table my_comments (cid #{pk}, body TEXT, usr VARCHAR(32))"
49
+
50
+ $og1.manage_classes(User, Comment)
51
+ end
47
52
 
48
53
  def test_all
49
- assert_equal 'my_users', User.table
54
+ assert_equal 'my_usrs', User.table
50
55
  assert_equal 'my_comments', Comment.table
51
56
 
52
- User.new('gmosx', 'navel', 30).insert
57
+ User.new('gmosx', 'nitro', 30).insert
53
58
  User.new('Helen', 'kontesa', 25).insert
54
59
 
55
60
  gmosx = User.find_by_name('gmosx')
@@ -66,5 +71,3 @@ class TestReverse < Test::Unit::TestCase # :nodoc: all
66
71
  assert_equal 'hello', helen.comments[0].body
67
72
  end
68
73
  end
69
-
70
- # * George Moschovitis <gm@navel.gr>
@@ -13,27 +13,19 @@ class TC_OgScoped < Test::Unit::TestCase # :nodoc: all
13
13
  class User
14
14
  property :name, String
15
15
  has_many :articles
16
-
17
- def initialize(name = nil)
18
- @name = name
19
- end
20
16
  end
21
17
 
22
18
  class Article
23
19
  property :hits, Fixnum
24
20
  belongs_to :user
25
-
26
- def initialize(hits = nil)
27
- @hits = hits
28
- end
29
21
  end
30
22
 
31
23
  $og1.manage_classes(User, Article)
32
24
 
33
25
  def test_all
34
- u = User.create('tml')
35
- a1 = Article.create(10)
36
- a2 = Article.create(20)
26
+ u = User.create_with(:name => 'tml')
27
+ a1 = Article.create_with :hits => 10
28
+ a2 = Article.create_with :hits => 20
37
29
  u.articles << a1
38
30
  u.articles << a2
39
31
 
@@ -6,43 +6,45 @@ class TCOg_setup < Test::Unit::TestCase # :nodoc: all
6
6
  MockManager=Struct.new :options, :manage_classes, :post_setup
7
7
 
8
8
  def test_default
9
- manager= Og.setup
9
+ manager = Og.start
10
10
  assert_instance_of Og::Manager, manager
11
- assert_equal :sqlite, manager.options[:store]
11
+ assert_equal :sqlite, manager.options[:adapter]
12
12
  assert_equal 'data', manager.options[:name]
13
13
  assert_equal true, manager.options[:called_by_og_setup]
14
14
  end
15
15
 
16
16
  def test_mattrs_initialized
17
- manager= Og.setup
17
+ manager = Og.start
18
18
  assert_equal manager,Og.manager
19
19
  assert Og.thread_safe
20
20
  end
21
21
 
22
22
  def test_missing_store
23
- assert_raises(LoadError){Og.setup(:store=>:missing)}
23
+ # gmosx: this test is not needed, Og catches and reports this
24
+ # error.
25
+ # assert_raises(LoadError) { Og.start(:adapter => :missing) }
24
26
  end
25
27
 
26
28
  def test_setup_default_store_plus_options
27
- manager=Og.setup(:evolve_schema=>true)
29
+ manager = Og.start(:evolve_schema => true)
28
30
  assert_instance_of Og::Manager, manager
29
- assert_equal :sqlite, manager.options[:store]
31
+ assert_equal :sqlite, manager.options[:adapter]
30
32
  assert_equal true, manager.options[:evolve_schema]
31
33
  end
32
34
 
33
35
  def test_calls_manager_methods
34
- mock_manager=Struct.new :options, :called do
35
- def manage_classes
36
+ mock_manager = Struct.new(:options, :called) do
37
+ def manage_classes(*args)
36
38
  self.called = [:mc]
37
39
  end
38
40
  def post_setup
39
41
  self.called << :ps
40
42
  end
41
43
  end
42
- old=Og::Manager
44
+ old = Og::Manager
43
45
  Og.const_set :Manager, mock_manager
44
- manager=Og.setup
45
- assert_equal [:mc, :ps],manager.called
46
+ manager = Og.start
47
+ assert_equal [:mc, :ps], manager.called
46
48
  Og.const_set :Manager, old
47
49
  end
48
50
  end