Class: Puppet::Context Private
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Puppet::Context is a system for tracking services and contextual information that puppet needs to be able to run. Values are “bound” in a context when it is created and cannot be changed; however a child context can be created, using #override, that provides a different value.
When binding a Proc, the proc is called when the value is looked up, and the result is memoized for subsequent lookups. This provides a lazy mechanism that can be used to delay expensive production of values until they are needed.
Defined Under Namespace
Classes: DuplicateRollbackMarkError, EmptyStack, Stack, StackUnderflow, TrustedInformation, UndefinedBindingError, UnknownRollbackMarkError
Instance Method Summary collapse
-
#initialize(initial_bindings) ⇒ Context
constructor
private
A new instance of Context.
- #lookup(name, &block) ⇒ Object private
-
#mark(name) ⇒ Object
private
Mark a place on the context stack to later return to with #rollback.
- #override(bindings, description = '', &block) ⇒ Object private
- #pop ⇒ Object private
- #push(overrides, description = '') ⇒ Object private
-
#rollback(name) ⇒ Object
private
Roll back to a mark set by #mark.
-
#unsafe_push_global(overrides, description = '') ⇒ Object
private
Push a context and make this global across threads Do not use in a context where multiple threads may already exist.
Constructor Details
#initialize(initial_bindings) ⇒ Context
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a new instance of Context.
25 26 27 28 29 30 31 32 |
# File 'lib/puppet/context.rb', line 25 def initialize(initial_bindings) @stack = Puppet::ThreadLocal.new(EmptyStack.new.push(initial_bindings)) # By initializing @rollbacks to nil and creating a hash lazily when #mark or # #rollback are called we ensure that the hashes are never shared between # threads and it's safe to mutate them @rollbacks = Puppet::ThreadLocal.new(nil) end |
Instance Method Details
#lookup(name, &block) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
55 56 57 |
# File 'lib/puppet/context.rb', line 55 def lookup(name, &block) @stack.value.lookup(name, &block) end |
#mark(name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Mark a place on the context stack to later return to with #rollback.
74 75 76 77 78 79 80 81 |
# File 'lib/puppet/context.rb', line 74 def mark(name) @rollbacks.value ||= {} if @rollbacks.value[name].nil? @rollbacks.value[name] = @stack.value else raise DuplicateRollbackMarkError, _("Mark for '%{name}' already exists") % { name: name } end end |
#override(bindings, description = '', &block) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
60 61 62 63 64 65 66 67 |
# File 'lib/puppet/context.rb', line 60 def override(bindings, description = '', &block) saved_point = @stack.value push(bindings, description) yield ensure @stack.value = saved_point end |
#pop ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
50 51 52 |
# File 'lib/puppet/context.rb', line 50 def pop @stack.value = @stack.value.pop end |
#push(overrides, description = '') ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
35 36 37 |
# File 'lib/puppet/context.rb', line 35 def push(overrides, description = '') @stack.value = @stack.value.push(overrides, description) end |
#rollback(name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Roll back to a mark set by #mark.
Rollbacks can only reach a mark accessible via #pop. If the mark is not on the current context stack the behavior of rollback is undefined.
91 92 93 94 95 96 97 98 |
# File 'lib/puppet/context.rb', line 91 def rollback(name) @rollbacks.value ||= {} if @rollbacks.value[name].nil? raise UnknownRollbackMarkError, _("Unknown mark '%{name}'") % { name: name } end @stack.value = @rollbacks.value.delete(name) end |
#unsafe_push_global(overrides, description = '') ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Push a context and make this global across threads Do not use in a context where multiple threads may already exist
43 44 45 46 47 |
# File 'lib/puppet/context.rb', line 43 def unsafe_push_global(overrides, description = '') @stack = Puppet::ThreadLocal.new( @stack.value.push(overrides, description) ) end |