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 ingnored.
-
#rebuild_resource_list!(_name = nil) ⇒ 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.
73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/middleman-core/sitemap/store.rb', line 73 def initialize(app) @app = app @resources = [] @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.
65 66 67 |
# File 'lib/middleman-core/sitemap/store.rb', line 65 def app @app end |
#update_count ⇒ Object (readonly)
Returns the value of attribute update_count.
68 69 70 |
# File 'lib/middleman-core/sitemap/store.rb', line 68 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!
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 |
# File 'lib/middleman-core/sitemap/store.rb', line 195 def ensure_resource_list_updated! @lock.synchronize do return unless @needs_sitemap_rebuild @needs_sitemap_rebuild = false @app.logger.debug '== Rebuilding resource list' @resources = [] @resource_list_manipulators.each do |m| @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 @update_count += 1 end end |
#extensionless_path(file) ⇒ Object
187 188 189 190 |
# File 'lib/middleman-core/sitemap/store.rb', line 187 def extensionless_path(file) path = file.dup ::Middleman::Util.remove_templating_extensions(path) end |
#file_to_path(file) ⇒ Object
172 173 174 175 176 177 178 179 180 181 |
# File 'lib/middleman-core/sitemap/store.rb', line 172 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
139 140 141 142 143 144 145 |
# File 'lib/middleman-core/sitemap/store.rb', line 139 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
127 128 129 130 131 132 133 |
# File 'lib/middleman-core/sitemap/store.rb', line 127 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 ingnored. If your extension adds ways to ignore files, you should call this to make sure #resources works right.
164 165 166 |
# File 'lib/middleman-core/sitemap/store.rb', line 164 def invalidate_resources_not_ignored_cache! @resources_not_ignored = nil end |
#rebuild_resource_list!(_name = nil) ⇒ Object
117 118 119 120 121 |
# File 'lib/middleman-core/sitemap/store.rb', line 117 def rebuild_resource_list!(_name=nil) @lock.synchronize do @needs_sitemap_rebuild = true end end |
#register_resource_list_manipulator(name, manipulator, priority = 50, custom_name = nil) ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/middleman-core/sitemap/store.rb', line 96 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) end |
#resources(include_ignored = false) ⇒ Object
151 152 153 154 155 156 157 158 159 160 |
# File 'lib/middleman-core/sitemap/store.rb', line 151 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.
95 |
# File 'lib/middleman-core/sitemap/store.rb', line 95 Contract Symbol, RespondTo[:manipulate_resource_list], Maybe[Num], Maybe[Symbol] => Any |