scout_apm 5.8.0 → 6.0.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +2 -0
  3. data/CHANGELOG.markdown +14 -2
  4. data/README.markdown +20 -8
  5. data/gems/instruments.gemfile +1 -0
  6. data/lib/scout_apm/auto_instrument/instruction_sequence.rb +2 -1
  7. data/lib/scout_apm/auto_instrument/parser.rb +150 -2
  8. data/lib/scout_apm/auto_instrument/prism.rb +357 -0
  9. data/lib/scout_apm/auto_instrument/rails.rb +9 -155
  10. data/lib/scout_apm/auto_instrument/requirements.rb +11 -0
  11. data/lib/scout_apm/background_job_integrations/delayed_job.rb +15 -1
  12. data/lib/scout_apm/background_job_integrations/sidekiq.rb +89 -1
  13. data/lib/scout_apm/config.rb +32 -7
  14. data/lib/scout_apm/context.rb +3 -1
  15. data/lib/scout_apm/error_service/error_record.rb +1 -1
  16. data/lib/scout_apm/instrument_manager.rb +2 -0
  17. data/lib/scout_apm/instruments/http_client.rb +10 -0
  18. data/lib/scout_apm/instruments/httpx.rb +119 -0
  19. data/lib/scout_apm/instruments/opensearch.rb +131 -0
  20. data/lib/scout_apm/sampling.rb +25 -13
  21. data/lib/scout_apm/server_integrations/puma.rb +21 -4
  22. data/lib/scout_apm/version.rb +1 -1
  23. data/lib/scout_apm.rb +9 -3
  24. data/test/unit/auto_instrument/controller-ast.prism.txt +1015 -0
  25. data/test/unit/auto_instrument/controller-instrumented.rb +36 -11
  26. data/test/unit/auto_instrument/controller.rb +25 -0
  27. data/test/unit/auto_instrument/hash_shorthand_controller-instrumented.rb +28 -10
  28. data/test/unit/auto_instrument/hash_shorthand_controller.rb +19 -1
  29. data/test/unit/auto_instrument_test.rb +7 -1
  30. data/test/unit/background_job_integrations/sidekiq_test.rb +38 -0
  31. data/test/unit/config_test.rb +14 -0
  32. data/test/unit/error_service/error_buffer_test.rb +31 -0
  33. data/test/unit/error_test.rb +1 -1
  34. data/test/unit/ignored_uris_test.rb +7 -0
  35. data/test/unit/instruments/http_client_test.rb +0 -2
  36. data/test/unit/instruments/httpx_test.rb +78 -0
  37. data/test/unit/sampling_test.rb +10 -10
  38. metadata +8 -2
  39. /data/test/unit/auto_instrument/{controller-ast.txt → controller-ast.parser.txt} +0 -0
@@ -0,0 +1,1015 @@
1
+ @ ProgramNode (location: (2,0)-(74,3))
2
+ ├── flags: ∅
3
+ ├── locals: []
4
+ └── statements:
5
+ @ StatementsNode (location: (2,0)-(74,3))
6
+ ├── flags: ∅
7
+ └── body: (length: 1)
8
+ └── @ ClassNode (location: (2,0)-(74,3))
9
+ ├── flags: newline
10
+ ├── locals: []
11
+ ├── class_keyword_loc: (2,0)-(2,5) = "class"
12
+ ├── constant_path:
13
+ │ @ ConstantReadNode (location: (2,6)-(2,23))
14
+ │ ├── flags: ∅
15
+ │ └── name: :ClientsController
16
+ ├── inheritance_operator_loc: (2,24)-(2,25) = "<"
17
+ ├── superclass:
18
+ │ @ ConstantReadNode (location: (2,26)-(2,47))
19
+ │ ├── flags: ∅
20
+ │ └── name: :ApplicationController
21
+ ├── body:
22
+ │ @ StatementsNode (location: (3,2)-(73,5))
23
+ │ ├── flags: ∅
24
+ │ └── body: (length: 9)
25
+ │ ├── @ CallNode (location: (3,2)-(3,36))
26
+ │ │ ├── flags: newline, ignore_visibility
27
+ │ │ ├── receiver: ∅
28
+ │ │ ├── call_operator_loc: ∅
29
+ │ │ ├── name: :before_action
30
+ │ │ ├── message_loc: (3,2)-(3,15) = "before_action"
31
+ │ │ ├── opening_loc: ∅
32
+ │ │ ├── arguments:
33
+ │ │ │ @ ArgumentsNode (location: (3,16)-(3,36))
34
+ │ │ │ ├── flags: ∅
35
+ │ │ │ └── arguments: (length: 1)
36
+ │ │ │ └── @ SymbolNode (location: (3,16)-(3,36))
37
+ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding
38
+ │ │ │ ├── opening_loc: (3,16)-(3,17) = ":"
39
+ │ │ │ ├── value_loc: (3,17)-(3,36) = "check_authorization"
40
+ │ │ │ ├── closing_loc: ∅
41
+ │ │ │ └── unescaped: "check_authorization"
42
+ │ │ ├── closing_loc: ∅
43
+ │ │ └── block: ∅
44
+ │ ├── @ DefNode (location: (5,2)-(11,5))
45
+ │ │ ├── flags: newline
46
+ │ │ ├── name: :index
47
+ │ │ ├── name_loc: (5,6)-(5,11) = "index"
48
+ │ │ ├── receiver: ∅
49
+ │ │ ├── parameters: ∅
50
+ │ │ ├── body:
51
+ │ │ │ @ StatementsNode (location: (6,4)-(10,7))
52
+ │ │ │ ├── flags: ∅
53
+ │ │ │ └── body: (length: 1)
54
+ │ │ │ └── @ IfNode (location: (6,4)-(10,7))
55
+ │ │ │ ├── flags: newline
56
+ │ │ │ ├── if_keyword_loc: (6,4)-(6,6) = "if"
57
+ │ │ │ ├── predicate:
58
+ │ │ │ │ @ CallNode (location: (6,7)-(6,37))
59
+ │ │ │ │ ├── flags: ∅
60
+ │ │ │ │ ├── receiver:
61
+ │ │ │ │ │ @ CallNode (location: (6,7)-(6,22))
62
+ │ │ │ │ │ ├── flags: ∅
63
+ │ │ │ │ │ ├── receiver:
64
+ │ │ │ │ │ │ @ CallNode (location: (6,7)-(6,13))
65
+ │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility
66
+ │ │ │ │ │ │ ├── receiver: ∅
67
+ │ │ │ │ │ │ ├── call_operator_loc: ∅
68
+ │ │ │ │ │ │ ├── name: :params
69
+ │ │ │ │ │ │ ├── message_loc: (6,7)-(6,13) = "params"
70
+ │ │ │ │ │ │ ├── opening_loc: ∅
71
+ │ │ │ │ │ │ ├── arguments: ∅
72
+ │ │ │ │ │ │ ├── closing_loc: ∅
73
+ │ │ │ │ │ │ └── block: ∅
74
+ │ │ │ │ │ ├── call_operator_loc: ∅
75
+ │ │ │ │ │ ├── name: :[]
76
+ │ │ │ │ │ ├── message_loc: (6,13)-(6,22) = "[:status]"
77
+ │ │ │ │ │ ├── opening_loc: (6,13)-(6,14) = "["
78
+ │ │ │ │ │ ├── arguments:
79
+ │ │ │ │ │ │ @ ArgumentsNode (location: (6,14)-(6,21))
80
+ │ │ │ │ │ │ ├── flags: ∅
81
+ │ │ │ │ │ │ └── arguments: (length: 1)
82
+ │ │ │ │ │ │ └── @ SymbolNode (location: (6,14)-(6,21))
83
+ │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding
84
+ │ │ │ │ │ │ ├── opening_loc: (6,14)-(6,15) = ":"
85
+ │ │ │ │ │ │ ├── value_loc: (6,15)-(6,21) = "status"
86
+ │ │ │ │ │ │ ├── closing_loc: ∅
87
+ │ │ │ │ │ │ └── unescaped: "status"
88
+ │ │ │ │ │ ├── closing_loc: (6,21)-(6,22) = "]"
89
+ │ │ │ │ │ └── block: ∅
90
+ │ │ │ │ ├── call_operator_loc: ∅
91
+ │ │ │ │ ├── name: :==
92
+ │ │ │ │ ├── message_loc: (6,23)-(6,25) = "=="
93
+ │ │ │ │ ├── opening_loc: ∅
94
+ │ │ │ │ ├── arguments:
95
+ │ │ │ │ │ @ ArgumentsNode (location: (6,26)-(6,37))
96
+ │ │ │ │ │ ├── flags: ∅
97
+ │ │ │ │ │ └── arguments: (length: 1)
98
+ │ │ │ │ │ └── @ StringNode (location: (6,26)-(6,37))
99
+ │ │ │ │ │ ├── flags: ∅
100
+ │ │ │ │ │ ├── opening_loc: (6,26)-(6,27) = "\""
101
+ │ │ │ │ │ ├── content_loc: (6,27)-(6,36) = "activated"
102
+ │ │ │ │ │ ├── closing_loc: (6,36)-(6,37) = "\""
103
+ │ │ │ │ │ └── unescaped: "activated"
104
+ │ │ │ │ ├── closing_loc: ∅
105
+ │ │ │ │ └── block: ∅
106
+ │ │ │ ├── then_keyword_loc: ∅
107
+ │ │ │ ├── statements:
108
+ │ │ │ │ @ StatementsNode (location: (7,6)-(7,33))
109
+ │ │ │ │ ├── flags: ∅
110
+ │ │ │ │ └── body: (length: 1)
111
+ │ │ │ │ └── @ InstanceVariableWriteNode (location: (7,6)-(7,33))
112
+ │ │ │ │ ├── flags: newline
113
+ │ │ │ │ ├── name: :@clients
114
+ │ │ │ │ ├── name_loc: (7,6)-(7,14) = "@clients"
115
+ │ │ │ │ ├── value:
116
+ │ │ │ │ │ @ CallNode (location: (7,17)-(7,33))
117
+ │ │ │ │ │ ├── flags: ∅
118
+ │ │ │ │ │ ├── receiver:
119
+ │ │ │ │ │ │ @ ConstantReadNode (location: (7,17)-(7,23))
120
+ │ │ │ │ │ │ ├── flags: ∅
121
+ │ │ │ │ │ │ └── name: :Client
122
+ │ │ │ │ │ ├── call_operator_loc: (7,23)-(7,24) = "."
123
+ │ │ │ │ │ ├── name: :activated
124
+ │ │ │ │ │ ├── message_loc: (7,24)-(7,33) = "activated"
125
+ │ │ │ │ │ ├── opening_loc: ∅
126
+ │ │ │ │ │ ├── arguments: ∅
127
+ │ │ │ │ │ ├── closing_loc: ∅
128
+ │ │ │ │ │ └── block: ∅
129
+ │ │ │ │ └── operator_loc: (7,15)-(7,16) = "="
130
+ │ │ │ ├── subsequent:
131
+ │ │ │ │ @ ElseNode (location: (8,4)-(10,7))
132
+ │ │ │ │ ├── flags: ∅
133
+ │ │ │ │ ├── else_keyword_loc: (8,4)-(8,8) = "else"
134
+ │ │ │ │ ├── statements:
135
+ │ │ │ │ │ @ StatementsNode (location: (9,6)-(9,35))
136
+ │ │ │ │ │ ├── flags: ∅
137
+ │ │ │ │ │ └── body: (length: 1)
138
+ │ │ │ │ │ └── @ InstanceVariableWriteNode (location: (9,6)-(9,35))
139
+ │ │ │ │ │ ├── flags: newline
140
+ │ │ │ │ │ ├── name: :@clients
141
+ │ │ │ │ │ ├── name_loc: (9,6)-(9,14) = "@clients"
142
+ │ │ │ │ │ ├── value:
143
+ │ │ │ │ │ │ @ CallNode (location: (9,17)-(9,35))
144
+ │ │ │ │ │ │ ├── flags: ∅
145
+ │ │ │ │ │ │ ├── receiver:
146
+ │ │ │ │ │ │ │ @ ConstantReadNode (location: (9,17)-(9,23))
147
+ │ │ │ │ │ │ │ ├── flags: ∅
148
+ │ │ │ │ │ │ │ └── name: :Client
149
+ │ │ │ │ │ │ ├── call_operator_loc: (9,23)-(9,24) = "."
150
+ │ │ │ │ │ │ ├── name: :inactivated
151
+ │ │ │ │ │ │ ├── message_loc: (9,24)-(9,35) = "inactivated"
152
+ │ │ │ │ │ │ ├── opening_loc: ∅
153
+ │ │ │ │ │ │ ├── arguments: ∅
154
+ │ │ │ │ │ │ ├── closing_loc: ∅
155
+ │ │ │ │ │ │ └── block: ∅
156
+ │ │ │ │ │ └── operator_loc: (9,15)-(9,16) = "="
157
+ │ │ │ │ └── end_keyword_loc: (10,4)-(10,7) = "end"
158
+ │ │ │ └── end_keyword_loc: (10,4)-(10,7) = "end"
159
+ │ │ ├── locals: []
160
+ │ │ ├── def_keyword_loc: (5,2)-(5,5) = "def"
161
+ │ │ ├── operator_loc: ∅
162
+ │ │ ├── lparen_loc: ∅
163
+ │ │ ├── rparen_loc: ∅
164
+ │ │ ├── equal_loc: ∅
165
+ │ │ └── end_keyword_loc: (11,2)-(11,5) = "end"
166
+ │ ├── @ DefNode (location: (13,2)-(17,5))
167
+ │ │ ├── flags: newline
168
+ │ │ ├── name: :new
169
+ │ │ ├── name_loc: (13,6)-(13,9) = "new"
170
+ │ │ ├── receiver: ∅
171
+ │ │ ├── parameters: ∅
172
+ │ │ ├── body:
173
+ │ │ │ @ StatementsNode (location: (14,4)-(16,7))
174
+ │ │ │ ├── flags: ∅
175
+ │ │ │ └── body: (length: 1)
176
+ │ │ │ └── @ ForwardingSuperNode (location: (14,4)-(16,7))
177
+ │ │ │ ├── flags: newline
178
+ │ │ │ └── block:
179
+ │ │ │ @ BlockNode (location: (14,10)-(16,7))
180
+ │ │ │ ├── flags: ∅
181
+ │ │ │ ├── locals: [:something]
182
+ │ │ │ ├── parameters:
183
+ │ │ │ │ @ BlockParametersNode (location: (14,13)-(14,24))
184
+ │ │ │ │ ├── flags: ∅
185
+ │ │ │ │ ├── parameters:
186
+ │ │ │ │ │ @ ParametersNode (location: (14,14)-(14,23))
187
+ │ │ │ │ │ ├── flags: ∅
188
+ │ │ │ │ │ ├── requireds: (length: 1)
189
+ │ │ │ │ │ │ └── @ RequiredParameterNode (location: (14,14)-(14,23))
190
+ │ │ │ │ │ │ ├── flags: ∅
191
+ │ │ │ │ │ │ └── name: :something
192
+ │ │ │ │ │ ├── optionals: (length: 0)
193
+ │ │ │ │ │ ├── rest: ∅
194
+ │ │ │ │ │ ├── posts: (length: 0)
195
+ │ │ │ │ │ ├── keywords: (length: 0)
196
+ │ │ │ │ │ ├── keyword_rest: ∅
197
+ │ │ │ │ │ └── block: ∅
198
+ │ │ │ │ ├── locals: (length: 0)
199
+ │ │ │ │ ├── opening_loc: (14,13)-(14,14) = "|"
200
+ │ │ │ │ └── closing_loc: (14,23)-(14,24) = "|"
201
+ │ │ │ ├── body:
202
+ │ │ │ │ @ StatementsNode (location: (15,6)-(15,26))
203
+ │ │ │ │ ├── flags: ∅
204
+ │ │ │ │ └── body: (length: 1)
205
+ │ │ │ │ └── @ InstanceVariableWriteNode (location: (15,6)-(15,26))
206
+ │ │ │ │ ├── flags: newline
207
+ │ │ │ │ ├── name: :@client
208
+ │ │ │ │ ├── name_loc: (15,6)-(15,13) = "@client"
209
+ │ │ │ │ ├── value:
210
+ │ │ │ │ │ @ CallNode (location: (15,16)-(15,26))
211
+ │ │ │ │ │ ├── flags: ∅
212
+ │ │ │ │ │ ├── receiver:
213
+ │ │ │ │ │ │ @ ConstantReadNode (location: (15,16)-(15,22))
214
+ │ │ │ │ │ │ ├── flags: ∅
215
+ │ │ │ │ │ │ └── name: :Client
216
+ │ │ │ │ │ ├── call_operator_loc: (15,22)-(15,23) = "."
217
+ │ │ │ │ │ ├── name: :new
218
+ │ │ │ │ │ ├── message_loc: (15,23)-(15,26) = "new"
219
+ │ │ │ │ │ ├── opening_loc: ∅
220
+ │ │ │ │ │ ├── arguments: ∅
221
+ │ │ │ │ │ ├── closing_loc: ∅
222
+ │ │ │ │ │ └── block: ∅
223
+ │ │ │ │ └── operator_loc: (15,14)-(15,15) = "="
224
+ │ │ │ ├── opening_loc: (14,10)-(14,12) = "do"
225
+ │ │ │ └── closing_loc: (16,4)-(16,7) = "end"
226
+ │ │ ├── locals: []
227
+ │ │ ├── def_keyword_loc: (13,2)-(13,5) = "def"
228
+ │ │ ├── operator_loc: ∅
229
+ │ │ ├── lparen_loc: ∅
230
+ │ │ ├── rparen_loc: ∅
231
+ │ │ ├── equal_loc: ∅
232
+ │ │ └── end_keyword_loc: (17,2)-(17,5) = "end"
233
+ │ ├── @ DefNode (location: (19,2)-(28,5))
234
+ │ │ ├── flags: newline
235
+ │ │ ├── name: :create
236
+ │ │ ├── name_loc: (19,6)-(19,12) = "create"
237
+ │ │ ├── receiver: ∅
238
+ │ │ ├── parameters: ∅
239
+ │ │ ├── body:
240
+ │ │ │ @ StatementsNode (location: (20,4)-(27,7))
241
+ │ │ │ ├── flags: ∅
242
+ │ │ │ └── body: (length: 2)
243
+ │ │ │ ├── @ InstanceVariableWriteNode (location: (20,4)-(20,41))
244
+ │ │ │ │ ├── flags: newline
245
+ │ │ │ │ ├── name: :@client
246
+ │ │ │ │ ├── name_loc: (20,4)-(20,11) = "@client"
247
+ │ │ │ │ ├── value:
248
+ │ │ │ │ │ @ CallNode (location: (20,14)-(20,41))
249
+ │ │ │ │ │ ├── flags: ∅
250
+ │ │ │ │ │ ├── receiver:
251
+ │ │ │ │ │ │ @ ConstantReadNode (location: (20,14)-(20,20))
252
+ │ │ │ │ │ │ ├── flags: ∅
253
+ │ │ │ │ │ │ └── name: :Client
254
+ │ │ │ │ │ ├── call_operator_loc: (20,20)-(20,21) = "."
255
+ │ │ │ │ │ ├── name: :new
256
+ │ │ │ │ │ ├── message_loc: (20,21)-(20,24) = "new"
257
+ │ │ │ │ │ ├── opening_loc: (20,24)-(20,25) = "("
258
+ │ │ │ │ │ ├── arguments:
259
+ │ │ │ │ │ │ @ ArgumentsNode (location: (20,25)-(20,40))
260
+ │ │ │ │ │ │ ├── flags: ∅
261
+ │ │ │ │ │ │ └── arguments: (length: 1)
262
+ │ │ │ │ │ │ └── @ CallNode (location: (20,25)-(20,40))
263
+ │ │ │ │ │ │ ├── flags: ∅
264
+ │ │ │ │ │ │ ├── receiver:
265
+ │ │ │ │ │ │ │ @ CallNode (location: (20,25)-(20,31))
266
+ │ │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility
267
+ │ │ │ │ │ │ │ ├── receiver: ∅
268
+ │ │ │ │ │ │ │ ├── call_operator_loc: ∅
269
+ │ │ │ │ │ │ │ ├── name: :params
270
+ │ │ │ │ │ │ │ ├── message_loc: (20,25)-(20,31) = "params"
271
+ │ │ │ │ │ │ │ ├── opening_loc: ∅
272
+ │ │ │ │ │ │ │ ├── arguments: ∅
273
+ │ │ │ │ │ │ │ ├── closing_loc: ∅
274
+ │ │ │ │ │ │ │ └── block: ∅
275
+ │ │ │ │ │ │ ├── call_operator_loc: ∅
276
+ │ │ │ │ │ │ ├── name: :[]
277
+ │ │ │ │ │ │ ├── message_loc: (20,31)-(20,40) = "[:client]"
278
+ │ │ │ │ │ │ ├── opening_loc: (20,31)-(20,32) = "["
279
+ │ │ │ │ │ │ ├── arguments:
280
+ │ │ │ │ │ │ │ @ ArgumentsNode (location: (20,32)-(20,39))
281
+ │ │ │ │ │ │ │ ├── flags: ∅
282
+ │ │ │ │ │ │ │ └── arguments: (length: 1)
283
+ │ │ │ │ │ │ │ └── @ SymbolNode (location: (20,32)-(20,39))
284
+ │ │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding
285
+ │ │ │ │ │ │ │ ├── opening_loc: (20,32)-(20,33) = ":"
286
+ │ │ │ │ │ │ │ ├── value_loc: (20,33)-(20,39) = "client"
287
+ │ │ │ │ │ │ │ ├── closing_loc: ∅
288
+ │ │ │ │ │ │ │ └── unescaped: "client"
289
+ │ │ │ │ │ │ ├── closing_loc: (20,39)-(20,40) = "]"
290
+ │ │ │ │ │ │ └── block: ∅
291
+ │ │ │ │ │ ├── closing_loc: (20,40)-(20,41) = ")"
292
+ │ │ │ │ │ └── block: ∅
293
+ │ │ │ │ └── operator_loc: (20,12)-(20,13) = "="
294
+ │ │ │ └── @ IfNode (location: (21,4)-(27,7))
295
+ │ │ │ ├── flags: newline
296
+ │ │ │ ├── if_keyword_loc: (21,4)-(21,6) = "if"
297
+ │ │ │ ├── predicate:
298
+ │ │ │ │ @ CallNode (location: (21,7)-(21,19))
299
+ │ │ │ │ ├── flags: ∅
300
+ │ │ │ │ ├── receiver:
301
+ │ │ │ │ │ @ InstanceVariableReadNode (location: (21,7)-(21,14))
302
+ │ │ │ │ │ ├── flags: ∅
303
+ │ │ │ │ │ └── name: :@client
304
+ │ │ │ │ ├── call_operator_loc: (21,14)-(21,15) = "."
305
+ │ │ │ │ ├── name: :save
306
+ │ │ │ │ ├── message_loc: (21,15)-(21,19) = "save"
307
+ │ │ │ │ ├── opening_loc: ∅
308
+ │ │ │ │ ├── arguments: ∅
309
+ │ │ │ │ ├── closing_loc: ∅
310
+ │ │ │ │ └── block: ∅
311
+ │ │ │ ├── then_keyword_loc: ∅
312
+ │ │ │ ├── statements:
313
+ │ │ │ │ @ StatementsNode (location: (22,6)-(22,25))
314
+ │ │ │ │ ├── flags: ∅
315
+ │ │ │ │ └── body: (length: 1)
316
+ │ │ │ │ └── @ CallNode (location: (22,6)-(22,25))
317
+ │ │ │ │ ├── flags: newline, ignore_visibility
318
+ │ │ │ │ ├── receiver: ∅
319
+ │ │ │ │ ├── call_operator_loc: ∅
320
+ │ │ │ │ ├── name: :redirect_to
321
+ │ │ │ │ ├── message_loc: (22,6)-(22,17) = "redirect_to"
322
+ │ │ │ │ ├── opening_loc: ∅
323
+ │ │ │ │ ├── arguments:
324
+ │ │ │ │ │ @ ArgumentsNode (location: (22,18)-(22,25))
325
+ │ │ │ │ │ ├── flags: ∅
326
+ │ │ │ │ │ └── arguments: (length: 1)
327
+ │ │ │ │ │ └── @ InstanceVariableReadNode (location: (22,18)-(22,25))
328
+ │ │ │ │ │ ├── flags: ∅
329
+ │ │ │ │ │ └── name: :@client
330
+ │ │ │ │ ├── closing_loc: ∅
331
+ │ │ │ │ └── block: ∅
332
+ │ │ │ ├── subsequent:
333
+ │ │ │ │ @ ElseNode (location: (23,4)-(27,7))
334
+ │ │ │ │ ├── flags: ∅
335
+ │ │ │ │ ├── else_keyword_loc: (23,4)-(23,8) = "else"
336
+ │ │ │ │ ├── statements:
337
+ │ │ │ │ │ @ StatementsNode (location: (26,6)-(26,18))
338
+ │ │ │ │ │ ├── flags: ∅
339
+ │ │ │ │ │ └── body: (length: 1)
340
+ │ │ │ │ │ └── @ CallNode (location: (26,6)-(26,18))
341
+ │ │ │ │ │ ├── flags: newline, ignore_visibility
342
+ │ │ │ │ │ ├── receiver: ∅
343
+ │ │ │ │ │ ├── call_operator_loc: ∅
344
+ │ │ │ │ │ ├── name: :render
345
+ │ │ │ │ │ ├── message_loc: (26,6)-(26,12) = "render"
346
+ │ │ │ │ │ ├── opening_loc: ∅
347
+ │ │ │ │ │ ├── arguments:
348
+ │ │ │ │ │ │ @ ArgumentsNode (location: (26,13)-(26,18))
349
+ │ │ │ │ │ │ ├── flags: ∅
350
+ │ │ │ │ │ │ └── arguments: (length: 1)
351
+ │ │ │ │ │ │ └── @ StringNode (location: (26,13)-(26,18))
352
+ │ │ │ │ │ │ ├── flags: ∅
353
+ │ │ │ │ │ │ ├── opening_loc: (26,13)-(26,14) = "\""
354
+ │ │ │ │ │ │ ├── content_loc: (26,14)-(26,17) = "new"
355
+ │ │ │ │ │ │ ├── closing_loc: (26,17)-(26,18) = "\""
356
+ │ │ │ │ │ │ └── unescaped: "new"
357
+ │ │ │ │ │ ├── closing_loc: ∅
358
+ │ │ │ │ │ └── block: ∅
359
+ │ │ │ │ └── end_keyword_loc: (27,4)-(27,7) = "end"
360
+ │ │ │ └── end_keyword_loc: (27,4)-(27,7) = "end"
361
+ │ │ ├── locals: []
362
+ │ │ ├── def_keyword_loc: (19,2)-(19,5) = "def"
363
+ │ │ ├── operator_loc: ∅
364
+ │ │ ├── lparen_loc: ∅
365
+ │ │ ├── rparen_loc: ∅
366
+ │ │ ├── equal_loc: ∅
367
+ │ │ └── end_keyword_loc: (28,2)-(28,5) = "end"
368
+ │ ├── @ DefNode (location: (30,2)-(38,5))
369
+ │ │ ├── flags: newline
370
+ │ │ ├── name: :edit
371
+ │ │ ├── name_loc: (30,6)-(30,10) = "edit"
372
+ │ │ ├── receiver: ∅
373
+ │ │ ├── parameters: ∅
374
+ │ │ ├── body:
375
+ │ │ │ @ StatementsNode (location: (31,4)-(37,7))
376
+ │ │ │ ├── flags: ∅
377
+ │ │ │ └── body: (length: 2)
378
+ │ │ │ ├── @ InstanceVariableWriteNode (location: (31,4)-(31,41))
379
+ │ │ │ │ ├── flags: newline
380
+ │ │ │ │ ├── name: :@client
381
+ │ │ │ │ ├── name_loc: (31,4)-(31,11) = "@client"
382
+ │ │ │ │ ├── value:
383
+ │ │ │ │ │ @ CallNode (location: (31,14)-(31,41))
384
+ │ │ │ │ │ ├── flags: ∅
385
+ │ │ │ │ │ ├── receiver:
386
+ │ │ │ │ │ │ @ ConstantReadNode (location: (31,14)-(31,20))
387
+ │ │ │ │ │ │ ├── flags: ∅
388
+ │ │ │ │ │ │ └── name: :Client
389
+ │ │ │ │ │ ├── call_operator_loc: (31,20)-(31,21) = "."
390
+ │ │ │ │ │ ├── name: :new
391
+ │ │ │ │ │ ├── message_loc: (31,21)-(31,24) = "new"
392
+ │ │ │ │ │ ├── opening_loc: (31,24)-(31,25) = "("
393
+ │ │ │ │ │ ├── arguments:
394
+ │ │ │ │ │ │ @ ArgumentsNode (location: (31,25)-(31,40))
395
+ │ │ │ │ │ │ ├── flags: ∅
396
+ │ │ │ │ │ │ └── arguments: (length: 1)
397
+ │ │ │ │ │ │ └── @ CallNode (location: (31,25)-(31,40))
398
+ │ │ │ │ │ │ ├── flags: ∅
399
+ │ │ │ │ │ │ ├── receiver:
400
+ │ │ │ │ │ │ │ @ CallNode (location: (31,25)-(31,31))
401
+ │ │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility
402
+ │ │ │ │ │ │ │ ├── receiver: ∅
403
+ │ │ │ │ │ │ │ ├── call_operator_loc: ∅
404
+ │ │ │ │ │ │ │ ├── name: :params
405
+ │ │ │ │ │ │ │ ├── message_loc: (31,25)-(31,31) = "params"
406
+ │ │ │ │ │ │ │ ├── opening_loc: ∅
407
+ │ │ │ │ │ │ │ ├── arguments: ∅
408
+ │ │ │ │ │ │ │ ├── closing_loc: ∅
409
+ │ │ │ │ │ │ │ └── block: ∅
410
+ │ │ │ │ │ │ ├── call_operator_loc: ∅
411
+ │ │ │ │ │ │ ├── name: :[]
412
+ │ │ │ │ │ │ ├── message_loc: (31,31)-(31,40) = "[:client]"
413
+ │ │ │ │ │ │ ├── opening_loc: (31,31)-(31,32) = "["
414
+ │ │ │ │ │ │ ├── arguments:
415
+ │ │ │ │ │ │ │ @ ArgumentsNode (location: (31,32)-(31,39))
416
+ │ │ │ │ │ │ │ ├── flags: ∅
417
+ │ │ │ │ │ │ │ └── arguments: (length: 1)
418
+ │ │ │ │ │ │ │ └── @ SymbolNode (location: (31,32)-(31,39))
419
+ │ │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding
420
+ │ │ │ │ │ │ │ ├── opening_loc: (31,32)-(31,33) = ":"
421
+ │ │ │ │ │ │ │ ├── value_loc: (31,33)-(31,39) = "client"
422
+ │ │ │ │ │ │ │ ├── closing_loc: ∅
423
+ │ │ │ │ │ │ │ └── unescaped: "client"
424
+ │ │ │ │ │ │ ├── closing_loc: (31,39)-(31,40) = "]"
425
+ │ │ │ │ │ │ └── block: ∅
426
+ │ │ │ │ │ ├── closing_loc: (31,40)-(31,41) = ")"
427
+ │ │ │ │ │ └── block: ∅
428
+ │ │ │ │ └── operator_loc: (31,12)-(31,13) = "="
429
+ │ │ │ └── @ IfNode (location: (33,4)-(37,7))
430
+ │ │ │ ├── flags: newline
431
+ │ │ │ ├── if_keyword_loc: (33,4)-(33,6) = "if"
432
+ │ │ │ ├── predicate:
433
+ │ │ │ │ @ CallNode (location: (33,7)-(33,20))
434
+ │ │ │ │ ├── flags: ∅
435
+ │ │ │ │ ├── receiver:
436
+ │ │ │ │ │ @ CallNode (location: (33,7)-(33,14))
437
+ │ │ │ │ │ ├── flags: variable_call, ignore_visibility
438
+ │ │ │ │ │ ├── receiver: ∅
439
+ │ │ │ │ │ ├── call_operator_loc: ∅
440
+ │ │ │ │ │ ├── name: :request
441
+ │ │ │ │ │ ├── message_loc: (33,7)-(33,14) = "request"
442
+ │ │ │ │ │ ├── opening_loc: ∅
443
+ │ │ │ │ │ ├── arguments: ∅
444
+ │ │ │ │ │ ├── closing_loc: ∅
445
+ │ │ │ │ │ └── block: ∅
446
+ │ │ │ │ ├── call_operator_loc: (33,14)-(33,15) = "."
447
+ │ │ │ │ ├── name: :post?
448
+ │ │ │ │ ├── message_loc: (33,15)-(33,20) = "post?"
449
+ │ │ │ │ ├── opening_loc: ∅
450
+ │ │ │ │ ├── arguments: ∅
451
+ │ │ │ │ ├── closing_loc: ∅
452
+ │ │ │ │ └── block: ∅
453
+ │ │ │ ├── then_keyword_loc: ∅
454
+ │ │ │ ├── statements:
455
+ │ │ │ │ @ StatementsNode (location: (34,6)-(36,9))
456
+ │ │ │ │ ├── flags: ∅
457
+ │ │ │ │ └── body: (length: 1)
458
+ │ │ │ │ └── @ CallNode (location: (34,6)-(36,9))
459
+ │ │ │ │ ├── flags: newline
460
+ │ │ │ │ ├── receiver:
461
+ │ │ │ │ │ @ InstanceVariableReadNode (location: (34,6)-(34,13))
462
+ │ │ │ │ │ ├── flags: ∅
463
+ │ │ │ │ │ └── name: :@client
464
+ │ │ │ │ ├── call_operator_loc: (34,13)-(34,14) = "."
465
+ │ │ │ │ ├── name: :transaction
466
+ │ │ │ │ ├── message_loc: (34,14)-(34,25) = "transaction"
467
+ │ │ │ │ ├── opening_loc: ∅
468
+ │ │ │ │ ├── arguments: ∅
469
+ │ │ │ │ ├── closing_loc: ∅
470
+ │ │ │ │ └── block:
471
+ │ │ │ │ @ BlockNode (location: (34,26)-(36,9))
472
+ │ │ │ │ ├── flags: ∅
473
+ │ │ │ │ ├── locals: []
474
+ │ │ │ │ ├── parameters: ∅
475
+ │ │ │ │ ├── body:
476
+ │ │ │ │ │ @ StatementsNode (location: (35,8)-(35,50))
477
+ │ │ │ │ │ ├── flags: ∅
478
+ │ │ │ │ │ └── body: (length: 1)
479
+ │ │ │ │ │ └── @ CallNode (location: (35,8)-(35,50))
480
+ │ │ │ │ │ ├── flags: newline
481
+ │ │ │ │ │ ├── receiver:
482
+ │ │ │ │ │ │ @ InstanceVariableReadNode (location: (35,8)-(35,15))
483
+ │ │ │ │ │ │ ├── flags: ∅
484
+ │ │ │ │ │ │ └── name: :@client
485
+ │ │ │ │ │ ├── call_operator_loc: (35,15)-(35,16) = "."
486
+ │ │ │ │ │ ├── name: :update_attributes
487
+ │ │ │ │ │ ├── message_loc: (35,16)-(35,33) = "update_attributes"
488
+ │ │ │ │ │ ├── opening_loc: (35,33)-(35,34) = "("
489
+ │ │ │ │ │ ├── arguments:
490
+ │ │ │ │ │ │ @ ArgumentsNode (location: (35,34)-(35,49))
491
+ │ │ │ │ │ │ ├── flags: ∅
492
+ │ │ │ │ │ │ └── arguments: (length: 1)
493
+ │ │ │ │ │ │ └── @ CallNode (location: (35,34)-(35,49))
494
+ │ │ │ │ │ │ ├── flags: ∅
495
+ │ │ │ │ │ │ ├── receiver:
496
+ │ │ │ │ │ │ │ @ CallNode (location: (35,34)-(35,40))
497
+ │ │ │ │ │ │ │ ├── flags: variable_call, ignore_visibility
498
+ │ │ │ │ │ │ │ ├── receiver: ∅
499
+ │ │ │ │ │ │ │ ├── call_operator_loc: ∅
500
+ │ │ │ │ │ │ │ ├── name: :params
501
+ │ │ │ │ │ │ │ ├── message_loc: (35,34)-(35,40) = "params"
502
+ │ │ │ │ │ │ │ ├── opening_loc: ∅
503
+ │ │ │ │ │ │ │ ├── arguments: ∅
504
+ │ │ │ │ │ │ │ ├── closing_loc: ∅
505
+ │ │ │ │ │ │ │ └── block: ∅
506
+ │ │ │ │ │ │ ├── call_operator_loc: ∅
507
+ │ │ │ │ │ │ ├── name: :[]
508
+ │ │ │ │ │ │ ├── message_loc: (35,40)-(35,49) = "[:client]"
509
+ │ │ │ │ │ │ ├── opening_loc: (35,40)-(35,41) = "["
510
+ │ │ │ │ │ │ ├── arguments:
511
+ │ │ │ │ │ │ │ @ ArgumentsNode (location: (35,41)-(35,48))
512
+ │ │ │ │ │ │ │ ├── flags: ∅
513
+ │ │ │ │ │ │ │ └── arguments: (length: 1)
514
+ │ │ │ │ │ │ │ └── @ SymbolNode (location: (35,41)-(35,48))
515
+ │ │ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding
516
+ │ │ │ │ │ │ │ ├── opening_loc: (35,41)-(35,42) = ":"
517
+ │ │ │ │ │ │ │ ├── value_loc: (35,42)-(35,48) = "client"
518
+ │ │ │ │ │ │ │ ├── closing_loc: ∅
519
+ │ │ │ │ │ │ │ └── unescaped: "client"
520
+ │ │ │ │ │ │ ├── closing_loc: (35,48)-(35,49) = "]"
521
+ │ │ │ │ │ │ └── block: ∅
522
+ │ │ │ │ │ ├── closing_loc: (35,49)-(35,50) = ")"
523
+ │ │ │ │ │ └── block: ∅
524
+ │ │ │ │ ├── opening_loc: (34,26)-(34,28) = "do"
525
+ │ │ │ │ └── closing_loc: (36,6)-(36,9) = "end"
526
+ │ │ │ ├── subsequent: ∅
527
+ │ │ │ └── end_keyword_loc: (37,4)-(37,7) = "end"
528
+ │ │ ├── locals: []
529
+ │ │ ├── def_keyword_loc: (30,2)-(30,5) = "def"
530
+ │ │ ├── operator_loc: ∅
531
+ │ │ ├── lparen_loc: ∅
532
+ │ │ ├── rparen_loc: ∅
533
+ │ │ ├── equal_loc: ∅
534
+ │ │ └── end_keyword_loc: (38,2)-(38,5) = "end"
535
+ │ ├── @ DefNode (location: (40,2)-(48,5))
536
+ │ │ ├── flags: newline
537
+ │ │ ├── name: :data
538
+ │ │ ├── name_loc: (40,6)-(40,10) = "data"
539
+ │ │ ├── receiver: ∅
540
+ │ │ ├── parameters: ∅
541
+ │ │ ├── body:
542
+ │ │ │ @ StatementsNode (location: (41,4)-(47,103))
543
+ │ │ │ ├── flags: ∅
544
+ │ │ │ └── body: (length: 3)
545
+ │ │ │ ├── @ InstanceVariableWriteNode (location: (41,4)-(41,25))
546
+ │ │ │ │ ├── flags: newline
547
+ │ │ │ │ ├── name: :@clients
548
+ │ │ │ │ ├── name_loc: (41,4)-(41,12) = "@clients"
549
+ │ │ │ │ ├── value:
550
+ │ │ │ │ │ @ CallNode (location: (41,15)-(41,25))
551
+ │ │ │ │ │ ├── flags: ∅
552
+ │ │ │ │ │ ├── receiver:
553
+ │ │ │ │ │ │ @ ConstantReadNode (location: (41,15)-(41,21))
554
+ │ │ │ │ │ │ ├── flags: ∅
555
+ │ │ │ │ │ │ └── name: :Client
556
+ │ │ │ │ │ ├── call_operator_loc: (41,21)-(41,22) = "."
557
+ │ │ │ │ │ ├── name: :all
558
+ │ │ │ │ │ ├── message_loc: (41,22)-(41,25) = "all"
559
+ │ │ │ │ │ ├── opening_loc: ∅
560
+ │ │ │ │ │ ├── arguments: ∅
561
+ │ │ │ │ │ ├── closing_loc: ∅
562
+ │ │ │ │ │ └── block: ∅
563
+ │ │ │ │ └── operator_loc: (41,13)-(41,14) = "="
564
+ │ │ │ ├── @ LocalVariableWriteNode (location: (43,4)-(45,7))
565
+ │ │ │ │ ├── flags: newline
566
+ │ │ │ │ ├── name: :formatter
567
+ │ │ │ │ ├── depth: 0
568
+ │ │ │ │ ├── name_loc: (43,4)-(43,13) = "formatter"
569
+ │ │ │ │ ├── value:
570
+ │ │ │ │ │ @ CallNode (location: (43,16)-(45,7))
571
+ │ │ │ │ │ ├── flags: ignore_visibility
572
+ │ │ │ │ │ ├── receiver: ∅
573
+ │ │ │ │ │ ├── call_operator_loc: ∅
574
+ │ │ │ │ │ ├── name: :proc
575
+ │ │ │ │ │ ├── message_loc: (43,16)-(43,20) = "proc"
576
+ │ │ │ │ │ ├── opening_loc: ∅
577
+ │ │ │ │ │ ├── arguments: ∅
578
+ │ │ │ │ │ ├── closing_loc: ∅
579
+ │ │ │ │ │ └── block:
580
+ │ │ │ │ │ @ BlockNode (location: (43,21)-(45,7))
581
+ │ │ │ │ │ ├── flags: ∅
582
+ │ │ │ │ │ ├── locals: [:row]
583
+ │ │ │ │ │ ├── parameters:
584
+ │ │ │ │ │ │ @ BlockParametersNode (location: (43,24)-(43,29))
585
+ │ │ │ │ │ │ ├── flags: ∅
586
+ │ │ │ │ │ │ ├── parameters:
587
+ │ │ │ │ │ │ │ @ ParametersNode (location: (43,25)-(43,28))
588
+ │ │ │ │ │ │ │ ├── flags: ∅
589
+ │ │ │ │ │ │ │ ├── requireds: (length: 1)
590
+ │ │ │ │ │ │ │ │ └── @ RequiredParameterNode (location: (43,25)-(43,28))
591
+ │ │ │ │ │ │ │ │ ├── flags: ∅
592
+ │ │ │ │ │ │ │ │ └── name: :row
593
+ │ │ │ │ │ │ │ ├── optionals: (length: 0)
594
+ │ │ │ │ │ │ │ ├── rest: ∅
595
+ │ │ │ │ │ │ │ ├── posts: (length: 0)
596
+ │ │ │ │ │ │ │ ├── keywords: (length: 0)
597
+ │ │ │ │ │ │ │ ├── keyword_rest: ∅
598
+ │ │ │ │ │ │ │ └── block: ∅
599
+ │ │ │ │ │ │ ├── locals: (length: 0)
600
+ │ │ │ │ │ │ ├── opening_loc: (43,24)-(43,25) = "|"
601
+ │ │ │ │ │ │ └── closing_loc: (43,28)-(43,29) = "|"
602
+ │ │ │ │ │ ├── body:
603
+ │ │ │ │ │ │ @ StatementsNode (location: (44,6)-(44,17))
604
+ │ │ │ │ │ │ ├── flags: ∅
605
+ │ │ │ │ │ │ └── body: (length: 1)
606
+ │ │ │ │ │ │ └── @ CallNode (location: (44,6)-(44,17))
607
+ │ │ │ │ │ │ ├── flags: newline
608
+ │ │ │ │ │ │ ├── receiver:
609
+ │ │ │ │ │ │ │ @ LocalVariableReadNode (location: (44,6)-(44,9))
610
+ │ │ │ │ │ │ │ ├── flags: ∅
611
+ │ │ │ │ │ │ │ ├── name: :row
612
+ │ │ │ │ │ │ │ └── depth: 0
613
+ │ │ │ │ │ │ ├── call_operator_loc: (44,9)-(44,10) = "."
614
+ │ │ │ │ │ │ ├── name: :to_json
615
+ │ │ │ │ │ │ ├── message_loc: (44,10)-(44,17) = "to_json"
616
+ │ │ │ │ │ │ ├── opening_loc: ∅
617
+ │ │ │ │ │ │ ├── arguments: ∅
618
+ │ │ │ │ │ │ ├── closing_loc: ∅
619
+ │ │ │ │ │ │ └── block: ∅
620
+ │ │ │ │ │ ├── opening_loc: (43,21)-(43,23) = "do"
621
+ │ │ │ │ │ └── closing_loc: (45,4)-(45,7) = "end"
622
+ │ │ │ │ └── operator_loc: (43,14)-(43,15) = "="
623
+ │ │ │ └── @ CallNode (location: (47,4)-(47,103))
624
+ │ │ │ ├── flags: newline, ignore_visibility
625
+ │ │ │ ├── receiver: ∅
626
+ │ │ │ ├── call_operator_loc: ∅
627
+ │ │ │ ├── name: :respond_with
628
+ │ │ │ ├── message_loc: (47,4)-(47,16) = "respond_with"
629
+ │ │ │ ├── opening_loc: ∅
630
+ │ │ │ ├── arguments:
631
+ │ │ │ │ @ ArgumentsNode (location: (47,17)-(47,103))
632
+ │ │ │ │ ├── flags: contains_keywords
633
+ │ │ │ │ └── arguments: (length: 2)
634
+ │ │ │ │ ├── @ CallNode (location: (47,17)-(47,53))
635
+ │ │ │ │ │ ├── flags: ∅
636
+ │ │ │ │ │ ├── receiver:
637
+ │ │ │ │ │ │ @ CallNode (location: (47,17)-(47,42))
638
+ │ │ │ │ │ │ ├── flags: ∅
639
+ │ │ │ │ │ │ ├── receiver:
640
+ │ │ │ │ │ │ │ @ InstanceVariableReadNode (location: (47,17)-(47,25))
641
+ │ │ │ │ │ │ │ ├── flags: ∅
642
+ │ │ │ │ │ │ │ └── name: :@clients
643
+ │ │ │ │ │ │ ├── call_operator_loc: (47,25)-(47,26) = "."
644
+ │ │ │ │ │ │ ├── name: :each
645
+ │ │ │ │ │ │ ├── message_loc: (47,26)-(47,30) = "each"
646
+ │ │ │ │ │ │ ├── opening_loc: (47,30)-(47,31) = "("
647
+ │ │ │ │ │ │ ├── arguments: ∅
648
+ │ │ │ │ │ │ ├── closing_loc: (47,41)-(47,42) = ")"
649
+ │ │ │ │ │ │ └── block:
650
+ │ │ │ │ │ │ @ BlockArgumentNode (location: (47,31)-(47,41))
651
+ │ │ │ │ │ │ ├── flags: ∅
652
+ │ │ │ │ │ │ ├── expression:
653
+ │ │ │ │ │ │ │ @ LocalVariableReadNode (location: (47,32)-(47,41))
654
+ │ │ │ │ │ │ │ ├── flags: ∅
655
+ │ │ │ │ │ │ │ ├── name: :formatter
656
+ │ │ │ │ │ │ │ └── depth: 0
657
+ │ │ │ │ │ │ └── operator_loc: (47,31)-(47,32) = "&"
658
+ │ │ │ │ │ ├── call_operator_loc: (47,42)-(47,43) = "."
659
+ │ │ │ │ │ ├── name: :join
660
+ │ │ │ │ │ ├── message_loc: (47,43)-(47,47) = "join"
661
+ │ │ │ │ │ ├── opening_loc: (47,47)-(47,48) = "("
662
+ │ │ │ │ │ ├── arguments:
663
+ │ │ │ │ │ │ @ ArgumentsNode (location: (47,48)-(47,52))
664
+ │ │ │ │ │ │ ├── flags: ∅
665
+ │ │ │ │ │ │ └── arguments: (length: 1)
666
+ │ │ │ │ │ │ └── @ StringNode (location: (47,48)-(47,52))
667
+ │ │ │ │ │ │ ├── flags: ∅
668
+ │ │ │ │ │ │ ├── opening_loc: (47,48)-(47,49) = "\""
669
+ │ │ │ │ │ │ ├── content_loc: (47,49)-(47,51) = "\\n"
670
+ │ │ │ │ │ │ ├── closing_loc: (47,51)-(47,52) = "\""
671
+ │ │ │ │ │ │ └── unescaped: "\n"
672
+ │ │ │ │ │ ├── closing_loc: (47,52)-(47,53) = ")"
673
+ │ │ │ │ │ └── block: ∅
674
+ │ │ │ │ └── @ KeywordHashNode (location: (47,55)-(47,103))
675
+ │ │ │ │ ├── flags: symbol_keys
676
+ │ │ │ │ └── elements: (length: 1)
677
+ │ │ │ │ └── @ AssocNode (location: (47,55)-(47,103))
678
+ │ │ │ │ ├── flags: ∅
679
+ │ │ │ │ ├── key:
680
+ │ │ │ │ │ @ SymbolNode (location: (47,55)-(47,68))
681
+ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding
682
+ │ │ │ │ │ ├── opening_loc: (47,55)-(47,56) = ":"
683
+ │ │ │ │ │ ├── value_loc: (47,56)-(47,68) = "content_type"
684
+ │ │ │ │ │ ├── closing_loc: ∅
685
+ │ │ │ │ │ └── unescaped: "content_type"
686
+ │ │ │ │ ├── value:
687
+ │ │ │ │ │ @ StringNode (location: (47,72)-(47,103))
688
+ │ │ │ │ │ ├── flags: ∅
689
+ │ │ │ │ │ ├── opening_loc: (47,72)-(47,73) = "'"
690
+ │ │ │ │ │ ├── content_loc: (47,73)-(47,102) = "application/json; boundary=NL"
691
+ │ │ │ │ │ ├── closing_loc: (47,102)-(47,103) = "'"
692
+ │ │ │ │ │ └── unescaped: "application/json; boundary=NL"
693
+ │ │ │ │ └── operator_loc: (47,69)-(47,71) = "=>"
694
+ │ │ │ ├── closing_loc: ∅
695
+ │ │ │ └── block: ∅
696
+ │ │ ├── locals: [:formatter]
697
+ │ │ ├── def_keyword_loc: (40,2)-(40,5) = "def"
698
+ │ │ ├── operator_loc: ∅
699
+ │ │ ├── lparen_loc: ∅
700
+ │ │ ├── rparen_loc: ∅
701
+ │ │ ├── equal_loc: ∅
702
+ │ │ └── end_keyword_loc: (48,2)-(48,5) = "end"
703
+ │ ├── @ DefNode (location: (50,2)-(54,5))
704
+ │ │ ├── flags: newline
705
+ │ │ ├── name: :things
706
+ │ │ ├── name_loc: (50,6)-(50,12) = "things"
707
+ │ │ ├── receiver: ∅
708
+ │ │ ├── parameters: ∅
709
+ │ │ ├── body:
710
+ │ │ │ @ StatementsNode (location: (51,4)-(53,27))
711
+ │ │ │ ├── flags: ∅
712
+ │ │ │ └── body: (length: 3)
713
+ │ │ │ ├── @ LocalVariableWriteNode (location: (51,4)-(51,10))
714
+ │ │ │ │ ├── flags: newline
715
+ │ │ │ │ ├── name: :x
716
+ │ │ │ │ ├── depth: 0
717
+ │ │ │ │ ├── name_loc: (51,4)-(51,5) = "x"
718
+ │ │ │ │ ├── value:
719
+ │ │ │ │ │ @ HashNode (location: (51,8)-(51,10))
720
+ │ │ │ │ │ ├── flags: static_literal
721
+ │ │ │ │ │ ├── opening_loc: (51,8)-(51,9) = "{"
722
+ │ │ │ │ │ ├── elements: (length: 0)
723
+ │ │ │ │ │ └── closing_loc: (51,9)-(51,10) = "}"
724
+ │ │ │ │ └── operator_loc: (51,6)-(51,7) = "="
725
+ │ │ │ ├── @ IndexOrWriteNode (location: (52,4)-(52,22))
726
+ │ │ │ │ ├── flags: newline
727
+ │ │ │ │ ├── receiver:
728
+ │ │ │ │ │ @ LocalVariableReadNode (location: (52,4)-(52,5))
729
+ │ │ │ │ │ ├── flags: ∅
730
+ │ │ │ │ │ ├── name: :x
731
+ │ │ │ │ │ └── depth: 0
732
+ │ │ │ │ ├── call_operator_loc: ∅
733
+ │ │ │ │ ├── opening_loc: (52,5)-(52,6) = "["
734
+ │ │ │ │ ├── arguments:
735
+ │ │ │ │ │ @ ArgumentsNode (location: (52,6)-(52,11))
736
+ │ │ │ │ │ ├── flags: ∅
737
+ │ │ │ │ │ └── arguments: (length: 1)
738
+ │ │ │ │ │ └── @ SymbolNode (location: (52,6)-(52,11))
739
+ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding
740
+ │ │ │ │ │ ├── opening_loc: (52,6)-(52,7) = ":"
741
+ │ │ │ │ │ ├── value_loc: (52,7)-(52,11) = "this"
742
+ │ │ │ │ │ ├── closing_loc: ∅
743
+ │ │ │ │ │ └── unescaped: "this"
744
+ │ │ │ │ ├── closing_loc: (52,11)-(52,12) = "]"
745
+ │ │ │ │ ├── block: ∅
746
+ │ │ │ │ ├── operator_loc: (52,13)-(52,16) = "||="
747
+ │ │ │ │ └── value:
748
+ │ │ │ │ @ StringNode (location: (52,17)-(52,22))
749
+ │ │ │ │ ├── flags: ∅
750
+ │ │ │ │ ├── opening_loc: (52,17)-(52,18) = "'"
751
+ │ │ │ │ ├── content_loc: (52,18)-(52,21) = "foo"
752
+ │ │ │ │ ├── closing_loc: (52,21)-(52,22) = "'"
753
+ │ │ │ │ └── unescaped: "foo"
754
+ │ │ │ └── @ IndexAndWriteNode (location: (53,4)-(53,27))
755
+ │ │ │ ├── flags: newline
756
+ │ │ │ ├── receiver:
757
+ │ │ │ │ @ LocalVariableReadNode (location: (53,4)-(53,5))
758
+ │ │ │ │ ├── flags: ∅
759
+ │ │ │ │ ├── name: :x
760
+ │ │ │ │ └── depth: 0
761
+ │ │ │ ├── call_operator_loc: ∅
762
+ │ │ │ ├── opening_loc: (53,5)-(53,6) = "["
763
+ │ │ │ ├── arguments:
764
+ │ │ │ │ @ ArgumentsNode (location: (53,6)-(53,11))
765
+ │ │ │ │ ├── flags: ∅
766
+ │ │ │ │ └── arguments: (length: 1)
767
+ │ │ │ │ └── @ SymbolNode (location: (53,6)-(53,11))
768
+ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding
769
+ │ │ │ │ ├── opening_loc: (53,6)-(53,7) = ":"
770
+ │ │ │ │ ├── value_loc: (53,7)-(53,11) = "that"
771
+ │ │ │ │ ├── closing_loc: ∅
772
+ │ │ │ │ └── unescaped: "that"
773
+ │ │ │ ├── closing_loc: (53,11)-(53,12) = "]"
774
+ │ │ │ ├── block: ∅
775
+ │ │ │ ├── operator_loc: (53,13)-(53,16) = "&&="
776
+ │ │ │ └── value:
777
+ │ │ │ @ CallNode (location: (53,17)-(53,27))
778
+ │ │ │ ├── flags: ∅
779
+ │ │ │ ├── receiver:
780
+ │ │ │ │ @ StringNode (location: (53,17)-(53,22))
781
+ │ │ │ │ ├── flags: ∅
782
+ │ │ │ │ ├── opening_loc: (53,17)-(53,18) = "'"
783
+ │ │ │ │ ├── content_loc: (53,18)-(53,21) = "foo"
784
+ │ │ │ │ ├── closing_loc: (53,21)-(53,22) = "'"
785
+ │ │ │ │ └── unescaped: "foo"
786
+ │ │ │ ├── call_operator_loc: (53,22)-(53,23) = "."
787
+ │ │ │ ├── name: :size
788
+ │ │ │ ├── message_loc: (53,23)-(53,27) = "size"
789
+ │ │ │ ├── opening_loc: ∅
790
+ │ │ │ ├── arguments: ∅
791
+ │ │ │ ├── closing_loc: ∅
792
+ │ │ │ └── block: ∅
793
+ │ │ ├── locals: [:x]
794
+ │ │ ├── def_keyword_loc: (50,2)-(50,5) = "def"
795
+ │ │ ├── operator_loc: ∅
796
+ │ │ ├── lparen_loc: ∅
797
+ │ │ ├── rparen_loc: ∅
798
+ │ │ ├── equal_loc: ∅
799
+ │ │ └── end_keyword_loc: (54,2)-(54,5) = "end"
800
+ │ ├── @ DefNode (location: (56,2)-(69,5))
801
+ │ │ ├── flags: newline
802
+ │ │ ├── name: :do_something
803
+ │ │ ├── name_loc: (56,6)-(56,18) = "do_something"
804
+ │ │ ├── receiver: ∅
805
+ │ │ ├── parameters: ∅
806
+ │ │ ├── body:
807
+ │ │ │ @ StatementsNode (location: (57,4)-(68,7))
808
+ │ │ │ ├── flags: ∅
809
+ │ │ │ └── body: (length: 1)
810
+ │ │ │ └── @ CallNode (location: (57,4)-(68,7))
811
+ │ │ │ ├── flags: newline, ignore_visibility
812
+ │ │ │ ├── receiver: ∅
813
+ │ │ │ ├── call_operator_loc: ∅
814
+ │ │ │ ├── name: :wrap_call
815
+ │ │ │ ├── message_loc: (57,4)-(57,13) = "wrap_call"
816
+ │ │ │ ├── opening_loc: (57,13)-(57,14) = "("
817
+ │ │ │ ├── arguments:
818
+ │ │ │ │ @ ArgumentsNode (location: (57,14)-(58,51))
819
+ │ │ │ │ ├── flags: contains_keywords
820
+ │ │ │ │ └── arguments: (length: 2)
821
+ │ │ │ │ ├── @ StringNode (location: (57,14)-(57,19))
822
+ │ │ │ │ │ ├── flags: ∅
823
+ │ │ │ │ │ ├── opening_loc: (57,14)-(57,15) = "\""
824
+ │ │ │ │ │ ├── content_loc: (57,15)-(57,18) = "123"
825
+ │ │ │ │ │ ├── closing_loc: (57,18)-(57,19) = "\""
826
+ │ │ │ │ │ └── unescaped: "123"
827
+ │ │ │ │ └── @ KeywordHashNode (location: (58,14)-(58,51))
828
+ │ │ │ │ ├── flags: symbol_keys
829
+ │ │ │ │ └── elements: (length: 1)
830
+ │ │ │ │ └── @ AssocNode (location: (58,14)-(58,51))
831
+ │ │ │ │ ├── flags: ∅
832
+ │ │ │ │ ├── key:
833
+ │ │ │ │ │ @ SymbolNode (location: (58,14)-(58,24))
834
+ │ │ │ │ │ ├── flags: static_literal, forced_us_ascii_encoding
835
+ │ │ │ │ │ ├── opening_loc: ∅
836
+ │ │ │ │ │ ├── value_loc: (58,14)-(58,23) = "something"
837
+ │ │ │ │ │ ├── closing_loc: (58,23)-(58,24) = ":"
838
+ │ │ │ │ │ └── unescaped: "something"
839
+ │ │ │ │ ├── value:
840
+ │ │ │ │ │ @ LambdaNode (location: (58,25)-(58,51))
841
+ │ │ │ │ │ ├── flags: ∅
842
+ │ │ │ │ │ ├── locals: []
843
+ │ │ │ │ │ ├── operator_loc: (58,25)-(58,27) = "->"
844
+ │ │ │ │ │ ├── opening_loc: (58,28)-(58,29) = "{"
845
+ │ │ │ │ │ ├── closing_loc: (58,50)-(58,51) = "}"
846
+ │ │ │ │ │ ├── parameters: ∅
847
+ │ │ │ │ │ └── body:
848
+ │ │ │ │ │ @ StatementsNode (location: (58,30)-(58,49))
849
+ │ │ │ │ │ ├── flags: ∅
850
+ │ │ │ │ │ └── body: (length: 1)
851
+ │ │ │ │ │ └── @ CallNode (location: (58,30)-(58,49))
852
+ │ │ │ │ │ ├── flags: newline, ignore_visibility
853
+ │ │ │ │ │ ├── receiver: ∅
854
+ │ │ │ │ │ ├── call_operator_loc: ∅
855
+ │ │ │ │ │ ├── name: :puts
856
+ │ │ │ │ │ ├── message_loc: (58,30)-(58,34) = "puts"
857
+ │ │ │ │ │ ├── opening_loc: ∅
858
+ │ │ │ │ │ ├── arguments:
859
+ │ │ │ │ │ │ @ ArgumentsNode (location: (58,35)-(58,49))
860
+ │ │ │ │ │ │ ├── flags: ∅
861
+ │ │ │ │ │ │ └── arguments: (length: 1)
862
+ │ │ │ │ │ │ └── @ StringNode (location: (58,35)-(58,49))
863
+ │ │ │ │ │ │ ├── flags: ∅
864
+ │ │ │ │ │ │ ├── opening_loc: (58,35)-(58,36) = "\""
865
+ │ │ │ │ │ │ ├── content_loc: (58,36)-(58,48) = "Do something"
866
+ │ │ │ │ │ │ ├── closing_loc: (58,48)-(58,49) = "\""
867
+ │ │ │ │ │ │ └── unescaped: "Do something"
868
+ │ │ │ │ │ ├── closing_loc: ∅
869
+ │ │ │ │ │ └── block: ∅
870
+ │ │ │ │ └── operator_loc: ∅
871
+ │ │ │ ├── closing_loc: (59,12)-(59,13) = ")"
872
+ │ │ │ └── block:
873
+ │ │ │ @ BlockNode (location: (59,14)-(68,7))
874
+ │ │ │ ├── flags: ∅
875
+ │ │ │ ├── locals: [:raw_data, :payload]
876
+ │ │ │ ├── parameters: ∅
877
+ │ │ │ ├── body:
878
+ │ │ │ │ @ StatementsNode (location: (61,6)-(67,19))
879
+ │ │ │ │ ├── flags: ∅
880
+ │ │ │ │ └── body: (length: 2)
881
+ │ │ │ │ ├── @ LocalVariableWriteNode (location: (61,6)-(61,35))
882
+ │ │ │ │ │ ├── flags: newline
883
+ │ │ │ │ │ ├── name: :raw_data
884
+ │ │ │ │ │ ├── depth: 0
885
+ │ │ │ │ │ ├── name_loc: (61,6)-(61,14) = "raw_data"
886
+ │ │ │ │ │ ├── value:
887
+ │ │ │ │ │ │ @ StringNode (location: (61,17)-(61,35))
888
+ │ │ │ │ │ │ ├── flags: ∅
889
+ │ │ │ │ │ │ ├── opening_loc: (61,17)-(61,18) = "'"
890
+ │ │ │ │ │ │ ├── content_loc: (61,18)-(61,34) = "{ \"key\": \"123\" }"
891
+ │ │ │ │ │ │ ├── closing_loc: (61,34)-(61,35) = "'"
892
+ │ │ │ │ │ │ └── unescaped: "{ \"key\": \"123\" }"
893
+ │ │ │ │ │ └── operator_loc: (61,15)-(61,16) = "="
894
+ │ │ │ │ └── @ LocalVariableWriteNode (location: (63,6)-(67,19))
895
+ │ │ │ │ ├── flags: newline
896
+ │ │ │ │ ├── name: :payload
897
+ │ │ │ │ ├── depth: 0
898
+ │ │ │ │ ├── name_loc: (63,6)-(63,13) = "payload"
899
+ │ │ │ │ ├── value:
900
+ │ │ │ │ │ @ BeginNode (location: (63,16)-(67,19))
901
+ │ │ │ │ │ ├── flags: ∅
902
+ │ │ │ │ │ ├── begin_keyword_loc: (63,16)-(63,21) = "begin"
903
+ │ │ │ │ │ ├── statements:
904
+ │ │ │ │ │ │ @ StatementsNode (location: (64,18)-(64,40))
905
+ │ │ │ │ │ │ ├── flags: ∅
906
+ │ │ │ │ │ │ └── body: (length: 1)
907
+ │ │ │ │ │ │ └── @ CallNode (location: (64,18)-(64,40))
908
+ │ │ │ │ │ │ ├── flags: newline
909
+ │ │ │ │ │ │ ├── receiver:
910
+ │ │ │ │ │ │ │ @ ConstantReadNode (location: (64,18)-(64,25))
911
+ │ │ │ │ │ │ │ ├── flags: ∅
912
+ │ │ │ │ │ │ │ └── name: :Marshal
913
+ │ │ │ │ │ │ ├── call_operator_loc: (64,25)-(64,26) = "."
914
+ │ │ │ │ │ │ ├── name: :load
915
+ │ │ │ │ │ │ ├── message_loc: (64,26)-(64,30) = "load"
916
+ │ │ │ │ │ │ ├── opening_loc: (64,30)-(64,31) = "("
917
+ │ │ │ │ │ │ ├── arguments:
918
+ │ │ │ │ │ │ │ @ ArgumentsNode (location: (64,31)-(64,39))
919
+ │ │ │ │ │ │ │ ├── flags: ∅
920
+ │ │ │ │ │ │ │ └── arguments: (length: 1)
921
+ │ │ │ │ │ │ │ └── @ LocalVariableReadNode (location: (64,31)-(64,39))
922
+ │ │ │ │ │ │ │ ├── flags: ∅
923
+ │ │ │ │ │ │ │ ├── name: :raw_data
924
+ │ │ │ │ │ │ │ └── depth: 0
925
+ │ │ │ │ │ │ ├── closing_loc: (64,39)-(64,40) = ")"
926
+ │ │ │ │ │ │ └── block: ∅
927
+ │ │ │ │ │ ├── rescue_clause:
928
+ │ │ │ │ │ │ @ RescueNode (location: (65,16)-(66,64))
929
+ │ │ │ │ │ │ ├── flags: ∅
930
+ │ │ │ │ │ │ ├── keyword_loc: (65,16)-(65,22) = "rescue"
931
+ │ │ │ │ │ │ ├── exceptions: (length: 0)
932
+ │ │ │ │ │ │ ├── operator_loc: ∅
933
+ │ │ │ │ │ │ ├── reference: ∅
934
+ │ │ │ │ │ │ ├── then_keyword_loc: ∅
935
+ │ │ │ │ │ │ ├── statements:
936
+ │ │ │ │ │ │ │ @ StatementsNode (location: (66,18)-(66,64))
937
+ │ │ │ │ │ │ │ ├── flags: ∅
938
+ │ │ │ │ │ │ │ └── body: (length: 1)
939
+ │ │ │ │ │ │ │ └── @ CallNode (location: (66,18)-(66,64))
940
+ │ │ │ │ │ │ │ ├── flags: newline, ignore_visibility
941
+ │ │ │ │ │ │ │ ├── receiver: ∅
942
+ │ │ │ │ │ │ │ ├── call_operator_loc: ∅
943
+ │ │ │ │ │ │ │ ├── name: :puts
944
+ │ │ │ │ │ │ │ ├── message_loc: (66,18)-(66,22) = "puts"
945
+ │ │ │ │ │ │ │ ├── opening_loc: ∅
946
+ │ │ │ │ │ │ │ ├── arguments:
947
+ │ │ │ │ │ │ │ │ @ ArgumentsNode (location: (66,23)-(66,64))
948
+ │ │ │ │ │ │ │ │ ├── flags: ∅
949
+ │ │ │ │ │ │ │ │ └── arguments: (length: 1)
950
+ │ │ │ │ │ │ │ │ └── @ StringNode (location: (66,23)-(66,64))
951
+ │ │ │ │ │ │ │ │ ├── flags: ∅
952
+ │ │ │ │ │ │ │ │ ├── opening_loc: (66,23)-(66,24) = "'"
953
+ │ │ │ │ │ │ │ │ ├── content_loc: (66,24)-(66,63) = "Failed with bad/unhelpful error message"
954
+ │ │ │ │ │ │ │ │ ├── closing_loc: (66,63)-(66,64) = "'"
955
+ │ │ │ │ │ │ │ │ └── unescaped: "Failed with bad/unhelpful error message"
956
+ │ │ │ │ │ │ │ ├── closing_loc: ∅
957
+ │ │ │ │ │ │ │ └── block: ∅
958
+ │ │ │ │ │ │ └── subsequent: ∅
959
+ │ │ │ │ │ ├── else_clause: ∅
960
+ │ │ │ │ │ ├── ensure_clause: ∅
961
+ │ │ │ │ │ └── end_keyword_loc: (67,16)-(67,19) = "end"
962
+ │ │ │ │ └── operator_loc: (63,14)-(63,15) = "="
963
+ │ │ │ ├── opening_loc: (59,14)-(59,16) = "do"
964
+ │ │ │ └── closing_loc: (68,4)-(68,7) = "end"
965
+ │ │ ├── locals: []
966
+ │ │ ├── def_keyword_loc: (56,2)-(56,5) = "def"
967
+ │ │ ├── operator_loc: ∅
968
+ │ │ ├── lparen_loc: ∅
969
+ │ │ ├── rparen_loc: ∅
970
+ │ │ ├── equal_loc: ∅
971
+ │ │ └── end_keyword_loc: (69,2)-(69,5) = "end"
972
+ │ └── @ DefNode (location: (71,2)-(73,5))
973
+ │ ├── flags: newline
974
+ │ ├── name: :wrap_call
975
+ │ ├── name_loc: (71,6)-(71,15) = "wrap_call"
976
+ │ ├── receiver: ∅
977
+ │ ├── parameters:
978
+ │ │ @ ParametersNode (location: (71,16)-(71,31))
979
+ │ │ ├── flags: ∅
980
+ │ │ ├── requireds: (length: 0)
981
+ │ │ ├── optionals: (length: 0)
982
+ │ │ ├── rest:
983
+ │ │ │ @ RestParameterNode (location: (71,16)-(71,21))
984
+ │ │ │ ├── flags: ∅
985
+ │ │ │ ├── name: :args
986
+ │ │ │ ├── name_loc: (71,17)-(71,21) = "args"
987
+ │ │ │ └── operator_loc: (71,16)-(71,17) = "*"
988
+ │ │ ├── posts: (length: 0)
989
+ │ │ ├── keywords: (length: 0)
990
+ │ │ ├── keyword_rest:
991
+ │ │ │ @ KeywordRestParameterNode (location: (71,23)-(71,31))
992
+ │ │ │ ├── flags: ∅
993
+ │ │ │ ├── name: :kwargs
994
+ │ │ │ ├── name_loc: (71,25)-(71,31) = "kwargs"
995
+ │ │ │ └── operator_loc: (71,23)-(71,25) = "**"
996
+ │ │ └── block: ∅
997
+ │ ├── body:
998
+ │ │ @ StatementsNode (location: (72,4)-(72,9))
999
+ │ │ ├── flags: ∅
1000
+ │ │ └── body: (length: 1)
1001
+ │ │ └── @ YieldNode (location: (72,4)-(72,9))
1002
+ │ │ ├── flags: newline
1003
+ │ │ ├── keyword_loc: (72,4)-(72,9) = "yield"
1004
+ │ │ ├── lparen_loc: ∅
1005
+ │ │ ├── arguments: ∅
1006
+ │ │ └── rparen_loc: ∅
1007
+ │ ├── locals: [:args, :kwargs]
1008
+ │ ├── def_keyword_loc: (71,2)-(71,5) = "def"
1009
+ │ ├── operator_loc: ∅
1010
+ │ ├── lparen_loc: (71,15)-(71,16) = "("
1011
+ │ ├── rparen_loc: (71,31)-(71,32) = ")"
1012
+ │ ├── equal_loc: ∅
1013
+ │ └── end_keyword_loc: (73,2)-(73,5) = "end"
1014
+ ├── end_keyword_loc: (74,0)-(74,3) = "end"
1015
+ └── name: :ClientsController