appmap 0.72.4 → 0.72.5

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: df8cfae5642145ffdf039e46a97b4dc2cf748e35658611237e4f8c86fcfdeb4b
4
- data.tar.gz: af8324a534ba90df3ba87467581936e3ce3109e67fcc1952fd3e25912b003be6
3
+ metadata.gz: e6b34c9af8d6d392be8211d9667daaccd2156c41a9c3c040bcdcfbfcbcba9332
4
+ data.tar.gz: 16bc9b9fe0a4288af913b3b6038ea4866913db72c0a49e5b91b11f08eebf06b0
5
5
  SHA512:
6
- metadata.gz: c8428c0343bb9a856d96fa332ca6217c9cabb518df36e48562f5855714ef6291c2b2ea7a14f7e8b5ea2a4a01ae3e1ac685a95e7889cca705ab451989c83f226b
7
- data.tar.gz: ea54394ee1feb68949a4b92764585a1e170ac35d0fd0b2fb5ef744a0499831f23d1e179f85110b21a7dec029ca0a4cb7258ad64f081fa5273423e6fe178bbbcb
6
+ metadata.gz: b5d3870cecadc652deb2c7dfa682d54e4ca166eb3ed8bd10df40d7d03a45f43dc1737190541c22a28e605207ab27925bd4ce2ea80fa67ab9e5d1090cfdeb253b
7
+ data.tar.gz: 3a2f3c10dec5548ad30a4ffb3c32ca94b1efcc3848fcb9b050a76f33bcb0b084d1f26a69c74269da77264c11f85b130fcdcce9c53c3a7bb52742301b864b251d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [0.72.5](https://github.com/applandinc/appmap-ruby/compare/v0.72.4...v0.72.5) (2022-02-17)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Override method accessors to provide the correct signature ([#223](https://github.com/applandinc/appmap-ruby/issues/223)) ([936bba4](https://github.com/applandinc/appmap-ruby/commit/936bba470c5360ee313e0b3e45a65d83acd0b53d))
7
+
1
8
  ## [0.72.4](https://github.com/applandinc/appmap-ruby/compare/v0.72.3...v0.72.4) (2022-02-17)
2
9
 
3
10
 
@@ -7,6 +7,23 @@ module AppMap
7
7
  end
8
8
 
9
9
  class Hook
10
+ SIGNATURES = {}
11
+
12
+ LOOKUP_SIGNATURE = lambda do |id|
13
+ method = super(id)
14
+
15
+ signature = SIGNATURES[[ method.owner, method.name ]]
16
+ if signature
17
+ method.singleton_class.module_eval do
18
+ define_method(:parameters) do
19
+ signature
20
+ end
21
+ end
22
+ end
23
+
24
+ method
25
+ end
26
+
10
27
  class Method
11
28
  attr_reader :hook_package, :hook_class, :hook_method
12
29
 
@@ -100,12 +117,10 @@ module AppMap
100
117
  hook_method_def = hook_method_def.ruby2_keywords if hook_method_def.respond_to?(:ruby2_keywords)
101
118
 
102
119
  hook_method_parameters = hook_method.parameters.dup.freeze
120
+ SIGNATURES[[ hook_class, hook_method.name ]] = hook_method_parameters
121
+
103
122
  hook_class.ancestors.first.tap do |cls|
104
123
  cls.define_method_with_arity(hook_method.name, hook_method.arity, hook_method_def)
105
- redefined_method = cls.instance_method(hook_method.name)
106
- redefined_method.singleton_class.module_eval do
107
- define_method(:parameters) { hook_method_parameters }
108
- end
109
124
  end
110
125
  end
111
126
 
@@ -136,4 +151,27 @@ module AppMap
136
151
  end
137
152
  end
138
153
  end
154
+
155
+ module ObjectMethods
156
+ define_method(:method, AppMap::Hook::LOOKUP_SIGNATURE)
157
+ define_method(:public_method, AppMap::Hook::LOOKUP_SIGNATURE)
158
+ define_method(:singleton_method, AppMap::Hook::LOOKUP_SIGNATURE)
159
+ end
160
+
161
+ module ModuleMethods
162
+ define_method(:instance_method, AppMap::Hook::LOOKUP_SIGNATURE)
163
+ define_method(:public_instance_method, AppMap::Hook::LOOKUP_SIGNATURE)
164
+ end
165
+ end
166
+
167
+ unless ENV['APPMAP_NO_PATCH_OBJECT'] == 'true'
168
+ class Object
169
+ prepend AppMap::ObjectMethods
170
+ end
171
+ end
172
+
173
+ unless ENV['APPMAP_NO_PATCH_MODULE'] == 'true'
174
+ class Module
175
+ prepend AppMap::ModuleMethods
176
+ end
139
177
  end
@@ -3,7 +3,7 @@
3
3
  module AppMap
4
4
  URL = 'https://github.com/applandinc/appmap-ruby'
5
5
 
6
- VERSION = '0.72.4'
6
+ VERSION = '0.72.5'
7
7
 
8
8
  APPMAP_FORMAT_VERSION = '1.5.1'
9
9
 
@@ -0,0 +1,8 @@
1
+
2
+ class ReportParameters
3
+ def to_s; self.class.name; end
4
+
5
+ def report_parameters(*args, kw1:, kw2: 'kw2', **kws)
6
+ method(:report_parameters).parameters
7
+ end
8
+ end
data/spec/hook_spec.rb CHANGED
@@ -225,6 +225,12 @@ describe 'AppMap class Hooking', docker: false do
225
225
  :value: default
226
226
  YAML
227
227
  test_hook_behavior 'spec/fixtures/hook/instance_method.rb', events_yaml do
228
+ expect(InstanceMethod.instance_method(:say_default).parameters).to eq([])
229
+ expect(InstanceMethod.public_instance_method(:say_default).parameters).to eq([])
230
+ expect(InstanceMethod.new.method(:say_default).parameters).to eq([])
231
+ expect(InstanceMethod.new.public_method(:say_default).parameters).to eq([])
232
+ expect { InstanceMethod.new.singleton_method(:say_default) }.to raise_error(NameError)
233
+
228
234
  expect(InstanceMethod.new.say_default).to eq('default')
229
235
  end
230
236
  end
@@ -315,7 +321,22 @@ describe 'AppMap class Hooking', docker: false do
315
321
  :class: String
316
322
  :value: protected
317
323
  YAML
324
+ parameters = []
318
325
  test_hook_behavior 'spec/fixtures/hook/protected_method.rb', events_yaml do
326
+ expect(ProtectedMethod.singleton_method(:call_protected).parameters).to eq(parameters)
327
+ expect(ProtectedMethod.instance_method(:call_protected).parameters).to eq(parameters)
328
+ expect(ProtectedMethod.public_instance_method(:call_protected).parameters).to eq(parameters)
329
+ expect(ProtectedMethod.new.method(:call_protected).parameters).to eq(parameters)
330
+ expect(ProtectedMethod.new.public_method(:call_protected).parameters).to eq(parameters)
331
+ expect { ProtectedMethod.new.singleton_method(:call_protected) }.to raise_error(NameError)
332
+
333
+ expect(ProtectedMethod.singleton_method(:protected_method).parameters).to eq(parameters)
334
+ expect(ProtectedMethod.instance_method(:protected_method).parameters).to eq(parameters)
335
+ expect(ProtectedMethod.public_instance_method(:protected_method).parameters).to eq(parameters)
336
+ expect(ProtectedMethod.new.method(:protected_method).parameters).to eq(parameters)
337
+ expect(ProtectedMethod.new.public_method(:protected_method).parameters).to eq(parameters)
338
+ expect { ProtectedMethod.new.singleton_method(:protected_method) }.to raise_error(NameError)
339
+
319
340
  expect(ProtectedMethod.new.call_protected).to eq('protected')
320
341
  end
321
342
  end
@@ -358,6 +379,7 @@ describe 'AppMap class Hooking', docker: false do
358
379
  :class: String
359
380
  :value: self.protected
360
381
  YAML
382
+ parameters = []
361
383
  test_hook_behavior 'spec/fixtures/hook/protected_method.rb', events_yaml do
362
384
  expect(ProtectedMethod.call_protected).to eq('self.protected')
363
385
  end
@@ -1100,6 +1122,51 @@ describe 'AppMap class Hooking', docker: false do
1100
1122
  end
1101
1123
  end
1102
1124
 
1125
+ it 'preserves the sighnature of hooked methods' do
1126
+ parameters = []
1127
+ events = <<~YAML
1128
+ ---
1129
+ - :id: 1
1130
+ :event: :call
1131
+ :defined_class: ReportParameters
1132
+ :method_id: report_parameters
1133
+ :path: spec/fixtures/hook/report_parameters.rb
1134
+ :lineno: 5
1135
+ :static: false
1136
+ :parameters:
1137
+ - :name: :args
1138
+ :class: Array
1139
+ :value: '["foo"]'
1140
+ :kind: :rest
1141
+ - :name: :kw1
1142
+ :class: String
1143
+ :value: kw1
1144
+ :kind: :keyreq
1145
+ - :name: :kw2
1146
+ :class: NilClass
1147
+ :value: null
1148
+ :kind: :key
1149
+ - :name: :kws
1150
+ :class: Hash
1151
+ :value: "{}"
1152
+ :kind: :keyrest
1153
+ :receiver:
1154
+ :class: ReportParameters
1155
+ :value: ReportParameters
1156
+ - :id: 2
1157
+ :event: :return
1158
+ :parent_id: 1
1159
+ :return_value:
1160
+ :class: Array
1161
+ :value: "[[:rest, :args], [:keyreq, :kw1], [:key, :kw2], [:keyrest, :kws]]"
1162
+ YAML
1163
+ parameters = [[:rest, :args], [:keyreq, :kw1], [:key, :kw2], [:keyrest, :kws]]
1164
+ test_hook_behavior 'spec/fixtures/hook/report_parameters.rb', events do
1165
+ expect(ReportParameters.instance_method(:report_parameters).parameters).to eq(parameters)
1166
+ expect(ReportParameters.new.report_parameters('foo', kw1: 'kw1')).to eq(parameters)
1167
+ end
1168
+ end
1169
+
1103
1170
  describe 'kwargs handling' do
1104
1171
  if ruby_2?
1105
1172
  # https://github.com/applandinc/appmap-ruby/issues/153
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appmap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.72.4
4
+ version: 0.72.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Gilpin
@@ -447,6 +447,7 @@ files:
447
447
  - spec/fixtures/hook/pkg_a/a.rb
448
448
  - spec/fixtures/hook/prepended_override.rb
449
449
  - spec/fixtures/hook/protected_method.rb
450
+ - spec/fixtures/hook/report_parameters.rb
450
451
  - spec/fixtures/hook/revoke_api_key.appmap.json
451
452
  - spec/fixtures/hook/singleton_method.rb
452
453
  - spec/fixtures/hook/spec/api_spec.rb