-
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
135 additions
and
118 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
# frozen_string_literal: true | ||
|
||
# Released under the MIT License. | ||
# Copyright, 2020-2024, by Samuel Williams. | ||
|
||
require 'console' | ||
|
||
require_relative 'directory_loader' | ||
require_relative 'file_loader' | ||
require_relative 'inline_loader' | ||
|
||
module Bake | ||
# Structured access to the working directory and loaded gems for loading bakefiles. | ||
module Registry | ||
class Aggregate | ||
include Enumerable | ||
|
||
# Create a loader using the specified working directory. | ||
# @parameter working_directory [String] | ||
def self.default(working_directory, bakefile_path = nil) | ||
registry = self.new | ||
|
||
if bakefile_path | ||
registry.append_bakefile(bakefile_path) | ||
end | ||
|
||
registry.append_defaults(working_directory) | ||
|
||
return registry | ||
end | ||
|
||
# Initialize an empty array of registry. | ||
def initialize | ||
# Used to de-duplicated directories: | ||
@roots = {} | ||
|
||
# The ordered list of loaders: | ||
@ordered = Array.new | ||
|
||
@wrappers = InlineLoader.new | ||
end | ||
|
||
def wrap(...) | ||
@wrappers.wrap(...) | ||
end | ||
|
||
# Whether any registry are defined. | ||
# @returns [Boolean] | ||
def empty? | ||
@ordered.empty? | ||
end | ||
|
||
# Enumerate the registry in order. | ||
def each(&block) | ||
@ordered.each(&block) | ||
yield @wrappers | ||
end | ||
|
||
def scopes_for(path) | ||
@ordered.each do |loader| | ||
if scope = loader.scope_for(path) | ||
yield scope | ||
end | ||
end | ||
|
||
@wrappers.scopes_for(path) do |scope| | ||
yield scope | ||
end | ||
end | ||
|
||
def append_bakefile(path) | ||
@ordered << FileLoader.new({ | ||
[] => path | ||
}) | ||
end | ||
|
||
# Append a specific project path to the search path for recipes. | ||
# The computed path will have `bake` appended to it. | ||
# @parameter current [String] The path to add. | ||
def append_path(current = Dir.pwd, **options) | ||
bake_path = File.join(current, "bake") | ||
|
||
if File.directory?(bake_path) | ||
return insert(bake_path, **options) | ||
end | ||
|
||
return false | ||
end | ||
|
||
# Add registry according to the current working directory and loaded gems. | ||
# @parameter working_directory [String] | ||
def append_defaults(working_directory) | ||
# Load recipes from working directory: | ||
self.append_path(working_directory) | ||
|
||
# Load recipes from loaded gems: | ||
self.append_from_gems | ||
end | ||
|
||
# Enumerate all loaded gems and add them. | ||
def append_from_gems | ||
::Gem.loaded_specs.each do |name, spec| | ||
Console.debug(self) {"Checking gem #{name}: #{spec.full_gem_path}..."} | ||
|
||
if path = spec.full_gem_path and File.directory?(path) | ||
append_path(path, name: spec.full_name) | ||
end | ||
end | ||
end | ||
|
||
protected | ||
|
||
def insert(directory, **options) | ||
unless @roots.key?(directory) | ||
Console.debug(self) {"Adding #{directory.inspect}"} | ||
|
||
loader = DirectoryLoader.new(directory, **options) | ||
@roots[directory] = loader | ||
@ordered << loader | ||
|
||
return true | ||
end | ||
|
||
return false | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
lib/bake/loader/inline_loader.rb → lib/bake/registry/inline_loader.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
module Bake | ||
module Loader | ||
module Registry | ||
class InlineLoader | ||
def initialize | ||
@wrappers = Hash.new do |hash, key| | ||
|