bootinq 1.3.0 → 1.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 02d532d3f79f581c02a9cf22de365c865a5fc455460ff5559d9f32893fc72daa
4
- data.tar.gz: 274bbc9139607038551bd75d73104301a6d14a561dfe8a736d33c50fc91f473b
3
+ metadata.gz: f1e1d6c92b8790ff798d3ac3af73aa4d1ba51d65e5d30a710e71b109dff4a1d2
4
+ data.tar.gz: ff41e0be38f693a836592446d3a8600613497595228075a325bfa3cd06a36585
5
5
  SHA512:
6
- metadata.gz: 424dd6941e25ad8b8b5a5497bf5ff5853bf66255774677e2831ca4972756b87956eb93ed55d3fcb87285ad2fc51c24279073c579fcea93a2ce36fa3689105d3d
7
- data.tar.gz: 8b807c29dffd4a66ee89ce6b3790560fe0cf3aa69ee1ef1544ed87a5e32f3204077b981df613d05c22530952506a35fa275b86669965610760c025c13484785d
6
+ metadata.gz: f6d003846a5991fef4e37aaf9ab72c03878eaaecb98b0b347b8ac537f4d583a880b578bda284ec1d1539396b3a822a0d72511cf349d54cb6638892052768a563
7
+ data.tar.gz: 28a35e3389f226c94126dc11adcecbdde73cb6b8b9b02876ffb987cddaec8f0d32274e3831d61ba163c64bde0eebe00c505bb0b24c7aa3032e445e840fb350dd
data/Gemfile CHANGED
@@ -32,6 +32,14 @@ group :shared_boot do
32
32
  gem 'shared', path: 'spec/dummy/engines/shared'
33
33
  end
34
34
 
35
+ group :api_part_boot do
36
+ gem 'api_part', path: 'spec/dummy/engines/api_part'
37
+ end
38
+
35
39
  group :api_boot do
36
40
  gem 'api', path: 'spec/dummy/engines/api'
41
+ end
42
+
43
+ group :api2_boot do
44
+ gem 'api2', path: 'spec/dummy/engines/api2'
37
45
  end
@@ -37,7 +37,7 @@ require "bootinq/switch"
37
37
  # == Example <tt>config/bootinq.yml</tt>:
38
38
  #
39
39
  # env_key: BOOTINQ
40
- # default: "-f"
40
+ # default: a
41
41
  #
42
42
  # parts:
43
43
  # s: :shared
@@ -45,6 +45,11 @@ require "bootinq/switch"
45
45
  # mount:
46
46
  # a: :api
47
47
  # f: :engine
48
+ #
49
+ # deps:
50
+ # shared:
51
+ # in: af
52
+ #
48
53
  class Bootinq
49
54
  include Singleton
50
55
 
@@ -52,9 +57,22 @@ class Bootinq
52
57
  "env_key" => 'BOOTINQ',
53
58
  "default" => '',
54
59
  "parts" => {},
55
- "mount" => {}
60
+ "mount" => {},
61
+ "deps" => {}
56
62
  }.freeze
57
63
 
64
+ FilterNegValue = -> (value, config) do
65
+ if value.start_with?(?-, ?^)
66
+ value = value.tr('\\-', '\\^')
67
+ flags = (config['parts'].keys + config['mount'].keys).join
68
+ [true, flags.delete(flags.delete(value))]
69
+ else
70
+ [false, value.dup]
71
+ end
72
+ end
73
+
74
+ private_constant :FilterNegValue
75
+
58
76
  class << self
59
77
  protected def delegated(sym) # :no-doc:
60
78
  location = caller_locations(1, 1).first
@@ -67,28 +85,36 @@ class Bootinq
67
85
  # :call-seq:
68
86
  # Bootinq.require(*groups, verbose: false, &block)
69
87
  #
70
- # The helper method to bootstrap the Bootinq.
71
- # Sets the BOOTINQ_PATH enviroment variable if it is missing,
72
- # invokes the <tt>Bootinq.setup</tt> method with the given verbose key argument & block,
73
- # and, finally, gets Bundler to require the given groups.
88
+ # Invokes the <tt>Bootinq.init</tt> method with the given verbose key argument & block,
89
+ # and, finally, makes Bundler to require the given groups.
74
90
  def self.require(*groups, verbose: false, &block) # :yields: Bootinq.instance
75
- ENV['BOOTINQ_PATH'] ||= File.expand_path('../bootinq.yml', caller_locations(1..1)[0].path)
76
-
77
- setup(verbose: verbose, &block)
78
-
91
+ init(verbose: verbose, &block)
79
92
  Bundler.require(*instance.groups(*groups))
80
93
  end
81
94
 
82
95
  # :call-seq:
83
- # Bootinq.setup(verbose: false, &block) -> true or false
96
+ # Bootinq.setup(*groups, verbose: false, &block)
97
+ #
98
+ # Invokes the <tt>Bootinq.init</tt> method with the given verbose key argument & block,
99
+ # and, finally, makes Bundler to setup the given groups.
100
+ def self.setup(*groups, verbose: false, &block) # :yields: Bootinq.instance
101
+ init(verbose: verbose, &block)
102
+ Bundler.setup(*instance.groups(*groups))
103
+ end
104
+
105
+ # :call-seq:
106
+ # Bootinq.init(verbose: false, &block) -> true or false
84
107
  #
85
- # Initializes itself. To track inquired components use <tt>verbose: true</tt> key argument.
108
+ # Initializes itself. Sets the BOOTINQ_PATH enviroment variable if it is missing.
109
+ # To track inquired components use <tt>verbose: true</tt> key argument.
86
110
  # Optionally yields block within the own instance's binding.
87
- def self.setup(verbose: false, &block) # :yields: Bootinq.instance
111
+ def self.init(verbose: false, &block) # :yields: Bootinq.instance
112
+ ENV['BOOTINQ_PATH'] ||= File.expand_path('../bootinq.yml', caller_locations(2, 1)[0].path)
113
+
88
114
  instance
115
+ instance.instance_variable_set(:@_on_ready, block.to_proc) if block_given?
89
116
  puts "Bootinq: loading components #{instance.components.join(', ')}" if verbose
90
- instance.instance_exec(&block) if block_given?
91
- instance
117
+ instance.ready!
92
118
  end
93
119
 
94
120
  attr_reader :flags
@@ -102,21 +128,42 @@ class Bootinq
102
128
  config = YAML.safe_load(File.read(config_path), [Symbol])
103
129
  config.merge!(DEFAULT) { |_, l, r| l.nil? ? r : l }
104
130
 
105
- @_value = ENV.fetch(config['env_key']) { config['default'] }
106
- @_neg = @_value.start_with?(?-, ?^)
131
+ @_orig_value = ENV.fetch(config['env_key']) { config['default'] }
132
+ @_neg, @_value = FilterNegValue[@_orig_value, config]
133
+
134
+ @_deps = config['deps']
135
+
107
136
  @flags = []
108
137
  @components = []
109
- @switch = Switch.new(*@components)
110
138
 
111
- config['parts'].each { |flag, name| enable_component(name, flag: flag) }
112
- config['mount'].each { |flag, name| enable_component(name, flag: flag, as: Mountable) }
139
+ config['parts'].each { |flag, name| enable_component(name, flag: flag.to_s) }
140
+ config['mount'].each { |flag, name| enable_component(name, flag: flag.to_s, as: Mountable) }
141
+ end
142
+
143
+ delegated def ready? # :no-doc:
144
+ !!@ready
145
+ end
146
+
147
+ # :call-seq:
148
+ # Bootinq.ready! -> nil or self
149
+ #
150
+ # At the first call marks Bootinq as ready and returns the instance,
151
+ # otherwise returns nil.
152
+ delegated def ready!
153
+ return if ready?
154
+ @ready = true
155
+ if defined?(@_on_ready)
156
+ instance_exec(&@_on_ready)
157
+ remove_instance_variable :@_on_ready
158
+ end
159
+ freeze
113
160
  end
114
161
 
115
162
  # :call-seq:
116
163
  # Bootinq.enable_component(name, flag: [, as: Component])
117
164
  #
118
165
  delegated def enable_component(name, flag:, as: Component)
119
- if @_neg ^ @_value.include?(flag)
166
+ if is_dependency?(name) || @_value.include?(flag)
120
167
  @flags << flag
121
168
  @components << as.new(name)
122
169
  end
@@ -231,7 +278,7 @@ class Bootinq
231
278
  end
232
279
 
233
280
  # :call-seq:
234
- # Bottinq.switch(*parts) { block } -> nil
281
+ # Bootinq.switch(*parts) { block } -> nil
235
282
  #
236
283
  # Collector method.
237
284
  #
@@ -242,22 +289,24 @@ class Bootinq
242
289
  # part.backend { … }
243
290
  # end
244
291
  delegated def switch # :yields: Bootinq::Switch.new
245
- yield(@switch)
292
+ yield(Switch.new)
246
293
  nil
247
294
  end
248
295
 
296
+ # :call-seq:
297
+ # is_dependency?(part_name) -> true or false
298
+ #
299
+ # Checks if the named component is a dependency of the enabled one.
300
+ def is_dependency?(name)
301
+ @_deps.key?(name) && @_value.count(@_deps[name]['in'].to_s) > 0
302
+ end
303
+
249
304
  # Freezes every instance variables and the instance itself.
250
305
  def freeze
251
306
  @_value.freeze
252
- @_neg.freeze
307
+ @_neg
253
308
  @flags.freeze
254
309
  @components.freeze
255
310
  super
256
311
  end
257
-
258
- def self.new
259
- super.freeze
260
- end
261
-
262
- private_class_method :new
263
312
  end
@@ -5,32 +5,16 @@ class Bootinq
5
5
  undef_method :==
6
6
  undef_method :equal?
7
7
 
8
- module YieldMixin
9
- def yield_block
10
- yield
11
- end
12
- end
13
-
14
- private_constant :YieldMixin
15
-
16
- def self.new(*names)
17
- switch = super()
18
- mixin = ::Module.new
19
- mixin.include(YieldMixin)
20
- names.each { |name| mixin.alias_method name, :yield_block }
21
- mixin.send(:private, :yield_block)
22
- mixin.send(:extend_object, switch)
23
- switch
24
- ensure
25
- mixin = nil
26
- end
27
-
28
8
  def raise(*args) # :no-doc:
29
9
  ::Object.send(:raise, *args)
30
10
  end
31
11
 
32
- def method_missing(*)
33
- nil
12
+ def method_missing(name, *)
13
+ if ::Bootinq.enabled?(name)
14
+ yield()
15
+ else
16
+ nil
17
+ end
34
18
  end
35
19
  end
36
20
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Bootinq
4
- VERSION = "1.3.0"
4
+ VERSION = "1.5"
5
5
  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: 1.3.0
4
+ version: '1.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-27 00:00:00.000000000 Z
11
+ date: 2020-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler