Support directory name as a data key

This commit is contained in:
Ryunosuke SATO 2013-03-23 17:13:05 +09:00
parent cd539f4e91
commit 1e64e8022e
5 changed files with 40 additions and 9 deletions

View file

@ -20,3 +20,8 @@ Feature: Local Data API
Given the Server is running at "data-app" Given the Server is running at "data-app"
When I go to "/test2.html" When I go to "/test2.html"
Then I should see "Welcome" Then I should see "Welcome"
Scenario: Using nested data
Given the Server is running at "nested-data-app"
When I go to "/test.html"
Then I should see "test:Hello"

View file

@ -0,0 +1 @@
set :layout, false

View file

@ -0,0 +1 @@
title: "Hello"

View file

@ -0,0 +1 @@
<%= data.examples.map { |k, r| [k, r.title].join(":") }.join %>

View file

@ -92,19 +92,30 @@ module Middleman
# @param [String] file The file to be re-parsed # @param [String] file The file to be re-parsed
# @return [void] # @return [void]
def touch_file(file) def touch_file(file)
file = File.expand_path(file, @app.root) root = Pathname(@app.root)
full_path = root + file
extension = File.extname(file) extension = File.extname(file)
basename = File.basename(file, extension) basename = File.basename(file, extension)
data_path = full_path.relative_path_from(root + @app.config[:data_dir])
if %w(.yaml .yml).include?(extension) if %w(.yaml .yml).include?(extension)
data = YAML.load_file(file) data = YAML.load_file(full_path)
elsif extension == ".json" elsif extension == ".json"
data = ActiveSupport::JSON.decode(File.read(file)) data = ActiveSupport::JSON.decode(full_path.read)
else else
return return
end end
@local_data[basename] = ::Middleman::Util.recursively_enhance(data) data_branch = @local_data
path = data_path.to_s.split(File::SEPARATOR)[0..-2]
path.each do |dir|
data_branch[dir] ||= ::Middleman::Util.recursively_enhance({})
data_branch = data_branch[dir]
end
data_branch[basename] = ::Middleman::Util.recursively_enhance(data)
end end
# Remove a given file from the internal cache # Remove a given file from the internal cache
@ -112,9 +123,21 @@ module Middleman
# @param [String] file The file to be cleared # @param [String] file The file to be cleared
# @return [void] # @return [void]
def remove_file(file) def remove_file(file)
root = Pathname(@app.root)
full_path = root + file
extension = File.extname(file) extension = File.extname(file)
basename = File.basename(file, extension) basename = File.basename(file, extension)
@local_data.delete(basename) if @local_data.has_key?(basename)
data_path = full_path.relative_path_from(root + @app.config[:data_dir])
data_branch = @local_data
path = data_path.to_s.split(File::SEPARATOR)[0..-2]
path.each do |dir|
data_branch = data_branch[dir]
end
data_branch.delete(basename) if data_branch.has_key?(basename)
end end
# Get a hash from either internal static data or a callback # Get a hash from either internal static data or a callback