object_inspector 0.8.2 → 0.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8cec70cf90b2d72b87fa7c977949c7a99057364e1788e6fe84618ab73f7503c6
4
- data.tar.gz: 80fa2ce2e8744f9af3cb346b00c414376d70788e2c48df7fd079779dfe68e06f
3
+ metadata.gz: 1468942ef1aa4a276a2138a904f34329d8b1e9846b58e013c208fbfe4a9113da
4
+ data.tar.gz: a552ef57ab52b60f208bbe2fceac50f96be25a340cd3854864a5d6a54e3d886f
5
5
  SHA512:
6
- metadata.gz: 4822bbef66b7cebadd5f0ef7760412a54f509f3b5e81bd3651f9feb2140e052bef2fa85f11186976460deeee83c03a5f08c05cbe85a5955133526d4a076eb185
7
- data.tar.gz: af24a9ea1bd74b036edb437ec18efa19b2d159cabcf98b962459fc29b381db2e6fa8bb48735e897fb39b2ef2e9a9c3776383c1c76f6f14a30cd2358eb4900987
6
+ metadata.gz: 2d02eab73350615584726ada8923bcdea3d428cf61d8e95abf17778b4b76836f828b2c12389dadf1aebe85e369106b4396da1e8501f81fe4e74b44a3031171b8
7
+ data.tar.gz: 1d044028f4889d0b6bd5615d5f035e19e5bf6ce7e5a30a30ce54a686edb403dd89a826bf8cfd0c4a89781c862af798d4e50ce9a1ed0080012f33a99ec4e477e1
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Object Inspector takes Object#inspect to the next level. Specify any combination of identification attributes, flags, issues, info, and/or a name along with an optional, self-definable scope option to represent objects. Great for the console, logging, etc.
7
7
 
8
- Why? Because object inspection code should be uniform, easy to build, and its output should be easy to read!
8
+ Why? Because object inspection output should be uniform and easy to build, and its output should be easy to read! Consistency improves readability.
9
9
 
10
10
  If you'd like to just jump into an example: [Full Example](#full-example).
11
11
 
@@ -19,11 +19,15 @@ gem "object_inspector"
19
19
 
20
20
  And then execute:
21
21
 
22
- $ bundle
22
+ ```sh
23
+ $ bundle
24
+ ```
23
25
 
24
26
  Or install it yourself:
25
27
 
26
- $ gem install object_inspector
28
+ ```sh
29
+ $ gem install object_inspector
30
+ ```
27
31
 
28
32
  ## Compatibility
29
33
 
@@ -42,19 +46,19 @@ gem "object_inspector", "0.6.3"
42
46
  For Ruby 3.1 support, install object_inspector gem version 0.7.0.
43
47
 
44
48
  ```ruby
45
- gem "object_inspector", "0.6.3"
49
+ gem "object_inspector", "0.7.0"
46
50
  ```
47
51
 
48
52
  Object Inspector has no other dependencies.
49
53
 
50
54
  ## Configuration
51
55
 
52
- Global/default values for Object Inspector can be configured via the ObjectInspector::Configuration object.
53
-
54
- _Note: In a Rails app, the following would go in e.g. `config/initializers/object_inspector.rb`_
56
+ Global/default values for Object Inspector can be configured via the [ObjectInspector::Configuration] object.
55
57
 
56
58
  ```ruby
57
- # Default values are shown.
59
+ # config/initializers/object_inspector.rb
60
+
61
+ # Default values are shown. Customize to your liking.
58
62
  ObjectInspector.configure do |config|
59
63
  config.formatter_class = ObjectInspector::TemplatingFormatter
60
64
  config.inspect_method_prefix = "inspect"
@@ -71,7 +75,7 @@ end
71
75
 
72
76
  ## Usage
73
77
 
74
- Given, an object of any type, call ObjectInspector::Inspector.inspect.
78
+ Pass an object of any type into `ObjectInspector::Inspector.inspect`.
75
79
 
76
80
  ```ruby
77
81
  class MyObject
@@ -83,11 +87,11 @@ end
83
87
  MyObject.new.inspect # => "<MyObject>"
84
88
  ```
85
89
 
86
- See also [Helper Usage](#helper-usage) for an even simpler usage option.
90
+ See: [Helper Usage](#helper-usage) for simpler usage.
87
91
 
88
92
  ### Output Customization
89
93
 
90
- Use the `identification`, `flags`, `info`, and/or `name` options to customize inspect output.
94
+ Use the `identification`, `flags`, `issues`, `info`, and/or `name` options to customize inspect output.
91
95
 
92
96
  ```ruby
93
97
  class MyObject
@@ -96,15 +100,17 @@ class MyObject
96
100
  self,
97
101
  identification: "My Object",
98
102
  flags: "FLAG1 / FLAG2",
103
+ issues: "ISSUE1",
99
104
  info: "INFO",
100
105
  name: "NAME")
101
106
  end
102
107
  end
103
108
 
104
- MyObject.new.inspect # => "<My Object(FLAG1 / FLAG2) INFO :: NAME>"
109
+ MyObject.new.inspect
110
+ # => "<My Object(FLAG1 / FLAG2) !!ISSUE1!! INFO :: NAME>"
105
111
  ```
106
112
 
107
- Or, define `inspect_identification`, `inspect_flags`, `inspect_info`, and/or `inspect_name` (or `display_name`) as either public or private methods on Object.
113
+ Or, define `inspect_identification`, `inspect_flags`, `inspect_issues`, `inspect_info`, and/or `inspect_name` (or `display_name`) as either public or private methods on Object.
108
114
 
109
115
  ```ruby
110
116
  class MyObject
@@ -114,11 +120,11 @@ class MyObject
114
120
 
115
121
  private
116
122
 
117
- def inspect_identification; "My Object" end
118
- def inspect_flags; "FLAG1 / FLAG2" end
119
- def inspect_issues; "ISSUE1 | ISSUE2" end
120
- def inspect_info; "INFO" end
121
- def inspect_name; "NAME" end # Or: def display_name; "NAME" end
123
+ def inspect_identification = "My Object"
124
+ def inspect_flags = "FLAG1 / FLAG2"
125
+ def inspect_issues = "ISSUE1 | ISSUE2"
126
+ def inspect_info = "INFO"
127
+ def inspect_name = "NAME" # Or: def display_name = "NAME"
122
128
  end
123
129
 
124
130
  MyObject.new.inspect
@@ -127,7 +133,7 @@ MyObject.new.inspect
127
133
 
128
134
  ## Helper Usage
129
135
 
130
- To save some typing, include ObjectInspector::InspectHelper into an object and ObjectInspector::Inspector.inspect will be called on `self` automatically.
136
+ To save some typing, include ObjectInspector::InspectHelper into an object and `ObjectInspector::Inspector.inspect` will be called on `self` automatically.
131
137
 
132
138
  ```ruby
133
139
  class MyObject
@@ -164,17 +170,41 @@ class MyObject
164
170
 
165
171
  private
166
172
 
167
- def inspect_identification; "My Object" end
168
- def inspect_flags; "FLAG1 / FLAG2" end
169
- def inspect_issues; "ISSUE1 | ISSUE2" end
170
- def inspect_info; "INFO" end
171
- def inspect_name; "NAME" end # Or: def display_name; "NAME" end
173
+ def inspect_identification = "My Object"
174
+ def inspect_flags = "FLAG1 / FLAG2"
175
+ def inspect_issues = "ISSUE1 | ISSUE2"
176
+ def inspect_info = "INFO"
177
+ def inspect_name = "NAME" # Or: def display_name = "NAME"
172
178
  end
173
179
 
174
180
  MyObject.new.inspect
175
181
  # => "<My Object(FLAG1) !!ISSUE1 | ISSUE2!! INFO :: NAME>"
176
182
  ```
177
183
 
184
+ ### Helper Inclusion
185
+
186
+ It may be useful to conditionally include ObjectInspector::InspectorsHelper, as well as other similar methods, via a mix-in.
187
+
188
+ ```ruby
189
+ module ObjectInspectionBehaviors
190
+ extend ActiveSupport::Concern
191
+
192
+ included do
193
+ # If you'd like to preserve the original inspect method, here is your
194
+ # chance to.
195
+ alias_method :__inspect__, :inspect
196
+
197
+ include ObjectInspector::InspectorsHelper
198
+ end
199
+
200
+ # An example of another, similar style of method you may wish to utilize in
201
+ # this mix-in.
202
+ def introspect
203
+ self
204
+ end
205
+ end
206
+ ```
207
+
178
208
  ## Scopes
179
209
 
180
210
  Use the `scope` option to define the scope of the `inspect_*` methods. The supplied value will be wrapped by the ObjectInspector::Scope helper object.
@@ -192,15 +222,16 @@ my_object.inspect(scope: <scope_name>)
192
222
 
193
223
  Options:
194
224
 
195
- - `:self` (Default) -- Is meant to confine object interrogation to self (don't interrogate neighboring objects).
196
- - `:all` -- Is meant to match on all scopes, regardless of their name.
197
- - `<custom>` -- Anything else that makes sense for the object to key on.
225
+ - `:self` (Default)--Is meant to confine object interrogation to self (don't interrogate neighboring objects).
226
+ - `:all`--Is meant to match on all scopes, regardless of their name.
227
+ - `<custom>`--Anything else that makes sense for the object to key on.
198
228
 
199
229
  ```ruby
200
230
  scope = ObjectInspector::Scope.new
201
- scope.self? # => true
202
- scope.verbose? # => false
203
- scope.complex? # => false
231
+ scope.self? # => true
232
+ scope.verbose? # => false
233
+ scope.complex? # => false
234
+ scope.<anything>? # => false
204
235
  ```
205
236
 
206
237
  #### Multiple Scope Names
@@ -223,8 +254,11 @@ scope = ObjectInspector::Scope.new(:all)
223
254
  scope.self? # => true
224
255
  scope.verbose? # => true
225
256
  scope.complex? # => true
257
+ scope.all? # => true
226
258
  ```
227
259
 
260
+ _**NOTE**_: Calling `#inspect!` on an object that mixes in `ObjectInspector::InspectorsHelper` is equivalent to passing in the "wild card" scope.
261
+
228
262
  ### Scope blocks
229
263
 
230
264
  Passing a block to a scope predicate falls back to the out-of-scope placeholder (`*` by default) if the scope does not match.
@@ -240,20 +274,19 @@ scope.complex? { "MATCH" } # => "*"
240
274
  ObjectInspector::Scope also offers helper methods for uniformly joining inspect elements:
241
275
 
242
276
  ```ruby
243
- join_name # Joins name parts with ` - ` by default
244
- join_flags # Joins flags with ` / ` by default
245
- join_info # Joins info items with ` | ` by default
277
+ join_name # Joins name parts with ` - ` by default
278
+ join_flags # Joins flags with ` / ` by default
279
+ join_issues # Joins issues with ` | ` by default
280
+ join_info # Joins info items with ` | ` by default
246
281
  ```
247
282
 
248
283
  For example:
249
284
 
250
285
  ```ruby
251
- scope = ObjectInspector::Scope.new(:verbose)
252
- scope.join_name([1, 2, 3]) # => "1 - 2 - 3"
253
- scope.join_name([1, 2, 3, nil]) # => "1 - 2 - 3"
254
- scope.join_flags([1, 2, 3]) # => "1 / 2 / 3"
286
+ scope = ObjectInspector::Scope.new(:all)
287
+ scope.join_name([1, 2, 3, nil]) # => "1 - 2 - 3"
255
288
  scope.join_flags([1, 2, 3, nil]) # => "1 / 2 / 3"
256
- scope.join_info([1, 2, 3]) # => "1 | 2 | 3"
289
+ scope.join_issues([1, 2, 3, nil]) # => "1 | 2 | 3"
257
290
  scope.join_info([1, 2, 3, nil]) # => "1 | 2 | 3"
258
291
  ```
259
292
 
@@ -272,11 +305,11 @@ class MyObject
272
305
  end
273
306
 
274
307
  def associated_object1
275
- OpenStruct.new(flags: "AO1_FLAG1")
308
+ Data.define(:flags)["AO1_FLAG1"]
276
309
  end
277
310
 
278
311
  def associated_object2
279
- OpenStruct.new(flags: "AO2_FLAG1")
312
+ Data.define(:flags)["AO2_FLAG1"]
280
313
  end
281
314
 
282
315
  # Or `def inspect_name`
@@ -304,8 +337,11 @@ class MyObject
304
337
  scope.join_flags(flags)
305
338
  end
306
339
 
307
- def inspect_issues
308
- "!!WARNING!!"
340
+ def inspect_issues(scope:)
341
+ scope.join_issues([
342
+ "I1",
343
+ scope.verbose? { "VI2" },
344
+ ])
309
345
  end
310
346
 
311
347
  def inspect_info(scope:)
@@ -319,37 +355,43 @@ end
319
355
 
320
356
  my_object = MyObject.new("Name")
321
357
 
358
+ my_object.inspect
359
+ # => "<MyObject[2](DEFAULT_FLAG / *) !!I1 | *!! Default Info | * :: Name>"
360
+
361
+ my_object.inspect(scope: :self)
362
+ # => "<MyObject[2](DEFAULT_FLAG / *) !!I1 | *!! Default Info | * :: Name>"
363
+
322
364
  my_object.inspect(scope: :complex)
323
- # => "<MyObject[a2:2](DEFAULT_FLAG / *) !!!!WARNING!!!! Default Info | Complex Info | * :: Name>"
365
+ # => "<MyObject[2](DEFAULT_FLAG / *) !!I1 | *!! Default Info | Complex Info | * :: Name>"
324
366
 
325
367
  my_object.inspect(scope: :verbose)
326
- # => "<MyObject[a2:2](DEFAULT_FLAG / AO1_FLAG1 / AO2_FLAG1) !!!!WARNING!!!! Default Info | Verbose Info :: Name>"
368
+ # => "<MyObject[2](DEFAULT_FLAG / AO1_FLAG1 / AO2_FLAG1) !!I1 | VI2!! Default Info | Verbose Info :: Name>"
327
369
 
328
370
  my_object.inspect(scope: %i[self complex verbose])
329
- # => "<MyObject[a2:2](DEFAULT_FLAG / AO1_FLAG1 / AO2_FLAG1) !!!!WARNING!!!! Default Info | Complex Info | Verbose Info :: Name>"
371
+ # => "<MyObject[2](DEFAULT_FLAG / AO1_FLAG1 / AO2_FLAG1) !!I1 | VI2!! Default Info | Complex Info | Verbose Info :: Name>"
330
372
 
331
373
  my_object.inspect(scope: :all)
332
- # => "<MyObject[a2:2](DEFAULT_FLAG / AO1_FLAG1 / AO2_FLAG1) !!!!WARNING!!!! Default Info | Complex Info | Verbose Info :: Name>"
374
+ # => "<MyObject[2](DEFAULT_FLAG / AO1_FLAG1 / AO2_FLAG1) !!I1 | VI2!! Default Info | Complex Info | Verbose Info :: Name>"
333
375
 
334
- my_object.inspect
335
- # => "<MyObject[a2:2](DEFAULT_FLAG / *) !!!!WARNING!!!! Default Info | * :: Name>"
376
+ my_object.inspect! # 👀 Same as passing in `scope: :all`
377
+ # => "<MyObject[2](DEFAULT_FLAG / AO1_FLAG1 / AO2_FLAG1) !!I1 | VI2!! Default Info | Complex Info | Verbose Info :: Name>"
336
378
 
337
379
  ObjectInspector.configuration.default_scope = :complex
338
380
  my_object.inspect
339
- # => "<MyObject[a2:2](DEFAULT_FLAG / *) !!!!WARNING!!!! Default Info | Complex Info | * :: Name>"
381
+ # => "<MyObject[2](DEFAULT_FLAG / *) !!I1 | *!! Default Info | Complex Info | * :: Name>"
340
382
 
341
383
  ObjectInspector.configuration.default_scope = %i[self complex verbose]
342
384
  my_object.inspect
343
- # => "<MyObject[a2:2](DEFAULT_FLAG / AO1_FLAG1 / AO2_FLAG1) !!!!WARNING!!!! Default Info | Complex Info | Verbose Info :: Name>"
385
+ # => "<MyObject[2](DEFAULT_FLAG / AO1_FLAG1 / AO2_FLAG1) !!I1 | VI2!! Default Info | Complex Info | Verbose Info :: Name>"
344
386
 
345
387
  ObjectInspector.configuration.default_scope = :all
346
388
  my_object.inspect
347
- # => "<MyObject[a2:2](DEFAULT_FLAG / AO1_FLAG1 / AO2_FLAG1) !!!!WARNING!!!! Default Info | Complex Info | Verbose Info :: Name>"
389
+ # => "<MyObject[2](DEFAULT_FLAG / AO1_FLAG1 / AO2_FLAG1) !!I1 | VI2!! Default Info | Complex Info | Verbose Info :: Name>"
348
390
  ```
349
391
 
350
392
  ## Wrapped Objects
351
393
 
352
- If the Object being inspected wraps another object -- i.e. defines #to_model and #to_model returns an object other than self -- the inspect output will re-inspect the wrapped object. The wrapper points to the wrapped object with an arrow (⇨).
394
+ If the Object being inspected wraps another object--i.e. defines #to_model and #to_model returns an object other than self--the inspect output will re-inspect the wrapped object. The wrapper points to the wrapped object with an arrow (⇨).
353
395
 
354
396
  ```ruby
355
397
  class MyWrapperObject
@@ -361,7 +403,8 @@ class MyWrapperObject
361
403
 
362
404
  private
363
405
 
364
- def inspect_flags; "WRAPPER_FLAG1" end
406
+ def inspect_flags = "WRAPPER_FLAG1"
407
+ def inspect_issues(scope:) = scope.complex? { "CI1" }
365
408
  end
366
409
 
367
410
  class MyWrappedObject
@@ -369,12 +412,16 @@ class MyWrappedObject
369
412
 
370
413
  private
371
414
 
372
- def inspect_flags; "FLAG1 / FLAG2" end
373
- def inspect_info; "INFO" end
415
+ def inspect_flags = "FLAG1 / FLAG2"
416
+ def inspect_info = "INFO"
417
+ def inspect_issues(scope:) = scope.complex? { "CI1" }
374
418
  end
375
419
 
376
420
  MyWrapperObject.new.inspect
377
- # => "<MyWrapperObject(WRAPPER_FLAG1)> <MyWrappedObject(FLAG1 / FLAG2) INFO>"
421
+ # => "<MyWrapperObject(WRAPPER_FLAG1) !!*!!> <MyWrappedObject(FLAG1 / FLAG2) !!*!! INFO>"
422
+
423
+ MyWrapperObject.new.inspect!
424
+ # => "<MyWrapperObject(WRAPPER_FLAG1) !!CI1!!> ⇨ <MyWrappedObject(FLAG1 / FLAG2) !!CI1!! INFO>"
378
425
  ```
379
426
 
380
427
  This feature is recursive.
@@ -424,10 +471,10 @@ class MyWrappedObject
424
471
 
425
472
  private
426
473
 
427
- def inspect_flags; "FLAG1" end
428
- def inspect_info; "INFO" end
429
- def inspect_issues; "ISSUE1" end
430
- def inspect_name; "NAME" end
474
+ def inspect_flags = "FLAG1"
475
+ def inspect_info = "INFO"
476
+ def inspect_issues = "ISSUE1"
477
+ def inspect_name = "NAME"
431
478
  end
432
479
 
433
480
  MyDelegatingWrapperObject.new(MyWrappedObject.new).inspect
@@ -442,10 +489,10 @@ When passed as an option (as opposed to being called via an Object-defined metho
442
489
  class MyObject
443
490
  include ObjectInspector::InspectorsHelper
444
491
 
445
- def my_method1; "Result1" end
446
- def my_method2; "Result2" end
492
+ def my_method1 = "Result1"
493
+ def my_method2 = "Result2"
447
494
 
448
- def inspect_info; :my_method2 end
495
+ def inspect_info = :my_method2
449
496
  end
450
497
 
451
498
  MyObject.new.inspect(info: "my_method1") # => "<MyObject my_method1>"
@@ -461,17 +508,18 @@ Pass `nil` to any inspect method type to not display it:
461
508
  class MyObject
462
509
  include ObjectInspector::InspectorsHelper
463
510
 
464
- def inspect_identification; "My Object" end
465
- def inspect_info; "INFO" end
466
- def inspect_flags; "FLAG1" end
467
- def inspect_issues; "ISSUE1" end
511
+ def inspect_identification = "My Object"
512
+ def inspect_info = "INFO"
513
+ def inspect_flags = "FLAG1"
514
+ def inspect_issues = "ISSUE1"
515
+ def inspect_name = "NAME"
468
516
  end
469
517
 
470
518
  MyObject.new.inspect
471
- # => "<My Object(FLAG1) !!ISSUE1!! INFO>"
519
+ # => "<My Object(FLAG1) !!ISSUE1!! INFO :: NAME>"
472
520
  MyObject.new.inspect(info: nil, flags: nil, issues: nil)
473
- # => "<My Object>"
474
- MyObject.new.inspect(identification: nil, info: nil, flags: nil, issues: nil)
521
+ # => "<My Object :: NAME>"
522
+ MyObject.new.inspect(identification: nil, info: nil, flags: nil, issues: nil, name: nil)
475
523
  # => "<MyObject>"
476
524
  ```
477
525
 
@@ -490,11 +538,12 @@ class MyObject
490
538
  include ObjectInspector::InspectorsHelper
491
539
 
492
540
  def inspect
493
- super(formatter: MyCustomFormatter,
494
- identification: "IDENTIFICATION",
495
- flags: "FLAG1 / FLAG2",
496
- info: "INFO",
497
- name: "NAME")
541
+ super(
542
+ formatter: MyCustomFormatter,
543
+ identification: "IDENTIFICATION",
544
+ flags: "FLAG1 / FLAG2",
545
+ info: "INFO",
546
+ name: "NAME")
498
547
  end
499
548
  end
500
549
 
@@ -529,10 +578,10 @@ class MyObject
529
578
  identify(:my_method1, :my_method2)
530
579
  end
531
580
 
532
- def inspect_flags; "FLAG1 / FLAG2" end
533
- def inspect_issues; "ISSUE1 | ISSUE2" end
534
- def inspect_info; "INFO" end
535
- def inspect_name; "NAME" end
581
+ def inspect_flags = "FLAG1 / FLAG2"
582
+ def inspect_issues = "ISSUE1 | ISSUE2"
583
+ def inspect_info = "INFO"
584
+ def inspect_name = "NAME"
536
585
  end
537
586
 
538
587
  MyObject.new.inspect
@@ -543,51 +592,59 @@ MyObject.new.inspect
543
592
 
544
593
  ### Benchmarking Object Inspector
545
594
 
546
- ObjectInspetor is ~4x slower than Ruby's default inspect.
595
+ ObjectInspetor is ~2.75x slower than Ruby's default inspect, in Ruby v3.4.
547
596
 
548
597
  Performance of Object Inspector can be tested by playing the [Object Inspector Benchmarking Script](https://github.com/pdobb/object_inspector/blob/master/script/benchmarking/object_inspector.rb) in the IRB console for this gem.
549
598
 
550
599
  ```ruby
551
600
  load "script/benchmarking/object_inspector.rb"
601
+ # Reporting for: Ruby v3.4.2
602
+ #
603
+ # == Averaged =============================================================
604
+ # ...
605
+ #
552
606
  # Comparison:
553
- # Ruby: 30382.2 i/s
554
- # ObjectInspector::Inspector: 7712.2 i/s - 3.94x slower
607
+ # Ruby: 58957.2 i/s
608
+ # ObjectInspector::Inspector: 21416.6 i/s - 2.75x slower
609
+ # == Done
555
610
  ```
556
611
 
557
612
  ### Benchmarking Formatters
558
613
 
559
- [ObjectInspector::TemplatingFormatter] -- which is the default Formatter -- outperforms [ObjectInspector::CombiningFormatter] by about 30% on average.
614
+ [ObjectInspector::TemplatingFormatter]--which is the default Formatter--outperforms [ObjectInspector::CombiningFormatter] by about 30% on average.
560
615
 
561
616
  Performance of Formatters can be tested by playing the [Formatters Benchmarking Scripts](https://github.com/pdobb/object_inspector/blob/master/script/benchmarking/formatters.rb) in the IRB console for this gem.
562
617
 
563
618
  ```ruby
564
619
  load "script/benchmarking/formatters.rb"
620
+ # Reporting for: Ruby v3.4.2
621
+ #
565
622
  # == Averaged =============================================================
566
623
  # ...
567
624
  #
568
625
  # Comparison:
569
- # ObjectInspector::TemplatingFormatter: 45725.3 i/s
570
- # ObjectInspector::CombiningFormatter: 34973.9 i/s - 1.31x slower
571
- #
626
+ # ObjectInspector::TemplatingFormatter: 65856.3 i/s
627
+ # ObjectInspector::CombiningFormatter: 60920.0 i/s - 1.13x slower
572
628
  # == Done
573
629
  ```
574
630
 
575
631
  #### Benchmarking Custom Formatters
576
632
 
577
- Custom Formatters may be similarly gauged for comparison by adding them to the `custom_formatter_klasses` array before playing the script.
633
+ Custom Formatters may be similarly gauged for comparison by putting them into a constant `CUSTOM_FORMATTER_CLASSES` before loading the script in the IRB console for this gem.
578
634
 
579
635
  ```ruby
580
- custom_formatter_klasses = [MyCustomFormatter]
636
+ CUSTOM_FORMATTER_CLASSES = [MyCustomFormatter]
581
637
 
582
- play script/benchmarking/formatters.rb
638
+ load "script/benchmarking/formatters.rb"
639
+ # Reporting for: Ruby v3.4.2
640
+ #
583
641
  # == Averaged =============================================================
584
642
  # ...
585
643
  #
586
644
  # Comparison:
587
- # MyCustomFormatter: 52001.2 i/s
588
- # ObjectInspector::TemplatingFormatter: 49854.2 i/s - same-ish: difference falls within error
589
- # ObjectInspector::CombiningFormatter: 38963.5 i/s - 1.33x slower
590
- #
645
+ # MyCustomFormatter: 74227.7 i/s
646
+ # ObjectInspector::TemplatingFormatter: 66148.5 i/s - 1.12x slower
647
+ # ObjectInspector::CombiningFormatter: 63289.7 i/s - 1.17x slower
591
648
  # == Done
592
649
  ```
593
650
 
@@ -601,13 +658,13 @@ To install this gem onto your local machine, run `bundle exec rake install`.
601
658
 
602
659
  To test this gem:
603
660
 
604
- ```bash
661
+ ```sh
605
662
  rake
606
663
  ```
607
664
 
608
665
  #### Linters
609
666
 
610
- ```bash
667
+ ```sh
611
668
  rubocop
612
669
 
613
670
  reek
@@ -16,7 +16,7 @@ class ObjectInspector::BaseFormatter
16
16
  #
17
17
  # @return [String]
18
18
  def call
19
- raise NotImplementedError
19
+ raise(NotImplementedError)
20
20
  end
21
21
 
22
22
  # Delegates to {Inspector#wrapped_object_inspection_result}.
@@ -38,6 +38,7 @@ class ObjectInspector::CombiningFormatter < ObjectInspector::BaseFormatter
38
38
  [
39
39
  build_identification_string,
40
40
  build_flags_string,
41
+ build_issues_string,
41
42
  build_info_string,
42
43
  build_name_string,
43
44
  ].compact
@@ -51,6 +52,10 @@ class ObjectInspector::CombiningFormatter < ObjectInspector::BaseFormatter
51
52
  "(#{flags.to_s.upcase})" if flags
52
53
  end
53
54
 
55
+ def build_issues_string
56
+ " !!#{issues.to_s.upcase}!!" if issues
57
+ end
58
+
54
59
  def build_info_string
55
60
  " #{info}" if info
56
61
  end
@@ -36,7 +36,7 @@ class ObjectInspector::Inspector
36
36
  **kwargs)
37
37
  @object = object
38
38
  @scope = ObjectInspector::Conversions.Scope(scope)
39
- @formatter_klass = formatter
39
+ @formatter_class = formatter
40
40
  @kwargs = kwargs
41
41
  end
42
42
 
@@ -47,7 +47,8 @@ class ObjectInspector::Inspector
47
47
  formatter.call
48
48
  end
49
49
 
50
- # Generate the inspect String for the wrapped object, if present.
50
+ # Generate the inspect String for the wrapped object, if `self` is a wrapper
51
+ # object.
51
52
  #
52
53
  # @return [String] if {#object_is_a_wrapper?}
53
54
  # @return [NilClass] if not {#object_is_a_wrapper?}
@@ -57,7 +58,7 @@ class ObjectInspector::Inspector
57
58
  self.class.inspect(
58
59
  extract_wrapped_object,
59
60
  scope: @scope,
60
- formatter: @formatter_klass,
61
+ formatter: @formatter_class,
61
62
  kwargs: @kwargs)
62
63
  end
63
64
 
@@ -112,7 +113,7 @@ class ObjectInspector::Inspector
112
113
  private
113
114
 
114
115
  def formatter
115
- @formatter_klass.new(self)
116
+ @formatter_class.new(self)
116
117
  end
117
118
 
118
119
  # @return [String] if `key` is found in {#kwargs} or if {#object} responds to
@@ -5,10 +5,20 @@
5
5
  # generating the inspection output.
6
6
  module ObjectInspector::InspectorsHelper
7
7
  # Calls {ObjectInspector::Inspector.inspect} on the passed in `object`,
8
- # passing it the passed in `kwargs` (keyword arguments).
8
+ # passing through any keyword arguments.
9
9
  #
10
10
  # @return [String]
11
11
  def inspect(object = self, **)
12
12
  ObjectInspector::Inspector.inspect(object, **)
13
13
  end
14
+
15
+ # Like {#inspect} but forces scope to `:all`. This (the bang (!) version) is
16
+ # considered the "more dangerous" version of {#inspect} in the sense that the
17
+ # `:all` scope may result in additional queries or extra processing--depending
18
+ # on how the inspect hooks are setup.
19
+ #
20
+ # @return [String]
21
+ def inspect!(object = self, **)
22
+ ObjectInspector::Inspector.inspect(object, **, scope: :all)
23
+ end
14
24
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module ObjectInspector
4
4
  # The current ObjectInspector gem version.
5
- VERSION = "0.8.2"
5
+ VERSION = "0.10.0"
6
6
  end
@@ -51,7 +51,7 @@ module ObjectInspector
51
51
 
52
52
  def formatter_class=(value)
53
53
  unless value.is_a?(Class)
54
- raise TypeError, "Formatter must be a Class constant"
54
+ raise(TypeError, "Formatter must be a Class constant")
55
55
  end
56
56
 
57
57
  @formatter_class = value
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: object_inspector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul DobbinSchmaltz
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-01-04 00:00:00.000000000 Z
10
+ date: 2025-04-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: benchmark-ips
@@ -110,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  requirements: []
113
- rubygems_version: 3.6.2
113
+ rubygems_version: 3.6.6
114
114
  specification_version: 4
115
115
  summary: Object Inspector builds uniformly formatted inspect output with customizable
116
116
  amounts of detail.