jekyll-minibundle 1.5.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -6
- data/README.md +34 -24
- data/Rakefile +19 -14
- data/jekyll-minibundle.gemspec +5 -4
- data/lib/jekyll/minibundle/asset_bundle.rb +24 -4
- data/lib/jekyll/minibundle/asset_file_operations.rb +0 -8
- data/lib/jekyll/minibundle/asset_file_properties.rb +26 -8
- data/lib/jekyll/minibundle/asset_file_registry.rb +57 -21
- data/lib/jekyll/minibundle/asset_tag_markup.rb +13 -4
- data/lib/jekyll/minibundle/bundle_file.rb +9 -6
- data/lib/jekyll/minibundle/compatibility.rb +11 -1
- data/lib/jekyll/minibundle/development_file.rb +6 -0
- data/lib/jekyll/minibundle/development_file_collection.rb +3 -16
- data/lib/jekyll/minibundle/environment.rb +5 -12
- data/lib/jekyll/minibundle/files.rb +18 -0
- data/lib/jekyll/minibundle/hashes.rb +20 -0
- data/lib/jekyll/minibundle/mini_bundle_block.rb +52 -12
- data/lib/jekyll/minibundle/mini_stamp_tag.rb +27 -8
- data/lib/jekyll/minibundle/stamp_file.rb +9 -6
- data/lib/jekyll/minibundle/version.rb +1 -1
- data/test/fixture/site/_bin/with_count +6 -5
- data/test/integration/known_caveats_test.rb +89 -0
- data/test/integration/minibundle_development_mode_test.rb +171 -26
- data/test/integration/minibundle_production_mode_test.rb +234 -42
- data/test/integration/ministamp_development_mode_test.rb +145 -0
- data/test/integration/{ministamp_test.rb → ministamp_production_mode_test.rb} +72 -23
- data/test/integration/static_files_as_asset_sources_test.rb +3 -0
- data/test/support/assertions.rb +24 -0
- data/test/support/fixture_config.rb +13 -10
- data/test/support/static_file_api_config.rb +9 -3
- data/test/support/test_case.rb +7 -6
- data/test/unit/asset_bundle_test.rb +16 -2
- data/test/unit/asset_file_registry_test.rb +117 -14
- data/test/unit/asset_tag_markup_test.rb +17 -5
- data/test/unit/bundle_file_properties_test.rb +32 -8
- data/test/unit/bundle_file_writing_test.rb +10 -11
- data/test/unit/development_file_collection_properties_test.rb +47 -15
- data/test/unit/environment_test.rb +0 -13
- data/test/unit/files_test.rb +46 -0
- data/test/unit/hashes_test.rb +41 -0
- data/test/unit/mini_bundle_block_test.rb +56 -1
- data/test/unit/mini_stamp_tag_test.rb +8 -8
- data/test/unit/stamp_file_properties_test.rb +32 -13
- data/test/unit/stamp_file_writing_test.rb +1 -5
- metadata +38 -16
- data/test/unit/development_file_collection_writing_test.rb +0 -43
- data/test/unit/jekyll_payload_test.rb +0 -64
@@ -9,21 +9,20 @@ module Jekyll::Minibundle
|
|
9
9
|
|
10
10
|
attr_reader :asset_source_path, :asset_destination_dir, :stamped_at
|
11
11
|
|
12
|
-
def initialize(site, asset_source_path, asset_destination_path
|
12
|
+
def initialize(site, asset_source_path, asset_destination_path)
|
13
13
|
@site = site
|
14
|
-
@basenamer = basenamer
|
15
14
|
@asset_source_path = File.join(@site.source, asset_source_path)
|
16
15
|
@asset_destination_dir = File.dirname(asset_destination_path)
|
17
16
|
@asset_destination_extension = File.extname(asset_destination_path)
|
18
|
-
@asset_destination_base_prefix = File.basename(asset_destination_path)[0
|
17
|
+
@asset_destination_base_prefix = File.basename(asset_destination_path)[0..-(@asset_destination_extension.size + 1)]
|
19
18
|
@stamped_at = nil
|
20
19
|
@is_modified = false
|
21
20
|
end
|
22
21
|
|
23
22
|
def destination_path_for_markup
|
24
23
|
# we must regenerate the fingerprint here, if at all, in order
|
25
|
-
# to make sure
|
26
|
-
# fingerprint
|
24
|
+
# to make sure markup destination and generated file paths have
|
25
|
+
# the same fingerprint
|
27
26
|
if modified?
|
28
27
|
@stamped_at = mtime
|
29
28
|
@is_modified = true
|
@@ -33,6 +32,10 @@ module Jekyll::Minibundle
|
|
33
32
|
asset_destination_path
|
34
33
|
end
|
35
34
|
|
35
|
+
def extname
|
36
|
+
@asset_destination_extension
|
37
|
+
end
|
38
|
+
|
36
39
|
# writes destination only after `markup` has been called
|
37
40
|
def write(site_destination_dir)
|
38
41
|
if @is_modified
|
@@ -47,7 +50,7 @@ module Jekyll::Minibundle
|
|
47
50
|
private
|
48
51
|
|
49
52
|
def asset_destination_basename
|
50
|
-
@
|
53
|
+
"#{@asset_destination_base_prefix}-#{asset_stamp}#{extname}"
|
51
54
|
end
|
52
55
|
|
53
56
|
def asset_stamp
|
@@ -2,11 +2,12 @@
|
|
2
2
|
|
3
3
|
filename = ARGV.first
|
4
4
|
|
5
|
-
count =
|
6
|
-
File.
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
count =
|
6
|
+
if File.exist?(filename)
|
7
|
+
File.read(filename).strip.to_i
|
8
|
+
else
|
9
|
+
0
|
10
|
+
end
|
10
11
|
|
11
12
|
File.write(filename, "#{count + 1}\n")
|
12
13
|
|
@@ -0,0 +1,89 @@
|
|
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
|
@@ -51,16 +51,18 @@ module Jekyll::Minibundle::Test
|
|
51
51
|
end
|
52
52
|
|
53
53
|
[
|
54
|
-
|
55
|
-
|
54
|
+
{desc: 'changing', action: ->(source) { File.write(source, '(function() {})()') }},
|
55
|
+
{desc: 'touching', action: ->(source) { FileUtils.touch(source) }}
|
56
56
|
].each do |spec|
|
57
|
-
define_method :"test_#{spec.fetch(:desc)}
|
57
|
+
define_method :"test_#{spec.fetch(:desc)}_asset_source_file_rewrites_destination" do
|
58
58
|
with_site_dir do
|
59
59
|
generate_site(:development)
|
60
|
-
|
60
|
+
|
61
|
+
destination = destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js')
|
61
62
|
org_mtime = mtime_of(destination)
|
62
|
-
source = source_path(
|
63
|
+
source = source_path(JS_BUNDLE_SOURCE_DIR, 'app.js')
|
63
64
|
ensure_file_mtime_changes { spec.fetch(:action).call(source) }
|
65
|
+
|
64
66
|
generate_site(:development, clear_cache: false)
|
65
67
|
|
66
68
|
assert_equal File.read(destination), File.read(source)
|
@@ -69,46 +71,152 @@ module Jekyll::Minibundle::Test
|
|
69
71
|
end
|
70
72
|
end
|
71
73
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
].each do |spec|
|
76
|
-
define_method :"test_#{spec.fetch(:desc)}_js_asset_source_rewrites_destination" do
|
77
|
-
with_site_dir do
|
78
|
-
generate_site(:development)
|
79
|
-
destination = destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js')
|
80
|
-
org_mtime = mtime_of(destination)
|
81
|
-
source = source_path(JS_BUNDLE_SOURCE_DIR, 'app.js')
|
82
|
-
ensure_file_mtime_changes { spec.fetch(:action).call(source) }
|
83
|
-
generate_site(:development, clear_cache: false)
|
74
|
+
def test_changing_asset_source_directory_rewrites_destination
|
75
|
+
with_site_dir do
|
76
|
+
generate_site(:development)
|
84
77
|
|
85
|
-
|
86
|
-
|
78
|
+
destination = destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js')
|
79
|
+
org_mtime = mtime_of(destination)
|
80
|
+
|
81
|
+
match_snippet = <<-END
|
82
|
+
{% minibundle js %}
|
83
|
+
source_dir: _assets/scripts
|
84
|
+
END
|
85
|
+
|
86
|
+
replacement_snippet = <<-END
|
87
|
+
{% minibundle js %}
|
88
|
+
source_dir: _assets/scripts2
|
89
|
+
END
|
90
|
+
|
91
|
+
ensure_file_mtime_changes do
|
92
|
+
FileUtils.mv(source_path('_assets/scripts'), source_path('_assets/scripts2'))
|
93
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
|
94
|
+
end
|
95
|
+
|
96
|
+
generate_site(:development, clear_cache: false)
|
97
|
+
|
98
|
+
assert_operator mtime_of(destination), :>, org_mtime
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_changing_asset_source_list_rewrites_destination
|
103
|
+
with_site_dir do
|
104
|
+
generate_site(:development)
|
105
|
+
|
106
|
+
org_mtime = mtime_of(destination_path(JS_BUNDLE_DESTINATION_PATH, 'dependency.js'))
|
107
|
+
|
108
|
+
match_snippet = <<-END
|
109
|
+
assets:
|
110
|
+
- dependency
|
111
|
+
- app
|
112
|
+
END
|
113
|
+
|
114
|
+
replacement_snippet = <<-END
|
115
|
+
assets:
|
116
|
+
- dependency
|
117
|
+
END
|
118
|
+
|
119
|
+
ensure_file_mtime_changes do
|
120
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
|
87
121
|
end
|
122
|
+
|
123
|
+
generate_site(:development, clear_cache: false)
|
124
|
+
|
125
|
+
assert_equal [File.join(JS_BUNDLE_DESTINATION_PATH, 'dependency.js')], find_js_paths_from_index
|
126
|
+
|
127
|
+
new_mtime = mtime_of(destination_path(JS_BUNDLE_DESTINATION_PATH, 'dependency.js'))
|
128
|
+
assert_operator new_mtime, :>, org_mtime
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_changing_asset_destination_path_rewrites_destination
|
133
|
+
with_site_dir do
|
134
|
+
generate_site(:development)
|
135
|
+
|
136
|
+
assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'dependency.js'))
|
137
|
+
assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js'))
|
138
|
+
|
139
|
+
match_snippet = <<-END
|
140
|
+
{% minibundle js %}
|
141
|
+
source_dir: _assets/scripts
|
142
|
+
destination_path: assets/site
|
143
|
+
END
|
144
|
+
|
145
|
+
replacement_snippet = <<-END
|
146
|
+
{% minibundle js %}
|
147
|
+
source_dir: _assets/scripts
|
148
|
+
destination_path: assets/site2
|
149
|
+
END
|
150
|
+
|
151
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
|
152
|
+
|
153
|
+
generate_site(:development, clear_cache: false)
|
154
|
+
|
155
|
+
assert_equal ['assets/site2/dependency.js', 'assets/site2/app.js'], find_js_paths_from_index
|
156
|
+
assert File.exist?(destination_path('assets/site2/dependency.js'))
|
157
|
+
assert File.exist?(destination_path('assets/site2/app.js'))
|
88
158
|
end
|
89
159
|
end
|
90
160
|
|
91
161
|
def test_supports_relative_and_absolute_destination_paths
|
92
162
|
with_site_dir do
|
93
|
-
expected_css_path = destination_path(CSS_BUNDLE_DESTINATION_PATH, 'common.css')
|
94
|
-
expected_js_path = destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js')
|
95
163
|
generate_site(:development)
|
96
164
|
|
97
|
-
assert File.exist?(
|
98
|
-
assert File.exist?(
|
165
|
+
assert File.exist?(destination_path(CSS_BUNDLE_DESTINATION_PATH, 'common.css'))
|
166
|
+
assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js'))
|
167
|
+
|
99
168
|
assert_equal 'assets/site/common.css', find_css_paths_from_index.last
|
100
169
|
assert_equal 'assets/site/app.js', find_js_paths_from_index.last
|
101
170
|
|
102
171
|
find_and_gsub_in_file(source_path('_layouts/default.html'), 'destination_path: assets/site', 'destination_path: /assets/site')
|
172
|
+
|
103
173
|
generate_site(:development, clear_cache: false)
|
104
174
|
|
105
|
-
assert File.exist?(expected_css_path)
|
106
|
-
assert File.exist?(expected_js_path)
|
107
175
|
assert_equal '/assets/site/common.css', find_css_paths_from_index.last
|
108
176
|
assert_equal '/assets/site/app.js', find_js_paths_from_index.last
|
109
177
|
end
|
110
178
|
end
|
111
179
|
|
180
|
+
def test_supports_baseurl
|
181
|
+
with_site_dir do
|
182
|
+
generate_site(:development)
|
183
|
+
|
184
|
+
assert File.exist?(destination_path(CSS_BUNDLE_DESTINATION_PATH, 'common.css'))
|
185
|
+
assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js'))
|
186
|
+
|
187
|
+
assert_equal 'assets/site/common.css', find_css_paths_from_index.last
|
188
|
+
assert_equal 'assets/site/app.js', find_js_paths_from_index.last
|
189
|
+
|
190
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), '{% minibundle css %}', "{% minibundle css %}\n baseurl: /css-root")
|
191
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), '{% minibundle js %}', "{% minibundle js %}\n baseurl: /js-root")
|
192
|
+
|
193
|
+
generate_site(:development, clear_cache: false)
|
194
|
+
|
195
|
+
assert_equal '/css-root/assets/site/common.css', find_css_paths_from_index.last
|
196
|
+
assert_equal '/js-root/assets/site/app.js', find_js_paths_from_index.last
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_supports_changing_attributes
|
201
|
+
with_site_dir do
|
202
|
+
generate_site(:development)
|
203
|
+
|
204
|
+
assert File.exist?(destination_path(CSS_BUNDLE_DESTINATION_PATH, 'common.css'))
|
205
|
+
assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js'))
|
206
|
+
|
207
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), 'id: my-styles', 'id: my-styles2')
|
208
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), 'id: my-scripts', 'id: my-scripts2')
|
209
|
+
|
210
|
+
generate_site(:development, clear_cache: false)
|
211
|
+
|
212
|
+
css_ids = find_css_elements_from_index.map { |el| el['id'] }.uniq
|
213
|
+
assert_equal ['my-styles2'], css_ids
|
214
|
+
|
215
|
+
js_ids = find_js_elements_from_index.map { |el| el['id'] }.uniq
|
216
|
+
assert_equal ['my-scripts2'], js_ids
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
112
220
|
def test_does_not_require_bundling_commands
|
113
221
|
with_site_dir do
|
114
222
|
generate_site(:development, minifier_cmd_css: nil, minifier_cmd_js: nil)
|
@@ -116,17 +224,54 @@ module Jekyll::Minibundle::Test
|
|
116
224
|
end
|
117
225
|
end
|
118
226
|
|
119
|
-
def
|
227
|
+
def test_does_not_rewrite_destination_when_changing_nonsource_files
|
120
228
|
with_site_dir do
|
121
229
|
generate_site(:development)
|
230
|
+
|
122
231
|
expected_js_path = destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js')
|
123
232
|
org_mtime = mtime_of(expected_js_path)
|
124
233
|
ensure_file_mtime_changes { File.write(source_path(JS_BUNDLE_SOURCE_DIR, 'dependency.js'), '(function() {})()') }
|
234
|
+
|
125
235
|
generate_site(:development, clear_cache: false)
|
126
236
|
|
127
237
|
assert_equal org_mtime, mtime_of(expected_js_path)
|
128
238
|
|
129
239
|
ensure_file_mtime_changes { FileUtils.touch('index.html') }
|
240
|
+
|
241
|
+
generate_site(:development, clear_cache: false)
|
242
|
+
|
243
|
+
assert_equal org_mtime, mtime_of(expected_js_path)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_does_not_rewrite_destination_when_changing_attributes
|
248
|
+
with_site_dir do
|
249
|
+
generate_site(:development)
|
250
|
+
|
251
|
+
expected_js_path = destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js')
|
252
|
+
org_mtime = mtime_of(expected_js_path)
|
253
|
+
|
254
|
+
ensure_file_mtime_changes do
|
255
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), 'id: my-scripts', 'id: my-scripts2')
|
256
|
+
end
|
257
|
+
|
258
|
+
generate_site(:development, clear_cache: false)
|
259
|
+
|
260
|
+
assert_equal org_mtime, mtime_of(expected_js_path)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
def test_does_not_rebundle_assets_when_changing_baseurl
|
265
|
+
with_site_dir do
|
266
|
+
generate_site(:development)
|
267
|
+
|
268
|
+
expected_js_path = destination_path(JS_BUNDLE_DESTINATION_PATH, 'app.js')
|
269
|
+
org_mtime = mtime_of(expected_js_path)
|
270
|
+
|
271
|
+
ensure_file_mtime_changes do
|
272
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), '{% minibundle js %}', "{% minibundle js %}\n baseurl: /js-root")
|
273
|
+
end
|
274
|
+
|
130
275
|
generate_site(:development, clear_cache: false)
|
131
276
|
|
132
277
|
assert_equal org_mtime, mtime_of(expected_js_path)
|
@@ -61,7 +61,7 @@ module Jekyll::Minibundle::Test
|
|
61
61
|
def test_inserts_semicolons_between_js_assets
|
62
62
|
with_precompiled_site(:production) do
|
63
63
|
bundle = File.read(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
64
|
-
assert_match(
|
64
|
+
assert_match(/}\)\(window\)\n;\n\(function/, bundle)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -81,89 +81,232 @@ module Jekyll::Minibundle::Test
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
-
def
|
84
|
+
def test_changing_asset_source_file_rewrites_destination
|
85
85
|
with_site_dir do
|
86
86
|
generate_site(:production)
|
87
|
-
|
88
|
-
ensure_file_mtime_changes { File.write(source_path(
|
87
|
+
|
88
|
+
ensure_file_mtime_changes { File.write(source_path(JS_BUNDLE_SOURCE_DIR, 'app.js'), '(function() {})()') }
|
89
|
+
|
89
90
|
generate_site(:production, clear_cache: false)
|
90
91
|
|
91
|
-
refute File.exist?(destination_path(
|
92
|
+
refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
92
93
|
|
93
|
-
new_destination = 'assets/site-
|
94
|
+
new_destination = 'assets/site-375a0b430b0c5555d0edd2205d26c04d.js'
|
94
95
|
|
95
|
-
assert_equal new_destination,
|
96
|
+
assert_equal new_destination, find_js_path_from_index
|
96
97
|
assert File.exist?(destination_path(new_destination))
|
97
|
-
assert_operator mtime_of(destination_path(new_destination)), :>, org_mtime
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
101
|
-
def
|
101
|
+
def test_touching_asset_source_file_rewrites_destination
|
102
102
|
with_site_dir do
|
103
103
|
generate_site(:production)
|
104
|
+
|
104
105
|
org_mtime = mtime_of(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
105
|
-
ensure_file_mtime_changes {
|
106
|
+
ensure_file_mtime_changes { FileUtils.touch(source_path(JS_BUNDLE_SOURCE_DIR, 'app.js')) }
|
107
|
+
|
108
|
+
generate_site(:production, clear_cache: false)
|
109
|
+
|
110
|
+
assert_equal JS_BUNDLE_DESTINATION_FINGERPRINT_PATH, find_js_path_from_index
|
111
|
+
assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
112
|
+
assert_operator mtime_of(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH)), :>, org_mtime
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_changing_asset_source_directory_rewrites_destination
|
117
|
+
with_site_dir do
|
118
|
+
generate_site(:production)
|
119
|
+
|
120
|
+
org_mtime = mtime_of(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
121
|
+
|
122
|
+
match_snippet = <<-END
|
123
|
+
{% minibundle js %}
|
124
|
+
source_dir: _assets/scripts
|
125
|
+
END
|
126
|
+
|
127
|
+
replacement_snippet = <<-END
|
128
|
+
{% minibundle js %}
|
129
|
+
source_dir: _assets/scripts2
|
130
|
+
END
|
131
|
+
|
132
|
+
ensure_file_mtime_changes do
|
133
|
+
FileUtils.mv(source_path('_assets/scripts'), source_path('_assets/scripts2'))
|
134
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
|
135
|
+
end
|
136
|
+
|
137
|
+
generate_site(:production, clear_cache: false)
|
138
|
+
|
139
|
+
new_mtime = mtime_of(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
140
|
+
|
141
|
+
assert_operator new_mtime, :>, org_mtime
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_changing_asset_source_list_rewrites_destination
|
146
|
+
with_site_dir do
|
147
|
+
generate_site(:production)
|
148
|
+
|
149
|
+
assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
150
|
+
|
151
|
+
match_snippet = <<-END
|
152
|
+
assets:
|
153
|
+
- dependency
|
154
|
+
- app
|
155
|
+
END
|
156
|
+
|
157
|
+
replacement_snippet = <<-END
|
158
|
+
assets:
|
159
|
+
- dependency
|
160
|
+
END
|
161
|
+
|
162
|
+
ensure_file_mtime_changes do
|
163
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
|
164
|
+
end
|
165
|
+
|
106
166
|
generate_site(:production, clear_cache: false)
|
107
167
|
|
108
168
|
refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
109
169
|
|
110
|
-
new_destination = 'assets/site-
|
170
|
+
new_destination = 'assets/site-71042d0b7c86c04e015fde694dd9f409.js'
|
111
171
|
|
112
172
|
assert_equal new_destination, find_js_path_from_index
|
113
173
|
assert File.exist?(destination_path(new_destination))
|
114
|
-
assert_operator mtime_of(destination_path(new_destination)), :>, org_mtime
|
115
174
|
end
|
116
175
|
end
|
117
176
|
|
118
|
-
def
|
177
|
+
def test_changing_asset_destination_path_rewrites_destination
|
119
178
|
with_site_dir do
|
120
179
|
generate_site(:production)
|
121
|
-
|
122
|
-
|
123
|
-
|
180
|
+
|
181
|
+
assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
182
|
+
|
183
|
+
match_snippet = <<-END
|
184
|
+
{% minibundle js %}
|
185
|
+
source_dir: _assets/scripts
|
186
|
+
destination_path: assets/site
|
187
|
+
END
|
188
|
+
|
189
|
+
replacement_snippet = <<-END
|
190
|
+
{% minibundle js %}
|
191
|
+
source_dir: _assets/scripts
|
192
|
+
destination_path: assets/site2
|
193
|
+
END
|
194
|
+
|
195
|
+
ensure_file_mtime_changes do
|
196
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
|
197
|
+
end
|
198
|
+
|
124
199
|
generate_site(:production, clear_cache: false)
|
125
200
|
|
126
|
-
|
127
|
-
|
128
|
-
|
201
|
+
refute File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
202
|
+
|
203
|
+
new_destination = "assets/site2-#{JS_BUNDLE_FINGERPRINT}.js"
|
204
|
+
|
205
|
+
assert_equal new_destination, find_js_path_from_index
|
206
|
+
assert File.exist?(destination_path(new_destination))
|
129
207
|
end
|
130
208
|
end
|
131
209
|
|
132
|
-
def
|
210
|
+
def test_changing_minifier_cmd_rewrites_destination
|
133
211
|
with_site_dir do
|
134
212
|
generate_site(:production)
|
135
|
-
|
136
|
-
|
137
|
-
|
213
|
+
|
214
|
+
assert_equal 0, get_minifier_cmd_count
|
215
|
+
destination = destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH)
|
216
|
+
org_mtime = mtime_of(destination)
|
217
|
+
|
218
|
+
match_snippet = <<-END
|
219
|
+
{% minibundle js %}
|
220
|
+
END
|
221
|
+
|
222
|
+
replacement_snippet = <<-END
|
223
|
+
{% minibundle js %}
|
224
|
+
minifier_cmd: #{minifier_cmd_to_remove_comments_and_count}
|
225
|
+
END
|
226
|
+
|
227
|
+
ensure_file_mtime_changes do
|
228
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), match_snippet, replacement_snippet)
|
229
|
+
end
|
230
|
+
|
138
231
|
generate_site(:production, clear_cache: false)
|
139
232
|
|
140
|
-
assert_equal
|
141
|
-
|
142
|
-
assert_operator mtime_of(destination_path(destination)), :>, org_mtime
|
233
|
+
assert_equal 1, get_minifier_cmd_count
|
234
|
+
assert_operator mtime_of(destination), :>, org_mtime
|
143
235
|
end
|
144
236
|
end
|
145
237
|
|
146
238
|
def test_supports_relative_and_absolute_destination_paths
|
147
239
|
with_site_dir do
|
148
240
|
generate_site(:production)
|
149
|
-
expected_css_path = destination_path(CSS_BUNDLE_DESTINATION_FINGERPRINT_PATH)
|
150
|
-
expected_js_path = destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH)
|
151
241
|
|
152
|
-
assert File.exist?(
|
153
|
-
assert File.exist?(
|
242
|
+
assert File.exist?(destination_path(CSS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
243
|
+
assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
244
|
+
|
154
245
|
assert_equal CSS_BUNDLE_DESTINATION_FINGERPRINT_PATH, find_css_path_from_index
|
155
246
|
assert_equal JS_BUNDLE_DESTINATION_FINGERPRINT_PATH, find_js_path_from_index
|
156
247
|
|
157
248
|
find_and_gsub_in_file(source_path('_layouts/default.html'), 'destination_path: assets/site', 'destination_path: /assets/site')
|
249
|
+
|
158
250
|
generate_site(:production, clear_cache: false)
|
159
251
|
|
160
|
-
assert File.exist?(expected_css_path)
|
161
|
-
assert File.exist?(expected_js_path)
|
162
252
|
assert_equal "/#{CSS_BUNDLE_DESTINATION_FINGERPRINT_PATH}", find_css_path_from_index
|
163
253
|
assert_equal "/#{JS_BUNDLE_DESTINATION_FINGERPRINT_PATH}", find_js_path_from_index
|
164
254
|
end
|
165
255
|
end
|
166
256
|
|
257
|
+
def test_supports_baseurl
|
258
|
+
with_site_dir do
|
259
|
+
generate_site(:production)
|
260
|
+
|
261
|
+
assert File.exist?(destination_path(CSS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
262
|
+
assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
263
|
+
|
264
|
+
assert_equal CSS_BUNDLE_DESTINATION_FINGERPRINT_PATH, find_css_path_from_index
|
265
|
+
assert_equal JS_BUNDLE_DESTINATION_FINGERPRINT_PATH, find_js_path_from_index
|
266
|
+
|
267
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), '{% minibundle css %}', "{% minibundle css %}\n baseurl: /css-root")
|
268
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), '{% minibundle js %}', "{% minibundle js %}\n baseurl: /js-root")
|
269
|
+
|
270
|
+
generate_site(:production, clear_cache: false)
|
271
|
+
|
272
|
+
assert_equal "/css-root/#{CSS_BUNDLE_DESTINATION_FINGERPRINT_PATH}", find_css_path_from_index
|
273
|
+
assert_equal "/js-root/#{JS_BUNDLE_DESTINATION_FINGERPRINT_PATH}", find_js_path_from_index
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def test_supports_baseurl_via_liquid_variable
|
278
|
+
with_site_dir do
|
279
|
+
merge_to_yaml_file(source_path('_config.yml'), 'baseurl' => '/')
|
280
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), '{% minibundle css %}', "{% minibundle css %}\n baseurl: {{ site.baseurl }}")
|
281
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), '{% minibundle js %}', "{% minibundle js %}\n baseurl: {{ site.baseurl }}")
|
282
|
+
|
283
|
+
generate_site(:production)
|
284
|
+
|
285
|
+
assert File.exist?(destination_path(CSS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
286
|
+
assert File.exist?(destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH))
|
287
|
+
|
288
|
+
assert_equal "/#{CSS_BUNDLE_DESTINATION_FINGERPRINT_PATH}", find_css_path_from_index
|
289
|
+
assert_equal "/#{JS_BUNDLE_DESTINATION_FINGERPRINT_PATH}", find_js_path_from_index
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
def test_supports_changing_attributes
|
294
|
+
with_site_dir do
|
295
|
+
generate_site(:production)
|
296
|
+
|
297
|
+
assert_equal CSS_BUNDLE_DESTINATION_FINGERPRINT_PATH, find_css_path_from_index
|
298
|
+
assert_equal JS_BUNDLE_DESTINATION_FINGERPRINT_PATH, find_js_path_from_index
|
299
|
+
|
300
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), 'id: my-styles', 'id: my-styles2')
|
301
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), 'id: my-scripts', 'id: my-scripts2')
|
302
|
+
|
303
|
+
generate_site(:production, clear_cache: false)
|
304
|
+
|
305
|
+
assert_equal 'my-styles2', find_css_element_from_index['id']
|
306
|
+
assert_equal 'my-scripts2', find_js_element_from_index['id']
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
167
310
|
def test_bundles_assets_only_once_at_startup
|
168
311
|
with_site_dir do
|
169
312
|
generate_site(:production, minifier_cmd_js: minifier_cmd_to_remove_comments_and_count)
|
@@ -171,31 +314,77 @@ module Jekyll::Minibundle::Test
|
|
171
314
|
end
|
172
315
|
end
|
173
316
|
|
174
|
-
def
|
317
|
+
def test_does_not_rebundle_assets_when_changing_nonsource_files
|
175
318
|
with_site_dir do
|
176
319
|
generate_site(:production, minifier_cmd_js: minifier_cmd_to_remove_comments_and_count)
|
320
|
+
|
177
321
|
expected_js_path = destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH)
|
178
|
-
|
322
|
+
org_mtime = mtime_of(expected_js_path)
|
179
323
|
|
180
324
|
assert_equal 1, get_minifier_cmd_count
|
181
325
|
|
182
326
|
ensure_file_mtime_changes { File.write(source_path(CSS_BUNDLE_SOURCE_DIR, 'common.css'), 'h1 {}') }
|
327
|
+
|
183
328
|
generate_site(:production, clear_cache: false, minifier_cmd_js: minifier_cmd_to_remove_comments_and_count)
|
184
329
|
|
185
|
-
assert_equal
|
330
|
+
assert_equal org_mtime, mtime_of(expected_js_path)
|
186
331
|
assert_equal 1, get_minifier_cmd_count
|
187
332
|
|
188
333
|
ensure_file_mtime_changes { FileUtils.touch('index.html') }
|
334
|
+
|
335
|
+
generate_site(:production, clear_cache: false, minifier_cmd_js: minifier_cmd_to_remove_comments_and_count)
|
336
|
+
|
337
|
+
assert_equal org_mtime, mtime_of(expected_js_path)
|
338
|
+
assert_equal 1, get_minifier_cmd_count
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
def test_does_not_rebundle_assets_when_changing_attributes
|
343
|
+
with_site_dir do
|
344
|
+
generate_site(:production, minifier_cmd_js: minifier_cmd_to_remove_comments_and_count)
|
345
|
+
|
346
|
+
expected_js_path = destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH)
|
347
|
+
org_mtime = mtime_of(expected_js_path)
|
348
|
+
|
349
|
+
assert_equal 1, get_minifier_cmd_count
|
350
|
+
|
351
|
+
ensure_file_mtime_changes do
|
352
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), 'id: my-scripts', 'id: my-scripts2')
|
353
|
+
end
|
354
|
+
|
355
|
+
generate_site(:production, clear_cache: false, minifier_cmd_js: minifier_cmd_to_remove_comments_and_count)
|
356
|
+
|
357
|
+
assert_equal org_mtime, mtime_of(expected_js_path)
|
358
|
+
assert_equal 1, get_minifier_cmd_count
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
def test_does_not_rebundle_assets_when_changing_baseurl
|
363
|
+
with_site_dir do
|
364
|
+
generate_site(:production, minifier_cmd_js: minifier_cmd_to_remove_comments_and_count)
|
365
|
+
|
366
|
+
expected_js_path = destination_path(JS_BUNDLE_DESTINATION_FINGERPRINT_PATH)
|
367
|
+
org_mtime = mtime_of(expected_js_path)
|
368
|
+
|
369
|
+
assert_equal 1, get_minifier_cmd_count
|
370
|
+
|
371
|
+
ensure_file_mtime_changes do
|
372
|
+
find_and_gsub_in_file(source_path('_layouts/default.html'), '{% minibundle js %}', "{% minibundle js %}\n baseurl: /js-root")
|
373
|
+
end
|
374
|
+
|
189
375
|
generate_site(:production, clear_cache: false, minifier_cmd_js: minifier_cmd_to_remove_comments_and_count)
|
190
376
|
|
191
|
-
assert_equal
|
377
|
+
assert_equal org_mtime, mtime_of(expected_js_path)
|
192
378
|
assert_equal 1, get_minifier_cmd_count
|
193
379
|
end
|
194
380
|
end
|
195
381
|
|
196
382
|
def test_gets_minifier_command_from_site_configuration
|
197
383
|
with_site_dir do
|
198
|
-
merge_to_yaml_file(
|
384
|
+
merge_to_yaml_file(
|
385
|
+
source_path('_config.yml'),
|
386
|
+
'minibundle' => {'minifier_commands' => {'js' => minifier_cmd_to_remove_comments_and_count('minifier_cmd_config_count')}}
|
387
|
+
)
|
199
388
|
|
200
389
|
generate_site(:production, minifier_cmd_js: nil)
|
201
390
|
|
@@ -207,7 +396,10 @@ module Jekyll::Minibundle::Test
|
|
207
396
|
|
208
397
|
def test_minifier_command_from_environment_overrides_command_from_site_configuration
|
209
398
|
with_site_dir do
|
210
|
-
merge_to_yaml_file(
|
399
|
+
merge_to_yaml_file(
|
400
|
+
source_path('_config.yml'),
|
401
|
+
'minibundle' => {'minifier_commands' => {'js' => minifier_cmd_to_remove_comments_and_count('minifier_cmd_config_count')}}
|
402
|
+
)
|
211
403
|
|
212
404
|
generate_site(:production, minifier_cmd_js: minifier_cmd_to_remove_comments_and_count('minifier_cmd_env_count'))
|
213
405
|
|
@@ -275,10 +467,10 @@ title: Test
|
|
275
467
|
end
|
276
468
|
|
277
469
|
def source_assets_size(source_subdir, assets, type)
|
278
|
-
assets
|
279
|
-
map { |f| File.read(site_fixture_path(source_subdir, "#{f}.#{type}")) }
|
280
|
-
join('')
|
281
|
-
size
|
470
|
+
assets
|
471
|
+
.map { |f| File.read(site_fixture_path(source_subdir, "#{f}.#{type}")) }
|
472
|
+
.join('')
|
473
|
+
.size
|
282
474
|
end
|
283
475
|
end
|
284
476
|
end
|