Class: Middleman::CoreExtensions::Data::DataStore
- Inherits:
-
Object
- Object
- Middleman::CoreExtensions::Data::DataStore
- Defined in:
- lib/middleman-core/core_extensions/data.rb
Overview
The core logic behind the data extension.
Class Method Summary collapse
-
.matcher ⇒ Regexp
The regex which tells Middleman which files are for data.
Instance Method Summary collapse
-
#[](key) ⇒ Hash?
Make DataStore act like a hash.
-
#callbacks(name = nil, proc = nil) ⇒ Hash
Store callback-based data.
-
#data_for_path(path) ⇒ Hash?
Get a hash from either internal static data or a callback.
-
#initialize(app) ⇒ 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)
Remove a given file from the internal cache.
-
#respond_to?(method, include_private = false) ⇒ Boolean
Needed so that method_missing makes sense.
-
#store(name = nil, content = nil) ⇒ Hash
Store static data hash.
-
#to_h ⇒ Hash
Convert all the data into a static hash.
-
#touch_file(file)
Update the internal cache for a given file path.
Constructor Details
#initialize(app) ⇒ DataStore
Setup data store
79 80 81 82 |
# File 'lib/middleman-core/core_extensions/data.rb', line 79 def initialize(app) @app = app @local_data = {} 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
155 156 157 158 159 160 161 162 163 164 |
# File 'lib/middleman-core/core_extensions/data.rb', line 155 def method_missing(path) if @local_data.key?(path.to_s) return @local_data[path.to_s] else result = data_for_path(path) return ::Middleman::Util.recursively_enhance(result) if result end super end |
Class Method Details
.matcher ⇒ Regexp
The regex which tells Middleman which files are for data
49 50 51 |
# File 'lib/middleman-core/core_extensions/data.rb', line 49 def matcher %r{[\w-]+\.(yml|yaml|json)$} end |
Instance Method Details
#[](key) ⇒ Hash?
Make DataStore act like a hash. Return requested data, or nil if data does not exist
176 177 178 |
# File 'lib/middleman-core/core_extensions/data.rb', line 176 def [](key) __send__(key) if key?(key) end |
#callbacks(name = nil, proc = nil) ⇒ Hash
Store callback-based data
70 71 72 73 74 |
# File 'lib/middleman-core/core_extensions/data.rb', line 70 def callbacks(name=nil, proc=nil) @_callback_sources ||= {} @_callback_sources[name.to_s] = proc unless name.nil? || proc.nil? @_callback_sources end |
#data_for_path(path) ⇒ Hash?
Get a hash from either internal static data or a callback
139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/middleman-core/core_extensions/data.rb', line 139 def data_for_path(path) response = nil if store.key?(path.to_s) response = store[path.to_s] elsif callbacks.key?(path.to_s) response = callbacks[path.to_s].call end response end |
#key?(key) ⇒ Boolean Also known as: has_key?
180 181 182 |
# File 'lib/middleman-core/core_extensions/data.rb', line 180 def key?(key) @local_data.key?(key.to_s) || data_for_path(key) end |
#remove_file(file)
This method returns an undefined value.
Remove a given file from the internal cache
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/middleman-core/core_extensions/data.rb', line 117 def remove_file(file) root = Pathname(@app.root) full_path = root + file extension = File.extname(file) basename = File.basename(file, extension) 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.key?(basename) end |
#respond_to?(method, include_private = false) ⇒ Boolean
Needed so that method_missing makes sense
167 168 169 |
# File 'lib/middleman-core/core_extensions/data.rb', line 167 def respond_to?(method, include_private=false) super || key?(method) end |
#store(name = nil, content = nil) ⇒ Hash
Store static data hash
59 60 61 62 63 |
# File 'lib/middleman-core/core_extensions/data.rb', line 59 def store(name=nil, content=nil) @_local_sources ||= {} @_local_sources[name.to_s] = content unless name.nil? || content.nil? @_local_sources end |
#to_h ⇒ Hash
Convert all the data into a static hash
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/middleman-core/core_extensions/data.rb', line 189 def to_h data = {} store.each do |k, _| data[k] = data_for_path(k) end callbacks.each do |k, _| data[k] = data_for_path(k) end (@local_data || {}).each do |k, v| data[k] = v end data end |
#touch_file(file)
This method returns an undefined value.
Update the internal cache for a given file path
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/middleman-core/core_extensions/data.rb', line 88 def touch_file(file) root = Pathname(@app.root) full_path = root + file extension = File.extname(file) basename = File.basename(file, extension) data_path = full_path.relative_path_from(root + @app.config[:data_dir]) begin data = FileLoader.new.load(full_path) rescue FileLoader::NoFileLoaderFoundError return end 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 |