|
1 | 1 | # frozen_string_literal: true |
2 | 2 |
|
3 | | -require 'thread' |
4 | | - |
5 | 3 | module Seahorse |
6 | 4 | module Client |
7 | 5 | class Base |
@@ -60,6 +58,7 @@ def operation_names |
60 | 58 | def build_config(plugins, options) |
61 | 59 | config = Configuration.new |
62 | 60 | config.add_option(:api) |
| 61 | + config.add_option(:plugins) |
63 | 62 | plugins.each do |plugin| |
64 | 63 | plugin.add_options(config) if plugin.respond_to?(:add_options) |
65 | 64 | end |
@@ -96,9 +95,9 @@ def context_for(operation_name, params) |
96 | 95 | class << self |
97 | 96 |
|
98 | 97 | def new(options = {}) |
99 | | - plugins = build_plugins |
100 | 98 | options = options.dup |
101 | | - before_initialize(plugins, options) |
| 99 | + plugins = build_plugins(self.plugins + options.fetch(:plugins, [])) |
| 100 | + plugins = before_initialize(plugins, options) |
102 | 101 | client = allocate |
103 | 102 | client.send(:initialize, plugins, options) |
104 | 103 | client |
@@ -209,17 +208,28 @@ def define_operation_methods |
209 | 208 | include(operations_module) |
210 | 209 | end |
211 | 210 |
|
212 | | - def build_plugins |
| 211 | + def build_plugins(plugins) |
213 | 212 | plugins.map { |plugin| plugin.is_a?(Class) ? plugin.new : plugin } |
214 | 213 | end |
215 | 214 |
|
216 | 215 | def before_initialize(plugins, options) |
217 | | - plugins.each do |plugin| |
218 | | - plugin.before_initialize(self, options) if plugin.respond_to?(:before_initialize) |
| 216 | + queue = Queue.new |
| 217 | + plugins.each { |plugin| queue.push(plugin) } |
| 218 | + until queue.empty? |
| 219 | + plugin = queue.pop |
| 220 | + next unless plugin.respond_to?(:before_initialize) |
| 221 | + |
| 222 | + plugins_before = options.fetch(:plugins, []) |
| 223 | + plugin.before_initialize(self, options) |
| 224 | + plugins_after = build_plugins(options.fetch(:plugins, []) - plugins_before) |
| 225 | + # Plugins with before_initialize can add other plugins |
| 226 | + plugins_after.each { |p| queue.push(p); plugins << p } |
219 | 227 | end |
| 228 | + plugins |
220 | 229 | end |
221 | 230 |
|
222 | 231 | def inherited(subclass) |
| 232 | + super |
223 | 233 | subclass.instance_variable_set('@plugins', PluginList.new(@plugins)) |
224 | 234 | end |
225 | 235 |
|
|
0 commit comments