sprig 0.1.4 → 0.1.5

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: 5fd26878690f5befbdc2cd52dc8723adbadfaf6c
4
- data.tar.gz: 6b0a87bad03c4958fcdd927079bac2c1acf64442
3
+ metadata.gz: c09e094cca99e32c1042adb111565a9f79f321f2
4
+ data.tar.gz: 056a2e3a6ac418608dbbbd99dd905f36b8d0b39b
5
5
  SHA512:
6
- metadata.gz: 6a9f637cd904135b5d7358a235ce8f9350775119a17ce9766eb3e7fea77e2252eff1f90d2cdb7197fe5a5e0e586033835788f3f94b5696d5c9b6b17004f47290
7
- data.tar.gz: fa856e5062d5893685b3fa2f9ccd866041d20ba95b8a7c8b722e4137c20b571a0b7f8b3b0d5bdea136fff5a08f55ff202c1ffe835a3047242c1b559ad64eb373
6
+ metadata.gz: 694d572f95471fde7c7141d97c5e4cd86826791a61e6cd833fd5c54094cb63273ca7d157756c248de35e5b2b5fb35891a4b6bc9064749867a72cdb6c98115879
7
+ data.tar.gz: 3c3bd1e7530e21baec6cf9b616d271a05aa4ce1fbd2263d5404229121d391778f745113cb4293d8da6bcf2c3a67429b8ba44f9b303329d4d386008fb42bf4154
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ![Sprig](http://i.imgur.com/XCu3iVO.png)
2
2
 
3
- [![Code Climate](https://codeclimate.com/github/vigetlabs/sprig.png)](https://codeclimate.com/github/vigetlabs/sprig) [![Build Status](https://travis-ci.org/vigetlabs/sprig.png?branch=master)](https://travis-ci.org/vigetlabs/sprig) [![Gem Version](https://badge.fury.io/rb/sprig.png)](http://badge.fury.io/rb/sprig)
3
+ [![Code Climate](https://codeclimate.com/github/vigetlabs/sprig.png)](https://codeclimate.com/github/vigetlabs/sprig) [![Coverage Status](https://coveralls.io/repos/vigetlabs/sprig/badge.png)](https://coveralls.io/r/vigetlabs/sprig) [![Build Status](https://travis-ci.org/vigetlabs/sprig.png?branch=master)](https://travis-ci.org/vigetlabs/sprig) [![Gem Version](https://badge.fury.io/rb/sprig.png)](http://badge.fury.io/rb/sprig)
4
4
 
5
5
  Seed Rails application by convention, not configuration.
6
6
 
@@ -33,9 +33,6 @@ module Sprig
33
33
  raise ArgumentError, 'First argument must be a Class.' unless klass.is_a?(Class)
34
34
 
35
35
  klass
36
- rescue NameError => e
37
- raise NameError, e.message
38
- #TODO: rescue bad class references
39
36
  end
40
37
 
41
38
  def self.collection
@@ -7,7 +7,7 @@ module Sprig
7
7
  case
8
8
  when args.is_a?(Hash)
9
9
  args
10
- when args < ActiveRecord::Base
10
+ when args.is_a?(Class) && args < ActiveRecord::Base
11
11
  { :class => args }
12
12
  else
13
13
  raise ArgumentError, argument_error_message
data/lib/sprig/helpers.rb CHANGED
@@ -4,10 +4,6 @@ module Sprig
4
4
  Sprig.configuration.directory
5
5
  end
6
6
 
7
- def sprig_environment
8
- Rails.env #TODO: make customizable
9
- end
10
-
11
7
  def sprig(directive_definitions)
12
8
  hopper = []
13
9
  DirectiveList.new(directive_definitions).add_seeds_to_hopper(hopper)
@@ -48,10 +48,6 @@ module Sprig
48
48
  def options
49
49
  @options ||= datasource.options.merge(initial_options)
50
50
  end
51
-
52
- def data
53
- @data ||= datasource.to_hash
54
- end
55
51
  end
56
52
  end
57
53
  end
data/lib/sprig/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sprig
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
Binary file
@@ -1,2 +1,7 @@
1
1
  class Post < ActiveRecord::Base
2
+
3
+ def photo=(file)
4
+ write_attribute(:photo, File.basename(file.path))
5
+ end
6
+
2
7
  end
@@ -1,5 +1,3 @@
1
- # posts.yml
2
-
3
1
  records:
4
2
  - sprig_id: 1
5
3
  title: 'Staging yaml title'
@@ -1,5 +1,3 @@
1
- # comments.yml
2
-
3
1
  records:
4
2
  - sprig_id: 1
5
3
  post_id: "<%= sprig_record(Post, 1).id %>"
@@ -1,5 +1,3 @@
1
- # users.yml
2
-
3
1
  records:
4
2
  - sprig_id: 1
5
3
  first_name: "Clark"
@@ -1,5 +1,3 @@
1
- # posts.yml
2
-
3
1
  records:
4
2
  - sprig_id: 'l_1'
5
3
  title: 'Legacy yaml title'
@@ -0,0 +1,5 @@
1
+ # Posts
2
+
3
+ - Post 1
4
+ - Post 2
5
+ - Post 3
@@ -1,5 +1,3 @@
1
- # posts.yml
2
-
3
1
  records:
4
2
  - sprig_id: 1
5
3
  title: 'Yaml title'
@@ -0,0 +1,7 @@
1
+ options:
2
+ delete_existing_by: 'title'
3
+
4
+ records:
5
+ - sprig_id: 1
6
+ title: 'Such Title'
7
+ content: 'New content'
@@ -0,0 +1,7 @@
1
+ options:
2
+ find_existing_by: 'unicorn'
3
+
4
+ records:
5
+ - sprig_id: 1
6
+ title: 'Existing title'
7
+ content: 'Updated content'
@@ -1,4 +1,3 @@
1
- # posts_find_existing_by_multiples.yml
2
1
  options:
3
2
  find_existing_by: ['title', 'content']
4
3
 
@@ -1,4 +1,3 @@
1
- # posts_find_existing_by_single.yml
2
1
  options:
3
2
  find_existing_by: 'title'
4
3
 
@@ -1,5 +1,3 @@
1
- # posts_missing_dependency.yml
2
-
3
1
  records:
4
2
  - sprig_id: 1
5
3
  title: 'Yaml title'
@@ -1,5 +1,3 @@
1
- # posts_missing_dependency.yml
2
-
3
1
  records:
4
2
  - sprig_id: 1
5
3
  title: 'Yaml title'
@@ -0,0 +1,4 @@
1
+ records:
2
+ - sprig_id: 1
3
+ title: "Title"
4
+ content: "<%= sprig_record(Comment, 1) %>"
@@ -0,0 +1,5 @@
1
+ records:
2
+ - sprig_id: 1
3
+ title: 'Staging yaml title'
4
+ content: 'Staging yaml content'
5
+ photo: '<%= sprig_file("cat.png") %>'
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sprig::Parser::Base do
4
+ describe "#parse" do
5
+ it "enforces implementation in a subclass" do
6
+ expect {
7
+ described_class.new('data').parse
8
+ }.to raise_error(NotImplementedError)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sprig::NullRecord do
4
+ let(:error_msg) { 'Something bad happened.' }
5
+ subject { described_class.new(error_msg) }
6
+
7
+ describe "#new" do
8
+ it "logs an error upon initialization" do
9
+ log_should_receive(:error, with: "#{error_msg} (Substituted with NullRecord)")
10
+
11
+ subject
12
+ end
13
+ end
14
+
15
+ describe "#method_missing" do
16
+ it "returns nil for undefined method calls" do
17
+ subject.enhance_your_calm.should == nil
18
+ end
19
+ end
20
+
21
+ it_behaves_like "a logging entity" do
22
+ subject! { described_class.new(error_msg) }
23
+ end
24
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,11 @@
1
1
  ENV["RAILS_ENV"] ||= 'test'
2
2
 
3
+ require 'simplecov'
4
+ require 'coveralls'
5
+
6
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
7
+ SimpleCov.start "rails"
8
+
3
9
  require "rails"
4
10
  require "active_record"
5
11
  require "database_cleaner"
@@ -47,7 +53,7 @@ User.connection.execute "DROP TABLE IF EXISTS users;"
47
53
  User.connection.execute "CREATE TABLE users (id INTEGER PRIMARY KEY , first_name VARCHAR(255), last_name VARCHAR(255), type VARCHAR(255));"
48
54
 
49
55
  Post.connection.execute "DROP TABLE IF EXISTS posts;"
50
- Post.connection.execute "CREATE TABLE posts (id INTEGER PRIMARY KEY , title VARCHAR(255), content VARCHAR(255), published BOOLEAN , user_id INTEGER);"
56
+ Post.connection.execute "CREATE TABLE posts (id INTEGER PRIMARY KEY AUTOINCREMENT, title VARCHAR(255), content VARCHAR(255), photo VARCHAR(255), published BOOLEAN , user_id INTEGER);"
51
57
 
52
58
  Comment.connection.execute "DROP TABLE IF EXISTS comments;"
53
59
  Comment.connection.execute "CREATE TABLE comments (id INTEGER PRIMARY KEY , post_id INTEGER, body VARCHAR(255));"
@@ -68,12 +74,16 @@ end
68
74
  def load_seeds(*files)
69
75
  env = Rails.env
70
76
 
77
+ `cp -R ./spec/fixtures/seeds/#{env}/files ./spec/fixtures/db/seeds/#{env}`
78
+
71
79
  files.each do |file|
72
80
  `cp ./spec/fixtures/seeds/#{env}/#{file} ./spec/fixtures/db/seeds/#{env}`
73
81
  end
74
82
 
75
83
  yield
76
84
 
85
+ `rm -R ./spec/fixtures/db/seeds/#{env}/files`
86
+
77
87
  files.each do |file|
78
88
  `rm ./spec/fixtures/db/seeds/#{env}/#{file}`
79
89
  end
data/spec/sprig_spec.rb CHANGED
@@ -60,6 +60,24 @@ describe "Seeding an application" do
60
60
  end
61
61
  end
62
62
 
63
+ context "with an invalid custom parser" do
64
+ around do |example|
65
+ load_seeds('posts.yml', &example)
66
+ end
67
+
68
+ it "fails with an argument error" do
69
+ expect {
70
+ sprig [
71
+ {
72
+ :class => Post,
73
+ :source => open('spec/fixtures/seeds/test/posts.yml'),
74
+ :parser => Object # Not a valid parser
75
+ }
76
+ ]
77
+ }.to raise_error(ArgumentError, 'Parsers must define #parse.')
78
+ end
79
+ end
80
+
63
81
  context "with a custom source" do
64
82
  around do |example|
65
83
  load_seeds('legacy_posts.yml', &example)
@@ -78,6 +96,31 @@ describe "Seeding an application" do
78
96
  end
79
97
  end
80
98
 
99
+ context "with a custom source that cannot be parsed by native parsers" do
100
+ around do |example|
101
+ load_seeds('posts.md', &example)
102
+ end
103
+
104
+ it "fails with an unparsable file error" do
105
+ expect {
106
+ sprig [
107
+ {
108
+ :class => Post,
109
+ :source => open('spec/fixtures/seeds/test/posts.md')
110
+ }
111
+ ]
112
+ }.to raise_error(Sprig::Source::ParserDeterminer::UnparsableFileError)
113
+ end
114
+ end
115
+
116
+ context "with an invalid custom source" do
117
+ it "fails with an argument error" do
118
+ expect {
119
+ sprig [ { :class => Post, :source => 42 } ]
120
+ }.to raise_error(ArgumentError, 'Data sources must act like an IO.')
121
+ end
122
+ end
123
+
81
124
  context "with multiple file relationships" do
82
125
  around do |example|
83
126
  load_seeds('posts.yml', 'comments.yml', &example)
@@ -92,6 +135,14 @@ describe "Seeding an application" do
92
135
  end
93
136
  end
94
137
 
138
+ context "with missing seed files" do
139
+ it "raises a missing file error" do
140
+ expect {
141
+ sprig [Post]
142
+ }.to raise_error(Sprig::Source::SourceDeterminer::FileNotFoundError)
143
+ end
144
+ end
145
+
95
146
  context "with a relationship to an undefined record" do
96
147
  around do |example|
97
148
  load_seeds('posts.yml', 'posts_missing_dependency.yml', &example)
@@ -166,8 +217,125 @@ describe "Seeding an application" do
166
217
  end
167
218
  end
168
219
 
220
+ context "with files defined as attributes" do
221
+ around do |example|
222
+ load_seeds('posts_with_files.yml', &example)
223
+ end
224
+
225
+ it "seeds the db" do
226
+ sprig [
227
+ {
228
+ :class => Post,
229
+ :source => open('spec/fixtures/seeds/test/posts_with_files.yml')
230
+ }
231
+ ]
232
+
233
+ Post.count.should == 1
234
+ Post.pluck(:photo).should =~ ['cat.png']
235
+ end
236
+ end
237
+
238
+ context "with cyclic dependencies" do
239
+ around do |example|
240
+ load_seeds('comments.yml', 'posts_with_cyclic_dependencies.yml', &example)
241
+ end
242
+
243
+ it "raises an cyclic dependency error" do
244
+ expect {
245
+ sprig [
246
+ {
247
+ :class => Post,
248
+ :source => open('spec/fixtures/seeds/test/posts_with_cyclic_dependencies.yml')
249
+ },
250
+ Comment
251
+ ]
252
+ }.to raise_error(Sprig::DependencySorter::CircularDependencyError)
253
+ end
254
+ end
255
+
256
+ context "with a malformed directive" do
257
+ let(:expected_error_message) { 'Sprig::Directive must be instantiated with an ActiveRecord subclass or a Hash with :class defined' }
258
+
259
+ context "including a class that is not a subclass of AR" do
260
+ it "raises an argument error" do
261
+ expect {
262
+ sprig [
263
+ Object
264
+ ]
265
+ }.to raise_error(ArgumentError, expected_error_message)
266
+ end
267
+ end
268
+
269
+ context "including a non-class, non-hash" do
270
+ it "raises an argument error" do
271
+ expect {
272
+ sprig [
273
+ 42
274
+ ]
275
+ }.to raise_error(ArgumentError, expected_error_message)
276
+ end
277
+ end
278
+ end
279
+
280
+
169
281
  context "with custom seed options" do
282
+ context "using delete_existing_by" do
283
+ around do |example|
284
+ load_seeds('posts_delete_existing_by.yml', &example)
285
+ end
286
+
287
+ context "with an existing record" do
288
+ let!(:existing_match) do
289
+ Post.create(
290
+ :title => "Such Title",
291
+ :content => "Old Content")
292
+ end
293
+
294
+ let!(:existing_nonmatch) do
295
+ Post.create(
296
+ :title => "Wow Title",
297
+ :content => "Much Content")
298
+ end
299
+
300
+ it "replaces only the matching existing record" do
301
+ sprig [
302
+ {
303
+ :class => Post,
304
+ :source => open("spec/fixtures/seeds/test/posts_delete_existing_by.yml")
305
+ }
306
+ ]
307
+
308
+ Post.count.should == 2
309
+
310
+ expect {
311
+ existing_match.reload
312
+ }.to raise_error(ActiveRecord::RecordNotFound)
313
+
314
+ expect {
315
+ existing_nonmatch.reload
316
+ }.to_not raise_error
317
+ end
318
+ end
319
+ end
320
+
170
321
  context "using find_existing_by" do
322
+ context "with a missing attribute" do
323
+ around do |example|
324
+ load_seeds('posts_find_existing_by_missing.yml', &example)
325
+ end
326
+
327
+ it "raises a missing attribute error" do
328
+ expect {
329
+ sprig [
330
+ {
331
+ :class => Post,
332
+ :source => open("spec/fixtures/seeds/test/posts_find_existing_by_missing.yml")
333
+ }
334
+ ]
335
+ }.to raise_error(Sprig::Seed::AttributeCollection::AttributeNotFoundError, "Attribute 'unicorn' is not present.")
336
+ end
337
+ end
338
+
171
339
  context "with a single attribute" do
172
340
  around do |example|
173
341
  load_seeds('posts.yml', 'posts_find_existing_by_single.yml', &example)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sprig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lawson Kurtz
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-06-17 00:00:00.000000000 Z
12
+ date: 2014-06-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -123,6 +123,34 @@ dependencies:
123
123
  - - '>='
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - '>='
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: coveralls
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - '>='
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
126
154
  description: Sprig is a library for managing interconnected, environment-specific
127
155
  seed data.
128
156
  email:
@@ -176,23 +204,31 @@ files:
176
204
  - spec/fixtures/models/user.rb
177
205
  - spec/fixtures/seeds/staging/posts.yml
178
206
  - spec/fixtures/seeds/test/comments.yml
207
+ - spec/fixtures/seeds/test/files/cat.png
179
208
  - spec/fixtures/seeds/test/invalid_users.yml
180
209
  - spec/fixtures/seeds/test/legacy_posts.yml
181
210
  - spec/fixtures/seeds/test/posts.csv
182
211
  - spec/fixtures/seeds/test/posts.json
212
+ - spec/fixtures/seeds/test/posts.md
183
213
  - spec/fixtures/seeds/test/posts.yml
214
+ - spec/fixtures/seeds/test/posts_delete_existing_by.yml
215
+ - spec/fixtures/seeds/test/posts_find_existing_by_missing.yml
184
216
  - spec/fixtures/seeds/test/posts_find_existing_by_multiple.yml
185
217
  - spec/fixtures/seeds/test/posts_find_existing_by_single.yml
186
218
  - spec/fixtures/seeds/test/posts_missing_dependency.yml
187
219
  - spec/fixtures/seeds/test/posts_missing_record.yml
220
+ - spec/fixtures/seeds/test/posts_with_cyclic_dependencies.yml
221
+ - spec/fixtures/seeds/test/posts_with_files.yml
188
222
  - spec/lib/generators/sprig/install_generator_spec.rb
189
223
  - spec/lib/sprig/configuration_spec.rb
190
224
  - spec/lib/sprig/directive_list_spec.rb
191
225
  - spec/lib/sprig/directive_spec.rb
192
226
  - spec/lib/sprig/null_record_spec.rb
227
+ - spec/lib/sprig/parser/base_spec.rb
193
228
  - spec/lib/sprig/process_notifier_spec.rb
194
229
  - spec/lib/sprig/seed/entry_spec.rb
195
230
  - spec/lib/sprig/seed/record_spec.rb
231
+ - spec/lib/sprig/source_spec.rb
196
232
  - spec/lib/sprig_spec.rb
197
233
  - spec/spec_helper.rb
198
234
  - spec/sprig_spec.rb
@@ -235,23 +271,31 @@ test_files:
235
271
  - spec/fixtures/models/user.rb
236
272
  - spec/fixtures/seeds/staging/posts.yml
237
273
  - spec/fixtures/seeds/test/comments.yml
274
+ - spec/fixtures/seeds/test/files/cat.png
238
275
  - spec/fixtures/seeds/test/invalid_users.yml
239
276
  - spec/fixtures/seeds/test/legacy_posts.yml
240
277
  - spec/fixtures/seeds/test/posts.csv
241
278
  - spec/fixtures/seeds/test/posts.json
279
+ - spec/fixtures/seeds/test/posts.md
242
280
  - spec/fixtures/seeds/test/posts.yml
281
+ - spec/fixtures/seeds/test/posts_delete_existing_by.yml
282
+ - spec/fixtures/seeds/test/posts_find_existing_by_missing.yml
243
283
  - spec/fixtures/seeds/test/posts_find_existing_by_multiple.yml
244
284
  - spec/fixtures/seeds/test/posts_find_existing_by_single.yml
245
285
  - spec/fixtures/seeds/test/posts_missing_dependency.yml
246
286
  - spec/fixtures/seeds/test/posts_missing_record.yml
287
+ - spec/fixtures/seeds/test/posts_with_cyclic_dependencies.yml
288
+ - spec/fixtures/seeds/test/posts_with_files.yml
247
289
  - spec/lib/generators/sprig/install_generator_spec.rb
248
290
  - spec/lib/sprig/configuration_spec.rb
249
291
  - spec/lib/sprig/directive_list_spec.rb
250
292
  - spec/lib/sprig/directive_spec.rb
251
293
  - spec/lib/sprig/null_record_spec.rb
294
+ - spec/lib/sprig/parser/base_spec.rb
252
295
  - spec/lib/sprig/process_notifier_spec.rb
253
296
  - spec/lib/sprig/seed/entry_spec.rb
254
297
  - spec/lib/sprig/seed/record_spec.rb
298
+ - spec/lib/sprig/source_spec.rb
255
299
  - spec/lib/sprig_spec.rb
256
300
  - spec/spec_helper.rb
257
301
  - spec/sprig_spec.rb