tush 0.2.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,32 @@
1
+ require 'helper'
2
+
3
+ describe Tush::ModelStore do
4
+
5
+ before :all do
6
+ class Willie < ActiveRecord::Base
7
+ belongs_to :jeremiah
8
+ end
9
+
10
+ class Jeremiah < ActiveRecord::Base; end
11
+ end
12
+
13
+
14
+ describe "#push" do
15
+
16
+ let!(:jeremiah) { Jeremiah.create }
17
+ let!(:willie) { Willie.create :jeremiah => jeremiah }
18
+
19
+ it "doesn't follow attributes for models in copy_only_models" do
20
+ associations = Tush::AssociationHelpers.relation_infos(:belongs_to, willie.class)
21
+ associations.count.should == 1
22
+
23
+ model_store = Tush::ModelStore.new(:copy_only_models => [Willie])
24
+ model_store.push(willie)
25
+
26
+ model_store.model_wrappers.count.should == 1
27
+ model_store.model_wrappers.first.model_attributes.should == willie.attributes
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,119 @@
1
+ require 'helper'
2
+
3
+ describe Tush::ModelWrapper do
4
+
5
+ before :all do
6
+ class Ray < ActiveRecord::Base
7
+ has_one :alex
8
+ has_many :jimmy
9
+ end
10
+
11
+ class Jimmy < ActiveRecord::Base
12
+ belongs_to :ray
13
+ end
14
+
15
+ class Alex < ActiveRecord::Base
16
+ belongs_to :ray
17
+ end
18
+ end
19
+
20
+ describe "#association_objects" do
21
+
22
+ describe "related has_one and belongs_to relations are discovered" do
23
+ let!(:ray) { Ray.create }
24
+ let!(:alex) { Alex.create(:ray => ray) }
25
+
26
+ it "catches a has_one relation from the model that doesn't contain the foreign key" do
27
+ wrapper = Tush::ModelWrapper.new(:model => ray)
28
+
29
+ wrapper.association_objects.should == [alex]
30
+ end
31
+
32
+ it "catches a belongs_to relation from the model that contains the foreign key" do
33
+ wrapper = Tush::ModelWrapper.new(:model => alex)
34
+
35
+ wrapper.association_objects.should == [ray]
36
+ end
37
+
38
+ end
39
+
40
+ describe "related has_one and belongs_to relations are discovered" do
41
+ let!(:ray) { Ray.create }
42
+ let!(:jimmy1) { Jimmy.create(:ray => ray) }
43
+ let!(:jimmy2) { Jimmy.create(:ray => ray) }
44
+
45
+ it "catches a has_many relation from the model that doesn't contain the foreign key" do
46
+ wrapper = Tush::ModelWrapper.new(:model => ray)
47
+
48
+ wrapper.association_objects.should == [jimmy1, jimmy2]
49
+ end
50
+
51
+ it "catches a belongs_to relation from the model that contains the foreign key" do
52
+ wrapper = Tush::ModelWrapper.new(:model => jimmy1)
53
+
54
+ wrapper.association_objects.should == [ray]
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ describe "setting model trace" do
62
+ it "sets model trace when there is already an exisiting model" do
63
+ wrapper_ray = Tush::ModelWrapper.new(:model => Ray.create)
64
+ wrapper_ray.stub(:model_trace => [['Alex', 2]])
65
+ wrapper_ray.add_model_trace_list([['Alex', 3], ['Alex', 4]])
66
+ wrapper_ray.model_trace.should == [['Alex', 2], ['Alex', 3], ['Alex', 4]]
67
+
68
+ end
69
+
70
+ it "sets model trace without it previously being set" do
71
+ wrapper_ray = Tush::ModelWrapper.new(:model => Ray.create)
72
+ wrapper_ray.add_model_trace_list([['Alex', 3], ['Alex', 4]])
73
+ wrapper_ray.model_trace.should == [['Alex', 3], ['Alex', 4]]
74
+ end
75
+
76
+ it "sets model trace without it previously being set" do
77
+ wrapper_ray = Tush::ModelWrapper.new(:model => Ray.create)
78
+ wrapper_alex = Tush::ModelWrapper.new(:model => Alex.create)
79
+
80
+ wrapper_ray.add_model_trace(wrapper_alex)
81
+
82
+ wrapper_ray.model_trace.should == [['Alex', wrapper_alex.original_db_id]]
83
+ end
84
+
85
+ it "sets model trace without it previously being set" do
86
+ wrapper_ray = Tush::ModelWrapper.new(:model => Ray.create)
87
+ wrapper_alex = Tush::ModelWrapper.new(:model => Alex.create)
88
+ wrapper_ray.stub(:model_trace => [['Alex', 2]])
89
+
90
+ wrapper_ray.add_model_trace(wrapper_alex)
91
+
92
+ wrapper_ray.model_trace.should == [['Alex', 2], ['Alex', wrapper_alex.original_db_id]]
93
+ end
94
+ end
95
+
96
+ describe "#create_copy" do
97
+
98
+ it "saves the model with the custom_create method if it's defined" do
99
+ ray = Ray.create
100
+ wrapper = Tush::ModelWrapper.new(:model => ray)
101
+
102
+ custom_ray = Ray.create
103
+
104
+ Ray.should_receive(:custom_create).with(ray.attributes).and_return(custom_ray)
105
+ wrapper.create_copy
106
+ end
107
+
108
+ it "saves the model using sneaky_save by default" do
109
+ ray = Ray.create
110
+ wrapper = Tush::ModelWrapper.new(:model => ray)
111
+
112
+ wrapper.should_receive(:create_without_validation_and_callbacks)
113
+
114
+ wrapper.create_copy
115
+ end
116
+
117
+ end
118
+
119
+ end
@@ -0,0 +1 @@
1
+ {"model_wrappers":[{"model_class":"Kai","model_attributes":{"id":10,"sample_data":"data string"},"original_db_key":"id","new_db_key":null,"original_db_id":1},{"model_class":"Brett","model_attributes":{"id":1,"kai_id":10,"sample_data":"data string"},"original_db_key":"id","new_db_key":null,"original_db_id":1},{"model_class":"Kai","model_attributes":{"id":2,"sample_data":"data string"},"original_db_key":"id","new_db_key":null,"original_db_id":2},{"model_class":"Brett","model_attributes":{"id":2,"kai_id":2,"sample_data":"data string"},"original_db_key":"id","new_db_key":null,"original_db_id":2}]}
@@ -0,0 +1,88 @@
1
+ ActiveRecord::Schema.define do
2
+
3
+ # Tables for exporter_spec.rb
4
+
5
+ create_table :jasons, :force => true do |t|
6
+ end
7
+
8
+ create_table :kumies, :force => true do |t|
9
+ t.integer :jason_id
10
+ end
11
+
12
+ # Tables for importer_spec.rb
13
+
14
+ create_table :bretts, :force => true do |t|
15
+ t.integer :kai_id
16
+ t.string :sample_data
17
+ end
18
+
19
+ create_table :kais, :force => true do |t|
20
+ t.string :sample_data
21
+ end
22
+
23
+ create_table :byrons, :force => true do |t|
24
+ t.integer :kai_id
25
+ t.string :sample_data
26
+ end
27
+
28
+ create_table :laurens, :force => true do |t|
29
+ t.integer :dan_id
30
+ t.string :sample_data
31
+ end
32
+
33
+ create_table :davids, :force => true do |t|
34
+ t.integer :lauren_id
35
+ t.integer :charlie_id
36
+ t.string :sample_data
37
+ end
38
+
39
+ create_table :charlies, :force => true do |t|
40
+ t.integer :lauren_id
41
+ t.string :sample_data
42
+ end
43
+
44
+ create_table :dans, :force => true do |t|
45
+ t.string :sample_data
46
+ end
47
+
48
+ create_table :miguels, :force => true do |t|
49
+ t.integer :lauren_id, :null => false
50
+ end
51
+
52
+ # Tables for model_wrapper_spec.rb
53
+
54
+ create_table :rays, :force => true do |t|
55
+ end
56
+
57
+ create_table :alexes, :force => true do |t|
58
+ t.integer :ray_id
59
+ end
60
+
61
+ create_table :jimmies, :force => true do |t|
62
+ t.integer :ray_id
63
+ end
64
+
65
+ # Tables for model_store_spec.rb
66
+ create_table :willies, :force => true do |t|
67
+ t.integer :jeremiah_id
68
+ end
69
+
70
+ create_table :jeremiahs, :force => true do |t|
71
+ end
72
+
73
+ # Tables for association_helpers_spec.rb
74
+ create_table :jacobs, :force => true do |t|
75
+ t.integer :jesse_id
76
+ end
77
+
78
+ create_table :jesses, :force => true do |t|; end
79
+
80
+ create_table :jims, :force => true do |t|
81
+ t.integer :jesse_id
82
+ end
83
+
84
+ create_table :leahs, :force => true do |t|
85
+ t.integer :jim_id
86
+ end
87
+
88
+ end
data/tush.gemspec ADDED
@@ -0,0 +1,102 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "tush"
8
+ s.version = "0.2.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["David Huie", "Lauren Mermel"]
12
+ s.date = "2013-07-19"
13
+ s.description = "Simplified ActiveRecord data migrations between app instances"
14
+ s.email = "david@nationbuilder.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".ruby-gemset",
22
+ ".ruby-version",
23
+ "Gemfile",
24
+ "Gemfile.lock",
25
+ "LICENSE.txt",
26
+ "README.md",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "lib/tush.rb",
30
+ "lib/tush/exporter.rb",
31
+ "lib/tush/helpers/association_helpers.rb",
32
+ "lib/tush/importer.rb",
33
+ "lib/tush/model_store.rb",
34
+ "lib/tush/model_wrapper.rb",
35
+ "spec/association_helpers_spec.rb",
36
+ "spec/exporter_spec.rb",
37
+ "spec/helper.rb",
38
+ "spec/importer_spec.rb",
39
+ "spec/model_store_spec.rb",
40
+ "spec/model_wrapper_spec.rb",
41
+ "spec/support/exported_data.json",
42
+ "spec/support/schema.rb",
43
+ "tush.gemspec"
44
+ ]
45
+ s.homepage = "http://github.com/3dna/tush"
46
+ s.licenses = ["MIT"]
47
+ s.require_paths = ["lib"]
48
+ s.rubygems_version = "1.8.25"
49
+ s.summary = "Simplified ActiveRecord data migrations between app instances"
50
+
51
+ if s.respond_to? :specification_version then
52
+ s.specification_version = 3
53
+
54
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
55
+ s.add_runtime_dependency(%q<activerecord>, [">= 0"])
56
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
57
+ s.add_runtime_dependency(%q<shoulda>, [">= 0"])
58
+ s.add_runtime_dependency(%q<rdoc>, ["~> 3.12"])
59
+ s.add_runtime_dependency(%q<bundler>, [">= 0"])
60
+ s.add_runtime_dependency(%q<ruby_deep_clone>, [">= 0"])
61
+ s.add_runtime_dependency(%q<sneaky-save>, [">= 0"])
62
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
63
+ s.add_development_dependency(%q<awesome_print>, [">= 0"])
64
+ s.add_development_dependency(%q<pry>, [">= 0"])
65
+ s.add_development_dependency(%q<pry-nav>, [">= 0"])
66
+ s.add_development_dependency(%q<rspec>, [">= 0"])
67
+ s.add_development_dependency(%q<sqlite3>, [">= 0"])
68
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
69
+ else
70
+ s.add_dependency(%q<activerecord>, [">= 0"])
71
+ s.add_dependency(%q<activesupport>, [">= 0"])
72
+ s.add_dependency(%q<shoulda>, [">= 0"])
73
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
74
+ s.add_dependency(%q<bundler>, [">= 0"])
75
+ s.add_dependency(%q<ruby_deep_clone>, [">= 0"])
76
+ s.add_dependency(%q<sneaky-save>, [">= 0"])
77
+ s.add_dependency(%q<simplecov>, [">= 0"])
78
+ s.add_dependency(%q<awesome_print>, [">= 0"])
79
+ s.add_dependency(%q<pry>, [">= 0"])
80
+ s.add_dependency(%q<pry-nav>, [">= 0"])
81
+ s.add_dependency(%q<rspec>, [">= 0"])
82
+ s.add_dependency(%q<sqlite3>, [">= 0"])
83
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
84
+ end
85
+ else
86
+ s.add_dependency(%q<activerecord>, [">= 0"])
87
+ s.add_dependency(%q<activesupport>, [">= 0"])
88
+ s.add_dependency(%q<shoulda>, [">= 0"])
89
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
90
+ s.add_dependency(%q<bundler>, [">= 0"])
91
+ s.add_dependency(%q<ruby_deep_clone>, [">= 0"])
92
+ s.add_dependency(%q<sneaky-save>, [">= 0"])
93
+ s.add_dependency(%q<simplecov>, [">= 0"])
94
+ s.add_dependency(%q<awesome_print>, [">= 0"])
95
+ s.add_dependency(%q<pry>, [">= 0"])
96
+ s.add_dependency(%q<pry-nav>, [">= 0"])
97
+ s.add_dependency(%q<rspec>, [">= 0"])
98
+ s.add_dependency(%q<sqlite3>, [">= 0"])
99
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
100
+ end
101
+ end
102
+
metadata ADDED
@@ -0,0 +1,299 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tush
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - David Huie
9
+ - Lauren Mermel
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-07-19 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activerecord
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: activesupport
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: shoulda
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rdoc
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: '3.12'
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: '3.12'
79
+ - !ruby/object:Gem::Dependency
80
+ name: bundler
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :runtime
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: ruby_deep_clone
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sneaky-save
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: simplecov
129
+ requirement: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ! '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ type: :development
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ - !ruby/object:Gem::Dependency
144
+ name: awesome_print
145
+ requirement: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ! '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: pry
161
+ requirement: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ! '>='
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ - !ruby/object:Gem::Dependency
176
+ name: pry-nav
177
+ requirement: !ruby/object:Gem::Requirement
178
+ none: false
179
+ requirements:
180
+ - - ! '>='
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ none: false
187
+ requirements:
188
+ - - ! '>='
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ - !ruby/object:Gem::Dependency
192
+ name: rspec
193
+ requirement: !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: !ruby/object:Gem::Requirement
202
+ none: false
203
+ requirements:
204
+ - - ! '>='
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ - !ruby/object:Gem::Dependency
208
+ name: sqlite3
209
+ requirement: !ruby/object:Gem::Requirement
210
+ none: false
211
+ requirements:
212
+ - - ! '>='
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ none: false
219
+ requirements:
220
+ - - ! '>='
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: jeweler
225
+ requirement: !ruby/object:Gem::Requirement
226
+ none: false
227
+ requirements:
228
+ - - ~>
229
+ - !ruby/object:Gem::Version
230
+ version: 1.8.4
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ none: false
235
+ requirements:
236
+ - - ~>
237
+ - !ruby/object:Gem::Version
238
+ version: 1.8.4
239
+ description: Simplified ActiveRecord data migrations between app instances
240
+ email: david@nationbuilder.com
241
+ executables: []
242
+ extensions: []
243
+ extra_rdoc_files:
244
+ - LICENSE.txt
245
+ - README.md
246
+ files:
247
+ - .document
248
+ - .ruby-gemset
249
+ - .ruby-version
250
+ - Gemfile
251
+ - Gemfile.lock
252
+ - LICENSE.txt
253
+ - README.md
254
+ - Rakefile
255
+ - VERSION
256
+ - lib/tush.rb
257
+ - lib/tush/exporter.rb
258
+ - lib/tush/helpers/association_helpers.rb
259
+ - lib/tush/importer.rb
260
+ - lib/tush/model_store.rb
261
+ - lib/tush/model_wrapper.rb
262
+ - spec/association_helpers_spec.rb
263
+ - spec/exporter_spec.rb
264
+ - spec/helper.rb
265
+ - spec/importer_spec.rb
266
+ - spec/model_store_spec.rb
267
+ - spec/model_wrapper_spec.rb
268
+ - spec/support/exported_data.json
269
+ - spec/support/schema.rb
270
+ - tush.gemspec
271
+ homepage: http://github.com/3dna/tush
272
+ licenses:
273
+ - MIT
274
+ post_install_message:
275
+ rdoc_options: []
276
+ require_paths:
277
+ - lib
278
+ required_ruby_version: !ruby/object:Gem::Requirement
279
+ none: false
280
+ requirements:
281
+ - - ! '>='
282
+ - !ruby/object:Gem::Version
283
+ version: '0'
284
+ segments:
285
+ - 0
286
+ hash: -3892874286345610021
287
+ required_rubygems_version: !ruby/object:Gem::Requirement
288
+ none: false
289
+ requirements:
290
+ - - ! '>='
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
293
+ requirements: []
294
+ rubyforge_project:
295
+ rubygems_version: 1.8.25
296
+ signing_key:
297
+ specification_version: 3
298
+ summary: Simplified ActiveRecord data migrations between app instances
299
+ test_files: []