diff --git a/CHANGELOG.md b/CHANGELOG.md index 75d694cf..3d86ee96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ * Don't re-minify files with ".min" in their name * Serve purely static folders directly (without source/ and config.rb) * Set ignored files and disable directory_indexes from YAML frontmatter +* Automatically load helper modules in helpers/ directory 2.0.14 ==== diff --git a/middleman-core/features/helpers_external.feature b/middleman-core/features/helpers_external.feature index 6e6b6f7b..2318667a 100644 --- a/middleman-core/features/helpers_external.feature +++ b/middleman-core/features/helpers_external.feature @@ -3,4 +3,10 @@ Feature: Helpers in external files Scenario: Hello Helper Given the Server is running at "external-helpers" Then going to "/index.html" should not raise an exception - And I should see "Hello World" \ No newline at end of file + And I should see "Hello World" + + Scenario: Automatic Helpers + Given the Server is running at "external-helpers" + Then going to "/automatic.html" should not raise an exception + And I should see "One:Two:Three:Four" + \ No newline at end of file diff --git a/middleman-core/fixtures/external-helpers/helpers/four_helper.rb b/middleman-core/fixtures/external-helpers/helpers/four_helper.rb new file mode 100644 index 00000000..a0bb07cb --- /dev/null +++ b/middleman-core/fixtures/external-helpers/helpers/four_helper.rb @@ -0,0 +1,3 @@ +module FourHelper + def four; "Four"; end +end \ No newline at end of file diff --git a/middleman-core/fixtures/external-helpers/helpers/one_helper.rb b/middleman-core/fixtures/external-helpers/helpers/one_helper.rb new file mode 100644 index 00000000..09cceacb --- /dev/null +++ b/middleman-core/fixtures/external-helpers/helpers/one_helper.rb @@ -0,0 +1,3 @@ +module OneHelper + def one; "One"; end +end \ No newline at end of file diff --git a/middleman-core/fixtures/external-helpers/helpers/three_helper.rb b/middleman-core/fixtures/external-helpers/helpers/three_helper.rb new file mode 100644 index 00000000..067137be --- /dev/null +++ b/middleman-core/fixtures/external-helpers/helpers/three_helper.rb @@ -0,0 +1,3 @@ +module ThreeHelper + def three; "Three"; end +end \ No newline at end of file diff --git a/middleman-core/fixtures/external-helpers/helpers/two_helper.rb b/middleman-core/fixtures/external-helpers/helpers/two_helper.rb new file mode 100644 index 00000000..b6c2e26e --- /dev/null +++ b/middleman-core/fixtures/external-helpers/helpers/two_helper.rb @@ -0,0 +1,3 @@ +module TwoHelper + def two; "Two"; end +end \ No newline at end of file diff --git a/middleman-core/fixtures/external-helpers/source/automatic.html.erb b/middleman-core/fixtures/external-helpers/source/automatic.html.erb new file mode 100644 index 00000000..e208e5e7 --- /dev/null +++ b/middleman-core/fixtures/external-helpers/source/automatic.html.erb @@ -0,0 +1 @@ +<%= one %>:<%= two %>:<%= three %>:<%= four %> \ No newline at end of file diff --git a/middleman-core/lib/middleman-core.rb b/middleman-core/lib/middleman-core.rb index 8a145506..b8053dcd 100755 --- a/middleman-core/lib/middleman-core.rb +++ b/middleman-core/lib/middleman-core.rb @@ -72,6 +72,9 @@ module Middleman # Parse YAML from templates autoload :FrontMatter, "middleman-core/core_extensions/front_matter" + # External helpers looks in the helpers/ folder for helper modules + autoload :ExternalHelpers, "middleman-core/core_extensions/external_helpers" + # DefaultHelpers are the built-in dynamic template helpers. autoload :DefaultHelpers, "middleman-core/core_extensions/default_helpers" diff --git a/middleman-core/lib/middleman-core/base.rb b/middleman-core/lib/middleman-core/base.rb index a09033f7..c727c967 100644 --- a/middleman-core/lib/middleman-core/base.rb +++ b/middleman-core/lib/middleman-core/base.rb @@ -225,6 +225,9 @@ class Middleman::Base # Sitemap register Middleman::CoreExtensions::Sitemap + # Setup external helpers + register Middleman::CoreExtensions::ExternalHelpers + # Setup default helpers register Middleman::CoreExtensions::DefaultHelpers diff --git a/middleman-core/lib/middleman-core/core_extensions/external_helpers.rb b/middleman-core/lib/middleman-core/core_extensions/external_helpers.rb new file mode 100644 index 00000000..015f9e10 --- /dev/null +++ b/middleman-core/lib/middleman-core/core_extensions/external_helpers.rb @@ -0,0 +1,35 @@ +# Load helpers in helpers/ +module Middleman::CoreExtensions::ExternalHelpers + + # Setup extension + class << self + + # once registered + def registered(app) + # Setup a default helpers paths + app.set :helpers_dir, "helpers" + app.set :helpers_filename_glob, "**/*_helper.rb" + app.set :helpers_filename_to_module_name_proc, Proc.new { |filename| + basename = File.basename(filename, File.extname(filename)) + basename.camelcase + } + + # After config + app.after_configuration do + helpers_path = File.expand_path(helpers_dir, root) + next unless File.exists?(helpers_path) + + Dir[File.join(helpers_path, helpers_filename_glob)].each do |filename| + module_name = helpers_filename_to_module_name_proc.call(filename) + next unless module_name + + require filename + next unless Object.const_defined?(module_name.to_sym) + + helpers Object.const_get(module_name.to_sym) + end + end + end + alias :included :registered + end +end \ No newline at end of file diff --git a/middleman-core/lib/middleman-core/watcher.rb b/middleman-core/lib/middleman-core/watcher.rb index 41d4b64e..d7b6f1cd 100644 --- a/middleman-core/lib/middleman-core/watcher.rb +++ b/middleman-core/lib/middleman-core/watcher.rb @@ -130,12 +130,12 @@ module Middleman end private - # Whether the passed files are config.rb or lib/*.rb + # Whether the passed files are config.rb, lib/*.rb or helpers # @param [Array] paths Array of paths to check # @return [Boolean] Whether the server needs to reload def needs_to_reload?(paths) paths.any? do |path| - path.match(%{^config\.rb}) || path.match(%r{^lib/^[^\.](.*)\.rb$}) + path.match(%{^config\.rb}) || path.match(%r{^lib/^[^\.](.*)\.rb$}) || path.match(%r{^helpers/^[^\.](.*)_helper\.rb$}) end end