dm-xml-adapter 0.58 → 0.59

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