og 0.11.0 → 0.12.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/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: []
|