seedable 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []