Class: PuppetDebugger::InputResponders::Functions

Inherits:
PuppetDebugger::InputResponderPlugin show all
Defined in:
lib/plugins/puppet-debugger/input_responders/functions.rb

Constant Summary collapse

COMMAND_WORDS =
%w(functions)
SUMMARY =
'List all the functions available in the environment.'
COMMAND_GROUP =
:environment
FUNC_NATIVE_NAME_REGEX =
%r{\Afunction\s([\w\:]+)}
FUNC_V4_NAME_REGEX =
%r{Puppet\:\:Functions.create_function\s?\(?\:?\'?([\w\:]+)}

Instance Attribute Summary

Attributes inherited from PuppetDebugger::InputResponderPlugin

#debugger

Instance Method Summary collapse

Methods inherited from PuppetDebugger::InputResponderPlugin

command_completion, command_group, command_words, details, execute, #puppet_debugger_lib_dir, summary

Instance Method Details

#func_listObject

append a () to functions so we know they are functions



26
27
28
29
# File 'lib/plugins/puppet-debugger/input_responders/functions.rb', line 26

def func_list
  # ideally we should get a list of function names via the puppet loader    
  function_map.map { |name, | "#{[:full_name]}()" }
end

#function_mapHash

Returns - a map of all the functions.

Returns:

  • (Hash)
    • a map of all the functions



32
33
34
35
36
37
38
39
40
# File 'lib/plugins/puppet-debugger/input_responders/functions.rb', line 32

def function_map
  functions = {}
  function_files.each do |file|
    obj = function_obj(file)
    # return the last matched in cases where rbenv might be involved
    functions[obj[:full_name]] = obj
  end
  functions
end

#function_obj(file) ⇒ Array

Returns - returns a array of the parentname and function name.

Returns:

  • (Array)
    • returns a array of the parentname and function name



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/plugins/puppet-debugger/input_responders/functions.rb', line 52

def function_obj(file)
  namespace = nil
  name = nil
  if file =~ /\.pp/
    File.readlines(file, :encoding => 'UTF-8').find do |line|
      # TODO: not getting namespace for functio
      if line.match(FUNC_NATIVE_NAME_REGEX) 
        namespace, name = $1.split('::', 2) 
        name = namespace if name.nil?
        namespace = '' if namespace == name
      end
    end
  elsif file.include?('lib/puppet/functions')
    File.readlines(file, :encoding => 'UTF-8').find do |line|
      if line.match(FUNC_V4_NAME_REGEX) 
        namespace, name = $1.split('::', 2) 
        name = namespace if name.nil?
        namespace = '' if namespace == name
      end
    end
  end
  name ||= File.basename(file, File.extname(file)) 
  match = file.match('\/(?<mod>[\w\-\.]+)\/(lib|functions|manifests)')
  summary_match = File.read(file, :encoding => 'UTF-8').match(/@summary\s(.*)/)
  summary = summary_match[1] if summary_match

 # match = file.match('(?<mod>\w+)\/functions|manifests|lib')
  mod_name =  match[:mod] unless match.nil? 
  full_name = namespace.nil? || namespace.empty? ? name : name.prepend("#{namespace}::")
  {namespace: namespace, summary: summary, mod_name: mod_name, name: name, full_name: full_name, file: file}
end

#lib_dirs(module_dirs = modules_paths) ⇒ Object



43
44
45
46
47
48
# File 'lib/plugins/puppet-debugger/input_responders/functions.rb', line 43

def lib_dirs(module_dirs = modules_paths)
  dirs = module_dirs.map do |mod_dir|
    Dir["#{mod_dir}/*/lib"].entries
  end.flatten
  dirs + [puppet_debugger_lib_dir]
end

#run(args = []) ⇒ Object



13
14
15
16
# File 'lib/plugins/puppet-debugger/input_responders/functions.rb', line 13

def run(args = [])
  filter = args.first || ''
  TablePrint::Printer.table_print(sorted_list(filter), [:full_name, :mod_name])
end

#sorted_list(filter = '') ⇒ Object



18
19
20
21
22
23
# File 'lib/plugins/puppet-debugger/input_responders/functions.rb', line 18

def sorted_list(filter = '')
  search = /#{Regexp.escape(filter)}/
  function_map.values.find_all do | v| 
    "#{v[:mod_name]}_#{v[:full_name]}" =~ search
  end.sort {|a,b| a[:full_name] <=> b[:full_name]}
end