roast-ai 1.0.2 → 1.2.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/.claude/commands/docs/write-comments.md +1 -1
- data/.rubocop.yml +12 -1
- data/Gemfile +2 -2
- data/Gemfile.lock +149 -34
- data/README.md +56 -3
- data/examples/agent_with_multiple_prompts.rb +27 -0
- data/examples/custom_logging.rb +4 -2
- data/examples/demo/Gemfile.lock +49 -15
- data/examples/plugin-gem-example/Gemfile.lock +19 -15
- data/examples/simple_chat.rb +1 -1
- data/examples/simple_pi_agent.rb +18 -0
- data/internal/rubocop/cop/roast/no_test_class_nesting.rb +126 -0
- data/internal/rubocop/rubocop-roast.yml +6 -0
- data/internal/workflows/maintenance/branch_docs_impact.rb +97 -0
- data/internal/workflows/maintenance/deprecated_models_docs_updater.rb +78 -0
- data/lib/roast/cog/config.rb +1 -1
- data/lib/roast/cog/output.rb +2 -1
- data/lib/roast/cog/registry.rb +3 -3
- data/lib/roast/cog_input_manager.rb +28 -7
- data/lib/roast/cogs/agent/config.rb +2 -2
- data/lib/roast/cogs/agent/input.rb +20 -22
- data/lib/roast/cogs/agent/providers/claude/claude_invocation.rb +13 -5
- data/lib/roast/cogs/agent/providers/claude/messages/result_message.rb +1 -1
- data/lib/roast/cogs/agent/providers/claude/tool_result.rb +344 -4
- data/lib/roast/cogs/agent/providers/claude/tool_use.rb +356 -1
- data/lib/roast/cogs/agent/providers/claude.rb +16 -3
- data/lib/roast/cogs/agent/providers/pi/messages/tool_call_message.rb +60 -0
- data/lib/roast/cogs/agent/providers/pi/messages/tool_result_message.rb +57 -0
- data/lib/roast/cogs/agent/providers/pi/pi_invocation.rb +352 -0
- data/lib/roast/cogs/agent/providers/pi.rb +41 -0
- data/lib/roast/cogs/agent/stats.rb +29 -0
- data/lib/roast/cogs/agent/usage.rb +22 -0
- data/lib/roast/cogs/agent.rb +5 -6
- data/lib/roast/cogs/chat/config.rb +28 -2
- data/lib/roast/cogs/chat.rb +82 -10
- data/lib/roast/event.rb +1 -0
- data/lib/roast/event_monitor.rb +35 -3
- data/lib/roast/log.rb +21 -0
- data/lib/roast/log_formatter.rb +9 -7
- data/lib/roast/version.rb +1 -1
- data/lib/roast.rb +1 -3
- data/roast-ai.gemspec +2 -1
- data/sorbet/rbi/gems/activesupport@8.0.2.rbi +549 -383
- data/sorbet/rbi/gems/addressable@2.8.7.rbi +46 -44
- data/sorbet/rbi/gems/ast@2.4.3.rbi +7 -6
- data/sorbet/rbi/gems/async@2.34.0.rbi +21 -3
- data/sorbet/rbi/gems/benchmark@0.4.1.rbi +7 -7
- data/sorbet/rbi/gems/bigdecimal@3.2.2.rbi +198 -1
- data/sorbet/rbi/gems/concurrent-ruby@1.3.5.rbi +405 -328
- data/sorbet/rbi/gems/console@1.34.2.rbi +2 -2
- data/sorbet/rbi/gems/docile@1.4.1.rbi +30 -30
- data/sorbet/rbi/gems/drb@2.2.3.rbi +25 -25
- data/sorbet/rbi/gems/erubi@1.13.1.rbi +2 -0
- data/sorbet/rbi/gems/faraday-net_http@3.4.2.rbi +2 -77
- data/sorbet/rbi/gems/faraday-retry@2.3.2.rbi +2 -57
- data/sorbet/rbi/gems/faraday@2.14.1.rbi +382 -75
- data/sorbet/rbi/gems/guard-compat@1.2.1.rbi +1 -110
- data/sorbet/rbi/gems/guard-minitest@2.4.6.rbi +0 -139
- data/sorbet/rbi/gems/guard@2.19.1.rbi +38 -38
- data/sorbet/rbi/gems/hashdiff@1.2.0.rbi +3 -3
- data/sorbet/rbi/gems/i18n@1.14.7.rbi +53 -29
- data/sorbet/rbi/gems/io-event@1.14.0.rbi +67 -10
- data/sorbet/rbi/gems/json@2.18.1.rbi +227 -5
- data/sorbet/rbi/gems/lint_roller@1.1.0.rbi +83 -0
- data/sorbet/rbi/gems/listen@3.9.0.rbi +7 -7
- data/sorbet/rbi/gems/logger@1.7.0.rbi +3 -3
- data/sorbet/rbi/gems/lumberjack@1.2.10.rbi +21 -21
- data/sorbet/rbi/gems/marcel@1.1.0.rbi +1 -1
- data/sorbet/rbi/gems/minitest-rg@5.3.0.rbi +0 -96
- data/sorbet/rbi/gems/minitest@5.25.5.rbi +1 -16
- data/sorbet/rbi/gems/net-http@0.9.1.rbi +27 -19
- data/sorbet/rbi/gems/netrc@0.11.0.rbi +18 -0
- data/sorbet/rbi/gems/notiffany@0.1.3.rbi +20 -20
- data/sorbet/rbi/gems/ostruct@0.6.2.rbi +149 -15
- data/sorbet/rbi/gems/parser@3.3.8.0.rbi +141 -139
- data/sorbet/rbi/gems/prism@1.4.0.rbi +922 -864
- data/sorbet/rbi/gems/public_suffix@6.0.2.rbi +56 -35
- data/sorbet/rbi/gems/racc@1.8.1.rbi +10 -2
- data/sorbet/rbi/gems/rainbow@3.1.1.rbi +12 -12
- data/sorbet/rbi/gems/rake@13.3.0.rbi +219 -318
- data/sorbet/rbi/gems/{rbi@0.3.6.rbi → rbi@0.3.9.rbi} +612 -2267
- data/sorbet/rbi/gems/{rbs@3.9.4.rbi → rbs@4.0.0.dev.5.rbi} +2013 -680
- data/sorbet/rbi/gems/regexp_parser@2.10.0.rbi +151 -113
- data/sorbet/rbi/gems/require-hooks@0.2.3.rbi +110 -0
- data/sorbet/rbi/gems/rexml@3.4.2.rbi +24 -51
- data/sorbet/rbi/gems/rubocop-ast@1.45.1.rbi +506 -815
- data/sorbet/rbi/gems/rubocop-sorbet@0.10.5.rbi +16 -16
- data/sorbet/rbi/gems/rubocop@1.77.0.rbi +2692 -2327
- data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +8 -8
- data/sorbet/rbi/gems/ruby_llm@1.8.2.rbi +38 -23
- data/sorbet/rbi/gems/securerandom@0.4.1.rbi +1 -1
- data/sorbet/rbi/gems/simplecov-html@0.13.2.rbi +2 -131
- data/sorbet/rbi/gems/simplecov@0.22.0.rbi +28 -127
- data/sorbet/rbi/gems/{spoom@1.6.3.rbi → spoom@1.7.11.rbi} +1139 -2246
- data/sorbet/rbi/gems/sqlite3@2.9.0.rbi +91 -1
- data/sorbet/rbi/gems/{tapioca@0.16.11.rbi → tapioca@0.17.10.rbi} +721 -835
- data/sorbet/rbi/gems/thor@1.4.0.rbi +53 -53
- data/sorbet/rbi/gems/tsort@0.2.0.rbi +393 -0
- data/sorbet/rbi/gems/type_toolkit@0.0.5.rbi +49 -0
- data/sorbet/rbi/gems/tzinfo@2.0.6.rbi +144 -143
- data/sorbet/rbi/gems/uri@1.1.1.rbi +7 -7
- data/sorbet/rbi/gems/vcr@6.3.1.rbi +53 -36
- data/sorbet/rbi/gems/webmock@3.25.1.rbi +38 -13
- data/sorbet/rbi/gems/zeitwerk@2.7.3.rbi +39 -272
- data/sorbet/rbi/shims/lib/roast/execution_context.rbi +3 -3
- data/tutorial/01_your_first_workflow/README.md +9 -5
- data/tutorial/01_your_first_workflow/configured_chat.rb +1 -1
- data/tutorial/02_chaining_cogs/README.md +2 -2
- data/tutorial/02_chaining_cogs/code_review.rb +1 -1
- data/tutorial/02_chaining_cogs/session_resumption.rb +1 -1
- data/tutorial/03_targets_and_params/README.md +1 -1
- data/tutorial/04_configuration_options/README.md +2 -2
- data/tutorial/08_iterative_workflows/README.md +1 -1
- data/tutorial/README.md +1 -1
- metadata +39 -17
- data/docs/AGENT_STEPS.md +0 -288
- data/docs/INSTRUMENTATION.md +0 -243
- data/docs/ITERATION_SYNTAX.md +0 -147
- data/docs/VALIDATION.md +0 -178
- data/lib/roast/nil_assertions.rb +0 -23
- /data/internal/documentation/{architectural-notes.md → comments/architectural-notes.md} +0 -0
- /data/internal/documentation/{doc-comments-external.md → comments/doc-comments-external.md} +0 -0
- /data/internal/documentation/{doc-comments-internal.md → comments/doc-comments-internal.md} +0 -0
- /data/internal/documentation/{doc-comments.md → comments/doc-comments.md} +0 -0
|
@@ -161,6 +161,24 @@ class OpenStruct
|
|
|
161
161
|
# source://ostruct//lib/ostruct.rb#318
|
|
162
162
|
def []=(name, value); end
|
|
163
163
|
|
|
164
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
165
|
+
def __id__!; end
|
|
166
|
+
|
|
167
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
168
|
+
def __send__!(*_arg0); end
|
|
169
|
+
|
|
170
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
171
|
+
def abort!(*_args, **_kwargs, &_block); end
|
|
172
|
+
|
|
173
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
174
|
+
def class!; end
|
|
175
|
+
|
|
176
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
177
|
+
def clone!(freeze: T.unsafe(nil)); end
|
|
178
|
+
|
|
179
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
180
|
+
def define_singleton_method!(*_arg0); end
|
|
181
|
+
|
|
164
182
|
# Removes the named field from the object and returns the value the field
|
|
165
183
|
# contained if it was defined. You may optionally provide a block.
|
|
166
184
|
# If the field is not defined, the result of the block is returned,
|
|
@@ -185,7 +203,7 @@ class OpenStruct
|
|
|
185
203
|
# source://ostruct//lib/ostruct.rb#371
|
|
186
204
|
def delete_field(name, &block); end
|
|
187
205
|
|
|
188
|
-
# source://ostruct//lib/ostruct.rb#
|
|
206
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
189
207
|
def delete_field!(name, &block); end
|
|
190
208
|
|
|
191
209
|
# :call-seq:
|
|
@@ -206,9 +224,15 @@ class OpenStruct
|
|
|
206
224
|
# source://ostruct//lib/ostruct.rb#340
|
|
207
225
|
def dig(name, *names); end
|
|
208
226
|
|
|
209
|
-
# source://ostruct//lib/ostruct.rb#
|
|
227
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
210
228
|
def dig!(name, *names); end
|
|
211
229
|
|
|
230
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
231
|
+
def display!(*_arg0); end
|
|
232
|
+
|
|
233
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
234
|
+
def dup!; end
|
|
235
|
+
|
|
212
236
|
# :call-seq:
|
|
213
237
|
# ostruct.each_pair {|name, value| block } -> ostruct
|
|
214
238
|
# ostruct.each_pair -> Enumerator
|
|
@@ -223,7 +247,7 @@ class OpenStruct
|
|
|
223
247
|
# source://ostruct//lib/ostruct.rb#211
|
|
224
248
|
def each_pair; end
|
|
225
249
|
|
|
226
|
-
# source://ostruct//lib/ostruct.rb#
|
|
250
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
227
251
|
def each_pair!; end
|
|
228
252
|
|
|
229
253
|
# Provides marshalling support for use by the YAML library.
|
|
@@ -231,9 +255,12 @@ class OpenStruct
|
|
|
231
255
|
# source://ostruct//lib/ostruct.rb#446
|
|
232
256
|
def encode_with(coder); end
|
|
233
257
|
|
|
234
|
-
# source://ostruct//lib/ostruct.rb#
|
|
258
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
235
259
|
def encode_with!(coder); end
|
|
236
260
|
|
|
261
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
262
|
+
def enum_for!(*_arg0); end
|
|
263
|
+
|
|
237
264
|
# Compares this object and +other+ for equality. An OpenStruct is eql? to
|
|
238
265
|
# +other+ when +other+ is an OpenStruct and the two objects' Hash tables are
|
|
239
266
|
# eql?.
|
|
@@ -243,18 +270,27 @@ class OpenStruct
|
|
|
243
270
|
# source://ostruct//lib/ostruct.rb#433
|
|
244
271
|
def eql?(other); end
|
|
245
272
|
|
|
273
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
274
|
+
def exit!(*_args, **_kwargs, &_block); end
|
|
275
|
+
|
|
276
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
277
|
+
def extend!(*_arg0); end
|
|
278
|
+
|
|
246
279
|
# source://ostruct//lib/ostruct.rb#269
|
|
247
280
|
def freeze; end
|
|
248
281
|
|
|
249
|
-
# source://ostruct//lib/ostruct.rb#
|
|
282
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
250
283
|
def freeze!; end
|
|
251
284
|
|
|
285
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
286
|
+
def gem!(dep, *reqs); end
|
|
287
|
+
|
|
252
288
|
# Computes a hash code for this OpenStruct.
|
|
253
289
|
#
|
|
254
290
|
# source://ostruct//lib/ostruct.rb#439
|
|
255
291
|
def hash; end
|
|
256
292
|
|
|
257
|
-
# source://ostruct//lib/ostruct.rb#
|
|
293
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
258
294
|
def hash!; end
|
|
259
295
|
|
|
260
296
|
# Provides marshalling support for use by the YAML library.
|
|
@@ -262,7 +298,7 @@ class OpenStruct
|
|
|
262
298
|
# source://ostruct//lib/ostruct.rb#459
|
|
263
299
|
def init_with(coder); end
|
|
264
300
|
|
|
265
|
-
# source://ostruct//lib/ostruct.rb#
|
|
301
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
266
302
|
def init_with!(coder); end
|
|
267
303
|
|
|
268
304
|
# Returns a string containing a detailed summary of the keys and values.
|
|
@@ -270,41 +306,134 @@ class OpenStruct
|
|
|
270
306
|
# source://ostruct//lib/ostruct.rb#388
|
|
271
307
|
def inspect; end
|
|
272
308
|
|
|
273
|
-
# source://ostruct//lib/ostruct.rb#
|
|
309
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
274
310
|
def inspect!; end
|
|
275
311
|
|
|
312
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
313
|
+
def instance_eval!(*_arg0); end
|
|
314
|
+
|
|
315
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
316
|
+
def instance_exec!(*_arg0); end
|
|
317
|
+
|
|
318
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
319
|
+
def instance_variable_get!(_arg0); end
|
|
320
|
+
|
|
321
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
322
|
+
def instance_variable_set!(_arg0, _arg1); end
|
|
323
|
+
|
|
324
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
325
|
+
def instance_variables!; end
|
|
326
|
+
|
|
327
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
328
|
+
def itself!; end
|
|
329
|
+
|
|
276
330
|
# Provides marshalling support for use by the Marshal library.
|
|
277
331
|
#
|
|
278
332
|
# source://ostruct//lib/ostruct.rb#220
|
|
279
333
|
def marshal_dump; end
|
|
280
334
|
|
|
281
|
-
# source://ostruct//lib/ostruct.rb#
|
|
335
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
282
336
|
def marshal_dump!; end
|
|
283
337
|
|
|
338
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
339
|
+
def method!(_arg0); end
|
|
340
|
+
|
|
341
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
342
|
+
def methods!(*_arg0); end
|
|
343
|
+
|
|
344
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
345
|
+
def object_id!; end
|
|
346
|
+
|
|
347
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
348
|
+
def pretty_inspect!; end
|
|
349
|
+
|
|
350
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
351
|
+
def pretty_print!(q); end
|
|
352
|
+
|
|
353
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
354
|
+
def pretty_print_cycle!(q); end
|
|
355
|
+
|
|
356
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
357
|
+
def pretty_print_inspect!; end
|
|
358
|
+
|
|
359
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
360
|
+
def pretty_print_instance_variables!; end
|
|
361
|
+
|
|
362
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
363
|
+
def private_methods!(*_arg0); end
|
|
364
|
+
|
|
365
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
366
|
+
def protected_methods!(*_arg0); end
|
|
367
|
+
|
|
368
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
369
|
+
def public_method!(_arg0); end
|
|
370
|
+
|
|
371
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
372
|
+
def public_methods!(*_arg0); end
|
|
373
|
+
|
|
374
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
375
|
+
def public_send!(*_arg0); end
|
|
376
|
+
|
|
377
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
378
|
+
def remove_instance_variable!(_arg0); end
|
|
379
|
+
|
|
380
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
381
|
+
def send!(*_arg0); end
|
|
382
|
+
|
|
383
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
384
|
+
def singleton_class!; end
|
|
385
|
+
|
|
386
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
387
|
+
def singleton_method!(_arg0); end
|
|
388
|
+
|
|
389
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
390
|
+
def singleton_methods!(*_arg0); end
|
|
391
|
+
|
|
284
392
|
# source://ostruct//lib/ostruct.rb#406
|
|
285
393
|
def table; end
|
|
286
394
|
|
|
395
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
396
|
+
def tap!; end
|
|
397
|
+
|
|
398
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
399
|
+
def then!; end
|
|
400
|
+
|
|
401
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
402
|
+
def to_enum!(*_arg0); end
|
|
403
|
+
|
|
287
404
|
# source://ostruct//lib/ostruct.rb#182
|
|
288
405
|
def to_h(&block); end
|
|
289
406
|
|
|
290
|
-
# source://ostruct//lib/ostruct.rb#
|
|
407
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
291
408
|
def to_h!(&block); end
|
|
292
409
|
|
|
410
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
411
|
+
def to_json!(*_arg0); end
|
|
412
|
+
|
|
293
413
|
# Returns a string containing a detailed summary of the keys and values.
|
|
294
414
|
#
|
|
295
|
-
# source://ostruct//lib/ostruct.rb#
|
|
415
|
+
# source://ostruct//lib/ostruct.rb#404
|
|
296
416
|
def to_s; end
|
|
297
417
|
|
|
298
|
-
# source://ostruct//lib/ostruct.rb#
|
|
418
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
299
419
|
def to_s!; end
|
|
300
420
|
|
|
421
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
422
|
+
def to_yaml!(options = T.unsafe(nil)); end
|
|
423
|
+
|
|
424
|
+
# source://ostruct//lib/ostruct.rb#478
|
|
425
|
+
def yield_self!; end
|
|
426
|
+
|
|
301
427
|
protected
|
|
302
428
|
|
|
303
|
-
# source://ostruct//lib/ostruct.rb#
|
|
429
|
+
# source://ostruct//lib/ostruct.rb#407
|
|
304
430
|
def table!; end
|
|
305
431
|
|
|
306
432
|
private
|
|
307
433
|
|
|
434
|
+
# source://ostruct//lib/ostruct.rb#486
|
|
435
|
+
def block_given!; end
|
|
436
|
+
|
|
308
437
|
# source://ostruct//lib/ostruct.rb#147
|
|
309
438
|
def initialize_clone(orig); end
|
|
310
439
|
|
|
@@ -317,7 +446,7 @@ class OpenStruct
|
|
|
317
446
|
#
|
|
318
447
|
# Provides marshalling support for use by the Marshal library.
|
|
319
448
|
#
|
|
320
|
-
# source://ostruct//lib/ostruct.rb#
|
|
449
|
+
# source://ostruct//lib/ostruct.rb#227
|
|
321
450
|
def marshal_load(hash); end
|
|
322
451
|
|
|
323
452
|
# source://ostruct//lib/ostruct.rb#274
|
|
@@ -330,6 +459,11 @@ class OpenStruct
|
|
|
330
459
|
# source://ostruct//lib/ostruct.rb#234
|
|
331
460
|
def new_ostruct_member!(name); end
|
|
332
461
|
|
|
462
|
+
# Other builtin private methods we use:
|
|
463
|
+
#
|
|
464
|
+
# source://ostruct//lib/ostruct.rb#481
|
|
465
|
+
def raise!(*_arg0); end
|
|
466
|
+
|
|
333
467
|
# :call-seq:
|
|
334
468
|
# ostruct[name] = obj -> obj
|
|
335
469
|
#
|
|
@@ -340,7 +474,7 @@ class OpenStruct
|
|
|
340
474
|
# person[:age] = 42 # equivalent to person.age = 42
|
|
341
475
|
# person.age # => 42
|
|
342
476
|
#
|
|
343
|
-
# source://ostruct//lib/ostruct.rb#
|
|
477
|
+
# source://ostruct//lib/ostruct.rb#323
|
|
344
478
|
def set_ostruct_member_value!(name, value); end
|
|
345
479
|
|
|
346
480
|
# source://ostruct//lib/ostruct.rb#157
|