Sha256: d68fbe1b22dba4725102b9f29feaa1bf2bf7fc0ce0e95a20e8b87c8c36218cf3

Contents?: true

Size: 1.69 KB

Versions: 53

Compression:

Stored size: 1.69 KB

Contents

module Puppet::Pops
# Module for making a call such that there is an identifiable entry on
# the ruby call stack enabling getting a puppet call stack
# To use this make a call with:
# ```
# Puppet::Pops::PuppetStack.stack(file, line, receiver, message, args)
# ```
# To get the stack call:
# ```
# Puppet::Pops::PuppetStack.stacktrace
#
# When getting a backtrace in Ruby, the puppet stack frames are
# identified as coming from "in 'stack'" and having a ".pp" file
# name.
# To support testing, a given file that is an empty string, or nil
# as well as a nil line number are supported. Such stack frames
# will be represented with the text `unknown` and `0ยด respectively.
#
module PuppetStack
  # Pattern matching an entry in the ruby stack that is a puppet entry
  PP_ENTRY_PATTERN = /^(.*\.pp)?:([0-9]+):in (`stack'|`block in call_function')/

  # Sends a message to an obj such that it appears to come from
  # file, line when calling stacktrace.
  #
  def self.stack(file, line, obj, message, args, &block)
    file = '' if file.nil?
    line = 0 if line.nil?

    if block_given?
      Kernel.eval("obj.send(message, *args, &block)", Kernel.binding(), file, line)
    else
      Kernel.eval("obj.send(message, *args)", Kernel.binding(), file, line)
    end
  end

  def self.stacktrace
    caller().reduce([]) do |memo, loc|
      if loc =~ PP_ENTRY_PATTERN
        memo << [$1.nil? ? 'unknown' : $1, $2.to_i]
      end
      memo
    end
  end

  # Returns an Array with the top of the puppet stack, or an empty Array if there was no such entry.
  #
  def self.top_of_stack
    caller.each do |loc|
      if loc =~ PP_ENTRY_PATTERN
        return [$1.nil? ? 'unknown' : $1, $2.to_i]
      end
    end
    []
  end
end
end

Version data entries

53 entries across 53 versions & 2 rubygems

Version Path
puppet-5.5.17-x86-mingw32 lib/puppet/pops/puppet_stack.rb
puppet-5.5.17 lib/puppet/pops/puppet_stack.rb
puppet-5.5.17-x64-mingw32 lib/puppet/pops/puppet_stack.rb
puppet-5.5.17-universal-darwin lib/puppet/pops/puppet_stack.rb
puppet-5.5.16 lib/puppet/pops/puppet_stack.rb
puppet-5.5.16-x86-mingw32 lib/puppet/pops/puppet_stack.rb
puppet-5.5.16-x64-mingw32 lib/puppet/pops/puppet_stack.rb
puppet-5.5.16-universal-darwin lib/puppet/pops/puppet_stack.rb
puppet-5.5.14 lib/puppet/pops/puppet_stack.rb
puppet-5.5.14-x86-mingw32 lib/puppet/pops/puppet_stack.rb
puppet-5.5.14-x64-mingw32 lib/puppet/pops/puppet_stack.rb
puppet-5.5.14-universal-darwin lib/puppet/pops/puppet_stack.rb
puppet-5.5.13 lib/puppet/pops/puppet_stack.rb
puppet-5.5.13-x86-mingw32 lib/puppet/pops/puppet_stack.rb
puppet-5.5.13-x64-mingw32 lib/puppet/pops/puppet_stack.rb
puppet-5.5.13-universal-darwin lib/puppet/pops/puppet_stack.rb
puppet-5.5.12 lib/puppet/pops/puppet_stack.rb
puppet-5.5.12-x86-mingw32 lib/puppet/pops/puppet_stack.rb
puppet-5.5.12-x64-mingw32 lib/puppet/pops/puppet_stack.rb
puppet-5.5.12-universal-darwin lib/puppet/pops/puppet_stack.rb