bake 0.20.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/bake/command/call.rb +1 -2
- data/lib/bake/command/list.rb +2 -12
- data/lib/bake/context.rb +30 -33
- data/lib/bake/registry/aggregate.rb +112 -0
- data/lib/bake/registry/bakefile_loader.rb +32 -0
- data/lib/bake/registry/directory_loader.rb +77 -0
- data/lib/bake/registry.rb +15 -0
- data/lib/bake/scope.rb +13 -4
- data/lib/bake/version.rb +1 -1
- data/lib/bake.rb +1 -2
- data.tar.gz.sig +0 -0
- metadata +7 -5
- metadata.gz.sig +0 -0
- data/lib/bake/loader.rb +0 -48
- data/lib/bake/loaders.rb +0 -110
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a486a2d684d8417098b550d477c23b52d9ee41e364bdb3eba4abe94a34b7e4bb
|
4
|
+
data.tar.gz: d6ed531b2cb2aa138d3eef54eaef5d082a6b119b5d320bb77cb72c2bc360b802
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77e365e561d39182941954d48fbafb0b85dafd7e7392b5edb5c254052483437729d1d4207355fae156daeac2c10e06c56c9da7dbad8d98eab7d0c32f4b9d5607
|
7
|
+
data.tar.gz: d8a8ffbafbc2797d96026921c77ae99e6b00a719cd66291d36067db1ec72d3c0c9031dc069c20b18ac50fa6841177a07b5303f4367c6aabb01f373babee71783
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/bake/command/call.rb
CHANGED
data/lib/bake/command/list.rb
CHANGED
@@ -80,21 +80,11 @@ module Bake
|
|
80
80
|
terminal = @parent.terminal
|
81
81
|
context = @parent.context
|
82
82
|
|
83
|
-
|
84
|
-
printed = print_scope(terminal, context.scope) do
|
85
|
-
terminal.print_line(:context, context)
|
86
|
-
end
|
87
|
-
|
88
|
-
if printed
|
89
|
-
terminal.print_line
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
context.loaders.each do |loader|
|
83
|
+
context.registry.each do |loader|
|
94
84
|
printed = false
|
95
85
|
|
96
86
|
loader.each do |path|
|
97
|
-
|
87
|
+
loader.scopes_for(path) do |scope|
|
98
88
|
print_scope(terminal, scope, printed: printed) do
|
99
89
|
terminal.print_line(:loader, loader)
|
100
90
|
printed = true
|
data/lib/bake/context.rb
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
# Copyright, 2020, by Olle Jonsson.
|
6
6
|
|
7
7
|
require_relative 'base'
|
8
|
+
require_relative 'registry'
|
8
9
|
|
9
10
|
module Bake
|
10
11
|
# The default file name for the top level bakefile.
|
@@ -45,57 +46,49 @@ module Bake
|
|
45
46
|
# @path [String] A file-system path.
|
46
47
|
def self.load(path = Dir.pwd)
|
47
48
|
if bakefile_path = self.bakefile_path(path)
|
48
|
-
scope = Scope.load(bakefile_path)
|
49
|
-
|
50
49
|
working_directory = File.dirname(bakefile_path)
|
51
|
-
loaders = Loaders.default(working_directory)
|
52
50
|
else
|
53
|
-
scope = nil
|
54
|
-
|
55
51
|
working_directory = path
|
56
|
-
loaders = Loaders.default(working_directory)
|
57
52
|
end
|
58
53
|
|
59
|
-
|
54
|
+
registry = Registry.default(working_directory, bakefile_path)
|
55
|
+
context = self.new(registry, working_directory)
|
56
|
+
|
57
|
+
context.bakefile
|
58
|
+
|
59
|
+
return context
|
60
60
|
end
|
61
61
|
|
62
|
-
# Initialize the context with the specified
|
63
|
-
# @parameter
|
64
|
-
def initialize(
|
65
|
-
@
|
66
|
-
|
67
|
-
@stack = []
|
62
|
+
# Initialize the context with the specified registry.
|
63
|
+
# @parameter registry [Registry]
|
64
|
+
def initialize(registry, root = nil)
|
65
|
+
@registry = registry
|
66
|
+
@root = root
|
68
67
|
|
69
68
|
@instances = Hash.new do |hash, key|
|
70
69
|
hash[key] = instance_for(key)
|
71
70
|
end
|
72
71
|
|
73
|
-
@scope = scope
|
74
|
-
@root = root
|
75
|
-
|
76
|
-
if @scope
|
77
|
-
base = Base.derive
|
78
|
-
base.prepend(@scope)
|
79
|
-
|
80
|
-
@instances[[]] = base.new(self)
|
81
|
-
end
|
82
|
-
|
83
72
|
@recipes = Hash.new do |hash, key|
|
84
73
|
hash[key] = recipe_for(key)
|
85
74
|
end
|
86
75
|
end
|
87
76
|
|
88
|
-
|
89
|
-
|
77
|
+
def bakefile
|
78
|
+
@instances[[]]
|
79
|
+
end
|
90
80
|
|
91
|
-
# The
|
92
|
-
attr :
|
81
|
+
# The registry which will be used to resolve recipes in this context.
|
82
|
+
attr :registry
|
93
83
|
|
94
84
|
# The root path of this context.
|
95
85
|
# @returns [String | Nil]
|
96
86
|
attr :root
|
97
87
|
|
98
88
|
# Invoke recipes on the context using command line arguments.
|
89
|
+
#
|
90
|
+
# e.g. `context.call("gem:release:version:increment", "0,0,1")`
|
91
|
+
#
|
99
92
|
# @parameter commands [Array(String)]
|
100
93
|
def call(*commands)
|
101
94
|
last_result = nil
|
@@ -118,6 +111,8 @@ module Bake
|
|
118
111
|
@recipes[command]
|
119
112
|
end
|
120
113
|
|
114
|
+
alias [] lookup
|
115
|
+
|
121
116
|
def to_s
|
122
117
|
if @root
|
123
118
|
"#{self.class} #{File.basename(@root)}"
|
@@ -135,9 +130,13 @@ module Bake
|
|
135
130
|
def recipe_for(command)
|
136
131
|
path = command.split(":")
|
137
132
|
|
133
|
+
# If the command is in the form `foo:bar`, we check two cases:
|
134
|
+
#
|
135
|
+
# (1) We check for an instance at path `foo:bar` and if it responds to `bar`.
|
138
136
|
if instance = @instances[path] and instance.respond_to?(path.last)
|
139
137
|
return instance.recipe_for(path.last)
|
140
138
|
else
|
139
|
+
# (2) We check for an instance at path `foo` and if it responds to `bar`.
|
141
140
|
*path, name = *path
|
142
141
|
|
143
142
|
if instance = @instances[path] and instance.respond_to?(name)
|
@@ -158,12 +157,10 @@ module Bake
|
|
158
157
|
def base_for(path)
|
159
158
|
base = nil
|
160
159
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
base.prepend(scope)
|
166
|
-
end
|
160
|
+
# For each loader, we check if it has a scope for the given path. If it does, we prepend it to the base:
|
161
|
+
@registry.scopes_for(path) do |scope|
|
162
|
+
base ||= Base.derive(path)
|
163
|
+
base.prepend(scope)
|
167
164
|
end
|
168
165
|
|
169
166
|
return base
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2020-2024, by Samuel Williams.
|
5
|
+
|
6
|
+
require 'console'
|
7
|
+
|
8
|
+
require_relative 'directory_loader'
|
9
|
+
require_relative 'bakefile_loader'
|
10
|
+
|
11
|
+
module Bake
|
12
|
+
# Structured access to the working directory and loaded gems for loading bakefiles.
|
13
|
+
module Registry
|
14
|
+
class Aggregate
|
15
|
+
include Enumerable
|
16
|
+
|
17
|
+
# Create a loader using the specified working directory.
|
18
|
+
# @parameter working_directory [String]
|
19
|
+
def self.default(working_directory, bakefile_path = nil)
|
20
|
+
registry = self.new
|
21
|
+
|
22
|
+
if bakefile_path
|
23
|
+
registry.append_bakefile(bakefile_path)
|
24
|
+
end
|
25
|
+
|
26
|
+
registry.append_defaults(working_directory)
|
27
|
+
|
28
|
+
return registry
|
29
|
+
end
|
30
|
+
|
31
|
+
# Initialize an empty array of registry.
|
32
|
+
def initialize
|
33
|
+
# Used to de-duplicated directories:
|
34
|
+
@roots = {}
|
35
|
+
|
36
|
+
# The ordered list of loaders:
|
37
|
+
@ordered = Array.new
|
38
|
+
end
|
39
|
+
|
40
|
+
# Whether any registry are defined.
|
41
|
+
# @returns [Boolean]
|
42
|
+
def empty?
|
43
|
+
@ordered.empty?
|
44
|
+
end
|
45
|
+
|
46
|
+
# Enumerate the registry in order.
|
47
|
+
def each(&block)
|
48
|
+
@ordered.each(&block)
|
49
|
+
end
|
50
|
+
|
51
|
+
def scopes_for(path, &block)
|
52
|
+
@ordered.each do |registry|
|
53
|
+
registry.scopes_for(path, &block)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def append_bakefile(path)
|
58
|
+
@ordered << BakefileLoader.new(path)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Append a specific project path to the search path for recipes.
|
62
|
+
# The computed path will have `bake` appended to it.
|
63
|
+
# @parameter current [String] The path to add.
|
64
|
+
def append_path(current = Dir.pwd, **options)
|
65
|
+
bake_path = File.join(current, "bake")
|
66
|
+
|
67
|
+
if File.directory?(bake_path)
|
68
|
+
return insert(bake_path, **options)
|
69
|
+
end
|
70
|
+
|
71
|
+
return false
|
72
|
+
end
|
73
|
+
|
74
|
+
# Add registry according to the current working directory and loaded gems.
|
75
|
+
# @parameter working_directory [String]
|
76
|
+
def append_defaults(working_directory)
|
77
|
+
# Load recipes from working directory:
|
78
|
+
self.append_path(working_directory)
|
79
|
+
|
80
|
+
# Load recipes from loaded gems:
|
81
|
+
self.append_from_gems
|
82
|
+
end
|
83
|
+
|
84
|
+
# Enumerate all loaded gems and add them.
|
85
|
+
def append_from_gems
|
86
|
+
::Gem.loaded_specs.each do |name, spec|
|
87
|
+
Console.debug(self) {"Checking gem #{name}: #{spec.full_gem_path}..."}
|
88
|
+
|
89
|
+
if path = spec.full_gem_path and File.directory?(path)
|
90
|
+
append_path(path, name: spec.full_name)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
protected
|
96
|
+
|
97
|
+
def insert(directory, **options)
|
98
|
+
unless @roots.key?(directory)
|
99
|
+
Console.debug(self) {"Adding #{directory.inspect}"}
|
100
|
+
|
101
|
+
loader = DirectoryLoader.new(directory, **options)
|
102
|
+
@roots[directory] = loader
|
103
|
+
@ordered << loader
|
104
|
+
|
105
|
+
return true
|
106
|
+
end
|
107
|
+
|
108
|
+
return false
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2020-2024, by Samuel Williams.
|
5
|
+
|
6
|
+
require_relative '../scope'
|
7
|
+
|
8
|
+
module Bake
|
9
|
+
module Registry
|
10
|
+
class BakefileLoader
|
11
|
+
def initialize(path)
|
12
|
+
@path = path
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
"#{self.class} #{@path}"
|
17
|
+
end
|
18
|
+
|
19
|
+
attr :path
|
20
|
+
|
21
|
+
def each(&block)
|
22
|
+
yield []
|
23
|
+
end
|
24
|
+
|
25
|
+
def scopes_for(path)
|
26
|
+
if path == []
|
27
|
+
yield Scope.load(@path, [])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2020-2024, by Samuel Williams.
|
5
|
+
|
6
|
+
require_relative '../scope'
|
7
|
+
|
8
|
+
module Bake
|
9
|
+
module Registry
|
10
|
+
# Represents a directory which contains bakefiles.
|
11
|
+
class DirectoryLoader
|
12
|
+
# Initialize the loader with the specified root path.
|
13
|
+
# @parameter root [String] A file-system path.
|
14
|
+
def initialize(root, name: nil)
|
15
|
+
@root = root
|
16
|
+
@name = name
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
"#{self.class} #{@name || @root}"
|
21
|
+
end
|
22
|
+
|
23
|
+
# The root path for this loader.
|
24
|
+
attr :root
|
25
|
+
|
26
|
+
# Enumerate all bakefiles within the loaders root directory.
|
27
|
+
#
|
28
|
+
# You can pass the yielded path to {scope_for} to load the corresponding {Scope}.
|
29
|
+
#
|
30
|
+
# @yields {|path| ...}
|
31
|
+
# @parameter path [String] The (relative) scope path.
|
32
|
+
def each
|
33
|
+
return to_enum unless block_given?
|
34
|
+
|
35
|
+
Dir.glob("**/*.rb", base: @root) do |file_path|
|
36
|
+
yield file_path.sub(/\.rb$/, '').split(File::SEPARATOR)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Load the {Scope} for the specified relative path within this loader, if it exists.
|
41
|
+
# @parameter path [Array(String)] A relative path.
|
42
|
+
def scopes_for(path)
|
43
|
+
*directory, file = *path
|
44
|
+
|
45
|
+
file_path = File.join(@root, directory, "#{file}.rb")
|
46
|
+
|
47
|
+
if File.exist?(file_path)
|
48
|
+
yield Scope.load(file_path, path)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class FileLoader
|
54
|
+
def initialize(paths)
|
55
|
+
@paths = paths
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_s
|
59
|
+
"#{self.class} #{@paths}"
|
60
|
+
end
|
61
|
+
|
62
|
+
attr :paths
|
63
|
+
|
64
|
+
def each(&block)
|
65
|
+
@paths.each_key(&block)
|
66
|
+
end
|
67
|
+
|
68
|
+
def scope_for(path)
|
69
|
+
if file_path = @paths[path]
|
70
|
+
if File.exist?(file_path)
|
71
|
+
return Scope.load(file_path, path)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2020-2024, by Samuel Williams.
|
5
|
+
|
6
|
+
require_relative 'registry/aggregate'
|
7
|
+
|
8
|
+
module Bake
|
9
|
+
# Structured access to the working directory and loaded gems for loading bakefiles.
|
10
|
+
module Registry
|
11
|
+
def self.default(...)
|
12
|
+
Aggregate.default(...)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/bake/scope.rb
CHANGED
@@ -11,20 +11,23 @@ module Bake
|
|
11
11
|
# Load the specified file into a unique scope module, which can then be included into a {Base} instance.
|
12
12
|
def self.load(file_path, path = [])
|
13
13
|
scope = Module.new
|
14
|
+
|
15
|
+
if scope.respond_to?(:set_temporary_name)
|
16
|
+
scope.set_temporary_name("#{self.name}[#{file_path}]")
|
17
|
+
end
|
18
|
+
|
14
19
|
scope.extend(self)
|
15
20
|
|
16
21
|
scope.const_set(:FILE_PATH, file_path)
|
17
22
|
scope.const_set(:PATH, path)
|
18
23
|
|
24
|
+
# yield scope if block_given?
|
25
|
+
|
19
26
|
scope.module_eval(File.read(file_path), file_path)
|
20
27
|
|
21
28
|
return scope
|
22
29
|
end
|
23
30
|
|
24
|
-
def self.inspect
|
25
|
-
"Bake::Scope<#{self.const_get(:FILE_PATH)}>"
|
26
|
-
end
|
27
|
-
|
28
31
|
# Recipes defined in this scope.
|
29
32
|
#
|
30
33
|
# @yields {|recipe| ...}
|
@@ -41,6 +44,12 @@ module Bake
|
|
41
44
|
end
|
42
45
|
|
43
46
|
# The path of the file that was used to {load} this scope.
|
47
|
+
def file_path
|
48
|
+
pp file_path_self: self
|
49
|
+
self.const_get(:FILE_PATH)
|
50
|
+
end
|
51
|
+
|
52
|
+
# The path of the scope, relative to the root of the context.
|
44
53
|
def path
|
45
54
|
self.const_get(:PATH)
|
46
55
|
end
|
data/lib/bake/version.rb
CHANGED
data/lib/bake.rb
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bake
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.21.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
@@ -38,7 +38,7 @@ cert_chain:
|
|
38
38
|
Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
|
39
39
|
voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
|
40
40
|
-----END CERTIFICATE-----
|
41
|
-
date: 2024-
|
41
|
+
date: 2024-08-21 00:00:00.000000000 Z
|
42
42
|
dependencies:
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: bigdecimal
|
@@ -87,9 +87,11 @@ files:
|
|
87
87
|
- lib/bake/command/top.rb
|
88
88
|
- lib/bake/context.rb
|
89
89
|
- lib/bake/documentation.rb
|
90
|
-
- lib/bake/loader.rb
|
91
|
-
- lib/bake/loaders.rb
|
92
90
|
- lib/bake/recipe.rb
|
91
|
+
- lib/bake/registry.rb
|
92
|
+
- lib/bake/registry/aggregate.rb
|
93
|
+
- lib/bake/registry/bakefile_loader.rb
|
94
|
+
- lib/bake/registry/directory_loader.rb
|
93
95
|
- lib/bake/scope.rb
|
94
96
|
- lib/bake/types.rb
|
95
97
|
- lib/bake/types/any.rb
|
@@ -130,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
132
|
- !ruby/object:Gem::Version
|
131
133
|
version: '0'
|
132
134
|
requirements: []
|
133
|
-
rubygems_version: 3.5.
|
135
|
+
rubygems_version: 3.5.11
|
134
136
|
signing_key:
|
135
137
|
specification_version: 4
|
136
138
|
summary: A replacement for rake with a simpler syntax.
|
metadata.gz.sig
CHANGED
Binary file
|
data/lib/bake/loader.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Released under the MIT License.
|
4
|
-
# Copyright, 2020-2024, by Samuel Williams.
|
5
|
-
|
6
|
-
require_relative 'scope'
|
7
|
-
|
8
|
-
module Bake
|
9
|
-
# Represents a directory which contains bakefiles.
|
10
|
-
class Loader
|
11
|
-
# Initialize the loader with the specified root path.
|
12
|
-
# @parameter root [String] A file-system path.
|
13
|
-
def initialize(root, name: nil)
|
14
|
-
@root = root
|
15
|
-
@name = name
|
16
|
-
end
|
17
|
-
|
18
|
-
def to_s
|
19
|
-
"#{self.class} #{@name || @root}"
|
20
|
-
end
|
21
|
-
|
22
|
-
# The root path for this loader.
|
23
|
-
attr :root
|
24
|
-
|
25
|
-
# Enumerate all bakefiles within the loaders root directory.
|
26
|
-
# @yields {|path| ...}
|
27
|
-
# @parameter path [String] The Ruby source file path.
|
28
|
-
def each
|
29
|
-
return to_enum unless block_given?
|
30
|
-
|
31
|
-
Dir.glob("**/*.rb", base: @root) do |file_path|
|
32
|
-
yield file_path.sub(/\.rb$/, '').split(File::SEPARATOR)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
# Load the {Scope} for the specified relative path within this loader, if it exists.
|
37
|
-
# @parameter path [Array(String)] A relative path.
|
38
|
-
def scope_for(path)
|
39
|
-
*directory, file = *path
|
40
|
-
|
41
|
-
file_path = File.join(@root, directory, "#{file}.rb")
|
42
|
-
|
43
|
-
if File.exist?(file_path)
|
44
|
-
return Scope.load(file_path, path)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
data/lib/bake/loaders.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Released under the MIT License.
|
4
|
-
# Copyright, 2020-2024, by Samuel Williams.
|
5
|
-
|
6
|
-
require 'console'
|
7
|
-
|
8
|
-
require_relative 'loader'
|
9
|
-
|
10
|
-
module Bake
|
11
|
-
# Structured access to the working directory and loaded gems for loading bakefiles.
|
12
|
-
class Loaders
|
13
|
-
include Enumerable
|
14
|
-
|
15
|
-
# Create a loader using the specified working directory.
|
16
|
-
# @parameter working_directory [String]
|
17
|
-
def self.default(working_directory)
|
18
|
-
loaders = self.new
|
19
|
-
|
20
|
-
loaders.append_defaults(working_directory)
|
21
|
-
|
22
|
-
return loaders
|
23
|
-
end
|
24
|
-
|
25
|
-
# Initialize an empty array of loaders.
|
26
|
-
def initialize
|
27
|
-
@roots = {}
|
28
|
-
@ordered = Array.new
|
29
|
-
end
|
30
|
-
|
31
|
-
# Whether any loaders are defined.
|
32
|
-
# @returns [Boolean]
|
33
|
-
def empty?
|
34
|
-
@ordered.empty?
|
35
|
-
end
|
36
|
-
|
37
|
-
# Add loaders according to the current working directory and loaded gems.
|
38
|
-
# @parameter working_directory [String]
|
39
|
-
def append_defaults(working_directory)
|
40
|
-
# Load recipes from working directory:
|
41
|
-
self.append_path(working_directory)
|
42
|
-
|
43
|
-
# Load recipes from loaded gems:
|
44
|
-
self.append_from_gems
|
45
|
-
end
|
46
|
-
|
47
|
-
# Enumerate the loaders in order.
|
48
|
-
def each(&block)
|
49
|
-
@ordered.each(&block)
|
50
|
-
end
|
51
|
-
|
52
|
-
# Append a specific project path to the search path for recipes.
|
53
|
-
# The computed path will have `bake` appended to it.
|
54
|
-
# @parameter current [String] The path to add.
|
55
|
-
def append_path(current = Dir.pwd, **options)
|
56
|
-
bake_path = File.join(current, "bake")
|
57
|
-
|
58
|
-
if File.directory?(bake_path)
|
59
|
-
return insert(bake_path, **options)
|
60
|
-
end
|
61
|
-
|
62
|
-
return false
|
63
|
-
end
|
64
|
-
|
65
|
-
# Search from the current working directory until a suitable bakefile is found and add it.
|
66
|
-
# @parameter current [String] The path to start searching from.
|
67
|
-
def append_from_root(current = Dir.pwd, **options)
|
68
|
-
while current
|
69
|
-
Console.logger.debug(self) {"Checking current #{current}..."}
|
70
|
-
|
71
|
-
append_path(current, **options)
|
72
|
-
|
73
|
-
parent = File.dirname(current)
|
74
|
-
|
75
|
-
if current == parent
|
76
|
-
break
|
77
|
-
else
|
78
|
-
current = parent
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
# Enumerate all loaded gems and add them.
|
84
|
-
def append_from_gems
|
85
|
-
::Gem.loaded_specs.each do |name, spec|
|
86
|
-
Console.logger.debug(self) {"Checking gem #{name}: #{spec.full_gem_path}..."}
|
87
|
-
|
88
|
-
if path = spec.full_gem_path and File.directory?(path)
|
89
|
-
append_path(path, name: spec.full_name)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
protected
|
95
|
-
|
96
|
-
def insert(directory, **options)
|
97
|
-
unless @roots.key?(directory)
|
98
|
-
Console.logger.debug(self) {"Adding #{directory.inspect}"}
|
99
|
-
|
100
|
-
loader = Loader.new(directory, **options)
|
101
|
-
@roots[directory] = loader
|
102
|
-
@ordered << loader
|
103
|
-
|
104
|
-
return true
|
105
|
-
end
|
106
|
-
|
107
|
-
return false
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|