config_scripts 0.4.3 → 0.4.4

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.
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