jekyll-minibundle 1.6.0 → 2.0.0

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: b7dc5bf67a5d4a713810a998484b2bca9ecc1cc3
4
- data.tar.gz: 4f2fc0b94c6e29a573666627609e50dccdc123ab
3
+ metadata.gz: 7b98e5563a50d5892a424e3be6ba49fe3d899810
4
+ data.tar.gz: 38648384d0bce35475e6a8f0787c5d607fbfae80
5
5
  SHA512:
6
- metadata.gz: e7571e9ec0a7a0c7914afbaf93b3442747b50b36b5645ac67d6745ecb777a49d17c66c40f6d7af2fc87e265fcf888b53d17a9dd3f9c80c390e2b048b458d8dc3
7
- data.tar.gz: 0bfeacb9e08ea16d1e4815af0b3dfa7c061ffd7138fa883a2619817b9588d30fefe3b72c0b843db84282e2c9c429714e138f65239e579326636c1a715c21ab35
6
+ metadata.gz: 96700c73cdaada8a240ef9009f13e8433e149670bee218cea457ada7e17a21e8781dc4291766bab54144d3527d9b02d9870f2fc8a9abee7c13ab37abb03bc480
7
+ data.tar.gz: 8c0d2048c10c7e07c1d4d5a59abf0acd0517ca3545febf09451d98b9f957c2bed9e8d22b966cdf6ec8d0370723982955d6aea13d6435bd45cf15322b25733546
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ # 2.0.0 / 2016-04-01
2
+
3
+ * Drop support for Jekyll versions below 3
4
+ * Remove unused asset cache entries and temporary files when Jekyll
5
+ rebuilds the site
6
+ * Document a known caveat: the plugin doesn't work with Jekyll's
7
+ incremental rebuild feature.
8
+
1
9
  # 1.6.0 / 2016-03-26
2
10
 
3
11
  * Log the last 2000 bytes of minifier's STDOUT output if the minifier
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 Tuomas Kareinen
1
+ Copyright (c) 2012-2016 Tuomas Kareinen
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -8,14 +8,17 @@ for cache busting.
8
8
  There are no runtime dependencies, except for the minification tool
9
9
  used for bundling (fingerprinting has no dependencies).
10
10
 
11
- Tested with Ruby MRI 2.x. Ruby 1.9 and 1.8 are *not* supported.
11
+ The plugin requires Jekyll version 3.x. It is tested with Ruby MRI
12
+ 2.x. Ruby 1.8 and 1.9 are *not* supported.
12
13
 
13
- The plugin works with Jekyll's watch (auto-regeneration) mode.
14
+ The plugin works with Jekyll's watch mode (auto-regeneration, Jekyll
15
+ option `--watch`), but not with incremental feature enabled (Jekyll
16
+ option `--incremental`).
14
17
 
15
18
  [![Gem version](https://badge.fury.io/rb/jekyll-minibundle.svg)][MinibundleGem]
16
19
  [![Build status](https://secure.travis-ci.org/tkareine/jekyll-minibundle.svg)][MinibundleBuild]
17
20
 
18
- # Features
21
+ ## Features
19
22
 
20
23
  There are two features: asset fingerprinting with MD5 digest over the
21
24
  contents of the asset, and asset bundling combined with the first
@@ -40,7 +43,7 @@ backend upon page load. The minification of stylesheets and JavaScript
40
43
  sources makes asset sizes smaller and thus faster to load over
41
44
  network.
42
45
 
43
- # Usage
46
+ ## Usage
44
47
 
45
48
  The plugin ships as a [RubyGem][MinibundleGem]. To install:
46
49
 
@@ -69,7 +72,7 @@ require 'jekyll/minibundle'
69
72
  You must allow Jekyll to use custom plugins. That is, do not enable
70
73
  Jekyll's `safe` setting.
71
74
 
72
- ## Asset fingerprinting
75
+ ### Asset fingerprinting
73
76
 
74
77
  If you just want to have a fingerprint in your asset's path, use
75
78
  `ministamp` tag:
@@ -97,7 +100,7 @@ fingerprint to Jekyll's output directory:
97
100
  <link href="{{ site.baseurl }}{% ministamp _tmp/site.css assets/site.css %}" rel="stylesheet">
98
101
  ```
99
102
 
100
- ## Asset bundling
103
+ ### Asset bundling
101
104
 
102
105
  This is a straightforward way to bundle assets with any minification
103
106
  tool that supports reading input from STDIN and writing the output to
@@ -210,7 +213,7 @@ specific one wins. For example, the `minifier_cmd` setting inside
210
213
  `minibundle js` block overrides the setting in
211
214
  `$JEKYLL_MINIBUNDLE_CMD_JS` environment variable.
212
215
 
213
- ## Recommended directory layout
216
+ ### Recommended directory layout
214
217
 
215
218
  It's recommended that you exclude the files you use as asset sources
216
219
  from Jekyll itself. Otherwise, you end up with duplicate files in the
@@ -242,7 +245,7 @@ character (`_`), consider using the following directory layout:
242
245
  See [Jekyll configuration][JekyllConf] for more about excluding files
243
246
  and directories.
244
247
 
245
- ## Development mode
248
+ ### Development mode
246
249
 
247
250
  The plugin has one more trick in its sleeves. If you set
248
251
  `$JEKYLL_MINIBUNDLE_MODE` environment variable to `development`, then
@@ -266,15 +269,16 @@ minibundle:
266
269
  Should both be defined, the setting from the environment variable
267
270
  wins.
268
271
 
269
- # Example site
272
+ ## Example site
270
273
 
271
274
  See the contents of `test/fixture/site` directory.
272
275
 
273
- # Known caveats
276
+ ## Known caveats
274
277
 
275
- See `test/integration/known_caveats_test.rb`.
278
+ The plugin does not work with Jekyll's incremental rebuild feature (Jekyll
279
+ option `--incremental`).
276
280
 
277
- # License
281
+ ## License
278
282
 
279
283
  MIT. See `LICENSE.txt`.
280
284
 
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), 'lib/jekyll/minibundle/version'))
1
+ require_relative 'lib/jekyll/minibundle/version'
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'jekyll-minibundle'
@@ -27,7 +27,7 @@ minification tool (not even other gems).
27
27
 
28
28
  s.test_files = `git ls-files -- test`.split("\n")
29
29
 
30
- s.add_development_dependency 'jekyll', '~> 3.1'
30
+ s.add_development_dependency 'jekyll', '~> 3.0.0'
31
31
  s.add_development_dependency 'minitest', '~> 5.8'
32
32
  s.add_development_dependency 'nokogiri', '~> 1.6'
33
33
  s.add_development_dependency 'rake', '~> 11.1'
@@ -1,9 +1,12 @@
1
1
  require 'tempfile'
2
- require 'jekyll/minibundle/compatibility'
2
+ require 'jekyll/minibundle/exceptions'
3
3
  require 'jekyll/minibundle/files'
4
+ require 'jekyll/minibundle/log'
4
5
 
5
6
  module Jekyll::Minibundle
6
7
  class AssetBundle
8
+ TEMPFILE_PREFIX = 'jekyll-minibundle-'.freeze
9
+
7
10
  def initialize(config)
8
11
  @type = config.fetch(:type)
9
12
  @asset_paths = config.fetch(:asset_paths)
@@ -19,20 +22,26 @@ Missing minification command for bundling #{@type} assets. Specify it in
19
22
  END
20
23
  end
21
24
 
22
- @temp_file = Tempfile.new(['jekyll-minibundle-', ".#{@type}"])
23
- at_exit { @temp_file.close! }
25
+ @tempfile = Tempfile.new([TEMPFILE_PREFIX, ".#{@type}"])
26
+ end
27
+
28
+ def close
29
+ @tempfile.close!
30
+ @tempfile = nil
24
31
  end
25
32
 
26
33
  def path
27
- @temp_file.path
34
+ raise IllegalStateError, 'Cannot get path of closed AssetBundle' unless @tempfile
35
+ @tempfile.path
28
36
  end
29
37
 
30
38
  def make_bundle
39
+ raise IllegalStateError, 'Cannot make bundle with closed AssetBundle' unless @tempfile
31
40
  exit_status = spawn_minifier(@minifier_cmd) do |input|
32
41
  $stdout.puts # place newline after "(Re)generating..." log messages
33
- Compatibility.log_info("Bundling #{@type} assets:")
42
+ Log.info("Bundling #{@type} assets:")
34
43
  @asset_paths.each do |asset|
35
- Compatibility.log_info(relative_path_from(asset, @site_dir))
44
+ Log.info(relative_path_from(asset, @site_dir))
36
45
  IO.foreach(asset) { |line| input.write(line) }
37
46
  input.puts(';') if @type == :js
38
47
  end
@@ -55,7 +64,7 @@ Missing minification command for bundling #{@type} assets. Specify it in
55
64
  pid = nil
56
65
  rd, wr = IO.pipe
57
66
  Dir.chdir(@site_dir) do
58
- pid = spawn(cmd, out: [@temp_file.path, 'w'], in: rd)
67
+ pid = spawn(cmd, out: [@tempfile.path, 'w'], in: rd)
59
68
  end
60
69
  rd.close
61
70
  yield wr
@@ -69,16 +78,16 @@ Missing minification command for bundling #{@type} assets. Specify it in
69
78
  end
70
79
 
71
80
  def log_minifier_error(message)
72
- last_bytes = Files.read_last(@temp_file.path, 2000)
81
+ last_bytes = Files.read_last(@tempfile.path, 2000)
73
82
 
74
83
  return if last_bytes.empty?
75
84
 
76
- Compatibility.log_error("#{message}, last #{last_bytes.size} bytes of minifier output:")
85
+ Log.error("#{message}, last #{last_bytes.size} bytes of minifier output:")
77
86
 
78
87
  last_bytes
79
88
  .gsub(/[^[:print:]\t\n]/) { |ch| '\x' + ch.unpack('H2').first }
80
89
  .split("\n")
81
- .each { |line| Compatibility.log_error(line) }
90
+ .each { |line| Log.error(line) }
82
91
  end
83
92
  end
84
93
  end
@@ -2,6 +2,10 @@ require 'fileutils'
2
2
 
3
3
  module Jekyll::Minibundle
4
4
  module AssetFileOperations
5
+ def cleanup
6
+ # defaults to no-op
7
+ end
8
+
5
9
  def write_destination(site_destination_dir)
6
10
  destination_path = destination(site_destination_dir)
7
11
  FileUtils.mkdir_p(File.dirname(destination_path))
@@ -7,10 +7,23 @@ require 'jekyll/minibundle/stamp_file'
7
7
  module Jekyll::Minibundle
8
8
  module AssetFileRegistry
9
9
  class << self
10
- def clear
10
+ def clear_all
11
11
  @_files = {}
12
12
  end
13
13
 
14
+ def clear_unused
15
+ @_files
16
+ .select { |_, cached| !cached.fetch(:is_used) }
17
+ .each do |asset_destination_path, cached|
18
+ cached.fetch(:file).cleanup
19
+ @_files.delete(asset_destination_path)
20
+ end
21
+
22
+ @_files.each_value do |cached|
23
+ cached[:is_used] = false
24
+ end
25
+ end
26
+
14
27
  def register_bundle_file(site, bundle_config)
15
28
  register_file_for_bundle_block(BundleFile, site, bundle_config) { |file| [file] }
16
29
  end
@@ -35,23 +48,40 @@ module Jekyll::Minibundle
35
48
  cached = @_files[asset_destination_path]
36
49
 
37
50
  if cached
38
- raise "minibundle block has same destination path as a ministamp tag: #{asset_destination_path}" if cached.fetch(:type) != :bundle
51
+ if cached.fetch(:type) != :bundle
52
+ raise "minibundle block has the same destination path as a ministamp tag: '#{asset_destination_path}'"
53
+ end
39
54
 
40
55
  cached_file = cached.fetch(:file)
56
+ cached_config = cached.fetch(:config)
57
+ cached_is_used = cached.fetch(:is_used)
41
58
 
42
- if bundle_config == cached.fetch(:config)
43
- get_files.call(cached_file).each do |file|
44
- site.static_files << file unless site.static_files.include?(file)
59
+ if bundle_config == cached_config
60
+ unless cached_is_used
61
+ cached[:is_used] = true
62
+ add_as_static_files_to_site(site, get_files.call(cached_file))
45
63
  end
64
+
46
65
  return cached_file
47
- else
48
- get_files.call(cached_file).each { |file| site.static_files.delete(file) }
49
66
  end
67
+
68
+ if cached_is_used
69
+ raise <<-END
70
+ Two or more minibundle blocks with the same destination path '#{asset_destination_path}', but having different asset configuration: #{bundle_config.inspect} vs. #{cached_config.inspect}
71
+ END
72
+ end
73
+
74
+ cached_file.cleanup
50
75
  end
51
76
 
52
77
  new_file = file_class.new(site, bundle_config)
53
- @_files[asset_destination_path] = {type: :bundle, file: new_file, config: bundle_config}
54
- get_files.call(new_file).each { |file| site.static_files << file }
78
+ @_files[asset_destination_path] = {
79
+ type: :bundle,
80
+ file: new_file,
81
+ config: bundle_config,
82
+ is_used: true
83
+ }
84
+ add_as_static_files_to_site(site, get_files.call(new_file))
55
85
  new_file
56
86
  end
57
87
 
@@ -59,25 +89,52 @@ module Jekyll::Minibundle
59
89
  cached = @_files[asset_destination_path]
60
90
 
61
91
  if cached
62
- raise "ministamp tag has same destination path as a minibundle block: #{asset_destination_path}" if cached.fetch(:type) != :stamp
92
+ if cached.fetch(:type) != :stamp
93
+ raise "ministamp tag has the same destination path as a minibundle block: '#{asset_destination_path}'"
94
+ end
63
95
 
64
96
  cached_file = cached.fetch(:file)
97
+ cached_config = cached.fetch(:config)
98
+ cached_is_used = cached.fetch(:is_used)
99
+
100
+ if asset_source_path == cached_config
101
+ unless cached_is_used
102
+ cached[:is_used] = true
103
+ add_as_static_files_to_site(site, [cached_file])
104
+ end
65
105
 
66
- if asset_source_path == cached.fetch(:config)
67
- site.static_files << cached_file unless site.static_files.include?(cached_file)
68
106
  return cached_file
69
- else
70
- site.static_files.delete(cached_file)
71
107
  end
108
+
109
+ if cached_is_used
110
+ raise <<-END
111
+ Two or more ministamp tags with the same destination path '#{asset_destination_path}', but different asset source paths: '#{asset_source_path}' vs. '#{cached_config}'
112
+ END
113
+ end
114
+
115
+ cached_file.cleanup
72
116
  end
73
117
 
74
118
  new_file = file_class.new(site, asset_source_path, asset_destination_path)
75
- @_files[asset_destination_path] = {type: :stamp, file: new_file, config: asset_source_path}
76
- site.static_files << new_file
119
+ @_files[asset_destination_path] = {
120
+ type: :stamp,
121
+ file: new_file,
122
+ config: asset_source_path,
123
+ is_used: true
124
+ }
125
+ add_as_static_files_to_site(site, [new_file])
77
126
  new_file
78
127
  end
128
+
129
+ def add_as_static_files_to_site(site, files)
130
+ files.each { |file| site.static_files << file }
131
+ end
79
132
  end
80
133
 
81
- clear
134
+ clear_all
82
135
  end
83
136
  end
137
+
138
+ ::Jekyll::Hooks.register(:site, :post_write) do
139
+ ::Jekyll::Minibundle::AssetFileRegistry.clear_unused
140
+ end
@@ -19,6 +19,13 @@ module Jekyll::Minibundle
19
19
  @minifier_cmd = config.fetch('minifier_cmd')
20
20
  @stamped_at = nil
21
21
  @is_modified = false
22
+ @_asset_bundle = nil
23
+ end
24
+
25
+ def cleanup
26
+ return unless @_asset_bundle
27
+ @_asset_bundle.close
28
+ @_asset_bundle = nil
22
29
  end
23
30
 
24
31
  def destination_path_for_markup
@@ -17,5 +17,9 @@ module Jekyll::Minibundle
17
17
  DevelopmentFile.new(site, asset_source, asset_destination)
18
18
  end
19
19
  end
20
+
21
+ def cleanup
22
+ # no-op
23
+ end
20
24
  end
21
25
  end
@@ -0,0 +1,3 @@
1
+ module Jekyll::Minibundle
2
+ class IllegalStateError < RuntimeError; end
3
+ end
@@ -0,0 +1,15 @@
1
+ module Jekyll::Minibundle
2
+ module Log
3
+ TOPIC = 'Minibundle:'.freeze
4
+
5
+ class << self
6
+ def error(msg)
7
+ ::Jekyll.logger.error(TOPIC, msg)
8
+ end
9
+
10
+ def info(msg)
11
+ ::Jekyll.logger.info(TOPIC, msg)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,4 @@
1
1
  require 'jekyll/minibundle/hashes'
2
- require 'jekyll/minibundle/compatibility'
3
2
  require 'jekyll/minibundle/environment'
4
3
  require 'jekyll/minibundle/asset_file_registry'
5
4
  require 'jekyll/minibundle/asset_tag_markup'
@@ -14,7 +13,7 @@ module Jekyll::Minibundle
14
13
 
15
14
  def render(context)
16
15
  site = context.registers.fetch(:site)
17
- bundle_config = get_current_bundle_config(Compatibility.load_yaml(super), site)
16
+ bundle_config = get_current_bundle_config(::SafeYAML.load(super), site)
18
17
  baseurl = bundle_config.fetch('baseurl')
19
18
  attributes = bundle_config.fetch('attributes')
20
19
 
@@ -1,5 +1,5 @@
1
1
  module Jekyll
2
2
  module Minibundle
3
- VERSION = '1.6.0'.freeze
3
+ VERSION = '2.0.0'.freeze
4
4
  end
5
5
  end
@@ -1,3 +1,7 @@
1
+ if defined?(Jekyll::VERSION) && Jekyll::VERSION < '3'
2
+ raise 'Minibundle plugin requires Jekyll version 3 or above'
3
+ end
4
+
1
5
  require 'jekyll/minibundle/version'
2
6
  require 'jekyll/minibundle/mini_bundle_block'
3
7
  require 'jekyll/minibundle/mini_stamp_tag'
@@ -2,7 +2,7 @@ require 'support/test_case'
2
2
  require 'support/fixture_config'
3
3
 
4
4
  module Jekyll::Minibundle::Test
5
- class MiniBundleDevelopmentModeTest < TestCase
5
+ class MinibundleDevelopmentModeTest < TestCase
6
6
  include FixtureConfig
7
7
 
8
8
  CSS_ASSET_DESTINATION_PATHS = %w{reset common}.map { |f| File.join(CSS_BUNDLE_DESTINATION_PATH, "#{f}.css") }
@@ -136,25 +136,53 @@ module Jekyll::Minibundle::Test
136
136
  assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'dependency.js'))
137
137
  assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js'))
138
138
 
139
- match_snippet = <<-END
140
- {% minibundle js %}
141
- source_dir: _assets/scripts
142
- destination_path: assets/site
143
- END
139
+ ensure_file_mtime_changes do
140
+ change_destination_path_in_minibundle_block('assets/site', 'assets/site2')
141
+ end
144
142
 
145
- replacement_snippet = <<-END
146
- {% minibundle js %}
147
- source_dir: _assets/scripts
148
- destination_path: assets/site2
149
- END
143
+ generate_site(:development, clear_cache: false)
144
+
145
+ refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'dependency.js'))
146
+ refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js'))
147
+
148
+ assert_equal ['assets/site2/dependency.js', 'assets/site2/app.js'], find_js_paths_from_index
149
+ assert File.exist?(destination_path('assets/site2/dependency.js'))
150
+ assert File.exist?(destination_path('assets/site2/app.js'))
151
+ end
152
+ end
153
+
154
+ def test_changing_asset_destination_path_to_new_value_and_back_to_original_rewrites_destination
155
+ with_site_dir do
156
+ generate_site(:development)
157
+
158
+ assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'dependency.js'))
159
+ assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js'))
150
160
 
151
- find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
161
+ ensure_file_mtime_changes do
162
+ change_destination_path_in_minibundle_block('assets/site', 'assets/site2')
163
+ end
152
164
 
153
165
  generate_site(:development, clear_cache: false)
154
166
 
167
+ refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'dependency.js'))
168
+ refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js'))
169
+
155
170
  assert_equal ['assets/site2/dependency.js', 'assets/site2/app.js'], find_js_paths_from_index
156
171
  assert File.exist?(destination_path('assets/site2/dependency.js'))
157
172
  assert File.exist?(destination_path('assets/site2/app.js'))
173
+
174
+ ensure_file_mtime_changes do
175
+ change_destination_path_in_minibundle_block('assets/site2', 'assets/site')
176
+ end
177
+
178
+ generate_site(:development, clear_cache: false)
179
+
180
+ refute File.exist?(destination_path('assets/site2/dependency.js'))
181
+ refute File.exist?(destination_path('assets/site2/app.js'))
182
+
183
+ assert_equal ['assets/site/dependency.js', 'assets/site/app.js'], find_js_paths_from_index
184
+ assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'dependency.js'))
185
+ assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js'))
158
186
  end
159
187
  end
160
188
 
@@ -320,5 +348,21 @@ module Jekyll::Minibundle::Test
320
348
  assert File.exist?(actual)
321
349
  assert_equal File.read(expected), File.read(actual)
322
350
  end
351
+
352
+ def change_destination_path_in_minibundle_block(from, to)
353
+ match_snippet = <<-END
354
+ {% minibundle js %}
355
+ source_dir: _assets/scripts
356
+ destination_path: #{from}
357
+ END
358
+
359
+ replacement_snippet = <<-END
360
+ {% minibundle js %}
361
+ source_dir: _assets/scripts
362
+ destination_path: #{to}
363
+ END
364
+
365
+ find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
366
+ end
323
367
  end
324
368
  end
@@ -2,7 +2,7 @@ require 'support/test_case'
2
2
  require 'support/fixture_config'
3
3
 
4
4
  module Jekyll::Minibundle::Test
5
- class MiniBundleProductionModeTest < TestCase
5
+ class MinibundleProductionModeTest < TestCase
6
6
  include FixtureConfig
7
7
 
8
8
  def test_css_asset_bundle_has_stamp
@@ -174,36 +174,106 @@ module Jekyll::Minibundle::Test
174
174
  end
175
175
  end
176
176
 
177
- def test_changing_asset_destination_path_rewrites_destination
177
+ def test_changing_asset_source_list_removes_old_temporary_bundle_file
178
178
  with_site_dir do
179
179
  generate_site(:production)
180
180
 
181
181
  assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
182
182
 
183
183
  match_snippet = <<-END
184
- {% minibundle js %}
185
- source_dir: _assets/scripts
186
- destination_path: assets/site
184
+ assets:
185
+ - dependency
186
+ - app
187
187
  END
188
188
 
189
189
  replacement_snippet = <<-END
190
- {% minibundle js %}
191
- source_dir: _assets/scripts
192
- destination_path: assets/site2
190
+ assets:
191
+ - dependency
193
192
  END
194
193
 
194
+ org_tempfiles = find_tempfiles
195
+
195
196
  ensure_file_mtime_changes do
196
197
  find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
197
198
  end
198
199
 
199
200
  generate_site(:production, clear_cache: false)
200
201
 
202
+ refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
203
+ assert File.exist?(destination_path('assets/site-71042d0b7c86c04e015fde694dd9f409.js'))
204
+ assert_equal 1, (org_tempfiles - find_tempfiles).size
205
+ end
206
+ end
207
+
208
+ def test_changing_asset_destination_path_rewrites_destination
209
+ with_site_dir do
210
+ generate_site(:production)
211
+
212
+ assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
213
+
214
+ ensure_file_mtime_changes do
215
+ change_destination_path_in_minibundle_block('assets/site', 'assets/site2')
216
+ end
217
+
218
+ generate_site(:production, clear_cache: false)
219
+
220
+ refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
221
+
222
+ new_destination = "assets/site2-#{JS_BUNDLE_FINGERPRINT}.js"
223
+
224
+ assert_equal new_destination, find_js_path_from_index
225
+ assert File.exist?(destination_path(new_destination))
226
+ end
227
+ end
228
+
229
+ def test_changing_asset_destination_path_removes_old_temporary_bundle_file
230
+ with_site_dir do
231
+ generate_site(:production)
232
+
233
+ assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
234
+
235
+ org_tempfiles = find_tempfiles
236
+
237
+ ensure_file_mtime_changes do
238
+ change_destination_path_in_minibundle_block('assets/site', 'assets/site2')
239
+ end
240
+
241
+ generate_site(:production, clear_cache: false)
242
+
243
+ refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
244
+ assert File.exist?(destination_path("assets/site2-#{JS_BUNDLE_FINGERPRINT}.js"))
245
+ assert_equal 1, (org_tempfiles - find_tempfiles).size
246
+ end
247
+ end
248
+
249
+ def test_changing_asset_destination_path_to_new_value_and_back_to_original_rewrites_destination
250
+ with_site_dir do
251
+ generate_site(:production)
252
+
253
+ assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
254
+
255
+ ensure_file_mtime_changes do
256
+ change_destination_path_in_minibundle_block('assets/site', 'assets/site2')
257
+ end
258
+
259
+ generate_site(:production, clear_cache: false)
260
+
201
261
  refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
202
262
 
203
263
  new_destination = "assets/site2-#{JS_BUNDLE_FINGERPRINT}.js"
204
264
 
205
265
  assert_equal new_destination, find_js_path_from_index
206
266
  assert File.exist?(destination_path(new_destination))
267
+
268
+ ensure_file_mtime_changes do
269
+ change_destination_path_in_minibundle_block('assets/site2', 'assets/site')
270
+ end
271
+
272
+ generate_site(:production, clear_cache: false)
273
+
274
+ refute File.exist?(destination_path(new_destination))
275
+ assert_equal JS_BUNDLE_DESTINATION_FINGERPRINT_PATH, find_js_path_from_index
276
+ assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
207
277
  end
208
278
  end
209
279
 
@@ -472,5 +542,25 @@ title: Test
472
542
  .join('')
473
543
  .size
474
544
  end
545
+
546
+ def change_destination_path_in_minibundle_block(from, to)
547
+ match_snippet = <<-END
548
+ {% minibundle js %}
549
+ source_dir: _assets/scripts
550
+ destination_path: #{from}
551
+ END
552
+
553
+ replacement_snippet = <<-END
554
+ {% minibundle js %}
555
+ source_dir: _assets/scripts
556
+ destination_path: #{to}
557
+ END
558
+
559
+ find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
560
+ end
561
+
562
+ def find_tempfiles
563
+ Dir[File.join(Dir.tmpdir, AssetBundle::TEMPFILE_PREFIX + '*')]
564
+ end
475
565
  end
476
566
  end
@@ -2,7 +2,7 @@ require 'support/test_case'
2
2
  require 'support/fixture_config'
3
3
 
4
4
  module Jekyll::Minibundle::Test
5
- class MiniStampProductionModeTest < TestCase
5
+ class MinistampDevelopmentModeTest < TestCase
6
6
  include FixtureConfig
7
7
 
8
8
  def test_asset_destination_path_has_no_stamp
@@ -97,6 +97,46 @@ module Jekyll::Minibundle::Test
97
97
  end
98
98
  end
99
99
 
100
+ def test_changing_asset_destination_path_to_new_value_and_back_to_original_rewrites_destination
101
+ with_site_dir do
102
+ generate_site(:development)
103
+
104
+ assert File.exist?(destination_path(STAMP_DESTINATION_PATH))
105
+
106
+ ensure_file_mtime_changes do
107
+ find_and_gsub_in_file(
108
+ source_path('_layouts/default.html'),
109
+ '{% ministamp _tmp/site.css assets/screen.css',
110
+ '{% ministamp _tmp/site.css assets/screen2.css'
111
+ )
112
+ end
113
+
114
+ generate_site(:development, clear_cache: false)
115
+
116
+ refute File.exist?(destination_path(STAMP_DESTINATION_PATH))
117
+
118
+ new_destination = 'assets/screen2.css'
119
+
120
+ assert_equal new_destination, find_css_path_from_index
121
+ assert File.exist?(destination_path(new_destination))
122
+
123
+ ensure_file_mtime_changes do
124
+ find_and_gsub_in_file(
125
+ source_path('_layouts/default.html'),
126
+ '{% ministamp _tmp/site.css assets/screen2.css',
127
+ '{% ministamp _tmp/site.css assets/screen.css'
128
+ )
129
+ end
130
+
131
+ generate_site(:development, clear_cache: false)
132
+
133
+ refute File.exist?(destination_path(new_destination))
134
+
135
+ assert_equal STAMP_DESTINATION_PATH, find_css_path_from_index
136
+ assert File.exist?(destination_path(STAMP_DESTINATION_PATH))
137
+ end
138
+ end
139
+
100
140
  def test_supports_relative_and_absolute_destination_paths
101
141
  with_site_dir do
102
142
  generate_site(:development)
@@ -2,7 +2,7 @@ require 'support/test_case'
2
2
  require 'support/fixture_config'
3
3
 
4
4
  module Jekyll::Minibundle::Test
5
- class MiniStampProductionModeTest < TestCase
5
+ class MinistampProductionModeTest < TestCase
6
6
  include FixtureConfig
7
7
 
8
8
  def test_asset_destination_path_has_stamp
@@ -101,6 +101,46 @@ module Jekyll::Minibundle::Test
101
101
  end
102
102
  end
103
103
 
104
+ def test_changing_asset_destination_path_to_new_value_and_back_to_original_rewrites_destination
105
+ with_site_dir do
106
+ generate_site(:production)
107
+
108
+ assert File.exist?(destination_path(STAMP_DESTINATION_FINGERPRINT_PATH))
109
+
110
+ ensure_file_mtime_changes do
111
+ find_and_gsub_in_file(
112
+ source_path('_layouts/default.html'),
113
+ '{% ministamp _tmp/site.css assets/screen.css',
114
+ '{% ministamp _tmp/site.css assets/screen2.css'
115
+ )
116
+ end
117
+
118
+ generate_site(:production, clear_cache: false)
119
+
120
+ refute File.exist?(destination_path(STAMP_DESTINATION_FINGERPRINT_PATH))
121
+
122
+ new_destination = "assets/screen2-#{STAMP_FINGERPRINT}.css"
123
+
124
+ assert_equal new_destination, find_css_path_from_index
125
+ assert File.exist?(destination_path(new_destination))
126
+
127
+ ensure_file_mtime_changes do
128
+ find_and_gsub_in_file(
129
+ source_path('_layouts/default.html'),
130
+ '{% ministamp _tmp/site.css assets/screen2.css',
131
+ '{% ministamp _tmp/site.css assets/screen.css'
132
+ )
133
+ end
134
+
135
+ generate_site(:production, clear_cache: false)
136
+
137
+ refute File.exist?(destination_path(new_destination))
138
+
139
+ assert_equal STAMP_DESTINATION_FINGERPRINT_PATH, find_css_path_from_index
140
+ assert File.exist?(destination_path(STAMP_DESTINATION_FINGERPRINT_PATH))
141
+ end
142
+ end
143
+
104
144
  def test_supports_relative_and_absolute_destination_paths
105
145
  with_site_dir do
106
146
  generate_site(:production)
@@ -146,7 +146,7 @@ module Jekyll::Minibundle::Test
146
146
  end
147
147
 
148
148
  def _generate_site(test_options)
149
- AssetFileRegistry.clear if test_options.fetch(:clear_cache, true)
149
+ AssetFileRegistry.clear_all if test_options.fetch(:clear_cache, true)
150
150
  site = new_real_site
151
151
  capture_io { site.process }
152
152
  end
@@ -4,11 +4,11 @@ require 'jekyll/minibundle/asset_file_registry'
4
4
  module Jekyll::Minibundle::Test
5
5
  class AssetFileRegistryTest < TestCase
6
6
  def setup
7
- AssetFileRegistry.clear
7
+ AssetFileRegistry.clear_all
8
8
  @site = new_site
9
9
  end
10
10
 
11
- def test_register_returns_same_bundle_file_for_same_bundle_configs
11
+ def test_register_returns_same_bundle_file_for_same_bundle_config
12
12
  first = AssetFileRegistry.register_bundle_file(@site, bundle_config)
13
13
  second = AssetFileRegistry.register_bundle_file(@site, bundle_config)
14
14
  assert_same first, second
@@ -16,7 +16,7 @@ module Jekyll::Minibundle::Test
16
16
  assert_contains_only @site.static_files, [first]
17
17
  end
18
18
 
19
- def test_register_returns_same_development_file_collection_for_same_bundle_configs
19
+ def test_register_returns_same_development_file_collection_for_same_bundle_config
20
20
  first = AssetFileRegistry.register_development_file_collection(@site, bundle_config)
21
21
  second = AssetFileRegistry.register_development_file_collection(@site, bundle_config)
22
22
  assert_same first, second
@@ -60,12 +60,18 @@ module Jekyll::Minibundle::Test
60
60
  {description: 'assets', config_diff: {'assets' => %w{b1 b2}}},
61
61
  {description: 'source_directory', config_diff: {'source_dir' => '_assets/src2'}}
62
62
  ].each do |spec|
63
- define_method :"test_register_replaces_cached_bundle_file_with_bundle_config_with_different_#{spec.fetch(:description)}" do
64
- first = AssetFileRegistry.register_bundle_file(@site, bundle_config)
65
- second = AssetFileRegistry.register_bundle_file(@site, bundle_config.merge(spec[:config_diff]))
66
- refute_same first, second
63
+ define_method :"test_raise_exception_if_registering_bundle_file_with_same_destination_path_but_with_different_#{spec.fetch(:description)}" do
64
+ first_config = bundle_config
65
+ first_file = AssetFileRegistry.register_bundle_file(@site, first_config)
66
+ second_config = bundle_config.merge(spec[:config_diff])
67
+ err = assert_raises(RuntimeError) do
68
+ AssetFileRegistry.register_bundle_file(@site, second_config)
69
+ end
70
+ assert_equal <<-END, err.to_s
71
+ Two or more minibundle blocks with the same destination path 'assets/dest.css', but having different asset configuration: #{second_config.inspect} vs. #{first_config.inspect}
72
+ END
67
73
  assert_equal 1, asset_file_registry_size
68
- assert_contains_only @site.static_files, [second]
74
+ assert_contains_only @site.static_files, [first_file]
69
75
  end
70
76
  end
71
77
 
@@ -73,12 +79,18 @@ module Jekyll::Minibundle::Test
73
79
  {description: 'assets', config_diff: {'assets' => %w{b1 b2}}},
74
80
  {description: 'source_directory', config_diff: {'source_dir' => '_assets/src2'}}
75
81
  ].each do |spec|
76
- define_method :"test_register_replaces_cached_development_file_collection_with_bundle_config_with_different_#{spec.fetch(:description)}" do
77
- first = AssetFileRegistry.register_development_file_collection(@site, bundle_config)
78
- second = AssetFileRegistry.register_development_file_collection(@site, bundle_config.merge(spec[:config_diff]))
79
- refute_same first, second
82
+ define_method :"test_raise_exception_if_registering_development_file_collection_with_same_destination_path_but_with_different_#{spec.fetch(:description)}" do
83
+ first_config = bundle_config
84
+ first_file = AssetFileRegistry.register_development_file_collection(@site, first_config)
85
+ second_config = bundle_config.merge(spec[:config_diff])
86
+ err = assert_raises(RuntimeError) do
87
+ AssetFileRegistry.register_development_file_collection(@site, second_config)
88
+ end
89
+ assert_equal <<-END, err.to_s
90
+ Two or more minibundle blocks with the same destination path 'assets/dest.css', but having different asset configuration: #{second_config.inspect} vs. #{first_config.inspect}
91
+ END
80
92
  assert_equal 1, asset_file_registry_size
81
- assert_contains_only @site.static_files, second.files
93
+ assert_contains_only @site.static_files, first_file.files
82
94
  end
83
95
  end
84
96
 
@@ -102,12 +114,16 @@ module Jekyll::Minibundle::Test
102
114
  assert_contains_only @site.static_files, [first, second]
103
115
  end
104
116
 
105
- define_method :"test_register_replaces_cached_#{spec.fetch(:description)}_with_different_source_and_same_destination_paths" do
117
+ define_method :"test_raise_exception_if_registering_#{spec.fetch(:description)}s_with_different_source_and_same_destination_paths" do
106
118
  first = AssetFileRegistry.send(spec.fetch(:method), @site, '_assets/src1.css', 'assets/dest1.css')
107
- second = AssetFileRegistry.send(spec.fetch(:method), @site, '_assets/src2.css', 'assets/dest1.css')
108
- refute_same first, second
119
+ err = assert_raises(RuntimeError) do
120
+ AssetFileRegistry.send(spec.fetch(:method), @site, '_assets/src2.css', 'assets/dest1.css')
121
+ end
122
+ assert_equal <<-END, err.to_s
123
+ Two or more ministamp tags with the same destination path 'assets/dest1.css', but different asset source paths: '_assets/src2.css' vs. '_assets/src1.css'
124
+ END
109
125
  assert_equal 1, asset_file_registry_size
110
- assert_contains_only @site.static_files, [second]
126
+ assert_contains_only @site.static_files, [first]
111
127
  end
112
128
  end
113
129
 
@@ -116,7 +132,7 @@ module Jekyll::Minibundle::Test
116
132
  err = assert_raises(RuntimeError) do
117
133
  AssetFileRegistry.register_stamp_file(@site, '_assets/src1.css', 'assets/dest.css')
118
134
  end
119
- assert_equal 'ministamp tag has same destination path as a minibundle block: assets/dest.css', err.to_s
135
+ assert_equal "ministamp tag has the same destination path as a minibundle block: 'assets/dest.css'", err.to_s
120
136
  assert_equal 1, asset_file_registry_size
121
137
  assert_contains_only @site.static_files, [file]
122
138
  end
@@ -126,11 +142,43 @@ module Jekyll::Minibundle::Test
126
142
  err = assert_raises(RuntimeError) do
127
143
  AssetFileRegistry.register_bundle_file(@site, bundle_config.merge('type' => :css, 'destination_path' => 'assets/dest'))
128
144
  end
129
- assert_equal 'minibundle block has same destination path as a ministamp tag: assets/dest.css', err.to_s
145
+ assert_equal "minibundle block has the same destination path as a ministamp tag: 'assets/dest.css'", err.to_s
130
146
  assert_equal 1, asset_file_registry_size
131
147
  assert_contains_only @site.static_files, [file]
132
148
  end
133
149
 
150
+ [
151
+ {description: 'bundle_file', method: :register_bundle_file},
152
+ {description: 'development_file_collection', method: :register_development_file_collection}
153
+ ].each do |spec|
154
+ define_method :"test_remove_unused_#{spec.fetch(:description)}" do
155
+ AssetFileRegistry.send(spec.fetch(:method), @site, bundle_config)
156
+ AssetFileRegistry.clear_unused
157
+
158
+ assert_equal 1, asset_file_registry_size
159
+
160
+ AssetFileRegistry.clear_unused
161
+
162
+ assert_equal 0, asset_file_registry_size
163
+ end
164
+ end
165
+
166
+ [
167
+ {description: 'stamp_file', method: :register_stamp_file},
168
+ {description: 'development_file', method: :register_development_file}
169
+ ].each do |spec|
170
+ define_method :"test_remove_unused_#{spec.fetch(:description)}" do
171
+ AssetFileRegistry.send(spec.fetch(:method), @site, '_assets/src.css', 'assets/dest.css')
172
+ AssetFileRegistry.clear_unused
173
+
174
+ assert_equal 1, asset_file_registry_size
175
+
176
+ AssetFileRegistry.clear_unused
177
+
178
+ assert_equal 0, asset_file_registry_size
179
+ end
180
+ end
181
+
134
182
  private
135
183
 
136
184
  def bundle_config
@@ -41,7 +41,7 @@ module Jekyll::Minibundle::Test
41
41
  }
42
42
  ].each do |spec|
43
43
  define_method :"test_normalizing_baseurl_with_#{spec.fetch(:description)}" do
44
- AssetFileRegistry.clear
44
+ AssetFileRegistry.clear_all
45
45
 
46
46
  template = Liquid::Template.parse(<<-END)
47
47
  {% minibundle css %}
@@ -21,7 +21,7 @@ module Jekyll::Minibundle::Test
21
21
  end
22
22
 
23
23
  def test_ignore_rest_arguments
24
- AssetFileRegistry.clear
24
+ AssetFileRegistry.clear_all
25
25
  output = Liquid::Template
26
26
  .parse("{% ministamp #{STAMP_SOURCE_PATH} #{STAMP_DESTINATION_PATH} rest %}")
27
27
  .render({}, registers: {site: new_fake_site(site_fixture_path)})
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-minibundle
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tuomas Kareinen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-25 00:00:00.000000000 Z
11
+ date: 2016-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.1'
19
+ version: 3.0.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '3.1'
26
+ version: 3.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -104,12 +104,13 @@ files:
104
104
  - lib/jekyll/minibundle/asset_stamp.rb
105
105
  - lib/jekyll/minibundle/asset_tag_markup.rb
106
106
  - lib/jekyll/minibundle/bundle_file.rb
107
- - lib/jekyll/minibundle/compatibility.rb
108
107
  - lib/jekyll/minibundle/development_file.rb
109
108
  - lib/jekyll/minibundle/development_file_collection.rb
110
109
  - lib/jekyll/minibundle/environment.rb
110
+ - lib/jekyll/minibundle/exceptions.rb
111
111
  - lib/jekyll/minibundle/files.rb
112
112
  - lib/jekyll/minibundle/hashes.rb
113
+ - lib/jekyll/minibundle/log.rb
113
114
  - lib/jekyll/minibundle/mini_bundle_block.rb
114
115
  - lib/jekyll/minibundle/mini_stamp_tag.rb
115
116
  - lib/jekyll/minibundle/stamp_file.rb
@@ -126,7 +127,6 @@ files:
126
127
  - test/fixture/site/about.html
127
128
  - test/fixture/site/assets/site.css
128
129
  - test/fixture/site/index.html
129
- - test/integration/known_caveats_test.rb
130
130
  - test/integration/minibundle_development_mode_test.rb
131
131
  - test/integration/minibundle_production_mode_test.rb
132
132
  - test/integration/ministamp_development_mode_test.rb
@@ -192,7 +192,6 @@ test_files:
192
192
  - test/fixture/site/about.html
193
193
  - test/fixture/site/assets/site.css
194
194
  - test/fixture/site/index.html
195
- - test/integration/known_caveats_test.rb
196
195
  - test/integration/minibundle_development_mode_test.rb
197
196
  - test/integration/minibundle_production_mode_test.rb
198
197
  - test/integration/ministamp_development_mode_test.rb
@@ -1,37 +0,0 @@
1
- module Jekyll::Minibundle
2
- module Compatibility
3
- LOG_TOPIC = 'Minibundle:'.freeze
4
-
5
- class << self
6
- # SafeYAML.load is introduced in Jekyll 2.0.0
7
- if defined?(::SafeYAML) && ::SafeYAML.respond_to?(:load)
8
- def load_yaml(*args)
9
- ::SafeYAML.load(*args)
10
- end
11
- else
12
- def load_yaml(*args)
13
- ::YAML.load(*args)
14
- end
15
- end
16
-
17
- # Jekyll.logger is introduced in Jekyll 1.0.3
18
- if ::Jekyll.respond_to?(:logger)
19
- def log_error(msg)
20
- ::Jekyll.logger.error(LOG_TOPIC, msg)
21
- end
22
-
23
- def log_info(msg)
24
- ::Jekyll.logger.info(LOG_TOPIC, msg)
25
- end
26
- else
27
- def log_error(msg)
28
- $stderr.puts(msg)
29
- end
30
-
31
- def log_info(msg)
32
- $stdout.puts(msg)
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,89 +0,0 @@
1
- require 'support/test_case'
2
- require 'support/fixture_config'
3
-
4
- module Jekyll::Minibundle::Test
5
- # Known software caveats that won't be fixed in the current design
6
- # of the software.
7
- class KnownCaveatsTest < TestCase
8
- include FixtureConfig
9
-
10
- # In Jekyll's watch (auto-regeneration) mode, changing asset
11
- # destination path to a new value triggers the plugin to rebundle
12
- # the assets and writing the bundle file to site output
13
- # directory. After that, changing the destination path back to the
14
- # original value should cause the plugin to write the original
15
- # bundle file to site output directory again. This should happen
16
- # without rebundling the assets, because the plugin stores the
17
- # original bundle in a temporary file.
18
- #
19
- # The plugin cannot rewrite the original bundle file to site
20
- # output directory, because it does not get a trigger for doing
21
- # so. The plugin has a non-expiring cumulative cache for
22
- # assets. This allows the plugin to avoid rebundling assets in
23
- # site regeneration if the assets themselves are unchanged. This
24
- # same mechanism is the cause for this caveat.
25
- #
26
- # As a workaround, touching or changing one of the assets in the
27
- # bundle triggers rebundling and rewriting the bundle file to site
28
- # output directory.
29
- #
30
- # For now, we have decided that the caveat is a minor drawback
31
- # compared to the benefit of avoiding unnecessary rebundling in
32
- # site regeneration.
33
- def test_changing_asset_destination_path_to_new_value_and_back_to_original_does_not_rewrite_destination
34
- with_site_dir do
35
- generate_site(:production)
36
-
37
- assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
38
-
39
- ensure_file_mtime_changes do
40
- change_destination_path('assets/site', 'assets/site2')
41
- end
42
-
43
- generate_site(:production, clear_cache: false)
44
-
45
- refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
46
-
47
- new_destination = "assets/site2-#{JS_BUNDLE_FINGERPRINT}.js"
48
-
49
- assert_equal new_destination, find_js_path_from_index
50
- assert File.exist?(destination_path(new_destination))
51
-
52
- ensure_file_mtime_changes do
53
- change_destination_path('assets/site2', 'assets/site')
54
-
55
- # CAVEAT: This should not be needed.
56
- FileUtils.touch(source_path('_assets/scripts/dependency.js'))
57
- end
58
-
59
- generate_site(:production, clear_cache: false)
60
-
61
- assert_equal JS_BUNDLE_DESTINATION_FINGERPRINT_PATH, find_js_path_from_index
62
- refute File.exist?(destination_path(new_destination))
63
- assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
64
- end
65
- end
66
-
67
- private
68
-
69
- def change_destination_path(from, to)
70
- match_snippet = <<-END
71
- {% minibundle js %}
72
- source_dir: _assets/scripts
73
- destination_path: #{from}
74
- END
75
-
76
- replacement_snippet = <<-END
77
- {% minibundle js %}
78
- source_dir: _assets/scripts
79
- destination_path: #{to}
80
- END
81
-
82
- find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
83
- end
84
-
85
- def find_js_path_from_index
86
- find_html_element(File.read(destination_path('index.html')), 'body script').first['src']
87
- end
88
- end
89
- end