Class: Middleman::Sitemap::Store
- Inherits:
-
Object
- Object
- Middleman::Sitemap::Store
- Includes:
- Contracts
- Defined in:
- lib/middleman-core/sitemap/store.rb
Overview
The Store class
The Store manages a collection of Resource objects, which represent individual items in the sitemap. Resources are indexed by "source path", which is the path relative to the source directory, minus any template extensions. All "path" parameters used in this class are source paths.
Constant Summary
Constants included from Contracts
Instance Attribute Summary collapse
-
#app ⇒ Object
readonly
Returns the value of attribute app.
-
#update_count ⇒ Object
readonly
Returns the value of attribute update_count.
Instance Method Summary collapse
-
#ensure_resource_list_updated! ⇒ Object
Actually update the resource list, assuming anything has called rebuild_resource_list! since the last time it was run.
- #extensionless_path(file) ⇒ Object
- #file_to_path(file) ⇒ Object
- #find_resource_by_destination_path(request_path) ⇒ Object
- #find_resource_by_path(request_path) ⇒ Object
-
#initialize(app) ⇒ Store
constructor
A new instance of Store.
-
#invalidate_resources_not_ignored_cache! ⇒ Object
Invalidate our cached view of resource that are not ignored.
- #rebuild_resource_list!(name) ⇒ Object
- #register_resource_list_manipulator(name, manipulator, priority = 50, custom_name = nil) ⇒ Object
- #resources(include_ignored = false) ⇒ Object
-
#Symbol
Register an object which can transform the sitemap resource list.
Methods included from Contracts
Constructor Details
#initialize(app) ⇒ Store
Returns a new instance of Store.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/middleman-core/sitemap/store.rb', line 75 def initialize(app) @app = app @resources = [] @rebuild_reasons = [:first_run] @update_count = 0 @resource_list_manipulators = ::Hamster::Vector.empty @needs_sitemap_rebuild = true @lock = Monitor.new reset_lookup_cache! @app.config_context.class.send :def_delegator, :app, :sitemap end |
Instance Attribute Details
#app ⇒ Object (readonly)
Returns the value of attribute app.
67 68 69 |
# File 'lib/middleman-core/sitemap/store.rb', line 67 def app @app end |
#update_count ⇒ Object (readonly)
Returns the value of attribute update_count.
70 71 72 |
# File 'lib/middleman-core/sitemap/store.rb', line 70 def update_count @update_count end |
Instance Method Details
#ensure_resource_list_updated! ⇒ Object
Actually update the resource list, assuming anything has called rebuild_resource_list! since the last time it was run. This is very expensive!
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
# File 'lib/middleman-core/sitemap/store.rb', line 200 def ensure_resource_list_updated! @lock.synchronize do return unless @needs_sitemap_rebuild ::Middleman::Util.instrument 'sitemap.update', reasons: @rebuild_reasons.uniq do @needs_sitemap_rebuild = false @app.logger.debug '== Rebuilding resource list' @resources = [] @resource_list_manipulators.each do |m| ::Middleman::Util.instrument 'sitemap.manipulator', name: m[:name] do @app.logger.debug "== Running manipulator: #{m[:name]}" @resources = m[:manipulator].send(m[:custom_name] || :manipulate_resource_list, @resources) # Reset lookup cache reset_lookup_cache! # Rebuild cache @resources.each do |resource| @_lookup_by_path[resource.path] = resource @_lookup_by_destination_path[resource.destination_path] = resource end invalidate_resources_not_ignored_cache! end end @update_count += 1 @rebuild_reasons = [] end end end |
#extensionless_path(file) ⇒ Object
192 193 194 195 |
# File 'lib/middleman-core/sitemap/store.rb', line 192 def extensionless_path(file) path = file.dup ::Middleman::Util.remove_templating_extensions(path) end |
#file_to_path(file) ⇒ Object
177 178 179 180 181 182 183 184 185 186 |
# File 'lib/middleman-core/sitemap/store.rb', line 177 def file_to_path(file) relative_path = file.is_a?(Pathname) ? file.to_s : file[:relative_path].to_s # Replace a file name containing automatic_directory_matcher with a folder unless @app.config[:automatic_directory_matcher].nil? relative_path = relative_path.gsub(@app.config[:automatic_directory_matcher], '/') end extensionless_path(relative_path) end |
#find_resource_by_destination_path(request_path) ⇒ Object
144 145 146 147 148 149 150 |
# File 'lib/middleman-core/sitemap/store.rb', line 144 def find_resource_by_destination_path(request_path) @lock.synchronize do request_path = ::Middleman::Util.normalize_path(request_path) ensure_resource_list_updated! @_lookup_by_destination_path[request_path] end end |
#find_resource_by_path(request_path) ⇒ Object
132 133 134 135 136 137 138 |
# File 'lib/middleman-core/sitemap/store.rb', line 132 def find_resource_by_path(request_path) @lock.synchronize do request_path = ::Middleman::Util.normalize_path(request_path) ensure_resource_list_updated! @_lookup_by_path[request_path] end end |
#invalidate_resources_not_ignored_cache! ⇒ Object
Invalidate our cached view of resource that are not ignored. If your extension adds ways to ignore files, you should call this to make sure #resources works right.
169 170 171 |
# File 'lib/middleman-core/sitemap/store.rb', line 169 def invalidate_resources_not_ignored_cache! @resources_not_ignored = nil end |
#rebuild_resource_list!(name) ⇒ Object
120 121 122 123 124 125 126 |
# File 'lib/middleman-core/sitemap/store.rb', line 120 def rebuild_resource_list!(name) @lock.synchronize do @rebuild_reasons << name @app.logger.debug "== Requesting resource list rebuilding: #{name}" @needs_sitemap_rebuild = true end end |
#register_resource_list_manipulator(name, manipulator, priority = 50, custom_name = nil) ⇒ Object
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/middleman-core/sitemap/store.rb', line 99 def register_resource_list_manipulator(name, manipulator, priority=50, custom_name=nil) # The third argument used to be a boolean - handle those who still pass one priority = 50 unless priority.is_a? Numeric @resource_list_manipulators = @resource_list_manipulators.push( ManipulatorDescriptor.new(name, manipulator, priority, custom_name) ) # The index trick is used so that the sort is stable - manipulators with the same priority # will always be ordered in the same order as they were registered. n = 0 @resource_list_manipulators = @resource_list_manipulators.sort_by do |m| n += 1 [m[:priority], n] end rebuild_resource_list!(:"registered_new_manipulator_#{name}") end |
#resources(include_ignored = false) ⇒ Object
156 157 158 159 160 161 162 163 164 165 |
# File 'lib/middleman-core/sitemap/store.rb', line 156 def resources(include_ignored=false) @lock.synchronize do ensure_resource_list_updated! if include_ignored @resources else @resources_not_ignored ||= @resources.reject(&:ignored?) end end end |
#Symbol
This method returns an undefined value.
Register an object which can transform the sitemap resource list. Best to register
these in a before_configuration
or after_configuration
hook.
98 |
# File 'lib/middleman-core/sitemap/store.rb', line 98 Contract Symbol, RespondTo[:manipulate_resource_list], Maybe[Num], Maybe[Symbol] => Any |