Class: Middleman::CoreExtensions::Data::DataStore
- Inherits:
-
Object
- Object
- Middleman::CoreExtensions::Data::DataStore
- Includes:
- Contracts
- Defined in:
- lib/middleman-core/core_extensions/data.rb
Overview
The core logic behind the data extension.
Constant Summary
Constants included from Contracts
Instance Method Summary collapse
-
#[](key) ⇒ Hash?
Make DataStore act like a hash.
- #callbacks(name = nil, proc = nil) ⇒ Object
- #data_for_path(path) ⇒ Object
-
#Hash ⇒ Hash
Convert all the data into a static hash.
-
#initialize(app, data_file_matcher) ⇒ DataStore
constructor
Setup data store.
- #key?(key) ⇒ Boolean (also: #has_key?)
-
#method_missing(path) ⇒ Hash?
"Magically" find namespaces of data if they exist.
- #remove_file(file) ⇒ Object
-
#respond_to?(method, include_private = false) ⇒ Boolean
Needed so that method_missing makes sense.
- #store(name = nil, content = nil) ⇒ Object
-
#Symbol ⇒ Hash
Store static data hash.
- #to_h ⇒ Object
- #touch_file(file) ⇒ Object
- #update_files(updated_files, removed_files) ⇒ Object
Methods included from Contracts
Constructor Details
#initialize(app, data_file_matcher) ⇒ DataStore
Setup data store
56 57 58 59 60 61 62 63 |
# File 'lib/middleman-core/core_extensions/data.rb', line 56 def initialize(app, data_file_matcher) @app = app @data_file_matcher = data_file_matcher @local_data = {} @local_data_enhanced = nil @local_sources = {} @callback_sources = {} end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(path) ⇒ Hash?
"Magically" find namespaces of data if they exist
166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/middleman-core/core_extensions/data.rb', line 166 def method_missing(path) if @local_data.key?(path.to_s) # Any way to cache this? @local_data_enhanced ||= ::Middleman::Util.recursively_enhance(@local_data) return @local_data_enhanced[path.to_s] else result = data_for_path(path) return result if result end super end |
Instance Method Details
#[](key) ⇒ Hash?
Make DataStore act like a hash. Return requested data, or nil if data does not exist
189 190 191 |
# File 'lib/middleman-core/core_extensions/data.rb', line 189 def [](key) __send__(key) if key?(key) end |
#callbacks(name = nil, proc = nil) ⇒ Object
82 83 84 85 |
# File 'lib/middleman-core/core_extensions/data.rb', line 82 def callbacks(name=nil, proc=nil) @callback_sources[name.to_s] = proc unless name.nil? || proc.nil? @callback_sources end |
#data_for_path(path) ⇒ Object
152 153 154 155 156 157 158 159 160 |
# File 'lib/middleman-core/core_extensions/data.rb', line 152 def data_for_path(path) response = if store.key?(path.to_s) store[path.to_s] elsif callbacks.key?(path.to_s) callbacks[path.to_s].call end ::Middleman::Util.recursively_enhance(response) end |
#Hash ⇒ Hash
Convert all the data into a static hash
202 |
# File 'lib/middleman-core/core_extensions/data.rb', line 202 Contract Hash |
#key?(key) ⇒ Boolean Also known as: has_key?
193 194 195 |
# File 'lib/middleman-core/core_extensions/data.rb', line 193 def key?(key) (@local_data.keys + @local_sources.keys + @callback_sources.keys).include?(key.to_s) end |
#remove_file(file) ⇒ Object
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/middleman-core/core_extensions/data.rb', line 130 def remove_file(file) data_path = file[:relative_path] extension = File.extname(data_path) basename = File.basename(data_path, extension) 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.key?(basename) @local_data_enhanced = nil end |
#respond_to?(method, include_private = false) ⇒ Boolean
Needed so that method_missing makes sense
180 181 182 |
# File 'lib/middleman-core/core_extensions/data.rb', line 180 def respond_to?(method, include_private=false) super || key?(method) end |
#store(name = nil, content = nil) ⇒ Object
71 72 73 74 |
# File 'lib/middleman-core/core_extensions/data.rb', line 71 def store(name=nil, content=nil) @local_sources[name.to_s] = content unless name.nil? || content.nil? @local_sources end |
#Symbol ⇒ Hash
Store static data hash
70 |
# File 'lib/middleman-core/core_extensions/data.rb', line 70 Contract Symbol, Or[Hash, Array] => Hash |
#to_h ⇒ Object
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
# File 'lib/middleman-core/core_extensions/data.rb', line 203 def to_h data = {} store.each_key do |k| data[k] = data_for_path(k) end callbacks.each_key do |k| data[k] = data_for_path(k) end (@local_data || {}).each do |k, v| data[k] = v end data end |
#touch_file(file) ⇒ Object
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/middleman-core/core_extensions/data.rb', line 98 def touch_file(file) data_path = file[:relative_path] extension = File.extname(data_path) basename = File.basename(data_path, extension) return unless %w(.yaml .yml .json).include?(extension) if %w(.yaml .yml).include?(extension) data, postscript = ::Middleman::Util::Data.parse(file, @app.config[:frontmatter_delims], :yaml) data[:postscript] = postscript if !postscript.nil? && data.is_a?(Hash) elsif extension == '.json' data, _postscript = ::Middleman::Util::Data.parse(file, @app.config[:frontmatter_delims], :json) end data_branch = @local_data path = data_path.to_s.split(File::SEPARATOR)[0..-2] path.each do |dir| data_branch[dir] ||= {} data_branch = data_branch[dir] end data_branch[basename] = data @local_data_enhanced = nil end |
#update_files(updated_files, removed_files) ⇒ Object
88 89 90 91 |
# File 'lib/middleman-core/core_extensions/data.rb', line 88 def update_files(updated_files, removed_files) updated_files.each(&method(:touch_file)) removed_files.each(&method(:remove_file)) end |