jekyll-minibundle 2.1.1 → 2.1.2
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 +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
|