Class: AppMap::Config::Package

Inherits:
Struct
  • Object
show all
Defined in:
lib/appmap/config.rb

Overview

Specifies a logical code package be mapped. This can be a project source folder, a Gem, or a builtin.

Options:

  • path indicates a relative path to a code folder.

  • gem may indicate a gem name that “owns” the path

  • require_name can be used to make sure that the code is required so that it can be loaded. This is generally used with builtins, or when the path to be required is not automatically required when bundler requires the gem.

  • exclude can be used used to exclude sub-paths. Generally not used with gem.

  • labels is used to apply labels to matching code. This is really only useful when the package will be applied to specific functions, via TargetMethods.

  • shallow indicates shallow mapping, in which only the entrypoint to a gem is recorded.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#builtinObject

Returns the value of attribute builtin

Returns:

  • (Object)

    the current value of builtin



38
39
40
# File 'lib/appmap/config.rb', line 38

def builtin
  @builtin
end

#excludeObject

Returns the value of attribute exclude

Returns:

  • (Object)

    the current value of exclude



38
39
40
# File 'lib/appmap/config.rb', line 38

def exclude
  @exclude
end

#gemObject

Returns the value of attribute gem

Returns:

  • (Object)

    the current value of gem



38
39
40
# File 'lib/appmap/config.rb', line 38

def gem
  @gem
end

#handler_classObject



49
50
51
52
# File 'lib/appmap/config.rb', line 49

def handler_class
  require "appmap/handler/function_handler"
  @handler_class || AppMap::Handler::FunctionHandler
end

#labelsObject

Returns the value of attribute labels

Returns:

  • (Object)

    the current value of labels



38
39
40
# File 'lib/appmap/config.rb', line 38

def labels
  @labels
end

#nameObject

Returns the value of attribute name

Returns:

  • (Object)

    the current value of name



38
39
40
# File 'lib/appmap/config.rb', line 38

def name
  @name
end

#pathObject

Returns the value of attribute path

Returns:

  • (Object)

    the current value of path



38
39
40
# File 'lib/appmap/config.rb', line 38

def path
  @path
end

#require_nameObject

Returns the value of attribute require_name

Returns:

  • (Object)

    the current value of require_name



38
39
40
# File 'lib/appmap/config.rb', line 38

def require_name
  @require_name
end

#shallowObject

Returns the value of attribute shallow

Returns:

  • (Object)

    the current value of shallow



38
39
40
# File 'lib/appmap/config.rb', line 38

def shallow
  @shallow
end

Class Method Details

.build_from_builtin(path, shallow: false, require_name: nil, exclude: [], labels: []) ⇒ Object



83
84
85
# File 'lib/appmap/config.rb', line 83

def build_from_builtin(path, shallow: false, require_name: nil, exclude: [], labels: [])
  Package.new(path, path, nil, require_name, exclude, labels, shallow, true)
end

.build_from_gem(gem, shallow: true, require_name: nil, exclude: [], labels: [], optional: false, force: false) ⇒ Object

Builds a package for gem. Generally corresponds to a ‘gem:` entry in appmap.yml. Also used when mapping a builtin.



89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/appmap/config.rb', line 89

def build_from_gem(gem, shallow: true, require_name: nil, exclude: [], labels: [], optional: false, force: false)
  if !force && %w[method_source].member?(gem)
    warn "WARNING: #{gem} cannot be AppMapped because it is a dependency of the appmap gem"
    return
  end
  path = gem_path(gem, optional)
  if path
    Package.new(gem, path, gem, require_name, exclude, labels, shallow)
  else
    AppMap::Util.startup_message "#{gem} is not available in the bundle"
  end
end

.build_from_path(path, shallow: false, require_name: nil, exclude: [], labels: []) ⇒ Object

Builds a package for a path, such as ‘app/models` in a Rails app. Generally corresponds to a `path:` entry in appmap.yml. Also used for mapping specific methods via TargetMethods.



79
80
81
# File 'lib/appmap/config.rb', line 79

def build_from_path(path, shallow: false, require_name: nil, exclude: [], labels: [])
  Package.new(path, path, nil, require_name, exclude, labels, shallow)
end

Instance Method Details

#record_around?Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/appmap/config.rb', line 45

def record_around?
  RECORD_AROUND_LABELS.find { |label| labels&.member?(label) }
end

#shallow?Boolean

Indicates that only the entry points to a package will be recorded. Once the code has entered a package, subsequent calls within the package will not be recorded unless the code leaves the package and re-enters it.

Returns:

  • (Boolean)


57
58
59
# File 'lib/appmap/config.rb', line 57

def shallow?
  shallow
end

#subpackage(location, config) ⇒ Object

Clones this package into a sub-package, if needed. For example, suppose the appmap.yml specifies package ‘app/models`. If some code in `app/models/dao/user.rb` is mapped, it will be associated with a sub-package `app/models/dao`.



65
66
67
68
69
70
71
72
73
74
# File 'lib/appmap/config.rb', line 65

def subpackage(location, config)
  return self if gem

  path = location.split("/")[0...-1].join("/")
  clone.tap do |pkg|
    pkg.name = path
    pkg.path = path
    config.packages << pkg
  end
end

#to_hObject



114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/appmap/config.rb', line 114

def to_h
  {
    name: name,
    path: path,
    gem: gem,
    require_name: require_name,
    handler_class: handler_class ? handler_class.name : nil,
    exclude: Util.blank?(exclude) ? nil : exclude,
    labels: Util.blank?(labels) ? nil : labels,
    shallow: shallow.nil? ? nil : shallow
  }.compact
end