sq-asset_sync 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +42 -0
  5. data/Appraisals +15 -0
  6. data/CHANGELOG.md +738 -0
  7. data/Gemfile +7 -0
  8. data/README.md +466 -0
  9. data/Rakefile +44 -0
  10. data/asset_sync.gemspec +38 -0
  11. data/docs/heroku.md +36 -0
  12. data/gemfiles/rails_3.1.gemfile +10 -0
  13. data/gemfiles/rails_3.2.gemfile +10 -0
  14. data/gemfiles/rails_4.0.gemfile +10 -0
  15. data/gemfiles/rails_4.1.gemfile +10 -0
  16. data/kochiku.yml +7 -0
  17. data/lib/asset_sync.rb +15 -0
  18. data/lib/asset_sync/asset_sync.rb +73 -0
  19. data/lib/asset_sync/config.rb +226 -0
  20. data/lib/asset_sync/engine.rb +53 -0
  21. data/lib/asset_sync/multi_mime.rb +16 -0
  22. data/lib/asset_sync/railtie.rb +5 -0
  23. data/lib/asset_sync/storage.rb +291 -0
  24. data/lib/asset_sync/version.rb +3 -0
  25. data/lib/generators/asset_sync/install_generator.rb +67 -0
  26. data/lib/generators/asset_sync/templates/asset_sync.rb +41 -0
  27. data/lib/generators/asset_sync/templates/asset_sync.yml +43 -0
  28. data/lib/tasks/asset_sync.rake +30 -0
  29. data/script/ci +31 -0
  30. data/spec/dummy_app/Rakefile +30 -0
  31. data/spec/dummy_app/app/assets/javascripts/application.js +1 -0
  32. data/spec/fixtures/aws_with_yml/config/asset_sync.yml +25 -0
  33. data/spec/fixtures/google_with_yml/config/asset_sync.yml +19 -0
  34. data/spec/fixtures/rackspace_with_yml/config/asset_sync.yml +20 -0
  35. data/spec/fixtures/with_invalid_yml/config/asset_sync.yml +24 -0
  36. data/spec/integration/aws_integration_spec.rb +77 -0
  37. data/spec/spec_helper.rb +64 -0
  38. data/spec/unit/asset_sync_spec.rb +257 -0
  39. data/spec/unit/google_spec.rb +142 -0
  40. data/spec/unit/multi_mime_spec.rb +48 -0
  41. data/spec/unit/rackspace_spec.rb +90 -0
  42. data/spec/unit/railsless_spec.rb +72 -0
  43. data/spec/unit/storage_spec.rb +244 -0
  44. metadata +248 -0
@@ -0,0 +1,43 @@
1
+ defaults: &defaults
2
+ <%- if aws? -%>
3
+ fog_provider: 'AWS'
4
+ aws_access_key_id: "<%= aws_access_key_id %>"
5
+ aws_secret_access_key: "<%= aws_secret_access_key %>"
6
+ # To use AWS reduced redundancy storage.
7
+ # aws_reduced_redundancy: true
8
+ <%- elsif google? -%>
9
+ fog_provider: 'Google'
10
+ google_storage_access_key_id: "<%= google_storage_access_key_id %>"
11
+ google_storage_secret_access_key: "<%= google_storage_secret_access_key %>"
12
+ <%- elsif rackspace? -%>
13
+ fog_provider: 'Rackspace'
14
+ rackspace_username: "<%= rackspace_username %>"
15
+ rackspace_api_key: "<%= rackspace_api_key %>"
16
+ # if you need to change rackspace_auth_url (e.g. if you need to use Rackspace London)
17
+ # rackspace_auth_url: "https://lon.identity.api.rackspacecloud.com/v2.0"
18
+ <%- end -%>
19
+ fog_directory: "<%= app_name %>-assets"
20
+ # You may need to specify what region your storage bucket is in
21
+ # fog_region: "eu-west-1"
22
+ existing_remote_files: keep
23
+ # To delete existing remote files.
24
+ # existing_remote_files: delete
25
+ # Automatically replace files with their equivalent gzip compressed version
26
+ # gzip_compression: true
27
+ # Fail silently. Useful for environments such as Heroku
28
+ # fail_silently: true
29
+
30
+ development:
31
+ <<: *defaults
32
+ enabled: false
33
+
34
+ test:
35
+ <<: *defaults
36
+ enabled: false
37
+
38
+ staging:
39
+ <<: *defaults
40
+ fog_directory: "<%= app_name %>-staging-assets"
41
+
42
+ production:
43
+ <<: *defaults
@@ -0,0 +1,30 @@
1
+ namespace :assets do
2
+
3
+ desc 'Synchronize assets to remote (assumes assets are already compiled)'
4
+ task :sync => :environment do
5
+ AssetSync.sync
6
+ end
7
+ namespace :sync do
8
+ desc 'Delete out-of-sync files on remote'
9
+ task :clean => :environment do
10
+ AssetSync.clean
11
+ end
12
+ end
13
+
14
+ end
15
+
16
+ if Rake::Task.task_defined?("assets:precompile:nondigest")
17
+ Rake::Task["assets:precompile:nondigest"].enhance do
18
+ # Conditional execution needs to be inside the enhance block because the enhance block
19
+ # will get executed before yaml or Rails initializers.
20
+ Rake::Task["assets:sync"].invoke if defined?(AssetSync) && AssetSync.config.run_on_precompile
21
+ end
22
+ else
23
+ Rake::Task["assets:precompile"].enhance do
24
+ # rails 3.1.1 will clear out Rails.application.config if the env vars
25
+ # RAILS_GROUP and RAILS_ENV are not defined. We need to reload the
26
+ # assets environment in this case.
27
+ # Rake::Task["assets:environment"].invoke if Rake::Task.task_defined?("assets:environment")
28
+ Rake::Task["assets:sync"].invoke if defined?(AssetSync) && AssetSync.config.run_on_precompile
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+
5
+ export RAILS_ENV="test"
6
+
7
+ ensure_app_dependencies_installed() {
8
+ install_bundler_if_needed
9
+ update_gems_if_needed
10
+ }
11
+
12
+ install_bundler_if_needed() {
13
+ echo "Checking for Bundler..."
14
+ gem install bundler --conservative
15
+ }
16
+
17
+ update_gems_if_needed() {
18
+ echo "Installing gems..."
19
+ bundle check || bundle install
20
+ }
21
+
22
+ run_specs() {
23
+ bundle exec rspec $(echo $RUN_LIST | tr , ' ')
24
+ }
25
+
26
+ run_full_build() {
27
+ ensure_app_dependencies_installed &&
28
+ run_specs
29
+ }
30
+
31
+ run_full_build
@@ -0,0 +1,30 @@
1
+ require 'rubygems'
2
+ # require "rake"
3
+ ENV['RAILS_ROOT'] = File.dirname(__FILE__)
4
+ # Set up gems listed in the Gemfile.
5
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
6
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
7
+ # require 'rails/all'
8
+ require "action_controller/railtie"
9
+ require "sprockets/railtie"
10
+ if defined?(Bundler)
11
+ Bundler.require(*Rails.groups(:assets => %w(development test)))
12
+ end
13
+ module AssetSyncTest
14
+ class Application < Rails::Application
15
+ config.encoding = "utf-8"
16
+ config.filter_parameters += [:password]
17
+ config.eager_load = false
18
+ config.assets.enabled = true
19
+ config.assets.version = '1.0'
20
+ config.secret_token = 'bf196b4383deefa4e0120a6ef1d9af1cc45f5c4ebd04405'
21
+ config.session_store :cookie_store, :key => '_asset_sync_test_session', :secret => 'xxxx'
22
+ config.active_support.deprecation = :log
23
+ config.assets.compress = true
24
+ config.assets.digest = true
25
+ config.assets.prefix = ENV['ASSET_SYNC_PREFIX']
26
+ end
27
+ end
28
+ AssetSyncTest::Application.initialize!
29
+ AssetSyncTest::Application.load_tasks
30
+ # Rake::Task['assets:precompile:all'].invoke
@@ -0,0 +1 @@
1
+ console.log("hello");
@@ -0,0 +1,25 @@
1
+ defaults: &defaults
2
+ fog_provider: "AWS"
3
+ aws_access_key_id: "xxxx"
4
+ aws_secret_access_key: "zzzz"
5
+ region: "eu-west-1"
6
+ run_on_precompile: false
7
+
8
+ development:
9
+ <<: *defaults
10
+ fog_directory: "rails_app_development"
11
+ existing_remote_files: keep
12
+
13
+ test:
14
+ <<: *defaults
15
+ fog_directory: "rails_app_test"
16
+ existing_remote_files: keep
17
+
18
+ production:
19
+ <<: *defaults
20
+ fog_directory: "rails_app_production"
21
+ existing_remote_files: delete
22
+
23
+ hybrid:
24
+ <<: *defaults
25
+ enabled: false
@@ -0,0 +1,19 @@
1
+ defaults: &defaults
2
+ fog_provider: "Google"
3
+ google_storage_access_key_id: 'xxxx'
4
+ google_storage_secret_access_key: 'zzzz'
5
+
6
+ development:
7
+ <<: *defaults
8
+ fog_directory: "rails_app_development"
9
+ existing_remote_files: keep
10
+
11
+ test:
12
+ <<: *defaults
13
+ fog_directory: "rails_app_test"
14
+ existing_remote_files: keep
15
+
16
+ production:
17
+ <<: *defaults
18
+ fog_directory: "rails_app_production"
19
+ existing_remote_files: delete
@@ -0,0 +1,20 @@
1
+ defaults: &defaults
2
+ fog_provider: "Rackspace"
3
+ rackspace_username: "xxxx"
4
+ rackspace_api_key: "zzzz"
5
+ region: "eu-west-1"
6
+
7
+ development:
8
+ <<: *defaults
9
+ fog_directory: "rails_app_development"
10
+ existing_remote_files: keep
11
+
12
+ test:
13
+ <<: *defaults
14
+ fog_directory: "rails_app_test"
15
+ existing_remote_files: keep
16
+
17
+ production:
18
+ <<: *defaults
19
+ fog_directory: "rails_app_production"
20
+ existing_remote_files: delete
@@ -0,0 +1,24 @@
1
+ defaults: &defaults
2
+ fog_provider= "AWS"
3
+ aws_access_key_id: "xxxx"
4
+ aws_secret_access_key: "zzzz"
5
+ region: "eu-west-1"
6
+
7
+ development:
8
+ <<: *defaults
9
+ fog_directory: "rails_app_development"
10
+ existing_remote_files: keep
11
+
12
+ test:
13
+ <<: *defaults
14
+ fog_directory: "rails_app_test"
15
+ existing_remote_files: keep
16
+
17
+ production:
18
+ <<: *defaults
19
+ fog_directory: "rails_app_production"
20
+ existing_remote_files: delete
21
+
22
+ hybrid:
23
+ <<: *defaults
24
+ enabled: false
@@ -0,0 +1,77 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ require "fog/aws"
4
+
5
+ def bucket(name)
6
+ options = {
7
+ :provider => 'AWS',
8
+ :aws_access_key_id => ENV['AWS_ACCESS_KEY_ID'],
9
+ :aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
10
+ }
11
+
12
+ connection = Fog::Storage.new(options)
13
+ connection.directories.get(ENV['FOG_DIRECTORY'], :prefix => name)
14
+ end
15
+
16
+ def execute(command)
17
+ app_path = File.expand_path("../../dummy_app", __FILE__)
18
+ Dir.chdir app_path
19
+ `#{command}`
20
+ end
21
+
22
+ describe "AssetSync" do
23
+
24
+ before(:each) do
25
+ @prefix = SecureRandom.hex(6)
26
+ end
27
+
28
+ let(:app_js_regex){
29
+ /#{@prefix}\/application-[a-zA-Z0-9]*.js$/
30
+ }
31
+
32
+ let(:app_js_gz_regex){
33
+ /#{@prefix}\/application-[a-zA-Z0-9]*.js.gz$/
34
+ }
35
+
36
+ let(:files){ bucket(@prefix).files }
37
+
38
+
39
+ after(:each) do
40
+ @directory = bucket(@prefix)
41
+ @directory.files.each do |f|
42
+ f.destroy
43
+ end
44
+ end
45
+
46
+ it "sync" do
47
+ execute "rake ASSET_SYNC_PREFIX=#{@prefix} assets:precompile"
48
+
49
+ files = bucket(@prefix).files
50
+
51
+ app_js_path = files.select{ |f| f.key =~ app_js_regex }.first
52
+ app_js_gz_path = files.select{ |f| f.key =~ app_js_gz_regex }.first
53
+
54
+ app_js = files.get( app_js_path.key )
55
+ expect(app_js.content_type).to eq("text/javascript")
56
+
57
+ app_js_gz = files.get( app_js_gz_path.key )
58
+ expect(app_js_gz.content_type).to eq("text/javascript")
59
+ expect(app_js_gz.content_encoding).to eq("gzip")
60
+ end
61
+
62
+ it "sync with enabled=false" do
63
+ execute "rake ASSET_SYNC_PREFIX=#{@prefix} ASSET_SYNC_ENABLED=false assets:precompile"
64
+ expect(bucket(@prefix).files.size).to eq(0)
65
+ end
66
+
67
+ it "sync with gzip_compression=true" do
68
+ execute "rake ASSET_SYNC_PREFIX=#{@prefix} ASSET_SYNC_GZIP_COMPRESSION=true assets:precompile"
69
+ # bucket(@prefix).files.size.should == 3
70
+
71
+ app_js_path = files.select{ |f| f.key =~ app_js_regex }.first
72
+ app_js = files.get( app_js_path.key )
73
+ expect(app_js.content_type).to eq("text/javascript")
74
+ end
75
+
76
+ end
77
+
@@ -0,0 +1,64 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ begin
5
+ require 'simplecov'
6
+ SimpleCov.start do
7
+ add_filter 'spec'
8
+ end
9
+ rescue LoadError
10
+ # SimpleCov ain't available - continue
11
+ end
12
+
13
+ begin
14
+ Bundler.setup(:default, :development)
15
+ rescue Bundler::BundlerError => e
16
+ $stderr.puts e.message
17
+ $stderr.puts "Run `bundle install` to install missing gems"
18
+ exit e.status_code
19
+ end
20
+
21
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
22
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
23
+ require 'asset_sync'
24
+
25
+ require 'rspec'
26
+ RSpec.configure do |config|
27
+ config.mock_framework = :rspec
28
+ end
29
+
30
+ shared_context "mock without Rails" do
31
+ before(:each) do
32
+ if defined? Rails
33
+ Object.send(:remove_const, :Rails)
34
+ end
35
+ allow(AssetSync).to receive(:log)
36
+ end
37
+ end
38
+
39
+
40
+ shared_context "mock Rails" do
41
+ before(:each) do
42
+ Object.send(:remove_const, :Rails) if defined? Rails
43
+ Rails = double 'Rails'
44
+ allow(Rails).to receive(:env).and_return('test')
45
+ allow(Rails).to receive_messages :application => double('application')
46
+ allow(Rails.application).to receive_messages :config => double('config')
47
+ allow(Rails.application.config).to receive_messages :assets => ActiveSupport::OrderedOptions.new
48
+ Rails.application.config.assets.prefix = '/assets'
49
+ allow(AssetSync).to receive(:log)
50
+ end
51
+ end
52
+
53
+ shared_context "mock Rails without_yml" do
54
+ include_context "mock Rails"
55
+
56
+ before(:each) do
57
+ set_rails_root('without_yml')
58
+ allow(Rails).to receive(:public_path).and_return(Rails.root.join('public').to_s)
59
+ end
60
+ end
61
+
62
+ def set_rails_root(path)
63
+ allow(Rails).to receive(:root).and_return(Pathname.new(File.join(File.dirname(__FILE__), 'fixtures', path)))
64
+ end
@@ -0,0 +1,257 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe AssetSync do
4
+ include_context "mock Rails without_yml"
5
+
6
+ describe 'with initializer' do
7
+ before(:each) do
8
+ AssetSync.config = AssetSync::Config.new
9
+ AssetSync.configure do |config|
10
+ config.fog_provider = 'AWS'
11
+ config.aws_access_key_id = 'aaaa'
12
+ config.aws_secret_access_key = 'bbbb'
13
+ config.fog_directory = 'mybucket'
14
+ config.fog_region = 'eu-west-1'
15
+ config.existing_remote_files = "keep"
16
+ end
17
+ end
18
+
19
+ it "should default to running on precompile" do
20
+ expect(AssetSync.config.run_on_precompile).to be_truthy
21
+ end
22
+
23
+ it "should default AssetSync to enabled" do
24
+ expect(AssetSync.config.enabled?).to be_truthy
25
+ expect(AssetSync.enabled?).to be_truthy
26
+ end
27
+
28
+ it "should configure provider as AWS" do
29
+ expect(AssetSync.config.fog_provider).to eq('AWS')
30
+ expect(AssetSync.config).to be_aws
31
+ end
32
+
33
+ it "should should keep existing remote files" do
34
+ expect(AssetSync.config.existing_remote_files?).to eq(true)
35
+ end
36
+
37
+ it "should configure aws_access_key" do
38
+ expect(AssetSync.config.aws_access_key_id).to eq("aaaa")
39
+ end
40
+
41
+ it "should configure aws_secret_access_key" do
42
+ expect(AssetSync.config.aws_secret_access_key).to eq("bbbb")
43
+ end
44
+
45
+ it "should configure aws_access_key" do
46
+ expect(AssetSync.config.fog_directory).to eq("mybucket")
47
+ end
48
+
49
+ it "should configure fog_region" do
50
+ expect(AssetSync.config.fog_region).to eq("eu-west-1")
51
+ end
52
+
53
+ it "should configure existing_remote_files" do
54
+ expect(AssetSync.config.existing_remote_files).to eq("keep")
55
+ end
56
+
57
+ it "should default gzip_compression to false" do
58
+ expect(AssetSync.config.gzip_compression).to be_falsey
59
+ end
60
+
61
+ it "should default manifest to false" do
62
+ expect(AssetSync.config.manifest).to be_falsey
63
+ end
64
+
65
+ it "should default log_silently to true" do
66
+ expect(AssetSync.config.log_silently).to be_truthy
67
+ end
68
+
69
+ it "log_silently? should reflect the configuration" do
70
+ AssetSync.config.log_silently = false
71
+ expect(AssetSync.config.log_silently?).to eq(false)
72
+ end
73
+
74
+ it "log_silently? should always be true if ENV['RAILS_GROUPS'] == 'assets'" do
75
+ AssetSync.config.log_silently = false
76
+ # make sure ENV is actually being checked ...
77
+ expect(ENV).to receive(:[]).with('RAILS_GROUPS').and_return('assets')
78
+ expect(AssetSync.config.log_silently?).to eq(true)
79
+ end
80
+
81
+ it "should default cdn_distribution_id to nil" do
82
+ expect(AssetSync.config.cdn_distribution_id).to be_nil
83
+ end
84
+
85
+ it "should default invalidate to empty array" do
86
+ expect(AssetSync.config.invalidate).to eq([])
87
+ end
88
+ end
89
+
90
+ describe 'from yml' do
91
+ before(:each) do
92
+ set_rails_root('aws_with_yml')
93
+ AssetSync.config = AssetSync::Config.new
94
+ end
95
+
96
+ it "should default AssetSync to enabled" do
97
+ expect(AssetSync.config.enabled?).to be_truthy
98
+ expect(AssetSync.enabled?).to be_truthy
99
+ end
100
+
101
+ it "should configure run_on_precompile" do
102
+ expect(AssetSync.config.run_on_precompile).to be_falsey
103
+ end
104
+
105
+ it "should configure aws_access_key_id" do
106
+ expect(AssetSync.config.aws_access_key_id).to eq("xxxx")
107
+ end
108
+
109
+ it "should configure aws_secret_access_key" do
110
+ expect(AssetSync.config.aws_secret_access_key).to eq("zzzz")
111
+ end
112
+
113
+ it "should configure fog_directory" do
114
+ expect(AssetSync.config.fog_directory).to eq("rails_app_test")
115
+ end
116
+
117
+ it "should configure fog_region" do
118
+ expect(AssetSync.config.fog_region).to eq("eu-west-1")
119
+ end
120
+
121
+ it "should configure existing_remote_files" do
122
+ expect(AssetSync.config.existing_remote_files).to eq("keep")
123
+ end
124
+
125
+ it "should default gzip_compression to false" do
126
+ expect(AssetSync.config.gzip_compression).to be_falsey
127
+ end
128
+
129
+ it "should default manifest to false" do
130
+ expect(AssetSync.config.manifest).to be_falsey
131
+ end
132
+ end
133
+
134
+ describe 'from yml, exporting to a mobile hybrid development directory' do
135
+ before(:each) do
136
+ Rails.env.replace('hybrid')
137
+ set_rails_root('aws_with_yml')
138
+ AssetSync.config = AssetSync::Config.new
139
+ end
140
+
141
+ it "should be disabled" do
142
+ expect{ AssetSync.sync }.not_to raise_error()
143
+ end
144
+
145
+ after(:each) do
146
+ Rails.env.replace('test')
147
+ end
148
+ end
149
+
150
+ describe 'with no configuration' do
151
+ before(:each) do
152
+ AssetSync.config = AssetSync::Config.new
153
+ end
154
+
155
+ it "should be invalid" do
156
+ expect{ AssetSync.sync }.to raise_error()
157
+ end
158
+ end
159
+
160
+ describe "with no other configuration than enabled = false" do
161
+ before(:each) do
162
+ AssetSync.config = AssetSync::Config.new
163
+ AssetSync.configure do |config|
164
+ config.enabled = false
165
+ end
166
+ end
167
+
168
+ it "should do nothing, without complaining" do
169
+ expect{ AssetSync.sync }.not_to raise_error()
170
+ end
171
+ end
172
+
173
+ describe 'with fail_silent configuration' do
174
+ before(:each) do
175
+ allow(AssetSync).to receive(:stderr).and_return(@stderr = StringIO.new)
176
+ AssetSync.config = AssetSync::Config.new
177
+ AssetSync.configure do |config|
178
+ config.fail_silently = true
179
+ end
180
+ end
181
+
182
+ it "should not raise an invalid exception" do
183
+ expect{ AssetSync.sync }.not_to raise_error()
184
+ end
185
+
186
+ it "should output a warning to stderr" do
187
+ AssetSync.sync
188
+ expect(@stderr.string).to match(/can't be blank/)
189
+ end
190
+ end
191
+
192
+ describe 'with disabled config' do
193
+ before(:each) do
194
+ allow(AssetSync).to receive(:stderr).and_return(@stderr = StringIO.new)
195
+ AssetSync.config = AssetSync::Config.new
196
+ AssetSync.configure do |config|
197
+ config.enabled = false
198
+ end
199
+ end
200
+
201
+ it "should not raise an invalid exception" do
202
+ expect{ AssetSync.sync }.not_to raise_error()
203
+ end
204
+ end
205
+
206
+ describe 'with gzip_compression enabled' do
207
+ before(:each) do
208
+ AssetSync.config = AssetSync::Config.new
209
+ AssetSync.config.gzip_compression = true
210
+ end
211
+
212
+ it "config.gzip? should be true" do
213
+ expect(AssetSync.config.gzip?).to be_truthy
214
+ end
215
+ end
216
+
217
+ describe 'with manifest enabled' do
218
+ before(:each) do
219
+ AssetSync.config = AssetSync::Config.new
220
+ AssetSync.config.manifest = true
221
+ end
222
+
223
+ it "config.manifest should be true" do
224
+ expect(AssetSync.config.manifest).to be_truthy
225
+ end
226
+
227
+ it "config.manifest_path should default to public/assets.." do
228
+ expect(AssetSync.config.manifest_path).to match(/public\/assets\/manifest.yml/)
229
+ end
230
+
231
+ it "config.manifest_path should default to public/assets.." do
232
+ Rails.application.config.assets.manifest = "/var/assets"
233
+ expect(AssetSync.config.manifest_path).to eq("/var/assets/manifest.yml")
234
+ end
235
+
236
+ it "config.manifest_path should default to public/custom_assets.." do
237
+ Rails.application.config.assets.prefix = 'custom_assets'
238
+ expect(AssetSync.config.manifest_path).to match(/public\/custom_assets\/manifest.yml/)
239
+ end
240
+ end
241
+
242
+ describe 'with invalid yml' do
243
+
244
+ before(:each) do
245
+ set_rails_root('with_invalid_yml')
246
+ AssetSync.config = AssetSync::Config.new
247
+ end
248
+
249
+ it "config should be invalid" do
250
+ expect(AssetSync.config.valid?).to be_falsey
251
+ end
252
+
253
+ it "should raise a config invalid error" do
254
+ expect{ AssetSync.sync }.to raise_error()
255
+ end
256
+ end
257
+ end