diff --git a/middleman-core/features/gzip.feature b/middleman-core/features/gzip.feature index 93ae2cf5..5a5a4265 100644 --- a/middleman-core/features/gzip.feature +++ b/middleman-core/features/gzip.feature @@ -3,12 +3,12 @@ Feature: GZIP assets during build Scenario: Built assets should be gzipped Given a successfully built app at "gzip-app" Then the following files should exist: - | build/javascripts/test.js.gz | - | build/stylesheets/test.css.gz | + | build/index.html | | build/index.html.gz | | build/javascripts/test.js | + | build/javascripts/test.js.gz | | build/stylesheets/test.css | - | build/index.html | + | build/stylesheets/test.css.gz | When I run `file build/javascripts/test.js.gz` Then the output should contain "gzip" @@ -18,4 +18,35 @@ Feature: GZIP assets during build Then I should see "test_function" When I go to "/stylesheets/test.css" Then I should see "test_selector" - \ No newline at end of file + + Scenario: Only specified extensions should be gzipped + Given a fixture app "gzip-app" + And a file named "config.rb" with: + """ + activate :gzip, exts: %w(.js .html .htm) + """ + And a successfully built app at "gzip-app" + Then the following files should exist: + | build/index.html | + | build/index.html.gz | + | build/javascripts/test.js | + | build/javascripts/test.js.gz | + | build/stylesheets/test.css | + And the following files should not exist: + | build/stylesheets/test.css.gz | + + Scenario: Gzipped files are not produced for ignored paths + Given a fixture app "gzip-app" + And a file named "config.rb" with: + """ + activate :gzip, ignore: ['index.html', %r(javascripts/.*)] + """ + And a successfully built app at "gzip-app" + Then the following files should exist: + | build/index.html | + | build/javascripts/test.js | + | build/stylesheets/test.css | + | build/stylesheets/test.css.gz | + And the following files should not exist: + | build/index.html.gz | + | build/javascripts/test.js.gz | diff --git a/middleman-core/lib/middleman-core/extension.rb b/middleman-core/lib/middleman-core/extension.rb index 89f4e613..60c6617d 100644 --- a/middleman-core/lib/middleman-core/extension.rb +++ b/middleman-core/lib/middleman-core/extension.rb @@ -1,5 +1,6 @@ require 'active_support/core_ext/module/delegation' require 'active_support/core_ext/class/attribute' +require 'middleman-core/configuration' module Middleman # Middleman's Extension API provides the ability to add functionality to Middleman diff --git a/middleman-core/lib/middleman-core/extensions/gzip.rb b/middleman-core/lib/middleman-core/extensions/gzip.rb index 5a034371..915b40b3 100644 --- a/middleman-core/lib/middleman-core/extensions/gzip.rb +++ b/middleman-core/lib/middleman-core/extensions/gzip.rb @@ -11,6 +11,7 @@ # class Middleman::Extensions::Gzip < ::Middleman::Extension option :exts, %w(.js .css .html .htm), 'File extensions to Gzip when building.' + option :ignore, [], 'Patterns to avoid gzipping' class NumberHelpers include ::Padrino::Helpers::NumberHelpers @@ -33,7 +34,7 @@ class Middleman::Extensions::Gzip < ::Middleman::Extension # Fill a queue with inputs in_queue = Queue.new paths.each do |path| - in_queue << path if options.exts.include?(path.extname) + in_queue << path if should_gzip?(path) end num_paths = in_queue.size @@ -97,4 +98,13 @@ class Middleman::Extensions::Gzip < ::Middleman::Extension [output_filename, old_size, new_size] end + + private + + # Whether a path should be gzipped + # @param [Pathname] path A destination path + # @return [Boolean] + def should_gzip?(path) + options.exts.include?(path.extname) && options.ignore.none? { |ignore| Middleman::Util.path_match(ignore, path.to_s) } + end end