seedable 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,45 @@
1
+ # encoding: UTF-8
2
+
3
+ module Seedable # :nodoc:
4
+ class ObjectTracker # :nodoc:
5
+
6
+ attr_accessor :graph
7
+
8
+ # Create a new instance of the object tracker.
9
+ #
10
+ def initialize
11
+ @graph = {}
12
+ end
13
+
14
+ # Determine if the object tracker has already picked this object up.
15
+ #
16
+ def contains?(object)
17
+ key, id = to_key_and_id(object)
18
+
19
+ @graph[key].is_a?(Enumerable) ? @graph[key].include?(id) : @graph[key]
20
+ end
21
+
22
+ # Add this object to the object tracker.
23
+ #
24
+ def add(object)
25
+ key, id = to_key_and_id(object)
26
+
27
+ @graph[key] ? @graph[key] << id : @graph[key] = [id]
28
+ end
29
+
30
+ # Display the object tracker in yaml for easy viewing.
31
+ #
32
+ def to_s
33
+ @graph.to_yaml
34
+ end
35
+
36
+ # Convert a particular object to a hash key and id, based from the
37
+ # object's class and primary key.
38
+ #
39
+ def to_key_and_id(object)
40
+ [object.class.to_s.underscore.to_sym, object.id]
41
+ end
42
+ private :to_key_and_id
43
+
44
+ end
45
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: UTF-8
2
+
3
+ module Seedable # :nodoc:
4
+ VERSION = "0.0.1"
5
+ end
data/seedable.gemspec ADDED
@@ -0,0 +1,44 @@
1
+ # encoding: UTF-8
2
+
3
+ $:.push File.expand_path("../lib", __FILE__)
4
+ require "seedable/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "seedable"
8
+ s.version = Seedable::VERSION
9
+ s.platform = Gem::Platform::RUBY
10
+ s.authors = ["Christopher Meiklejohn"]
11
+ s.email = ["christopher.meiklejohn@gmail.com"]
12
+ s.homepage = "http://github.com/cmeiklejohn/seedable"
13
+ s.summary = %q{Allows for quick serialization/deserialization of objects for moving between environments.}
14
+ s.description = %q{Allows for quick serialization/deserialization of objects for moving between environments.}
15
+
16
+ s.rubyforge_project = "seedable"
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.require_paths = ["lib"]
22
+
23
+ s.add_dependency('rails', '>= 3.1.0')
24
+
25
+ s.add_development_dependency('bundler', '~> 1.0.0')
26
+ s.add_development_dependency('rspec')
27
+ s.add_development_dependency('rspec-rails')
28
+ s.add_development_dependency('sqlite3')
29
+ s.add_development_dependency('factory_girl')
30
+ s.add_development_dependency('factory_girl_rails')
31
+ s.add_development_dependency('mocha')
32
+ s.add_development_dependency('appraisal', '~> 0.3.5')
33
+ s.add_development_dependency('timecop')
34
+ s.add_development_dependency('horo')
35
+ s.add_development_dependency('simplecov')
36
+ s.add_development_dependency('diesel')
37
+ s.add_development_dependency('guard')
38
+ s.add_development_dependency('guard-rspec')
39
+
40
+ if RUBY_PLATFORM =~ /linux/i
41
+ s.add_development_dependency('rb-inotify')
42
+ s.add_development_dependency('libnotify')
43
+ end
44
+ end
data/spec/database.yml ADDED
@@ -0,0 +1,7 @@
1
+ # encoding: UTF-8
2
+
3
+ test:
4
+ adapter: sqlite3
5
+ database: db/test.sqlite3
6
+ pool: 5
7
+ timeout: 5000
@@ -0,0 +1,22 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe FilteredGarage do
6
+
7
+ before(:each) do
8
+ Timecop.freeze(2010, 01, 01)
9
+ @garage = Factory.create(:filtered_garage)
10
+ end
11
+
12
+ after(:each) do
13
+ Timecop.return
14
+ end
15
+
16
+ describe "with filtered attributes" do
17
+ it "should return properly formatted json when to_seedable is called" do
18
+ @garage.as_seedable.should == {"filtered_garage"=>{"id"=>1, "updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,197 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Garage do
6
+
7
+ before(:each) do
8
+ Timecop.freeze(2010, 01, 01)
9
+ @garage = Factory.create(:garage)
10
+ end
11
+
12
+ after(:each) do
13
+ Timecop.return
14
+ end
15
+
16
+ describe "with no associations" do
17
+ it "should return a proper hash of attributes and associations" do
18
+ @garage.as_seedable.should == {"garage"=>{"id"=>1, "updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}
19
+ end
20
+
21
+ it "should export and import correctly" do
22
+ @hash = @garage.as_seedable
23
+ @json = @garage.to_seedable
24
+
25
+ @hash.should == {"garage"=>{"id"=>1, "updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}
26
+
27
+ @garage.delete
28
+ Garage.all.count.should == 0
29
+
30
+ @garage = Garage.from_seedable(@json)
31
+ @garage.as_seedable.should == @hash
32
+ @garage.to_seedable.should == @json
33
+ end
34
+ end
35
+
36
+ describe "with a bike" do
37
+ before(:each) do
38
+ @bike = Factory.create(:bike)
39
+ @garage.bikes << @bike
40
+
41
+ Garage.include_associations([:bikes])
42
+ end
43
+
44
+ it "should not traverse to bike when exporting since it is not seedable" do
45
+ @garage.as_seedable.should == {"garage"=>{"id"=>1, "updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}
46
+ end
47
+ end
48
+
49
+ describe "with one car" do
50
+ before(:each) do
51
+ @car = Factory.create(:car)
52
+ @garage.cars << @car
53
+ Garage.include_associations([:cars])
54
+ end
55
+
56
+ it "should return a proper hash of attributes and associations" do
57
+ Car.filter_attributes([])
58
+ Garage.filter_attributes([])
59
+
60
+ @garage.as_seedable.should == {"garage"=>{"id"=>1, "updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", :cars=>[{"id"=>1, "updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "model"=>"Impreza", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010", "garage_id"=>1, "make"=>"Subaru"}], "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}
61
+ end
62
+
63
+ it "should omit filtered attributes and return properly formatted json when to_seedable is called" do
64
+ Garage.filter_attributes([:id])
65
+ Car.filter_attributes([:id, :garage_id])
66
+
67
+ @garage.as_seedable.should == {"garage"=>{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", :cars=>[{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "model"=>"Impreza", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010", "make"=>"Subaru"}], "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}
68
+ end
69
+
70
+ it "should export and import the records correctly without ids" do
71
+ Garage.filter_attributes([:id])
72
+ Car.filter_attributes([:id, :garage_id])
73
+
74
+ @hash = @garage.as_seedable
75
+ @json = @garage.to_seedable
76
+
77
+ @car.delete
78
+ @garage.delete
79
+
80
+ Car.all.count.should == 0
81
+ Garage.all.count.should == 0
82
+
83
+ @hash.should == {"garage"=>{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", :cars=>[{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "model"=>"Impreza", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010", "make"=>"Subaru"}], "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}
84
+
85
+ @garage = Garage.from_seedable(@json)
86
+ @garage.as_seedable.should == @hash
87
+ @garage.to_seedable.should == @json
88
+ end
89
+
90
+ # TODO: Marked pending since this behavior fails in rails 3.0, but
91
+ # works in rails 3.2.
92
+ #
93
+ # For this to work, mass assignment protection
94
+ # changes from rails-3.2 are necessary since they'll alow you to
95
+ # bypass protection on all associated objects and set primary key
96
+ # values on the associated objects.
97
+ #
98
+ pending "should export and import the records correctly with ids"
99
+ end
100
+
101
+ describe "with one car and two drivers" do
102
+ before(:each) do
103
+ @car = Factory.create(:car)
104
+ @garage.cars << @car
105
+ 2.times do
106
+ @car.drivers << Factory.create(:driver)
107
+ end
108
+
109
+ Car.filter_attributes([:id, :garage_id])
110
+ Garage.filter_attributes([:id])
111
+ Driver.filter_attributes([:id, :car_id])
112
+
113
+ Car.include_associations([:drivers])
114
+ Garage.include_associations([:cars])
115
+ end
116
+
117
+ it "serialize and deserialize into objects correctly" do
118
+ @hash = @garage.as_seedable
119
+ @json = @garage.to_seedable
120
+
121
+ @hash.should == {"garage"=>{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", :cars=>[{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "model"=>"Impreza", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010", :drivers=>[{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}, {"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}], "make"=>"Subaru"}], "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}
122
+
123
+ @garage = Garage.from_seedable(@json)
124
+ @garage.as_seedable.should == @hash
125
+ @garage.to_seedable.should == @json
126
+ end
127
+
128
+ describe "with a dependency back to garage" do
129
+ it "should be able to export correctly by not traversing direct ancestors" do
130
+ Car.filter_attributes([:id, :garage_id])
131
+ Garage.filter_attributes([:id])
132
+ Driver.filter_attributes([:id, :car_id])
133
+
134
+ Car.include_associations([:drivers, :garage])
135
+ Garage.include_associations([:cars])
136
+
137
+ @hash = @garage.as_seedable
138
+ @json = @garage.to_seedable
139
+
140
+ @hash.should == {"garage"=>{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", :cars=>[{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "model"=>"Impreza", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010", :drivers=>[{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}, {"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}], "make"=>"Subaru"}], "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}
141
+
142
+ @garage = Garage.from_seedable(@json)
143
+ @garage.as_seedable.should == @hash
144
+ @garage.to_seedable.should == @json
145
+ end
146
+ end
147
+ end
148
+
149
+ describe "with two cars with the same driver" do
150
+ before(:each) do
151
+ @driver = Factory.create(:driver)
152
+ 2.times do
153
+ @car = Factory.create(:car)
154
+ @car.drivers << @driver
155
+ @garage.cars << @car
156
+ end
157
+
158
+ Car.filter_attributes([])
159
+ Garage.filter_attributes([])
160
+ Driver.filter_attributes([])
161
+
162
+ Car.include_associations([:drivers])
163
+ Garage.include_associations([:cars])
164
+ end
165
+
166
+ it "should import and export only one driver correctly" do
167
+ @garage.as_seedable.should == {"garage"=>{"id"=>1, "updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", :cars=>[{"id"=>1, "updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "model"=>"Impreza", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010", "garage_id"=>1, :drivers=>[{"id"=>1, "updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "car_id"=>2, "name"=>"Chris", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}], "make"=>"Subaru"}, {"id"=>2, "updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "model"=>"Impreza", "created_at"=>"Fri Jan 01 00:00:00 -0500 2010", "garage_id"=>1, :drivers=>[{}], "make"=>"Subaru"}], "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}
168
+ end
169
+ end
170
+
171
+ describe "in an array of garages" do
172
+ before(:each) do
173
+ @garages = []
174
+ 2.times do
175
+ @garages << @garage
176
+ end
177
+
178
+ Car.filter_attributes([:id, :garage_id])
179
+ Garage.filter_attributes([:id])
180
+ Driver.filter_attributes([:id, :car_id])
181
+
182
+ @hash = @garages.as_seedable
183
+ @json = @garages.to_seedable
184
+ end
185
+
186
+ it "should export correctly" do
187
+ @hash.should == [{"garage"=>{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", :cars=>[], "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}, {"garage"=>{"updated_at"=>"Fri Jan 01 00:00:00 -0500 2010", "name"=>"Chris", :cars=>[], "created_at"=>"Fri Jan 01 00:00:00 -0500 2010"}}]
188
+ end
189
+
190
+ it "should reload correctly" do
191
+ @garages = Seedable.from_seedable(@json)
192
+ @garages.as_seedable.should == @hash
193
+ @garages.to_seedable.should == @json
194
+ end
195
+ end
196
+
197
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: UTF-8
2
+
3
+ ENV["RAILS_ENV"] ||= "test"
4
+
5
+ PROJECT_ROOT = File.expand_path("../..", __FILE__)
6
+ $LOAD_PATH << File.join(PROJECT_ROOT, "lib")
7
+
8
+ require 'rails/all'
9
+ require 'rails/test_help'
10
+ Bundler.require
11
+
12
+ require 'diesel/testing'
13
+ require 'rspec/rails'
14
+
15
+ require 'factory_girl_rails'
16
+ require 'timecop'
17
+
18
+ require 'seedable'
19
+
20
+ if RUBY_VERSION > "1.9"
21
+ require 'simplecov'
22
+ SimpleCov.start
23
+ end
24
+
25
+ Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
26
+
27
+ ActiveRecord::Base.establish_connection(
28
+ :adapter => "sqlite3",
29
+ :database => ":memory:"
30
+ )
31
+
32
+ ActiveRecord::Base.silence do
33
+ ActiveRecord::Migration.verbose = false
34
+
35
+ load(File.dirname(__FILE__) + '/../db/schema.rb')
36
+ end
37
+
38
+ RSpec.configure do |config|
39
+ config.use_transactional_fixtures = true
40
+ config.backtrace_clean_patterns << %r{gems/}
41
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ Factory.define :garage do |garage|
6
+ garage.name "Chris"
7
+ end
8
+
9
+ Factory.define :filtered_garage do |garage|
10
+ garage.name "Chris"
11
+ end
12
+
13
+ Factory.define :bike do |bike|
14
+ end
15
+
16
+ Factory.define :car do |car|
17
+ car.make "Subaru"
18
+ car.model "Impreza"
19
+ end
20
+
21
+ Factory.define :driver do |driver|
22
+ driver.name "Chris"
23
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+
3
+ class Garage < ActiveRecord::Base
4
+ include Seedable
5
+
6
+ has_many :cars
7
+ has_many :bikes
8
+
9
+ seedable :include_associations => []
10
+ end
11
+
12
+ class FilteredGarage < ActiveRecord::Base
13
+ include Seedable
14
+
15
+ has_many :cars
16
+ has_many :bikes
17
+
18
+ seedable :include_associations => [], :filter_attributes => [:name]
19
+ end
20
+
21
+ class Car < ActiveRecord::Base
22
+ include Seedable
23
+
24
+ belongs_to :garage
25
+
26
+ has_many :drivers
27
+
28
+ seedable :include_associations => []
29
+ end
30
+
31
+ class Bike < ActiveRecord::Base
32
+ include Seedable
33
+
34
+ belongs_to :garage
35
+ end
36
+
37
+ class Driver < ActiveRecord::Base
38
+ include Seedable
39
+
40
+ belongs_to :car
41
+
42
+ seedable :include_associations => []
43
+ end
metadata ADDED
@@ -0,0 +1,271 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: seedable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Christopher Meiklejohn
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-02 00:00:00.000000000 -04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rails
17
+ requirement: &16523360 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 3.1.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *16523360
26
+ - !ruby/object:Gem::Dependency
27
+ name: bundler
28
+ requirement: &16521980 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *16521980
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ requirement: &16521500 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *16521500
48
+ - !ruby/object:Gem::Dependency
49
+ name: rspec-rails
50
+ requirement: &16520300 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *16520300
59
+ - !ruby/object:Gem::Dependency
60
+ name: sqlite3
61
+ requirement: &16504720 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *16504720
70
+ - !ruby/object:Gem::Dependency
71
+ name: factory_girl
72
+ requirement: &16503480 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *16503480
81
+ - !ruby/object:Gem::Dependency
82
+ name: factory_girl_rails
83
+ requirement: &16502040 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *16502040
92
+ - !ruby/object:Gem::Dependency
93
+ name: mocha
94
+ requirement: &16500080 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: *16500080
103
+ - !ruby/object:Gem::Dependency
104
+ name: appraisal
105
+ requirement: &16486220 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 0.3.5
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *16486220
114
+ - !ruby/object:Gem::Dependency
115
+ name: timecop
116
+ requirement: &16485320 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *16485320
125
+ - !ruby/object:Gem::Dependency
126
+ name: horo
127
+ requirement: &16484380 !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: *16484380
136
+ - !ruby/object:Gem::Dependency
137
+ name: simplecov
138
+ requirement: &16482980 !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: *16482980
147
+ - !ruby/object:Gem::Dependency
148
+ name: diesel
149
+ requirement: &16444480 !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ! '>='
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ type: :development
156
+ prerelease: false
157
+ version_requirements: *16444480
158
+ - !ruby/object:Gem::Dependency
159
+ name: guard
160
+ requirement: &16443620 !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: *16443620
169
+ - !ruby/object:Gem::Dependency
170
+ name: guard-rspec
171
+ requirement: &16442800 !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ! '>='
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ type: :development
178
+ prerelease: false
179
+ version_requirements: *16442800
180
+ - !ruby/object:Gem::Dependency
181
+ name: rb-inotify
182
+ requirement: &16440580 !ruby/object:Gem::Requirement
183
+ none: false
184
+ requirements:
185
+ - - ! '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: *16440580
191
+ - !ruby/object:Gem::Dependency
192
+ name: libnotify
193
+ requirement: &16438380 !ruby/object:Gem::Requirement
194
+ none: false
195
+ requirements:
196
+ - - ! '>='
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ type: :development
200
+ prerelease: false
201
+ version_requirements: *16438380
202
+ description: Allows for quick serialization/deserialization of objects for moving
203
+ between environments.
204
+ email:
205
+ - christopher.meiklejohn@gmail.com
206
+ executables: []
207
+ extensions: []
208
+ extra_rdoc_files: []
209
+ files:
210
+ - .gitignore
211
+ - .rspec
212
+ - .rvmrc
213
+ - .travis.yml
214
+ - Appraisals
215
+ - Gemfile
216
+ - Guardfile
217
+ - LICENSE
218
+ - README.rdoc
219
+ - Rakefile
220
+ - db/schema.rb
221
+ - gemfiles/rails-3.1.0.gemfile
222
+ - gemfiles/rails-3.1.0.gemfile.lock
223
+ - gemfiles/rails-master.gemfile
224
+ - gemfiles/rails-master.gemfile.lock
225
+ - lib/seedable.rb
226
+ - lib/seedable/core_ext.rb
227
+ - lib/seedable/exporter.rb
228
+ - lib/seedable/helpers.rb
229
+ - lib/seedable/importer.rb
230
+ - lib/seedable/object_tracker.rb
231
+ - lib/seedable/version.rb
232
+ - seedable.gemspec
233
+ - spec/database.yml
234
+ - spec/models/filtered_garage_spec.rb
235
+ - spec/models/garage_spec.rb
236
+ - spec/spec_helper.rb
237
+ - spec/support/factories.rb
238
+ - spec/support/models.rb
239
+ has_rdoc: true
240
+ homepage: http://github.com/cmeiklejohn/seedable
241
+ licenses: []
242
+ post_install_message:
243
+ rdoc_options: []
244
+ require_paths:
245
+ - lib
246
+ required_ruby_version: !ruby/object:Gem::Requirement
247
+ none: false
248
+ requirements:
249
+ - - ! '>='
250
+ - !ruby/object:Gem::Version
251
+ version: '0'
252
+ segments:
253
+ - 0
254
+ hash: -3243611342215626697
255
+ required_rubygems_version: !ruby/object:Gem::Requirement
256
+ none: false
257
+ requirements:
258
+ - - ! '>='
259
+ - !ruby/object:Gem::Version
260
+ version: '0'
261
+ segments:
262
+ - 0
263
+ hash: -3243611342215626697
264
+ requirements: []
265
+ rubyforge_project: seedable
266
+ rubygems_version: 1.6.2
267
+ signing_key:
268
+ specification_version: 3
269
+ summary: Allows for quick serialization/deserialization of objects for moving between
270
+ environments.
271
+ test_files: []