og 0.20.0 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/CHANGELOG +796 -664
  2. data/INSTALL +24 -24
  3. data/README +39 -32
  4. data/Rakefile +41 -42
  5. data/benchmark/bench.rb +36 -36
  6. data/doc/AUTHORS +15 -12
  7. data/doc/LICENSE +3 -3
  8. data/doc/RELEASES +311 -243
  9. data/doc/config.txt +1 -1
  10. data/examples/mysql_to_psql.rb +15 -15
  11. data/examples/run.rb +92 -92
  12. data/install.rb +7 -17
  13. data/lib/og.rb +76 -75
  14. data/lib/og/collection.rb +203 -160
  15. data/lib/og/entity.rb +168 -169
  16. data/lib/og/errors.rb +5 -5
  17. data/lib/og/manager.rb +179 -178
  18. data/lib/og/mixin/hierarchical.rb +107 -107
  19. data/lib/og/mixin/optimistic_locking.rb +36 -36
  20. data/lib/og/mixin/orderable.rb +148 -148
  21. data/lib/og/mixin/timestamped.rb +8 -8
  22. data/lib/og/mixin/tree.rb +124 -124
  23. data/lib/og/relation.rb +237 -213
  24. data/lib/og/relation/belongs_to.rb +5 -5
  25. data/lib/og/relation/has_many.rb +60 -58
  26. data/lib/og/relation/joins_many.rb +93 -47
  27. data/lib/og/relation/refers_to.rb +25 -21
  28. data/lib/og/store.rb +210 -207
  29. data/lib/og/store/filesys.rb +79 -79
  30. data/lib/og/store/kirby.rb +263 -258
  31. data/lib/og/store/memory.rb +261 -261
  32. data/lib/og/store/mysql.rb +288 -284
  33. data/lib/og/store/psql.rb +261 -244
  34. data/lib/og/store/sql.rb +873 -720
  35. data/lib/og/store/sqlite.rb +177 -175
  36. data/lib/og/store/sqlserver.rb +204 -214
  37. data/lib/og/types.rb +1 -1
  38. data/lib/og/validation.rb +57 -57
  39. data/lib/vendor/mysql.rb +376 -376
  40. data/lib/vendor/mysql411.rb +10 -10
  41. data/test/og/mixin/tc_hierarchical.rb +59 -59
  42. data/test/og/mixin/tc_optimistic_locking.rb +40 -40
  43. data/test/og/mixin/tc_orderable.rb +67 -67
  44. data/test/og/mixin/tc_timestamped.rb +19 -19
  45. data/test/og/store/tc_filesys.rb +46 -46
  46. data/test/og/tc_inheritance.rb +81 -81
  47. data/test/og/tc_join.rb +67 -0
  48. data/test/og/tc_polymorphic.rb +49 -49
  49. data/test/og/tc_relation.rb +57 -30
  50. data/test/og/tc_select.rb +49 -0
  51. data/test/og/tc_store.rb +345 -337
  52. data/test/og/tc_types.rb +11 -11
  53. metadata +11 -18
@@ -13,7 +13,7 @@ applications/sites on a single database.
13
13
 
14
14
  If true, use Ruby's advanced introspection capabilities to
15
15
  automatically manage classes that define properties.
16
-
16
+
17
17
  === Og.create_schema = true
18
18
 
19
19
  If set to true, Og attempts to recreate the database schema
@@ -12,19 +12,19 @@ require 'og'
12
12
  # Configure databases.
13
13
 
14
14
  psql_config = {
15
- :destroy => true,
16
- :name => 'test',
17
- :store => 'psql',
18
- :user => 'postgres',
19
- :password => 'navelrulez'
15
+ :destroy => true,
16
+ :name => 'test',
17
+ :store => 'psql',
18
+ :user => 'postgres',
19
+ :password => 'navelrulez'
20
20
  }
21
21
 
22
22
  mysql_config = {
23
- :destroy => true,
24
- :name => 'test',
25
- :store => 'mysql',
26
- :user => 'root',
27
- :password => 'navelrulez'
23
+ :destroy => true,
24
+ :name => 'test',
25
+ :store => 'mysql',
26
+ :user => 'root',
27
+ :password => 'navelrulez'
28
28
  }
29
29
 
30
30
  # Initialize Og.
@@ -36,11 +36,11 @@ mysql = Og.connect(mysql_config)
36
36
  # Looks like an ordinary Ruby object.
37
37
 
38
38
  class Article
39
- property :name, :body, String
39
+ property :name, :body, String
40
40
 
41
- def initialize(name = nil, body = nil)
42
- @name, @body = name, body
43
- end
41
+ def initialize(name = nil, body = nil)
42
+ @name, @body = name, body
43
+ end
44
44
  end
45
45
 
46
46
  # First populate the mysql database.
@@ -62,7 +62,7 @@ psql.manage(Article)
62
62
  # Store all articles.
63
63
 
64
64
  for article in articles
65
- article.insert
65
+ article.insert
66
66
  end
67
67
 
68
68
  # Fetch an article from PostgreSQL
@@ -9,137 +9,137 @@ $DBG = true
9
9
  # A child class.
10
10
 
11
11
  class Comment
12
- property :body, String
13
-
14
- def initialize(body = nil)
15
- @body = body
16
- end
17
-
18
- def to_s
19
- return @body
20
- end
12
+ property :body, String
13
+
14
+ def initialize(body = nil)
15
+ @body = body
16
+ end
17
+
18
+ def to_s
19
+ return @body
20
+ end
21
21
  end
22
22
 
23
23
  # = A Parent class.
24
24
 
25
25
  class User
26
- property :name, String, :unique => true
27
- has_many :comments, UserComment
28
-
29
- def initialize(name = nil)
30
- @name = name
31
- end
32
-
33
- def to_s
34
- return @name
35
- end
26
+ property :name, String, :unique => true
27
+ has_many :comments, UserComment
28
+
29
+ def initialize(name = nil)
30
+ @name = name
31
+ end
32
+
33
+ def to_s
34
+ return @name
35
+ end
36
36
  end
37
37
 
38
38
 
39
39
  # A parent class.
40
40
 
41
41
  class Article
42
- property :title, String
43
- property :body, String
44
-
45
- # override the default O->R mapping
46
-
47
- property :level, Fixnum, :sql => "smallint DEFAULT 1"
48
-
49
- # store a Ruby Hash in the Database. YAML
50
- # is used for serializing the attribute.
51
- # no need to define the class, but you can if you want.
52
-
53
- property :options
54
-
55
- # exactly like the standard Ruby attr creates only the reader.
56
-
57
- prop :create_time, Time
58
-
59
- # define comment relation:
60
-
61
- has_many :comments, ArticleComment
62
-
63
- has_many :parts, Part
64
-
65
- # many to many relation.
66
-
67
- many_to_many Category
68
-
69
- # define author relation:
70
-
71
- belongs_to :author, User
72
-
73
- # this attribute is NOT stored in the db.
74
-
75
- attr_accessor :other_options
76
-
77
- # Managed object constructors with no args, take *args
78
- # as parameter to allow for Mixin chaining.
79
-
80
- def initialize(title = nil, body = nil)
81
- @title, @body = title, body
82
- @create_time = Time.now
83
- @options = {}
84
- @other_options = {}
85
- end
86
-
87
- def to_s
88
- return "#@title: #@body"
89
- end
42
+ property :title, String
43
+ property :body, String
44
+
45
+ # override the default O->R mapping
46
+
47
+ property :level, Fixnum, :sql => "smallint DEFAULT 1"
48
+
49
+ # store a Ruby Hash in the Database. YAML
50
+ # is used for serializing the attribute.
51
+ # no need to define the class, but you can if you want.
52
+
53
+ property :options
54
+
55
+ # exactly like the standard Ruby attr creates only the reader.
56
+
57
+ prop :create_time, Time
58
+
59
+ # define comment relation:
60
+
61
+ has_many :comments, ArticleComment
62
+
63
+ has_many :parts, Part
64
+
65
+ # many to many relation.
66
+
67
+ many_to_many Category
68
+
69
+ # define author relation:
70
+
71
+ belongs_to :author, User
72
+
73
+ # this attribute is NOT stored in the db.
74
+
75
+ attr_accessor :other_options
76
+
77
+ # Managed object constructors with no args, take *args
78
+ # as parameter to allow for Mixin chaining.
79
+
80
+ def initialize(title = nil, body = nil)
81
+ @title, @body = title, body
82
+ @create_time = Time.now
83
+ @options = {}
84
+ @other_options = {}
85
+ end
86
+
87
+ def to_s
88
+ return "#@title: #@body"
89
+ end
90
90
  end
91
91
 
92
92
  # A parent class.
93
93
 
94
94
  class Category
95
- property :title, String
96
- property :body, String
95
+ property :title, String
96
+ property :body, String
97
97
 
98
- # define a 'many to many' relation.
98
+ # define a 'many to many' relation.
99
99
 
100
- many_to_many Article
101
-
102
- def initialize(title = nil)
103
- @title = title
104
- end
100
+ many_to_many Article
101
+
102
+ def initialize(title = nil)
103
+ @title = title
104
+ end
105
105
  end
106
106
 
107
107
 
108
108
  # Article comment.
109
109
 
110
110
  class ArticleComment < Comment
111
- belongs_to Article
111
+ belongs_to Article
112
112
  end
113
113
 
114
114
  # User comment.
115
115
 
116
116
  class UserComment < Comment
117
- belongs_to :author, User
117
+ belongs_to :author, User
118
118
  end
119
119
 
120
120
  # Another child class.
121
121
 
122
122
  class Part
123
- property :name, String
124
- belongs_to Article
125
-
126
- def initialize(name = nil)
127
- @name = name
128
- end
129
-
130
- def to_s
131
- return @name
132
- end
123
+ property :name, String
124
+ belongs_to Article
125
+
126
+ def initialize(name = nil)
127
+ @name = name
128
+ end
129
+
130
+ def to_s
131
+ return @name
132
+ end
133
133
  end
134
134
 
135
135
  # Og configuration.
136
136
 
137
137
  config = {
138
- :destroy => true, # destroy table created from earlier runs.
139
- :store => 'psql',
140
- :name => 'test',
141
- :user => "postgres",
142
- :password => "navelrulez"
138
+ :destroy => true, # destroy table created from earlier runs.
139
+ :store => 'psql',
140
+ :name => 'test',
141
+ :user => "postgres",
142
+ :password => "navelrulez"
143
143
  }
144
144
 
145
145
  # Initialize Og
data/install.rb CHANGED
@@ -1,28 +1,15 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # * George Moschovitis <gm@navel.gr>
4
- # (c) 2004-2005 Navel, all rights reserved.
5
- # $Id: install.rb 32 2005-04-25 12:31:21Z gmosx $
6
-
7
3
  require 'rbconfig'
8
4
  require 'ftools'
9
5
 
10
6
  dst_dir = Config::CONFIG['sitelibdir']
11
7
 
12
8
  Dir.chdir('lib') do
13
- Dir['**/*.rb'].each do |file|
14
- File.mkpath File.join(dst_dir, File.dirname(file)), true
15
- File.install file, File.join(dst_dir, file), 0644, true
16
- end
17
- end
18
-
19
- # gmosx: this is potentially dangerous, rethink.
20
-
21
- Dir.chdir('vendor') do
22
- Dir['**/*.rb'].each do |file|
23
- File.mkpath File.join(dst_dir, File.dirname(file)), true
24
- File.install file, File.join(dst_dir, file), 0644, true
25
- end
9
+ Dir['**/*.rb'].each do |file|
10
+ File.mkpath File.join(dst_dir, File.dirname(file)), true
11
+ File.install file, File.join(dst_dir, file), 0644, true
12
+ end
26
13
  end
27
14
 
28
15
  puts %{
@@ -45,3 +32,6 @@ at the command line.
45
32
 
46
33
  Enjoy the magic of Og!
47
34
  }
35
+
36
+ # * George Moschovitis <gm@navel.gr>
37
+
data/lib/og.rb CHANGED
@@ -27,19 +27,20 @@ require 'glue/configuration'
27
27
  #
28
28
  # The library provides the following features:
29
29
  #
30
- # + Object-Relational mapping.
30
+ # + Object-Relational mapping, automatically maps standard
31
+ # Ruby objects to sql schemas
31
32
  # + Absolutely no configuration files.
32
33
  # + Multiple stores (PostgreSQL, MySQL, SQLite, Oraclei, SqlServer, ..).
33
- # + Supports non SQL stores.
34
+ # + Supports non SQL stores (in-memory, filesystem, ..).
34
35
  # + ActiveRecord-style meta language and db aware methods.
35
36
  # + Deserialize to Ruby Objects.
36
37
  # + Deserialize sql join queries to Ruby Objects.
37
38
  # + Eager associations.
38
39
  # + Serialize arbitrary ruby object graphs through YAML.
39
40
  # + Connection pooling.
40
- # + Thread safety (temporarily dissabled).
41
+ # + Thread safety.
41
42
  # + SQL transactions.
42
- # + Aspect oriented constructs allow interception of lifecycle callbacks.
43
+ # + Aspect oriented constructs allow interception of lifecycle callbacks.
43
44
  # + Transparent support for cascading deletes for all backends.
44
45
  # + Hierarchical structures (nested sets)
45
46
  # + Works safely as part of distributed application.
@@ -51,10 +52,10 @@ require 'glue/configuration'
51
52
  # metadata types:
52
53
  #
53
54
  # [+:sql_index+]
54
- # Create an sql index for this property.
55
+ # Create an sql index for this property.
55
56
  #
56
57
  # [+:unique+]
57
- # This value of the property must be unique.
58
+ # This value of the property must be unique.
58
59
  #
59
60
  # === Design
60
61
  #
@@ -67,78 +68,78 @@ require 'glue/configuration'
67
68
  #
68
69
  # * og_read
69
70
  # * og_insert
70
- # * og_update
71
- # * og_delete
71
+ # * og_update
72
+ # * og_delete
72
73
 
73
74
  module Og
74
75
 
75
- # The version.
76
-
77
- Version = '0.20.0'
78
-
79
- # Library path.
80
-
81
- LibPath = File.dirname(__FILE__)
82
-
83
- # If true, check for implicit changes in the object
84
- # graph. For example when you add an object to a parent
85
- # the object might be removed from his previous parent.
86
- # In this case Og emmits a warning.
87
-
88
- setting :check_implicit_graph_changes, :default => false, :doc => 'If true, check for implicit changes in the object graph'
89
-
90
- # If true, only allow reading from the database. Usefull
91
- # for maintainance.
92
- # WARNING: not implemented yet.
93
-
94
- setting :read_only_mode, :default => false, :doc => 'If true, only allow reading from the database'
95
-
96
- # Prepend the following prefix to all generated SQL table names.
97
- # Usefull on hosting scenarios where you have to run multiple
98
- # web applications/sites on a single database.
99
- #
100
- # Don't set the table_prefix to nil, or you may face problems
101
- # with reserved words on some RDBM systems. For example User
102
- # maps to user which is reserved in postgresql). The prefix
103
- # should start with an alphanumeric character to be compatible
104
- # with all RDBM systems (most notable Oracle).
105
- #--
106
- # TODO: move this to the sql store.
107
- #++
108
-
109
- setting :table_prefix, :default => 'og', :doc => 'Prepend the prefix to all generated SQL table names'
110
-
111
- # If true, Og tries to create/update the schema in the
112
- # data store. For production/live environments set this to
113
- # false and only set to true when the object model is
114
- # upadated. For debug/development environments this should
115
- # stay true for convienience.
116
-
117
- setting :create_schema, :default => true, :doc => 'If true, Og tries to create/update the schema in the data store'
118
-
119
- # If true raises exceptions on store errors, usefull when
120
- # debugging. For production environments it should probably be
121
- # set to false to make the application more fault tolerant.
122
-
123
- setting :raise_store_exceptions, :default => true, :doc => 'If true raises exceptions on store errors'
124
-
125
- # Enable/dissable thread safe mode.
126
-
127
- setting :thread_safe, :default => true, :doc => 'Enable/dissable thread safe mode'
128
-
129
- # Marker module. If included in a class, the Og automanager
130
- # ignores this class.
131
-
132
- module Unmanageable; end
133
-
134
- # The active manager
135
-
136
- mattr_accessor :manager
137
-
138
- # Pseudo type for binary data
139
-
140
- class Blob; end
141
-
76
+ # The version.
77
+
78
+ Version = '0.21.0'
79
+
80
+ # Library path.
81
+
82
+ LibPath = File.dirname(__FILE__)
83
+
84
+ # If true, check for implicit changes in the object
85
+ # graph. For example when you add an object to a parent
86
+ # the object might be removed from his previous parent.
87
+ # In this case Og emmits a warning.
88
+
89
+ setting :check_implicit_graph_changes, :default => false, :doc => 'If true, check for implicit changes in the object graph'
90
+
91
+ # If true, only allow reading from the database. Usefull
92
+ # for maintainance.
93
+ # WARNING: not implemented yet.
94
+
95
+ setting :read_only_mode, :default => false, :doc => 'If true, only allow reading from the database'
96
+
97
+ # Prepend the following prefix to all generated SQL table names.
98
+ # Usefull on hosting scenarios where you have to run multiple
99
+ # web applications/sites on a single database.
100
+ #
101
+ # Don't set the table_prefix to nil, or you may face problems
102
+ # with reserved words on some RDBM systems. For example User
103
+ # maps to user which is reserved in postgresql). The prefix
104
+ # should start with an alphanumeric character to be compatible
105
+ # with all RDBM systems (most notable Oracle).
106
+ #--
107
+ # TODO: move this to the sql store.
108
+ #++
109
+
110
+ setting :table_prefix, :default => 'og', :doc => 'Prepend the prefix to all generated SQL table names'
111
+
112
+ # If true, Og tries to create/update the schema in the
113
+ # data store. For production/live environments set this to
114
+ # false and only set to true when the object model is
115
+ # upadated. For debug/development environments this should
116
+ # stay true for convienience.
117
+
118
+ setting :create_schema, :default => true, :doc => 'If true, Og tries to create/update the schema in the data store'
119
+
120
+ # If true raises exceptions on store errors, usefull when
121
+ # debugging. For production environments it should probably be
122
+ # set to false to make the application more fault tolerant.
123
+
124
+ setting :raise_store_exceptions, :default => true, :doc => 'If true raises exceptions on store errors'
125
+
126
+ # Enable/dissable thread safe mode.
127
+
128
+ setting :thread_safe, :default => true, :doc => 'Enable/dissable thread safe mode'
129
+
130
+ # Marker module. If included in a class, the Og automanager
131
+ # ignores this class.
132
+
133
+ module Unmanageable; end
134
+
135
+ # The active manager
136
+
137
+ mattr_accessor :manager
138
+
139
+ # Pseudo type for binary data
140
+
141
+ class Blob; end
142
+
142
143
  end
143
144
 
144
145
  # gmosx: leave this here.