bootinq 1.8 → 2.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
- data/.yardopts +8 -0
- data/Gemfile +2 -0
- data/lib/bootinq/mixins.rb +102 -0
- data/lib/bootinq/railtie.rb +44 -0
- data/lib/bootinq/version.rb +1 -1
- data/lib/bootinq.rb +244 -151
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e1652380ae399a299061b4faa8b2372fec798e02ce9f1fc9b3ab3b1a035d779e
|
4
|
+
data.tar.gz: d2339a8385fad5b4aaca89a5c2992f0adf4c5205bb650a05eb2b92e52daa349f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a08526e07966f344034a18f42d032a996ab5fc97db980b3a356a3b0b4173b6e6d98ecc345a6ab80d77ec7f9e30aca2641e75b029553a3c3d45bfbceaf1ab5c8d
|
7
|
+
data.tar.gz: 850ee258bc77e6889b7a3ee5969f4befdf1ff217cb5eb1f5e70af1a3bce7b0c6c0191d2c0a87a7e5ce3d6d8f42611a3480f19bde7b7b002695133d39413eca60
|
data/.yardopts
ADDED
data/Gemfile
CHANGED
@@ -0,0 +1,102 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Bootinq
|
4
|
+
# When just required, hooks {Bootinq#enable_component} method to
|
5
|
+
# generate fast inline wrapping methods.
|
6
|
+
#
|
7
|
+
# @see Mixins#enable_component
|
8
|
+
#
|
9
|
+
# @example Usage
|
10
|
+
# require 'bootinq'
|
11
|
+
# require 'bootinq/mixins'
|
12
|
+
module Mixins
|
13
|
+
# @api private
|
14
|
+
module ComputeNameMethod
|
15
|
+
DASH = '_'
|
16
|
+
|
17
|
+
private_constant :DASH
|
18
|
+
|
19
|
+
def compute_name(component_name)
|
20
|
+
component_name.to_s.split(DASH).
|
21
|
+
each(&:capitalize!).
|
22
|
+
join << @name_suffix
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private_constant :ComputeNameMethod
|
27
|
+
|
28
|
+
# @api private
|
29
|
+
class Enabled < ::Module
|
30
|
+
@name_suffix = 'EnabledMixin'
|
31
|
+
extend ComputeNameMethod
|
32
|
+
|
33
|
+
def initialize(module_name, component_name)
|
34
|
+
module_eval <<~RUBY, __FILE__, __LINE__ + 1
|
35
|
+
# Yields the block due to component is enabled
|
36
|
+
# @yield [void]
|
37
|
+
def on_#{component_name}(*)
|
38
|
+
yield
|
39
|
+
end
|
40
|
+
|
41
|
+
# Does nothing due to component is enabled
|
42
|
+
# @return [void]
|
43
|
+
def not_#{component_name}(*)
|
44
|
+
end
|
45
|
+
RUBY
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private_constant :Enabled
|
50
|
+
|
51
|
+
# @api private
|
52
|
+
class Disabled < ::Module
|
53
|
+
@name_suffix = 'DisabledMixin'
|
54
|
+
extend ComputeNameMethod
|
55
|
+
|
56
|
+
def initialize(module_name, component_name)
|
57
|
+
define_method(:name, module_name.method(:itself))
|
58
|
+
|
59
|
+
module_eval <<~RUBY, __FILE__, __LINE__ + 1
|
60
|
+
# Does nothing due to component is disabled
|
61
|
+
# @return [void]
|
62
|
+
def on_#{component_name}(*)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Yields the block due to component is disabled
|
66
|
+
# @yield [void]
|
67
|
+
def not_#{component_name}(*)
|
68
|
+
yield
|
69
|
+
end
|
70
|
+
RUBY
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private_constant :Disabled
|
75
|
+
|
76
|
+
Builder = -> (component_name, enabled) do
|
77
|
+
klass = enabled ? Enabled : Disabled
|
78
|
+
module_name = klass.compute_name(component_name).freeze
|
79
|
+
|
80
|
+
if Bootinq.const_defined?(module_name)
|
81
|
+
Bootinq.const_get(module_name)
|
82
|
+
else
|
83
|
+
Bootinq.const_set(module_name, klass.new(module_name, component_name))
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
private_constant :Builder
|
88
|
+
|
89
|
+
# Generates {Enabled} or {Disabled} mixin and sets it to a constant once,
|
90
|
+
# bypassing if it has been already defined.
|
91
|
+
# @yield [component_name, enabled]
|
92
|
+
# @return [void]
|
93
|
+
def enable_component(name, **opts)
|
94
|
+
super(name, **opts) do |component_name, enabled|
|
95
|
+
Bootinq.extend Builder[component_name, enabled]
|
96
|
+
yield(component_name, enabled) if block_given?
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
prepend Mixins
|
102
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails'
|
4
|
+
|
5
|
+
class Bootinq
|
6
|
+
# Require `bootinq/railtie` in the `before_configuration` block of your
|
7
|
+
# application definition to allow load component-scoped config paths
|
8
|
+
# only when the named component is enabled:
|
9
|
+
#
|
10
|
+
# - `config/routes.rb` → `config/routes.component.rb`
|
11
|
+
# - `config/locales` → `config/locales.component`
|
12
|
+
# - `config/initializers` → `config/initializers.component`
|
13
|
+
#
|
14
|
+
# It doesn't affect on the default paths without suffix.
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
# # config/application.rb
|
18
|
+
# module Example
|
19
|
+
# class Application < Rails::Application
|
20
|
+
# config.before_configuration do
|
21
|
+
# require 'bootinq/railtie'
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
class Railtie < ::Rails::Railtie
|
26
|
+
initializer 'bootinq.add_locales', before: :add_locales do |app|
|
27
|
+
Bootinq.components.each do |component|
|
28
|
+
app.paths["config/locales"] << "config/locales.#{component.name}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
initializer 'bootinq.load_config_initializers', before: :load_config_initializers do |app|
|
33
|
+
Bootinq.components.each do |component|
|
34
|
+
app.paths["config/initializers"] << "config/initializers.#{component.name}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
initializer 'bootinq.add_routing_paths', before: :add_routing_paths do |app|
|
39
|
+
Bootinq.components.each do |component|
|
40
|
+
app.paths["config/routes.rb"] << "config/routes.#{component.name}.rb"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/bootinq/version.rb
CHANGED
data/lib/bootinq.rb
CHANGED
@@ -6,25 +6,21 @@ require "forwardable"
|
|
6
6
|
require "bootinq/component"
|
7
7
|
require "bootinq/switch"
|
8
8
|
|
9
|
-
#
|
9
|
+
# # Bootinq
|
10
10
|
#
|
11
|
-
#
|
11
|
+
# ## Installation
|
12
12
|
#
|
13
|
-
#
|
13
|
+
# ### Ruby on Rails
|
14
14
|
#
|
15
|
-
#
|
15
|
+
# 1. insert `require "bootinq"` on top of `config/application.rb`;
|
16
|
+
# 2. find and replace `Bundler.require(*Rails.groups)` with `Bootinq.require`
|
16
17
|
#
|
17
|
-
#
|
18
|
-
# with the <tt>Bootinq.require</tt>.
|
18
|
+
# ### Other frameworks
|
19
19
|
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
# 1. Locate <tt>Bundler.require(...)</tt> in your app and insert <tt>require "bootinq"</tt> above.
|
23
|
-
#
|
24
|
-
# 2. Replace located <tt>Bundler.require(...)</tt> line with the <tt>Bootinq.require(...)</tt>.
|
25
|
-
#
|
26
|
-
# For example, if you are using Grape:
|
20
|
+
# 1. locate `Bundler.require(…)` in your app and insert `require "bootinq"` above it;
|
21
|
+
# 2. replace previosly located `Bundler.require(…)` line with the `Bootinq.require(…)`.
|
27
22
|
#
|
23
|
+
# @example Grape
|
28
24
|
# # config/application.rb
|
29
25
|
#
|
30
26
|
# require 'boot'
|
@@ -32,10 +28,8 @@ require "bootinq/switch"
|
|
32
28
|
#
|
33
29
|
# # Bundler.require :default, ENV['RACK_ENV']
|
34
30
|
# Bootinq.require :default, ENV['RACK_ENV'], verbose: true
|
35
|
-
# ...
|
36
|
-
#
|
37
|
-
# == Example <tt>config/bootinq.yml</tt>:
|
38
31
|
#
|
32
|
+
# @example config/bootinq.yml
|
39
33
|
# env_key: BOOTINQ
|
40
34
|
# default: a
|
41
35
|
#
|
@@ -49,7 +43,6 @@ require "bootinq/switch"
|
|
49
43
|
# deps:
|
50
44
|
# shared:
|
51
45
|
# in: af
|
52
|
-
#
|
53
46
|
class Bootinq
|
54
47
|
include Singleton
|
55
48
|
|
@@ -75,47 +68,72 @@ class Bootinq
|
|
75
68
|
|
76
69
|
private_constant :FilterNegValue
|
77
70
|
|
78
|
-
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
|
84
|
-
|
71
|
+
# Invokes the {init} method with the given options and block,
|
72
|
+
# then calls {Bundler.require} with the enabled groups.
|
73
|
+
# @see init
|
74
|
+
# @see Bundler.require
|
75
|
+
# @param groups [Array<Symbol>]
|
76
|
+
# @param options [Hash]
|
77
|
+
# initialization options
|
78
|
+
# @option options [Boolean] verbose
|
79
|
+
# track inquired components
|
80
|
+
# @option options [Proc] on_ready
|
81
|
+
# optional ready callback proc
|
82
|
+
# @return [void]
|
83
|
+
def self.require(*groups, **options, &on_ready)
|
84
|
+
init(**options, &on_ready)
|
85
85
|
Bundler.require(*instance.groups(*groups))
|
86
86
|
end
|
87
87
|
|
88
|
-
#
|
89
|
-
#
|
90
|
-
#
|
91
|
-
#
|
92
|
-
#
|
93
|
-
|
94
|
-
|
88
|
+
# Invokes the {init} method with the given options and block,
|
89
|
+
# then calls {Bundler.require} with the enabled groups.
|
90
|
+
# @see init
|
91
|
+
# @see Bundler.setup
|
92
|
+
# @param groups [Array<Symbol>]
|
93
|
+
# @param options [Hash]
|
94
|
+
# initialization options
|
95
|
+
# @option options [Boolean] verbose
|
96
|
+
# track inquired components
|
97
|
+
# @option options [Proc] on_ready
|
98
|
+
# optional ready callback proc
|
99
|
+
# @yield [instance]
|
100
|
+
# @return [void]
|
101
|
+
def self.setup(*groups, **options, &on_ready) # :yields: Bootinq.instance
|
102
|
+
init(**options, &on_ready)
|
95
103
|
Bundler.setup(*instance.groups(*groups))
|
96
104
|
end
|
97
105
|
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
101
|
-
#
|
102
|
-
#
|
103
|
-
#
|
104
|
-
|
106
|
+
# Sets `BOOTINQ_PATH` enviroment variable if it is missing & initializes itself
|
107
|
+
# @overload init(verbose: false, on_ready:)
|
108
|
+
# @overload init(verbose: false, &on_ready)
|
109
|
+
# @param verbose [Boolean]
|
110
|
+
# track inquired components
|
111
|
+
# @param on_ready [Proc]
|
112
|
+
# optional ready callback proc
|
113
|
+
# @return [instance]
|
114
|
+
def self.init(verbose: false, on_ready: nil, &block)
|
105
115
|
ENV['BOOTINQ_PATH'] ||= File.expand_path('../bootinq.yml', caller_locations(2, 1)[0].path)
|
106
116
|
|
107
117
|
instance
|
108
|
-
|
118
|
+
on_ready = block.to_proc if on_ready.nil? && block_given?
|
119
|
+
instance.instance_variable_set(:@_on_ready, on_ready.to_proc) if on_ready
|
120
|
+
|
109
121
|
puts "Bootinq: loading components #{instance.components.join(', ')}" if verbose
|
122
|
+
|
110
123
|
instance.ready!
|
111
124
|
end
|
112
125
|
|
113
|
-
# Reads config
|
126
|
+
# Reads config
|
127
|
+
# @param path [String]
|
128
|
+
# path to yaml config (default: ENV['BOOTINQ_PATH'])
|
129
|
+
# @return [Hash]
|
130
|
+
# deserializes yaml config
|
114
131
|
def self.deserialized_config(path: nil)
|
115
132
|
bootinq_yaml = File.read(path || ENV.fetch('BOOTINQ_PATH'))
|
116
133
|
psych_safe_load(bootinq_yaml, [Symbol])
|
117
134
|
end
|
118
135
|
|
136
|
+
# @api private
|
119
137
|
if RUBY_VERSION >= '3.1.0'
|
120
138
|
def self.psych_safe_load(path, permitted_classes)
|
121
139
|
YAML.safe_load(path, permitted_classes: permitted_classes)
|
@@ -126,10 +144,20 @@ class Bootinq
|
|
126
144
|
end
|
127
145
|
end
|
128
146
|
|
147
|
+
private_class_method :psych_safe_load
|
148
|
+
|
149
|
+
# @!attribute flags [r]
|
150
|
+
# @return [Array<String>]
|
151
|
+
|
129
152
|
attr_reader :flags
|
153
|
+
|
154
|
+
# @!attribute components [r]
|
155
|
+
# @return [Array<String>]
|
156
|
+
|
130
157
|
attr_reader :components
|
131
158
|
|
132
|
-
|
159
|
+
# @return [self]
|
160
|
+
def initialize
|
133
161
|
config = self.class.deserialized_config
|
134
162
|
config.merge!(DEFAULT) { |_, l, r| l.nil? ? r : l }
|
135
163
|
|
@@ -145,172 +173,235 @@ class Bootinq
|
|
145
173
|
config['mount'].each { |flag, name| enable_component(name, flag: flag.to_s, as: Mountable) }
|
146
174
|
end
|
147
175
|
|
148
|
-
|
176
|
+
# @return [Boolean]
|
177
|
+
def ready?
|
149
178
|
!!@ready
|
150
179
|
end
|
151
180
|
|
152
|
-
#
|
153
|
-
#
|
154
|
-
#
|
155
|
-
# At the first call marks Bootinq as ready and returns the instance,
|
156
|
-
# otherwise returns nil.
|
181
|
+
# Once-only set {Bootinq} to ready state firing the `@_on_ready` callback.
|
182
|
+
# @return [self] on the first call
|
183
|
+
# @return [void] after
|
157
184
|
def ready!
|
158
185
|
return if ready?
|
159
186
|
@ready = true
|
160
187
|
if defined?(@_on_ready)
|
161
|
-
|
188
|
+
Bootinq.class_exec(&@_on_ready)
|
162
189
|
remove_instance_variable :@_on_ready
|
163
190
|
end
|
164
191
|
freeze
|
165
192
|
end
|
166
193
|
|
167
|
-
#
|
168
|
-
#
|
169
|
-
#
|
194
|
+
# Enables the given component if it is required by flag or
|
195
|
+
# when another enabled component depends it.
|
196
|
+
# @param name [String]
|
197
|
+
# of the component
|
198
|
+
# @param flag [String]
|
199
|
+
# the component's assigned char flag
|
200
|
+
# @param as [Class]
|
201
|
+
# the component's constructor class
|
202
|
+
# @yield [name, is_enabled]
|
203
|
+
# @return [void]
|
170
204
|
def enable_component(name, flag:, as: Component)
|
171
205
|
if is_dependency?(name) || @_value.include?(flag)
|
172
206
|
@flags << flag
|
173
207
|
@components << as.new(name)
|
208
|
+
yield(name, true) if block_given?
|
209
|
+
else
|
210
|
+
yield(name, false) if block_given?
|
174
211
|
end
|
212
|
+
|
213
|
+
nil
|
175
214
|
end
|
176
215
|
|
177
|
-
#
|
178
|
-
#
|
179
|
-
#
|
180
|
-
# Checks if a component with the given name (i.e. the same gem group)
|
181
|
-
# is enabled
|
216
|
+
# Checks if a component with the given name (i.e. the same gem group) is enabled
|
217
|
+
# @return [Boolean]
|
182
218
|
def enabled?(name)
|
183
|
-
ALL.include?(name) || components.include?(name)
|
219
|
+
ALL.include?(name) || @components.include?(name)
|
184
220
|
end
|
185
221
|
|
186
|
-
#
|
187
|
-
#
|
188
|
-
# Bootinq[name] -> Bootinq::Component
|
189
|
-
#
|
190
|
-
# Returns a <tt>Bootinq::Component</tt> object by its name
|
222
|
+
# @param name [String, Symbol]
|
223
|
+
# @return [Bootinq::Component]
|
191
224
|
def component(name)
|
192
|
-
components[components.index(name)]
|
225
|
+
@components[@components.index(name)]
|
193
226
|
end
|
194
227
|
|
195
|
-
|
228
|
+
alias_method :[], :component
|
196
229
|
|
197
|
-
#
|
198
|
-
#
|
199
|
-
|
200
|
-
|
201
|
-
# Calls the given block once for each enabled mountable component
|
202
|
-
# passing that part as a parameter. Returns the array of all mountable components.
|
203
|
-
#
|
204
|
-
# If no block is given, an Enumerator is returned.
|
205
|
-
def each_mountable(&block) # :yields: part
|
206
|
-
components.select(&:mountable?).each(&block)
|
230
|
+
# Checks if a component with the given name (i.e. the same gem group) is disabled
|
231
|
+
# @return [Boolean]
|
232
|
+
def disabled?(name)
|
233
|
+
!@components.include?(name)
|
207
234
|
end
|
208
235
|
|
209
|
-
#
|
210
|
-
#
|
211
|
-
#
|
212
|
-
#
|
213
|
-
#
|
214
|
-
|
236
|
+
# Enumerates enabled mountable components
|
237
|
+
# @overload each_mountable()
|
238
|
+
# @overload each_mountable(&block)
|
239
|
+
# @yield [component]
|
240
|
+
# @return [Enumerator]
|
241
|
+
def each_mountable
|
242
|
+
return enum_for(:each_mountable) unless block_given?
|
243
|
+
|
244
|
+
@components.each do |component|
|
245
|
+
yield(component) if component.mountable?
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
# Merges groups of enabled components with the given ones.
|
250
|
+
# When loaded with Rails, it passes them to {Rails.groups} method,
|
251
|
+
# otherwise just returns the merged list to use it with {Bundler.require}.
|
252
|
+
# @param groups [Array<String, Symbol>]
|
253
|
+
# @return [Array<String, Symbol>] merged groups
|
215
254
|
def groups(*groups)
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
else
|
220
|
-
groups
|
255
|
+
@components.each do |component|
|
256
|
+
next if groups.include?(component.group)
|
257
|
+
groups.unshift(component.group)
|
221
258
|
end
|
259
|
+
|
260
|
+
defined?(Rails) ? Rails.groups(*groups) : groups
|
222
261
|
end
|
223
262
|
|
224
|
-
#
|
225
|
-
#
|
226
|
-
#
|
227
|
-
# Bootinq.on(all: [names]) { block } -> true or false
|
263
|
+
# @overload on(name)
|
264
|
+
# @yield [void] (if component is enabled)
|
265
|
+
# @param name [Symbol] single component's name
|
228
266
|
#
|
229
|
-
#
|
230
|
-
#
|
267
|
+
# @overload on(any:)
|
268
|
+
# @see on_any
|
269
|
+
# @yield [void] (if _any_ matching component is enabled)
|
270
|
+
# @param any [Array<Symbol>] list of components' names
|
231
271
|
#
|
232
|
-
#
|
272
|
+
# @overload on(all:)
|
273
|
+
# @see on_all
|
274
|
+
# @yield [void] (if _all_ matching components are enabled)
|
275
|
+
# @param all [Array<Symbol>] list of components' names
|
233
276
|
#
|
234
|
-
#
|
277
|
+
# @return [Boolean] matching status
|
235
278
|
#
|
236
|
-
#
|
237
|
-
#
|
238
|
-
#
|
239
|
-
#
|
240
|
-
#
|
241
|
-
#
|
242
|
-
|
243
|
-
|
244
|
-
# Bootinq.on all: %i(frontend backend) do
|
245
|
-
# # do something when frontend and backend are enabled
|
246
|
-
# end
|
247
|
-
def on(name = nil, any: nil, all: nil) # :yields:
|
248
|
-
if ALL.include?(name)
|
279
|
+
# @example single
|
280
|
+
# Bootinq.on(:frontend) { puts 'frontend' }
|
281
|
+
# @example any
|
282
|
+
# Bootinq.on(any: %i[frontend backend]) { puts 'frontend or backend' }
|
283
|
+
# @example all
|
284
|
+
# Bootinq.on(all: %i[frontend backend]) { puts 'both' }
|
285
|
+
def on(name = nil, any: nil, all: nil)
|
286
|
+
if name && ALL.include?(name)
|
249
287
|
yield
|
250
288
|
return true
|
251
289
|
end
|
252
290
|
|
253
|
-
if name.nil? && any.nil? && all.nil?
|
254
|
-
raise ArgumentError, "wrong arguments (given 0, expected 1)"
|
255
|
-
elsif (any && all) || (name && (any || all))
|
256
|
-
raise ArgumentError, "expected single argument or one of keywords: `all' or `any'"
|
257
|
-
end
|
258
|
-
|
259
291
|
is_matched =
|
260
292
|
name ? enabled?(name) :
|
261
293
|
any ? on_any(*any) :
|
262
294
|
all ? on_all(*all) : false
|
295
|
+
|
263
296
|
yield if is_matched
|
297
|
+
|
264
298
|
is_matched
|
265
299
|
end
|
266
300
|
|
267
|
-
#
|
268
|
-
#
|
269
|
-
#
|
270
|
-
#
|
271
|
-
#
|
301
|
+
# @yield [void]
|
302
|
+
# if _all_ matching components are enabled
|
303
|
+
# @param parts [Array<String, Symbol>]
|
304
|
+
# list of components' names
|
305
|
+
# @return [Boolean]
|
306
|
+
# matching status
|
272
307
|
def on_all(*parts) # :yields:
|
273
|
-
is_matched = parts.
|
308
|
+
is_matched = parts.reduce(true) { |m, part| m && enabled?(part) }
|
274
309
|
yield if is_matched && block_given?
|
275
310
|
is_matched
|
276
311
|
end
|
277
312
|
|
278
|
-
#
|
279
|
-
#
|
280
|
-
#
|
281
|
-
#
|
282
|
-
#
|
313
|
+
# @yield [void]
|
314
|
+
# if _any_ matching component is enabled
|
315
|
+
# @param parts [Array<String, Symbol>]
|
316
|
+
# list of components' names
|
317
|
+
# @return [Boolean]
|
318
|
+
# matching status
|
283
319
|
def on_any(*parts) # :yields:
|
284
|
-
is_matched = parts.
|
320
|
+
is_matched = parts.reduce(false) { |m, part| m || enabled?(part) }
|
285
321
|
yield if is_matched && block_given?
|
286
322
|
is_matched
|
287
323
|
end
|
288
324
|
|
289
|
-
#
|
290
|
-
#
|
325
|
+
# @overload not(name)
|
326
|
+
# @yield [void] (if component is disabled)
|
327
|
+
# @param name [Symbol] single component's name
|
291
328
|
#
|
292
|
-
#
|
329
|
+
# @overload not(any:)
|
330
|
+
# @see not_any
|
331
|
+
# @yield [void] (if _any_ matching component is disabled)
|
332
|
+
# @param any [Array<Symbol>] list of components' names
|
293
333
|
#
|
294
|
-
#
|
334
|
+
# @overload not(all:)
|
335
|
+
# @see not_all
|
336
|
+
# @yield [void] (if _all_ matching components are disabled)
|
337
|
+
# @param all [Array<Symbol>] list of components' names
|
295
338
|
#
|
339
|
+
# @return [Boolean] matching status
|
340
|
+
#
|
341
|
+
# @example single
|
342
|
+
# Bootinq.not(:frontend) { puts 'not frontend' }
|
343
|
+
# @example any
|
344
|
+
# Bootinq.not(any: %i[frontend backend]) { puts 'neither frontend nor backend' }
|
345
|
+
# @example all
|
346
|
+
# Bootinq.on(all: %i[frontend backend]) { puts 'both disabled' }
|
347
|
+
def not(name = nil, any: nil, all: nil)
|
348
|
+
is_matched =
|
349
|
+
name ? disabled?(name) :
|
350
|
+
any ? not_any(*any) :
|
351
|
+
all ? not_all(*all) : false
|
352
|
+
|
353
|
+
yield if is_matched
|
354
|
+
|
355
|
+
is_matched
|
356
|
+
end
|
357
|
+
|
358
|
+
# @yield [void]
|
359
|
+
# if _all_ matching components are disabled
|
360
|
+
# @param parts [Array<String, Symbol>]
|
361
|
+
# list of components' names
|
362
|
+
# @return [Boolean]
|
363
|
+
# matching status
|
364
|
+
def not_all(*parts) # :yields:
|
365
|
+
is_matched = parts.reduce(true) { |m, part| m && disabled?(part) }
|
366
|
+
yield if is_matched && block_given?
|
367
|
+
is_matched
|
368
|
+
end
|
369
|
+
|
370
|
+
# @yield [void]
|
371
|
+
# if _any_ matching component is disabled
|
372
|
+
# @param parts [Array<String, Symbol>]
|
373
|
+
# list of components' names
|
374
|
+
# @return [Boolean]
|
375
|
+
# matching status
|
376
|
+
def not_any(*parts) # :yields:
|
377
|
+
is_matched = parts.reduce(false) { |m, part| m || disabled?(part) }
|
378
|
+
yield if is_matched && block_given?
|
379
|
+
is_matched
|
380
|
+
end
|
381
|
+
|
382
|
+
# Collector method.
|
383
|
+
# @example
|
296
384
|
# Bootinq.switch do |part|
|
297
385
|
# part.frontend { … }
|
298
386
|
# part.backend { … }
|
299
387
|
# end
|
300
|
-
|
388
|
+
# @yield [switch]
|
389
|
+
# @see Bootinq::Switch
|
390
|
+
# @return [void]
|
391
|
+
def switch
|
301
392
|
yield(Switch.new)
|
302
393
|
nil
|
303
394
|
end
|
304
395
|
|
305
|
-
#
|
306
|
-
#
|
307
|
-
#
|
308
|
-
# Checks if the named component is a dependency of the enabled one.
|
396
|
+
# Checks if the named component is dependent by another enabled one.
|
397
|
+
# @param name [String, Symbol]
|
398
|
+
# @return [Boolean]
|
309
399
|
def is_dependency?(name)
|
310
|
-
@_deps.key?(name
|
400
|
+
@_deps.key?(name.to_s) &&
|
401
|
+
@_value.count(@_deps.dig(name.to_s, 'in').to_s) > 0
|
311
402
|
end
|
312
403
|
|
313
|
-
#
|
404
|
+
# @api private
|
314
405
|
def freeze
|
315
406
|
@_value.freeze
|
316
407
|
@_neg
|
@@ -321,20 +412,22 @@ class Bootinq
|
|
321
412
|
|
322
413
|
extend SingleForwardable
|
323
414
|
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
415
|
+
def_delegator :instance, :component
|
416
|
+
def_delegator :instance, :components
|
417
|
+
def_delegator :instance, :each_mountable
|
418
|
+
def_delegator :instance, :enabled?
|
419
|
+
def_delegator :instance, :enable_component
|
420
|
+
def_delegator :instance, :disabled?
|
421
|
+
def_delegator :instance, :flags
|
422
|
+
def_delegator :instance, :groups
|
423
|
+
def_delegator :instance, :on
|
424
|
+
def_delegator :instance, :on_all
|
425
|
+
def_delegator :instance, :on_any
|
426
|
+
def_delegator :instance, :not
|
427
|
+
def_delegator :instance, :not_all
|
428
|
+
def_delegator :instance, :not_any
|
429
|
+
def_delegator :instance, :ready!
|
430
|
+
def_delegator :instance, :ready?
|
431
|
+
def_delegator :instance, :switch
|
432
|
+
def_delegator :instance, :[]
|
340
433
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bootinq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '
|
4
|
+
version: '2.0'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anton
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -48,6 +48,7 @@ files:
|
|
48
48
|
- ".gitignore"
|
49
49
|
- ".rspec"
|
50
50
|
- ".travis.yml"
|
51
|
+
- ".yardopts"
|
51
52
|
- Gemfile
|
52
53
|
- LICENSE.txt
|
53
54
|
- README.md
|
@@ -58,6 +59,8 @@ files:
|
|
58
59
|
- lib/bootinq.rb
|
59
60
|
- lib/bootinq.yml
|
60
61
|
- lib/bootinq/component.rb
|
62
|
+
- lib/bootinq/mixins.rb
|
63
|
+
- lib/bootinq/railtie.rb
|
61
64
|
- lib/bootinq/switch.rb
|
62
65
|
- lib/bootinq/version.rb
|
63
66
|
homepage: https://github.com/estum/bootinq
|
@@ -79,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
82
|
- !ruby/object:Gem::Version
|
80
83
|
version: '0'
|
81
84
|
requirements: []
|
82
|
-
rubygems_version: 3.3
|
85
|
+
rubygems_version: 3.0.3
|
83
86
|
signing_key:
|
84
87
|
specification_version: 4
|
85
88
|
summary: Rails Boot Inquirer
|