Class: Hike::Index

Inherits:
Object
  • Object
show all
Defined in:
lib/hike/index.rb

Overview

‘Index` 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 `Index` object.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root, paths, extensions, aliases) ⇒ Index

‘Index.new` is an internal method. Instead of constructing it directly, create a `Trail` and call `Trail#index`.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/hike/index.rb', line 20

def initialize(root, paths, extensions, aliases)
  @root = root

  # 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
  @aliases    = aliases.inject({}) { |h, (k, a)|
                  h[k] = a.dup.freeze; h
               }.freeze
  @pathnames  = paths.map { |path| Pathname.new(path) }

  @stats    = {}
  @entries  = {}
  @patterns = {}
end

Instance Attribute Details

#aliasesObject (readonly)

‘Index#aliases` is an immutable `Hash` mapping an extension to an `Array` of aliases.



16
17
18
# File 'lib/hike/index.rb', line 16

def aliases
  @aliases
end

#extensionsObject (readonly)

‘Index#extensions` is an immutable `Extensions` collection.



12
13
14
# File 'lib/hike/index.rb', line 12

def extensions
  @extensions
end

#pathsObject (readonly)

‘Index#paths` is an immutable `Paths` collection.



9
10
11
# File 'lib/hike/index.rb', line 9

def paths
  @paths
end

Instance Method Details

#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.



78
79
80
81
82
83
84
85
86
87
# File 'lib/hike/index.rb', line 78

def entries(path)
  @entries[path.to_s] ||= begin
    pathname = Pathname.new(path)
    if pathname.directory?
      pathname.entries.reject { |entry| entry.to_s =~ /^\.|~$|^\#.*\#$/ }.sort
    else
      []
    end
  end
end

#find(*logical_paths, &block) ⇒ Object

The real implementation of ‘find`. `Trail#find` generates a one time index and delegates here.

See ‘Trail#find` for usage.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/hike/index.rb', line 52

def find(*logical_paths, &block)
  if block_given?
    options = extract_options!(logical_paths)
    base_path = Pathname.new(options[:base_path] || @root)

    logical_paths.each do |logical_path|
      logical_path = Pathname.new(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
  else
    find(*logical_paths) do |path|
      return path
    end
  end
end

#indexObject

‘Index#index` returns `self` to be compatable with the `Trail` interface.



44
45
46
# File 'lib/hike/index.rb', line 44

def index
  self
end

#rootObject

‘Index#root` returns root path as a `String`. This attribute is immutable.



39
40
41
# File 'lib/hike/index.rb', line 39

def root
  @root.to_s
end

#stat(path) ⇒ Object

A cached version of ‘File.stat`. Returns nil if the file does not exist.



91
92
93
94
95
96
97
98
99
100
# File 'lib/hike/index.rb', line 91

def stat(path)
  key = path.to_s
  if @stats.key?(key)
    @stats[key]
  elsif File.exist?(path)
    @stats[key] = File.stat(path)
  else
    @stats[key] = nil
  end
end