Class: Webgen::Source::Stacked

Inherits:
Object
  • Object
show all
Defined in:
lib/webgen/source/stacked.rb

Overview

This source class is used to stack several sources together.

It serves two purposes:

  • First, it can be used to access more than one source. This is useful when your website consists of more than one source directory and you want to use all of them.

  • Second, sources can be mounted on specific directories. For example, a folder with images that you don’t want to copy to the website source directory can be mounted under /images sothat they are available nonetheless.

Also be aware that when a path is returned by a source that has already be returned by a prior source, it is discarded and not used.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(map = {}) ⇒ Stacked

Create a new stack. The optional map parameter can be used to provide initial mappings of mount points to source objects (see #add for details).



25
26
27
28
# File 'lib/webgen/source/stacked.rb', line 25

def initialize(map = {})
  @stack = []
  add(map)
end

Instance Attribute Details

#stackObject (readonly)

Return the stack of Webgen::Source objects.



21
22
23
# File 'lib/webgen/source/stacked.rb', line 21

def stack
  @stack
end

Instance Method Details

#add(maps) ⇒ Object

Add all mappings found in maps to the stack. The parameter maps should be an array of two-element arrays which contain an absolute directoriy (ie. starting with a slash) and a source object.



33
34
35
36
37
38
# File 'lib/webgen/source/stacked.rb', line 33

def add(maps)
  maps.each do |mp, source|
    raise "Invalid mount point specified: #{mp}" unless mp =~ /^\//
    @stack << [mp, source]
  end
end

#pathsObject

Return all paths returned by the sources in the stack. Since the stack is ordered, paths returned by later source objects are not used if a prior source object has returned the same path.



43
44
45
46
47
48
49
50
51
# File 'lib/webgen/source/stacked.rb', line 43

def paths
  @paths = Set.new
  @stack.each do |mp, source|
    source.paths.each do |path|
      @paths.add?(path.mount_at(mp))
    end
  end
  @paths
end