Class: KType::LayeredFolders

Inherits:
NamedFolders show all
Defined in:
lib/k_type/layered_folders.rb

Overview

Layered folders allow files to be found in any of the searchable folders

They derive from and thus work just like named folders in that they allow folders to be stored with easy to remember names/alias’s.

Where they differ is that they are retrieved in preferential search order that is by default (First In, Last Out) priority aka a Stack (Last In, First Out) or optionally over ridden via the search_order method

Layered folders makes sense for use with template files and source data/model where you can have specific usage files available and if they are not found then you can use fall-back files in other folders.

example:

folders = LayeredFolders.new
folders.add(:global       , '~/global_templates')
folders.add(:domain       , '/my-project/domain_templates')
folders.add(:app          , '/my-project/my-app/.templates')

# Find a file and folder will in folders in this order
# app_templates, then domain_templates and then finally global templates
# ['/my-project/my-app/.templates', '/my-project/domain_templates', '~/global_templates']
#
# Find a file called template1.txt and return its fully-qualified path
folders.find_file('template1.txt')

# As above, but returns the folder only, file name and sub-paths are ignored
folders.find_file_folder('template1.txt')
folders.find_file_folder('abc/xyz/deep-template.txt')

# If an additional folder is added, say in child configuration that is designed
# to override some of the global templates, then you can run a search_order
# method to re-order the templates

folders.add(:global_shim  , '~/global_templates_shim')
folders.search_order(:app, :domain, :global_shim, :global)

class Builder < KType::BaseBuilder

Instance Attribute Summary collapse

Attributes inherited from NamedFolders

#current, #folders

Instance Method Summary collapse

Methods inherited from NamedFolders

#folder_keys, #get, #join

Constructor Details

#initializeLayeredFolders

Returns a new instance of LayeredFolders.



57
58
59
60
61
62
# File 'lib/k_type/layered_folders.rb', line 57

def initialize
  super()

  @ordered_keys = []
  @ordered_folders = []
end

Instance Attribute Details

#ordered_foldersObject (readonly)

Returns the value of attribute ordered_folders.



55
56
57
# File 'lib/k_type/layered_folders.rb', line 55

def ordered_folders
  @ordered_folders
end

#ordered_keysObject (readonly)

Returns the value of attribute ordered_keys.



54
55
56
# File 'lib/k_type/layered_folders.rb', line 54

def ordered_keys
  @ordered_keys
end

Instance Method Details

#add(folder_key, *folder_parts) ⇒ Object



71
72
73
74
75
76
77
78
# File 'lib/k_type/layered_folders.rb', line 71

def add(folder_key, *folder_parts)
  folder = super(folder_key, *folder_parts)

  ordered_keys.prepend(folder_key)
  ordered_folders.prepend(folder)

  folder
end

#find_file(file_parts) ⇒ Object

File name or array of sub-paths plus file

Return the folder that a file is found in



83
84
85
86
# File 'lib/k_type/layered_folders.rb', line 83

def find_file(file_parts)
  folder = find_file_folder(file_parts)
  folder.nil? ? nil : File.join(folder, file_parts)
end

#find_file_folder(file_parts) ⇒ Object

File name or array of sub-paths plus file

Return the folder that a file is found in



91
92
93
# File 'lib/k_type/layered_folders.rb', line 91

def find_file_folder(file_parts)
  ordered_folders.find { |folder| File.exist?(File.join(folder, file_parts)) }
end

#initialize_copy(orig) ⇒ Object



64
65
66
67
68
69
# File 'lib/k_type/layered_folders.rb', line 64

def initialize_copy(orig)
  super(orig)

  @ordered_keys = orig.ordered_keys.clone
  @ordered_folders = orig.ordered_folders.clone
end

#to_hObject



95
96
97
98
99
100
101
102
# File 'lib/k_type/layered_folders.rb', line 95

def to_h
  {
    ordered: {
      keys: ordered_keys,
      folders: ordered_folders
    }
  }.merge(@folders)
end