middleman-imageoptim 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.rspec +2 -0
- data/Gemfile +3 -10
- data/LICENSE +20 -0
- data/README.md +26 -15
- data/Rakefile +28 -0
- data/lib/middleman-imageoptim.rb +9 -62
- data/lib/middleman-imageoptim/extension.rb +17 -0
- data/lib/middleman-imageoptim/optimizer.rb +89 -0
- data/lib/middleman-imageoptim/options.rb +62 -0
- data/lib/middleman-imageoptim/version.rb +5 -2
- data/middleman-imageoptim.gemspec +17 -11
- data/spec/spec_helper.rb +10 -0
- data/spec/unit/optimizer_spec.rb +58 -0
- data/spec/unit/options_spec.rb +77 -0
- data/spec/use_simplecov.rb +15 -0
- metadata +117 -7
- data/features/support/env.rb +0 -4
data/.gitignore
CHANGED
data/.rspec
ADDED
data/Gemfile
CHANGED
@@ -6,14 +6,7 @@ source 'http://rubygems.org'
|
|
6
6
|
gemspec
|
7
7
|
|
8
8
|
group :development do
|
9
|
-
gem "rake",
|
10
|
-
gem "rdoc",
|
11
|
-
gem "yard",
|
9
|
+
gem "rake", "~> 0.9.2"
|
10
|
+
gem "rdoc", "~> 3.9"
|
11
|
+
gem "yard", "~> 0.8.0"
|
12
12
|
end
|
13
|
-
|
14
|
-
group :test do
|
15
|
-
gem "cucumber", "~> 1.2.0"
|
16
|
-
gem "fivemat"
|
17
|
-
gem "aruba", "~> 0.4.11"
|
18
|
-
gem "rspec", "~> 2.7"
|
19
|
-
end
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2013 Justin Morris
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -4,43 +4,54 @@
|
|
4
4
|
|
5
5
|
Serving big images is fo numb-skulls! Compress and optimise your imagery during `middleman build` by running [image_optim](https://github.com/toy/image_optim) over it. Yay-hooray!
|
6
6
|
|
7
|
+
![](http://cl.ly/image/0h0b330F2p3C/Terminal%20%E2%80%94%20zsh%20%E2%80%94%20109%C3%9712.png)
|
8
|
+
|
7
9
|
## Installation
|
8
10
|
|
9
11
|
Go set up the [image_optim](https://github.com/toy/image_optim) external utilities, then;
|
10
12
|
|
11
13
|
```ruby
|
12
|
-
gem "middleman-imageoptim", "~> 0.0
|
14
|
+
gem "middleman-imageoptim", "~> 0.1.0"
|
13
15
|
```
|
14
16
|
|
15
17
|
## Usage
|
16
18
|
|
17
19
|
```ruby
|
18
|
-
activate :
|
20
|
+
activate :imageoptim
|
19
21
|
```
|
20
22
|
|
21
23
|
You can also configure the extension in the usual fashion, by passing a block to `:activate`
|
22
24
|
Below is the default configuration showing all available options;
|
23
25
|
|
24
26
|
```ruby
|
25
|
-
activate :
|
27
|
+
activate :imageoptim do |options|
|
26
28
|
# print out skipped images
|
27
|
-
|
29
|
+
options.verbose = false
|
28
30
|
|
29
|
-
# Setting these to true or nil will let
|
30
|
-
|
31
|
-
|
31
|
+
# Setting these to true or nil will let options determine them (recommended)
|
32
|
+
options.nice = true
|
33
|
+
options.threads = true
|
32
34
|
|
33
35
|
# Image extensions to attempt to compress
|
34
|
-
|
36
|
+
options.image_extensions = %w(.png .jpg .gif)
|
35
37
|
|
36
38
|
# compressor worker options, individual optimisers can be disabled by passing
|
37
39
|
# false instead of a hash
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
40
|
+
options.pngcrush_options = {:chunks => ['alla'], :fix => false, :brute => false}
|
41
|
+
options.pngout_options = {:copy_chunks => false, :strategy => 0}
|
42
|
+
options.optipng_options = {:level => 6, :interlace => false}
|
43
|
+
options.advpng_options = {:level => 4}
|
44
|
+
options.jpegoptim_options = {:strip => ['all'], :max_quality => 100}
|
45
|
+
options.jpegtran_options = {:copy_chunks => false, :progressive => true, :jpegrescan => true}
|
46
|
+
options.gifsicle_options = {:interlace => false}
|
45
47
|
end
|
46
48
|
```
|
49
|
+
|
50
|
+
***
|
51
|
+
|
52
|
+
## Changelog
|
53
|
+
|
54
|
+
##### `0.1.0`
|
55
|
+
- complete refactor and clean-up
|
56
|
+
- introduced an options class. options now work (lol, yay!), thanks @andrew-aladev for your help there
|
57
|
+
- change of extension activation name from `:image_optim to `:imageoptim` for consistency with internal naming
|
data/Rakefile
CHANGED
@@ -1,4 +1,32 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
|
1
3
|
require 'bundler'
|
2
4
|
Bundler::GemHelper.install_tasks
|
3
5
|
|
4
6
|
require 'rake/clean'
|
7
|
+
require 'rspec/core/rake_task'
|
8
|
+
|
9
|
+
namespace :spec do
|
10
|
+
begin
|
11
|
+
require 'cane/rake_task'
|
12
|
+
desc "Run cane to check quality metrics"
|
13
|
+
Cane::RakeTask.new(:quality) do |cane|
|
14
|
+
cane.abc_max = 10
|
15
|
+
cane.add_threshold 'coverage/covered_percent', :>=, 100
|
16
|
+
cane.no_style = true
|
17
|
+
end
|
18
|
+
|
19
|
+
task :default => :quality
|
20
|
+
rescue LoadError
|
21
|
+
warn "cane not available, quality task not provided."
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'Run unit specs'
|
25
|
+
RSpec::Core::RakeTask.new(:unit) do |spec|
|
26
|
+
spec.pattern = "spec/unit/*_spec.rb"
|
27
|
+
spec.rspec_opts = "--require spec_helper"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'Default: run unit tests.'
|
32
|
+
task :default => ['spec:unit']
|
data/lib/middleman-imageoptim.rb
CHANGED
@@ -1,68 +1,15 @@
|
|
1
1
|
require "middleman-core"
|
2
|
-
require "
|
3
|
-
require "
|
2
|
+
require "middleman-imageoptim/optimizer"
|
3
|
+
require "middleman-imageoptim/options"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
app.set :verbose, false
|
9
|
-
app.set :nice, true
|
10
|
-
app.set :threads, true
|
11
|
-
app.set :image_extensions, %w(.png .jpg .gif)
|
12
|
-
app.set :pngcrush_options, {:chunks => ['alla'], :fix => false, :brute => false}
|
13
|
-
app.set :pngout_options, {:copy_chunks => false, :strategy => 0}
|
14
|
-
app.set :optipng_options, {:level => 6, :interlace => false}
|
15
|
-
app.set :advpng_options, {:level => 4}
|
16
|
-
app.set :jpegoptim_options, {:strip => ['all'], :max_quality => 100}
|
17
|
-
app.set :jpegtran_options, {:copy_chunks => false, :progressive => true, :jpegrescan => true}
|
18
|
-
app.set :gifsicle_options, {:interlace => false}
|
19
|
-
|
20
|
-
app.after_build do |builder|
|
21
|
-
image_optim = ImageOptim.new(
|
22
|
-
:nice => nice,
|
23
|
-
:threads => threads,
|
24
|
-
:pngcrush => pngcrush_options,
|
25
|
-
:pngout => pngout_options,
|
26
|
-
:optipng => optipng_options,
|
27
|
-
:advpng => advpng_options,
|
28
|
-
:jpegoptim => jpegoptim_options,
|
29
|
-
:jpegtran => jpegtran_options,
|
30
|
-
:gifsicle => gifsicle_options
|
31
|
-
)
|
32
|
-
optimizable_paths = []
|
33
|
-
paths = ::Middleman::Util.all_files_under(self.class.inst.build_dir)
|
34
|
-
|
35
|
-
# iterate over all the paths in the middleman build directory
|
36
|
-
paths.each do |path|
|
37
|
-
|
38
|
-
# reject non-image extension paths
|
39
|
-
next unless image_extensions.include? path.extname
|
40
|
-
|
41
|
-
# check that we can handle this image
|
42
|
-
if image_optim.optimizable?(path.to_s)
|
43
|
-
optimizable_paths << path
|
44
|
-
else
|
45
|
-
builder.say_status :img_optim, "skipping #{path} as it is not an image or there is no optimizer for it"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# start compressing image assets
|
50
|
-
image_optim.optimize_images(optimizable_paths) do |src, dst|
|
51
|
-
if dst
|
52
|
-
size_change_word = (src.size - dst.size) > 0 ? 'smaller' : 'larger'
|
53
|
-
percent_change = '%.2f%%' % [100 - 100.0 * dst.size / src.size]
|
54
|
-
builder.say_status :img_optimise, "#{src} (#{percent_change} / #{number_to_human_size((src.size - dst.size).abs)} #{size_change_word})"
|
55
|
-
FileUtils.mv(dst, src)
|
56
|
-
elsif verbose
|
57
|
-
builder.say_status :img_optimise, "#{src} (skipped)"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
alias :included :registered
|
63
|
-
end
|
5
|
+
::Middleman::Extensions.register(:imageoptim) do
|
6
|
+
require "middleman-imageoptim/extension"
|
7
|
+
::Middleman::Imageoptim
|
64
8
|
end
|
65
9
|
|
66
10
|
::Middleman::Extensions.register(:image_optim) do
|
67
|
-
|
11
|
+
warn ":image_optim is deprecated. Please use `:imageoptim` instead."
|
12
|
+
|
13
|
+
require "middleman-imageoptim/extension"
|
14
|
+
::Middleman::Imageoptim
|
68
15
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "middleman-core"
|
2
|
+
|
3
|
+
module Middleman
|
4
|
+
module Imageoptim
|
5
|
+
class << self
|
6
|
+
def registered(app, options_hash = {}, &block)
|
7
|
+
options = Middleman::Imageoptim::Options.new(options_hash)
|
8
|
+
yield options.user_options if block_given?
|
9
|
+
|
10
|
+
app.after_build {|builder|
|
11
|
+
Middleman::Imageoptim::Optimizer.new(app, builder, options).optimize!
|
12
|
+
}
|
13
|
+
end
|
14
|
+
alias :included :registered
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Middleman
|
2
|
+
module Imageoptim
|
3
|
+
require "image_optim"
|
4
|
+
require "fileutils"
|
5
|
+
require "padrino-helpers"
|
6
|
+
|
7
|
+
class Optimizer
|
8
|
+
include ::Padrino::Helpers::NumberHelpers
|
9
|
+
|
10
|
+
def initialize(app, builder, options)
|
11
|
+
@app = app
|
12
|
+
@builder = builder
|
13
|
+
@options = options
|
14
|
+
@total_savings = 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def optimize!
|
18
|
+
images_to_optimize = filter_file_paths(file_paths())
|
19
|
+
optimizer.optimize_images(images_to_optimize) {|src_file, dst_file|
|
20
|
+
if dst_file
|
21
|
+
@total_savings += (src_file.size - dst_file.size)
|
22
|
+
say_status "#{src_file} (#{percentage_change(src_file.size, dst_file.size)} / #{format_size((src_file.size - dst_file.size))} #{size_change_word(src_file.size, dst_file.size)})"
|
23
|
+
FileUtils.mv dst_file, src_file
|
24
|
+
elsif @options.verbose
|
25
|
+
say_status "[skipped] #{src_file}"
|
26
|
+
end
|
27
|
+
}
|
28
|
+
say_status "Total image savings: #{format_size(@total_savings)}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def say_status(status)
|
32
|
+
if @builder
|
33
|
+
@builder.say_status :image_optim, status
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def file_paths
|
38
|
+
::Middleman::Util.all_files_under(@app.inst.build_dir)
|
39
|
+
end
|
40
|
+
|
41
|
+
def filter_file_paths(paths)
|
42
|
+
paths.select {|path|
|
43
|
+
is_image_extension(path.extname) && image_is_optimizable(path)
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
def is_image_extension(extension)
|
48
|
+
@options.image_extensions.include?(extension)
|
49
|
+
end
|
50
|
+
|
51
|
+
def image_is_optimizable(path)
|
52
|
+
optimizer.optimizable?(path)
|
53
|
+
end
|
54
|
+
|
55
|
+
def format_size(bytes)
|
56
|
+
number_to_human_size(bytes)
|
57
|
+
end
|
58
|
+
|
59
|
+
def size_change_word(size_src, size_dst)
|
60
|
+
size_difference = (size_src - size_dst)
|
61
|
+
if size_difference > 0
|
62
|
+
'smaller'
|
63
|
+
elsif size_difference < 0
|
64
|
+
'larger'
|
65
|
+
else
|
66
|
+
'no change'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def percentage_change(size_src, size_dst)
|
71
|
+
'%.2f%%' % [100 - 100.0 * size_dst / size_src]
|
72
|
+
end
|
73
|
+
|
74
|
+
def optimizer
|
75
|
+
@optimizer ||= ImageOptim.new(
|
76
|
+
:nice => @options.nice,
|
77
|
+
:threads => @options.threads,
|
78
|
+
:pngcrush => @options.pngcrush_options,
|
79
|
+
:pngout => @options.pngout_options,
|
80
|
+
:optipng => @options.optipng_options,
|
81
|
+
:advpng => @options.advpng_options,
|
82
|
+
:jpegoptim => @options.jpegoptim_options,
|
83
|
+
:jpegtran => @options.jpegtran_options,
|
84
|
+
:gifsicle => @options.gifsicle_options
|
85
|
+
)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Middleman
|
2
|
+
module Imageoptim
|
3
|
+
class Options
|
4
|
+
attr_accessor :user_options
|
5
|
+
attr_reader :verbose, :nice, :threads, :image_extensions,
|
6
|
+
:pngcrush_options, :pngout_options, :optipng_options, :advpng_options,
|
7
|
+
:jpegoptim_options, :jpegtran_options, :gifsicle_options
|
8
|
+
|
9
|
+
UserOptions = Struct.new(:verbose, :nice, :threads, :image_extensions,
|
10
|
+
:pngcrush_options, :pngout_options, :optipng_options, :advpng_options,
|
11
|
+
:jpegoptim_options, :jpegtran_options, :gifsicle_options)
|
12
|
+
|
13
|
+
def initialize(options_hash = {})
|
14
|
+
@user_options = UserOptions.new(*options_hash)
|
15
|
+
end
|
16
|
+
|
17
|
+
def verbose
|
18
|
+
!@user_options.verbose.nil? ? @user_options.verbose : false
|
19
|
+
end
|
20
|
+
|
21
|
+
def nice
|
22
|
+
!@user_options.nice.nil? ? @user_options.nice : true
|
23
|
+
end
|
24
|
+
|
25
|
+
def threads
|
26
|
+
!@user_options.threads.nil? ? @user_options.threads : true
|
27
|
+
end
|
28
|
+
|
29
|
+
def image_extensions
|
30
|
+
!@user_options.image_extensions.nil? ? @user_options.image_extensions : %w(.png .jpg .gif)
|
31
|
+
end
|
32
|
+
|
33
|
+
def pngcrush_options
|
34
|
+
!@user_options.pngcrush_options.nil? ? @user_options.pngcrush_options : {:chunks => ['alla'], :fix => false, :brute => false}
|
35
|
+
end
|
36
|
+
|
37
|
+
def pngout_options
|
38
|
+
!@user_options.pngout_options.nil? ? @user_options.pngout_options : {:copy_chunks => false, :strategy => 0}
|
39
|
+
end
|
40
|
+
|
41
|
+
def optipng_options
|
42
|
+
!@user_options.optipng_options.nil? ? @user_options.optipng_options : {:level => 6, :interlace => false}
|
43
|
+
end
|
44
|
+
|
45
|
+
def advpng_options
|
46
|
+
!@user_options.advpng_options.nil? ? @user_options.advpng_options : {:level => 4}
|
47
|
+
end
|
48
|
+
|
49
|
+
def jpegoptim_options
|
50
|
+
!@user_options.jpegoptim_options.nil? ? @user_options.jpegoptim_options : {:strip => ['all'], :max_quality => 100}
|
51
|
+
end
|
52
|
+
|
53
|
+
def jpegtran_options
|
54
|
+
!@user_options.jpegtran_options.nil? ? @user_options.jpegtran_options : {:copy_chunks => false, :progressive => true, :jpegrescan => true}
|
55
|
+
end
|
56
|
+
|
57
|
+
def gifsicle_options
|
58
|
+
!@user_options.gifsicle_options.nil? ? @user_options.gifsicle_options : {:interlace => false}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -3,20 +3,26 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
require File.expand_path('../lib/middleman-imageoptim/version', __FILE__)
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
|
-
gem.name
|
7
|
-
gem.version
|
8
|
-
gem.platform
|
9
|
-
gem.authors
|
10
|
-
gem.email
|
11
|
-
gem.homepage
|
12
|
-
gem.summary
|
13
|
-
gem.description
|
6
|
+
gem.name = Middleman::Imageoptim::PACKAGE
|
7
|
+
gem.version = Middleman::Imageoptim::VERSION
|
8
|
+
gem.platform = Gem::Platform::RUBY
|
9
|
+
gem.authors = ["Justin Morris"]
|
10
|
+
gem.email = ["desk@pixelbloom.com"]
|
11
|
+
gem.homepage = "https://github.com/plasticine/middleman-imageoptim"
|
12
|
+
gem.summary = %q{Small images are small! Compress yours during middleman build.}
|
13
|
+
gem.description = %q{Small images are small! Compress yours during middleman build.}
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split("\n")
|
16
|
-
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
16
|
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
17
|
gem.require_paths = ["lib"]
|
19
18
|
|
20
|
-
gem.
|
21
|
-
gem.
|
19
|
+
gem.add_dependency "middleman-core", [">= 3.0"]
|
20
|
+
gem.add_dependency "image_optim", "~> 0.9.1"
|
21
|
+
|
22
|
+
gem.add_development_dependency "padrino-helpers"
|
23
|
+
gem.add_development_dependency "rspec"
|
24
|
+
gem.add_development_dependency "rake"
|
25
|
+
gem.add_development_dependency "cucumber"
|
26
|
+
gem.add_development_dependency "simplecov"
|
27
|
+
gem.add_development_dependency "cane"
|
22
28
|
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
if ENV['COVERAGE']
|
2
|
+
require_relative 'use_simplecov'
|
3
|
+
end
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
7
|
+
config.run_all_when_everything_filtered = true
|
8
|
+
config.filter_run :focus
|
9
|
+
config.order = 'random'
|
10
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative "../../lib/middleman-imageoptim/optimizer"
|
2
|
+
|
3
|
+
describe Middleman::Imageoptim::Optimizer do
|
4
|
+
subject(:optimizer) { Middleman::Imageoptim::Optimizer.new(app, builder, options) }
|
5
|
+
let(:options) { Middleman::Imageoptim::Options.new() }
|
6
|
+
let(:app) { double }
|
7
|
+
let(:builder) { double }
|
8
|
+
let(:size_src) { 1000 }
|
9
|
+
let(:size_dst) { 1000 }
|
10
|
+
|
11
|
+
describe "#size_change_word" do
|
12
|
+
subject { optimizer.size_change_word(size_src, size_dst) }
|
13
|
+
|
14
|
+
context "the destination file is the same size as the source file" do
|
15
|
+
it "should be the same size" do
|
16
|
+
subject.should == 'no change'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "the destination file is smaller" do
|
21
|
+
let(:size_dst) { 500 }
|
22
|
+
it "should be smaller" do
|
23
|
+
subject.should == 'smaller'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "the destination file is larger" do
|
28
|
+
let(:size_dst) { 1500 }
|
29
|
+
it "should be larger" do
|
30
|
+
subject.should == 'larger'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#percentage_change" do
|
36
|
+
subject { optimizer.percentage_change(size_src, size_dst) }
|
37
|
+
|
38
|
+
context "the destination file is the same size as the source file" do
|
39
|
+
it "should be the same size" do
|
40
|
+
subject.should == "0.00%"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "the destination file is smaller" do
|
45
|
+
let(:size_dst) { 500 }
|
46
|
+
it "should be smaller" do
|
47
|
+
subject.should == "50.00%"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "the destination file is larger" do
|
52
|
+
let(:size_dst) { 1500 }
|
53
|
+
it "should be larger" do
|
54
|
+
subject.should == '-50.00%'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require_relative "../../lib/middleman-imageoptim/options"
|
2
|
+
|
3
|
+
describe Middleman::Imageoptim::Options do
|
4
|
+
subject { Middleman::Imageoptim::Options.new(options_hash) }
|
5
|
+
let(:options_hash) { {} }
|
6
|
+
|
7
|
+
describe "default options" do
|
8
|
+
its(:verbose) { should be_false }
|
9
|
+
its(:nice) { should be_true }
|
10
|
+
its(:threads) { should be_true }
|
11
|
+
its(:image_extensions) { should == ['.png', '.jpg', '.gif'] }
|
12
|
+
its(:pngcrush_options) { should == {:chunks => ['alla'], :fix => false, :brute => false} }
|
13
|
+
its(:pngout_options) { should == {:copy_chunks => false, :strategy => 0} }
|
14
|
+
its(:optipng_options) { should == {:level => 6, :interlace => false} }
|
15
|
+
its(:advpng_options) { should == {:level => 4} }
|
16
|
+
its(:jpegoptim_options) { should == {:strip => ['all'], :max_quality => 100} }
|
17
|
+
its(:jpegtran_options) { should == {:copy_chunks => false, :progressive => true, :jpegrescan => true} }
|
18
|
+
its(:gifsicle_options) { should == {:interlace => false} }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "with user options" do
|
22
|
+
describe "#verbose" do
|
23
|
+
let(:options_hash) { {verbose: true} }
|
24
|
+
subject { options.verbose().should be_true }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#nice" do
|
28
|
+
let(:options_hash) { {nice: false} }
|
29
|
+
subject { options.nice().should be_false }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#threads" do
|
33
|
+
let(:options_hash) { {threads: false} }
|
34
|
+
subject { options.threads().should be_false }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#image_extensions" do
|
38
|
+
let(:options_hash) { {image_extensions: ['.gif']} }
|
39
|
+
subject { options.image_extensions().should == ['.gif'] }
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#pngcrush_options" do
|
43
|
+
let(:options_hash) { {pngcrush_options: {foo: 'bar'}} }
|
44
|
+
subject { options.pngcrush_options().should == {foo: 'bar'} }
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#pngout_options" do
|
48
|
+
let(:options_hash) { {pngout_options: {foo: 'bar'}} }
|
49
|
+
subject { options.pngout_options().should == {foo: 'bar'} }
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#optipng_options" do
|
53
|
+
let(:options_hash) { {optipng_options: {foo: 'bar'}} }
|
54
|
+
subject { options.optipng_options().should == {foo: 'bar'} }
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#advpng_options" do
|
58
|
+
let(:options_hash) { {advpng_options: {foo: 'bar'}} }
|
59
|
+
subject { options.advpng_options().should == {foo: 'bar'} }
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#jpegoptim_options" do
|
63
|
+
let(:options_hash) { {jpegoptim_options: {foo: 'bar'}} }
|
64
|
+
subject { options.jpegoptim_options().should == {foo: 'bar'} }
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "#jpegtran_options" do
|
68
|
+
let(:options_hash) { {jpegtran_options: {foo: 'bar'}} }
|
69
|
+
subject { options.jpegtran_options().should == {foo: 'bar'} }
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#gifsicle_options" do
|
73
|
+
let(:options_hash) { {gifsicle_options: {foo: 'bar'}} }
|
74
|
+
subject { options.gifsicle_options().should == {foo: 'bar'} }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
puts "[Simplecov] enabled"
|
2
|
+
require 'simplecov'
|
3
|
+
|
4
|
+
class SimpleCov::Formatter::QualityFormatter
|
5
|
+
def format(result)
|
6
|
+
SimpleCov::Formatter::HTMLFormatter.new.format(result)
|
7
|
+
File.open("coverage/covered_percent", "w") do |f|
|
8
|
+
f.puts result.source_files.covered_percent.to_f
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
SimpleCov.formatter = SimpleCov::Formatter::QualityFormatter
|
14
|
+
|
15
|
+
SimpleCov.start 'rails'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: middleman-imageoptim
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-10-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: middleman-core
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0.
|
37
|
+
version: 0.9.1
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,103 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 0.
|
45
|
+
version: 0.9.1
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: padrino-helpers
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rake
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: cucumber
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: simplecov
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: cane
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
46
142
|
description: Small images are small! Compress yours during middleman build.
|
47
143
|
email:
|
48
144
|
- desk@pixelbloom.com
|
@@ -51,14 +147,22 @@ extensions: []
|
|
51
147
|
extra_rdoc_files: []
|
52
148
|
files:
|
53
149
|
- .gitignore
|
150
|
+
- .rspec
|
54
151
|
- Gemfile
|
152
|
+
- LICENSE
|
55
153
|
- README.md
|
56
154
|
- Rakefile
|
57
|
-
- features/support/env.rb
|
58
155
|
- lib/middleman-imageoptim.rb
|
156
|
+
- lib/middleman-imageoptim/extension.rb
|
157
|
+
- lib/middleman-imageoptim/optimizer.rb
|
158
|
+
- lib/middleman-imageoptim/options.rb
|
59
159
|
- lib/middleman-imageoptim/version.rb
|
60
160
|
- lib/middleman_extension.rb
|
61
161
|
- middleman-imageoptim.gemspec
|
162
|
+
- spec/spec_helper.rb
|
163
|
+
- spec/unit/optimizer_spec.rb
|
164
|
+
- spec/unit/options_spec.rb
|
165
|
+
- spec/use_simplecov.rb
|
62
166
|
homepage: https://github.com/plasticine/middleman-imageoptim
|
63
167
|
licenses: []
|
64
168
|
post_install_message:
|
@@ -71,17 +175,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
71
175
|
- - ! '>='
|
72
176
|
- !ruby/object:Gem::Version
|
73
177
|
version: '0'
|
178
|
+
segments:
|
179
|
+
- 0
|
180
|
+
hash: -1391481925218508789
|
74
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
182
|
none: false
|
76
183
|
requirements:
|
77
184
|
- - ! '>='
|
78
185
|
- !ruby/object:Gem::Version
|
79
186
|
version: '0'
|
187
|
+
segments:
|
188
|
+
- 0
|
189
|
+
hash: -1391481925218508789
|
80
190
|
requirements: []
|
81
191
|
rubyforge_project:
|
82
192
|
rubygems_version: 1.8.23
|
83
193
|
signing_key:
|
84
194
|
specification_version: 3
|
85
195
|
summary: Small images are small! Compress yours during middleman build.
|
86
|
-
test_files:
|
87
|
-
|
196
|
+
test_files: []
|
197
|
+
has_rdoc:
|
data/features/support/env.rb
DELETED