config_scripts 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e82cdbad99dab608fa83f34a745b56777259ab2b
4
- data.tar.gz: 37dc15c3bd6d16d396cde24dc92300088a07af18
3
+ metadata.gz: a161b59fb0e28a4b36f776dc7c544cee24713e44
4
+ data.tar.gz: c927b4b738d5fae4c9b48ae89c422c2feaea9dbc
5
5
  SHA512:
6
- metadata.gz: 51cd44bd284762c00fc92df25e5f8d427999b5daa8eac0cacafdf3cde9d1e22273c549162f987a6c3500f54f3acd8670f2c061d9055e98930ba730dfb6191c80
7
- data.tar.gz: 8a6e8dc9c8b05a67f974b0cc4aad9b38d51bc4b50e61732d14ab4ec89793935a9edf75a9aece1b6eb4e3c386e06cfbf9b177dd9843efb8341af78058c1ee3911
6
+ metadata.gz: 3ee4b06ae66ba9c16a0a538116d950d6af3fcf175e7922e5700cd4b29b9c0be2f07c8abbd01005ca771f80d42ba904cf4c0255c325b15818a1922908df9f1f81
7
+ data.tar.gz: df3d33f6d667d3840c1dc1babd22b5d2f00627416b22fe18c1da142d407131b3e5325247e38d23dd3fd5327bb93dfcb5a61fdcd1b0d4096b4b2459345c132c37
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # Version 0.4.4 - 20 May 2014
2
+
3
+ * Adds the ability to remove default scopes when reading and writing seeds
4
+ * Adds more error messaging when a seed entry cannot be read
5
+
1
6
  # Version 0.4.3 - 24 April 2014
2
7
 
3
8
  * Ensures the config scripts run in alphabetical order by filename,
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- config_scripts (0.4.3)
4
+ config_scripts (0.4.4)
5
5
  rails (> 3.0.0)
6
6
 
7
7
  GEM
@@ -153,6 +153,7 @@ module ConfigScripts
153
153
  @folder = folder || @name
154
154
  @options = options
155
155
  @seed_types = {}
156
+ @unscoped_classes = []
156
157
  self.instance_eval(&block) if block_given?
157
158
  ConfigScripts::Seeds::SeedSet.register_seed_set(self)
158
159
  end
@@ -164,29 +165,61 @@ module ConfigScripts
164
165
  # It will create the folder and then write the file for each seed type
165
166
  # that has been defined.
166
167
  def write
167
- folder_path = Rails.root.join('db', 'seeds', 'data', self.folder)
168
- FileUtils.mkdir_p(folder_path)
169
- puts "Writing seeds for #{self.name} to #{folder_path}"
170
- self.seed_types.each do |klass, seed_type|
171
- seed_type.write_to_folder(folder_path)
168
+ self.write_with_unscoped(@unscoped_classes)
169
+ end
170
+
171
+ # This method writes the data for this seed set to its seed folder.
172
+ #
173
+ # It will remove all default scopes from the classes provided before doing the write.
174
+ #
175
+ # @param [Array<Class>] unscoped_classes
176
+ # The classes whose scopes we will remove.
177
+ def write_with_unscoped(unscoped_classes)
178
+ if unscoped_classes.any?
179
+ unscoped_classes.first.unscoped do
180
+ self.write_with_unscoped(unscoped_classes[1..-1])
181
+ end
182
+ else
183
+ folder_path = Rails.root.join('db', 'seeds', 'data', self.folder)
184
+ FileUtils.mkdir_p(folder_path)
185
+ puts "Writing seeds for #{self.name} to #{folder_path}"
186
+ self.seed_types.each do |klass, seed_type|
187
+ seed_type.write_to_folder(folder_path)
188
+ end
172
189
  end
173
190
  end
174
191
 
175
192
  # This method reads the data for this seed set from its seed folder.
176
193
  #
177
- # @param [Boolean] reset
178
- # Whether we should reset the existing records before loading the seeds.
179
- #
180
194
  # It will load the data for each seed type's file, enclosing all the
181
195
  # seed types in a transaction block.
196
+ #
197
+ # @param [Boolean] reset
198
+ # Whether we should reset the existing records before loading the seeds.
182
199
  def read(reset=false)
183
- folder_path = Rails.root.join('db', 'seeds', 'data', self.folder)
184
- FileUtils.mkdir_p(folder_path)
185
- puts "Reading seeds for #{self.name} from #{folder_path}"
186
- ActiveRecord::Base.transaction do
187
- self.reset_records if reset
188
- self.seed_types.each do |klass, seed_type|
189
- seed_type.read_from_folder(folder_path)
200
+ self.read_with_unscoped(reset, @unscoped_classes)
201
+ end
202
+
203
+ # This method reads the data for this seed set from its seed folder.
204
+ #
205
+ # @param [Boolean] reset
206
+ # Whether we should reset the existing records before loading the seeds.
207
+ #
208
+ # @param [Array<Class>] unscoped_classes
209
+ # The classes that we need to remove default scopes from before loading
210
+ # the seeds.
211
+ def read_with_unscoped(reset, unscoped_classes)
212
+ if unscoped_classes.any?
213
+ unscoped_classes.first.unscoped { self.read_with_unscoped(reset, unscoped_classes[1..-1]) }
214
+ else
215
+ folder_path = Rails.root.join('db', 'seeds', 'data', self.folder)
216
+ FileUtils.mkdir_p(folder_path)
217
+ puts "Reading seeds for #{self.name} from #{folder_path}"
218
+ ActiveRecord::Base.transaction do
219
+ self.reset_records if reset
220
+ self.seed_types.each do |klass, seed_type|
221
+ seed_type.read_from_folder(folder_path)
222
+ end
190
223
  end
191
224
  end
192
225
  end
@@ -229,6 +262,17 @@ module ConfigScripts
229
262
  @reset_block = block
230
263
  end
231
264
 
265
+ # This method specifies classes that will be unscoped when writing the seed data.
266
+ #
267
+ # @param [Array<Class>] classes
268
+ # The classes to unscope.
269
+ #
270
+ # @return [Array<Class>]
271
+ # The new list of unscoped classes.
272
+ def unscope(*classes)
273
+ @unscoped_classes += classes
274
+ end
275
+
232
276
  # @!group Seed Identifiers
233
277
 
234
278
  # This method gets a seed type that we have on file for a class.
@@ -204,6 +204,7 @@ module ConfigScripts
204
204
  record.save!
205
205
  rescue
206
206
  puts "#{self.filename}.csv"
207
+ puts "#{row}"
207
208
  raise
208
209
  end
209
210
  end
@@ -350,7 +351,7 @@ module ConfigScripts
350
351
  # The record
351
352
  def record_for_seed_identifier(identifier)
352
353
  return nil if identifier.blank?
353
- records = self.all
354
+ records = self.items
354
355
  self.identifier_attributes.each_with_index do |attribute, index|
355
356
  if self.associations.has_key?(attribute)
356
357
  value = self.read_value_for_association(attribute, identifier)
@@ -1,4 +1,4 @@
1
1
  module ConfigScripts
2
2
  # The current version of the library.
3
- VERSION = "0.4.3"
3
+ VERSION = "0.4.4"
4
4
  end
@@ -1,2 +1,3 @@
1
1
  class HairColor < ActiveRecord::Base
2
+ has_many :people
2
3
  end
@@ -1,4 +1,6 @@
1
1
  class Person < ActiveRecord::Base
2
2
  belongs_to :hair_color
3
3
  belongs_to :scope, polymorphic: true
4
+
5
+ default_scope { where archived: false }
4
6
  end
@@ -0,0 +1,5 @@
1
+ class AddArchivedToPeople < ActiveRecord::Migration
2
+ def change
3
+ add_column :people, :archived, :boolean, null: false, default: false
4
+ end
5
+ end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended that you check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(version: 20140209132911) do
14
+ ActiveRecord::Schema.define(version: 20140520061856) do
15
15
 
16
16
  create_table "config_scripts", force: true do |t|
17
17
  t.string "name"
@@ -31,6 +31,7 @@ ActiveRecord::Schema.define(version: 20140209132911) do
31
31
  t.integer "hair_color_id"
32
32
  t.string "scope_type"
33
33
  t.integer "scope_id"
34
+ t.boolean "archived", default: false, null: false
34
35
  end
35
36
 
36
37
  add_index "people", ["hair_color_id"], name: "index_people_on_hair_color_id"
@@ -106,23 +106,59 @@ describe ConfigScripts::Seeds::SeedSet do
106
106
  set.stub :seed_types => {Person: seed_type}
107
107
  seed_type.stub write_to_folder: nil, read_from_folder: true
108
108
  set.stub :puts
109
+ Person.create(name: 'John', archived: true)
110
+ Person.create(name: 'Jane', archived: false)
109
111
  end
110
112
 
111
113
  describe "write" do
112
- before do
113
- set.write
114
- end
114
+ context do
115
+ before do
116
+ set.write
117
+ end
118
+
119
+ it "creates the seed folder" do
120
+ expect(FileUtils).to have_received(:mkdir_p).with(seed_folder)
121
+ end
115
122
 
116
- it "creates the seed folder" do
117
- expect(FileUtils).to have_received(:mkdir_p).with(seed_folder)
123
+ it "writes all of the seed types to the folder" do
124
+ expect(seed_type).to have_received(:write_to_folder).with(seed_folder)
125
+ end
126
+
127
+ it "says where it's writing the seeds to" do
128
+ expect(set).to have_received(:puts).with("Writing seeds for test_seeds to #{seed_folder}")
129
+ end
118
130
  end
119
131
 
120
- it "writes all of the seed types to the folder" do
121
- expect(seed_type).to have_received(:write_to_folder).with(seed_folder)
132
+ context "with no unscoped seed types" do
133
+ it "does not see records filtered out by a default scope" do
134
+ seed_type.stub :write_to_folder do
135
+ expect(Person.count).to eq 1
136
+ end
137
+ set.write
138
+ end
122
139
  end
123
140
 
124
- it "says where it's writing the seeds to" do
125
- expect(set).to have_received(:puts).with("Writing seeds for test_seeds to #{seed_folder}")
141
+ context "with unscoped seed types" do
142
+ before do
143
+ set.unscope Person
144
+ end
145
+
146
+ it "sees records filtered out by a default scope" do
147
+ seed_type.stub :write_to_folder do
148
+ expect(Person.count).to eq 2
149
+ end
150
+ set.write
151
+ end
152
+
153
+ it "sees records filtered out by a default scope in associations" do
154
+ hair_color = HairColor.create!(color: 'blonde')
155
+ Person.unscoped.first.update_attributes(hair_color: hair_color)
156
+ expect(hair_color.people.count).to eq 0
157
+ seed_type.stub :write_to_folder do
158
+ expect(hair_color.people.count).to eq 1
159
+ end
160
+ set.write
161
+ end
126
162
  end
127
163
  end
128
164
 
@@ -149,6 +185,28 @@ describe ConfigScripts::Seeds::SeedSet do
149
185
  end
150
186
  end
151
187
 
188
+ context "with no unscoped seed types" do
189
+ it "does not see records filtered out by a default scope" do
190
+ seed_type.stub :read_from_folder do
191
+ expect(Person.count).to eq 1
192
+ end
193
+ set.read
194
+ end
195
+ end
196
+
197
+ context "with unscoped seed types" do
198
+ before do
199
+ set.unscope Person
200
+ end
201
+
202
+ it "sees records filtered out by a default scope" do
203
+ seed_type.stub :read_from_folder do
204
+ expect(Person.count).to eq 2
205
+ end
206
+ set.read
207
+ end
208
+ end
209
+
152
210
  context "when resetting" do
153
211
  it "resets the records" do
154
212
  set.read(true)
@@ -238,6 +296,18 @@ describe ConfigScripts::Seeds::SeedSet do
238
296
  expect(value).to eq 1
239
297
  end
240
298
  end
299
+
300
+ describe "unscoped" do
301
+ let(:set) { ConfigScripts::Seeds::SeedSet.new('test_seeds', 1) }
302
+
303
+ it "adds the arguments to the list" do
304
+ expect(set.instance_variable_get("@unscoped_classes")).to eq []
305
+ set.unscope String
306
+ expect(set.instance_variable_get("@unscoped_classes")).to eq [String]
307
+ set.unscope Person, HairColor
308
+ expect(set.instance_variable_get("@unscoped_classes")).to eq [String, Person, HairColor]
309
+ end
310
+ end
241
311
  end
242
312
 
243
313
  describe "seed identifiers" do
@@ -199,8 +199,13 @@ describe ConfigScripts::Seeds::SeedType do
199
199
  end
200
200
 
201
201
  it "outputs the problem file name" do
202
- expect($stdout).to receive(:puts).with('people.csv')
203
202
  expect{ subject }.to raise_error
203
+ expect($stdout).to have_received(:puts).with('people.csv')
204
+ end
205
+
206
+ it "outputs the problem row" do
207
+ expect{subject}.to raise_error
208
+ expect($stdout).to have_received(:puts).with('{"name"=>"a", "hair_color"=>"b"}')
204
209
  end
205
210
  end
206
211
 
@@ -358,6 +363,17 @@ describe ConfigScripts::Seeds::SeedType do
358
363
  it "gets the records by applying the scope" do
359
364
  expect(subject).to eq [person2, person1]
360
365
  end
366
+
367
+ it "does not include a record filtered out by a default scope" do
368
+ person2.update_attributes archived: true
369
+ expect(subject).not_to include person2
370
+ end
371
+
372
+ it "allows using the unscoped method to filter out records by a scope" do
373
+ seed_type.has_scope :unscoped
374
+ person2.update_attributes archived: true
375
+ expect(subject).to include person2
376
+ end
361
377
  end
362
378
 
363
379
  describe "options" do
@@ -414,6 +430,28 @@ describe ConfigScripts::Seeds::SeedType do
414
430
  end
415
431
  end
416
432
 
433
+ context "with a record that is filtered out by a default scope" do
434
+ let(:identifier) { ['Jim'] }
435
+ before do
436
+ seed_type.has_identifier_attributes :name
437
+ person3.update_attributes archived: true, name: 'Jim'
438
+ end
439
+
440
+ context "when the scope is in place" do
441
+ it "does not find the record" do
442
+ expect(subject).to be_nil
443
+ end
444
+ end
445
+
446
+ context "when it is unscoped" do
447
+ it "finds the record" do
448
+ seed_type.has_scope :unscoped
449
+ expect(subject).to eq person3
450
+ end
451
+ end
452
+ end
453
+
454
+
417
455
  context "with a multi-field reference to another record" do
418
456
  let(:identifier) { ['red','FF0000','John'] }
419
457
 
metadata CHANGED
@@ -1,153 +1,153 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: config_scripts
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Brownlee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-25 00:00:00.000000000 Z
11
+ date: 2014-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>'
17
+ - - ">"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 3.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>'
24
+ - - ">"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: yard
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: simplecov
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: sqlite3
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: timecop
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '>='
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '>='
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: generator_spec
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - '>='
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - '>='
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rspec-rails
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - '>='
143
+ - - ">="
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - '>='
150
+ - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  description: Library for creating trackable config scripts, and reading and writing
@@ -158,9 +158,9 @@ executables: []
158
158
  extensions: []
159
159
  extra_rdoc_files: []
160
160
  files:
161
- - .gitignore
162
- - .rspec
163
- - .yardopts
161
+ - ".gitignore"
162
+ - ".rspec"
163
+ - ".yardopts"
164
164
  - CHANGELOG.md
165
165
  - Gemfile
166
166
  - Gemfile.lock
@@ -223,6 +223,7 @@ files:
223
223
  - spec/dummy/db/migrate/20140208182101_add_hair_color_to_person.rb
224
224
  - spec/dummy/db/migrate/20140208225801_add_scope_to_people.rb
225
225
  - spec/dummy/db/migrate/20140209132911_add_hex_value_to_hair_color.rb
226
+ - spec/dummy/db/migrate/20140520061856_add_archived_to_people.rb
226
227
  - spec/dummy/db/schema.rb
227
228
  - spec/dummy/lib/assets/.keep
228
229
  - spec/dummy/log/.keep
@@ -250,17 +251,17 @@ require_paths:
250
251
  - lib
251
252
  required_ruby_version: !ruby/object:Gem::Requirement
252
253
  requirements:
253
- - - '>='
254
+ - - ">="
254
255
  - !ruby/object:Gem::Version
255
256
  version: '0'
256
257
  required_rubygems_version: !ruby/object:Gem::Requirement
257
258
  requirements:
258
- - - '>='
259
+ - - ">="
259
260
  - !ruby/object:Gem::Version
260
261
  version: '0'
261
262
  requirements: []
262
263
  rubyforge_project:
263
- rubygems_version: 2.0.14
264
+ rubygems_version: 2.2.2
264
265
  signing_key:
265
266
  specification_version: 4
266
267
  summary: Config scripts and seed files for Rails
@@ -305,6 +306,7 @@ test_files:
305
306
  - spec/dummy/db/migrate/20140208182101_add_hair_color_to_person.rb
306
307
  - spec/dummy/db/migrate/20140208225801_add_scope_to_people.rb
307
308
  - spec/dummy/db/migrate/20140209132911_add_hex_value_to_hair_color.rb
309
+ - spec/dummy/db/migrate/20140520061856_add_archived_to_people.rb
308
310
  - spec/dummy/db/schema.rb
309
311
  - spec/dummy/lib/assets/.keep
310
312
  - spec/dummy/log/.keep