og 0.16.0 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
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