appmap 0.93.5 → 0.94.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/appmap/event.rb +6 -24
- data/lib/appmap/value_inspector.rb +49 -0
- data/lib/appmap/version.rb +2 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f15bcc9505431c7f47af59305eb18a7c8472f119396ab4cd2441114cbf95a0ca
|
4
|
+
data.tar.gz: affc5aaad8304d3a0e6b4f372934a1d38b9b6372ce2280d22a157d62c6156d8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe56e37f042cac25f53612f4489762e42cb02ce231270fac02dda746abf73ed3e79febfc60a30829b25e7c7d395bb14f01398c62226e28a0bf795af751e33aae
|
7
|
+
data.tar.gz: f045b85390e4a335f9d1b62cdcefb2f45466e2d24f9009b3a31b990cfed5ffafdd475166b93a73889209f8959d60d51dcf91f80a7835bcdcc2a01dfe659f1752
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# [0.94.0](https://github.com/getappmap/appmap-ruby/compare/v0.93.5...v0.94.0) (2022-11-22)
|
2
|
+
|
3
|
+
|
4
|
+
### Features
|
5
|
+
|
6
|
+
* Emit nested return_value.properties ([2c74c68](https://github.com/getappmap/appmap-ruby/commit/2c74c68f9e2a5bcb3f095850c9d520422b63e25f))
|
7
|
+
|
1
8
|
## [0.93.5](https://github.com/getappmap/appmap-ruby/compare/v0.93.4...v0.93.5) (2022-11-08)
|
2
9
|
|
3
10
|
|
data/lib/appmap/event.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'weakref'
|
4
|
+
require_relative './value_inspector'
|
4
5
|
|
5
6
|
module AppMap
|
6
7
|
module Event
|
@@ -20,6 +21,8 @@ module AppMap
|
|
20
21
|
MethodEventStruct = Struct.new(:id, :event, :thread_id)
|
21
22
|
|
22
23
|
class MethodEvent < MethodEventStruct
|
24
|
+
extend ValueInspector
|
25
|
+
|
23
26
|
MAX_ARRAY_ENUMERATION = 10
|
24
27
|
MAX_HASH_ENUMERATION = 10
|
25
28
|
MAX_STRING_LENGTH = 100
|
@@ -61,33 +64,12 @@ module AppMap
|
|
61
64
|
end
|
62
65
|
|
63
66
|
def add_size(param, value)
|
64
|
-
|
65
|
-
|
66
|
-
param[:size] = value.size
|
67
|
-
end
|
67
|
+
size = ValueInspector.detect_size(value)
|
68
|
+
param[:size] = size if size
|
68
69
|
end
|
69
70
|
|
70
71
|
def add_schema(param, value)
|
71
|
-
|
72
|
-
if value.respond_to?(:keys)
|
73
|
-
param[:properties] = value.keys.map { |key| { name: key, class: best_class_name(value[key]) } }
|
74
|
-
elsif value.respond_to?(:first) && value.first
|
75
|
-
if value.first != value
|
76
|
-
add_schema param, value.first
|
77
|
-
end
|
78
|
-
end
|
79
|
-
rescue
|
80
|
-
warn "Error in add_schema(#{value.class})", $!
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
# Heuristic for dynamically defined class whose name can be nil
|
85
|
-
def best_class_name(value)
|
86
|
-
value_cls = value.class
|
87
|
-
while value_cls && value_cls.name.nil?
|
88
|
-
value_cls = value_cls.superclass
|
89
|
-
end
|
90
|
-
value_cls&.name || 'unknown'
|
72
|
+
ValueInspector.detect_schema(value, type_info: param)
|
91
73
|
end
|
92
74
|
|
93
75
|
def encode_display_string(value)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module AppMap
|
2
|
+
module ValueInspector
|
3
|
+
extend self
|
4
|
+
|
5
|
+
MAX_DEPTH = 3
|
6
|
+
|
7
|
+
def detect_size(value)
|
8
|
+
# Don't risk calling #size on things like data-access objects, which can and will issue queries for this information.
|
9
|
+
if value.is_a?(Array) || value.is_a?(Hash)
|
10
|
+
value.size
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def detect_schema(value, max_depth: MAX_DEPTH, type_info: {}, observed_values: Set.new(), depth: 0)
|
15
|
+
return type_info if depth == max_depth
|
16
|
+
|
17
|
+
begin
|
18
|
+
if value.respond_to?(:keys)
|
19
|
+
properties = value.keys.select { |key| key != '' && !key.nil? }.map do |key|
|
20
|
+
next_value = value[key]
|
21
|
+
next if observed_values.include?(next_value)
|
22
|
+
|
23
|
+
observed_values << next_value
|
24
|
+
{ name: key, class: best_class_name(next_value) }.tap do |schema|
|
25
|
+
detect_schema(next_value, **{ max_depth: max_depth, type_info: schema, observed_values: observed_values, depth: depth + 1 })
|
26
|
+
end
|
27
|
+
end.compact
|
28
|
+
type_info[:properties] = properties unless properties.empty?
|
29
|
+
elsif value.respond_to?(:first) && !observed_values.include?(value.first)
|
30
|
+
observed_values << value.first
|
31
|
+
detect_schema(value.first, **{ max_depth: max_depth, type_info: type_info, observed_values: observed_values, depth: depth + 1 })
|
32
|
+
end
|
33
|
+
rescue
|
34
|
+
warn "Error in add_schema(#{value.class})", $!
|
35
|
+
raise
|
36
|
+
end
|
37
|
+
type_info
|
38
|
+
end
|
39
|
+
|
40
|
+
# Heuristic for dynamically defined class whose name can be nil
|
41
|
+
def best_class_name(value)
|
42
|
+
value_cls = value.class
|
43
|
+
while value_cls && value_cls.name.nil?
|
44
|
+
value_cls = value_cls.superclass
|
45
|
+
end
|
46
|
+
value_cls&.name || 'unknown'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/appmap/version.rb
CHANGED
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.94.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: 2022-11-
|
11
|
+
date: 2022-11-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: method_source
|
@@ -432,6 +432,7 @@ files:
|
|
432
432
|
- lib/appmap/swagger/stable.rb
|
433
433
|
- lib/appmap/trace.rb
|
434
434
|
- lib/appmap/util.rb
|
435
|
+
- lib/appmap/value_inspector.rb
|
435
436
|
- lib/appmap/version.rb
|
436
437
|
- package.json
|
437
438
|
- release.sh
|