appmap 0.37.2 → 0.38.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0211b21334945f6786d150fdf1a0dea8a062cbc2d59c4b347f72555232ec6480
4
- data.tar.gz: ac2785471ed35210ba1c3801e8a7d186adb99d9b9369c24eb2c9f4d41a352e33
3
+ metadata.gz: 0255347aa61c6f39bfec0f43a78b3cc3060bd20e4f80f1e39e0ff3714a52dff3
4
+ data.tar.gz: 822bc2fe118426d6d9c9437c85ead8e603a446cabd6bd49d0053c2b1cfaf3789
5
5
  SHA512:
6
- metadata.gz: d5049f8c464b5f6e6afd7567fcfe62d481c70b7db6d473f93a832763e4352c04b6d2cff3d3d03a452f82033f4220cb821f36152c003794c7adba89432a2b513a
7
- data.tar.gz: 631f8ab86e132e45c1b95b667d7789b870eab393293d62c7e1f77daf3cf3f9a5c7174e913fa0bc20ec92a87f88f278bee69f41c6b2c14d166b1745df71321d0b
6
+ metadata.gz: 031534a5eb015fa99d6ad161665b131677cadbe41ed1bce20357cb1ded7ba19e5f0bcbe37cfef0c8ad35cc2904fe83e4cc9d2b12d04260b970d24cc9aea64ba3
7
+ data.tar.gz: e7996262f4da21936567c1238df624220987ed04bf5aebd9a525da4d3f181ca752c1060056a5bb41b52c9cdb29e958cf7335973ac7076113278c7e8583755477
@@ -1,3 +1,7 @@
1
+ # v0.38.1
2
+
3
+ * Package configuration can be `shallow`, in case which only the initial entry into the package is recorded.
4
+
1
5
  # v0.37.2
2
6
  * Fix ParameterFilter deprecation warning.
3
7
 
data/README.md CHANGED
@@ -93,6 +93,9 @@ Each entry in the `packages` list is a YAML object which has the following keys:
93
93
  * **gem** As an alternative to specifying the path, specify the name of a dependency gem. When using `gem`, don't specify `path`.
94
94
  * **exclude** A list of files and directories which will be ignored. By default, all modules, classes and public
95
95
  functions are inspected.
96
+ * **shallow** When set to `true`, only the first function call entry into a package will be recorded. Subsequent function calls within
97
+ the same package are not recorded unless code execution leaves the package and re-enters it. Default: `true` when using `gem`,
98
+ `false` when using `path`.
96
99
 
97
100
  # Running
98
101
 
@@ -2,15 +2,22 @@
2
2
 
3
3
  module AppMap
4
4
  class Config
5
- Package = Struct.new(:path, :gem, :package_name, :exclude, :labels) do
5
+ Package = Struct.new(:path, :gem, :package_name, :exclude, :labels, :shallow) do
6
+ # Indicates that only the entry points to a package will be recorded.
7
+ # Once the code has entered a package, subsequent calls within the package will not be
8
+ # recorded unless the code leaves the package and re-enters it.
9
+ def shallow?
10
+ shallow
11
+ end
12
+
6
13
  class << self
7
- def build_from_path(path, package_name: nil, exclude: [], labels: [])
8
- Package.new(path, nil, package_name, exclude, labels)
14
+ def build_from_path(path, shallow: false, package_name: nil, exclude: [], labels: [])
15
+ Package.new(path, nil, package_name, exclude, labels, shallow)
9
16
  end
10
17
 
11
- def build_from_gem(gem, package_name: nil, exclude: [], labels: [])
18
+ def build_from_gem(gem, shallow: true, package_name: nil, exclude: [], labels: [])
12
19
  gem_paths(gem).map do |gem_path|
13
- Package.new(gem_path, gem, package_name, exclude, labels)
20
+ Package.new(gem_path, gem, package_name, exclude, labels, shallow)
14
21
  end
15
22
  end
16
23
 
@@ -36,7 +43,8 @@ module AppMap
36
43
  package_name: package_name,
37
44
  gem: gem,
38
45
  exclude: exclude.blank? ? nil : exclude,
39
- labels: labels.blank? ? nil : labels
46
+ labels: labels.blank? ? nil : labels,
47
+ shallow: shallow
40
48
  }.compact
41
49
  end
42
50
  end
@@ -49,7 +57,8 @@ module AppMap
49
57
  # Methods that should always be hooked, with their containing
50
58
  # package and labels that should be applied to them.
51
59
  HOOKED_METHODS = {
52
- 'ActiveSupport::SecurityUtils' => Hook.new(:secure_compare, Package.build_from_path('active_support', package_name: 'active_support', labels: %w[security crypto]))
60
+ 'ActiveSupport::SecurityUtils' => Hook.new(:secure_compare, Package.build_from_path('active_support', package_name: 'active_support', labels: %w[security crypto])),
61
+ 'ActionView::Renderer' => Hook.new(:render, Package.build_from_path('action_view', package_name: 'action_view', labels: %w[view]))
53
62
  }.freeze
54
63
 
55
64
  BUILTIN_METHODS = {
@@ -66,7 +75,7 @@ module AppMap
66
75
  'Marshal' => Hook.new(%i[dump load], Package.build_from_path('marshal', labels: %w[serialization marshal])),
67
76
  'Psych' => Hook.new(%i[dump dump_stream load load_stream parse parse_stream], Package.build_from_path('yaml', package_name: 'psych', labels: %w[serialization yaml])),
68
77
  'JSON::Ext::Parser' => Hook.new(:parse, Package.build_from_path('json', package_name: 'json', labels: %w[serialization json])),
69
- 'JSON::Ext::Generator::State' => Hook.new(:generate, Package.build_from_path('json', package_name: 'json', labels: %w[serialization json]))
78
+ 'JSON::Ext::Generator::State' => Hook.new(:generate, Package.build_from_path('json', package_name: 'json', labels: %w[serialization json])),
70
79
  }.freeze
71
80
 
72
81
  attr_reader :name, :packages
@@ -91,9 +100,12 @@ module AppMap
91
100
  raise 'AppMap package configuration should specify gem or path, not both' if gem && path
92
101
 
93
102
  if gem
94
- Package.build_from_gem(gem, exclude: package['exclude'] || [])
103
+ shallow = package['shallow']
104
+ # shallow is true by default for gems
105
+ shallow = true if shallow.nil?
106
+ Package.build_from_gem(gem, exclude: package['exclude'] || [], shallow: shallow)
95
107
  else
96
- [ Package.build_from_path(path, exclude: package['exclude'] || []) ]
108
+ [ Package.build_from_path(path, exclude: package['exclude'] || [], shallow: package['shallow']) ]
97
109
  end
98
110
  end.flatten
99
111
  Config.new config_data['name'], packages
@@ -39,6 +39,7 @@ module AppMap
39
39
  end
40
40
 
41
41
  defined_class = @defined_class
42
+ hook_package = self.hook_package
42
43
  hook_method = self.hook_method
43
44
  before_hook = self.method(:before_hook)
44
45
  after_hook = self.method(:after_hook)
@@ -48,29 +49,34 @@ module AppMap
48
49
  hook_class.instance_eval do
49
50
  hook_method_def = Proc.new do |*args, &block|
50
51
  instance_method = hook_method.bind(self).to_proc
52
+ call_instance_method = -> { instance_method.call(*args, &block) }
51
53
 
52
54
  # We may not have gotten the class for the method during
53
55
  # initialization (e.g. for a singleton method on an embedded
54
56
  # struct), so make sure we have it now.
55
- defined_class,_ = Hook.qualify_method_name(hook_method) unless defined_class
57
+ defined_class, = Hook.qualify_method_name(hook_method) unless defined_class
56
58
 
57
- hook_disabled = Thread.current[HOOK_DISABLE_KEY]
58
- enabled = true if !hook_disabled && AppMap.tracing.enabled?
59
- return instance_method.call(*args, &block) unless enabled
59
+ reentrant = Thread.current[HOOK_DISABLE_KEY]
60
+ disabled_by_shallow_flag = \
61
+ -> { hook_package&.shallow? && AppMap.tracing.last_package_for_current_thread == hook_package }
60
62
 
61
- call_event, start_time = with_disabled_hook.() do
62
- before_hook.(self, defined_class, args)
63
+ enabled = true if AppMap.tracing.enabled? && !reentrant && !disabled_by_shallow_flag.call
64
+
65
+ return call_instance_method.call unless enabled
66
+
67
+ call_event, start_time = with_disabled_hook.call do
68
+ before_hook.call(self, defined_class, args)
63
69
  end
64
70
  return_value = nil
65
71
  exception = nil
66
72
  begin
67
- return_value = instance_method.(*args, &block)
73
+ return_value = call_instance_method.call
68
74
  rescue
69
75
  exception = $ERROR_INFO
70
76
  raise
71
77
  ensure
72
- with_disabled_hook.() do
73
- after_hook.(self, call_event, start_time, return_value, exception)
78
+ with_disabled_hook.call do
79
+ after_hook.call(self, call_event, start_time, return_value, exception)
74
80
  end
75
81
  end
76
82
  end
@@ -87,7 +93,7 @@ module AppMap
87
93
  [ call_event, TIME_NOW.call ]
88
94
  end
89
95
 
90
- def after_hook(receiver, call_event, start_time, return_value, exception)
96
+ def after_hook(_receiver, call_event, start_time, return_value, exception)
91
97
  require 'appmap/event'
92
98
  elapsed = TIME_NOW.call - start_time
93
99
  return_event = \
@@ -95,12 +101,12 @@ module AppMap
95
101
  AppMap.tracing.record_event return_event
96
102
  end
97
103
 
98
- def with_disabled_hook(&fn)
104
+ def with_disabled_hook(&function)
99
105
  # Don't record functions, such as to_s and inspect, that might be called
100
106
  # by the fn. Otherwise there can be a stack overflow.
101
107
  Thread.current[HOOK_DISABLE_KEY] = true
102
108
  begin
103
- fn.call
109
+ function.call
104
110
  ensure
105
111
  Thread.current[HOOK_DISABLE_KEY] = false
106
112
  end
@@ -15,34 +15,38 @@ module AppMap
15
15
 
16
16
  class Tracing
17
17
  def initialize
18
- @tracing = []
18
+ @tracers = []
19
19
  end
20
20
 
21
21
  def empty?
22
- @tracing.empty?
22
+ @tracers.empty?
23
23
  end
24
24
 
25
25
  def trace(enable: true)
26
26
  Tracer.new.tap do |tracer|
27
- @tracing << tracer
27
+ @tracers << tracer
28
28
  tracer.enable if enable
29
29
  end
30
30
  end
31
31
 
32
32
  def enabled?
33
- @tracing.any?(&:enabled?)
33
+ @tracers.any?(&:enabled?)
34
+ end
35
+
36
+ def last_package_for_current_thread
37
+ @tracers.first&.last_package_for_current_thread
34
38
  end
35
39
 
36
40
  def record_event(event, package: nil, defined_class: nil, method: nil)
37
- @tracing.each do |tracer|
41
+ @tracers.each do |tracer|
38
42
  tracer.record_event(event, package: package, defined_class: defined_class, method: method)
39
43
  end
40
44
  end
41
45
 
42
46
  def delete(tracer)
43
- return unless @tracing.member?(tracer)
47
+ return unless @tracers.member?(tracer)
44
48
 
45
- @tracing.delete(tracer)
49
+ @tracers.delete(tracer)
46
50
  tracer.disable
47
51
  end
48
52
  end
@@ -52,6 +56,7 @@ module AppMap
52
56
  # Records the events which happen in a program.
53
57
  def initialize
54
58
  @events = []
59
+ @last_package_for_thread = {}
55
60
  @methods = Set.new
56
61
  @enabled = false
57
62
  end
@@ -75,11 +80,17 @@ module AppMap
75
80
  def record_event(event, package: nil, defined_class: nil, method: nil)
76
81
  return unless @enabled
77
82
 
83
+ @last_package_for_thread[Thread.current.object_id] = package if package
78
84
  @events << event
79
85
  @methods << Trace::ScopedMethod.new(package, defined_class, method, event.static) \
80
86
  if package && defined_class && method && (event.event == :call)
81
87
  end
82
88
 
89
+ # Gets the last package which was observed on the current thread.
90
+ def last_package_for_current_thread
91
+ @last_package_for_thread[Thread.current.object_id]
92
+ end
93
+
83
94
  # Gets a unique list of the methods that were invoked by the program.
84
95
  def event_methods
85
96
  @methods.to_a
@@ -3,7 +3,7 @@
3
3
  module AppMap
4
4
  URL = 'https://github.com/applandinc/appmap-ruby'
5
5
 
6
- VERSION = '0.37.2'
6
+ VERSION = '0.38.1'
7
7
 
8
8
  APPMAP_FORMAT_VERSION = '1.3'
9
9
  end
@@ -3,60 +3,65 @@ require 'rails_spec_helper'
3
3
  describe 'AbstractControllerBase' do
4
4
  shared_examples 'rails version' do |rails_major_version|
5
5
  include_context 'Rails app pg database', "spec/fixtures/rails#{rails_major_version}_users_app" do
6
- around(:each) do |example|
7
- FileUtils.rm_rf tmpdir
8
- FileUtils.mkdir_p tmpdir
9
- cmd = "docker-compose run --rm -e APPMAP=true -v #{File.absolute_path tmpdir}:/app/tmp app ./bin/rspec spec/controllers/users_controller_api_spec.rb:8"
6
+ def run_spec(spec_name)
7
+ cmd = "docker-compose run --rm -e APPMAP=true -v #{File.absolute_path tmpdir}:/app/tmp app ./bin/rspec #{spec_name}"
10
8
  run_cmd cmd, chdir: fixture_dir
9
+ end
11
10
 
12
- example.run
11
+ before do
12
+ FileUtils.rm_rf tmpdir
13
+ FileUtils.mkdir_p tmpdir
14
+ run_spec spec_name
13
15
  end
14
16
 
15
17
  let(:tmpdir) { 'tmp/spec/AbstractControllerBase' }
16
- let(:appmap_json) { File.join(tmpdir, 'appmap/rspec/Api_UsersController_POST_api_users_with_required_parameters_creates_a_user.appmap.json') }
17
18
 
18
19
  describe 'testing with rspec' do
19
- it 'inventory file is printed' do
20
- expect(File).to exist(File.join(tmpdir, 'appmap/rspec/Inventory.appmap.json'))
21
- end
20
+ let(:spec_name) { 'spec/controllers/users_controller_api_spec.rb:8' }
21
+ let(:appmap_json_file) { File.join(tmpdir, 'appmap/rspec/Api_UsersController_POST_api_users_with_required_parameters_creates_a_user.appmap.json') }
22
22
 
23
- it 'message fields are recorded in the appmap' do
24
- expect(File).to exist(appmap_json)
25
- appmap = JSON.parse(File.read(appmap_json)).to_yaml
23
+ describe 'creating a user' do
24
+ it 'inventory file is printed' do
25
+ expect(File).to exist(File.join(tmpdir, 'appmap/rspec/Inventory.appmap.json'))
26
+ end
26
27
 
27
- expect(appmap).to include(<<-MESSAGE.strip)
28
+ it 'message fields are recorded in the appmap' do
29
+ expect(File).to exist(appmap_json_file)
30
+ appmap = JSON.parse(File.read(appmap_json_file)).to_yaml
31
+
32
+ expect(appmap).to include(<<-MESSAGE.strip)
28
33
  message:
29
34
  - name: login
30
35
  class: String
31
36
  value: alice
32
37
  object_id:
33
- MESSAGE
38
+ MESSAGE
34
39
 
35
- expect(appmap).to include(<<-MESSAGE.strip)
40
+ expect(appmap).to include(<<-MESSAGE.strip)
36
41
  - name: password
37
42
  class: String
38
43
  value: "[FILTERED]"
39
44
  object_id:
40
- MESSAGE
45
+ MESSAGE
41
46
 
42
- expect(appmap).to include(<<-SERVER_REQUEST.strip)
47
+ expect(appmap).to include(<<-SERVER_REQUEST.strip)
43
48
  http_server_request:
44
49
  request_method: POST
45
50
  path_info: "/api/users"
46
- SERVER_REQUEST
51
+ SERVER_REQUEST
47
52
 
48
- expect(appmap).to include(<<-SERVER_RESPONSE.strip)
53
+ expect(appmap).to include(<<-SERVER_RESPONSE.strip)
49
54
  http_server_response:
50
55
  status: 201
51
56
  mime_type: application/json; charset=utf-8
52
- SERVER_RESPONSE
53
- end
57
+ SERVER_RESPONSE
58
+ end
54
59
 
55
- it 'properly captures method parameters in the appmap' do
56
- expect(File).to exist(appmap_json)
57
- appmap = JSON.parse(File.read(appmap_json)).to_yaml
60
+ it 'properly captures method parameters in the appmap' do
61
+ expect(File).to exist(appmap_json_file)
62
+ appmap = JSON.parse(File.read(appmap_json_file)).to_yaml
58
63
 
59
- expect(appmap).to match(<<-CREATE_CALL.strip)
64
+ expect(appmap).to match(<<-CREATE_CALL.strip)
60
65
  event: call
61
66
  thread_id: .*
62
67
  defined_class: Api::UsersController
@@ -71,19 +76,45 @@ describe 'AbstractControllerBase' do
71
76
  value: '{"login"=>"alice"}'
72
77
  kind: req
73
78
  receiver:
74
- CREATE_CALL
79
+ CREATE_CALL
80
+ end
81
+
82
+ it 'returns a minimal event' do
83
+ expect(File).to exist(appmap_json_file)
84
+ appmap = JSON.parse(File.read(appmap_json_file))
85
+ event = appmap['events'].find { |event| event['event'] == 'return' && event['return_value'] }
86
+ expect(event.keys).to eq(%w[id event thread_id parent_id elapsed return_value])
87
+ end
75
88
  end
76
89
 
77
- it 'returns a minimal event' do
78
- expect(File).to exist(appmap_json)
79
- appmap = JSON.parse(File.read(appmap_json))
80
- event = appmap['events'].find { |event| event['event'] == 'return' && event['return_value'] }
81
- expect(event.keys).to eq(%w[id event thread_id parent_id elapsed return_value])
90
+ describe 'listing users' do
91
+ let(:spec_name) { 'spec/controllers/users_controller_spec.rb:11' }
92
+ let(:appmap_json_file) { File.join(tmpdir, 'appmap/rspec/UsersController_GET_users_lists_the_users.appmap.json') }
93
+ it 'records and labels view rendering' do
94
+ expect(File).to exist(appmap_json_file)
95
+ appmap = JSON.parse(File.read(appmap_json_file)).to_yaml
96
+
97
+ expect(appmap).to match(<<-VIEW_CALL.strip)
98
+ event: call
99
+ thread_id: .*
100
+ defined_class: ActionView::Renderer
101
+ method_id: render
102
+ path: .*
103
+ lineno: .*
104
+ static: false
105
+ VIEW_CALL
106
+
107
+ expect(appmap).to match(<<-VIEW_LABEL.strip)
108
+ labels:
109
+ - view
110
+ VIEW_LABEL
111
+ end
82
112
  end
83
113
  end
84
114
  end
85
115
  end
86
116
 
87
- it_behaves_like 'rails version', '5'
88
- it_behaves_like 'rails version', '6'
117
+ %w[5 6].each do |version|
118
+ it_behaves_like 'rails version', version
119
+ end
89
120
  end
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
  git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
3
 
4
- gem 'rails', '~> 6'
4
+ gem 'rails', '~> 5'
5
5
 
6
6
  gem 'haml-rails'
7
7
 
@@ -1,3 +1,4 @@
1
1
  name: rails5_users_app
2
2
  packages:
3
3
  - path: app
4
+ - gem: sequel
@@ -21,7 +21,7 @@ RSpec.describe Api::UsersController, feature_group: 'Users', type: :controller,
21
21
  post :create, params: { login: 'alice' }
22
22
  end
23
23
  it 'lists the users' do
24
- post :index, params: {}
24
+ get :index, params: {}
25
25
  users = JSON.parse(response.body)
26
26
  expect(users.map { |r| r['login'] }).to include('alice')
27
27
  end
@@ -0,0 +1,16 @@
1
+ require 'rails_helper'
2
+ require 'rack/test'
3
+
4
+ RSpec.describe UsersController, type: :controller do
5
+ render_views
6
+
7
+ describe 'GET /users', feature: 'Show all users' do
8
+ before do
9
+ User.create login: 'alice'
10
+ end
11
+ it 'lists the users' do
12
+ get :index
13
+ expect(response).to be_ok
14
+ end
15
+ end
16
+ end
@@ -2,7 +2,7 @@ source 'https://rubygems.org'
2
2
  git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
3
 
4
4
  # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
5
- gem 'rails', '~> 5.2.3'
5
+ gem 'rails', '~> 6'
6
6
 
7
7
  gem 'haml-rails'
8
8
 
@@ -1,3 +1,5 @@
1
1
  name: rails6_users_app
2
2
  packages:
3
3
  - path: app
4
+ - gem: sequel
5
+
@@ -21,7 +21,7 @@ RSpec.describe Api::UsersController, feature_group: 'Users', type: :controller,
21
21
  post :create, params: { login: 'alice' }
22
22
  end
23
23
  it 'lists the users' do
24
- post :index, params: {}
24
+ get :index, params: {}
25
25
  users = JSON.parse(response.body)
26
26
  expect(users.map { |r| r['login'] }).to include('alice')
27
27
  end
@@ -0,0 +1,16 @@
1
+ require 'rails_helper'
2
+ require 'rack/test'
3
+
4
+ RSpec.describe UsersController, type: :controller do
5
+ render_views
6
+
7
+ describe 'GET /users', feature: 'Show all users' do
8
+ before do
9
+ User.create login: 'alice'
10
+ end
11
+ it 'lists the users' do
12
+ get :index
13
+ expect(response).to be_ok
14
+ end
15
+ end
16
+ end
@@ -52,9 +52,9 @@ describe 'AppMap class Hooking', docker: false do
52
52
 
53
53
  events = collect_events(tracer).to_yaml
54
54
 
55
- expect(Diffy::Diff.new(events_yaml, events).to_s).to eq('')
55
+ expect(Diffy::Diff.new(events_yaml, events).to_s).to eq('') if events_yaml
56
56
 
57
- [ config, tracer ]
57
+ [ config, tracer, events ]
58
58
  end
59
59
 
60
60
  after do
@@ -741,9 +741,33 @@ describe 'AppMap class Hooking', docker: false do
741
741
  :value: 'true'
742
742
  YAML
743
743
 
744
- test_hook_behavior 'spec/fixtures/hook/compare.rb', events_yaml do
744
+ _, _, events = test_hook_behavior 'spec/fixtures/hook/compare.rb', nil do
745
745
  expect(Compare.compare('string', 'string')).to be_truthy
746
746
  end
747
+ secure_compare_event = YAML.load(events).find { |evt| evt[:defined_class] == 'ActiveSupport::SecurityUtils' }
748
+ secure_compare_event.delete(:lineno)
749
+
750
+ expect(Diffy::Diff.new(<<~YAML, secure_compare_event.to_yaml).to_s).to eq('')
751
+ ---
752
+ :id: 2
753
+ :event: :call
754
+ :defined_class: ActiveSupport::SecurityUtils
755
+ :method_id: secure_compare
756
+ :path: lib/active_support/security_utils.rb
757
+ :static: true
758
+ :parameters:
759
+ - :name: :a
760
+ :class: String
761
+ :value: string
762
+ :kind: :req
763
+ - :name: :b
764
+ :class: String
765
+ :value: string
766
+ :kind: :req
767
+ :receiver:
768
+ :class: Module
769
+ :value: ActiveSupport::SecurityUtils
770
+ YAML
747
771
  end
748
772
 
749
773
  it 'gets labeled in the classmap' do
@@ -806,16 +830,14 @@ describe 'AppMap class Hooking', docker: false do
806
830
  - crypto
807
831
  YAML
808
832
 
809
- config, tracer = invoke_test_file 'spec/fixtures/hook/compare.rb' do
833
+ _, tracer = invoke_test_file 'spec/fixtures/hook/compare.rb' do
810
834
  expect(Compare.compare('string', 'string')).to be_truthy
811
835
  end
812
836
  cm = AppMap::Util.sanitize_paths(AppMap::ClassMap.build_from_methods(tracer.event_methods))
813
837
  entry = cm[1][:children][0][:children][0][:children][0]
814
838
  # Sanity check, make sure we got the right one
815
839
  expect(entry[:name]).to eq('secure_compare')
816
- spec = Gem::Specification.find_by_name('activesupport')
817
- entry[:location].gsub!(spec.base_dir + '/', '')
818
- expect(Diffy::Diff.new(classmap_yaml, cm.to_yaml).to_s).to eq('')
840
+ expect(entry[:labels]).to eq(%w[security crypto])
819
841
  end
820
842
  end
821
843
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appmap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.37.2
4
+ version: 0.38.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Gilpin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-19 00:00:00.000000000 Z
11
+ date: 2020-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -527,6 +527,7 @@ files:
527
527
  - spec/fixtures/rails5_users_app/log/.keep
528
528
  - spec/fixtures/rails5_users_app/public/robots.txt
529
529
  - spec/fixtures/rails5_users_app/spec/controllers/users_controller_api_spec.rb
530
+ - spec/fixtures/rails5_users_app/spec/controllers/users_controller_spec.rb
530
531
  - spec/fixtures/rails5_users_app/spec/models/user_spec.rb
531
532
  - spec/fixtures/rails5_users_app/spec/rails_helper.rb
532
533
  - spec/fixtures/rails5_users_app/spec/spec_helper.rb
@@ -598,6 +599,7 @@ files:
598
599
  - spec/fixtures/rails6_users_app/log/.keep
599
600
  - spec/fixtures/rails6_users_app/public/robots.txt
600
601
  - spec/fixtures/rails6_users_app/spec/controllers/users_controller_api_spec.rb
602
+ - spec/fixtures/rails6_users_app/spec/controllers/users_controller_spec.rb
601
603
  - spec/fixtures/rails6_users_app/spec/models/user_spec.rb
602
604
  - spec/fixtures/rails6_users_app/spec/rails_helper.rb
603
605
  - spec/fixtures/rails6_users_app/spec/spec_helper.rb