appmap 0.65.1 → 0.66.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 +8 -0
- data/lib/appmap/config.rb +27 -9
- data/lib/appmap/hook.rb +1 -1
- data/lib/appmap/util.rb +10 -0
- data/lib/appmap/version.rb +1 -1
- data/spec/config_spec.rb +28 -0
- data/spec/fixtures/rails5_users_app/appmap.yml +4 -0
- data/spec/fixtures/rails6_users_app/appmap.yml +4 -0
- data/spec/rails_recording_spec.rb +14 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1eecc28364d2832ecd593baed1c12a82d11bcd7f48945bebb59acd1d1830c254
|
4
|
+
data.tar.gz: ae096b7623cf2c59d9978b7d72676b797e2f7276adf2296d864434bea2a33605
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29f8d31824e2faf890cb35e895d5d165d5f083238f3a89aac00c95b8ac00289ca9647eaa4dc01a5b197f68f511f270a0d8f4f3fd6b4470be1d63df4cbda9274e
|
7
|
+
data.tar.gz: b59fc7043f6eb31af9680cccb104fb1dfe7f6370275b28f3ee4e7edc1070e85fd9828c2d681458b6812bc2feba323bb18508628ecdaea175d2e9947f06f48cba
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
# [0.66.0](https://github.com/applandinc/appmap-ruby/compare/v0.65.1...v0.66.0) (2021-09-28)
|
2
|
+
|
3
|
+
|
4
|
+
### Features
|
5
|
+
|
6
|
+
* Add option for explicit 'require' in function config ([1cf6c2a](https://github.com/applandinc/appmap-ruby/commit/1cf6c2aed8ee2d89c900f2959484b88b6fd3eb93))
|
7
|
+
* Builtin code such as Ruby Logger can be hooked via appmap.yml ([779c9e5](https://github.com/applandinc/appmap-ruby/commit/779c9e5e4177d58ea7b63e663e7c5a0810a78c60))
|
8
|
+
|
1
9
|
## [0.65.1](https://github.com/applandinc/appmap-ruby/compare/v0.65.0...v0.65.1) (2021-09-16)
|
2
10
|
|
3
11
|
|
data/lib/appmap/config.rb
CHANGED
@@ -117,13 +117,15 @@ module AppMap
|
|
117
117
|
# entry in appmap.yml. When the Config is initialized, each Function is converted into
|
118
118
|
# a Package and TargetMethods. It's called a Function rather than a Method, because Function
|
119
119
|
# is the AppMap terminology.
|
120
|
-
Function = Struct.new(:package, :cls, :labels, :function_names) do # :nodoc:
|
120
|
+
Function = Struct.new(:package, :cls, :labels, :function_names, :builtin, :package_name) do # :nodoc:
|
121
121
|
def to_h
|
122
122
|
{
|
123
123
|
package: package,
|
124
|
+
package_name: package_name,
|
124
125
|
class: cls,
|
125
126
|
labels: labels,
|
126
|
-
functions: function_names.map(&:to_sym)
|
127
|
+
functions: function_names.map(&:to_sym),
|
128
|
+
builtin: builtin
|
127
129
|
}.compact
|
128
130
|
end
|
129
131
|
end
|
@@ -244,7 +246,7 @@ module AppMap
|
|
244
246
|
@depends_config = depends_config
|
245
247
|
@hook_paths = Set.new(packages.map(&:path))
|
246
248
|
@exclude = exclude
|
247
|
-
@builtin_hooks = BUILTIN_HOOKS
|
249
|
+
@builtin_hooks = BUILTIN_HOOKS.dup
|
248
250
|
@functions = functions
|
249
251
|
|
250
252
|
@hooked_methods = METHOD_HOOKS.each_with_object(Hash.new { |h,k| h[k] = [] }) do |cls_target_methods, hooked_methods|
|
@@ -254,7 +256,15 @@ module AppMap
|
|
254
256
|
functions.each do |func|
|
255
257
|
package_options = {}
|
256
258
|
package_options[:labels] = func.labels if func.labels
|
257
|
-
|
259
|
+
package_options[:package_name] = func.package_name
|
260
|
+
package_options[:package_name] ||= func.package if func.builtin
|
261
|
+
hook = TargetMethods.new(func.function_names, Package.build_from_path(func.package, **package_options))
|
262
|
+
if func.builtin
|
263
|
+
@builtin_hooks[func.cls] ||= []
|
264
|
+
@builtin_hooks[func.cls] << hook
|
265
|
+
else
|
266
|
+
@hooked_methods[func.cls] << hook
|
267
|
+
end
|
258
268
|
end
|
259
269
|
|
260
270
|
@hooked_methods.each_value do |hooks|
|
@@ -300,6 +310,7 @@ module AppMap
|
|
300
310
|
MISSING_FILE_MSG
|
301
311
|
{}
|
302
312
|
end
|
313
|
+
|
303
314
|
load(config_data).tap do |config|
|
304
315
|
config_yaml = {
|
305
316
|
'name' => config.name,
|
@@ -324,15 +335,22 @@ module AppMap
|
|
324
335
|
|
325
336
|
if config_data['functions']
|
326
337
|
config_params[:functions] = config_data['functions'].map do |function_data|
|
327
|
-
|
328
|
-
cls =
|
329
|
-
|
330
|
-
|
338
|
+
function_name = function_data['name']
|
339
|
+
package, cls, functions = []
|
340
|
+
if function_name
|
341
|
+
package, cls, _, function = Util.parse_function_name(function_name)
|
342
|
+
functions = Array(function)
|
343
|
+
else
|
344
|
+
package = function_data['package']
|
345
|
+
cls = function_data['class']
|
346
|
+
functions = function_data['function'] || function_data['functions']
|
347
|
+
raise %q(AppMap config 'function' element should specify 'package', 'class' and 'function' or 'functions') unless package && cls && functions
|
348
|
+
end
|
331
349
|
|
332
350
|
functions = Array(functions).map(&:to_sym)
|
333
351
|
labels = function_data['label'] || function_data['labels']
|
334
352
|
labels = Array(labels).map(&:to_s) if labels
|
335
|
-
Function.new(package, cls, labels, functions)
|
353
|
+
Function.new(package, cls, labels, functions, function_data['builtin'], function_data['require'])
|
336
354
|
end
|
337
355
|
end
|
338
356
|
|
data/lib/appmap/hook.rb
CHANGED
@@ -89,7 +89,7 @@ module AppMap
|
|
89
89
|
|
90
90
|
config.builtin_hooks.each do |class_name, hooks|
|
91
91
|
Array(hooks).each do |hook|
|
92
|
-
require hook.package.package_name if hook.package.package_name
|
92
|
+
require hook.package.package_name if hook.package.package_name && hook.package.package_name != 'ruby'
|
93
93
|
Array(hook.method_names).each do |method_name|
|
94
94
|
method_name = method_name.to_sym
|
95
95
|
base_cls = class_from_string.(class_name)
|
data/lib/appmap/util.rb
CHANGED
@@ -21,6 +21,16 @@ module AppMap
|
|
21
21
|
WHITE = "\e[37m"
|
22
22
|
|
23
23
|
class << self
|
24
|
+
def parse_function_name(name)
|
25
|
+
package_tokens = name.split('/')
|
26
|
+
|
27
|
+
class_and_name = package_tokens.pop
|
28
|
+
class_name, function_name, static = class_and_name.include?('.') ? class_and_name.split('.', 2) + [ true ] : class_and_name.split('#', 2) + [ false ]
|
29
|
+
|
30
|
+
raise "Malformed fully-qualified function name #{name}" unless function_name
|
31
|
+
[ package_tokens.empty? ? 'ruby' : package_tokens.join('/'), class_name, static, function_name ]
|
32
|
+
end
|
33
|
+
|
24
34
|
# scenario_filename builds a suitable file name from a scenario name.
|
25
35
|
# Special characters are removed, and the file name is truncated to fit within
|
26
36
|
# shell limitations.
|
data/lib/appmap/version.rb
CHANGED
data/spec/config_spec.rb
CHANGED
@@ -55,6 +55,34 @@ describe AppMap::Config, docker: false do
|
|
55
55
|
expect(config.to_h.deep_stringify_keys!).to eq(config_expectation)
|
56
56
|
end
|
57
57
|
|
58
|
+
it 'interprets a function in canonical name format' do
|
59
|
+
config_data = {
|
60
|
+
name: 'test',
|
61
|
+
packages: [],
|
62
|
+
functions: [
|
63
|
+
{
|
64
|
+
name: 'pkg/cls#fn',
|
65
|
+
}
|
66
|
+
]
|
67
|
+
}.deep_stringify_keys!
|
68
|
+
config = AppMap::Config.load(config_data)
|
69
|
+
|
70
|
+
config_expectation = {
|
71
|
+
exclude: [],
|
72
|
+
name: 'test',
|
73
|
+
packages: [],
|
74
|
+
functions: [
|
75
|
+
{
|
76
|
+
package: 'pkg',
|
77
|
+
class: 'cls',
|
78
|
+
functions: [ :fn ],
|
79
|
+
}
|
80
|
+
]
|
81
|
+
}.deep_stringify_keys!
|
82
|
+
|
83
|
+
expect(config.to_h.deep_stringify_keys!).to eq(config_expectation)
|
84
|
+
end
|
85
|
+
|
58
86
|
context do
|
59
87
|
let(:warnings) { @warnings ||= [] }
|
60
88
|
let(:warning) { warnings.join }
|
@@ -1,7 +1,11 @@
|
|
1
1
|
require 'rails_spec_helper'
|
2
2
|
|
3
|
+
def default_rails_versions
|
4
|
+
ruby_2? ? [ 5, 6 ] : [ 6 ]
|
5
|
+
end
|
6
|
+
|
3
7
|
# Rails5 doesn't work with Ruby 3.x
|
4
|
-
RailsVersions =
|
8
|
+
RailsVersions = ENV['RAILS_VERSIONS'] || default_rails_versions
|
5
9
|
|
6
10
|
describe 'Rails' do
|
7
11
|
RailsVersions.each do |rails_major_version| # rubocop:disable Metrics/BlockLength
|
@@ -91,6 +95,15 @@ describe 'Rails' do
|
|
91
95
|
)
|
92
96
|
end
|
93
97
|
|
98
|
+
it 'captures log events' do
|
99
|
+
expect(events).to include hash_including(
|
100
|
+
'event' => 'call',
|
101
|
+
'defined_class' => 'Logger::LogDevice',
|
102
|
+
'method_id' => 'write',
|
103
|
+
'static' => false
|
104
|
+
)
|
105
|
+
end
|
106
|
+
|
94
107
|
context 'with an object-style message' do
|
95
108
|
let(:appmap_json_file) { 'Api_UsersController_POST_api_users_with_required_parameters_with_object-style_parameters_creates_a_user.appmap.json' }
|
96
109
|
|
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.66.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Gilpin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-09-
|
11
|
+
date: 2021-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|