remote data sources and indifferent access. closes #44
This commit is contained in:
parent
611334cad4
commit
78f8245c20
|
@ -1,8 +1,11 @@
|
||||||
require "yaml"
|
require "yaml"
|
||||||
|
require "httparty"
|
||||||
|
require "thor"
|
||||||
|
|
||||||
module Middleman::Features::Data
|
module Middleman::Features::Data
|
||||||
class << self
|
class << self
|
||||||
def registered(app)
|
def registered(app)
|
||||||
|
app.extend ClassMethods
|
||||||
app.helpers Middleman::Features::Data::Helpers
|
app.helpers Middleman::Features::Data::Helpers
|
||||||
end
|
end
|
||||||
alias :included :registered
|
alias :included :registered
|
||||||
|
@ -20,11 +23,57 @@ module Middleman::Features::Data
|
||||||
end
|
end
|
||||||
|
|
||||||
def method_missing(path)
|
def method_missing(path)
|
||||||
|
response = nil
|
||||||
|
|
||||||
|
@@remote_sources ||= {}
|
||||||
|
if @@remote_sources.has_key?(path.to_s)
|
||||||
|
response = HTTParty.get(@@remote_sources[path.to_s]).parsed_response
|
||||||
|
end
|
||||||
|
|
||||||
file_path = File.join(@app.class.root, "data", "#{path}.yml")
|
file_path = File.join(@app.class.root, "data", "#{path}.yml")
|
||||||
if File.exists? file_path
|
if File.exists? file_path
|
||||||
return YAML.load_file(file_path)
|
response = YAML.load_file(file_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
if response
|
||||||
|
recursively_enhance(response)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.add_source(name, json_url)
|
||||||
|
@@remote_sources ||= {}
|
||||||
|
@@remote_sources[name.to_s] = json_url
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def recursively_enhance(data)
|
||||||
|
if data.is_a? Hash
|
||||||
|
data = Thor::CoreExt::HashWithIndifferentAccess.new(data)
|
||||||
|
data.each do |key, val|
|
||||||
|
data[key] = recursively_enhance(val)
|
||||||
|
end
|
||||||
|
data
|
||||||
|
elsif data.is_a? Array
|
||||||
|
data.each_with_index do |val, i|
|
||||||
|
data[i] = recursively_enhance(val)
|
||||||
|
end
|
||||||
|
data
|
||||||
|
else
|
||||||
|
data
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module ClassMethods
|
||||||
|
# Makes HTTP json data available in the data object
|
||||||
|
#
|
||||||
|
# data_source :my_json, "http://my/file.json"
|
||||||
|
#
|
||||||
|
# Available in templates as:
|
||||||
|
#
|
||||||
|
# data.my_json
|
||||||
|
def data_source(name, url)
|
||||||
|
Middleman::Features::Data::DataObject.add_source(name, url)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
|
@ -35,6 +35,7 @@ Gem::Specification.new do |s|
|
||||||
s.add_runtime_dependency("sass", ["~> 3.1.0"])
|
s.add_runtime_dependency("sass", ["~> 3.1.0"])
|
||||||
s.add_runtime_dependency("compass", ["~> 0.11.1"])
|
s.add_runtime_dependency("compass", ["~> 0.11.1"])
|
||||||
s.add_runtime_dependency("coffee-script", ["~> 2.1.0"])
|
s.add_runtime_dependency("coffee-script", ["~> 2.1.0"])
|
||||||
|
s.add_runtime_dependency("httparty", ["~> 0.7.0"])
|
||||||
# s.add_runtime_dependency("fssm", ["~> 0.2.0"])
|
# s.add_runtime_dependency("fssm", ["~> 0.2.0"])
|
||||||
s.add_development_dependency("cucumber", ["~> 0.10.0"])
|
s.add_development_dependency("cucumber", ["~> 0.10.0"])
|
||||||
s.add_development_dependency("rspec", [">= 0"])
|
s.add_development_dependency("rspec", [">= 0"])
|
||||||
|
|
Loading…
Reference in a new issue