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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e06f80a7364f75faaa0a8838b5053ea147349c3737b4072003aef809e6e2bbec
4
- data.tar.gz: 004e1d57ebe2a8c1aa718062cec50d1846526e12b6cd014b7780cbb636417500
3
+ metadata.gz: f15bcc9505431c7f47af59305eb18a7c8472f119396ab4cd2441114cbf95a0ca
4
+ data.tar.gz: affc5aaad8304d3a0e6b4f372934a1d38b9b6372ce2280d22a157d62c6156d8d
5
5
  SHA512:
6
- metadata.gz: 524637c14e1fb40dc5d8174af904adf7f5f72827d8c2c61689e612602d1d9a15464697ec65c207d295e7a9752af9bdaeedab26ff515e2db3f324bec4bc3de97a
7
- data.tar.gz: 2239720d8ede87ba270e57299dfd63842eee3e07d9426249d647cbcc48095ba6439d796f090b5ab55fd76ba62afd8c3117944db067180d5d0628c9e19fed30e5
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
- # Don't risk calling #size on things like data-access objects, which can and will issue queries for this information.
65
- if value.is_a?(Array) || value.is_a?(Hash)
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
- begin
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
@@ -3,9 +3,9 @@
3
3
  module AppMap
4
4
  URL = 'https://github.com/applandinc/appmap-ruby'
5
5
 
6
- VERSION = '0.93.5'
6
+ VERSION = '0.94.0'
7
7
 
8
- APPMAP_FORMAT_VERSION = '1.9.0'
8
+ APPMAP_FORMAT_VERSION = '1.10.0'
9
9
 
10
10
  SUPPORTED_RUBY_VERSIONS = %w[2.5 2.6 2.7 3.0 3.1].freeze
11
11
 
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.93.5
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-08 00:00:00.000000000 Z
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