middleman-webp 0.4.1 → 0.4.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/.rubocop.yml +2 -0
- data/lib/middleman-webp/converter.rb +28 -25
- data/lib/middleman-webp/extension.rb +27 -23
- data/lib/middleman-webp/options.rb +3 -2
- data/lib/middleman-webp/version.rb +1 -1
- data/middleman-webp.gemspec +1 -1
- data/spec/integration/extension_spec.rb +66 -93
- data/spec/unit/converter_spec.rb +7 -7
- data/spec/unit/extension_spec.rb +15 -15
- data/spec/unit/options_spec.rb +4 -4
- data/spec/unit/pathname_matcher_spec.rb +0 -3
- metadata +6 -8
- data/lib/middleman-webp/logger.rb +0 -26
- data/spec/unit/logger_spec.rb +0 -33
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ec8dcd14e74ea71c1075c9117a650658f5e54545
|
|
4
|
+
data.tar.gz: 10e6ba4aa291d859481205b777a4023e1874f841
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: dd04ccde3cc96ad40b07e4116eb28c2a92c17813bbefee655cd599f9855066bbed173900a51859ebc3ff8afd6808d7a9a6f0ec66636bd559e092ddde459a88a8
|
|
7
|
+
data.tar.gz: 99a36183da396473c3c049b69a828adea67b59ceecf94329d3a56dda9b492f0b093dbec37ef306fd605e04fb48559583fda3cec3c5e169498775459492d48548
|
data/.rubocop.yml
ADDED
|
@@ -2,14 +2,16 @@ require 'middleman-webp/options'
|
|
|
2
2
|
|
|
3
3
|
module Middleman
|
|
4
4
|
module WebP
|
|
5
|
+
##
|
|
6
|
+
# Handles finding image assets and running them through the conversion using
|
|
7
|
+
# external cwebp and gif2webp commandline tools
|
|
5
8
|
class Converter
|
|
6
9
|
SUFFIX_RE = /(jpe?g|png|tiff?|gif)$/i
|
|
7
10
|
|
|
8
|
-
def initialize(app, options = {}
|
|
11
|
+
def initialize(app, builder, options = {})
|
|
9
12
|
@app = app
|
|
10
13
|
@options = Middleman::WebP::Options.new(options)
|
|
11
14
|
@builder = builder
|
|
12
|
-
@log = logger
|
|
13
15
|
end
|
|
14
16
|
|
|
15
17
|
def convert
|
|
@@ -17,27 +19,24 @@ module Middleman
|
|
|
17
19
|
@converted_size = 0
|
|
18
20
|
|
|
19
21
|
convert_images(image_files) do |src, dst|
|
|
20
|
-
if
|
|
21
|
-
next reject_file(dst)
|
|
22
|
-
end
|
|
22
|
+
next reject_file(dst) if @options.allow_skip && dst.size >= src.size
|
|
23
23
|
|
|
24
24
|
@original_size += src.size
|
|
25
25
|
@converted_size += dst.size
|
|
26
|
-
@
|
|
26
|
+
@builder.trigger :created, "#{dst.path} "\
|
|
27
27
|
"(#{change_percentage(src.size, dst.size)} smaller)"
|
|
28
28
|
end
|
|
29
29
|
print_summary
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
def convert_images(paths, &
|
|
32
|
+
def convert_images(paths, &_after_conversion)
|
|
33
33
|
paths.each do |p|
|
|
34
34
|
begin
|
|
35
35
|
dst = destination_path(p)
|
|
36
36
|
exec_convert_tool(p, dst)
|
|
37
37
|
yield File.new(p), File.new(dst.to_s)
|
|
38
38
|
rescue StandardError => e
|
|
39
|
-
@
|
|
40
|
-
@log.debug e.to_s
|
|
39
|
+
@builder.trigger :error, "Converting #{p} failed", e.backtrace
|
|
41
40
|
end
|
|
42
41
|
end
|
|
43
42
|
end
|
|
@@ -55,15 +54,15 @@ module Middleman
|
|
|
55
54
|
end
|
|
56
55
|
|
|
57
56
|
def reject_file(file)
|
|
58
|
-
@
|
|
57
|
+
@builder.trigger :deleted, "#{file.path} skipped"
|
|
59
58
|
File.unlink(file)
|
|
60
59
|
end
|
|
61
60
|
|
|
62
61
|
def print_summary
|
|
63
62
|
savings = @original_size - @converted_size
|
|
64
|
-
@
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
@builder.trigger :webp, '', 'Total conversion savings: '\
|
|
64
|
+
"#{number_to_human_size(savings)} "\
|
|
65
|
+
"(#{change_percentage(@original_size, @converted_size)})"
|
|
67
66
|
end
|
|
68
67
|
|
|
69
68
|
# Calculate change percentage of converted file size
|
|
@@ -84,22 +83,16 @@ module Middleman
|
|
|
84
83
|
end
|
|
85
84
|
|
|
86
85
|
def destination_path(src_path)
|
|
87
|
-
if @options.append_extension
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
86
|
+
dst_name = if @options.append_extension
|
|
87
|
+
"#{src_path.basename}.webp"
|
|
88
|
+
else
|
|
89
|
+
src_path.basename.to_s.gsub(SUFFIX_RE, 'webp')
|
|
90
|
+
end
|
|
92
91
|
src_path.parent.join(dst_name)
|
|
93
92
|
end
|
|
94
93
|
|
|
95
94
|
def image_files
|
|
96
|
-
|
|
97
|
-
app_dir = Pathname(File.join(@app.root, @app.config[:source]))
|
|
98
|
-
else
|
|
99
|
-
app_dir = Pathname(@app.config[:build_dir])
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
all = ::Middleman::Util.all_files_under(app_dir)
|
|
95
|
+
all = ::Middleman::Util.all_files_under(site_dir)
|
|
103
96
|
images = all.select { |p| p.to_s =~ SUFFIX_RE }
|
|
104
97
|
|
|
105
98
|
# Reject files matching possible ignore patterns
|
|
@@ -127,6 +120,16 @@ module Middleman
|
|
|
127
120
|
format("%g #{units[exponent]}",
|
|
128
121
|
format('%.2f', n.to_f / 1024**exponent))
|
|
129
122
|
end
|
|
123
|
+
|
|
124
|
+
private
|
|
125
|
+
|
|
126
|
+
def site_dir
|
|
127
|
+
if @options.run_before_build
|
|
128
|
+
Pathname(File.join(@app.root, @app.config[:source]))
|
|
129
|
+
else
|
|
130
|
+
Pathname(@app.config[:build_dir])
|
|
131
|
+
end
|
|
132
|
+
end
|
|
130
133
|
end
|
|
131
134
|
end
|
|
132
135
|
end
|
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
require 'middleman-core'
|
|
2
|
-
require 'middleman-webp/logger'
|
|
3
2
|
require 'middleman-webp/converter'
|
|
4
3
|
|
|
5
4
|
require 'shell'
|
|
6
5
|
|
|
7
6
|
module Middleman
|
|
7
|
+
##
|
|
8
|
+
# Middleman extension for converting image assets to WebP alternatives
|
|
9
|
+
#
|
|
10
|
+
# Conversion is run using after_build or before_build according to the
|
|
11
|
+
# configuration, after_build being the default.
|
|
8
12
|
class WebPExtension < Extension
|
|
9
13
|
option(:conversion_options, {},
|
|
10
14
|
'Custom conversion options for cwebp/gif2webp')
|
|
11
15
|
option(:append_extension, false,
|
|
12
|
-
'keep the original filename and extension and append .webp
|
|
16
|
+
'keep the original filename and extension and append .webp '\
|
|
17
|
+
'(image.png => image.png.webp)')
|
|
13
18
|
option(:ignore, [], 'Ignores files with matching paths')
|
|
14
19
|
option(:verbose, false, 'Display all external command which are executed '\
|
|
15
20
|
'to help debugging.')
|
|
16
|
-
option(:allow_skip, true, 'Skip saving .webp files which are larger than
|
|
17
|
-
|
|
21
|
+
option(:allow_skip, true, 'Skip saving .webp files which are larger than '\
|
|
22
|
+
'their source')
|
|
23
|
+
option(:run_before_build, false, 'Run before build and save .webp files in'\
|
|
24
|
+
' source dir')
|
|
18
25
|
|
|
19
26
|
def initialize(app, options_hash = {}, &block)
|
|
20
27
|
super
|
|
@@ -22,45 +29,42 @@ module Middleman
|
|
|
22
29
|
end
|
|
23
30
|
|
|
24
31
|
def before_build(builder)
|
|
25
|
-
return unless options
|
|
32
|
+
return unless options.run_before_build
|
|
26
33
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
Middleman::WebP::Converter.new(@app, options, builder, @logger).convert
|
|
34
|
+
return unless dependencies_installed?(builder)
|
|
35
|
+
Middleman::WebP::Converter.new(@app, builder, options).convert
|
|
30
36
|
end
|
|
31
37
|
|
|
32
38
|
def after_build(builder)
|
|
33
|
-
return if options
|
|
39
|
+
return if options.run_before_build
|
|
34
40
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
Middleman::WebP::Converter.new(@app, options, builder, @logger).convert
|
|
41
|
+
return unless dependencies_installed? builder
|
|
42
|
+
Middleman::WebP::Converter.new(@app, builder, options).convert
|
|
38
43
|
end
|
|
39
44
|
|
|
40
45
|
# Internal: Check that cwebp and gif2webp commandline tools are available.
|
|
41
46
|
#
|
|
42
47
|
# Returns true if all is OK.
|
|
43
|
-
def dependencies_installed?
|
|
44
|
-
warn_if_gif2webp_missing
|
|
45
|
-
cwebp_installed?
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def initialize_logger(builder)
|
|
49
|
-
@logger = Middleman::WebP::Logger.new(builder, verbose: @options.verbose)
|
|
48
|
+
def dependencies_installed?(builder)
|
|
49
|
+
warn_if_gif2webp_missing builder
|
|
50
|
+
cwebp_installed? builder
|
|
50
51
|
end
|
|
51
52
|
|
|
52
53
|
private
|
|
53
54
|
|
|
54
|
-
def warn_if_gif2webp_missing
|
|
55
|
+
def warn_if_gif2webp_missing(builder)
|
|
55
56
|
Shell.new.find_system_command('gif2webp')
|
|
56
57
|
rescue Shell::Error::CommandNotFound => e
|
|
57
|
-
|
|
58
|
+
builder.trigger :webp, nil, "#{e.message} Please install latest version"\
|
|
59
|
+
' of webp library and tools to get gif2webp and be able to convert gif'\
|
|
60
|
+
'files also.'
|
|
58
61
|
end
|
|
59
62
|
|
|
60
|
-
def cwebp_installed?
|
|
63
|
+
def cwebp_installed?(builder)
|
|
61
64
|
true if Shell.new.find_system_command('cwebp')
|
|
62
65
|
rescue Shell::Error::CommandNotFound => e
|
|
63
|
-
|
|
66
|
+
builder.trigger :error, "ERROR: #{e.message} Please install cwebp and "\
|
|
67
|
+
'gif2webp commandline tools first.'
|
|
64
68
|
false
|
|
65
69
|
end
|
|
66
70
|
end
|
|
@@ -3,7 +3,8 @@ require 'middleman-webp/pathname_matcher'
|
|
|
3
3
|
module Middleman
|
|
4
4
|
module WebP
|
|
5
5
|
class Options
|
|
6
|
-
attr_reader :ignore, :verbose, :append_extension, :allow_skip,
|
|
6
|
+
attr_reader :ignore, :verbose, :append_extension, :allow_skip,
|
|
7
|
+
:run_before_build
|
|
7
8
|
|
|
8
9
|
def initialize(options = {})
|
|
9
10
|
@ignore = options[:ignore] || []
|
|
@@ -30,7 +31,7 @@ module Middleman
|
|
|
30
31
|
# glob pattern matches file path and uses the one with longest
|
|
31
32
|
# glob, because it's assumed to be the most precise one.
|
|
32
33
|
def for(file)
|
|
33
|
-
matching = @conversion.select { |m,
|
|
34
|
+
matching = @conversion.select { |m, _o| m.matches? file }
|
|
34
35
|
|
|
35
36
|
return '' if matching.empty?
|
|
36
37
|
|
data/middleman-webp.gemspec
CHANGED
|
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
19
|
spec.require_paths = ["lib"]
|
|
20
20
|
|
|
21
|
-
spec.add_dependency "middleman-core", "~> 4.0
|
|
21
|
+
spec.add_dependency "middleman-core", "~> 4.0"
|
|
22
22
|
|
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.5"
|
|
24
24
|
spec.add_development_dependency "middleman-cli", "~> 4.0.0"
|
|
@@ -4,15 +4,9 @@ require 'middleman-core/cli'
|
|
|
4
4
|
require 'thor'
|
|
5
5
|
require_relative '../../lib/middleman-webp/extension'
|
|
6
6
|
|
|
7
|
-
class MockBuilder
|
|
8
|
-
def thor
|
|
9
|
-
return Middleman::Cli::Build.new
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
|
|
13
7
|
describe Middleman::WebPExtension do
|
|
14
8
|
before do
|
|
15
|
-
@builder =
|
|
9
|
+
@builder = stub(thor: Middleman::Cli::Build.new)
|
|
16
10
|
end
|
|
17
11
|
|
|
18
12
|
after do
|
|
@@ -27,30 +21,17 @@ describe Middleman::WebPExtension do
|
|
|
27
21
|
|
|
28
22
|
describe '#before_build' do
|
|
29
23
|
it 'does not generate WebP versions by default' do
|
|
30
|
-
app_mock = stub(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
.with do |msg, color|
|
|
42
|
-
msg =~ /Total conversion savings/
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
Middleman::WebP::Logger.any_instance.expects(:info).never
|
|
46
|
-
.with do |msg|
|
|
47
|
-
msg =~ /cwebp/
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
Middleman::WebP::Logger.any_instance.expects(:info).never
|
|
51
|
-
.with do |msg|
|
|
52
|
-
msg =~ /\.webp \([0-9.]+ % smaller\)/
|
|
53
|
-
end
|
|
24
|
+
app_mock = stub(initialized: '',
|
|
25
|
+
instance_available: true,
|
|
26
|
+
after_configuration: nil,
|
|
27
|
+
before_build: nil,
|
|
28
|
+
after_build: nil,
|
|
29
|
+
root: '.',
|
|
30
|
+
config: { source: 'spec/fixtures/ok-source' })
|
|
31
|
+
|
|
32
|
+
@builder.expects(:trigger).never.with do |event|
|
|
33
|
+
[:webp, :created, :error, :deleted].include? event
|
|
34
|
+
end
|
|
54
35
|
|
|
55
36
|
@extension = Middleman::WebPExtension.new(app_mock)
|
|
56
37
|
@extension.before_build(@builder)
|
|
@@ -59,26 +40,24 @@ describe Middleman::WebPExtension do
|
|
|
59
40
|
end
|
|
60
41
|
|
|
61
42
|
it 'generates WebP versions using external tools when option is set' do
|
|
62
|
-
app_mock = stub(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
build_dir: 'spec/fixtures/ok-build'
|
|
73
|
-
}
|
|
43
|
+
app_mock = stub(initialized: '',
|
|
44
|
+
instance_available: true,
|
|
45
|
+
after_configuration: nil,
|
|
46
|
+
before_build: nil,
|
|
47
|
+
after_build: nil,
|
|
48
|
+
verbose: true,
|
|
49
|
+
root: '.',
|
|
50
|
+
config: {
|
|
51
|
+
source: 'spec/fixtures/ok-source',
|
|
52
|
+
build_dir: 'spec/fixtures/ok-build'
|
|
74
53
|
})
|
|
75
54
|
|
|
76
|
-
|
|
77
|
-
msg =~
|
|
55
|
+
@builder.expects(:trigger).twice.with do |event, msg|
|
|
56
|
+
event == :created && msg =~ /\.webp \([0-9.]+ % smaller\)/
|
|
78
57
|
end
|
|
79
58
|
|
|
80
|
-
|
|
81
|
-
|
|
59
|
+
@builder.expects(:trigger).once.with do |event, _target, msg|
|
|
60
|
+
event == :webp && msg =~ /Total conversion savings/
|
|
82
61
|
end
|
|
83
62
|
|
|
84
63
|
@extension = Middleman::WebPExtension.new(app_mock) do |webp|
|
|
@@ -92,27 +71,25 @@ describe Middleman::WebPExtension do
|
|
|
92
71
|
|
|
93
72
|
describe '#after_build' do
|
|
94
73
|
before do
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
74
|
+
@builder.expects(:trigger).once.with do |event, _target, msg|
|
|
75
|
+
event == :webp && msg =~ /Total conversion savings/
|
|
76
|
+
end
|
|
98
77
|
end
|
|
99
78
|
|
|
100
79
|
it 'generates WebP versions using external tools' do
|
|
101
|
-
app_mock = stub(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
build_dir: 'spec/fixtures/ok-build'
|
|
111
|
-
}
|
|
80
|
+
app_mock = stub(initialized: '',
|
|
81
|
+
instance_available: true,
|
|
82
|
+
after_configuration: nil,
|
|
83
|
+
before_build: nil,
|
|
84
|
+
after_build: nil,
|
|
85
|
+
root: '.',
|
|
86
|
+
config: {
|
|
87
|
+
source: 'spec/fixtures/ok-source',
|
|
88
|
+
build_dir: 'spec/fixtures/ok-build'
|
|
112
89
|
})
|
|
113
90
|
|
|
114
|
-
|
|
115
|
-
msg =~ /\.webp \([0-9.]+ % smaller\)/
|
|
91
|
+
@builder.expects(:trigger).twice.with do |event, msg|
|
|
92
|
+
event == :created && msg =~ /\.webp \([0-9.]+ % smaller\)/
|
|
116
93
|
end
|
|
117
94
|
|
|
118
95
|
@extension = Middleman::WebPExtension.new(app_mock)
|
|
@@ -122,21 +99,19 @@ describe Middleman::WebPExtension do
|
|
|
122
99
|
end
|
|
123
100
|
|
|
124
101
|
it 'shows errors if files couldn\'t be converted' do
|
|
125
|
-
app_mock = stub(
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
Middleman::WebP::Logger.any_instance.expects(:error).times(3).with do |msg|
|
|
139
|
-
msg =~ /Converting .*empty\.(jpg|gif|png) failed/
|
|
102
|
+
app_mock = stub(initialized: '',
|
|
103
|
+
instance_available: true,
|
|
104
|
+
after_configuration: nil,
|
|
105
|
+
before_build: nil,
|
|
106
|
+
after_build: nil,
|
|
107
|
+
root: '.',
|
|
108
|
+
config: { build_dir: 'spec/fixtures/dummy-build' })
|
|
109
|
+
|
|
110
|
+
Middleman::WebP::Converter.any_instance
|
|
111
|
+
.expects(:exec_convert_tool).times(3)
|
|
112
|
+
|
|
113
|
+
@builder.expects(:trigger).times(3).with do |event, msg|
|
|
114
|
+
event == :error && msg =~ /Converting .*empty\.(jpg|gif|png) failed/
|
|
140
115
|
end
|
|
141
116
|
|
|
142
117
|
@extension = Middleman::WebPExtension.new(app_mock)
|
|
@@ -144,18 +119,16 @@ describe Middleman::WebPExtension do
|
|
|
144
119
|
end
|
|
145
120
|
|
|
146
121
|
it 'rejects file if it is larger than original' do
|
|
147
|
-
app_mock = stub(
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
Middleman::WebP::Converter.any_instance.
|
|
158
|
-
expects(:exec_convert_tool).times(3).with do |src, dst|
|
|
122
|
+
app_mock = stub(initialized: '',
|
|
123
|
+
instance_available: true,
|
|
124
|
+
after_configuration: nil,
|
|
125
|
+
before_build: nil,
|
|
126
|
+
after_build: nil,
|
|
127
|
+
root: '.',
|
|
128
|
+
config: { build_dir: 'spec/fixtures/dummy-build' })
|
|
129
|
+
|
|
130
|
+
Middleman::WebP::Converter.any_instance
|
|
131
|
+
.expects(:exec_convert_tool).times(3).with do |_src, dst|
|
|
159
132
|
if dst.to_s =~ /spec\/fixtures\/dummy-build\/.*webp$/
|
|
160
133
|
File.open(dst, 'w') do |f|
|
|
161
134
|
f << 'Making it larger than empty dummy original'
|
|
@@ -166,8 +139,9 @@ describe Middleman::WebPExtension do
|
|
|
166
139
|
end
|
|
167
140
|
end
|
|
168
141
|
|
|
169
|
-
|
|
170
|
-
|
|
142
|
+
@builder.expects(:trigger).times(3).with do |event, msg|
|
|
143
|
+
event == :deleted && msg =~ /.*empty.webp skipped/
|
|
144
|
+
end.returns(nil)
|
|
171
145
|
|
|
172
146
|
@extension = Middleman::WebPExtension.new(app_mock)
|
|
173
147
|
@extension.after_build(@builder)
|
|
@@ -175,5 +149,4 @@ describe Middleman::WebPExtension do
|
|
|
175
149
|
Dir.glob('spec/fixtures/dummy-build/**/*.webp').size.must_equal 0
|
|
176
150
|
end
|
|
177
151
|
end
|
|
178
|
-
|
|
179
152
|
end
|
data/spec/unit/converter_spec.rb
CHANGED
|
@@ -5,8 +5,8 @@ require_relative '../../lib/middleman-webp/converter'
|
|
|
5
5
|
|
|
6
6
|
describe Middleman::WebP::Converter do
|
|
7
7
|
before do
|
|
8
|
-
@app_mock = stub(config: {build_dir: 'spec/fixtures/dummy-build'})
|
|
9
|
-
@converter = Middleman::WebP::Converter.new
|
|
8
|
+
@app_mock = stub(config: { build_dir: 'spec/fixtures/dummy-build' })
|
|
9
|
+
@converter = Middleman::WebP::Converter.new @app_mock, nil
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
describe '#destination_path' do
|
|
@@ -18,7 +18,8 @@ describe Middleman::WebP::Converter do
|
|
|
18
18
|
|
|
19
19
|
describe '#destination_path with append_extension = true' do
|
|
20
20
|
before do
|
|
21
|
-
@converter = Middleman::WebP::Converter.new
|
|
21
|
+
@converter = Middleman::WebP::Converter.new @app_mock, nil,
|
|
22
|
+
append_extension: true
|
|
22
23
|
end
|
|
23
24
|
|
|
24
25
|
it 'returns file name with same basename and webp suffix' do
|
|
@@ -72,9 +73,8 @@ describe Middleman::WebP::Converter do
|
|
|
72
73
|
end
|
|
73
74
|
|
|
74
75
|
it 'won\'t include ignored files' do
|
|
75
|
-
@converter = Middleman::WebP::Converter.new
|
|
76
|
-
|
|
77
|
-
}, nil, nil)
|
|
76
|
+
@converter = Middleman::WebP::Converter.new @app_mock, nil,
|
|
77
|
+
ignore: [/jpg$/, '**/*.gif']
|
|
78
78
|
|
|
79
79
|
files_to_include = [Pathname('spec/fixtures/dummy-build/empty.png')]
|
|
80
80
|
@converter.image_files.must_equal files_to_include
|
|
@@ -84,7 +84,7 @@ describe Middleman::WebP::Converter do
|
|
|
84
84
|
options = {
|
|
85
85
|
ignore: ->(path) { path.end_with? 'jpg' }
|
|
86
86
|
}
|
|
87
|
-
@converter = Middleman::WebP::Converter.new
|
|
87
|
+
@converter = Middleman::WebP::Converter.new @app_mock, nil, options
|
|
88
88
|
|
|
89
89
|
@converter.image_files.size.must_equal 2
|
|
90
90
|
end
|
data/spec/unit/extension_spec.rb
CHANGED
|
@@ -2,17 +2,14 @@ require 'spec_helper'
|
|
|
2
2
|
require_relative '../../lib/middleman-webp/extension'
|
|
3
3
|
|
|
4
4
|
describe Middleman::WebPExtension do
|
|
5
|
-
|
|
6
5
|
before do
|
|
7
|
-
app_mock = stub(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
after_build: nil
|
|
13
|
-
})
|
|
6
|
+
app_mock = stub(initialized: '',
|
|
7
|
+
instance_available: true,
|
|
8
|
+
after_configuration: nil,
|
|
9
|
+
before_build: nil,
|
|
10
|
+
after_build: nil)
|
|
14
11
|
@extension = Middleman::WebPExtension.new(app_mock)
|
|
15
|
-
@
|
|
12
|
+
@builder_mock = stub(trigger: nil)
|
|
16
13
|
end
|
|
17
14
|
|
|
18
15
|
describe '#dependencies_installed?' do
|
|
@@ -20,24 +17,27 @@ describe Middleman::WebPExtension do
|
|
|
20
17
|
Shell.any_instance.expects(:find_system_command).with('cwebp').returns('/usr/bin/cwebp')
|
|
21
18
|
Shell.any_instance.expects(:find_system_command).with('gif2webp').returns('/usr/bin/gif2webp')
|
|
22
19
|
|
|
23
|
-
@extension.dependencies_installed
|
|
20
|
+
@extension.dependencies_installed?(@builder_mock).must_equal true
|
|
24
21
|
end
|
|
25
22
|
|
|
26
23
|
it 'returns false and displays error if cwebp is missing' do
|
|
27
24
|
Shell.any_instance.expects(:find_system_command).with('cwebp').raises(Shell::Error::CommandNotFound)
|
|
28
25
|
Shell.any_instance.stubs(:find_system_command).with('gif2webp').returns('/usr/bin/gif2webp')
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
@builder_mock.expects(:trigger).once.with do |event|
|
|
28
|
+
event == :error
|
|
29
|
+
end
|
|
30
|
+
@extension.dependencies_installed?(@builder_mock).must_equal false
|
|
32
31
|
end
|
|
33
32
|
|
|
34
33
|
it 'displays error if only gif2webp is missing and returns still true' do
|
|
35
34
|
Shell.any_instance.expects(:find_system_command).with('gif2webp').raises(Shell::Error::CommandNotFound)
|
|
36
35
|
Shell.any_instance.stubs(:find_system_command).with('cwebp').returns('/usr/bin/cwebp')
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
@builder_mock.expects(:trigger).once.with do |event, _target, msg|
|
|
38
|
+
event == :webp && msg =~ /gif2webp/
|
|
39
|
+
end
|
|
40
|
+
@extension.dependencies_installed?(@builder_mock).must_equal true
|
|
40
41
|
end
|
|
41
42
|
end
|
|
42
|
-
|
|
43
43
|
end
|
data/spec/unit/options_spec.rb
CHANGED
|
@@ -4,17 +4,17 @@ require_relative '../../lib/middleman-webp/options'
|
|
|
4
4
|
|
|
5
5
|
describe Middleman::WebP::Options do
|
|
6
6
|
describe '#allow_skip' do
|
|
7
|
-
it
|
|
7
|
+
it 'should default to true' do
|
|
8
8
|
options = Middleman::WebP::Options.new
|
|
9
9
|
options.allow_skip.must_equal(true)
|
|
10
10
|
end
|
|
11
|
-
|
|
12
|
-
it
|
|
11
|
+
|
|
12
|
+
it 'should allow setting to true' do
|
|
13
13
|
options = Middleman::WebP::Options.new(allow_skip: false)
|
|
14
14
|
options.allow_skip.must_equal(false)
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
describe '#for' do
|
|
19
19
|
it 'returns cwebp args when given file matches option file pattern glob' do
|
|
20
20
|
path = Pathname.new('test_image.jpg')
|
|
@@ -2,7 +2,6 @@ require 'spec_helper'
|
|
|
2
2
|
require_relative '../../lib/middleman-webp/pathname_matcher'
|
|
3
3
|
|
|
4
4
|
describe Middleman::WebP::PathnameMatcher do
|
|
5
|
-
|
|
6
5
|
describe '#matches?' do
|
|
7
6
|
it 'returns true when given file matches pattern' do
|
|
8
7
|
patterns = ['**/*.jpg', /jpg$/, ->(path) { path.end_with?('jpg') }]
|
|
@@ -54,7 +53,5 @@ describe Middleman::WebP::PathnameMatcher do
|
|
|
54
53
|
it 'handles nil path gracefully and returns false' do
|
|
55
54
|
Middleman::WebP::PathnameMatcher.new('*.jpg').matches? nil
|
|
56
55
|
end
|
|
57
|
-
|
|
58
56
|
end
|
|
59
|
-
|
|
60
57
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: middleman-webp
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.4.
|
|
4
|
+
version: 0.4.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Juhamatti Niemelä
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
11
|
+
date: 2016-06-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: middleman-core
|
|
@@ -16,14 +16,14 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 4.0
|
|
19
|
+
version: '4.0'
|
|
20
20
|
type: :runtime
|
|
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: 4.0
|
|
26
|
+
version: '4.0'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: bundler
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -88,6 +88,7 @@ extensions: []
|
|
|
88
88
|
extra_rdoc_files: []
|
|
89
89
|
files:
|
|
90
90
|
- ".gitignore"
|
|
91
|
+
- ".rubocop.yml"
|
|
91
92
|
- ".travis.yml"
|
|
92
93
|
- CHANGELOG.md
|
|
93
94
|
- Gemfile
|
|
@@ -97,7 +98,6 @@ files:
|
|
|
97
98
|
- lib/middleman-webp.rb
|
|
98
99
|
- lib/middleman-webp/converter.rb
|
|
99
100
|
- lib/middleman-webp/extension.rb
|
|
100
|
-
- lib/middleman-webp/logger.rb
|
|
101
101
|
- lib/middleman-webp/options.rb
|
|
102
102
|
- lib/middleman-webp/pathname_matcher.rb
|
|
103
103
|
- lib/middleman-webp/version.rb
|
|
@@ -115,7 +115,6 @@ files:
|
|
|
115
115
|
- spec/spec_helper.rb
|
|
116
116
|
- spec/unit/converter_spec.rb
|
|
117
117
|
- spec/unit/extension_spec.rb
|
|
118
|
-
- spec/unit/logger_spec.rb
|
|
119
118
|
- spec/unit/options_spec.rb
|
|
120
119
|
- spec/unit/pathname_matcher_spec.rb
|
|
121
120
|
homepage: http://github.com/iiska/middleman-webp
|
|
@@ -138,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
138
137
|
version: '0'
|
|
139
138
|
requirements: []
|
|
140
139
|
rubyforge_project:
|
|
141
|
-
rubygems_version: 2.
|
|
140
|
+
rubygems_version: 2.5.1
|
|
142
141
|
signing_key:
|
|
143
142
|
specification_version: 4
|
|
144
143
|
summary: WebP image conversion for Middleman
|
|
@@ -155,6 +154,5 @@ test_files:
|
|
|
155
154
|
- spec/spec_helper.rb
|
|
156
155
|
- spec/unit/converter_spec.rb
|
|
157
156
|
- spec/unit/extension_spec.rb
|
|
158
|
-
- spec/unit/logger_spec.rb
|
|
159
157
|
- spec/unit/options_spec.rb
|
|
160
158
|
- spec/unit/pathname_matcher_spec.rb
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
module Middleman
|
|
2
|
-
module WebP
|
|
3
|
-
class Logger
|
|
4
|
-
def initialize(builder, opts = {})
|
|
5
|
-
@builder = builder
|
|
6
|
-
@options = opts
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def info(msg, color = nil)
|
|
10
|
-
@builder.thor.say_status :webp, msg, color
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def error(msg)
|
|
14
|
-
info msg, :red
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def warn(msg)
|
|
18
|
-
info msg, :yellow
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def debug(msg)
|
|
22
|
-
info msg if @options[:verbose]
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
data/spec/unit/logger_spec.rb
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'pathname'
|
|
3
|
-
require_relative '../../lib/middleman-webp/logger'
|
|
4
|
-
|
|
5
|
-
describe Middleman::WebP::Logger do
|
|
6
|
-
before do
|
|
7
|
-
@thor_mock = stub({say_status: nil})
|
|
8
|
-
@logger = Middleman::WebP::Logger.new(stub({thor: @thor_mock}))
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
it "logs info message through Thor with given color" do
|
|
12
|
-
@thor_mock.expects(:say_status).once.with do |action, msg, color|
|
|
13
|
-
msg == 'foobar' && color == :blue
|
|
14
|
-
end
|
|
15
|
-
@logger.info 'foobar', :blue
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
[[:error, :red], [:warn, :yellow]].each do |(method, color)|
|
|
19
|
-
it "##{method} logs message with color #{color}" do
|
|
20
|
-
@thor_mock.expects(:say_status).once.with do |action, msg, col|
|
|
21
|
-
msg == "#{method} message" && col == color
|
|
22
|
-
end
|
|
23
|
-
@logger.send method, "#{method} message"
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it "logs error with red" do
|
|
28
|
-
@thor_mock.expects(:say_status).once.with do |action, msg, color|
|
|
29
|
-
msg == 'foobar' && color == :red
|
|
30
|
-
end
|
|
31
|
-
@logger.error 'foobar'
|
|
32
|
-
end
|
|
33
|
-
end
|