Class: AppMap::Config::LookupPackage

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

Overview

Looks up a class and method in the config, to find the matching Package configuration. This class is only used after path_enabled? has returned ‘true`.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#clsObject

Returns the value of attribute cls



451
452
453
# File 'lib/appmap/config.rb', line 451

def cls
  @cls
end

#configObject

Returns the value of attribute config



451
452
453
# File 'lib/appmap/config.rb', line 451

def config
  @config
end

#methodObject

Returns the value of attribute method



451
452
453
# File 'lib/appmap/config.rb', line 451

def method
  @method
end

Instance Method Details

#packageObject



452
453
454
455
456
457
# File 'lib/appmap/config.rb', line 452

def package
  # Global "excludes" configuration can be used to ignore any class/method.
  return if config.never_hook?(cls, method)

  package_for_code_object || package_for_location
end

#package_for_code_objectObject

Hook a method which is specified by class and method name.



460
461
462
463
464
465
466
467
468
469
470
471
472
473
# File 'lib/appmap/config.rb', line 460

def package_for_code_object
  class_name = begin
                 cls.to_s.index('#<Class:') == 0 ? cls.to_s['#<Class:'.length...-1] : cls.name
               rescue
                 # Calling #to_s on some Rails classes
                 # (e.g. those generated to represent
                 # associations) will raise an exception. Fall
                 # back to using the class name.
                 cls.name
               end
  Array(config.gem_hooks[class_name])
    .find { |hook| hook.include_method?(method.name) }
    &.package
end

#package_for_locationObject

Hook a method which is specified by code location (i.e. path).



476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
# File 'lib/appmap/config.rb', line 476

def package_for_location
  location = method.source_location
  location_file, = location
  return unless location_file

  location_file = AppMap::Util.normalize_path(location_file)

  pkg = config
        .packages
        .select { |pkg| pkg.path }
        .select do |pkg|
          (location_file.index(pkg.path) == 0) &&
            !pkg.exclude.find { |p| location_file.index(p) }
        end
        .min { |a, b| b.path <=> a.path } # Longest matching package first

  pkg.subpackage(location_file, config) if pkg
end