bootinq 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f503e7ad103931ee10ce325a3590e3b7742f128a6947a37f59a1566ec57ceaed
4
- data.tar.gz: 750b19a788035d9325cff83342cc67e2aac08b9ef4e892637eee07121a73b7b4
3
+ metadata.gz: 266e204b1e16ba81aaaf17e2ab6b638f2c33b1717a9c728e65332b6b2274e98d
4
+ data.tar.gz: 0f8210ddf0aae40d21ccc68b3964df30b7102ea35cb76c04779e3a2f48d0f9dd
5
5
  SHA512:
6
- metadata.gz: f2878d2f0977783d2d586baa923bbc80945a2495120b522a5c198fd0c493c21f9b7ab4f591799b4f041130cfb62e3747f9287683d23db0bbccf92a64716fac49
7
- data.tar.gz: 15eac28f64c7777dcafefb756d4a6e3644d22561c673bada3e5d6ff7187283d7596a8c62aae2e1933cab49e1f44531570a99c32e37b1db5a69e4fda4cf66eb34
6
+ metadata.gz: d8d3172c9a7a38e335585b0b1a35dc7bdaccbb993076095cd414a317f891d0506e6b0995b5e7eb4cdea9f885553658cd175219273a788db797994d63eca59a44
7
+ data.tar.gz: 182655c54c91a0a4cac2d7c17e5750e59e8941309a9ce492faddc1204f30e72a90c847f5e48e23ffb549cc9dc60ad4ed0c0b064eb92348960a6b85286380321b
data/README.md CHANGED
@@ -15,9 +15,9 @@ And then execute:
15
15
  $ bundle
16
16
 
17
17
 
18
- ## Usage
18
+ ## Get started
19
19
 
20
- There are few steps to setup partial gem booting in a Rails application using Bootinq:
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
- ### 3. Change config/application.rb
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.
@@ -9,11 +9,30 @@ require "bootinq/component"
9
9
  #
10
10
  # == Installation
11
11
  #
12
+ # === Ruby on Rails
13
+ #
12
14
  # 1. Insert <tt>require "bootinq"</tt> in the top of <tt>config/application.rb</tt>
13
15
  #
14
16
  # 2. Find <tt>Bundler.require(*Rails.groups)</tt> line below and replace it
15
17
  # with the <tt>Bootinq.require</tt>.
16
18
  #
19
+ # === Other
20
+ #
21
+ # 1. Locate <tt>Bundler.require(...)</tt> in your app and insert <tt>require "bootinq"</tt> above.
22
+ #
23
+ # 2. Replace located <tt>Bundler.require(...)</tt> line with the <tt>Bootinq.require(...)</tt>.
24
+ #
25
+ # For example, if you are using Grape:
26
+ #
27
+ # # config/application.rb
28
+ #
29
+ # require 'boot'
30
+ # require 'bootinq'
31
+ #
32
+ # # Bundler.require :default, ENV['RACK_ENV']
33
+ # Bootinq.require :default, ENV['RACK_ENV'], verbose: true
34
+ # ...
35
+ #
17
36
  # == Example <tt>config/bootinq.yml</tt>:
18
37
  #
19
38
  # env_key: BOOTINQ
@@ -26,7 +45,6 @@ require "bootinq/component"
26
45
  # a: :api
27
46
  # f: :engine
28
47
  class Bootinq
29
- extend SingleForwardable
30
48
  include Singleton
31
49
 
32
50
  DEFAULT = {
@@ -36,9 +54,22 @@ class Bootinq
36
54
  "mount" => {}
37
55
  }.freeze
38
56
 
57
+ class << self
58
+ protected def delegated(sym) # :no-doc:
59
+ location = caller_locations(1, 1).first
60
+ file, line = location.path, location.lineno
61
+ definiton = %(def self.#{sym}(*args, &block); instance.#{sym}(*args, &block); end)
62
+ class_eval definiton, file, line
63
+ end
64
+ end
65
+
66
+ # :call-seq:
67
+ # Bootinq.require(*groups, verbose: false, &block)
68
+ #
39
69
  # The helper method to bootstrap the Bootinq.
40
- # Sets the BOOTINQ_PATH enviroment variable, invokes <tt>Bootinq.setup</tt> method
41
- # with given verbose argument & block, and, finally, gets Bundler to require the given groups.
70
+ # Sets the BOOTINQ_PATH enviroment variable if it is missing,
71
+ # invokes the <tt>Bootinq.setup</tt> method with the given verbose key argument & block,
72
+ # and, finally, gets Bundler to require the given groups.
42
73
  def self.require(*groups, verbose: false, &block) # :yields: Bootinq.instance
43
74
  ENV['BOOTINQ_PATH'] ||= File.expand_path('../bootinq.yml', caller_locations(1..1)[0].path)
44
75
 
@@ -48,10 +79,10 @@ class Bootinq
48
79
  end
49
80
 
50
81
  # :call-seq:
51
- # Bootinq.setup(verbose: true, &block) -> true or false
82
+ # Bootinq.setup(verbose: false, &block) -> true or false
52
83
  #
53
- # Initializes itself. When verbose: true
54
- # Yields optional block in the own instance's binding and,
84
+ # Initializes itself. To track inquired components use <tt>verbose: true</tt> key argument.
85
+ # Optionally yields block within the own instance's binding.
55
86
  def self.setup(verbose: false, &block) # :yields: Bootinq.instance
56
87
  instance
57
88
  puts "Bootinq: loading components #{instance.components.join(', ')}" if verbose
@@ -59,7 +90,11 @@ class Bootinq
59
90
  instance
60
91
  end
61
92
 
62
- attr_reader :flags, :components
93
+ attr_reader :flags
94
+ attr_reader :components
95
+
96
+ delegated :flags
97
+ delegated :components
63
98
 
64
99
  def initialize # :no-doc:
65
100
  config_path = ENV.fetch('BOOTINQ_PATH')
@@ -78,7 +113,7 @@ class Bootinq
78
113
  # :call-seq:
79
114
  # Bootinq.enable_component(name, flag: [, as: Component])
80
115
  #
81
- def enable_component(name, flag:, as: Component)
116
+ delegated def enable_component(name, flag:, as: Component)
82
117
  if @_neg ^ @_value.include?(flag)
83
118
  @flags << flag
84
119
  @components << as.new(name)
@@ -90,7 +125,7 @@ class Bootinq
90
125
  #
91
126
  # Checks if a component with the given name (i.e. the same gem group)
92
127
  # is enabled
93
- def enabled?(name)
128
+ delegated def enabled?(name)
94
129
  components.include?(name)
95
130
  end
96
131
 
@@ -99,12 +134,12 @@ class Bootinq
99
134
  # Bootinq[name] -> Bootinq::Component
100
135
  #
101
136
  # Returns a <tt>Bootinq::Component</tt> object by its name
102
- def component(name)
137
+ delegated def component(name)
103
138
  components[components.index(name)]
104
139
  end
105
140
 
106
141
  alias :[] :component
107
-
142
+ delegated :[]
108
143
 
109
144
  # :call-seq:
110
145
  # Bootinq.each_mountable { |part| block } -> Array
@@ -114,16 +149,23 @@ class Bootinq
114
149
  # passing that part as a parameter. Returns the array of all mountable components.
115
150
  #
116
151
  # If no block is given, an Enumerator is returned.
117
- def each_mountable(&block) # :yields: part
152
+ delegated def each_mountable(&block) # :yields: part
118
153
  components.select(&:mountable?).each(&block)
119
154
  end
120
155
 
121
156
  # :call-seq:
122
157
  # Bootinq.groups(*groups)
123
158
  #
124
- # Invokes <tt>Rails.groups</tt> method within enabled Bootinq's groups
125
- def groups(*groups)
126
- Rails.groups(*components.map(&:group), *groups)
159
+ # Merges enabled Bootinq's groups with the given groups and, if loaded with Rails,
160
+ # passes them to <tt>Rails.groups</tt> method, otherwise just returns the merged list
161
+ # to use with <tt>Bundler.require</tt>.
162
+ delegated def groups(*groups)
163
+ groups.unshift(*components.map(&:group))
164
+ if defined?(Rails)
165
+ Rails.groups(*groups)
166
+ else
167
+ groups
168
+ end
127
169
  end
128
170
 
129
171
  # :call-seq:
@@ -149,7 +191,7 @@ class Bootinq
149
191
  # Bootinq.on all: %i(frontend backend) do
150
192
  # # do something when frontend and backend are enabled
151
193
  # end
152
- def on(name = nil, any: nil, all: nil) # :yields:
194
+ delegated def on(name = nil, any: nil, all: nil) # :yields:
153
195
  if name.nil? && any.nil? && all.nil?
154
196
  raise ArgumentError, "wrong arguments (given 0, expected 1)"
155
197
  elsif (any && all) || (name && (any || all))
@@ -169,7 +211,7 @@ class Bootinq
169
211
  #
170
212
  # Takes a list of component names and yields a given block (optionally)
171
213
  # if all of them are enabled. Returns boolean matching status.
172
- def on_all(*parts) # :yields:
214
+ delegated def on_all(*parts) # :yields:
173
215
  is_matched = parts.all? { |p| enabled?(p) }
174
216
  yield if is_matched && block_given?
175
217
  is_matched
@@ -180,7 +222,7 @@ class Bootinq
180
222
  #
181
223
  # Takes a list of component names and yields a given block (optionally)
182
224
  # if any of them are enabled. Returns boolean matching status.
183
- def on_any(*parts) # :yields:
225
+ delegated def on_any(*parts) # :yields:
184
226
  is_matched = parts.any? { |p| enabled?(p) }
185
227
  yield if is_matched && block_given?
186
228
  is_matched
@@ -195,9 +237,7 @@ class Bootinq
195
237
  super
196
238
  end
197
239
 
198
- def_delegators "instance", *instance_methods(false)
199
-
200
- def self.new # :no-doc:
240
+ def self.new
201
241
  super.freeze
202
242
  end
203
243
 
@@ -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 inspect
32
- @intern.inspect
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 engine
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 module_name
39
- @id2name.camelcase.to_sym
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
- def respond_to_missing?(method_name, include_all=false)
43
- @intern.respond_to?(method_name, include_all)
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
- private
69
+ %i(encoding empty? length).
70
+ each { |sym| class_eval %(def #{sym}; @id2name.#{sym}; end), __FILE__, __LINE__ + 1 }
47
71
 
48
- def method_missing(method_name, *args, &blk)
49
- @intern.respond_to?(method_name) ? @intern.public_send(method_name, *args, &blk) : super
50
- end
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Bootinq
4
- VERSION = "1.1.0"
4
+ VERSION = "1.2.0"
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.1.0
4
+ version: 1.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: 2020-06-06 00:00:00.000000000 Z
11
+ date: 2020-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler