dm-xml-adapter 0.59 → 0.571

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -1,2 +1 @@
1
1
  This is an XML adapter.
2
- Set DataMapper::Adapters::XmlAdapter.threads = 2 or more in jruby...
@@ -3,330 +3,326 @@ require 'dm-core'
3
3
  require 'builder'
4
4
  require 'dm-core/adapters/abstract_adapter'
5
5
  require 'pp'
6
-
7
6
  gem 'libxml-ruby', '>= 0.8.3'
8
7
  require 'xml'
9
8
  require 'tempfile'
10
- require 'logger'
11
- require 'lrucache'
9
+ require 'simple_memoize'
10
+ require 'log4r'
12
11
 
13
- # http://redcorundum.blogspot.com/2006/05/kernelqualifiedconstget.html
14
- module Kernel
15
- def qualified_const_get(str)
16
- path = str.to_s.split('::')
17
- from_root = path[0].empty?
18
- if from_root
19
- from_root = []
20
- path = path[1..-1]
21
- else
22
- start_ns = ((Class === self)||(Module === self)) ? self : self.class
23
- from_root = start_ns.to_s.split('::')
24
- end
25
- until from_root.empty?
26
- begin
27
- return (from_root+path).inject(Object) { |ns,name| ns.const_get(name) }
28
- rescue NameError
29
- from_root.delete_at(-1)
30
- end
31
- end
32
- path.inject(Object) { |ns,name| ns.const_get(name) }
33
- end
34
- end
35
12
 
36
- # the XML adapter is an adapter for DataMapper that allows you to store
37
- # data in XML files. beware, it's not transactionally safe.
38
13
  module DataMapper::Adapters
39
- class XmlAdapterCache
40
- def initialize
41
- @mtimes = LRUCache.new(:max => 20)
42
- @classes = LRUCache.new(:max => 20)
43
- end
44
-
45
- def set_mtime(file, mtime)
14
+
15
+ class XmlAdapterCache
16
+
17
+ def initialize
18
+ #@@logger = Log4r::Logger.new 'cache'
19
+ #@@logger.outputters = Log4r::Outputter.stdout
20
+ @mtimes = Hash.new()
21
+ @classes = Hash.new()
22
+ end
23
+
24
+ def set_mtime(file, mtime)
25
+ #@@logger.info("Saved mtime, #{file} -> #{mtime}")
46
26
  @mtimes[file] = mtime
47
- end
48
-
49
- def delete_mtime(file)
27
+ end
28
+
29
+ def delete_mtime(file)
30
+ #@@logger.info("deleting the following mtime: #{file}")
50
31
  @mtimes.delete(file)
51
- end
52
-
53
- def get_mtime(file)
54
- return @mtimes[file]
55
- end
56
-
57
- def put(classname, id, object)
32
+ end
33
+
34
+ def get_mtime(file)
35
+ return @mtimes[file]
36
+ end
37
+
38
+ def put(classname, id, object)
39
+ #@@logger.info("CACHE INSERT: #{classname} #{id} #{object.inspect}")
40
+
58
41
  # check to see if we have a classname entry
59
42
  if (@classes[classname] == nil)
60
43
  @classes[classname] = Hash.new
61
44
  end
62
-
45
+
63
46
  hash = @classes[classname]
64
47
  hash[id.to_s] = object
65
- end
66
-
67
- def delete(classname, id)
48
+ # @@logger.info("the hash is: #{hash.inspect}")
49
+ end
50
+
51
+ def delete(classname, id)
52
+ #@@logger.info("deleted the following from cache: #{classname} #{id.to_s}")
68
53
  hash = @classes[classname]
54
+ #@@logger.info("the hash is: #{hash.inspect}")
69
55
  unless hash == nil
70
56
  hash.delete(id.to_s)
71
57
  end
72
- end
73
-
74
- def get(classname, id)
58
+ #@@logger.info("the hash is: #{hash.inspect}")
59
+ end
60
+
61
+ def get(classname, id)
62
+ #@@logger.info("CACHE FETCH: #{classname} #{id}")
63
+ #@@logger.info("Master classes: #{@classes.inspect}")
75
64
  hash = @classes[classname]
76
- return hash[id]
77
- end
78
- end
65
+ #@@logger.info("the hash is: #{hash.inspect}")
66
+ object = hash[id]
67
+ #@@logger.info("The object is: #{object}")
68
+ return object
69
+ end
70
+ end
79
71
 
80
- class XmlAdapter < AbstractAdapter
81
-
82
- def loglevel=(loglevel)
83
- @options[:loglevel] = loglevel
84
- @logger.level = loglevel
85
- end
86
-
87
- def logger=(logger)
88
- @options[:logger] = logger
89
- @logger = logger
90
- end
72
+ class XmlAdapter < AbstractAdapter
91
73
 
92
74
  def initialize(name, options)
93
75
  super
94
76
 
95
- @options = options
96
- @options[:directory] ||= './db'
97
- @options[:loglevel] ||= Logger::FATAL
98
- @options[:logger] ||= Logger.new(STDERR)
99
- @logger = @options[:logger]
100
- @logger.level = @options[:loglevel]
101
- @logger.debug('DM-XML-Adapter Initialized!')
77
+ @options = Hash.new
78
+ @options[:directory] = options[:directory]
79
+ @options[:directory] ||= './db'
80
+
102
81
  @last_used_id = Hash.new
103
-
82
+
104
83
  @cache = XmlAdapterCache.new
84
+
85
+ #@@logger = Log4r::Logger.new 'adapter'
86
+ #@@logger.outputters = Log4r::Outputter.stdout
105
87
 
106
88
  end
107
-
108
- def destroy_model_storage(model)
109
- FileUtils.rm_rf(classname_to_dir(model.to_s))
110
- @logger.debug("Removing model storage for #{model}")
89
+
90
+ def destroy_model_storage(repository, model)
91
+ FileUtils.rm_rf(classname_to_dir(model.to_s))
111
92
  end
112
-
113
- def create_model_storage(model)
114
- FileUtils.mkdir_p(classname_to_dir(model.to_s))
115
- @logger.debug("Creating model storage for: #{model}")
93
+
94
+ def create_model_storage(repository, model)
95
+ FileUtils.mkdir_p(classname_to_dir(model.to_s))
116
96
  end
117
-
118
- def create(resources)
119
- key = resources.first.model.key.first.name
97
+
98
+ def create(resources)
120
99
  resources.each do |resource|
121
- id = find_free_id_for(resources.first.class.to_s)
100
+ model = resource.model
101
+ id = find_free_id_for(resource.class.to_s)
122
102
  # find name of key attribute
103
+ key = model.key.first.name
123
104
  resource.attributes[key] = id
124
- resource.instance_variable_set('@' + key.to_s, id)
105
+ resource.instance_variable_set("@" + key.to_s, id)
125
106
  save(resource)
126
- end.size
107
+ end
108
+ return resources.size
127
109
  end
128
-
110
+
129
111
  def delete(collection)
130
- collection.each do |result|
131
- key = result.key.first
132
- class_name = result.model.to_s
133
- @last_used_id[class_name] = key
134
- xml_destroy(result)
135
- @logger.debug("Destroying #{result}")
136
- # also remove from cache
137
- @cache.delete(class_name, key)
138
- # also remove from mtimes
139
- @cache.delete_mtime(class_name_to_file(class_name, key))
140
- end
141
- return collection.size
112
+ collection.each do |result|
113
+ @last_used_id[result.class.to_s] = result.key.first
114
+ xml_destroy(result)
115
+ # also remove from cache
116
+ @cache.delete(result.model.to_s, result.key.first)
117
+ # also remove from mtimes
118
+ @cache.delete_mtime(class_name_to_file(result.model.to_s, result.key.first))
119
+ end
120
+ return collection.size
142
121
  end
143
-
122
+
144
123
  def update(attributes, collection)
145
- # ok, for each object found we have to update the attribs we found
146
- # first thing is figure out what class we are dealing with
147
- # iterate over every object in this set and set the given attributes
148
- collection.each do |obj|
149
- attributes.each do |attrib|
150
- # attrib is an array
151
- # first member is Property object
152
- # second member is the value
153
- obj.instance_variable_set('@' + attrib[0].name.to_s, attrib[1])
154
- @logger.debug("Updating instance variable #{attrib[0].name.to_s} to #{attrib[1]}")
155
- end
156
- save(obj)
157
- end
124
+ # ok, for each object found we have to update the attribs we found
125
+ # first thing is figure out what class we are dealing with
126
+ # iterate over every object in this set and set the given attributes
127
+ collection.each do |obj|
128
+ attributes.each do |attrib|
129
+ # attrib is an array
130
+ # first member is Property object
131
+ # second member is the value
132
+ obj.instance_variable_set("@" + attrib[0].name.to_s, attrib[1])
133
+ end
134
+ save(obj)
135
+ end
158
136
  return collection
159
137
  end
160
-
138
+
161
139
  def read(query)
162
- return filter_result_set(get_all(query.model), query)
140
+ return filter_result_set(get_all(query.model), query)
163
141
  end
164
-
142
+
165
143
  private
166
-
167
- def xml_destroy(resource)
144
+
145
+ def xml_destroy(resource)
168
146
  # take an objects class and ID and figure
169
147
  # out what file it's in
170
148
  # and then remove that file
171
- File.unlink class_name_to_file(resource.class.to_s, resource.key.first)
149
+ class_name = resource.class.to_s
150
+ id = resource.key.first
151
+ file = class_name_to_file(class_name, id)
152
+ File.unlink(file)
172
153
  end
173
-
154
+
174
155
  def filter_result_set(objects, query)
156
+ #puts "before filter: #{objects.inspect}"
175
157
  result_set = objects.clone
158
+ result_set = query.filter_records(result_set)
159
+ #puts "After filter: #{result_set.inspect}"
176
160
  return query.filter_records(result_set)
177
161
  end
178
-
162
+
179
163
  def get_all(model)
180
- model_name = model.to_s
181
- @logger.debug("Getting all for model #{model_name}")
182
- directory = classname_to_dir(model_name)
164
+ #@@logger.info("Trying to get all: #{model.to_s}")
165
+ directory = classname_to_dir(model.to_s)
183
166
  if ! File.exists?(directory)
167
+ #@@logger.error("The directory doesn't exist!")
184
168
  return []
185
169
  end
186
-
187
170
  objects = []
188
- Dir[directory + '/*.xml'].each do |filename|
171
+ Dir.entries(directory).select {|f| f.match(/\.xml$/) }.each do |filename|
172
+ filename = directory + "/" + filename
189
173
  # see if we have a nice cached version
190
- if has_cached_version?(filename)
191
- # we have a nice cached object..
192
- objects << @cache.get(model_name, file_to_id(filename))
174
+ mtime = File.mtime(filename)
175
+ cache_mtime = @cache.get_mtime(filename)
176
+ #puts "file mtime: #{mtime} cache mtime: #{@cache.get_mtime(filename)}"
177
+ if (mtime != nil and cache_mtime != nil)
178
+ #puts "comparing! #{mtime < cache_mtime}"
179
+ end
180
+ if (mtime != nil and cache_mtime != nil and mtime == cache_mtime)
181
+ # we hav ea nice cached object..
182
+ objects << @cache.get(model.to_s, file_to_id(filename))
193
183
  else
194
- # the file's newer OR older (aha!!), so we gotta load it up
184
+ #@@logger.info("CACHE MISS")
185
+ # the file's newer, so we gotta load it up
195
186
  object = file_to_object(filename, model)
196
187
  objects << object
197
- key = object.key
198
- next if (key == nil)
199
- key = object.key.first
200
- @cache.put(model_name, key, object)
188
+ @cache.put(model.to_s, object.key.first, object)
201
189
  @cache.set_mtime(filename, File.mtime(filename))
202
190
  end
203
191
  end
204
192
  return objects
205
193
  end
206
-
207
- def has_cached_version?(filename)
208
- mtime = File.mtime(filename)
209
- cache_mtime = @cache.get_mtime(filename)
210
- return true if (mtime != nil and cache_mtime != nil and mtime == cache_mtime)
211
- end
212
-
194
+
213
195
  def file_to_id(file)
214
196
  return file.match(/([0-9]+)\.xml/)[1]
215
197
  end
216
-
198
+
199
+ def is_integer?(number)
200
+ if number.class == String and number.match(/^\-*[0-9]+$/)
201
+ return true
202
+ end
203
+ return false
204
+ end
205
+
217
206
  def file_to_object(file, model)
218
- model_name = model.to_s
207
+
219
208
  # allocate new object to receive these fields
220
- if (model_name.match(/.*\:\:.*/))
221
- new_obj = Kernel.qualified_const_get(model_name).new
209
+ if (model.to_s.match(/\:\:/))
210
+ modname, clazz = model.to_s.split("::")
211
+ new_obj = Kernel.const_get(modname).const_get(clazz).new
222
212
  else
223
- new_obj = Kernel.const_get(model_name).new
213
+ clazz = model.to_s
214
+ new_obj = Kernel.const_get(clazz).new
224
215
  end
225
-
216
+
217
+ # file is our XML file
218
+ string = IO.read(file)
219
+ parser = XML::Parser.string(string)
220
+ doc = parser.parse
221
+ root_node = doc.root
226
222
  # iterate over children
227
- XML::Parser.string(IO.read(file)).parse.root.children.each do |child|
228
- child_class = child.attributes['class']
223
+ root_node.children.each do |child|
224
+ child_class = child.attributes["class"]
229
225
  if child_class != nil
230
226
  # this means we have an attribute
231
- populate_instance(new_obj, child, child_class)
227
+ if (child_class == "Integer")
228
+ new_obj.instance_variable_set("@#{child.name}", child.content.to_i)
229
+ elsif (child_class == "String")
230
+ new_obj.instance_variable_set("@#{child.name}", child.content)
231
+ elsif (child_class == "TrueClass")
232
+ new_obj.instance_variable_set("@#{child.name}", true)
233
+ elsif (child_class == "FalseClass")
234
+ new_obj.instance_variable_set("@#{child.name}", false)
235
+ elsif (child_class == "BigDecimal")
236
+ new_obj.instance_variable_set("@#{child.name}", BigDecimal.new(child.content))
237
+ elsif (child_class == "DateTime")
238
+ new_obj.instance_variable_set("@#{child.name}", DateTime.parse(child.content))
239
+ end
232
240
  end
233
241
  end
234
-
242
+
235
243
  return new_obj
236
244
  end
237
-
238
- def populate_instance(new_obj, child, child_class)
239
- if (child_class == 'String')
240
- new_obj.instance_variable_set("@#{child.name}", child.content)
241
- elsif (child_class == 'Integer')
242
- new_obj.instance_variable_set("@#{child.name}", child.content.to_i)
243
- elsif (child_class == 'TrueClass')
244
- new_obj.instance_variable_set("@#{child.name}", true)
245
- elsif (child_class == 'FalseClass')
246
- new_obj.instance_variable_set("@#{child.name}", false)
247
- elsif (child_class == 'BigDecimal')
248
- new_obj.instance_variable_set("@#{child.name}", BigDecimal.new(child.content))
249
- elsif (child_class == 'DateTime')
250
- new_obj.instance_variable_set("@#{child.name}", DateTime.parse(child.content))
251
- elsif (child_class == 'Date')
252
- new_obj.instance_variable_set("@#{child.name}", Date.parse(child.content))
253
- end
254
- end
255
-
256
- def find_free_id_for(class_name)
245
+
246
+ def find_free_id_for(class_name)
257
247
  # if there are no entries in the directory
258
248
  # or the directory doesn't exist
259
249
  # we need to create it...
260
250
  if ! File.exists?(classname_to_dir(class_name))
261
251
  # default ID
262
- return 1
252
+ return 0
263
253
  end
264
254
  directory = Dir.new(classname_to_dir(class_name))
265
255
  if directory.entries.size == 0
266
- return 1
256
+ return 0
267
257
  end
268
- id = @last_used_id[class_name] || 1
258
+ id = @last_used_id[class_name] || 0
269
259
  while true do
270
- filename = File.join(directory.path, id.to_s + '.xml')
271
- if ! File.exists?(filename)
260
+ if ! File.exists?(File.join(directory.path, id.to_s + ".xml"))
272
261
  @last_used_id[class_name] = id
273
262
  return id
274
263
  end
275
264
  id += 1
276
265
  end
277
266
  end
278
-
267
+
279
268
  def save(resource)
269
+
280
270
  # since we're saving, purge the cache
281
- resource_class = resource.class.to_s
282
- resource_key = resource.key.first
283
- @cache.delete(resource_class, resource_key)
284
- @cache.delete_mtime(class_name_to_file(resource_class, resource_key))
271
+ @cache.delete(resource.class.to_s, resource.key.first)
272
+ @cache.delete_mtime(class_name_to_file(resource.class.to_s, resource.key.first))
285
273
 
274
+ # file = File.join(class_name_to_file(resource.class.to_s, resource.key.first))
286
275
  # see if the directory exists, if it doesn't, we need to create it
287
- if ! File.exists?(classname_to_dir(resource_class))
288
- FileUtils.mkdir_p(classname_to_dir(resource_class))
276
+ if ! File.exists?(classname_to_dir(resource.class.to_s))
277
+ FileUtils.mkdir_p(classname_to_dir(resource.class.to_s))
289
278
  end
290
279
 
280
+ # puts resource.model.properties.inspect
281
+
291
282
  # set up builder
292
- out_string = ''
283
+ out_string = ""
293
284
  xml = Builder::XmlMarkup.new(:target => out_string, :indent => 1)
294
-
285
+
295
286
  # iterate over the resource and figure out the fields
296
- xml.tag!('RubyObject', :class => resource.model.to_s) do
287
+ # class_name = resource.model.to_s.gsub(/\:/, "_")
288
+ xml.tag!("RubyObject", :class => resource.model.to_s) do
297
289
  resource.model.properties.each do |property|
298
- property_name = property.name.to_s
299
- value = resource.instance_variable_get('@' + property_name)
290
+ #puts "saving prop: #{property.name}"
291
+ #puts "primitive: #{property.primitive}"
292
+ value = resource.instance_variable_get("@" + property.name.to_s)
300
293
  # special case for false
301
294
  if property.primitive == TrueClass and value == false
302
- xml.tag!(property_name, false, :class => FalseClass.to_s)
303
- elsif (property.primitive == BigDecimal and value != nil)
304
- xml.tag!(property_name, value.to_s('F'), :class => BigDecimal)
295
+ xml.tag!(property.name.to_s, false, :class => FalseClass.to_s)
296
+ elsif (value != nil and property.primitive == BigDecimal)
297
+ xml.tag!(property.name.to_s, value.to_s("F"), :class => BigDecimal)
305
298
  elsif (value != nil)
306
- xml.tag!(property_name, value, :class => property.primitive)
299
+ xml.tag!(property.name.to_s, value, :class => property.primitive)
307
300
  end
308
301
  end
309
302
  end
310
-
311
- xmlfile = File.new(class_name_to_file(resource_class, resource_key), 'w')
312
- tempfile = Tempfile.new('dm-xml-adapter', Dir.tmpdir())
303
+
304
+ xmlfile = File.new(class_name_to_file(resource.class.to_s, resource.key.first), "w")
305
+ tempfile = Tempfile.new("dm-xml-adapter", "/tmp")
313
306
  tempfile.puts out_string
314
307
  tempfile.close
315
308
  FileUtils.mv(tempfile.path,xmlfile.path)
316
- @logger.debug("Saved to: #{xmlfile.path}")
317
309
  return xmlfile
318
-
310
+
319
311
  end
320
312
 
321
313
  def classname_to_dir(class_name)
322
314
  return File.join(@options[:directory],
323
- class_name.gsub('/', '_').gsub(':', '_'))
315
+ class_name.gsub("/", "_").gsub(":", "_"))
324
316
  end
325
-
317
+
326
318
  def class_name_to_file(class_name, id)
327
- return File.join(classname_to_dir(class_name), id.to_s + '.xml')
319
+ return File.join(classname_to_dir(class_name), id.to_s + ".xml")
328
320
  end
329
321
 
322
+ memoize(:file_to_id)
323
+ memoize(:classname_to_dir)
324
+ memoize(:class_name_to_file)
325
+
330
326
  end
331
327
  end
332
328
 
@@ -1,13 +1,11 @@
1
1
  require 'rubygems'
2
2
  require 'dm-core'
3
3
  require 'pathname'
4
- require 'dm-migrations'
5
4
  require Pathname(__FILE__).dirname.expand_path + 'spec_helper'
6
5
 
7
6
  describe DataMapper::Adapters::XmlAdapter do
8
7
  before(:each) do
9
8
  @adapter = DataMapper.setup(:default, {:adapter => 'xml', :directory => 'db'})
10
- DataMapper.auto_migrate!
11
9
  delete_all
12
10
  end
13
11
 
@@ -15,14 +13,14 @@ describe DataMapper::Adapters::XmlAdapter do
15
13
  XMLTest::User.all.each {|u| u.destroy }
16
14
  XMLTest::Post.all.each {|p| p.destroy }
17
15
  AutoQuote.all.each {|aq| aq.destroy }
18
- Food.all.each {|f| f.destroy }
19
- Drink.all.each {|d| d.destroy }
20
- Three::Level::Test::IsFun.all.each {|d| d.destroy }
16
+ Food.all.each {|f| f.destroy }
17
+ Drink.all.each {|d| d.destroy }
21
18
  end
22
-
19
+
23
20
  after(:each) do
24
21
  delete_all
25
22
  end
23
+
26
24
 
27
25
  describe "CRUD" do
28
26
 
@@ -32,14 +30,14 @@ describe DataMapper::Adapters::XmlAdapter do
32
30
  AutoQuote.all.size.should == 1
33
31
  end
34
32
  end
35
-
33
+
36
34
  describe "content attribute" do
37
35
  it "should be able to handle a content attribute" do
38
36
  XMLTest::User.create(:name => "contentking", :content => "cool")
39
37
  XMLTest::User.all.size.should == 1
40
38
  end
41
39
  end
42
-
40
+
43
41
  describe "datetime" do
44
42
  it "should do datetime" do
45
43
  u1 = XMLTest::User.new
@@ -51,17 +49,6 @@ describe DataMapper::Adapters::XmlAdapter do
51
49
  end
52
50
  end
53
51
 
54
- describe "date" do
55
- it "should do date" do
56
- u1 = XMLTest::User.new
57
- u1.name = "cool!"
58
- u1.date = Date.parse("01/01/2001")
59
- u1.save
60
- u2 = XMLTest::User.first(:name => "cool!")
61
- u2.date.class.should == Date
62
- end
63
- end
64
-
65
52
  describe "boolean" do
66
53
  it "should be boolean" do
67
54
  u1 = XMLTest::User.new
@@ -80,7 +67,7 @@ describe DataMapper::Adapters::XmlAdapter do
80
67
  u2.cool.class.should == FalseClass
81
68
  end
82
69
  end
83
-
70
+
84
71
  describe "associations" do
85
72
  it "should have associations" do
86
73
  u1 = XMLTest::User.new
@@ -99,14 +86,14 @@ describe DataMapper::Adapters::XmlAdapter do
99
86
  u3.posts.size.should == 2
100
87
  end
101
88
  end
102
-
89
+
103
90
  describe "get all" do
104
91
  it "should get all" do
105
92
  XMLTest::User.create(:name => :yeah)
106
93
  XMLTest::User.all.should_not == nil
107
94
  end
108
95
  end
109
-
96
+
110
97
  describe "update" do
111
98
  it "should update" do
112
99
  u1 = XMLTest::User.new
@@ -125,7 +112,7 @@ describe DataMapper::Adapters::XmlAdapter do
125
112
  u.user_id.should_not == nil
126
113
  end
127
114
  end
128
-
115
+
129
116
  describe "delete" do
130
117
  it "should delete someone" do
131
118
  user = XMLTest::User.create
@@ -141,7 +128,7 @@ describe DataMapper::Adapters::XmlAdapter do
141
128
  user1.money.class.should == BigDecimal
142
129
  end
143
130
  end
144
-
131
+
145
132
  describe "find not" do
146
133
  it "should find someone with a not clause" do
147
134
  user1 = XMLTest::User.create(:name => "joe")
@@ -156,37 +143,15 @@ describe DataMapper::Adapters::XmlAdapter do
156
143
  100.times {|n| Drink.create(:name => "Drink#{n}") }
157
144
  # pick a random one
158
145
  ids = Drink.all.map {|d| d.drink_id }
159
- random_key = ids[rand(100).to_i]
160
- drink = Drink.get(random_key)
146
+ drink = Drink.get(ids[rand(100).to_i])
161
147
  drink.name = "Drinky drink!"
162
148
  drink.save
163
149
  Drink.first(:name => "Drinky drink!").should_not == nil
164
150
  end
165
151
  end
166
-
167
- describe "complex class name" do
168
- it "should be able to persist" do
169
- fun = Three::Level::Test::IsFun.new
170
- fun.superfun = true
171
- fun.save
172
- end
173
- end
174
-
175
- describe "logging support" do
176
- it "should work with logging" do
177
- @adapter.loglevel = Logger::DEBUG
178
- @adapter.logger = Logger.new("/dev/null")
179
- XMLTest::User.create(:name => "contentking", :content => "cool")
180
- XMLTest::User.all.size.should == 1
181
- DataMapper.repository.adapter.loglevel = Logger::DEBUG
182
- DataMapper.repository.adapter.logger = Logger.new('/dev/null')
183
- XMLTest::User.create(:name => "contentking", :content => "cool")
184
- XMLTest::User.all.size.should == 2
185
- end
186
-
187
- end
188
-
152
+
189
153
  end
154
+
190
155
 
191
156
  end
192
157
 
data/spec/spec_helper.rb CHANGED
@@ -1,64 +1,51 @@
1
1
  require 'rubygems'
2
2
  require 'dm-core'
3
3
  require 'pathname'
4
- require './lib/dm-xml-adapter'
4
+ require Pathname(__FILE__).dirname.parent.expand_path + 'lib/dm-xml-adapter'
5
5
 
6
6
  class Food
7
- include DataMapper::Resource
7
+ include DataMapper::Resource
8
8
 
9
- property :food_id, Serial
10
- property :name, String
9
+ property :food_id, Serial
10
+ property :name, String
11
11
  end
12
12
 
13
13
  class Drink
14
- include DataMapper::Resource
15
-
16
- property :drink_id, Serial
17
- property :name, String
14
+ include DataMapper::Resource
15
+
16
+ property :drink_id, Serial
17
+ property :name, String
18
18
  end
19
19
 
20
20
  class AutoQuote
21
- include DataMapper::Resource
22
-
23
- property :quote_id, Serial
24
- property :fullname, String
21
+ include DataMapper::Resource
22
+
23
+ property :quote_id, Serial
24
+ property :fullname, String
25
25
  end
26
26
 
27
27
  module XMLTest
28
- class Post
29
- include DataMapper::Resource
30
-
31
- property :post_id, Serial
32
- property :title, String
33
- property :created, DateTime
34
-
35
- belongs_to :user, :model => "User"
36
- end
37
-
38
- class User
39
- include DataMapper::Resource
40
-
41
- property :user_id, Serial
42
- property :name, String
43
- property :age, Integer
44
- property :money, Decimal
45
- property :created, DateTime
46
- property :cool, Boolean
47
- property :content, String
48
- property :date, Date
49
-
50
- has n, :posts, :model => "Post"
51
- end
28
+ class Post
29
+ include DataMapper::Resource
30
+
31
+ property :post_id, Serial
32
+ property :title, String
33
+ property :created, DateTime
34
+
35
+ belongs_to :user, :model => "User"
36
+ end
37
+
38
+ class User
39
+ include DataMapper::Resource
40
+
41
+ property :user_id, Serial
42
+ property :name, String
43
+ property :age, Integer
44
+ property :money, BigDecimal
45
+ property :created, DateTime
46
+ property :cool, Boolean
47
+ property :content, String
48
+
49
+ has n, :posts, :model => "Post"
52
50
  end
53
-
54
- module Three
55
- module Level
56
- module Test
57
- class IsFun
58
- include DataMapper::Resource
59
- property :fun_id, Serial
60
- property :superfun, Boolean
61
- end
62
- end
63
- end
64
51
  end
metadata CHANGED
@@ -1,155 +1,89 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: dm-xml-adapter
3
- version: !ruby/object:Gem::Version
4
- version: '0.59'
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.571"
6
5
  platform: ruby
7
- authors:
6
+ authors:
8
7
  - Joshua Harding
9
8
  autorequire: dm-xml-adapter
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-05-16 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
11
+
12
+ date: 2010-02-09 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
15
16
  name: libxml-ruby
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
17
  type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
30
- - !ruby/object:Gem::Dependency
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
31
26
  name: builder
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ! '>='
36
- - !ruby/object:Gem::Version
37
- version: '0'
38
27
  type: :runtime
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
46
- - !ruby/object:Gem::Dependency
47
- name: dm-core
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: '0'
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: simple_memoize
54
37
  type: :runtime
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- - !ruby/object:Gem::Dependency
63
- name: dm-migrations
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ! '>='
68
- - !ruby/object:Gem::Version
69
- version: '0'
70
- type: :runtime
71
- prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
78
- - !ruby/object:Gem::Dependency
79
- name: rspec
80
- requirement: !ruby/object:Gem::Requirement
81
- none: false
82
- requirements:
83
- - - ! '>='
84
- - !ruby/object:Gem::Version
85
- version: '0'
86
- type: :runtime
87
- prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
93
- version: '0'
94
- - !ruby/object:Gem::Dependency
95
- name: lrucache
96
- requirement: !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ! '>='
100
- - !ruby/object:Gem::Version
101
- version: '0'
102
- type: :runtime
103
- prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '0'
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
110
45
  description:
111
46
  email: josh@statewidesoftware.com
112
47
  executables: []
48
+
113
49
  extensions: []
114
- extra_rdoc_files:
50
+
51
+ extra_rdoc_files:
115
52
  - README
116
- files:
53
+ files:
117
54
  - lib/dm-xml-adapter.rb
118
55
  - lib/ratecounter.rb
119
56
  - spec/dm-xml-adapter_spec.rb
120
57
  - spec/spec_helper.rb
121
58
  - README
59
+ has_rdoc: true
122
60
  homepage:
123
61
  licenses: []
62
+
124
63
  post_install_message:
125
64
  rdoc_options: []
126
- require_paths:
65
+
66
+ require_paths:
127
67
  - lib
128
- required_ruby_version: !ruby/object:Gem::Requirement
129
- none: false
130
- requirements:
131
- - - ! '>='
132
- - !ruby/object:Gem::Version
133
- version: '0'
134
- segments:
135
- - 0
136
- hash: 758938256756139992
137
- required_rubygems_version: !ruby/object:Gem::Requirement
138
- none: false
139
- requirements:
140
- - - ! '>='
141
- - !ruby/object:Gem::Version
142
- version: '0'
143
- segments:
144
- - 0
145
- hash: 758938256756139992
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: "0"
73
+ version:
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ version:
146
80
  requirements: []
81
+
147
82
  rubyforge_project:
148
- rubygems_version: 1.8.24
83
+ rubygems_version: 1.3.5
149
84
  signing_key:
150
85
  specification_version: 3
151
- summary: a XML adapter for DataMapper. this adapter allows you to use DataMapper with
152
- XML files as a backing store.
153
- test_files:
86
+ summary: a XML adapter for DataMapper. this adapter allows you to use DataMapper with XML files as a backing store.
87
+ test_files:
154
88
  - spec/dm-xml-adapter_spec.rb
155
89
  - spec/spec_helper.rb