bootinq 1.1.0 → 1.4.1
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/README.md +24 -5
- data/lib/bootinq.rb +113 -29
- data/lib/bootinq/component.rb +41 -12
- data/lib/bootinq/switch.rb +20 -0
- data/lib/bootinq/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 24d33e5b4116c1406447099627f69b28099408be01a35b8addb8870c70b1d526
|
|
4
|
+
data.tar.gz: ab43719f9bb45caadff14a577a23449157e1fa24e35301301a59d903947bb199
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1a145181cdbd31411d4b6208cf84a418adb74ea1594d9d76fe10aab41af3e1e52a3bd97be211ef4e946d2f5285a6462ed3fd058d5d139cd8f95216fd3644c052
|
|
7
|
+
data.tar.gz: 8ec205d218a4a262b8c45070b3e0141d0e5b13c97b2749a79f48def1a4836625b0615c672e9de992d1c8cba16965e5b90490672bb396ffbfc99bc65e85d2f97e
|
data/README.md
CHANGED
|
@@ -15,9 +15,9 @@ And then execute:
|
|
|
15
15
|
$ bundle
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
##
|
|
18
|
+
## Get started
|
|
19
19
|
|
|
20
|
-
There are few steps to setup partial gem booting in
|
|
20
|
+
There are few steps to setup partial gem booting using Bootinq in any ruby application:
|
|
21
21
|
|
|
22
22
|
### 1. Declare loadable parts
|
|
23
23
|
|
|
@@ -60,7 +60,9 @@ group :console_boot do
|
|
|
60
60
|
end
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
## Ruby on Rails
|
|
64
|
+
|
|
65
|
+
### 3. Swap Bundle.require to Bootinq.require
|
|
64
66
|
|
|
65
67
|
Insert `require "bootinq"` to the top of `config/application.rb` file and replace `Bundler.require(*Rails.groups)` with the `Bootinq.require`:
|
|
66
68
|
|
|
@@ -74,11 +76,10 @@ require 'rails/all'
|
|
|
74
76
|
require 'bootinq'
|
|
75
77
|
|
|
76
78
|
# With no additional gem groups:
|
|
77
|
-
Bootinq.require
|
|
79
|
+
Bootinq.require(verbose: true)
|
|
78
80
|
# otherwise, set them like in <tt>Bundle.require(*Rails.groups(*groups))</tt>:
|
|
79
81
|
# Bootinq.require(:assets => %w(development test))
|
|
80
82
|
|
|
81
|
-
puts "* Bootinq: loading components #{Bootinq.components * ', '}"
|
|
82
83
|
```
|
|
83
84
|
|
|
84
85
|
#### Separate load rails components with Bootinq
|
|
@@ -131,6 +132,24 @@ api: env BOOTINQ=a MAX_THREADS=128 bundle exec puma -w 4
|
|
|
131
132
|
admin: env BOOTINQ=z bundle exec puma
|
|
132
133
|
```
|
|
133
134
|
|
|
135
|
+
## Usage with other frameworks
|
|
136
|
+
|
|
137
|
+
3. Locate `Bundler.require(...)` in your app and insert `require "bootinq"` above it.
|
|
138
|
+
|
|
139
|
+
4. Replace located `Bundler.require(...)` line with the `Bootinq.require(...)`.
|
|
140
|
+
|
|
141
|
+
For example, if you are using Grape:
|
|
142
|
+
|
|
143
|
+
```ruby
|
|
144
|
+
# config/application.rb
|
|
145
|
+
|
|
146
|
+
require 'boot'
|
|
147
|
+
require 'bootinq'
|
|
148
|
+
|
|
149
|
+
# Bundler.require :default, ENV['RACK_ENV']
|
|
150
|
+
Bootinq.require :default, ENV['RACK_ENV'], verbose: true
|
|
151
|
+
|
|
152
|
+
|
|
134
153
|
## Development
|
|
135
154
|
|
|
136
155
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/bootinq.rb
CHANGED
|
@@ -4,16 +4,36 @@ require "yaml"
|
|
|
4
4
|
require "singleton"
|
|
5
5
|
require "forwardable"
|
|
6
6
|
require "bootinq/component"
|
|
7
|
+
require "bootinq/switch"
|
|
7
8
|
|
|
8
9
|
# = Bootinq
|
|
9
10
|
#
|
|
10
11
|
# == Installation
|
|
11
12
|
#
|
|
13
|
+
# === Ruby on Rails
|
|
14
|
+
#
|
|
12
15
|
# 1. Insert <tt>require "bootinq"</tt> in the top of <tt>config/application.rb</tt>
|
|
13
16
|
#
|
|
14
17
|
# 2. Find <tt>Bundler.require(*Rails.groups)</tt> line below and replace it
|
|
15
18
|
# with the <tt>Bootinq.require</tt>.
|
|
16
19
|
#
|
|
20
|
+
# === Other
|
|
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:
|
|
27
|
+
#
|
|
28
|
+
# # config/application.rb
|
|
29
|
+
#
|
|
30
|
+
# require 'boot'
|
|
31
|
+
# require 'bootinq'
|
|
32
|
+
#
|
|
33
|
+
# # Bundler.require :default, ENV['RACK_ENV']
|
|
34
|
+
# Bootinq.require :default, ENV['RACK_ENV'], verbose: true
|
|
35
|
+
# ...
|
|
36
|
+
#
|
|
17
37
|
# == Example <tt>config/bootinq.yml</tt>:
|
|
18
38
|
#
|
|
19
39
|
# env_key: BOOTINQ
|
|
@@ -26,7 +46,6 @@ require "bootinq/component"
|
|
|
26
46
|
# a: :api
|
|
27
47
|
# f: :engine
|
|
28
48
|
class Bootinq
|
|
29
|
-
extend SingleForwardable
|
|
30
49
|
include Singleton
|
|
31
50
|
|
|
32
51
|
DEFAULT = {
|
|
@@ -36,30 +55,55 @@ class Bootinq
|
|
|
36
55
|
"mount" => {}
|
|
37
56
|
}.freeze
|
|
38
57
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
58
|
+
class << self
|
|
59
|
+
protected def delegated(sym) # :no-doc:
|
|
60
|
+
location = caller_locations(1, 1).first
|
|
61
|
+
file, line = location.path, location.lineno
|
|
62
|
+
definiton = %(def self.#{sym}(*args, &block); instance.#{sym}(*args, &block); end)
|
|
63
|
+
class_eval definiton, file, line
|
|
64
|
+
end
|
|
65
|
+
end
|
|
46
66
|
|
|
67
|
+
# :call-seq:
|
|
68
|
+
# Bootinq.require(*groups, verbose: false, &block)
|
|
69
|
+
#
|
|
70
|
+
# Invokes the <tt>Bootinq.init</tt> method with the given verbose key argument & block,
|
|
71
|
+
# and, finally, makes Bundler to require the given groups.
|
|
72
|
+
def self.require(*groups, verbose: false, &block) # :yields: Bootinq.instance
|
|
73
|
+
init(verbose: verbose, &block)
|
|
47
74
|
Bundler.require(*instance.groups(*groups))
|
|
48
75
|
end
|
|
49
76
|
|
|
50
77
|
# :call-seq:
|
|
51
|
-
# Bootinq.setup(verbose:
|
|
78
|
+
# Bootinq.setup(*groups, verbose: false, &block)
|
|
52
79
|
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
def self.setup(verbose: false, &block) # :yields: Bootinq.instance
|
|
80
|
+
# Invokes the <tt>Bootinq.init</tt> method with the given verbose key argument & block,
|
|
81
|
+
# and, finally, makes Bundler to setup the given groups.
|
|
82
|
+
def self.setup(*groups, verbose: false, &block) # :yields: Bootinq.instance
|
|
83
|
+
init(verbose: verbose, &block)
|
|
84
|
+
Bundler.setup(*instance.groups(*groups))
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# :call-seq:
|
|
88
|
+
# Bootinq.init(verbose: false, &block) -> true or false
|
|
89
|
+
#
|
|
90
|
+
# Initializes itself. Sets the BOOTINQ_PATH enviroment variable if it is missing.
|
|
91
|
+
# To track inquired components use <tt>verbose: true</tt> key argument.
|
|
92
|
+
# Optionally yields block within the own instance's binding.
|
|
93
|
+
def self.init(verbose: false, &block) # :yields: Bootinq.instance
|
|
94
|
+
ENV['BOOTINQ_PATH'] ||= File.expand_path('../bootinq.yml', caller_locations(2, 1)[0].path)
|
|
95
|
+
|
|
56
96
|
instance
|
|
97
|
+
instance.instance_variable_set(:@_on_ready, block.to_proc) if block_given?
|
|
57
98
|
puts "Bootinq: loading components #{instance.components.join(', ')}" if verbose
|
|
58
|
-
instance.
|
|
59
|
-
instance
|
|
99
|
+
instance.ready!
|
|
60
100
|
end
|
|
61
101
|
|
|
62
|
-
attr_reader :flags
|
|
102
|
+
attr_reader :flags
|
|
103
|
+
attr_reader :components
|
|
104
|
+
|
|
105
|
+
delegated :flags
|
|
106
|
+
delegated :components
|
|
63
107
|
|
|
64
108
|
def initialize # :no-doc:
|
|
65
109
|
config_path = ENV.fetch('BOOTINQ_PATH')
|
|
@@ -75,10 +119,29 @@ class Bootinq
|
|
|
75
119
|
config['mount'].each { |flag, name| enable_component(name, flag: flag, as: Mountable) }
|
|
76
120
|
end
|
|
77
121
|
|
|
122
|
+
delegated def ready? # :no-doc:
|
|
123
|
+
!!@ready
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# :call-seq:
|
|
127
|
+
# Bootinq.ready! -> nil or self
|
|
128
|
+
#
|
|
129
|
+
# At the first call marks Bootinq as ready and returns the instance,
|
|
130
|
+
# otherwise returns nil.
|
|
131
|
+
delegated def ready!
|
|
132
|
+
return if ready?
|
|
133
|
+
@ready = true
|
|
134
|
+
if defined?(@_on_ready)
|
|
135
|
+
instance_exec(&@_on_ready)
|
|
136
|
+
remove_instance_variable :@_on_ready
|
|
137
|
+
end
|
|
138
|
+
self
|
|
139
|
+
end
|
|
140
|
+
|
|
78
141
|
# :call-seq:
|
|
79
142
|
# Bootinq.enable_component(name, flag: [, as: Component])
|
|
80
143
|
#
|
|
81
|
-
def enable_component(name, flag:, as: Component)
|
|
144
|
+
delegated def enable_component(name, flag:, as: Component)
|
|
82
145
|
if @_neg ^ @_value.include?(flag)
|
|
83
146
|
@flags << flag
|
|
84
147
|
@components << as.new(name)
|
|
@@ -90,7 +153,7 @@ class Bootinq
|
|
|
90
153
|
#
|
|
91
154
|
# Checks if a component with the given name (i.e. the same gem group)
|
|
92
155
|
# is enabled
|
|
93
|
-
def enabled?(name)
|
|
156
|
+
delegated def enabled?(name)
|
|
94
157
|
components.include?(name)
|
|
95
158
|
end
|
|
96
159
|
|
|
@@ -99,12 +162,12 @@ class Bootinq
|
|
|
99
162
|
# Bootinq[name] -> Bootinq::Component
|
|
100
163
|
#
|
|
101
164
|
# Returns a <tt>Bootinq::Component</tt> object by its name
|
|
102
|
-
def component(name)
|
|
165
|
+
delegated def component(name)
|
|
103
166
|
components[components.index(name)]
|
|
104
167
|
end
|
|
105
168
|
|
|
106
169
|
alias :[] :component
|
|
107
|
-
|
|
170
|
+
delegated :[]
|
|
108
171
|
|
|
109
172
|
# :call-seq:
|
|
110
173
|
# Bootinq.each_mountable { |part| block } -> Array
|
|
@@ -114,16 +177,23 @@ class Bootinq
|
|
|
114
177
|
# passing that part as a parameter. Returns the array of all mountable components.
|
|
115
178
|
#
|
|
116
179
|
# If no block is given, an Enumerator is returned.
|
|
117
|
-
def each_mountable(&block) # :yields: part
|
|
180
|
+
delegated def each_mountable(&block) # :yields: part
|
|
118
181
|
components.select(&:mountable?).each(&block)
|
|
119
182
|
end
|
|
120
183
|
|
|
121
184
|
# :call-seq:
|
|
122
185
|
# Bootinq.groups(*groups)
|
|
123
186
|
#
|
|
124
|
-
#
|
|
125
|
-
|
|
126
|
-
|
|
187
|
+
# Merges enabled Bootinq's groups with the given groups and, if loaded with Rails,
|
|
188
|
+
# passes them to <tt>Rails.groups</tt> method, otherwise just returns the merged list
|
|
189
|
+
# to use with <tt>Bundler.require</tt>.
|
|
190
|
+
delegated def groups(*groups)
|
|
191
|
+
groups.unshift(*components.map(&:group))
|
|
192
|
+
if defined?(Rails)
|
|
193
|
+
Rails.groups(*groups)
|
|
194
|
+
else
|
|
195
|
+
groups
|
|
196
|
+
end
|
|
127
197
|
end
|
|
128
198
|
|
|
129
199
|
# :call-seq:
|
|
@@ -149,7 +219,7 @@ class Bootinq
|
|
|
149
219
|
# Bootinq.on all: %i(frontend backend) do
|
|
150
220
|
# # do something when frontend and backend are enabled
|
|
151
221
|
# end
|
|
152
|
-
def on(name = nil, any: nil, all: nil) # :yields:
|
|
222
|
+
delegated def on(name = nil, any: nil, all: nil) # :yields:
|
|
153
223
|
if name.nil? && any.nil? && all.nil?
|
|
154
224
|
raise ArgumentError, "wrong arguments (given 0, expected 1)"
|
|
155
225
|
elsif (any && all) || (name && (any || all))
|
|
@@ -169,7 +239,7 @@ class Bootinq
|
|
|
169
239
|
#
|
|
170
240
|
# Takes a list of component names and yields a given block (optionally)
|
|
171
241
|
# if all of them are enabled. Returns boolean matching status.
|
|
172
|
-
def on_all(*parts) # :yields:
|
|
242
|
+
delegated def on_all(*parts) # :yields:
|
|
173
243
|
is_matched = parts.all? { |p| enabled?(p) }
|
|
174
244
|
yield if is_matched && block_given?
|
|
175
245
|
is_matched
|
|
@@ -180,12 +250,28 @@ class Bootinq
|
|
|
180
250
|
#
|
|
181
251
|
# Takes a list of component names and yields a given block (optionally)
|
|
182
252
|
# if any of them are enabled. Returns boolean matching status.
|
|
183
|
-
def on_any(*parts) # :yields:
|
|
253
|
+
delegated def on_any(*parts) # :yields:
|
|
184
254
|
is_matched = parts.any? { |p| enabled?(p) }
|
|
185
255
|
yield if is_matched && block_given?
|
|
186
256
|
is_matched
|
|
187
257
|
end
|
|
188
258
|
|
|
259
|
+
# :call-seq:
|
|
260
|
+
# Bottinq.switch(*parts) { block } -> nil
|
|
261
|
+
#
|
|
262
|
+
# Collector method.
|
|
263
|
+
#
|
|
264
|
+
# Example:
|
|
265
|
+
#
|
|
266
|
+
# Bootinq.switch do |part|
|
|
267
|
+
# part.frontend { … }
|
|
268
|
+
# part.backend { … }
|
|
269
|
+
# end
|
|
270
|
+
delegated def switch # :yields: Bootinq::Switch.new
|
|
271
|
+
yield(Switch.new)
|
|
272
|
+
nil
|
|
273
|
+
end
|
|
274
|
+
|
|
189
275
|
# Freezes every instance variables and the instance itself.
|
|
190
276
|
def freeze
|
|
191
277
|
@_value.freeze
|
|
@@ -195,9 +281,7 @@ class Bootinq
|
|
|
195
281
|
super
|
|
196
282
|
end
|
|
197
283
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
def self.new # :no-doc:
|
|
284
|
+
def self.new
|
|
201
285
|
super.freeze
|
|
202
286
|
end
|
|
203
287
|
|
data/lib/bootinq/component.rb
CHANGED
|
@@ -20,6 +20,17 @@ class Bootinq
|
|
|
20
20
|
false
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
+
def module_name
|
|
24
|
+
@id2name.camelcase.to_sym
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def engine
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def kind_of?(klass)
|
|
31
|
+
super || @intern.kind_of?(klass)
|
|
32
|
+
end
|
|
33
|
+
|
|
23
34
|
def == other
|
|
24
35
|
case other
|
|
25
36
|
when String then other == @id2name
|
|
@@ -28,26 +39,44 @@ class Bootinq
|
|
|
28
39
|
end
|
|
29
40
|
end
|
|
30
41
|
|
|
31
|
-
def
|
|
32
|
-
|
|
42
|
+
def ===(other)
|
|
43
|
+
case other
|
|
44
|
+
when String then other === @id2name
|
|
45
|
+
when Symbol then other === @intern
|
|
46
|
+
else super
|
|
47
|
+
end
|
|
33
48
|
end
|
|
34
49
|
|
|
35
|
-
def
|
|
50
|
+
def casecmp(other)
|
|
51
|
+
case other
|
|
52
|
+
when String then @id2name.casecmp(other)
|
|
53
|
+
when Symbol then @intern.casecmp(other)
|
|
54
|
+
when self.class then casecmp(other.to_s)
|
|
55
|
+
end
|
|
36
56
|
end
|
|
37
57
|
|
|
38
|
-
def
|
|
39
|
-
|
|
58
|
+
def casecmp?(other)
|
|
59
|
+
case other
|
|
60
|
+
when String then @id2name.casecmp?(other)
|
|
61
|
+
when Symbol then @intern.casecmp?(other)
|
|
62
|
+
when self.class then casecmp?(other.to_s)
|
|
63
|
+
end
|
|
40
64
|
end
|
|
41
65
|
|
|
42
|
-
|
|
43
|
-
@intern
|
|
44
|
-
end
|
|
66
|
+
%i(inspect to_proc __id__ hash).
|
|
67
|
+
each { |sym| class_eval %(def #{sym}; @intern.#{sym}; end), __FILE__, __LINE__ + 1 }
|
|
45
68
|
|
|
46
|
-
|
|
69
|
+
%i(encoding empty? length).
|
|
70
|
+
each { |sym| class_eval %(def #{sym}; @id2name.#{sym}; end), __FILE__, __LINE__ + 1 }
|
|
47
71
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
72
|
+
%i(match match? =~ []).
|
|
73
|
+
each { |sym| class_eval %(def #{sym}(*args); @id2name.#{sym}(*args); end), __FILE__, __LINE__ + 1 }
|
|
74
|
+
|
|
75
|
+
%i(upcase downcase capitalize swapcase succ next).
|
|
76
|
+
each { |sym| class_eval %(def #{sym}; self.class.new(@intern.#{sym}); end), __FILE__, __LINE__ + 1 }
|
|
77
|
+
|
|
78
|
+
alias :slice :[]
|
|
79
|
+
alias :size :length
|
|
51
80
|
end
|
|
52
81
|
|
|
53
82
|
class Mountable < Component
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Bootinq
|
|
4
|
+
class Switch < ::BasicObject # :no-doc:
|
|
5
|
+
undef_method :==
|
|
6
|
+
undef_method :equal?
|
|
7
|
+
|
|
8
|
+
def raise(*args) # :no-doc:
|
|
9
|
+
::Object.send(:raise, *args)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def method_missing(name, *)
|
|
13
|
+
if ::Bootinq.enabled?(name)
|
|
14
|
+
yield()
|
|
15
|
+
else
|
|
16
|
+
nil
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
data/lib/bootinq/version.rb
CHANGED
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.1
|
|
4
|
+
version: 1.4.1
|
|
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-
|
|
11
|
+
date: 2020-06-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -58,6 +58,7 @@ files:
|
|
|
58
58
|
- lib/bootinq.rb
|
|
59
59
|
- lib/bootinq.yml
|
|
60
60
|
- lib/bootinq/component.rb
|
|
61
|
+
- lib/bootinq/switch.rb
|
|
61
62
|
- lib/bootinq/version.rb
|
|
62
63
|
homepage: https://github.com/estum/bootinq
|
|
63
64
|
licenses:
|
|
@@ -78,8 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
78
79
|
- !ruby/object:Gem::Version
|
|
79
80
|
version: '0'
|
|
80
81
|
requirements: []
|
|
81
|
-
|
|
82
|
-
rubygems_version: 2.7.6
|
|
82
|
+
rubygems_version: 3.0.3
|
|
83
83
|
signing_key:
|
|
84
84
|
specification_version: 4
|
|
85
85
|
summary: Rails Boot Inquirer
|