og 0.16.0 → 0.17.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 (69) hide show
  1. data/CHANGELOG +485 -0
  2. data/README +35 -12
  3. data/Rakefile +4 -7
  4. data/benchmark/bench.rb +1 -1
  5. data/doc/AUTHORS +3 -3
  6. data/doc/RELEASES +153 -2
  7. data/doc/config.txt +0 -7
  8. data/doc/tutorial.txt +7 -0
  9. data/examples/README +5 -0
  10. data/examples/mysql_to_psql.rb +25 -50
  11. data/examples/run.rb +62 -77
  12. data/install.rb +1 -1
  13. data/lib/og.rb +45 -106
  14. data/lib/og/collection.rb +156 -0
  15. data/lib/og/entity.rb +131 -0
  16. data/lib/og/errors.rb +10 -15
  17. data/lib/og/manager.rb +115 -0
  18. data/lib/og/{mixins → mixin}/hierarchical.rb +43 -37
  19. data/lib/og/{mixins → mixin}/orderable.rb +35 -35
  20. data/lib/og/{mixins → mixin}/timestamped.rb +0 -6
  21. data/lib/og/{mixins → mixin}/tree.rb +0 -4
  22. data/lib/og/relation.rb +178 -0
  23. data/lib/og/relation/belongs_to.rb +14 -0
  24. data/lib/og/relation/has_many.rb +62 -0
  25. data/lib/og/relation/has_one.rb +17 -0
  26. data/lib/og/relation/joins_many.rb +69 -0
  27. data/lib/og/relation/many_to_many.rb +17 -0
  28. data/lib/og/relation/refers_to.rb +31 -0
  29. data/lib/og/store.rb +223 -0
  30. data/lib/og/store/filesys.rb +113 -0
  31. data/lib/og/store/madeleine.rb +4 -0
  32. data/lib/og/store/memory.rb +291 -0
  33. data/lib/og/store/mysql.rb +283 -0
  34. data/lib/og/store/psql.rb +238 -0
  35. data/lib/og/store/sql.rb +599 -0
  36. data/lib/og/store/sqlite.rb +190 -0
  37. data/lib/og/store/sqlserver.rb +262 -0
  38. data/lib/og/types.rb +19 -0
  39. data/lib/og/validation.rb +0 -4
  40. data/test/og/{mixins → mixin}/tc_hierarchical.rb +21 -23
  41. data/test/og/{mixins → mixin}/tc_orderable.rb +15 -14
  42. data/test/og/mixin/tc_timestamped.rb +38 -0
  43. data/test/og/store/tc_filesys.rb +71 -0
  44. data/test/og/tc_relation.rb +36 -0
  45. data/test/og/tc_store.rb +290 -0
  46. data/test/og/tc_types.rb +21 -0
  47. metadata +54 -40
  48. data/examples/mock_example.rb +0 -50
  49. data/lib/og/adapters/base.rb +0 -706
  50. data/lib/og/adapters/filesys.rb +0 -117
  51. data/lib/og/adapters/mysql.rb +0 -350
  52. data/lib/og/adapters/oracle.rb +0 -368
  53. data/lib/og/adapters/psql.rb +0 -272
  54. data/lib/og/adapters/sqlite.rb +0 -265
  55. data/lib/og/adapters/sqlserver.rb +0 -356
  56. data/lib/og/database.rb +0 -290
  57. data/lib/og/enchant.rb +0 -149
  58. data/lib/og/meta.rb +0 -407
  59. data/lib/og/testing/mock.rb +0 -165
  60. data/lib/og/typemacros.rb +0 -24
  61. data/test/og/adapters/tc_filesys.rb +0 -83
  62. data/test/og/adapters/tc_sqlite.rb +0 -86
  63. data/test/og/adapters/tc_sqlserver.rb +0 -96
  64. data/test/og/tc_automanage.rb +0 -46
  65. data/test/og/tc_lifecycle.rb +0 -105
  66. data/test/og/tc_many_to_many.rb +0 -61
  67. data/test/og/tc_meta.rb +0 -55
  68. data/test/og/tc_validation.rb +0 -89
  69. data/test/tc_og.rb +0 -364
@@ -1,46 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
-
3
- require 'test/unit'
4
- require 'ostruct'
5
-
6
- require 'og'
7
-
8
- $og = Og::Database.new(
9
- :adapter => 'psql',
10
- :database => 'test',
11
- :user => 'postgres',
12
- :password => 'navelrulez',
13
- :drop => true
14
- )
15
-
16
- class TestCaseOgObserver < Test::Unit::TestCase # :nodoc: all
17
-
18
- # Define a class after the Database is created.
19
-
20
- class Article; end
21
-
22
- class User
23
- property :name
24
-
25
- # auto forward ref.
26
- has_many :articles, Article
27
- end
28
-
29
- class Article
30
- property :name, String
31
- property :age, Fixnum
32
-
33
- def initialize (name = nil, age = nil)
34
- @name, @age = name, age
35
- end
36
- end
37
-
38
- def test_all
39
- assert_equal 0, $og.managed_classes.size
40
- $og.auto_manage_classes
41
- assert_equal 2, $og.managed_classes.size
42
- assert $og.managed_classes.include?(User)
43
- assert $og.managed_classes.include?(Article)
44
- end
45
-
46
- end
@@ -1,105 +0,0 @@
1
- #! /usr/bin/env ruby
2
- # vim:sw=2:ai
3
-
4
- # * Thomas Quas <tquas@yahoo.com>
5
- # * George Moschovitis <gm@navel.gr>
6
- # $Id: tc_lifecycle.rb 17 2005-04-14 16:03:40Z gmosx $
7
-
8
- $LOAD_PATH.unshift 'lib'
9
-
10
- require 'test/unit'
11
- require 'glue/logger'
12
- require 'og/testing/mock'
13
-
14
- $DBG = false
15
-
16
- class Dummy
17
- include Aspects
18
-
19
- prop_accessor :date, Time
20
- attr_accessor :call_stack
21
-
22
- pre(:on => :og_insert) { |this| this.call_stack << 'pre_insert' }
23
- post(:on => :og_insert) { |this| this.call_stack << 'post_insert' }
24
-
25
- def og_pre_update
26
- @call_stack << 'pre_update'
27
- end
28
- pre :og_pre_update, :on => :og_update
29
-
30
- post(:on => :og_update) { |this| this.call_stack << 'post_update' }
31
-
32
- # faster :)
33
-
34
- post "@call_stack << 'post_update2'", :on => :og_update
35
-
36
- def self.og_pre_delete( conn, oid )
37
- raise 'undeletable'
38
- end
39
-
40
- def initialize
41
- @call_stack = []
42
- end
43
- end
44
-
45
- # Tests the Og managed objects lifecycle.
46
- class TC_CallbackTest < ::Test::Unit::TestCase
47
- def test_insert
48
- obj = Dummy.new
49
- obj.save!
50
-
51
- assert( obj.call_stack.shift == 'pre_insert' )
52
- assert( obj.call_stack.shift == 'post_insert' )
53
- assert( obj.call_stack.empty? )
54
- end
55
-
56
- def test_update
57
- obj = Dummy.new
58
- obj.save!
59
- obj.call_stack.shift
60
- obj.call_stack.shift
61
-
62
- obj.date = Time.now
63
- obj.save
64
- assert( obj.call_stack.shift == "pre_update" )
65
- assert( obj.call_stack.shift == "post_update" )
66
- assert( obj.call_stack.shift == "post_update2" )
67
- assert( obj.call_stack.empty? )
68
- end
69
-
70
- def test_delete
71
- obj = Dummy.new
72
- obj.save!
73
- obj.call_stack.shift
74
- obj.call_stack.shift
75
-
76
- assert_raise( RuntimeError, 'undeletable' ) { obj.delete! }
77
- end
78
-
79
- def setup
80
- psql = true
81
-
82
- if psql
83
- config = {
84
- :adapter => 'psql',
85
- # :address => 'localhost',
86
- :database => 'test',
87
- :user => 'postgres',
88
- :password => 'navelrulez',
89
- :connection_count => 1
90
- }
91
- else
92
- config = {
93
- :adapter => 'mysql',
94
- # :address => 'localhost',
95
- :database => 'test',
96
- :user => 'root',
97
- :password => 'navelrulez',
98
- :connection_count => 1
99
- }
100
- end
101
- Og::Database.drop_db!(config)
102
- $og = Og::Database.new(config)
103
- $og.get_connection()
104
- end
105
- end
@@ -1,61 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
-
3
- require 'test/unit'
4
- require 'ostruct'
5
-
6
- require 'og'
7
-
8
- class TC_OgManyToMany < Test::Unit::TestCase # :nodoc: all
9
-
10
- class Attribute
11
- property :name, String
12
-
13
- def initialize(name = nil)
14
- @name = name
15
- end
16
- end
17
-
18
- class Klass
19
- property :name, String
20
- many_to_many :observed_attributes, Attribute, :linkback => :klass_observers
21
- many_to_many :controlled_attributes, Attribute, :linkback => :klass_controllers
22
-
23
- def initialize(name = nil)
24
- @name = name
25
- end
26
- end
27
-
28
- def test_all
29
- config = {
30
- :adapter => 'psql',
31
- :database => 'test',
32
- :user => 'postgres',
33
- :password => 'navelrulez',
34
- :connection_count => 2
35
- }
36
-
37
- Og::Database.drop_db!(config)
38
- og = Og::Database.new(config)
39
-
40
- og.get_connection
41
-
42
- k = Klass.create('klass1')
43
- a1 = Attribute.create('attr1')
44
- a2 = Attribute.create('attr2')
45
-
46
- k.add_observed_attribute(a1)
47
- k.add_observed_attribute(a2)
48
-
49
- assert_equal 2, k.observed_attributes.size
50
- assert_equal 1, a1.klass_observers.size
51
-
52
- k.add_controlled_attribute(a1)
53
-
54
- assert_equal 1, k.controlled_attributes.size
55
- assert_equal 1, a1.klass_controllers.size
56
-
57
- og.put_connection
58
- og.shutdown
59
- end
60
-
61
- end
data/test/og/tc_meta.rb DELETED
@@ -1,55 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
-
3
- require 'test/unit'
4
- require 'ostruct'
5
-
6
- require 'og'
7
-
8
- class TC_OgMeta < Test::Unit::TestCase # :nodoc: all
9
- include Og
10
-
11
- # Forward declaration.
12
-
13
- class Comment; end
14
-
15
- class Article
16
- property :name, String
17
- property :age, Fixnum
18
- has_many :comments, Comment
19
-
20
- def initialize (name = nil, age = nil)
21
- @name, @age = name, age
22
- end
23
- end
24
-
25
- class Comment
26
- prop_accessor :text, String
27
- belongs_to :article, Article
28
-
29
- def initialize(text = nil)
30
- @text = text
31
- end
32
- end
33
-
34
- def setup
35
- end
36
-
37
- def teardown
38
- end
39
-
40
- def test_all
41
- par = Article.__meta[:props_and_relations]
42
- assert_equal 3, par.size
43
- assert_equal Property, par[1].class
44
- assert_equal HasMany, par[2].class
45
-
46
- par = Comment.__meta[:props_and_relations]
47
- assert_equal 3, par.size
48
- assert_equal Property, par[0].class
49
- assert_equal BelongsTo, par[1].class
50
- assert_equal 'article_oid', par[1].meta[:property].to_s
51
- assert_equal String, par[0].klass
52
- assert_equal Article, par[1].foreign_class
53
- end
54
-
55
- end
@@ -1,89 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
-
3
- require 'test/unit'
4
-
5
- require 'og'
6
- require 'og/validation'
7
-
8
- Property.type_checking = false
9
-
10
- class TC_OgValidation < Test::Unit::TestCase # :nodoc: all
11
-
12
- class Group; end
13
-
14
- class User
15
- property :name, String
16
- validate_unique :name
17
-
18
- def initialize(name = nil)
19
- @name = name
20
- end
21
- end
22
-
23
- class Filler
24
- property :name, String
25
- validate_length :name, :min => 3
26
-
27
- belongs_to :group, Group
28
-
29
- def initialize(name = nil)
30
- @name = name
31
- end
32
- end
33
-
34
- class Group
35
- property :name, String
36
-
37
- has_many :fillers, Filler
38
- validate_related :fillers
39
- end
40
-
41
- def test_all
42
- config = {
43
- :adapter => 'psql',
44
- :database => 'test',
45
- :user => 'postgres',
46
- :password => 'navelrulez',
47
- :connection_count => 2
48
- }
49
-
50
- Og::Database.drop_db!(config)
51
- og = Og::Database.new(config)
52
-
53
- og.get_connection
54
-
55
- # validate_unique
56
-
57
- u1 = User.create('gmosx')
58
-
59
- u2 = User.new('gmosx')
60
- assert !u2.valid?
61
- assert_equal 1, u2.errors.count
62
-
63
- u2.name = 'stella'
64
- u2.valid?
65
- assert u2.valid?
66
-
67
- # validate_related
68
-
69
- f1 = Filler.new('g')
70
- f2 = Filler.new('ok')
71
-
72
- g = Group.create
73
- g.add_filler(f1)
74
- g.add_filler(f2)
75
-
76
- assert !g.valid?
77
-
78
- f1.name = 'george'
79
- f1.save
80
- f2.name = 'stella'
81
- f2.save
82
-
83
- assert g.valid?
84
-
85
- og.put_connection
86
- og.shutdown
87
- end
88
-
89
- end
data/test/tc_og.rb DELETED
@@ -1,364 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
2
-
3
- $DBG = true
4
-
5
- require 'test/unit'
6
-
7
- require 'og'
8
-
9
- module Test # :nodoc: all
10
-
11
- # bug: creates a table that fucks-up postgres if not
12
- # correctly escaped.
13
- class User
14
- prop_accessor :name, String, :unique => true
15
- prop_accessor :banned, TrueClass
16
-
17
- def initialize(name = nil)
18
- @name = name
19
- end
20
- end
21
-
22
- class Role
23
- prop_accessor :title, String
24
- property :chk_not_null, Fixnum, :default => 2
25
- end
26
-
27
- class Comment; end
28
- class Article; end
29
-
30
- class Category
31
- prop_accessor :title, String
32
- many_to_many :articles, Article
33
- end
34
-
35
- class Article
36
- prop_accessor :title, String
37
- prop_accessor :body, String
38
- prop_accessor :owner_oid, Fixnum, :sql_index => true
39
- prop_accessor :another_oid, Fixnum
40
- property :create_time, Time
41
- property :rate, Float
42
- sql_index 'owner_oid, another_oid'
43
- prop_accessor :options, Hash
44
- has_many :comments, Test::Comment
45
-
46
- def initialize(title = nil, body = nil)
47
- @title = title
48
- @body = body
49
- @options = {"hello" => "world"}
50
- end
51
- end
52
-
53
- class Comment
54
- prop_accessor :body, String
55
- prop_accessor :create_time, Time
56
- belongs_to :article, Test::Article, :extra_sql => 'NOT NULL'
57
- belongs_to :author, Test::User
58
-
59
- def initialize(body = nil)
60
- @create_time = Time.now
61
- @body = body
62
- end
63
- end
64
-
65
- module MyMixin
66
- prop_accessor :title, String
67
- end
68
-
69
- class MyClass
70
- include Test::MyMixin
71
- end
72
-
73
- class OrderItem
74
- prop_accessor :onumber, Fixnum
75
- refers_to :article, Article
76
- end
77
-
78
- class TC_N_OG < Test::Unit::TestCase
79
-
80
- @@adapter = :psql
81
-
82
- case @@adapter
83
-
84
- when :psql
85
- def test_psql
86
- config = {
87
- :adapter => 'psql',
88
- # :address => 'localhost',
89
- :database => 'test',
90
- :user => 'postgres',
91
- :password => 'navelrulez',
92
- :connection_count => 2
93
- }
94
-
95
- run_all_tests(config)
96
- end
97
-
98
- when :mysql
99
- def test_mysql
100
- config = {
101
- :adapter => 'mysql',
102
- # :address => 'localhost',
103
- :database => 'test',
104
- :user => 'root',
105
- :password => 'navelrulez',
106
- :connection_count => 2
107
- }
108
-
109
- run_all_tests(config)
110
- end
111
-
112
- when :oracle
113
- def test_oracle
114
- config = {
115
- :adapter => 'oracle',
116
- # :address => 'localhost',
117
- :database => 'test',
118
- :user => 'root',
119
- :password => 'navelrulez',
120
- :connection_count => 2
121
- }
122
-
123
- run_all_tests(config)
124
- end
125
-
126
- when :sqlite
127
- def test_sqlite
128
- config = {
129
- :adapter => 'sqlite',
130
- :database => 'test',
131
- :connection_count => 2
132
- }
133
-
134
- run_all_tests(config)
135
- end
136
- end
137
-
138
- # gmosx: hmm, implemented in one method to enforce order.
139
-
140
- def run_all_tests(config)
141
- Og::Database.drop_db!(config)
142
- og = Og::Database.new(config)
143
-
144
- og.get_connection
145
-
146
- article = Article.new("Title", "Here comes the body")
147
- article.create_time = now = Time.now
148
- article.rate = rate = 12.33
149
- og << article
150
-
151
- article.title = "Changed"
152
- article.save!
153
-
154
- og.pupdate("body='Hello'", article)
155
-
156
- article.update_properties "body='Hello'"
157
-
158
- another = Article[1]
159
- assert_equal(1, another.oid)
160
- assert_equal now.to_i, another.create_time.to_i
161
- assert_equal rate, another.rate
162
-
163
- # bug: yaml load problem.
164
- assert_equal("world", another.options["hello"])
165
-
166
- # bug: YAMLing nil property
167
- another.options = nil
168
- another.save!
169
-
170
- assert_equal(nil, og.load(30000, Article))
171
-
172
- articles = og.load_all(Article)
173
-
174
- # p articles
175
- # p Article[23]
176
-
177
- user = User.new("gmosx")
178
- user.save!
179
-
180
- user = User["gmosx"]
181
-
182
- assert_equal("gmosx", user.name)
183
-
184
- users1 = og.select("name='gmosx' ORDER BY oid", User)
185
-
186
- users = og.select("SELECT * FROM #{User::DBTABLE} WHERE name='gmosx' ORDER BY oid", User)
187
-
188
- users2 = User.select "name='gmosx' ORDER BY oid"
189
-
190
- assert_equal(users1.size, users2.size)
191
-
192
- article = Article.new("Title", "Body")
193
- article.save!
194
-
195
- # advanced finder
196
-
197
- users3 = User.find_by_banned(true)
198
- assert users3.empty?
199
-
200
- user3 = User.find_by_name('gmosx')
201
- assert_equal 'gmosx', user3.name
202
-
203
- user3.banned = true
204
- user3.save
205
-
206
- users3 = User.find_by_banned(true)
207
- assert !users3.empty?
208
-
209
- comment = Comment.new("This is a comment")
210
- comment.article = article
211
- comment.author = User["gmosx"]
212
- comment.save!
213
-
214
- # test automatically generated add_comment
215
- comment = Comment.new("This is another comment")
216
- comment.author = User["gmosx"]
217
- article.add_comment(comment)
218
-
219
- # test add_comment with block.
220
- article.add_comment do |c|
221
- c.body = 'Another one'
222
- c.author = User['gmosx']
223
- end
224
-
225
- assert_equal(article.oid, comment.article_oid)
226
-
227
- comments = article.comments
228
-
229
- assert_equal(3, comments.size)
230
-
231
- # test many_to_many relations.
232
-
233
- category = Category.create
234
- category.add_article(article)
235
-
236
- assert_equal 1, category.articles.size
237
-
238
- # bug: test many_to_many with non-saved object.
239
-
240
- ans = Article.new
241
- ans.title = 'non saved'
242
- category.add_article(ans)
243
-
244
- category.add_article do |a|
245
- a.title = 'another'
246
- end
247
-
248
- assert_equal 3, category.articles.size
249
-
250
- assert_equal 1, article.categories.size
251
-
252
- assert_equal("gmosx", comments[0].author.name)
253
-
254
- article.delete_all_comments
255
- assert article.comments.empty?
256
-
257
- # test cascading delete
258
-
259
- article.add_comment(Comment.new("hello"))
260
- article.add_comment(Comment.new("world"))
261
-
262
- assert_equal 2, Comment.count
263
-
264
- Article.delete(article)
265
-
266
- assert Comment.all.empty?
267
-
268
- comment.delete!
269
-
270
- # test extra_sql
271
-
272
- for p in Comment.__props
273
- if :article_oid == p.symbol
274
- assert_equal('NOT NULL', p.meta[:extra_sql])
275
- break
276
- end
277
- end
278
-
279
- assert(og.managed_classes.include?(Test::Article))
280
-
281
- # bug: indirectly managed (includes managed Module)
282
- assert(og.managed_classes.include?(Test::MyClass))
283
-
284
- # test create
285
- article = Article.create("title", "body")
286
- # assert_equal(3, article.oid)
287
-
288
- # test refers_to
289
-
290
- oi = OrderItem.new
291
- oi.article = article
292
- oi.save
293
-
294
- assert_equal article.oid, oi.article_oid
295
-
296
- # bug
297
-
298
- user = User['gmosx']
299
- user.banned = true
300
- user.save!
301
-
302
- user = User['gmosx']
303
- assert_equal true, user.banned
304
-
305
- # test not null
306
-
307
- role = Role.new
308
-
309
- begin
310
- role.save
311
- rescue Exception, StandardError
312
- # drink it
313
- end
314
-
315
- role = Role[1]
316
-
317
- # not saved due to not nul constraint.
318
- assert_equal nil, role
319
-
320
- # test reload.
321
-
322
- User.create('karras')
323
-
324
- u1 = User['karras']
325
- u2 = User['karras']
326
-
327
- u1.name = 'vaio'
328
- u1.save
329
-
330
- assert_equal 'vaio', u1.name
331
- assert_equal 'karras', u2.name
332
-
333
- u2.reload!
334
-
335
- assert_equal 'vaio', u2.name
336
-
337
- # test raise db exception.
338
-
339
- assert_raises(Og::SqlException) {
340
- User.select('SEGECT *')
341
- }
342
-
343
- Og.raise_db_exceptions = false
344
-
345
- assert_nothing_raised {
346
- User.select('SEGECT *')
347
- }
348
-
349
- og.put_connection
350
- og.shutdown
351
-
352
- # Test database allready exists
353
-
354
- og = Og::Database.new(config)
355
-
356
- user = User.new("kokoriko")
357
- user.save!
358
-
359
- og.shutdown
360
- end
361
-
362
- end
363
-
364
- end