appmap 0.35.2 → 0.36.0
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 +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +2 -0
- data/Rakefile +1 -1
- data/appmap.gemspec +1 -1
- data/appmap.yml +1 -7
- data/lib/appmap/class_map.rb +1 -1
- data/lib/appmap/config.rb +53 -21
- data/lib/appmap/railtie.rb +1 -1
- data/lib/appmap/version.rb +1 -1
- data/spec/hook_spec.rb +1 -1
- data/test/fixtures/gem_test/Gemfile +6 -0
- data/test/fixtures/gem_test/appmap.yml +3 -0
- data/test/fixtures/gem_test/test/to_param_test.rb +14 -0
- data/test/gem_test.rb +34 -0
- data/test/minitest_test.rb +2 -2
- data/test/openssl_test.rb +1 -1
- metadata +12 -9
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 102dab80f2d8cffd51fd1377583a1b063078cd77ab7ad4ffdcd20867a084b11b
|
4
|
+
data.tar.gz: cbb87144593416f84099cf8a9d8ac18f18d9763dce28277320ae6a99ff59ec58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a24e2ecb22a654d11e91ef28a7fdd961c178144f474a36e26c70e8e243bac18c13e3c5ff606f5ed2a058ddf6d98f9dbd0678a0f986ddfae4f18ed7524c27d41d
|
7
|
+
data.tar.gz: 712cb7e18026aa80135af7ce54a7a8c412362355c0eb6b151a0f05354cf991ebe9402e298d9646b9fab2e5d673d3338a773a0b1b1d0e1846ec3ed970074a1f77
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# v0.36.0
|
2
|
+
* *appmap.yml* package definition may specify `gem`.
|
3
|
+
* Skip loading the railtie if `APPMAP_INITIALIZE` environment variable
|
4
|
+
is set to `false`.
|
5
|
+
|
1
6
|
# v0.35.2
|
2
7
|
* Make sure `MethodEvent#display_string` works when the value's `#to_s` and/or `#inspect`
|
3
8
|
methods have problems.
|
data/README.md
CHANGED
@@ -76,6 +76,7 @@ name: MyProject
|
|
76
76
|
packages:
|
77
77
|
- path: app/controllers
|
78
78
|
- path: app/models
|
79
|
+
- gem: activerecord
|
79
80
|
```
|
80
81
|
|
81
82
|
* **name** Provides the project name (required)
|
@@ -87,6 +88,7 @@ Each entry in the `packages` list is a YAML object which has the following keys:
|
|
87
88
|
|
88
89
|
* **path** The path to the source code directory. The path may be relative to the current working directory, or it may
|
89
90
|
be an absolute path.
|
91
|
+
* **gem** As an alternative to specifying the path, specify the name of a dependency gem. When using `gem`, don't specify `path`.
|
90
92
|
* **exclude** A list of files and directories which will be ignored. By default, all modules, classes and public
|
91
93
|
functions are inspected.
|
92
94
|
|
data/Rakefile
CHANGED
@@ -113,7 +113,7 @@ namespace :spec do
|
|
113
113
|
desc ruby_version
|
114
114
|
task ruby_version, [:specs] => ["compile", "build:fixtures:#{ruby_version}:all"] do |_, task_args|
|
115
115
|
run_specs(ruby_version, task_args)
|
116
|
-
end.tap do|t|
|
116
|
+
end.tap do |t|
|
117
117
|
desc "Run all specs"
|
118
118
|
task :all, [:specs] => t
|
119
119
|
end
|
data/appmap.gemspec
CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_dependency 'parser'
|
31
31
|
spec.add_dependency 'rack'
|
32
32
|
|
33
|
-
spec.add_development_dependency 'bundler', '
|
33
|
+
spec.add_development_dependency 'bundler', '>= 1.16'
|
34
34
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
35
35
|
spec.add_development_dependency 'pry-byebug'
|
36
36
|
spec.add_development_dependency 'rake', '>= 12.3.3'
|
data/appmap.yml
CHANGED
data/lib/appmap/class_map.rb
CHANGED
data/lib/appmap/config.rb
CHANGED
@@ -2,15 +2,39 @@
|
|
2
2
|
|
3
3
|
module AppMap
|
4
4
|
class Config
|
5
|
-
Package = Struct.new(:path, :package_name, :exclude, :labels) do
|
6
|
-
|
7
|
-
|
5
|
+
Package = Struct.new(:path, :gem, :package_name, :exclude, :labels) do
|
6
|
+
class << self
|
7
|
+
def build_from_path(path, package_name: nil, exclude: [], labels: [])
|
8
|
+
Package.new(path, nil, package_name, exclude, labels)
|
9
|
+
end
|
10
|
+
|
11
|
+
def build_from_gem(gem, package_name: nil, exclude: [], labels: [])
|
12
|
+
gem_paths(gem).map do |gem_path|
|
13
|
+
Package.new(gem_path, gem, package_name, exclude, labels)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private_class_method :new
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
def gem_paths(gem)
|
22
|
+
gemspec = Gem.loaded_specs[gem] or raise "Gem #{gem.inspect} not found"
|
23
|
+
gemspec.source_paths.map do |path|
|
24
|
+
File.join(gemspec.gem_dir, path)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def name
|
30
|
+
gem || path
|
8
31
|
end
|
9
32
|
|
10
33
|
def to_h
|
11
34
|
{
|
12
35
|
path: path,
|
13
36
|
package_name: package_name,
|
37
|
+
gem: gem,
|
14
38
|
exclude: exclude.blank? ? nil : exclude,
|
15
39
|
labels: labels.blank? ? nil : labels
|
16
40
|
}.compact
|
@@ -20,29 +44,29 @@ module AppMap
|
|
20
44
|
Hook = Struct.new(:method_names, :package) do
|
21
45
|
end
|
22
46
|
|
23
|
-
|
47
|
+
OPENSSL_PACKAGES = Package.build_from_path('openssl', package_name: 'openssl', labels: %w[security crypto])
|
24
48
|
|
25
49
|
# Methods that should always be hooked, with their containing
|
26
50
|
# package and labels that should be applied to them.
|
27
51
|
HOOKED_METHODS = {
|
28
|
-
'ActiveSupport::SecurityUtils' => Hook.new(:secure_compare, Package.
|
52
|
+
'ActiveSupport::SecurityUtils' => Hook.new(:secure_compare, Package.build_from_path('active_support', package_name: 'active_support', labels: %w[security crypto]))
|
29
53
|
}.freeze
|
30
54
|
|
31
55
|
BUILTIN_METHODS = {
|
32
|
-
'OpenSSL::PKey::PKey' => Hook.new(:sign,
|
33
|
-
'Digest::Instance' => Hook.new(:digest,
|
34
|
-
'OpenSSL::X509::Request' => Hook.new(%i[sign verify],
|
35
|
-
'OpenSSL::PKCS5' => Hook.new(%i[pbkdf2_hmac_sha1 pbkdf2_hmac],
|
36
|
-
'OpenSSL::Cipher' => Hook.new(%i[encrypt decrypt final],
|
37
|
-
'OpenSSL::X509::Certificate' => Hook.new(:sign,
|
38
|
-
'Net::HTTP' => Hook.new(:request, Package.
|
39
|
-
'Net::SMTP' => Hook.new(:send, Package.
|
40
|
-
'Net::POP3' => Hook.new(:mails, Package.
|
41
|
-
'Net::IMAP' => Hook.new(:send_command, Package.
|
42
|
-
'Marshal' => Hook.new(%i[dump load], Package.
|
43
|
-
'Psych' => Hook.new(%i[dump dump_stream load load_stream parse parse_stream], Package.
|
44
|
-
'JSON::Ext::Parser' => Hook.new(:parse, Package.
|
45
|
-
'JSON::Ext::Generator::State' => Hook.new(:generate, Package.
|
56
|
+
'OpenSSL::PKey::PKey' => Hook.new(:sign, OPENSSL_PACKAGES),
|
57
|
+
'Digest::Instance' => Hook.new(:digest, OPENSSL_PACKAGES),
|
58
|
+
'OpenSSL::X509::Request' => Hook.new(%i[sign verify], OPENSSL_PACKAGES),
|
59
|
+
'OpenSSL::PKCS5' => Hook.new(%i[pbkdf2_hmac_sha1 pbkdf2_hmac], OPENSSL_PACKAGES),
|
60
|
+
'OpenSSL::Cipher' => Hook.new(%i[encrypt decrypt final], OPENSSL_PACKAGES),
|
61
|
+
'OpenSSL::X509::Certificate' => Hook.new(:sign, OPENSSL_PACKAGES),
|
62
|
+
'Net::HTTP' => Hook.new(:request, Package.build_from_path('net/http', package_name: 'net/http', labels: %w[http io])),
|
63
|
+
'Net::SMTP' => Hook.new(:send, Package.build_from_path('net/smtp', package_name: 'net/smtp', labels: %w[smtp email io])),
|
64
|
+
'Net::POP3' => Hook.new(:mails, Package.build_from_path('net/pop3', package_name: 'net/pop', labels: %w[pop pop3 email io])),
|
65
|
+
'Net::IMAP' => Hook.new(:send_command, Package.build_from_path('net/imap', package_name: 'net/imap', labels: %w[imap email io])),
|
66
|
+
'Marshal' => Hook.new(%i[dump load], Package.build_from_path('marshal', labels: %w[serialization marshal])),
|
67
|
+
'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
|
+
'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]))
|
46
70
|
}.freeze
|
47
71
|
|
48
72
|
attr_reader :name, :packages
|
@@ -62,8 +86,16 @@ module AppMap
|
|
62
86
|
# Loads configuration from a Hash.
|
63
87
|
def load(config_data)
|
64
88
|
packages = (config_data['packages'] || []).map do |package|
|
65
|
-
|
66
|
-
|
89
|
+
gem = package['gem']
|
90
|
+
path = package['path']
|
91
|
+
raise 'AppMap package configuration should specify gem or path, not both' if gem && path
|
92
|
+
|
93
|
+
if gem
|
94
|
+
Package.build_from_gem(gem, exclude: package['exclude'] || [])
|
95
|
+
else
|
96
|
+
[ Package.build_from_path(path, exclude: package['exclude'] || []) ]
|
97
|
+
end
|
98
|
+
end.flatten
|
67
99
|
Config.new config_data['name'], packages
|
68
100
|
end
|
69
101
|
end
|
data/lib/appmap/railtie.rb
CHANGED
data/lib/appmap/version.rb
CHANGED
data/spec/hook_spec.rb
CHANGED
@@ -27,7 +27,7 @@ describe 'AppMap class Hooking', docker: false do
|
|
27
27
|
|
28
28
|
def invoke_test_file(file, setup: nil, &block)
|
29
29
|
AppMap.configuration = nil
|
30
|
-
package = AppMap::Config::Package.
|
30
|
+
package = AppMap::Config::Package.build_from_path(file)
|
31
31
|
config = AppMap::Config.new('hook_spec', [ package ])
|
32
32
|
AppMap.configuration = config
|
33
33
|
tracer = nil
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'appmap/minitest'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require 'active_support'
|
7
|
+
require 'active_support/core_ext'
|
8
|
+
|
9
|
+
class ToParamTest < ::Minitest::Test
|
10
|
+
def test_to_param
|
11
|
+
# record use of a core extension
|
12
|
+
assert_equal 'my+id', 'my+id'.to_param
|
13
|
+
end
|
14
|
+
end
|
data/test/gem_test.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'test_helper'
|
5
|
+
require 'English'
|
6
|
+
|
7
|
+
class MinitestTest < Minitest::Test
|
8
|
+
def perform_gem_test(test_name)
|
9
|
+
Bundler.with_clean_env do
|
10
|
+
Dir.chdir 'test/fixtures/gem_test' do
|
11
|
+
FileUtils.rm_rf 'tmp'
|
12
|
+
system 'bundle config --local local.appmap ../../..'
|
13
|
+
system 'bundle'
|
14
|
+
system({ 'APPMAP' => 'true' }, %(bundle exec ruby -Ilib -Itest test/#{test_name}_test.rb))
|
15
|
+
|
16
|
+
yield
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_record_gem
|
22
|
+
perform_gem_test 'to_param' do
|
23
|
+
appmap_file = 'tmp/appmap/minitest/To_param_to_param.appmap.json'
|
24
|
+
appmap = JSON.parse(File.read(appmap_file))
|
25
|
+
events = appmap['events']
|
26
|
+
assert_equal 2, events.size
|
27
|
+
assert_equal 'call', events.first['event']
|
28
|
+
assert_equal 'to_param', events.first['method_id']
|
29
|
+
assert_equal "#{Gem.loaded_specs['activesupport'].gem_dir}/lib/active_support/core_ext/object/to_query.rb", events.first['path']
|
30
|
+
assert_equal 'return', events.second['event']
|
31
|
+
assert_equal 1, events.second['parent_id']
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/test/minitest_test.rb
CHANGED
@@ -5,7 +5,7 @@ require 'test_helper'
|
|
5
5
|
require 'English'
|
6
6
|
|
7
7
|
class MinitestTest < Minitest::Test
|
8
|
-
def
|
8
|
+
def perform_minitest_test(test_name)
|
9
9
|
Bundler.with_clean_env do
|
10
10
|
Dir.chdir 'test/fixtures/minitest_recorder' do
|
11
11
|
FileUtils.rm_rf 'tmp'
|
@@ -19,7 +19,7 @@ class MinitestTest < Minitest::Test
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_hello
|
22
|
-
|
22
|
+
perform_minitest_test 'hello' do
|
23
23
|
appmap_file = 'tmp/appmap/minitest/Hello_hello.appmap.json'
|
24
24
|
|
25
25
|
assert File.file?(appmap_file), 'appmap output file does not exist'
|
data/test/openssl_test.rb
CHANGED
@@ -11,7 +11,7 @@ class OpenSSLTest < Minitest::Test
|
|
11
11
|
FileUtils.rm_rf 'tmp'
|
12
12
|
system 'bundle config --local local.appmap ../../..'
|
13
13
|
system 'bundle'
|
14
|
-
system({ 'APPMAP' => 'true'
|
14
|
+
system({ 'APPMAP' => 'true' }, %(bundle exec ruby lib/openssl_#{test_name}.rb))
|
15
15
|
|
16
16
|
yield
|
17
17
|
end
|
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.
|
4
|
+
version: 0.36.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Gilpin
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-10-
|
11
|
+
date: 2020-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -84,14 +84,14 @@ dependencies:
|
|
84
84
|
name: bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '1.16'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '1.16'
|
97
97
|
- !ruby/object:Gem::Dependency
|
@@ -290,7 +290,7 @@ dependencies:
|
|
290
290
|
- - ">="
|
291
291
|
- !ruby/object:Gem::Version
|
292
292
|
version: '0'
|
293
|
-
description:
|
293
|
+
description:
|
294
294
|
email:
|
295
295
|
- kgilpin@gmail.com
|
296
296
|
executables:
|
@@ -303,7 +303,6 @@ files:
|
|
303
303
|
- ".gitignore"
|
304
304
|
- ".rbenv-gemsets"
|
305
305
|
- ".rubocop.yml"
|
306
|
-
- ".ruby-version"
|
307
306
|
- ".travis.yml"
|
308
307
|
- CHANGELOG.md
|
309
308
|
- Dockerfile.appmap
|
@@ -545,6 +544,9 @@ files:
|
|
545
544
|
- test/fixtures/cucumber_recorder/features/support/hooks.rb
|
546
545
|
- test/fixtures/cucumber_recorder/features/support/steps.rb
|
547
546
|
- test/fixtures/cucumber_recorder/lib/hello.rb
|
547
|
+
- test/fixtures/gem_test/Gemfile
|
548
|
+
- test/fixtures/gem_test/appmap.yml
|
549
|
+
- test/fixtures/gem_test/test/to_param_test.rb
|
548
550
|
- test/fixtures/minitest_recorder/Gemfile
|
549
551
|
- test/fixtures/minitest_recorder/appmap.yml
|
550
552
|
- test/fixtures/minitest_recorder/lib/hello.rb
|
@@ -562,6 +564,7 @@ files:
|
|
562
564
|
- test/fixtures/rspec_recorder/spec/decorated_hello_spec.rb
|
563
565
|
- test/fixtures/rspec_recorder/spec/labeled_hello_spec.rb
|
564
566
|
- test/fixtures/rspec_recorder/spec/plain_hello_spec.rb
|
567
|
+
- test/gem_test.rb
|
565
568
|
- test/minitest_test.rb
|
566
569
|
- test/openssl_test.rb
|
567
570
|
- test/record_process_test.rb
|
@@ -571,7 +574,7 @@ homepage: https://github.com/applandinc/appmap-ruby
|
|
571
574
|
licenses:
|
572
575
|
- MIT
|
573
576
|
metadata: {}
|
574
|
-
post_install_message:
|
577
|
+
post_install_message:
|
575
578
|
rdoc_options: []
|
576
579
|
require_paths:
|
577
580
|
- lib
|
@@ -587,7 +590,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
587
590
|
version: '0'
|
588
591
|
requirements: []
|
589
592
|
rubygems_version: 3.0.3
|
590
|
-
signing_key:
|
593
|
+
signing_key:
|
591
594
|
specification_version: 4
|
592
595
|
summary: Record the operation of a Ruby program, using the AppLand 'AppMap' format.
|
593
596
|
test_files: []
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.6.2
|