og 0.11.0 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +150 -0
- data/README.og +4 -3
- data/RELEASES.og +40 -0
- data/Rakefile +2 -2
- data/{AUTHORS → doc/AUTHORS} +0 -0
- data/{LICENSE → doc/LICENSE} +0 -0
- data/lib/og.rb +25 -11
- data/lib/og/adapter.rb +141 -7
- data/lib/og/adapters/mysql.rb +41 -3
- data/lib/og/adapters/oracle.rb +4 -3
- data/lib/og/adapters/psql.rb +3 -3
- data/lib/og/adapters/sqlite.rb +3 -3
- data/lib/og/connection.rb +5 -1
- data/lib/og/database.rb +26 -12
- data/lib/og/enchant.rb +50 -16
- data/lib/og/meta.rb +15 -15
- data/lib/og/observer.rb +53 -0
- data/test/og/tc_many_to_many.rb +62 -0
- data/test/og/tc_observer.rb +85 -0
- data/test/tc_og.rb +16 -2
- metadata +9 -6
data/lib/og/observer.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# * George Moschovitis <gm@navel.gr>
|
2
|
+
# (c) 2004-2005 Navel, all rights reserved.
|
3
|
+
# $Id: observer.rb 271 2005-03-07 17:56:45Z gmosx $
|
4
|
+
|
5
|
+
module Og
|
6
|
+
|
7
|
+
# Classes that include this module can be tracked by
|
8
|
+
# Observers. The observer mechanism utilizes duck typing
|
9
|
+
# so you can attach any class that responds to the
|
10
|
+
# Og lifycycle callback methods. However, classes extended
|
11
|
+
# from the Observer base class are typically used.
|
12
|
+
|
13
|
+
module Observable
|
14
|
+
def add_observer(*observer)
|
15
|
+
for o in observer.flatten
|
16
|
+
meta :og_observers, o
|
17
|
+
self.og_db.adapter.eval_lifecycle_methods(self, self.og_db)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Observers are attached to managed classes to track their
|
23
|
+
# Lifecycle. This way, the 'polution' of the original class
|
24
|
+
# with excess responsibility is avoided.
|
25
|
+
#
|
26
|
+
# An observer can implement the standard Og lifecycle
|
27
|
+
# callbacks:
|
28
|
+
#
|
29
|
+
# * og_pre_read
|
30
|
+
# * og_post_read
|
31
|
+
# * og_pre_insert
|
32
|
+
# * og_post_insert
|
33
|
+
# * og_pre_update
|
34
|
+
# * og_post_update
|
35
|
+
# * og_pre_insert_update
|
36
|
+
# * og_post_insert_update
|
37
|
+
# * self.og_pre_delete
|
38
|
+
#
|
39
|
+
# Based on code from ActiveRecord (http://www.rubyonrails.com)
|
40
|
+
|
41
|
+
class Observer
|
42
|
+
include Singleton
|
43
|
+
|
44
|
+
# Attaches the observer to the supplied classes.
|
45
|
+
|
46
|
+
def self.observe(*classes)
|
47
|
+
for c in classes.flatten
|
48
|
+
c.meta :og_observers, self
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,62 @@
|
|
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
|
+
include N
|
10
|
+
|
11
|
+
class Attribute
|
12
|
+
property :name, String
|
13
|
+
|
14
|
+
def initialize(name = nil)
|
15
|
+
@name = name
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Klass
|
20
|
+
property :name, String
|
21
|
+
many_to_many :observed_attributes, Attribute, :linkback => :klass_observers
|
22
|
+
many_to_many :controlled_attributes, Attribute, :linkback => :klass_controllers
|
23
|
+
|
24
|
+
def initialize(name = nil)
|
25
|
+
@name = name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_all
|
30
|
+
config = {
|
31
|
+
:adapter => 'psql',
|
32
|
+
:database => 'test',
|
33
|
+
:user => 'postgres',
|
34
|
+
:password => 'navelrulez',
|
35
|
+
:connection_count => 2
|
36
|
+
}
|
37
|
+
|
38
|
+
Og::Database.drop_db!(config)
|
39
|
+
og = Og::Database.new(config)
|
40
|
+
|
41
|
+
og.get_connection
|
42
|
+
|
43
|
+
k = Klass.create('klass1')
|
44
|
+
a1 = Attribute.create('attr1')
|
45
|
+
a2 = Attribute.create('attr2')
|
46
|
+
|
47
|
+
k.add_observed_attribute(a1)
|
48
|
+
k.add_observed_attribute(a2)
|
49
|
+
|
50
|
+
assert_equal 2, k.observed_attributes.size
|
51
|
+
assert_equal 1, a1.klass_observers.size
|
52
|
+
|
53
|
+
k.add_controlled_attribute(a1)
|
54
|
+
|
55
|
+
assert_equal 1, k.controlled_attributes.size
|
56
|
+
assert_equal 1, a1.klass_controllers.size
|
57
|
+
|
58
|
+
og.put_connection
|
59
|
+
og.shutdown
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
require 'og'
|
7
|
+
|
8
|
+
class TC_OgObserver < Test::Unit::TestCase # :nodoc: all
|
9
|
+
include N
|
10
|
+
|
11
|
+
class User
|
12
|
+
property :name
|
13
|
+
end
|
14
|
+
|
15
|
+
class Article
|
16
|
+
property :name, String
|
17
|
+
property :age, Fixnum
|
18
|
+
|
19
|
+
def initialize (name = nil, age = nil)
|
20
|
+
@name, @age = name, age
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Example of a simple class that acts as an observer.
|
25
|
+
|
26
|
+
class ArticleObserver
|
27
|
+
attr :count
|
28
|
+
|
29
|
+
def initialize
|
30
|
+
@count = 0
|
31
|
+
end
|
32
|
+
|
33
|
+
def og_pre_insert(conn, obj)
|
34
|
+
@count += 1
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Rails style observer, baaah...
|
39
|
+
|
40
|
+
class MultiObserver < Og::Observer
|
41
|
+
observe Article, User
|
42
|
+
|
43
|
+
attr :count
|
44
|
+
|
45
|
+
def initialize
|
46
|
+
@count = 0
|
47
|
+
end
|
48
|
+
|
49
|
+
def og_pre_insert(conn, obj)
|
50
|
+
@count += 1
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def setup
|
55
|
+
end
|
56
|
+
|
57
|
+
def teardown
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_all
|
61
|
+
config = {
|
62
|
+
:adapter => 'psql',
|
63
|
+
:database => 'test',
|
64
|
+
:user => 'postgres',
|
65
|
+
:password => 'navelrulez',
|
66
|
+
:connection_count => 2
|
67
|
+
}
|
68
|
+
|
69
|
+
Og::Database.drop_db!(config)
|
70
|
+
og = Og::Database.new(config)
|
71
|
+
|
72
|
+
og.get_connection
|
73
|
+
|
74
|
+
ao = ArticleObserver.new
|
75
|
+
Article.add_observer(ao)
|
76
|
+
Article.create('Hello', 5)
|
77
|
+
|
78
|
+
assert_equal 1, ao.count
|
79
|
+
assert_equal 1, MultiObserver.instance.count
|
80
|
+
|
81
|
+
og.put_connection
|
82
|
+
og.shutdown
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
data/test/tc_og.rb
CHANGED
@@ -11,7 +11,7 @@ module Test # :nodoc: all
|
|
11
11
|
# bug: creates a table that fucks-up postgres if not
|
12
12
|
# correctly escaped.
|
13
13
|
class User
|
14
|
-
prop_accessor :name, String
|
14
|
+
prop_accessor :name, String, :unique => true
|
15
15
|
prop_accessor :banned, TrueClass
|
16
16
|
|
17
17
|
def initialize(name = nil)
|
@@ -212,6 +212,20 @@ class TC_N_OG < Test::Unit::TestCase
|
|
212
212
|
article = Article.new("Title", "Body")
|
213
213
|
article.save!
|
214
214
|
|
215
|
+
# advanced finder
|
216
|
+
|
217
|
+
users3 = User.find_by_banned(true)
|
218
|
+
assert users3.empty?
|
219
|
+
|
220
|
+
user3 = User.find_by_name('gmosx')
|
221
|
+
assert_equal 'gmosx', user3.name
|
222
|
+
|
223
|
+
user3.banned = true
|
224
|
+
user3.save
|
225
|
+
|
226
|
+
users3 = User.find_by_banned(true)
|
227
|
+
assert !users3.empty?
|
228
|
+
|
215
229
|
comment = Comment.new("This is a comment")
|
216
230
|
comment.article = article
|
217
231
|
comment.author = User["gmosx"]
|
@@ -330,7 +344,7 @@ class TC_N_OG < Test::Unit::TestCase
|
|
330
344
|
|
331
345
|
og = Og::Database.new(config)
|
332
346
|
|
333
|
-
user = User.new("
|
347
|
+
user = User.new("kokoriko")
|
334
348
|
user.save!
|
335
349
|
|
336
350
|
og.shutdown
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.6
|
|
3
3
|
specification_version: 1
|
4
4
|
name: og
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2005-
|
6
|
+
version: 0.12.0
|
7
|
+
date: 2005-03-07
|
8
8
|
summary: Og (ObjectGraph)
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -29,8 +29,8 @@ authors:
|
|
29
29
|
files:
|
30
30
|
- README.og
|
31
31
|
- RELEASES.og
|
32
|
-
- LICENSE
|
33
|
-
- AUTHORS
|
32
|
+
- doc/LICENSE
|
33
|
+
- doc/AUTHORS
|
34
34
|
- Rakefile
|
35
35
|
- ChangeLog
|
36
36
|
- install.rb
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- lib/og/adapters
|
60
60
|
- lib/og/enchant.rb
|
61
61
|
- lib/og/connection.rb
|
62
|
+
- lib/og/observer.rb
|
62
63
|
- lib/og/database.rb
|
63
64
|
- lib/og/mock.rb
|
64
65
|
- lib/og/meta.rb
|
@@ -72,8 +73,10 @@ files:
|
|
72
73
|
- lib/og.rb
|
73
74
|
- test/tc_og.rb
|
74
75
|
- test/og/tc_sqlite.rb
|
76
|
+
- test/og/tc_observer.rb
|
75
77
|
- test/og/tc_filesys.rb
|
76
78
|
- test/og/tc_meta.rb
|
79
|
+
- test/og/tc_many_to_many.rb
|
77
80
|
- test/og/tc_lifecycle.rb
|
78
81
|
- vendor/extensions/enumerable.rb
|
79
82
|
- vendor/extensions/all.rb
|
@@ -103,8 +106,8 @@ rdoc_options:
|
|
103
106
|
extra_rdoc_files:
|
104
107
|
- README.og
|
105
108
|
- RELEASES.og
|
106
|
-
- LICENSE
|
107
|
-
- AUTHORS
|
109
|
+
- doc/LICENSE
|
110
|
+
- doc/AUTHORS
|
108
111
|
executables: []
|
109
112
|
extensions: []
|
110
113
|
requirements: []
|