Class: Vagrant::Action::Hook
- Inherits:
-
Object
- Object
- Vagrant::Action::Hook
- Defined in:
- lib/vagrant/action/hook.rb
Overview
This class manages hooks into existing Builder stacks, and lets you add and remove middleware classes. This is the primary method by which plugins can hook into built-in middleware stacks.
Instance Attribute Summary collapse
-
#after_hooks ⇒ Hash<Class, Array<Builder::StackItem>>
readonly
This is a hash of the middleware to append to a certain other middleware.
-
#append_hooks ⇒ Array<Builder::StackItem>
readonly
This is a list of the hooks to just append to the end.
-
#before_hooks ⇒ Hash<Class, Array<Builder::StackItem>>
readonly
This is a hash of the middleware to prepend to a certain other middleware.
-
#prepend_hooks ⇒ Array<Builder::StackItem>
readonly
This is a list of the hooks to just prepend to the beginning.
Instance Method Summary collapse
-
#after(existing, new, *args, **keywords, &block) ⇒ Object
Add a middleware after an existing middleware.
-
#append(new, *args, **keywords, &block) ⇒ Object
Append a middleware to the end of the stack.
-
#apply(builder, options = {}) ⇒ Object
This applies the given hook to a builder.
-
#before(existing, new, *args, **keywords, &block) ⇒ Object
Add a middleware before an existing middleware.
- #empty? ⇒ Boolean
-
#initialize ⇒ Hook
constructor
A new instance of Hook.
-
#prepend(new, *args, **keywords, &block) ⇒ Object
Prepend a middleware to the beginning of the stack.
Constructor Details
#initialize ⇒ Hook
Returns a new instance of Hook.
32 33 34 35 36 37 |
# File 'lib/vagrant/action/hook.rb', line 32 def initialize @before_hooks = Hash.new { |h, k| h[k] = [] } @after_hooks = Hash.new { |h, k| h[k] = [] } @prepend_hooks = [] @append_hooks = [] end |
Instance Attribute Details
#after_hooks ⇒ Hash<Class, Array<Builder::StackItem>> (readonly)
This is a hash of the middleware to append to a certain other middleware.
20 21 22 |
# File 'lib/vagrant/action/hook.rb', line 20 def after_hooks @after_hooks end |
#append_hooks ⇒ Array<Builder::StackItem> (readonly)
This is a list of the hooks to just append to the end
30 31 32 |
# File 'lib/vagrant/action/hook.rb', line 30 def append_hooks @append_hooks end |
#before_hooks ⇒ Hash<Class, Array<Builder::StackItem>> (readonly)
This is a hash of the middleware to prepend to a certain other middleware.
14 15 16 |
# File 'lib/vagrant/action/hook.rb', line 14 def before_hooks @before_hooks end |
#prepend_hooks ⇒ Array<Builder::StackItem> (readonly)
This is a list of the hooks to just prepend to the beginning
25 26 27 |
# File 'lib/vagrant/action/hook.rb', line 25 def prepend_hooks @prepend_hooks end |
Instance Method Details
#after(existing, new, *args, **keywords, &block) ⇒ Object
Add a middleware after an existing middleware.
59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/vagrant/action/hook.rb', line 59 def after(existing, new, *args, **keywords, &block) item = Builder::StackItem.new( middleware: new, arguments: Builder::MiddlewareArguments.new( parameters: args, keywords: keywords, block: block ) ) @after_hooks[existing] << item end |
#append(new, *args, **keywords, &block) ⇒ Object
Append a middleware to the end of the stack. Note that if the middleware sequence ends early, then the new middleware won't be run.
76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/vagrant/action/hook.rb', line 76 def append(new, *args, **keywords, &block) item = Builder::StackItem.new( middleware: new, arguments: Builder::MiddlewareArguments.new( parameters: args, keywords: keywords, block: block ) ) @append_hooks << item end |
#apply(builder, options = {}) ⇒ Object
This applies the given hook to a builder. This should not be called directly.
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/vagrant/action/hook.rb', line 115 def apply(builder, ={}) if ![:no_prepend_or_append] # Prepends first @prepend_hooks.each do |item| if [:root] idx = builder.index([:root]) else idx = 0 end builder.insert(idx, item.middleware, *item.arguments.parameters, **item.arguments.keywords, &item.arguments.block) end # Appends @append_hooks.each do |item| if [:root] idx = builder.index([:root]) builder.insert(idx + 1, item.middleware, *item.arguments.parameters, **item.arguments.keywords, &item.arguments.block) else builder.use(item.middleware, *item.arguments.parameters, **item.arguments.keywords, &item.arguments.block) end end end # Before hooks @before_hooks.each do |key, list| next if !builder.index(key) list.each do |item| builder.insert_before(key, item.middleware, *item.arguments.parameters, **item.arguments.keywords, &item.arguments.block) end end # After hooks @after_hooks.each do |key, list| next if !builder.index(key) list.each do |item| builder.insert_after(key, item.middleware, *item.arguments.parameters, **item.arguments.keywords, &item.arguments.block) end end end |
#before(existing, new, *args, **keywords, &block) ⇒ Object
Add a middleware before an existing middleware.
43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/vagrant/action/hook.rb', line 43 def before(existing, new, *args, **keywords, &block) item = Builder::StackItem.new( middleware: new, arguments: Builder::MiddlewareArguments.new( parameters: args, keywords: keywords, block: block ) ) @before_hooks[existing] << item end |
#empty? ⇒ Boolean
104 105 106 107 108 109 |
# File 'lib/vagrant/action/hook.rb', line 104 def empty? before_hooks.empty? && after_hooks.empty? && prepend_hooks.empty? && append_hooks.empty? end |
#prepend(new, *args, **keywords, &block) ⇒ Object
Prepend a middleware to the beginning of the stack.
91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/vagrant/action/hook.rb', line 91 def prepend(new, *args, **keywords, &block) item = Builder::StackItem.new( middleware: new, arguments: Builder::MiddlewareArguments.new( parameters: args, keywords: keywords, block: block ) ) @prepend_hooks << item end |