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,165 +0,0 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # * Thomas Quas <tquas@yahoo.com>
3
- # (c) 2004-2005 Navel, all rights reserved.
4
- # $Id: mock.rb 1 2005-04-11 11:04:30Z gmosx $
5
-
6
- require 'flexmock'
7
-
8
- require 'og'
9
-
10
- module Og
11
-
12
- # A utility object to Mock a Database in test units.
13
- # Extends the standard FlexMock object.
14
- #--
15
- # TODO: Factor out common functionality with Database
16
- # to avoid code duplication.
17
-
18
- class MockDatabase < ::FlexMock
19
- include Og::Enchant
20
-
21
- # Managed class metadata
22
- #
23
- class ManagedClassMeta
24
- # The managed class.
25
- attr_accessor :klass
26
-
27
- # A mapping of the database fields to the object properties.
28
- attr_accessor :field_index
29
-
30
- def initialize(klass = nil)
31
- @klass = klass
32
- @field_index = {}
33
- end
34
- end
35
-
36
- # hash of configuration options.
37
-
38
- attr_accessor :config
39
-
40
- # Pool of connections to the backend.
41
-
42
- attr_accessor :connection_pool
43
-
44
- # Managed classes.
45
-
46
- attr_accessor :managed_classes
47
-
48
- # Initialize the database interface.
49
-
50
- def initialize
51
- # Initialize FlexMock
52
- super
53
-
54
- @managed_classes = SafeHash.new
55
-
56
- Logger.info "Using mock database."
57
-
58
- if Og.auto_manage_classes
59
- # automatically manage classes with properties and metadata.
60
- # gmosx: Any idea how to optimize this?
61
-
62
- classes_to_manage = []
63
- ObjectSpace.each_object(Class) do |c|
64
- if c.respond_to?(:__props) and c.__props
65
- classes_to_manage << c
66
- end
67
- end
68
- Logger.info "Og auto manages the following classes:"
69
- Logger.info "#{classes_to_manage.inspect}"
70
- manage_classes(*classes_to_manage)
71
- end
72
-
73
- # use the newly created database.
74
-
75
- Og.use(self)
76
- end
77
-
78
- # Shutdown the database interface.
79
-
80
- def shutdown
81
- end
82
- alias_method :close, :shutdown
83
-
84
- # Get a connection from the pool to access the database.
85
- # Stores the connection in a thread-local variable.
86
-
87
- def get_connection
88
- # nop
89
- end
90
- alias_method :connection, :get_connection
91
-
92
- # Restore an unused connection to the pool.
93
-
94
- def put_connection
95
- # nop
96
- end
97
-
98
- # Register a standard Ruby class as managed.
99
-
100
- def manage(klass)
101
- return if managed?(klass) or klass.ancestors.include?(Og::Unmanageable)
102
-
103
- @managed_classes[klass] = ManagedClassMeta.new(klass)
104
-
105
- # Add standard og methods to the class.
106
- convert(klass)
107
-
108
- # Add helper methods to the class.
109
- enchant(klass) if Og.enchant_managed_classes
110
- end
111
-
112
- # Helper method to set multiple managed classes.
113
-
114
- def manage_classes(*klasses)
115
- for klass in klasses
116
- manage(klass)
117
- end
118
- end
119
-
120
- # Stop managing a Ruby class
121
-
122
- def unmanage(klass)
123
- @managed_classes.delete(klass)
124
- end
125
-
126
- # Is this class managed?
127
-
128
- def managed?(klass)
129
- return @managed_classes.include?(klass)
130
- end
131
-
132
- # Add standard og functionality to the class
133
-
134
- def convert(klass)
135
- klass.class_eval %{
136
- DBTABLE = "#{Og::Backend.table(klass)}"
137
- DBSEQ = "#{Og::Backend.table(klass)}_oids_seq"
138
-
139
- def to_i()
140
- @oid
141
- end
142
- }
143
- end
144
-
145
- # Automatically wrap connection methods.
146
-
147
- def self.wrap_method(method, args)
148
- args = args.split(/,/)
149
- class_eval %{
150
- def #{method}(#{args.join(", ")})
151
- # nop
152
- end
153
- }
154
- end
155
-
156
- def self.create_db!(config)
157
- # nop
158
- end
159
-
160
- def self.drop_db!(config)
161
- # nop
162
- end
163
- end
164
-
165
- end
data/lib/og/typemacros.rb DELETED
@@ -1,24 +0,0 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # * Michael Neumann <mneumann@ntecs.de>
3
- # (c) 2004-2005 Navel, all rights reserved.
4
- # $Id: typemacros.rb 1 2005-04-11 11:04:30Z gmosx $
5
-
6
- module Og
7
-
8
- # Some useful type macros to help when defining managed
9
- # objects. You can easily code your own type macros.
10
- # Just return the array that should be passed
11
- #
12
- # === Example
13
- #
14
- # property :name, Og.VarChar(30)
15
-
16
- def VarChar(size)
17
- return String, :sql => "VARCHAR(#{size})"
18
- end
19
-
20
- NotNull = { :sql => 'NOT NULL' }.freeze
21
-
22
- Null = { :sql => 'NULL' }.freeze
23
-
24
- end
@@ -1,83 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
-
3
- require 'test/unit'
4
- require 'ostruct'
5
-
6
- require 'og'
7
- require 'og/adapters/filesys'
8
-
9
- class TC_OgFilesys < Test::Unit::TestCase # :nodoc: all
10
- include Og
11
-
12
- # Forward declaration.
13
-
14
- class Comment; end
15
-
16
- class Article
17
- prop_accessor :name, String
18
- prop_accessor :age, Fixnum
19
- has_many :comments, Comment
20
-
21
- def initialize (name = nil, age = nil)
22
- @name, @age = name, age
23
- end
24
- end
25
-
26
- class Comment
27
- prop_accessor :text, String
28
- belongs_to :article, Article
29
-
30
- def initialize(text = nil)
31
- @text = text
32
- end
33
- end
34
-
35
- def setup
36
- config = {
37
- :adapter => 'filesys',
38
- :database => 'fstest',
39
- }
40
-
41
- $DBG = true
42
-
43
- Og::Database.drop_db!(config)
44
- @og = Og::Database.new(config)
45
- end
46
-
47
- def teardown
48
- @og.shutdown
49
- end
50
-
51
- def test_all
52
- a = Article.new('gmosx', 30)
53
- a.save!
54
-
55
- a1 = Article[1]
56
-
57
- assert_equal 'gmosx', a1.name
58
- assert_equal 30, a1.age
59
- assert_equal 1, a1.oid
60
-
61
- Article.create('drak', 12)
62
- Article.create('ekarak', 34)
63
- Article.create('mario', 53)
64
- Article.create('elathan', 34)
65
- =begin
66
- articles = Article.all
67
-
68
- assert_equal 5, articles.size
69
- =end
70
- a3 = Article[3]
71
-
72
- assert_equal 'ekarak', a3.name
73
-
74
- c1 = Comment.new('a comment')
75
- c1.save!
76
- a3.add_comment(c1)
77
- =begin
78
- a5 = Article[3]
79
- assert_equal 1, a5.comments.size
80
- =end
81
- end
82
-
83
- end
@@ -1,86 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
-
3
- require 'test/unit'
4
- require 'ostruct'
5
-
6
- require 'og'
7
- require 'og/adapters/sqlite'
8
-
9
- if defined?(SQLite3)
10
-
11
- class TC_OgSqlite3 < Test::Unit::TestCase # :nodoc: all
12
-
13
- # Forward declaration.
14
-
15
- class Comment; end
16
-
17
- class Article
18
- prop_accessor :name, String
19
- prop_accessor :age, Fixnum
20
- has_many :comments, Comment
21
-
22
- def initialize (name = nil, age = nil)
23
- @name, @age = name, age
24
- end
25
- end
26
-
27
- class Comment
28
- prop_accessor :text, String
29
- belongs_to :article, Article
30
-
31
- def initialize(text = nil)
32
- @text = text
33
- end
34
- end
35
-
36
- def setup
37
- config = {
38
- :adapter => 'sqlite',
39
- :database => 'test',
40
- :connection_count => 2
41
- }
42
-
43
- $DBG = true
44
-
45
- Og::Database.drop_db!(config)
46
- @og = Og::Database.new(config)
47
- end
48
-
49
- def teardown
50
- @og.shutdown
51
- end
52
-
53
- def test_all
54
- a = Article.new('gmosx', 30)
55
- a.save!
56
-
57
- a1 = Article[1]
58
-
59
- assert_equal 'gmosx', a1.name
60
- assert_equal 30, a1.age
61
- assert_equal 1, a1.oid
62
-
63
- Article.create('drak', 12)
64
- Article.create('ekarak', 34)
65
- Article.create('mario', 53)
66
- Article.create('elathan', 34)
67
-
68
- articles = Article.all
69
-
70
- assert_equal 5, articles.size
71
-
72
- a3 = Article[3]
73
-
74
- assert_equal 'ekarak', a3.name
75
-
76
- c1 = Comment.new('a comment')
77
- c1.save!
78
- a3.add_comment(c1)
79
-
80
- a5 = Article[3]
81
- assert_equal 1, a5.comments.size
82
- end
83
-
84
- end
85
-
86
- end
@@ -1,96 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
-
3
- require 'test/unit'
4
- require 'ostruct'
5
-
6
- require 'og'
7
- require 'og/adapters/sqlserver'
8
-
9
- if defined?(DBI)
10
-
11
- class TC_OgSqlserver < Test::Unit::TestCase # :nodoc: all
12
-
13
- # Forward declaration.
14
-
15
- class Comment; end
16
-
17
- class Article
18
- prop_accessor :name, String
19
- prop_accessor :age, Fixnum
20
- has_many :comments, Comment
21
-
22
- def initialize (name = nil, age = nil)
23
- @name, @age = name, age
24
- end
25
- end
26
-
27
- class Comment
28
- prop_accessor :text, String
29
- belongs_to :article, Article
30
-
31
- def initialize(text = nil)
32
- @text = text
33
- end
34
- end
35
-
36
- def setup
37
- config = {
38
- :adapter => 'sqlserver',
39
- :address => 'localhost',
40
- :database => 'test',
41
- :user => 'sa',
42
- :password => 'sa',
43
- :connection_count => 2
44
- }
45
-
46
- $DBG = true
47
-
48
- # Og::Database.drop_db!(config)
49
- @og = Og::Database.new(config)
50
- end
51
-
52
- def teardown
53
- @og.shutdown
54
- end
55
-
56
- def test_all
57
-
58
- puts Article.all.size
59
- Article.each {|a| a.delete! }
60
- puts Article.all.size
61
-
62
- a = Article.new('gmosx', 30)
63
- a.save!
64
-
65
- baseoid = a.oid
66
-
67
- a1 = Article[baseoid]
68
-
69
- assert_equal 'gmosx', a1.name
70
- assert_equal 30, a1.age
71
- assert_equal baseoid, a1.oid
72
-
73
- Article.create('drak', 12)
74
- Article.create('ekarak', 34)
75
- Article.create('mario', 53)
76
- Article.create('elathan', 34)
77
-
78
- articles = Article.all
79
-
80
- assert_equal 5, articles.size
81
-
82
- a3 = Article['ekarak']
83
-
84
- assert_equal 'ekarak', a3.name
85
-
86
- c1 = Comment.new('a comment')
87
- c1.save!
88
- a3.add_comment(c1)
89
-
90
- a5 = Article['ekarak']
91
- assert_equal 1, a5.comments.size
92
- end
93
-
94
- end
95
-
96
- end