Class: Hike::CachedTrail
- Inherits:
-
Object
- Object
- Hike::CachedTrail
- Includes:
- FileUtils
- Defined in:
- lib/hike/cached_trail.rb
Overview
CachedTrail is an internal cached variant of Trail. It assumes the
file system does not change between find calls. All stat and
entries calls are cached for the lifetime of the CachedTrail object.
Instance Attribute Summary collapse
-
#aliases ⇒ Object
readonly
CachedTrail#aliasesis an immutableHashmapping an extension to anArrayof aliases. -
#extensions ⇒ Object
readonly
CachedTrail#extensionsis an immutableExtensionscollection. -
#paths ⇒ Object
readonly
CachedTrail#pathsis an immutablePathscollection. -
#root ⇒ Object
readonly
CachedTrail#rootreturns root path as aString.
Instance Method Summary collapse
-
#cached ⇒ Object
(also: #index)
CachedTrail#cachedreturnsselfto be compatable with theTrailinterface. -
#entries(path) ⇒ Object
A cached version of
Dir.entriesthat filters out.files and~swap files. -
#find(*logical_paths) ⇒ Object
The real implementation of
find. -
#find_all(*logical_paths, &block) ⇒ Object
The real implementation of
find_all. -
#initialize(root, paths, extensions, aliases) ⇒ CachedTrail
constructor
CachedTrail.newis an internal method. -
#stat(path) ⇒ Object
A cached version of
File.stat.
Constructor Details
#initialize(root, paths, extensions, aliases) ⇒ CachedTrail
CachedTrail.new is an internal method. Instead of constructing it
directly, create a Trail and call Trail#CachedTrail.
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/hike/cached_trail.rb', line 20 def initialize(root, paths, extensions, aliases) @root = root.to_s # Freeze is used here so an error is throw if a mutator method # is called on the array. Mutating `@paths`, `@extensions`, or # `@aliases` would have unpredictable results. @paths = paths.dup.freeze @extensions = extensions.dup.freeze # Create a reverse mapping from extension to possible aliases. @aliases = aliases.dup.freeze @reverse_aliases = @aliases.inject({}) { |h, (k, a)| (h[a] ||= []) << k; h } @stats = Hash.new { |h, k| h[k] = FileUtils.stat(k) } @entries = Hash.new { |h, k| h[k] = FileUtils.entries(k) } @patterns = Hash.new { |h, k| h[k] = pattern_for(k) } end |
Instance Attribute Details
#aliases ⇒ Object (readonly)
CachedTrail#aliases is an immutable Hash mapping an extension to
an Array of aliases.
16 17 18 |
# File 'lib/hike/cached_trail.rb', line 16 def aliases @aliases end |
#extensions ⇒ Object (readonly)
CachedTrail#extensions is an immutable Extensions collection.
12 13 14 |
# File 'lib/hike/cached_trail.rb', line 12 def extensions @extensions end |
#paths ⇒ Object (readonly)
CachedTrail#paths is an immutable Paths collection.
9 10 11 |
# File 'lib/hike/cached_trail.rb', line 9 def paths @paths end |
#root ⇒ Object (readonly)
CachedTrail#root returns root path as a String. This attribute is immutable.
41 42 43 |
# File 'lib/hike/cached_trail.rb', line 41 def root @root end |
Instance Method Details
#cached ⇒ Object Also known as: index
CachedTrail#cached returns self to be compatable with the Trail interface.
44 45 46 |
# File 'lib/hike/cached_trail.rb', line 44 def cached self end |
#entries(path) ⇒ Object
A cached version of Dir.entries that filters out . files and
~ swap files. Returns an empty Array if the directory does
not exist.
85 86 87 |
# File 'lib/hike/cached_trail.rb', line 85 def entries(path) @entries[path] end |
#find(*logical_paths) ⇒ Object
The real implementation of find. Trail#find generates a one
time cache and delegates here.
See Trail#find for usage.
55 56 57 |
# File 'lib/hike/cached_trail.rb', line 55 def find(*logical_paths) find_all(*logical_paths).first end |
#find_all(*logical_paths, &block) ⇒ Object
The real implementation of find_all. Trail#find_all generates a one
time index and delegates here.
See Trail#find_all for usage.
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/hike/cached_trail.rb', line 63 def find_all(*logical_paths, &block) return to_enum(__method__, *logical_paths) unless block_given? = (logical_paths) base_path = ([:base_path] || root).to_s logical_paths.each do |logical_path| logical_path = logical_path.sub(/^\//, '') if relative?(logical_path) find_in_base_path(logical_path, base_path, &block) else find_in_paths(logical_path, &block) end end nil end |
#stat(path) ⇒ Object
A cached version of File.stat. Returns nil if the file does
not exist.
91 92 93 |
# File 'lib/hike/cached_trail.rb', line 91 def stat(path) @stats[path] end |