jekyll-minibundle 2.1.1 → 2.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -0
- data/README.md +6 -2
- data/jekyll-minibundle.gemspec +1 -1
- data/lib/jekyll/minibundle/asset_bundle.rb +10 -5
- data/lib/jekyll/minibundle/asset_file_properties.rb +1 -5
- data/lib/jekyll/minibundle/asset_tag_markup.rb +3 -12
- data/lib/jekyll/minibundle/bundle_file.rb +25 -16
- data/lib/jekyll/minibundle/development_file.rb +14 -4
- data/lib/jekyll/minibundle/files.rb +22 -9
- data/lib/jekyll/minibundle/mini_bundle_block.rb +14 -10
- data/lib/jekyll/minibundle/mini_stamp_tag.rb +2 -1
- data/lib/jekyll/minibundle/stamp_file.rb +21 -9
- data/lib/jekyll/minibundle/version.rb +1 -1
- data/test/fixture/site/_layouts/default.html +1 -1
- data/test/integration/minibundle_development_mode_test.rb +18 -3
- data/test/integration/minibundle_production_mode_test.rb +108 -4
- data/test/integration/ministamp_development_mode_test.rb +13 -6
- data/test/integration/ministamp_production_mode_test.rb +63 -4
- data/test/support/static_file_api_config.rb +1 -0
- data/test/support/test_case.rb +4 -4
- data/test/unit/asset_bundle_test.rb +15 -8
- data/test/unit/asset_file_registry_test.rb +3 -3
- data/test/unit/asset_tag_markup_test.rb +5 -17
- data/test/unit/bundle_file_properties_test.rb +4 -0
- data/test/unit/bundle_file_writing_test.rb +54 -18
- data/test/unit/development_file_collection_properties_test.rb +5 -0
- data/test/unit/development_file_writing_test.rb +39 -0
- data/test/unit/environment_test.rb +4 -4
- data/test/unit/files_test.rb +13 -0
- data/test/unit/jekyll_static_file_api_test.rb +1 -1
- data/test/unit/mini_bundle_block_test.rb +1 -1
- data/test/unit/mini_stamp_tag_test.rb +1 -1
- data/test/unit/stamp_file_properties_test.rb +4 -0
- data/test/unit/stamp_file_writing_test.rb +54 -18
- metadata +7 -6
- data/lib/jekyll/minibundle/asset_file_operations.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c11f2890adfcdd3cc6902ddf8f1449f3e1b1721
|
4
|
+
data.tar.gz: 8676586c08adf47c8962dcee2214cfba11eeff55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3915fc23411307ba14bf2e700fe40ab7197aa155397027b6bcd65a3cb31efaa631df9aea43545b5584bf55e0ed63f33376e5e0f6a3344db4a3d55fa627cd37e3
|
7
|
+
data.tar.gz: d159b2a770dd15d261bdf6b2a6661a866ea73f3a76188d2a85bb62e061f875809558f53d46e0726e494ca2a0cad68ce7a12c006a5d0488c3f9b673f81588db61
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,32 @@
|
|
1
|
+
# 2.1.2 / 2017-02-28
|
2
|
+
|
3
|
+
* Bug fix: remove unnecessary '.' path component from asset destination
|
4
|
+
path. This manifested when the asset destination had no subdirectory.
|
5
|
+
Affects `ministamp` tag and `minibundle` block.
|
6
|
+
|
7
|
+
Example situation:
|
8
|
+
|
9
|
+
```
|
10
|
+
<link href="{{ site.baseurl }}/{% ministamp _assets/site.css site.css %}" rel="stylesheet">
|
11
|
+
```
|
12
|
+
|
13
|
+
Generation result, before the fix:
|
14
|
+
|
15
|
+
```
|
16
|
+
<link href="/./site-6a204bd89f3c8348afd5c77c717a097a.css" rel="stylesheet">
|
17
|
+
```
|
18
|
+
|
19
|
+
Generation result, after the fix:
|
20
|
+
|
21
|
+
```
|
22
|
+
<link href="/site-6a204bd89f3c8348afd5c77c717a097a.css" rel="stylesheet">
|
23
|
+
```
|
24
|
+
|
25
|
+
* Bug fix (related to above): don't let Jekyll's watch mode
|
26
|
+
(auto-regenration) remove asset from generated site directory when
|
27
|
+
asset destination path has no subdirectory.
|
28
|
+
* Show bundle destination path in bundling log message
|
29
|
+
|
1
30
|
# 2.1.1 / 2017-01-14
|
2
31
|
|
3
32
|
* Fix the file permissions of `minibundle` block's output file to
|
data/README.md
CHANGED
@@ -303,8 +303,12 @@ See the sources of [an example site][JekyllMinibundleExampleSite].
|
|
303
303
|
|
304
304
|
## Known caveats
|
305
305
|
|
306
|
-
The plugin does not work with Jekyll's incremental rebuild feature
|
307
|
-
(Jekyll option `--incremental`).
|
306
|
+
1. The plugin does not work with Jekyll's incremental rebuild feature
|
307
|
+
(Jekyll option `--incremental`).
|
308
|
+
|
309
|
+
2. `ministamp` tag does not interpret Liquid variables, as the tag just
|
310
|
+
takes in string literals. Improving this would require new syntax for
|
311
|
+
tag arguments.
|
308
312
|
|
309
313
|
## License
|
310
314
|
|
data/jekyll-minibundle.gemspec
CHANGED
@@ -32,7 +32,7 @@ There are no other runtime dependencies besides the minification tool
|
|
32
32
|
s.add_development_dependency 'nokogiri', '~> 1.6'
|
33
33
|
s.add_development_dependency 'pry', '~> 0.10'
|
34
34
|
s.add_development_dependency 'rake', '~> 12.0'
|
35
|
-
s.add_development_dependency 'rubocop', '~> 0.
|
35
|
+
s.add_development_dependency 'rubocop', '~> 0.47.0'
|
36
36
|
|
37
37
|
s.required_ruby_version = '>= 2.0.0'
|
38
38
|
|
@@ -10,12 +10,13 @@ module Jekyll::Minibundle
|
|
10
10
|
def initialize(config)
|
11
11
|
@type = config.fetch(:type)
|
12
12
|
@asset_paths = config.fetch(:asset_paths)
|
13
|
+
@destination_path = config.fetch(:destination_path)
|
13
14
|
@site_dir = config.fetch(:site_dir)
|
14
15
|
@minifier_cmd = config.fetch(:minifier_cmd)
|
15
16
|
|
16
17
|
unless @minifier_cmd
|
17
18
|
raise <<-END
|
18
|
-
Missing minification command for bundling #{
|
19
|
+
Missing minification command for bundling #{bundle_destination_path}. Specify it in
|
19
20
|
1) minibundle.minifier_commands.#{@type} setting in _config.yml,
|
20
21
|
2) $JEKYLL_MINIBUNDLE_CMD_#{@type.to_s.upcase} environment variable, or
|
21
22
|
3) minifier_cmd setting inside minibundle block.
|
@@ -39,15 +40,15 @@ Missing minification command for bundling #{@type} assets. Specify it in
|
|
39
40
|
raise IllegalStateError, 'Cannot make bundle with closed AssetBundle' unless @tempfile
|
40
41
|
exit_status = spawn_minifier(@minifier_cmd) do |input|
|
41
42
|
$stdout.puts # place newline after "(Re)generating..." log messages
|
42
|
-
Log.info("Bundling #{
|
43
|
+
Log.info("Bundling #{bundle_destination_path}:")
|
43
44
|
@asset_paths.each do |asset|
|
44
|
-
Log.info(relative_path_from(asset, @site_dir))
|
45
|
+
Log.info(' ' + relative_path_from(asset, @site_dir))
|
45
46
|
IO.foreach(asset) { |line| input.write(line) }
|
46
47
|
input.puts(';') if @type == :js
|
47
48
|
end
|
48
49
|
end
|
49
50
|
if exit_status != 0
|
50
|
-
msg = "Bundling #{
|
51
|
+
msg = "Bundling #{bundle_destination_path} failed with exit status #{exit_status}, command: '#{@minifier_cmd}'"
|
51
52
|
log_minifier_error(msg)
|
52
53
|
raise msg
|
53
54
|
end
|
@@ -72,7 +73,7 @@ Missing minification command for bundling #{@type} assets. Specify it in
|
|
72
73
|
_, status = Process.waitpid2(pid)
|
73
74
|
status.exitstatus
|
74
75
|
rescue => e
|
75
|
-
raise "Bundling #{
|
76
|
+
raise "Bundling #{bundle_destination_path} failed: #{e}"
|
76
77
|
ensure
|
77
78
|
[rd, wr].each { |io| io.close unless io.closed? }
|
78
79
|
end
|
@@ -89,5 +90,9 @@ Missing minification command for bundling #{@type} assets. Specify it in
|
|
89
90
|
.split("\n")
|
90
91
|
.each { |line| Log.error(line) }
|
91
92
|
end
|
93
|
+
|
94
|
+
def bundle_destination_path
|
95
|
+
"#{@destination_path}.#{@type}"
|
96
|
+
end
|
92
97
|
end
|
93
98
|
end
|
@@ -15,7 +15,7 @@ module Jekyll::Minibundle
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def destination(site_destination_dir)
|
18
|
-
File.join(site_destination_dir, asset_destination_path)
|
18
|
+
File.expand_path(File.join(site_destination_dir, asset_destination_path), '/')
|
19
19
|
end
|
20
20
|
|
21
21
|
def url
|
@@ -34,10 +34,6 @@ module Jekyll::Minibundle
|
|
34
34
|
modified_time.to_i
|
35
35
|
end
|
36
36
|
|
37
|
-
def modified?
|
38
|
-
stamped_at != mtime
|
39
|
-
end
|
40
|
-
|
41
37
|
def destination_rel_dir
|
42
38
|
asset_destination_dir
|
43
39
|
end
|
@@ -3,13 +3,12 @@ require 'cgi'
|
|
3
3
|
module Jekyll::Minibundle
|
4
4
|
module AssetTagMarkup
|
5
5
|
class << self
|
6
|
-
def make_markup(type,
|
7
|
-
url = make_url(baseurl, path)
|
6
|
+
def make_markup(type, path, attributes)
|
8
7
|
case type
|
9
8
|
when :js
|
10
|
-
%{<script type="text/javascript" src="#{
|
9
|
+
%{<script type="text/javascript" src="#{path}"#{make_attributes(attributes)}></script>}
|
11
10
|
when :css
|
12
|
-
%{<link rel="stylesheet" href="#{
|
11
|
+
%{<link rel="stylesheet" href="#{path}"#{make_attributes(attributes)}>}
|
13
12
|
else
|
14
13
|
raise ArgumentError, "Unknown type for generating bundle markup: #{type}, #{path}"
|
15
14
|
end
|
@@ -26,14 +25,6 @@ module Jekyll::Minibundle
|
|
26
25
|
%{ #{name}="#{CGI.escape_html(value.to_s)}"}
|
27
26
|
end
|
28
27
|
end
|
29
|
-
|
30
|
-
def make_url(baseurl, path)
|
31
|
-
if baseurl.empty?
|
32
|
-
path
|
33
|
-
else
|
34
|
-
File.join(baseurl, path)
|
35
|
-
end
|
36
|
-
end
|
37
28
|
end
|
38
29
|
end
|
39
30
|
end
|
@@ -1,23 +1,23 @@
|
|
1
|
+
require 'jekyll/minibundle/files'
|
1
2
|
require 'jekyll/minibundle/asset_bundle'
|
2
|
-
require 'jekyll/minibundle/asset_file_operations'
|
3
3
|
require 'jekyll/minibundle/asset_file_properties'
|
4
4
|
require 'jekyll/minibundle/asset_stamp'
|
5
5
|
|
6
6
|
module Jekyll::Minibundle
|
7
7
|
class BundleFile
|
8
|
-
include AssetFileOperations
|
9
8
|
include AssetFileProperties
|
10
9
|
|
11
|
-
attr_reader :asset_destination_dir,
|
10
|
+
attr_reader :asset_destination_dir,
|
11
|
+
:stamped_at
|
12
12
|
|
13
13
|
def initialize(site, config)
|
14
14
|
@site = site
|
15
15
|
@type = config.fetch('type')
|
16
16
|
asset_source_dir = File.join(@site.source, config.fetch('source_dir'))
|
17
17
|
@asset_paths = config.fetch('assets').map { |asset_path| File.join(asset_source_dir, "#{asset_path}.#{@type}") }
|
18
|
-
destination_path = config.fetch('destination_path')
|
19
|
-
@asset_destination_dir = File.dirname(destination_path)
|
20
|
-
@asset_destination_filename_prefix = File.basename(destination_path)
|
18
|
+
@destination_path = config.fetch('destination_path')
|
19
|
+
@asset_destination_dir = File.dirname(@destination_path)
|
20
|
+
@asset_destination_filename_prefix = File.basename(@destination_path)
|
21
21
|
@minifier_cmd = config.fetch('minifier_cmd')
|
22
22
|
@stamped_at = nil
|
23
23
|
@is_modified = false
|
@@ -32,10 +32,13 @@ module Jekyll::Minibundle
|
|
32
32
|
|
33
33
|
def destination_path_for_markup
|
34
34
|
# we must rebundle here, if at all, in order to make sure the
|
35
|
-
# destination path in the markup and the generated file path
|
36
|
-
#
|
37
|
-
|
38
|
-
|
35
|
+
# destination path in the markup and the generated file path have
|
36
|
+
# the same fingerprint
|
37
|
+
|
38
|
+
source_mtime = mtime
|
39
|
+
|
40
|
+
if @stamped_at != source_mtime
|
41
|
+
@stamped_at = source_mtime
|
39
42
|
@is_modified = true
|
40
43
|
@_asset_stamp = nil
|
41
44
|
asset_bundle.make_bundle
|
@@ -60,11 +63,16 @@ module Jekyll::Minibundle
|
|
60
63
|
@asset_paths.map { |f| File.stat(f).mtime }.max
|
61
64
|
end
|
62
65
|
|
66
|
+
def modified?
|
67
|
+
@is_modified
|
68
|
+
end
|
69
|
+
|
63
70
|
# allows writing destination only after
|
64
71
|
# `destination_path_for_markup` has been called
|
65
72
|
def write(site_destination_dir)
|
66
|
-
if
|
67
|
-
dst_path =
|
73
|
+
if modified?
|
74
|
+
dst_path = destination(site_destination_dir)
|
75
|
+
Files.copy_p(path, dst_path)
|
68
76
|
|
69
77
|
# respect user's umask; Ruby's tempfile has mode 0o600
|
70
78
|
File.chmod(0o666 & ~File.umask, dst_path)
|
@@ -84,10 +92,11 @@ module Jekyll::Minibundle
|
|
84
92
|
|
85
93
|
def asset_bundle
|
86
94
|
@_asset_bundle ||= AssetBundle.new(
|
87
|
-
type:
|
88
|
-
asset_paths:
|
89
|
-
|
90
|
-
|
95
|
+
type: @type,
|
96
|
+
asset_paths: @asset_paths,
|
97
|
+
destination_path: @destination_path,
|
98
|
+
site_dir: @site.source,
|
99
|
+
minifier_cmd: @minifier_cmd
|
91
100
|
)
|
92
101
|
end
|
93
102
|
end
|
@@ -1,12 +1,14 @@
|
|
1
|
-
require 'jekyll/minibundle/
|
1
|
+
require 'jekyll/minibundle/files'
|
2
2
|
require 'jekyll/minibundle/asset_file_properties'
|
3
3
|
|
4
4
|
module Jekyll::Minibundle
|
5
5
|
class DevelopmentFile
|
6
|
-
include AssetFileOperations
|
7
6
|
include AssetFileProperties
|
8
7
|
|
9
|
-
attr_reader :asset_source_path,
|
8
|
+
attr_reader :asset_source_path,
|
9
|
+
:asset_destination_dir,
|
10
|
+
:asset_destination_filename,
|
11
|
+
:stamped_at
|
10
12
|
|
11
13
|
def initialize(site, asset_source_path, asset_destination_path)
|
12
14
|
@site = site
|
@@ -16,16 +18,24 @@ module Jekyll::Minibundle
|
|
16
18
|
@stamped_at = nil
|
17
19
|
end
|
18
20
|
|
21
|
+
def cleanup
|
22
|
+
# no-op
|
23
|
+
end
|
24
|
+
|
19
25
|
alias destination_path_for_markup asset_destination_path
|
20
26
|
|
21
27
|
def extname
|
22
28
|
File.extname(asset_destination_filename)
|
23
29
|
end
|
24
30
|
|
31
|
+
def modified?
|
32
|
+
stamped_at != mtime
|
33
|
+
end
|
34
|
+
|
25
35
|
def write(site_destination_dir)
|
26
36
|
if modified?
|
27
37
|
@stamped_at = mtime
|
28
|
-
|
38
|
+
Files.copy_p(path, destination(site_destination_dir))
|
29
39
|
true
|
30
40
|
else
|
31
41
|
false
|
@@ -1,18 +1,31 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
1
3
|
module Jekyll::Minibundle
|
2
4
|
module Files
|
3
|
-
|
4
|
-
|
5
|
-
|
5
|
+
class << self
|
6
|
+
def copy_p(src_path, dst_path)
|
7
|
+
FileUtils.mkdir_p(File.dirname(dst_path))
|
8
|
+
FileUtils.cp(src_path, dst_path)
|
9
|
+
end
|
10
|
+
|
11
|
+
def read_last(path, max_size)
|
12
|
+
File.open(path, 'rb') do |file|
|
13
|
+
return '' if max_size < 1
|
6
14
|
|
7
|
-
|
15
|
+
file_size = file.stat.size
|
8
16
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
17
|
+
if file_size < max_size
|
18
|
+
file.read(file_size)
|
19
|
+
else
|
20
|
+
file.seek(file_size - max_size, ::IO::SEEK_SET)
|
21
|
+
file.read(max_size)
|
22
|
+
end
|
14
23
|
end
|
15
24
|
end
|
25
|
+
|
26
|
+
def strip_dot_slash_from_path_start(path)
|
27
|
+
path.sub(%r{\A\./+}, '')
|
28
|
+
end
|
16
29
|
end
|
17
30
|
end
|
18
31
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'jekyll/minibundle/hashes'
|
2
|
+
require 'jekyll/minibundle/files'
|
2
3
|
require 'jekyll/minibundle/environment'
|
3
4
|
require 'jekyll/minibundle/asset_file_registry'
|
4
5
|
require 'jekyll/minibundle/asset_tag_markup'
|
@@ -18,7 +19,16 @@ module Jekyll::Minibundle
|
|
18
19
|
attributes = bundle_config.fetch('attributes')
|
19
20
|
|
20
21
|
register_asset_files(site, bundle_config).map do |file|
|
21
|
-
|
22
|
+
dst_path = Files.strip_dot_slash_from_path_start(file.destination_path_for_markup)
|
23
|
+
|
24
|
+
full_path =
|
25
|
+
if baseurl.empty?
|
26
|
+
dst_path
|
27
|
+
else
|
28
|
+
File.join(baseurl, dst_path)
|
29
|
+
end
|
30
|
+
|
31
|
+
AssetTagMarkup.make_markup(@type, full_path, attributes)
|
22
32
|
end.join("\n")
|
23
33
|
end
|
24
34
|
|
@@ -52,16 +62,10 @@ module Jekyll::Minibundle
|
|
52
62
|
end
|
53
63
|
|
54
64
|
def normalize_baseurl_and_destination_path(baseurl, destination_path)
|
55
|
-
baseurl = '' if baseurl.nil?
|
56
|
-
|
57
|
-
unless destination_path.start_with?('/')
|
58
|
-
return [baseurl, destination_path]
|
59
|
-
end
|
60
|
-
|
61
|
-
normalized_baseurl = baseurl.empty? ? '/' : baseurl
|
62
|
-
normalized_destination_path = destination_path.sub(%r{\A/+}, '')
|
65
|
+
baseurl = '' if baseurl.nil? || baseurl == '.'
|
66
|
+
baseurl = '/' if destination_path.start_with?('/') && baseurl.empty?
|
63
67
|
|
64
|
-
[
|
68
|
+
[Files.strip_dot_slash_from_path_start(baseurl), destination_path.sub(%r{\A/+}, '')]
|
65
69
|
end
|
66
70
|
|
67
71
|
def register_asset_files(site, bundle_config)
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'jekyll/minibundle/files'
|
1
2
|
require 'jekyll/minibundle/asset_file_registry'
|
2
3
|
|
3
4
|
module Jekyll::Minibundle
|
@@ -26,7 +27,7 @@ module Jekyll::Minibundle
|
|
26
27
|
else
|
27
28
|
AssetFileRegistry.register_stamp_file(site, @source_path, @destination_path)
|
28
29
|
end
|
29
|
-
@baseurl + file.destination_path_for_markup
|
30
|
+
@baseurl + Files.strip_dot_slash_from_path_start(file.destination_path_for_markup)
|
30
31
|
end
|
31
32
|
|
32
33
|
private
|
@@ -1,13 +1,14 @@
|
|
1
|
-
require 'jekyll/minibundle/
|
1
|
+
require 'jekyll/minibundle/files'
|
2
2
|
require 'jekyll/minibundle/asset_file_properties'
|
3
3
|
require 'jekyll/minibundle/asset_stamp'
|
4
4
|
|
5
5
|
module Jekyll::Minibundle
|
6
6
|
class StampFile
|
7
|
-
include AssetFileOperations
|
8
7
|
include AssetFileProperties
|
9
8
|
|
10
|
-
attr_reader :asset_source_path,
|
9
|
+
attr_reader :asset_source_path,
|
10
|
+
:asset_destination_dir,
|
11
|
+
:stamped_at
|
11
12
|
|
12
13
|
def initialize(site, asset_source_path, asset_destination_path)
|
13
14
|
@site = site
|
@@ -19,12 +20,19 @@ module Jekyll::Minibundle
|
|
19
20
|
@is_modified = false
|
20
21
|
end
|
21
22
|
|
23
|
+
def cleanup
|
24
|
+
# no-op
|
25
|
+
end
|
26
|
+
|
22
27
|
def destination_path_for_markup
|
23
28
|
# we must rebundle here, if at all, in order to make sure the
|
24
|
-
# destination path in the markup and the generated file path
|
25
|
-
#
|
26
|
-
|
27
|
-
|
29
|
+
# destination path in the markup and the generated file path have
|
30
|
+
# the same fingerprint
|
31
|
+
|
32
|
+
source_mtime = mtime
|
33
|
+
|
34
|
+
if @stamped_at != source_mtime
|
35
|
+
@stamped_at = source_mtime
|
28
36
|
@is_modified = true
|
29
37
|
@_asset_stamp = nil
|
30
38
|
end
|
@@ -40,11 +48,15 @@ module Jekyll::Minibundle
|
|
40
48
|
@asset_destination_extension
|
41
49
|
end
|
42
50
|
|
51
|
+
def modified?
|
52
|
+
@is_modified
|
53
|
+
end
|
54
|
+
|
43
55
|
# allows writing destination only after
|
44
56
|
# `destination_path_for_markup` has been called
|
45
57
|
def write(site_destination_dir)
|
46
|
-
if
|
47
|
-
|
58
|
+
if modified?
|
59
|
+
Files.copy_p(path, destination(site_destination_dir))
|
48
60
|
@is_modified = false
|
49
61
|
true
|
50
62
|
else
|