og 0.30.0 → 0.31.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@
2
2
 
3
3
  TITLE : &title Og
4
4
  NAME : &pkg og
5
- VERSION : '0.30.0'
5
+ VERSION : '0.31.0'
6
6
  STATUS : beta
7
7
 
8
8
  AUTHOR : George Moschovitis
@@ -21,7 +21,7 @@ RUBYFORGE:
21
21
  USERNAME: 'gmosx'
22
22
 
23
23
  DEPENDENCIES:
24
- - [ glue, '= 0.30.0' ]
24
+ - [ glue, '= 0.31.0' ]
25
25
 
26
26
  PACKAGE: !!package
27
27
  distribute: [ gem, tgz, zip ]
@@ -1,3 +1,13 @@
1
+ == Version 0.31.0
2
+
3
+ * Increased size of ogtype field in STI tables to 50 from 30.
4
+
5
+ * Made Og (Mysql) respect the port option when creating and dropping databases.
6
+
7
+ * Added thread_safe to Og.setup options.
8
+
9
+ * Added #to_xml method to Og managed objects.
10
+
1
11
  == Version 0.30.0
2
12
 
3
13
  Another pragmatic release. The Nitro development team worked over
@@ -1,4 +1,4 @@
1
- require 'facet/classinherit'
1
+ require 'facets/core/module/class_extension'
2
2
 
3
3
  module Glue
4
4
 
@@ -15,7 +15,7 @@ module Glue
15
15
 
16
16
  module Cacheable
17
17
 
18
- ClassInherit do
18
+ class_extension do
19
19
 
20
20
  def after_enchant(base)
21
21
  base.module_eval do
@@ -2,6 +2,11 @@ require 'facet/inflect'
2
2
 
3
3
  # The default Tag implementation. A tag attaches semantics to
4
4
  # a given object.
5
+ #
6
+ # === Design
7
+ #
8
+ # Use camelcase names for tags.
9
+ #
5
10
  #--
6
11
  # FIXME: use index and char() instead of String.
7
12
  #++
@@ -55,10 +60,8 @@ class Tag
55
60
  @count -= 1
56
61
 
57
62
  if @count > 0
58
- p "-- dec ref count"
59
63
  update_property :count
60
64
  else
61
- p "-- count = 0 -> delete"
62
65
  self.delete()
63
66
  end
64
67
  end
@@ -170,24 +173,7 @@ module Taggable
170
173
  # INTERSECTION (AND)
171
174
 
172
175
  def find_with_tags(*names)
173
- relation = relations.reject{|r| r.name != :tags}.first
174
- info = ogmanager.store.join_table_info(relation)
175
- count = names.size
176
- names = names.map { |n| ogmanager.store.quote(n) }.join(',')
177
- sql = %{
178
- SELECT *
179
- FROM #{info[:owner_table]} AS o
180
- WHERE o.oid IN (
181
- SELECT j.#{info[:owner_key]}
182
- FROM #{info[:target_table]} AS t
183
- JOIN #{info[:table]} AS j
184
- ON t.oid = j.#{info[:target_key]}
185
- WHERE (t.name IN (#{names}))
186
- GROUP BY j.#{info[:owner_key]}
187
- HAVING COUNT(j.#{info[:owner_key]}) = #{count}
188
- )
189
- }
190
- return self.select(sql)
176
+ return find_request(:all, names)
191
177
  end
192
178
  alias_method :find_with_tag, :find_with_tags
193
179
 
@@ -195,9 +181,29 @@ module Taggable
195
181
  # UNION (OR)
196
182
 
197
183
  def find_with_any_tag(*names)
198
- relation = relations.reject{|r| r.name != :tags}.first
184
+ return find_request(:any, names)
185
+ end
186
+
187
+ private
188
+
189
+ def find_request(request_type, names)
190
+ condition = ""
191
+ opt = names.last
192
+ if opt.is_a?(Hash)
193
+ names.pop
194
+ escaped_condition = ogmanager.store.prepare_statement(opt[:condition])
195
+ #escaped_condition = ogmanager.store.escape_condition(opt[:condition])
196
+ condition = "AND #{escaped_condition}"
197
+ end
198
+
199
+ relation = relations.detect {|r| r.name == :tags}
199
200
  info = ogmanager.store.join_table_info(relation)
200
- count = names.size
201
+
202
+ if request_type == :all
203
+ count = names.size
204
+ additionnal_code = "HAVING COUNT(j.#{info[:owner_key]}) = #{count}"
205
+ end
206
+
201
207
  names = names.map { |n| ogmanager.store.quote(n) }.join(',')
202
208
  sql = %{
203
209
  SELECT *
@@ -209,6 +215,7 @@ module Taggable
209
215
  ON t.oid = j.#{info[:target_key]}
210
216
  WHERE (t.name IN (#{names}))
211
217
  GROUP BY j.#{info[:owner_key]}
218
+ #{additionnal_code}
212
219
  )
213
220
  }
214
221
  return self.select(sql)
@@ -2,8 +2,6 @@
2
2
 
3
3
  raise 'This is not working yet, do not require this file.'
4
4
 
5
- require 'glue/attribute'
6
-
7
5
  # A useful encapsulation of the nested intervals pattern for
8
6
  # hierarchical SQL queries. Slightly adapted from the original
9
7
  # article (http://www.dbazine.com/tropashko4.shtml)
data/lib/og.rb CHANGED
@@ -43,7 +43,7 @@ module Og
43
43
 
44
44
  # The version.
45
45
 
46
- Version = '0.30.0'
46
+ Version = '0.31.0'
47
47
 
48
48
  # Library path.
49
49
 
@@ -107,35 +107,35 @@ module Og
107
107
 
108
108
  setting :unmanageable_classes, :default => [], :doc => 'Explicitly unmanageable classes'
109
109
 
110
- # The active manager
110
+ # Pseudo type for binary data
111
111
 
112
- mattr_accessor :manager
112
+ class Blob; end
113
113
 
114
- # thread safe state
114
+ class << self
115
115
 
116
- mattr_reader :thread_safe
116
+ # The active manager
117
117
 
118
- # Pseudo type for binary data
118
+ attr_accessor :manager
119
119
 
120
- class Blob; end
120
+ # thread safe state
121
121
 
122
- class << self
122
+ attr_reader :thread_safe
123
123
 
124
124
  # Helper method, useful to initialize Og.
125
125
  # If no options are passed, sqlite is selected
126
126
  # as the default store.
127
127
 
128
- def setup(options = {:store => :sqlite})
129
- begin
128
+ def setup(options = {})
129
+ options={:store => :sqlite}.update(options)
130
130
  # This is a flag a store or manager can use to determine
131
131
  # if it was being called by Og.setup to provide
132
132
  # additional, faster or enhanced functionality.
133
133
 
134
134
  options[:called_by_og_setup] = true if options[:called_by_og_setup].nil?
135
135
 
136
- @@thread_safe = true
136
+ @thread_safe = options.fetch(:thread_safe, true)
137
137
 
138
- m = @@manager = Manager.new(options)
138
+ m = @manager = Manager.new(options)
139
139
  m.manage_classes
140
140
 
141
141
  # Allows functionality that requires a store is
@@ -145,15 +145,6 @@ module Og
145
145
  # only used by the PostgreSQL store.
146
146
 
147
147
  m.post_setup if options[:called_by_og_setup]
148
- rescue Exception => ex
149
- Logger.error "Og.setup had problems: #{ex.class} => #{ex.message}"
150
- if $DBG
151
- Logger.error ex.inspect
152
- Logger.error ex.backtrace.join("\n")
153
- exit
154
- end
155
- end
156
-
157
148
  return m
158
149
  end
159
150
  alias_method :connect, :setup
@@ -164,21 +155,21 @@ module Og
164
155
  # Helper method.
165
156
 
166
157
  def escape(str)
167
- @@manager.store.escape(str)
158
+ @manager.store.escape(str)
168
159
  end
169
160
 
170
161
  # Quote the string.
171
162
 
172
163
  def quote(str)
173
- @@manager.store.quote(str)
164
+ @manager.store.quote(str)
174
165
  end
175
166
 
176
167
  # Change thread_safe mode.
177
168
 
178
169
  def thread_safe=(bool)
179
- @@thread_safe = bool
180
- # @@manager and @@manager.class.managers.each { |m| m.initialize_store }
181
- @@thread_safe
170
+ @thread_safe = bool
171
+ # @manager and @manager.class.managers.each { |m| m.initialize_store }
172
+ @thread_safe
182
173
  end
183
174
  end
184
175
 
@@ -1,4 +1,4 @@
1
- require 'facet/classinherit'
1
+ require 'facets/core/module/class_extension'
2
2
  require 'facet/kernel/assign_with'
3
3
 
4
4
  require 'glue/property'
@@ -6,6 +6,8 @@ require 'og/relation'
6
6
  require 'og/ez/clause'
7
7
  require 'og/ez/condition'
8
8
 
9
+ require 'rexml/document' # for to_xml
10
+
9
11
  module Og
10
12
 
11
13
  # Include this module to classes to make them managable by Og.
@@ -114,10 +116,32 @@ module EntityMixin
114
116
  def og_clone(*args)
115
117
  Og::Entity.clone(self,*args)
116
118
  end
119
+
120
+ # convert Og object to REXML-Object
121
+ # example usage:
122
+ # User[1].to_rexml
123
+
124
+ def to_rexml
125
+ xml = REXML::Element.new(self.class.to_s.downcase)
126
+ xml.add_attribute("oid", self.oid.to_s)
127
+ self.class.properties.keys.each do |key|
128
+ xml << REXML::Element.new(key.to_s).add_text(self.send(key).to_s) unless key == :oid
129
+ end
130
+ return xml
131
+ end
132
+ alias_method :to_xml_dom, :to_rexml
133
+
134
+ # convert Og object to an XML-String
135
+ # example usage:
136
+ # User[1].to_xml
137
+
138
+ def to_xml
139
+ self.to_rexml.to_s
140
+ end
117
141
 
118
142
  include RelationDSL
119
143
 
120
- class_inherit do
144
+ class_extension do
121
145
 
122
146
  def create(*args)
123
147
  obj = self.new(*args)
@@ -649,7 +673,7 @@ class Entity
649
673
 
650
674
  def entity_from_string(str)
651
675
  res = nil
652
- Og.manager.managed_classes.each do |klass|
676
+ Og::Manager.managed_classes.each do |klass|
653
677
  if klass.name == str
654
678
  res = klass
655
679
  break
@@ -763,3 +787,4 @@ end
763
787
  # * George Moschovitis <gm@navel.gr>
764
788
  # * Tom Sawyer <transfire@gmail.com>
765
789
  # * Rob Pitt <rob@motionpath.com>
790
+ # * Fabian Buch <fabian@fabian-buch.de>
@@ -44,7 +44,7 @@ module Caboose
44
44
  @negate = args[2]
45
45
  end
46
46
  # append ! to negate the statement
47
- if @name[-1] == '!'
47
+ if @name[-1,1] == '!'
48
48
  @negate = true
49
49
  @name = @name.slice(0, @name.length - 1)
50
50
  end
@@ -123,7 +123,7 @@ class Relation
123
123
  def symbol_to_class(sym, owner_class)
124
124
  c = owner_class.name.dup
125
125
  c = "::" + c unless c =~ /::/
126
- c.gsub!(/::.*$/, '::')
126
+ c.gsub!(/::[^:]*$/, '::')
127
127
  c << sym.to_s
128
128
  begin
129
129
  return constant(c)
@@ -184,6 +184,7 @@ class Relation
184
184
  if r.polymorphic?
185
185
 
186
186
  target_dm = r.target_class.to_s.demodulize
187
+
187
188
  r.owner_class.module_eval %{
188
189
  class #{r.owner_class}::#{target_dm} < #{r.target_class}
189
190
  end
@@ -260,7 +261,7 @@ module RelationDSL
260
261
 
261
262
  inheritor(:relations, [], :+) #unless @relations
262
263
 
263
- class_inherit do
264
+ class_extension do
264
265
 
265
266
  # === Examples
266
267
  #
@@ -88,19 +88,25 @@ class MysqlStore < SqlStore
88
88
  extend MysqlUtils
89
89
  include MysqlUtils
90
90
 
91
+ DefaultPort = 3306
92
+
91
93
  def self.create(options)
94
+ options[:port] ||= DefaultPort
92
95
  # gmosx: system is used to avoid shell expansion.
93
- system 'mysqladmin', '-f', "--user=#{options[:user]}",
94
- "--password=#{options[:password]}",
96
+ system 'mysqladmin', '-f', "--user=#{options[:user]}",
97
+ "--password=#{options[:password]}",
95
98
  "--host=#{options[:address]}",
96
- 'create', options[:name]
99
+ "--port=#{options[:port]}",
100
+ 'create', options[:name]
97
101
  super
98
102
  end
99
103
 
100
104
  def self.destroy(options)
105
+ options[:port] ||= DefaultPort
101
106
  system 'mysqladmin', '-f', "--user=#{options[:user]}",
102
- "--password=#{options[:password]}", 'drop',
107
+ "--password=#{options[:password]}", 'drop',
103
108
  "--host=#{options[:address]}",
109
+ "--port=#{options[:port]}",
104
110
  options[:name]
105
111
  super
106
112
  end
@@ -200,6 +206,38 @@ class MysqlStore < SqlStore
200
206
  @conn.affected_rows
201
207
  end
202
208
 
209
+ # Deserialize one object from the ResultSet.
210
+
211
+ def read_one(res, klass, options = nil)
212
+ return nil if res.blank?
213
+
214
+ if options and join_relations = options[:include]
215
+ join_relations = [join_relations].flatten.collect do |n|
216
+ klass.relation(n)
217
+ end
218
+ end
219
+
220
+ res_row = res.next
221
+
222
+ # causes STI classes to come back as the correct child class
223
+ # if accessed from the superclass.
224
+
225
+ klass = Og::Entity::entity_from_string(res_row[0]) if klass.schema_inheritance?
226
+ obj = klass.og_allocate(res_row, 0)
227
+
228
+ if options and options[:select]
229
+ read_row(obj, res, res_row, 0)
230
+ else
231
+ obj.og_read(res_row)
232
+ read_join_relations(obj, res_row, 0, join_relations) if join_relations
233
+ end
234
+
235
+ return obj
236
+
237
+ ensure
238
+ res.close
239
+ end
240
+
203
241
  private
204
242
 
205
243
  def create_table(klass)
@@ -593,6 +593,38 @@ class PsqlStore < SqlStore
593
593
  def post_setup
594
594
  create_constraints
595
595
  end
596
+
597
+ # Deserialize one object from the ResultSet.
598
+
599
+ def read_one(res, klass, options = nil)
600
+ return nil if res.blank?
601
+
602
+ if options and join_relations = options[:include]
603
+ join_relations = [join_relations].flatten.collect do |n|
604
+ klass.relation(n)
605
+ end
606
+ end
607
+
608
+ res_row = res.next
609
+
610
+ # causes STI classes to come back as the correct child class
611
+ # if accessed from the superclass.
612
+
613
+ klass = Og::Entity::entity_from_string(res_row.result.flatten[res_row.fieldnum('ogtype')]) if klass.schema_inheritance?
614
+ obj = klass.og_allocate(res_row, 0)
615
+
616
+ if options and options[:select]
617
+ read_row(obj, res, res_row, 0)
618
+ else
619
+ obj.og_read(res_row)
620
+ read_join_relations(obj, res_row, 0, join_relations) if join_relations
621
+ end
622
+
623
+ return obj
624
+
625
+ ensure
626
+ res.close
627
+ end
596
628
 
597
629
  private
598
630
 
@@ -5,6 +5,7 @@ require 'facet/kernel/constant'
5
5
  require 'facet/string/capitalized'
6
6
  require 'facet/ormsupport'
7
7
 
8
+
8
9
  module Og
9
10
 
10
11
  # A collection of useful SQL utilities.
@@ -536,7 +537,8 @@ class SqlStore < Store
536
537
  values = []
537
538
  res = query(sql)
538
539
  res.each_row do |row, idx|
539
- values << type_cast(return_type, row[0])
540
+ value = [ row[idx] ].flatten[0]
541
+ values << type_cast(return_type, value)
540
542
  end
541
543
  return values
542
544
  else
@@ -628,6 +630,20 @@ class SqlStore < Store
628
630
  # return affected rows.
629
631
  end
630
632
 
633
+ #takes an array, the first parameter of which is a prepared statement
634
+ #style string; this handles parameter escaping.
635
+ def prepare_statement(condition)
636
+ if condition.is_a?(Array)
637
+ args = condition.dup
638
+ str = args.shift
639
+ # ? handles a single type.
640
+ # ?* handles an array.
641
+ args.each { |arg| str.sub!(/\?\*/, quotea(arg)); str.sub!(/\?/, quote(arg)) }
642
+ condition = str
643
+ end
644
+ condition
645
+ end
646
+
631
647
  private
632
648
 
633
649
  # Create the sql table where objects of this class are
@@ -702,7 +718,7 @@ private
702
718
  # chain. So inject a special class ogtype field that
703
719
  # holds the class name.
704
720
 
705
- fields << "ogtype VARCHAR(30)"
721
+ fields << "ogtype VARCHAR(50)"
706
722
  end
707
723
 
708
724
  for p in properties.values
@@ -1033,9 +1049,7 @@ private
1033
1049
  # If an array is passed as a condition, use prepared
1034
1050
  # statement style escaping.
1035
1051
 
1036
- if condition.is_a?(Array)
1037
- condition = prepare_statement(condition)
1038
- end
1052
+ condition = prepare_statement(condition)
1039
1053
 
1040
1054
  sql << " WHERE #{condition}"
1041
1055
  end
@@ -1053,17 +1067,6 @@ private
1053
1067
  return sql
1054
1068
  end
1055
1069
 
1056
- #takes an array, the first parameter of which is a prepared statement
1057
- #style string; this handles parameter escaping.
1058
- def prepare_statement(condition)
1059
- args = condition.dup
1060
- str = args.shift
1061
- # ? handles a single type.
1062
- # ?* handles an array.
1063
- args.each { |arg| str.sub!(/\?\*/, quotea(arg)); str.sub!(/\?/, quote(arg)) }
1064
- condition = str
1065
- end
1066
-
1067
1070
  # Subclasses can override this if they need some other order.
1068
1071
  # This is needed because different backends require different
1069
1072
  # order of the keywords.
@@ -1109,38 +1112,6 @@ private
1109
1112
  end
1110
1113
  end
1111
1114
 
1112
- # Deserialize one object from the ResultSet.
1113
-
1114
- def read_one(res, klass, options = nil)
1115
- return nil if res.blank?
1116
-
1117
- if options and join_relations = options[:include]
1118
- join_relations = [join_relations].flatten.collect do |n|
1119
- klass.relation(n)
1120
- end
1121
- end
1122
-
1123
- res_row = res.next
1124
-
1125
- # causes STI classes to come back as the correct child class
1126
- # if accessed from the superclass.
1127
-
1128
- klass = Og::Entity::entity_from_string(res_row.result.flatten[res_row.fieldnum('ogtype')]) if klass.schema_inheritance?
1129
- obj = klass.og_allocate(res_row, 0)
1130
-
1131
- if options and options[:select]
1132
- read_row(obj, res, res_row, 0)
1133
- else
1134
- obj.og_read(res_row)
1135
- read_join_relations(obj, res_row, 0, join_relations) if join_relations
1136
- end
1137
-
1138
- return obj
1139
-
1140
- ensure
1141
- res.close
1142
- end
1143
-
1144
1115
  # Deserialize all objects from the ResultSet.
1145
1116
 
1146
1117
  def read_all(res, klass, options = nil)
@@ -131,6 +131,38 @@ class SqliteStore < SqlStore
131
131
  rows.map { |r| r[idx] }
132
132
  end
133
133
 
134
+ # Deserialize one object from the ResultSet.
135
+
136
+ def read_one(res, klass, options = nil)
137
+ return nil if res.blank?
138
+
139
+ if options and join_relations = options[:include]
140
+ join_relations = [join_relations].flatten.collect do |n|
141
+ klass.relation(n)
142
+ end
143
+ end
144
+
145
+ res_row = res.next
146
+
147
+ # causes STI classes to come back as the correct child class
148
+ # if accessed from the superclass.
149
+
150
+ klass = Og::Entity::entity_from_string(res_row[0]) if klass.schema_inheritance?
151
+ obj = klass.og_allocate(res_row, 0)
152
+
153
+ if options and options[:select]
154
+ read_row(obj, res, res_row, 0)
155
+ else
156
+ obj.og_read(res_row)
157
+ read_join_relations(obj, res_row, 0, join_relations) if join_relations
158
+ end
159
+
160
+ return obj
161
+
162
+ ensure
163
+ res.close
164
+ end
165
+
134
166
  private
135
167
 
136
168
  def property_to_field(klass, p)
@@ -10,8 +10,8 @@ module Validation
10
10
  # Encapsulates a list of validation errors.
11
11
 
12
12
  class Errors
13
- cattr_accessor :not_unique, 'The value is already used'
14
- cattr_accessor :invalid_relation, 'Invalid relations'
13
+ setting :invalid_relation, :default => 'Invalid relations'
14
+ setting :not_unique, :default => 'The value is already used'
15
15
  end
16
16
 
17
17
  module ClassMethods
@@ -80,7 +80,7 @@ require 'glue'
80
80
  require 'glue/logger'
81
81
  require 'og'
82
82
 
83
- Logger.set(Logger.new(StringIO.new)) unless $DBG
83
+ Logger.get.level = Logger::WARN unless $DBG
84
84
 
85
85
  $og1 ||= Og.setup(@og_config1)
86
86
  $og2 ||= Og.setup(@og_config2)
@@ -60,3 +60,40 @@ class TC_EZ_STI < Test::Unit::TestCase # :nodoc: all
60
60
  assert(results.empty?)
61
61
  end
62
62
  end
63
+
64
+ class TC_EZ_TrueClass < Test::Unit::TestCase # :nodoc: all
65
+ class Animal
66
+ property :mammal, TrueClass
67
+ end
68
+
69
+ $og1.manage_classes(Animal)
70
+
71
+ def test_for_null
72
+ 2.times do
73
+ animal = Animal.new
74
+ animal.mammal = true
75
+ animal.save
76
+
77
+ animal = Animal.new
78
+ animal.mammal = false
79
+ animal.save
80
+ end
81
+
82
+ rubyish = ezish = nil
83
+
84
+ assert_nothing_raised do
85
+ rubyish = {
86
+ :true => Animal.all.select{|a| a.mammal}.map{|a| a.oid},
87
+ :false => Animal.all.reject{|a| a.mammal}.map{|a| a.oid}
88
+ }
89
+
90
+ ezish = {
91
+ :true => Animal.find{|animal| animal.mammal! == :null }.map{|a| a.oid},
92
+ :false => Animal.find{|animal| animal.mammal == :null }.map{|a| a.oid}
93
+ }
94
+ end
95
+
96
+ assert_equal rubyish[:true], ezish[:true]
97
+ assert_equal rubyish[:false], ezish[:false]
98
+ end
99
+ end
@@ -9,11 +9,12 @@ require 'og/validation'
9
9
 
10
10
  class TC_MultiValidation < Test::Unit::TestCase # :nodoc: all
11
11
 
12
- def test_all
13
- file = File.join(File.dirname(__FILE__), 'multi_validations_model.rb')
14
- load file
12
+ MultiValidationsModel = File.expand_path(File.join(File.dirname(__FILE__), 'multi_validations_model.rb'))
13
+
14
+ def test_all
15
+ load MultiValidationsModel
15
16
  assert_equal 2, TC_MultiValidation::User.validations.size
16
- load file
17
+ load MultiValidationsModel
17
18
  assert_equal 2, TC_MultiValidation::User.validations.size
18
19
  end
19
20
 
@@ -0,0 +1,48 @@
1
+ require File.join(File.dirname(__FILE__), '..','..','..','glycerin' )
2
+ require 'test/unit'
3
+ require 'og'
4
+
5
+ class TCOg_setup < Test::Unit::TestCase # :nodoc: all
6
+ MockManager=Struct.new :options, :manage_classes, :post_setup
7
+
8
+ def test_default
9
+ manager= Og.setup
10
+ assert_instance_of Og::Manager, manager
11
+ assert_equal :sqlite, manager.options[:store]
12
+ assert_equal 'data', manager.options[:name]
13
+ assert_equal true, manager.options[:called_by_og_setup]
14
+ end
15
+
16
+ def test_mattrs_initialized
17
+ manager= Og.setup
18
+ assert_equal manager,Og.manager
19
+ assert Og.thread_safe
20
+ end
21
+
22
+ def test_missing_store
23
+ assert_raises(LoadError){Og.setup(:store=>:missing)}
24
+ end
25
+
26
+ def test_setup_default_store_plus_options
27
+ manager=Og.setup(:evolve_schema=>true)
28
+ assert_instance_of Og::Manager, manager
29
+ assert_equal :sqlite, manager.options[:store]
30
+ assert_equal true, manager.options[:evolve_schema]
31
+ end
32
+
33
+ def test_calls_manager_methods
34
+ mock_manager=Struct.new :options, :called do
35
+ def manage_classes
36
+ self.called = [:mc]
37
+ end
38
+ def post_setup
39
+ self.called << :ps
40
+ end
41
+ end
42
+ old=Og::Manager
43
+ Og.const_set :Manager, mock_manager
44
+ manager=Og.setup
45
+ assert_equal [:mc, :ps],manager.called
46
+ Og.const_set :Manager, old
47
+ end
48
+ end
@@ -0,0 +1,35 @@
1
+ require File.join(File.dirname(__FILE__), 'CONFIG.rb')
2
+
3
+ require 'test/unit'
4
+
5
+ require 'rubygems'
6
+ require 'og'
7
+
8
+ class TC_SchemaInheritFindByName < Test::Unit::TestCase
9
+ class Foo
10
+ property :name
11
+
12
+ schema_inheritance
13
+ end
14
+
15
+ class FooBar < Foo; end
16
+ class BarFoo < Foo; end
17
+
18
+ $og1.manage_classes(Foo, FooBar, BarFoo)
19
+
20
+ def test_find_by_name
21
+ name = 'tt'
22
+
23
+ f= Foo.create
24
+ f.name= name
25
+ f.save
26
+
27
+ f1= nil
28
+
29
+ assert_nothing_raised do
30
+ f1 = Foo.find_by_name(name)
31
+ end
32
+
33
+ assert_equal(f, f1)
34
+ end
35
+ end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
2
+ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: og
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.30.0
7
- date: 2006-05-05 00:00:00 +03:00
6
+ version: 0.31.0
7
+ date: 2006-07-20 00:00:00 -07:00
8
8
  summary: State of the art object-relational mapping system.
9
9
  require_paths:
10
10
  - lib
11
11
  email: gm@navel.gr
12
12
  homepage: http://www.nitroproject.org
13
- rubyforge_project: nitro
13
+ rubyforge_project:
14
14
  description:
15
15
  autorequire:
16
16
  default_executable:
@@ -22,119 +22,123 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
22
22
  - !ruby/object:Gem::Version
23
23
  version: 0.0.0
24
24
  version:
25
- platform:
25
+ platform: ruby
26
26
  signing_key:
27
27
  cert_chain:
28
+ post_install_message:
28
29
  authors:
29
30
  - George Moschovitis
30
31
  files:
31
- - ProjectInfo
32
- - INSTALL
33
- - README
34
32
  - doc
35
- - examples
36
33
  - lib
37
34
  - test
38
- - setup.rb
39
- - doc/CHANGELOG.1
40
- - doc/AUTHORS
41
- - doc/tutorial.txt
42
- - doc/LICENSE
43
- - doc/RELEASES
44
- - doc/config.txt
45
- - examples/README
46
- - examples/run.rb
47
- - examples/mysql_to_psql.rb
35
+ - .
36
+ - examples
48
37
  - lib/og
49
38
  - lib/glue
50
- - lib/og.rb
51
39
  - lib/og/ez
52
- - lib/og/collection.rb
53
- - lib/og/entity.rb
54
- - lib/og/errors.rb
55
- - lib/og/evolution.rb
56
- - lib/og/manager.rb
40
+ - lib/og/test
57
41
  - lib/og/relation
58
42
  - lib/og/store
59
- - lib/og/relation.rb
60
- - lib/og/test
61
- - lib/og/store.rb
62
43
  - lib/og/vendor
63
- - lib/og/test.rb
64
- - lib/og/types.rb
65
- - lib/og/markers.rb
66
- - lib/og/validation.rb
67
- - lib/og/ez/condition.rb
68
- - lib/og/ez/clause.rb
69
- - lib/og/relation/all.rb
70
- - lib/og/relation/many_to_many.rb
71
- - lib/og/relation/belongs_to.rb
72
- - lib/og/relation/has_many.rb
73
- - lib/og/relation/has_one.rb
74
- - lib/og/relation/joins_many.rb
75
- - lib/og/relation/refers_to.rb
76
44
  - lib/og/store/alpha
77
- - lib/og/store/kirby.rb
78
- - lib/og/store/mysql.rb
79
- - lib/og/store/psql.rb
80
- - lib/og/store/sql.rb
81
- - lib/og/store/sqlite.rb
82
- - lib/og/store/sqlite2.rb
83
- - lib/og/store/alpha/sqlserver.rb
84
- - lib/og/store/alpha/filesys.rb
85
- - lib/og/store/alpha/memory.rb
86
- - lib/og/test/assertions.rb
87
- - lib/og/test/testcase.rb
88
- - lib/og/vendor/mysql.rb
89
- - lib/og/vendor/README
90
- - lib/glue/hierarchical.rb
91
- - lib/glue/orderable.rb
92
- - lib/glue/optimistic_locking.rb
93
- - lib/glue/revisable.rb
94
- - lib/glue/taggable.rb
95
- - lib/glue/timestamped.rb
96
- - lib/glue/tree.rb
97
- - lib/glue/searchable.rb
98
- - lib/glue/cacheable.rb
99
45
  - test/og
100
46
  - test/glue
101
47
  - test/og/mixin
102
- - test/og/CONFIG.rb
103
48
  - test/og/store
104
- - test/og/tc_delete_all.rb
105
- - test/og/tc_inheritance.rb
106
- - test/og/tc_join.rb
107
49
  - test/og/tc_multiple.rb
108
- - test/og/tc_override.rb
109
- - test/og/tc_polymorphic.rb
110
- - test/og/tc_relation.rb
111
- - test/og/tc_reverse.rb
112
- - test/og/tc_select.rb
50
+ - test/og/mixin/tc_timestamped.rb
51
+ - test/og/tc_validation2.rb
113
52
  - test/og/tc_store.rb
114
53
  - test/og/tc_types.rb
115
- - test/og/tc_finder.rb
54
+ - doc/CHANGELOG.1
55
+ - lib/og/test/testcase.rb
56
+ - lib/og/markers.rb
57
+ - lib/og/relation/refers_to.rb
58
+ - test/og/store/tc_filesys.rb
59
+ - test/og/tc_inheritance.rb
60
+ - doc/RELEASES
61
+ - test/og/tc_cacheable.rb
62
+ - lib/og/store/alpha/sqlserver.rb
63
+ - INSTALL
64
+ - test/og/tc_relation.rb
65
+ - examples/README
66
+ - lib/og/relation/has_many.rb
67
+ - lib/glue/optimistic_locking.rb
116
68
  - test/og/tc_scoped.rb
117
- - test/og/tc_validation.rb
118
- - test/og/tc_accumulator.rb
119
- - test/og/tc_inheritance2.rb
120
- - test/og/tc_validation2.rb
69
+ - examples/run.rb
70
+ - test/og/multi_validations_model.rb
71
+ - lib/og/ez/condition.rb
72
+ - lib/og/store/psql.rb
73
+ - lib/og/relation.rb
74
+ - lib/og/validation.rb
121
75
  - test/og/tc_multi_validations.rb
122
- - test/og/tc_cacheable.rb
123
- - test/og/tc_validation_loop.rb
76
+ - lib/og/vendor/README
124
77
  - test/og/tc_resolve.rb
125
- - test/og/multi_validations_model.rb
126
- - test/og/tc_ez.rb
78
+ - doc/LICENSE
79
+ - test/og/tc_validation_loop.rb
80
+ - lib/og/collection.rb
81
+ - lib/og/store/sqlite2.rb
82
+ - test/og/tc_join.rb
83
+ - lib/glue/hierarchical.rb
84
+ - lib/og/store/mysql.rb
85
+ - lib/og/relation/joins_many.rb
86
+ - lib/og/store/kirby.rb
87
+ - test/og/tc_select.rb
88
+ - doc/config.txt
89
+ - lib/og/test.rb
90
+ - lib/og/evolution.rb
91
+ - lib/og/relation/all.rb
92
+ - lib/og/relation/has_one.rb
93
+ - lib/og/store/alpha/filesys.rb
94
+ - lib/og/relation/belongs_to.rb
95
+ - test/og/mixin/tc_hierarchical.rb
96
+ - test/og/tc_reverse.rb
97
+ - test/og/tc_finder.rb
98
+ - test/og/tc_delete_all.rb
99
+ - doc/tutorial.txt
100
+ - test/glue/tc_revisable.rb
101
+ - test/og/tc_setup.rb
102
+ - test/og/tc_override.rb
103
+ - doc/AUTHORS
104
+ - README
105
+ - lib/glue/taggable.rb
106
+ - test/og/store/tc_sti.rb
107
+ - lib/og/errors.rb
108
+ - test/og/tc_polymorphic.rb
109
+ - lib/glue/timestamped.rb
110
+ - lib/og/entity.rb
111
+ - setup.rb
112
+ - test/og/tc_inheritance2.rb
113
+ - ProjectInfo
114
+ - lib/glue/tree.rb
115
+ - lib/og/relation/many_to_many.rb
116
+ - lib/og/store/sql.rb
117
+ - lib/glue/cacheable.rb
118
+ - examples/mysql_to_psql.rb
119
+ - test/og/store/tc_kirby.rb
127
120
  - test/og/tc_aggregations_calculations.rb
121
+ - lib/og/vendor/mysql.rb
128
122
  - test/og/tc_camel_case_join.rb
129
- - test/og/mixin/tc_hierarchical.rb
130
- - test/og/mixin/tc_orderable.rb
131
- - test/og/mixin/tc_optimistic_locking.rb
123
+ - lib/og/store.rb
124
+ - lib/og/types.rb
132
125
  - test/og/mixin/tc_taggable.rb
133
- - test/og/mixin/tc_timestamped.rb
134
- - test/og/store/tc_filesys.rb
135
- - test/og/store/tc_kirby.rb
136
- - test/og/store/tc_sti.rb
137
- - test/glue/tc_revisable.rb
126
+ - test/og/mixin/tc_optimistic_locking.rb
127
+ - test/og/tc_sti_find.rb
128
+ - lib/og/manager.rb
129
+ - lib/og/test/assertions.rb
130
+ - lib/glue/orderable.rb
131
+ - test/og/CONFIG.rb
132
+ - lib/glue/revisable.rb
133
+ - test/og/mixin/tc_orderable.rb
134
+ - test/og/tc_accumulator.rb
135
+ - lib/og.rb
136
+ - lib/glue/searchable.rb
137
+ - test/og/tc_validation.rb
138
+ - test/og/tc_ez.rb
139
+ - lib/og/store/alpha/memory.rb
140
+ - lib/og/ez/clause.rb
141
+ - lib/og/store/sqlite.rb
138
142
  test_files: []
139
143
 
140
144
  rdoc_options: []
@@ -155,5 +159,5 @@ dependencies:
155
159
  requirements:
156
160
  - - "="
157
161
  - !ruby/object:Gem::Version
158
- version: 0.30.0
162
+ version: 0.31.0
159
163
  version: