Class: KType::LayeredFolders
- Inherits:
-
NamedFolders
- Object
- NamedFolders
- KType::LayeredFolders
- 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
-
#ordered_folders ⇒ Object
readonly
Returns the value of attribute ordered_folders.
-
#ordered_keys ⇒ Object
readonly
Returns the value of attribute ordered_keys.
Attributes inherited from NamedFolders
Instance Method Summary collapse
- #add(folder_key, *folder_parts) ⇒ Object
-
#find_file(file_parts) ⇒ Object
File name or array of sub-paths plus file.
-
#find_file_folder(file_parts) ⇒ Object
File name or array of sub-paths plus file.
-
#initialize ⇒ LayeredFolders
constructor
A new instance of LayeredFolders.
- #initialize_copy(orig) ⇒ Object
- #to_h ⇒ Object
Methods inherited from NamedFolders
Constructor Details
#initialize ⇒ LayeredFolders
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_folders ⇒ Object (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_keys ⇒ Object (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_h ⇒ Object
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 |