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.
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