sprig-reap 0.0.6 → 0.0.7

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.
data/README.md CHANGED
@@ -35,17 +35,59 @@ after the STI base model. STI sub-type records will all be written to that file
35
35
 
36
36
  ### Additional Configuration
37
37
 
38
- Don't like the defaults when reaping Sprig::Reap records? You may specify the target environment
39
- (`db/seeds` target folder), models (`ActiveRecord::Base.subclasses`-only) you want seed files for,
40
- or any ignored attributes you don't want to show up in any of the seed files.
38
+ Don't like the defaults when reaping Sprig::Reap records? Change 'em!
41
39
 
40
+ #### Target Environment
41
+ You may specify the target environment (`db/seeds` target folder):
42
42
  ```
43
43
  # Rake Task
44
- rake db:seed:reap TARGET_ENV=integration MODELS=User,Post IGNORED_ATTRS=created_at,updated_at
44
+ rake db:seed:reap TARGET_ENV=integration
45
45
 
46
46
  # Rails Console
47
- Sprig.reap(target_env: 'integration', models: [User, Post], ignored_attrs: [:created_at,
48
- :updated_at])
47
+ Sprig.reap(target_env: 'integration')
48
+ ```
49
+
50
+ #### Model List
51
+ If you only want to `reap` a subset of your models, you may provide a list of models
52
+ (`ActiveRecord::Base.subclasses`-only) you want seed files for:
53
+ ```
54
+ # Rake Task
55
+ rake db:seed:reap MODELS=User,Post
56
+
57
+ # Rails Console
58
+ Sprig.reap(models: [User, Post])
59
+ ```
60
+
61
+ #### Ignored Attributes
62
+ If there are any ignored attributes you don't want to show up in any of the seed files, let `reap`
63
+ know:
64
+ ```
65
+ # Rake Task
66
+ rake db:seed:reap IGNORED_ATTRS=created_at,updated_at
67
+
68
+ # Rails Console
69
+ Sprig.reap(ignored_attrs: [:created_at, :updated_at])
70
+ ```
71
+
72
+ #### Omitting Empty Attributes
73
+ If you have models with lots of attributes that could potentially be `nil`/empty, the resulting seed
74
+ files could get cluttered with all the `nil` values. Remove them from your seed files with:
75
+ ```
76
+ # Rake Task
77
+ rake db:seed:reap OMIT_EMPTY_ATTRS=true
78
+
79
+ # Rails Console
80
+ Sprig.reap(omit_empty_attrs: true)
81
+ ```
82
+
83
+ #### Combine Them All!
84
+ You're free to take or leave as many options as you'd like:
85
+ ```
86
+ # Rake Task
87
+ rake db:seed:reap TARGET_ENV=integration MODELS=User,Post IGNORED_ATTRS=created_at,updated_at OMIT_EMPTY_ATTRS=true
88
+
89
+ # Rails Console
90
+ Sprig.reap(target_env: 'integration', models: [User, Post], ignored_attrs: [:created_at, :updated_at], omit_empty_attrs: true)
49
91
  ```
50
92
 
51
93
  ### Adding to Existing Seed Files (`.yaml` only)
@@ -9,18 +9,26 @@ module Sprig::Reap
9
9
  autoload :Record, 'sprig/reap/record'
10
10
  autoload :SeedFile, 'sprig/reap/seed_file'
11
11
  autoload :FileAttribute, 'sprig/reap/file_attribute'
12
+ autoload :Logging, 'sprig/reap/logging'
13
+
14
+ extend Logging
12
15
 
13
16
  class << self
14
17
  def reap(input = {})
15
18
  options = input.to_hash
16
19
 
17
20
  configure do |config|
18
- config.target_env = options[:target_env] || options['TARGET_ENV']
19
- config.classes = options[:models] || options['MODELS']
20
- config.ignored_attrs = options[:ignored_attrs] || options['IGNORED_ATTRS']
21
+ config.target_env = options[:target_env] || options['TARGET_ENV']
22
+ config.classes = options[:models] || options['MODELS']
23
+ config.ignored_attrs = options[:ignored_attrs] || options['IGNORED_ATTRS']
24
+ config.omit_empty_attrs = options[:omit_empty_attrs] || options['OMIT_EMPTY_ATTRS']
21
25
  end
22
26
 
27
+ log_debug "Reaping records from the database...\r"
28
+
23
29
  Model.all.each { |model| SeedFile.new(model).write }
30
+
31
+ log_debug "Finished reaping!"
24
32
  end
25
33
 
26
34
  def clear_config
@@ -34,6 +42,8 @@ module Sprig::Reap
34
42
  delegate :target_env,
35
43
  :classes,
36
44
  :ignored_attrs,
45
+ :logger,
46
+ :omit_empty_attrs,
37
47
  to: :configuration
38
48
 
39
49
  def configuration
@@ -29,6 +29,18 @@ module Sprig::Reap
29
29
  @ignored_attrs = parse_ignored_attrs_from(input)
30
30
  end
31
31
 
32
+ def logger
33
+ @logger ||= Logger.new($stdout)
34
+ end
35
+
36
+ def omit_empty_attrs
37
+ @omit_empty_attrs ||= false
38
+ end
39
+
40
+ def omit_empty_attrs=(input)
41
+ @omit_empty_attrs = true if String(input).strip.downcase == 'true'
42
+ end
43
+
32
44
  private
33
45
 
34
46
  def valid_classes
@@ -0,0 +1,35 @@
1
+ module Sprig::Reap
2
+ module Logging
3
+ LOG_LEVELS = {
4
+ debug: :blue,
5
+ info: :green,
6
+ warn: :orange,
7
+ error: :red
8
+ }
9
+
10
+ LOG_COLORS = {
11
+ blue: 34,
12
+ green: 32,
13
+ orange: 33,
14
+ red: 31
15
+ }
16
+
17
+ LOG_LEVELS.each do |level, color|
18
+ define_method("log_#{level}") do |message|
19
+ Sprig::Reap.logger.send(level, send(color, message.to_s))
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def colorize(message, color_code)
26
+ "\e[#{color_code}m#{message}\e[0m"
27
+ end
28
+
29
+ LOG_COLORS.each do |name, color_code|
30
+ define_method(name) do |message|
31
+ colorize(message, color_code)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,5 +1,7 @@
1
1
  module Sprig::Reap
2
2
  class Model
3
+ include Logging
4
+
3
5
  def self.all
4
6
  @@all ||= begin
5
7
  models = Sprig::Reap.classes.map { |klass| new(klass) }
@@ -52,6 +54,8 @@ module Sprig::Reap
52
54
  end
53
55
 
54
56
  def to_yaml(options = {})
57
+ return if records.empty?
58
+
55
59
  namespace = options[:namespace]
56
60
  formatted_records = records.map(&:to_hash)
57
61
 
@@ -66,6 +70,9 @@ module Sprig::Reap
66
70
 
67
71
  def records
68
72
  @records ||= klass.all.map { |record| Record.new(record, self) }
73
+ rescue
74
+ log_error "Encountered an error when pulling the database records for #{to_s}...\r"
75
+ []
69
76
  end
70
77
 
71
78
  private
@@ -16,7 +16,13 @@ module Sprig::Reap
16
16
 
17
17
  def to_hash
18
18
  attributes.reduce({"sprig_id" => sprig_id}) do |hash, attr|
19
- hash.merge(attr => get_value_for(attr))
19
+ value = get_value_for(attr)
20
+
21
+ if Sprig::Reap.omit_empty_attrs && value.nil?
22
+ hash
23
+ else
24
+ hash.merge(attr => value)
25
+ end
20
26
  end
21
27
  end
22
28
 
@@ -1,5 +1,7 @@
1
1
  module Sprig::Reap
2
2
  class SeedFile
3
+ include Logging
4
+
3
5
  DEFAULT_NAMESPACE = 'records'
4
6
 
5
7
  attr_reader :model
@@ -21,6 +23,7 @@ module Sprig::Reap
21
23
  def write
22
24
  initialize_file do |file, namespace|
23
25
  file.write model.to_yaml(:namespace => namespace)
26
+ log_info "Successfully reaped records for #{model}...\r"
24
27
  end
25
28
  end
26
29
 
@@ -41,6 +44,9 @@ module Sprig::Reap
41
44
 
42
45
  yield file, namespace
43
46
  end
47
+
48
+ rescue
49
+ log_error "There was an issue writing to the file for #{model}...\r"
44
50
  end
45
51
 
46
52
  def existing_sprig_ids(yaml)
@@ -1,5 +1,5 @@
1
1
  module Sprig
2
2
  module Reap
3
- VERSION = "0.0.6"
3
+ VERSION = "0.0.7"
4
4
  end
5
5
  end
Binary file
@@ -127,7 +127,7 @@ describe Sprig::Reap::Configuration do
127
127
 
128
128
  describe "#ignored_attrs=" do
129
129
  context "when given nil" do
130
- before { subject.classes = nil }
130
+ before { subject.ignored_attrs = nil }
131
131
 
132
132
  its(:ignored_attrs) { should == [] }
133
133
  end
@@ -144,4 +144,38 @@ describe Sprig::Reap::Configuration do
144
144
  its(:ignored_attrs) { should == ['shaka', 'laka'] }
145
145
  end
146
146
  end
147
+
148
+ <<<<<<< HEAD
149
+ describe "#logger" do
150
+ it "initializes a new logger" do
151
+ Logger.should_receive(:new)
152
+
153
+ subject.logger
154
+ =======
155
+ describe "#omit_empty_attrs" do
156
+ context "from a fresh configuration" do
157
+ its(:omit_empty_attrs) { should == false }
158
+ end
159
+ end
160
+
161
+ describe "#omit_empty_attrs" do
162
+ context "when given nil" do
163
+ before { subject.omit_empty_attrs = nil }
164
+
165
+ its(:omit_empty_attrs) { should == false }
166
+ end
167
+
168
+ context "when given a word other than true" do
169
+ before { subject.omit_empty_attrs = ' Shaboosh' }
170
+
171
+ its(:omit_empty_attrs) { should == false }
172
+ end
173
+
174
+ context "when given true" do
175
+ before { subject.omit_empty_attrs = 'True' }
176
+
177
+ its(:omit_empty_attrs) { should == true }
178
+ >>>>>>> Add an option to allow users to omit empty attributes from seed files (fix #9)
179
+ end
180
+ end
147
181
  end
@@ -168,6 +168,42 @@ describe Sprig::Reap::Model do
168
168
  subject.to_yaml.should == yaml_from_file('polymorphic_vote_record.yml')
169
169
  end
170
170
  end
171
+
172
+ context "when there are no records for a given model" do
173
+ subject { described_class.new(Vote) }
174
+
175
+ its(:to_yaml) { should == nil }
176
+ end
177
+ end
178
+
179
+ describe "#records" do
180
+ let!(:post1) { Post.create }
181
+ let!(:post2) { Post.create }
182
+ let(:record) { double('Sprig::Reap::Record') }
183
+
184
+ subject { described_class.new(Post) }
185
+
186
+ before do
187
+ Sprig::Reap::Record.stub(:new).and_return(record)
188
+ end
189
+
190
+ its(:records) { should == [record, record] }
191
+
192
+ context "when there's an error accessing the database table for a given model" do
193
+ before do
194
+ Post.stub(:all).and_raise(StandardError)
195
+ end
196
+
197
+ it "logs an error message" do
198
+ log_should_receive :error, :with => "Encountered an error when pulling the database records for Post...\r"
199
+
200
+ subject.records
201
+ end
202
+
203
+ it "sets records to an empty array" do
204
+ subject.records.should == []
205
+ end
206
+ end
171
207
  end
172
208
 
173
209
  def yaml_from_file(basename)
@@ -100,9 +100,21 @@ describe Sprig::Reap::Record do
100
100
  }
101
101
  end
102
102
  end
103
- end
104
103
 
105
- describe "#local_file_for" do
104
+ context "when Sprig::Reap is configured to omit empty attributes" do
105
+ subject { described_class.new(posterless_post, model) }
106
+
107
+ before { Sprig::Reap.stub(:omit_empty_attrs).and_return(true) }
108
+
109
+ it "removes empty attributes from the resulting hash" do
110
+ subject.to_hash.should == {
111
+ 'sprig_id' => posterless_post.id,
112
+ 'title' => 'Wow Title',
113
+ 'content' => 'Much Content',
114
+ 'published' => false
115
+ }
116
+ end
117
+ end
106
118
  end
107
119
 
108
120
  describe "#sprig_id" do
@@ -59,6 +59,12 @@ describe Sprig::Reap::SeedFile do
59
59
  setup_seed_folder('./spec/fixtures/db/seeds/dreamland', &example)
60
60
  end
61
61
 
62
+ it "logs the successful reap of database records for the given model" do
63
+ log_should_receive :info, :with => "Successfully reaped records for #{model}...\r"
64
+
65
+ subject.write
66
+ end
67
+
62
68
  context "when the seed file already exists" do
63
69
  before do
64
70
  yaml = File.read('./spec/fixtures/yaml/comment_seeds.yml')
@@ -125,5 +131,17 @@ describe Sprig::Reap::SeedFile do
125
131
  File.size?(subject.path).should > 0
126
132
  end
127
133
  end
134
+
135
+ context "when there are errors writing to the file" do
136
+ before do
137
+ File.stub(:open).and_raise(StandardError)
138
+ end
139
+
140
+ it "logs an error for the given model" do
141
+ log_should_receive :error, :with => "There was an issue writing to the file for Comment...\r"
142
+
143
+ subject.write
144
+ end
145
+ end
128
146
  end
129
147
  end
@@ -18,6 +18,13 @@ describe Sprig::Reap do
18
18
  subject.clear_config
19
19
  end
20
20
 
21
+ it "outputs log messages when starting and on completion" do
22
+ log_should_receive :debug, :with => "Reaping records from the database...\r"
23
+ log_should_receive :debug, :with => "Finished reaping!"
24
+
25
+ subject.reap
26
+ end
27
+
21
28
  it "generates a seed file for each class" do
22
29
  count = Sprig::Reap.classes.count
23
30
 
@@ -73,6 +80,22 @@ describe Sprig::Reap do
73
80
  end
74
81
  end
75
82
  end
83
+
84
+ context "when passed a value for omitting empty attributes in the options hash" do
85
+ context "in :omit_empty_attrs" do
86
+ it "sets the flag to omit empty attributes" do
87
+ subject.reap(:omit_empty_attrs => true)
88
+ subject.omit_empty_attrs.should == true
89
+ end
90
+ end
91
+
92
+ context "in OMIT_EMPTY_ATTRS" do
93
+ it "sets the flag to omit empty attributes" do
94
+ subject.reap('OMIT_EMPTY_ATTRS' => ' TRUE ')
95
+ subject.omit_empty_attrs.should == true
96
+ end
97
+ end
98
+ end
76
99
  end
77
100
 
78
101
  describe ".clear_config" do
@@ -20,6 +20,8 @@ end
20
20
  RSpec.configure do |config|
21
21
  config.include RailsStubs
22
22
  config.include FileSetup
23
+ config.include LoggerMock
24
+ config.include ColoredText
23
25
 
24
26
  config.before(:suite) do
25
27
  DatabaseCleaner.strategy = :transaction
@@ -0,0 +1,17 @@
1
+ module ColoredText
2
+ def blue_text(text)
3
+ "\e[34m#{text}\e[0m"
4
+ end
5
+
6
+ def green_text(text)
7
+ "\e[32m#{text}\e[0m"
8
+ end
9
+
10
+ def orange_text(text)
11
+ "\e[33m#{text}\e[0m"
12
+ end
13
+
14
+ def red_text(text)
15
+ "\e[31m#{text}\e[0m"
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ module LoggerMock
2
+ def log_should_receive(level, options)
3
+ Sprig::Reap.logger.should_receive(level).with(send("log_#{level}_text", options.fetch(:with)))
4
+ end
5
+
6
+ def log_debug_text(text)
7
+ blue_text(text)
8
+ end
9
+
10
+ def log_info_text(text)
11
+ green_text(text)
12
+ end
13
+
14
+ def log_warn_text(text)
15
+ orange_text(text)
16
+ end
17
+
18
+ def log_error_text(text)
19
+ red_text(text)
20
+ end
21
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sprig-reap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-07-03 00:00:00.000000000 Z
12
+ date: 2014-08-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -134,6 +134,7 @@ files:
134
134
  - lib/sprig/reap/association.rb
135
135
  - lib/sprig/reap/configuration.rb
136
136
  - lib/sprig/reap/file_attribute.rb
137
+ - lib/sprig/reap/logging.rb
137
138
  - lib/sprig/reap/model.rb
138
139
  - lib/sprig/reap/railtie.rb
139
140
  - lib/sprig/reap/record.rb
@@ -168,7 +169,9 @@ files:
168
169
  - spec/lib/sprig/reap_spec.rb
169
170
  - spec/lib/sprig_spec.rb
170
171
  - spec/spec_helper.rb
172
+ - spec/support/colored_text.rb
171
173
  - spec/support/file_setup.rb
174
+ - spec/support/logger_mock.rb
172
175
  - spec/support/matchers/be_same_file_as.rb
173
176
  - spec/support/rails_stubs.rb
174
177
  homepage: http://www.github.com/vigetlabs/sprig-reap
@@ -219,6 +222,8 @@ test_files:
219
222
  - spec/lib/sprig/reap_spec.rb
220
223
  - spec/lib/sprig_spec.rb
221
224
  - spec/spec_helper.rb
225
+ - spec/support/colored_text.rb
222
226
  - spec/support/file_setup.rb
227
+ - spec/support/logger_mock.rb
223
228
  - spec/support/matchers/be_same_file_as.rb
224
229
  - spec/support/rails_stubs.rb