diff --git a/.rubocop.yml b/.rubocop.yml index c92b709f..dbd74993 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -67,5 +67,3 @@ Style/MultilineBlockChain: Enabled: false Style/SpecialGlobalVars: Enabled: false -Style/FrozenStringLiteralComment: - Enabled: false diff --git a/.travis.yml b/.travis.yml index ac5a7f06..e6bc197b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,8 @@ rvm: - ruby-head - 2.3.1 - 2.2.4 + - 2.1 + - 2.0 os: - linux # - osx diff --git a/CHANGELOG.md b/CHANGELOG.md index 148aa2e2..a6494a17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,18 +1,6 @@ master === -# 4.1.13 - -* Change how config options are passed to Thor. Removes new Thor warnings from #2017 - -# 4.1.12 - -* Fix broken `ignore { |p| true }` form. - -# 4.1.11 - -* Upgrade to Rack 2. - # 4.1.10 * Fix unicode issues in URL deeplinks. diff --git a/Gemfile b/Gemfile index db4043a0..f14eb3b1 100644 --- a/Gemfile +++ b/Gemfile @@ -9,12 +9,6 @@ gem 'byebug' gem 'aruba', '~> 0.7.4', require: false gem 'rspec', '~> 3.0', require: false gem 'cucumber', '~> 2.0', require: false -gem 'addressable', '~> 2.4.0', require: false - -# Pry tools -gem 'pry' -gem 'pry-stack_explorer' -gem 'pry-rescue' # Optional middleman dependencies, included for tests gem 'haml', '>= 4.0.5', require: false @@ -24,7 +18,7 @@ gem 'kramdown', '~> 1.2', require: false gem 'slim', '>= 2.0', require: false gem 'liquid', '>= 2.6', require: false gem 'stylus', '>= 1.0', require: false -gem 'sinatra', '>= 2.0.0.beta2', require: false +gem 'sinatra', '>= 1.4', require: false gem 'redcarpet', '>= 3.1', require: false # Dns server to test preview server @@ -32,7 +26,7 @@ gem 'rubydns', '~> 1.0.1', require: false # To test javascript gem 'poltergeist', '~> 1.8', require: false -gem 'phantomjs', '~> 2.1.1.0', require: false +gem 'phantomjs', '~> 1.9.8.0', require: false # For less, note there is no compatible JS runtime for windows gem 'therubyrhino', '>= 2.0', platforms: :jruby diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md deleted file mode 100644 index 6d2dc0e0..00000000 --- a/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,9 +0,0 @@ -## Expected behavior and actual behavior - -## Steps to reproduce the problem (from a clean middleman installation) - -## Additional information - -- Ruby version: -- Middleman version: -- OS version: diff --git a/middleman-cli/bin/middleman b/middleman-cli/bin/middleman index 8b381a08..46fa5889 100755 --- a/middleman-cli/bin/middleman +++ b/middleman-cli/bin/middleman @@ -25,10 +25,12 @@ module Middleman::Cli if setting.default.is_a?(String) || setting.default.is_a?(NilClass) base.class_option setting.key, type: :string, + default: :undefined, desc: setting.description elsif setting.default.is_a?(TrueClass) || setting.default.is_a?(FalseClass) base.class_option setting.key, type: :boolean, + default: :undefined, desc: setting.description end end diff --git a/middleman-cli/lib/middleman-cli/build.rb b/middleman-cli/lib/middleman-cli/build.rb index 9e521dde..df871ce2 100644 --- a/middleman-cli/lib/middleman-cli/build.rb +++ b/middleman-cli/lib/middleman-cli/build.rb @@ -29,7 +29,7 @@ module Middleman::Cli default: false, desc: 'Print debug messages' class_option :instrument, - type: :boolean, + type: :string, default: false, desc: 'Print instrument messages' class_option :profile, @@ -64,7 +64,7 @@ module Middleman::Cli config[:mode] = :build config[:show_exceptions] = false config[:cli_options] = cli_options.each_with_object({}) do |(k, v), sum| - sum[k] = v + sum[k] = v unless v == :undefined end end diff --git a/middleman-cli/lib/middleman-cli/server.rb b/middleman-cli/lib/middleman-cli/server.rb index 85e75a9f..479f53bd 100644 --- a/middleman-cli/lib/middleman-cli/server.rb +++ b/middleman-cli/lib/middleman-cli/server.rb @@ -17,7 +17,7 @@ module Middleman::Cli default: false, desc: 'Print debug messages' class_option :instrument, - type: :boolean, + type: :string, default: false, desc: 'Print instrument messages' class_option :profile, diff --git a/middleman-cli/middleman-cli.gemspec b/middleman-cli/middleman-cli.gemspec index e9447a9c..f2719efc 100644 --- a/middleman-cli/middleman-cli.gemspec +++ b/middleman-cli/middleman-cli.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |s| s.test_files = `git ls-files -z -- {fixtures,features}/*`.split("\0") s.executable = 'middleman' s.require_path = 'lib' - s.required_ruby_version = '>= 2.2.0' + s.required_ruby_version = '>= 2.0.0' # CLI s.add_dependency('thor', ['>= 0.17.0', '< 2.0']) diff --git a/middleman-core/features/asset_host.feature b/middleman-core/features/asset_host.feature index 0433b61b..646f1154 100644 --- a/middleman-core/features/asset_host.feature +++ b/middleman-core/features/asset_host.feature @@ -25,8 +25,7 @@ Feature: Alternate between multiple asset hosts And a file named "config.rb" with: """ activate :asset_host, host: Proc.new { |asset| - hash = Digest::MD5.digest(asset).bytes.map!(&:ord).reduce(&:+) - "http://assets%d.example.com" % (hash % 4) + "http://assets%d.example.com" % (asset.hash % 4) } """ And the Server is running diff --git a/middleman-core/features/page-id.feature b/middleman-core/features/page-id.feature index 74d08cb5..63dd6fad 100644 --- a/middleman-core/features/page-id.feature +++ b/middleman-core/features/page-id.feature @@ -3,60 +3,14 @@ Feature: Page IDs Scenario: link_to works with blocks (erb) Given the Server is running at "page-id-app" When I go to "/index.html" - Then I should see "I am: index" + Then I should see "I am: index.html" And I should see "URL1: /fm.html" And I should see "URL2: /2.html" And I should see 'URL3: Hi' And I should see 'URL4: Sym' - And I should see 'URL5: Imp' - And I should see 'URL6: Foldern' - And I should see 'URL7: Feed' When I go to "/fm.html" Then I should see "I am: frontmatter" - When I go to "/implicit.html" - Then I should see "I am: implicit" - When I go to "/feed.xml" - Then I should see "I am: feed.xml" - When I go to "/folder/foldern.html" - Then I should see "I am: folder/foldern" - - When I go to "/1.html" - Then I should see "I am: page1" - When I go to "/2.html" - Then I should see "I am: page2" - When I go to "/3.html" - Then I should see "I am: page3" - - When I go to "/overwrites/from-default.html" - Then I should see "I am: something-else" - - When I go to "/overwrites/from-frontmatter.html" - Then I should see "I am: from_frontmatter" - - Scenario: Override page ID derivation with a proc - Given a fixture app "page-id-app" - And app "page-id-app" is using config "proc" - And the Server is running at "page-id-app" - - When I go to "/index.html" - Then I should see "I am: index.html-foo" - And I should see "URL1: /fm.html" - And I should see "URL2: /2.html" - And I should see 'URL3: Hi' - And I should see 'URL4: Sym' - And I should see 'URL8: Imp' - And I should see 'URL9: Foldern' - And I should see 'URL10: Feed' - - When I go to "/fm.html" - Then I should see "I am: frontmatter" - When I go to "/implicit.html" - Then I should see "I am: implicit.html-foo" - When I go to "/feed.xml" - Then I should see "I am: feed.xml-foo" - When I go to "/folder/foldern.html" - Then I should see "I am: folder/foldern.html-foo" When I go to "/1.html" Then I should see "I am: page1" diff --git a/middleman-core/fixtures/page-id-app/config-proc.rb b/middleman-core/fixtures/page-id-app/config-proc.rb deleted file mode 100644 index 03070f0e..00000000 --- a/middleman-core/fixtures/page-id-app/config-proc.rb +++ /dev/null @@ -1,7 +0,0 @@ -%w(1 2 3).each do |n| - proxy "/#{n}.html", "/index.html", id: "page#{n}" -end - -page "/overwrites/*", id: :"something-else" - -config[:page_id_generator] = ->(path){ path + "-foo" } diff --git a/middleman-core/fixtures/page-id-app/source/feed.xml.erb b/middleman-core/fixtures/page-id-app/source/feed.xml.erb deleted file mode 100644 index a27800bd..00000000 --- a/middleman-core/fixtures/page-id-app/source/feed.xml.erb +++ /dev/null @@ -1 +0,0 @@ -I am: <%= current_resource.page_id %> diff --git a/middleman-core/fixtures/page-id-app/source/folder/foldern.html.erb b/middleman-core/fixtures/page-id-app/source/folder/foldern.html.erb deleted file mode 100644 index a27800bd..00000000 --- a/middleman-core/fixtures/page-id-app/source/folder/foldern.html.erb +++ /dev/null @@ -1 +0,0 @@ -I am: <%= current_resource.page_id %> diff --git a/middleman-core/fixtures/page-id-app/source/implicit.html.erb b/middleman-core/fixtures/page-id-app/source/implicit.html.erb deleted file mode 100644 index a27800bd..00000000 --- a/middleman-core/fixtures/page-id-app/source/implicit.html.erb +++ /dev/null @@ -1 +0,0 @@ -I am: <%= current_resource.page_id %> diff --git a/middleman-core/fixtures/page-id-app/source/index.html.erb b/middleman-core/fixtures/page-id-app/source/index.html.erb index 6060bc3f..8f2997b6 100644 --- a/middleman-core/fixtures/page-id-app/source/index.html.erb +++ b/middleman-core/fixtures/page-id-app/source/index.html.erb @@ -4,11 +4,3 @@ URL1: <%= url_for "frontmatter" %> URL2: <%= url_for "page2" %> URL3: <%= link_to "Hi", "page3" %> URL4: <%= link_to "Sym", :"something-else" %> -URL5: <%= link_to "Imp", :implicit %> -URL6: <%= link_to "Foldern", "folder/foldern" %> -URL7: <%= link_to "Feed", "feed.xml" %> - -<%# If custom proc %> -URL8: <%= link_to "Imp", "implicit.html-foo" %> -URL9: <%= link_to "Foldern", "folder/foldern.html-foo" %> -URL10: <%= link_to "Feed", "feed.xml-foo" %> diff --git a/middleman-core/lib/middleman-core/application.rb b/middleman-core/lib/middleman-core/application.rb index 52b31c92..918f65ee 100644 --- a/middleman-core/lib/middleman-core/application.rb +++ b/middleman-core/lib/middleman-core/application.rb @@ -203,7 +203,6 @@ module Middleman define_setting :watcher_disable, false, 'If the Listen watcher should not run' define_setting :watcher_force_polling, false, 'If the Listen watcher should run in polling mode' define_setting :watcher_latency, nil, 'The Listen watcher latency' - define_setting :watcher_wait_for_delay, 0.5, 'The Listen watcher delay between calls when changes exist' # Delegate convenience methods off to their implementations def_delegator :"::Middleman::Logger", :singleton, :logger @@ -345,11 +344,11 @@ module Middleman # Clean up missing Tilt exts def prune_tilt_templates! - ::Tilt.default_mapping.lazy_map.each_key do |key| + ::Tilt.mappings.each_key do |key| begin ::Tilt[".#{key}"] rescue LoadError, NameError - ::Tilt.default_mapping.lazy_map.delete(key) + ::Tilt.mappings.delete(key) end end end diff --git a/middleman-core/lib/middleman-core/core_extensions/file_watcher.rb b/middleman-core/lib/middleman-core/core_extensions/file_watcher.rb index 6fd16ae9..82df8f73 100644 --- a/middleman-core/lib/middleman-core/core_extensions/file_watcher.rb +++ b/middleman-core/lib/middleman-core/core_extensions/file_watcher.rb @@ -28,7 +28,10 @@ module Middleman super # Setup source collection. - @sources = ::Middleman::Sources.new(app) + @sources = ::Middleman::Sources.new(app, + disable_watcher: app.config[:watcher_disable], + force_polling: app.config[:watcher_force_polling], + latency: app.config[:watcher_latency]) # Add default ignores. IGNORES.each do |key, value| @@ -52,13 +55,6 @@ module Middleman # @return [void] Contract Any def after_configuration - @watcher.update_config( - disable_watcher: app.config[:watcher_disable], - force_polling: app.config[:watcher_force_polling], - latency: app.config[:watcher_latency], - wait_for_delay: app.config[:watcher_wait_for_delay] - ) - if @original_source_dir != app.config[:source] @watcher.update_path(app.config[:source]) end diff --git a/middleman-core/lib/middleman-core/extensions/minify_css.rb b/middleman-core/lib/middleman-core/extensions/minify_css.rb index aca9c60b..2701b8f2 100644 --- a/middleman-core/lib/middleman-core/extensions/minify_css.rb +++ b/middleman-core/lib/middleman-core/extensions/minify_css.rb @@ -72,7 +72,7 @@ class Middleman::Extensions::MinifyCss < ::Middleman::Extension end if minified - headers['Content-Length'] = minified.bytesize.to_s + headers['Content-Length'] = ::Rack::Utils.bytesize(minified).to_s response = [minified] end diff --git a/middleman-core/lib/middleman-core/extensions/minify_javascript.rb b/middleman-core/lib/middleman-core/extensions/minify_javascript.rb index 714d0645..22719e83 100644 --- a/middleman-core/lib/middleman-core/extensions/minify_javascript.rb +++ b/middleman-core/lib/middleman-core/extensions/minify_javascript.rb @@ -64,7 +64,7 @@ class Middleman::Extensions::MinifyJavascript < ::Middleman::Extension end if minified - headers['Content-Length'] = minified.bytesize.to_s + headers['Content-Length'] = ::Rack::Utils.bytesize(minified).to_s response = [minified] end diff --git a/middleman-core/lib/middleman-core/file_renderer.rb b/middleman-core/lib/middleman-core/file_renderer.rb index 26a38dc7..a3e8b193 100644 --- a/middleman-core/lib/middleman-core/file_renderer.rb +++ b/middleman-core/lib/middleman-core/file_renderer.rb @@ -3,8 +3,8 @@ require 'active_support/core_ext/string/output_safety' require 'active_support/core_ext/module/delegation' require 'middleman-core/contracts' -::Tilt.default_mapping.lazy_map.delete('html') -::Tilt.default_mapping.lazy_map.delete('csv') +::Tilt.mappings.delete('html') # WTF, Tilt? +::Tilt.mappings.delete('csv') module Middleman class FileRenderer @@ -123,8 +123,8 @@ module Middleman # Find all the engines which handle this extension in tilt. Look for # config variables of that name and merge it extension_class = ::Middleman::Util.tilt_class(ext) - - ::Tilt.default_mapping.extensions_for(extension_class).each do |mapping_ext| + ::Tilt.mappings.each do |mapping_ext, engines| + next unless engines.include? extension_class engine_options = @app.config[mapping_ext.to_sym] || {} options.merge!(engine_options) end diff --git a/middleman-core/lib/middleman-core/preview_server.rb b/middleman-core/lib/middleman-core/preview_server.rb index 1a3d220e..b70e9c99 100644 --- a/middleman-core/lib/middleman-core/preview_server.rb +++ b/middleman-core/lib/middleman-core/preview_server.rb @@ -143,7 +143,7 @@ module Middleman app = ::Middleman::Application.new do config[:cli_options] = cli_options.each_with_object({}) do |(k, v), sum| - sum[k] = v + sum[k] = v unless v == :undefined end ready do @@ -160,9 +160,6 @@ module Middleman path: root, only: match_against - # Hack around bower_components in root. - watcher.listener.ignore(/^bower_components/) - # Hack around node_modules in root. watcher.listener.ignore(/^node_modules/) @@ -207,7 +204,7 @@ module Middleman end def possible_from_cli(key, config) - if @cli_options[key] + if @cli_options[key] && @cli_options[key] != :undefined @cli_options[key] else config[key] diff --git a/middleman-core/lib/middleman-core/rack.rb b/middleman-core/lib/middleman-core/rack.rb index 640dbad9..293a2e43 100644 --- a/middleman-core/lib/middleman-core/rack.rb +++ b/middleman-core/lib/middleman-core/rack.rb @@ -133,15 +133,9 @@ module Middleman # Immediately send static file def send_file(resource, env) - file = ::Rack::File.new nil - path = resource.file_descriptor[:full_path] - if !file.respond_to?(:path=) - request = ::Rack::Request.new(env) - response = file.serving(request, path) - else - file.path = path - response = file.serving(env) - end + file = ::Rack::File.new nil + file.path = resource.file_descriptor[:full_path] + response = file.serving(env) status = response[0] response[1]['Content-Encoding'] = 'gzip' if %w(.svgz .gz).include?(resource.ext) # Do not set Content-Type if status is 1xx, 204, 205 or 304, otherwise diff --git a/middleman-core/lib/middleman-core/renderers/redcarpet.rb b/middleman-core/lib/middleman-core/renderers/redcarpet.rb index b2171f22..1542489c 100644 --- a/middleman-core/lib/middleman-core/renderers/redcarpet.rb +++ b/middleman-core/lib/middleman-core/renderers/redcarpet.rb @@ -3,7 +3,7 @@ require 'active_support/core_ext/module/attribute_accessors' module Middleman module Renderers - class RedcarpetTemplate < ::Tilt::RedcarpetTemplate + class RedcarpetTemplate < ::Tilt::RedcarpetTemplate::Redcarpet2 # because tilt has decided to convert these # in the wrong direction ALIASES = { diff --git a/middleman-core/lib/middleman-core/sitemap/extensions/ignores.rb b/middleman-core/lib/middleman-core/sitemap/extensions/ignores.rb index 0367c64a..dfa80304 100644 --- a/middleman-core/lib/middleman-core/sitemap/extensions/ignores.rb +++ b/middleman-core/lib/middleman-core/sitemap/extensions/ignores.rb @@ -14,31 +14,16 @@ module Middleman Contract Or[String, Regexp, Proc] => RespondTo[:execute_descriptor] def ignore(path=nil, &block) @app.sitemap.invalidate_resources_not_ignored_cache! - - if path.is_a? Regexp - RegexpIgnoreDescriptor.new(path) - elsif path.is_a? String - path_clean = ::Middleman::Util.normalize_path(path) - - if path_clean.include?('*') # It's a glob - GlobIgnoreDescriptor.new(path_clean) - else - StringIgnoreDescriptor.new(path_clean) - end - elsif block - BlockIgnoreDescriptor.new(nil, block) - else - IgnoreDescriptor.new(path, block) - end + IgnoreDescriptor.new(path, block) end IgnoreDescriptor = Struct.new(:path, :block) do def execute_descriptor(_app, resources) resources.map do |r| # Ignore based on the source path (without template extensions) - if ignored?(r.normalized_path) + if ignored?(r.path) r.ignore! - elsif !r.is_a?(ProxyResource) && r.file_descriptor && ignored?(r.file_descriptor.normalized_relative_path) + elsif !r.is_a?(ProxyResource) && r.file_descriptor && ignored?(r.file_descriptor[:relative_path].to_s) # This allows files to be ignored by their source file name (with template extensions) r.ignore! end @@ -48,38 +33,27 @@ module Middleman end def ignored?(match_path) - raise NotImplementedError - end - end + match_path = ::Middleman::Util.normalize_path(match_path) - class RegexpIgnoreDescriptor < IgnoreDescriptor - def ignored?(match_path) - match_path =~ path - end - end + if path.is_a? Regexp + match_path =~ path + elsif path.is_a? String + path_clean = ::Middleman::Util.normalize_path(path) - class GlobIgnoreDescriptor < IgnoreDescriptor - def ignored?(match_path) - if defined?(::File::FNM_EXTGLOB) - ::File.fnmatch(path, match_path, ::File::FNM_EXTGLOB) - else - ::File.fnmatch(path, match_path) + if path_clean.include?('*') # It's a glob + if defined?(::File::FNM_EXTGLOB) + ::File.fnmatch(path_clean, match_path, ::File::FNM_EXTGLOB) + else + ::File.fnmatch(path_clean, match_path) + end + else + match_path == path_clean + end + elsif block + block.call(match_path) end end end - - class StringIgnoreDescriptor < IgnoreDescriptor - def ignored?(match_path) - match_path == path - end - end - - class BlockIgnoreDescriptor < IgnoreDescriptor - def ignored?(match_path) - block.call(match_path) - end - end - end end end diff --git a/middleman-core/lib/middleman-core/sitemap/extensions/proxies.rb b/middleman-core/lib/middleman-core/sitemap/extensions/proxies.rb index 42098ae8..b11e02eb 100644 --- a/middleman-core/lib/middleman-core/sitemap/extensions/proxies.rb +++ b/middleman-core/lib/middleman-core/sitemap/extensions/proxies.rb @@ -47,7 +47,7 @@ module Middleman ) if should_ignore - d = ::Middleman::Sitemap::Extensions::Ignores::StringIgnoreDescriptor.new(target) + d = ::Middleman::Sitemap::Extensions::Ignores::IgnoreDescriptor.new(target) d.execute_descriptor(app, resources) end diff --git a/middleman-core/lib/middleman-core/sitemap/resource.rb b/middleman-core/lib/middleman-core/sitemap/resource.rb index f3619873..22b13498 100644 --- a/middleman-core/lib/middleman-core/sitemap/resource.rb +++ b/middleman-core/lib/middleman-core/sitemap/resource.rb @@ -87,7 +87,7 @@ module Middleman Contract Or[Symbol, String, Fixnum] def page_id - metadata[:page][:id] || make_implicit_page_id(destination_path) + metadata[:page][:id] || destination_path end # Merge in new metadata specific to this resource. @@ -197,41 +197,10 @@ module Middleman options[:content_type] || ::Rack::Mime.mime_type(ext, nil) end - # The normalized source path of this resource (relative to the source directory, - # without template extensions) - # @return [String] - def normalized_path - @normalized_path ||= ::Middleman::Util.normalize_path @path - end - def to_s "#<#{self.class} path=#{@path}>" end alias inspect to_s # Ruby 2.0 calls inspect for NoMethodError instead of to_s - - protected - - # Makes a page id based on path (when not otherwise given) - # - # Removes .html extension and potential leading slashes or dots - # eg. "foo/bar/baz.foo.html" => "foo/bar/baz.foo" - Contract String => String - def make_implicit_page_id(path) - @id ||= begin - if prok = @app.config[:page_id_generator] - return prok.call(path) - end - - basename = if ext == ".html" - File.basename(path, ext) - else - File.basename(path) - end - - # Remove leading dot or slash if present - File.join(File.dirname(path), basename).gsub(/^\.?\//, '') - end - end end class StringResource < Resource diff --git a/middleman-core/lib/middleman-core/sources.rb b/middleman-core/lib/middleman-core/sources.rb index ced46227..f0d3cc91 100644 --- a/middleman-core/lib/middleman-core/sources.rb +++ b/middleman-core/lib/middleman-core/sources.rb @@ -8,10 +8,6 @@ module Middleman ::Middleman::Sources.file_cache[full_path] ||= {} ::Middleman::Sources.file_cache[full_path][version] ||= ::File.read(full_path) end - - def normalized_relative_path - @normalized_relative_path ||= ::Middleman::Util.normalize_path relative_path.to_s - end end # Sources handle multiple on-disk collections of files which make up @@ -56,13 +52,15 @@ module Middleman # @param [Hash] options Global options. # @param [Array] watchers Default watchers. Contract IsA['Middleman::Application'], Maybe[Hash], Maybe[Array] => Any - def initialize(app, _options={}, watchers=[]) + def initialize(app, options={}, watchers=[]) @app = app @watchers = watchers @sorted_watchers = @watchers.dup.freeze ::Middleman::Sources.file_cache = {} + @options = options + # Set of procs wanting to be notified of changes @on_change_callbacks = ::Hamster::Vector.empty @@ -170,7 +168,7 @@ module Middleman # @return [Middleman::Sources] Contract Symbol => ::Middleman::Sources def by_type(type) - self.class.new @app, nil, watchers.select { |d| d.type == type } + self.class.new @app, @options, watchers.select { |d| d.type == type } end # Get all files for this collection of watchers. diff --git a/middleman-core/lib/middleman-core/sources/source_watcher.rb b/middleman-core/lib/middleman-core/sources/source_watcher.rb index 8e3a3550..07d7ff62 100644 --- a/middleman-core/lib/middleman-core/sources/source_watcher.rb +++ b/middleman-core/lib/middleman-core/sources/source_watcher.rb @@ -75,10 +75,9 @@ module Middleman @ignored = options.fetch(:ignored, proc { false }) @only = Array(options.fetch(:only, [])) - @disable_watcher = app.build? - @force_polling = false - @latency = nil - @wait_for_delay = nil + @disable_watcher = app.build? || @parent.options.fetch(:disable_watcher, false) + @force_polling = @parent.options.fetch(:force_polling, false) + @latency = @parent.options.fetch(:latency, nil) @listener = nil @@ -96,20 +95,13 @@ module Middleman def update_path(directory) @directory = Pathname(File.expand_path(directory, app.root)) - without_listener_running do - update([], @files.values.map { |source_file| source_file[:full_path] }) - end + stop_listener! if @listener + + update([], @files.values.map { |source_file| source_file[:full_path] }) poll_once! - end - def update_config(options={}) - without_listener_running do - @disable_watcher = options.fetch(:disable_watcher, false) - @force_polling = options.fetch(:force_polling, false) - @latency = options.fetch(:latency, nil) - @wait_for_delay = options.fetch(:wait_for_delay, nil) - end + listen! unless @disable_watcher end # Stop watching. @@ -168,10 +160,10 @@ module Middleman config = { force_polling: @force_polling, + wait_for_delay: 0.5 } - config[:wait_for_delay] = @wait_for_delay.try(:to_f) || 0.5 - config[:latency] = @latency.to_f if @latency + config[:latency] = @latency.to_i if @latency @listener = ::Listen.to(@directory.to_s, config, &method(:on_listener_change)) @@ -207,7 +199,7 @@ module Middleman Contract ArrayOf[Pathname] def poll_once! updated = ::Middleman::Util.all_files_under(@directory.to_s, &method(:should_not_recurse?)) - removed = @files.keys - updated + removed = @files.keys.reject { |p| updated.include?(p) } result = update(updated, removed) @@ -351,20 +343,5 @@ module Middleman @only.any? { |reg| file[:relative_path].to_s =~ reg } end end - - private - - def without_listener_running - listener_running = @listener && @listener.processing? - - stop_listener! if listener_running - - yield - - if listener_running - poll_once! - listen! - end - end end end diff --git a/middleman-core/lib/middleman-core/template_renderer.rb b/middleman-core/lib/middleman-core/template_renderer.rb index 8100a56d..0dcf2af8 100644 --- a/middleman-core/lib/middleman-core/template_renderer.rb +++ b/middleman-core/lib/middleman-core/template_renderer.rb @@ -64,7 +64,9 @@ module Middleman extension_class = ::Middleman::Util.tilt_class(options[:preferred_engine]) # Get a list of extensions for a preferred engine - preferred_engines += ::Tilt.default_mapping.extensions_for(extension_class) + preferred_engines += ::Tilt.mappings.select do |_, engines| + engines.include? extension_class + end.keys end preferred_engines << '*' diff --git a/middleman-core/lib/middleman-core/util/paths.rb b/middleman-core/lib/middleman-core/util/paths.rb index 2e229392..2814cfc9 100644 --- a/middleman-core/lib/middleman-core/util/paths.rb +++ b/middleman-core/lib/middleman-core/util/paths.rb @@ -1,7 +1,7 @@ # Core Pathname library used for traversal require 'pathname' require 'uri' -require 'addressable/uri' +require 'addressable' require 'memoist' require 'tilt' @@ -152,8 +152,7 @@ module Middleman def url_for(app, path_or_resource, options={}) if path_or_resource.is_a?(String) || path_or_resource.is_a?(Symbol) r = app.sitemap.find_resource_by_page_id(path_or_resource) - - path_or_resource = r ? r : path_or_resource.to_s + path_or_resource = r if r end # Handle Resources and other things which define their own url method diff --git a/middleman-core/lib/middleman-core/version.rb b/middleman-core/lib/middleman-core/version.rb index 7b1bf403..6f3f1228 100644 --- a/middleman-core/lib/middleman-core/version.rb +++ b/middleman-core/lib/middleman-core/version.rb @@ -1,5 +1,5 @@ module Middleman # Current Version # @return [String] - VERSION = '4.1.14'.freeze unless const_defined?(:VERSION) + VERSION = '4.1.10'.freeze unless const_defined?(:VERSION) end diff --git a/middleman-core/middleman-core.gemspec b/middleman-core/middleman-core.gemspec index 38df7be7..f5509c72 100644 --- a/middleman-core/middleman-core.gemspec +++ b/middleman-core/middleman-core.gemspec @@ -16,12 +16,12 @@ Gem::Specification.new do |s| s.files = `git ls-files -z`.split("\0") s.test_files = `git ls-files -z -- {fixtures,features}/*`.split("\0") s.require_path = 'lib' - s.required_ruby_version = '>= 2.2.0' + s.required_ruby_version = '>= 2.0.0' # Core s.add_dependency('bundler', ['~> 1.1']) - s.add_dependency('rack', ['>= 1.4.5', '< 3']) - s.add_dependency('tilt', ['~> 2.0']) + s.add_dependency('rack', ['>= 1.4.5', '< 2.0']) + s.add_dependency('tilt', ['~> 1.4.1']) s.add_dependency('erubis') s.add_dependency('fast_blank') s.add_dependency('parallel') @@ -29,7 +29,7 @@ Gem::Specification.new do |s| s.add_dependency('dotenv') # Helpers - s.add_dependency('activesupport', ['>= 4.2', '< 5.1']) + s.add_dependency('activesupport', ['~> 4.2']) s.add_dependency('padrino-helpers', ['~> 0.13.0']) s.add_dependency("addressable", ["~> 2.3"]) s.add_dependency('memoist', ['~> 0.14']) diff --git a/middleman-core/spec/middleman-core/util_spec.rb b/middleman-core/spec/middleman-core/util_spec.rb index 9c429145..a852521d 100644 --- a/middleman-core/spec/middleman-core/util_spec.rb +++ b/middleman-core/spec/middleman-core/util_spec.rb @@ -220,7 +220,7 @@ describe Middleman::Util do it "does not loop infinitely when file name is a possible templating engine" do expect do - Timeout::timeout(3.0) do + Timeout::timeout(0.5) do result = Middleman::Util.step_through_extensions("markdown.scss") expect(result).to eq "markdown" end diff --git a/middleman/middleman.gemspec b/middleman/middleman.gemspec index a172005f..06dd3144 100644 --- a/middleman/middleman.gemspec +++ b/middleman/middleman.gemspec @@ -16,7 +16,7 @@ Gem::Specification.new do |s| s.files = `git ls-files -z`.split("\0") s.test_files = `git ls-files -z -- {fixtures,features}/*`.split("\0") s.require_path = 'lib' - s.required_ruby_version = '>= 2.2.0' + s.required_ruby_version = '>= 2.0.0' s.add_dependency('middleman-core', Middleman::VERSION) s.add_dependency('middleman-cli', Middleman::VERSION)