object_inspector 0.6.1 → 0.6.3
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/LICENSE.txt +1 -1
- data/README.md +32 -25
- data/lib/object_inspector/conversions.rb +17 -17
- data/lib/object_inspector/formatters/base_formatter.rb +57 -59
- data/lib/object_inspector/formatters/combining_formatter.rb +44 -46
- data/lib/object_inspector/formatters/templating_formatter.rb +168 -202
- data/lib/object_inspector/inspector.rb +165 -161
- data/lib/object_inspector/inspectors_helper.rb +10 -12
- data/lib/object_inspector/object_interrogator.rb +35 -33
- data/lib/object_inspector/scope.rb +115 -106
- data/lib/object_inspector/version.rb +2 -1
- data/lib/object_inspector.rb +6 -0
- metadata +36 -30
- data/.gitignore +0 -11
- data/.rubocop +0 -4
- data/.rubocop.yml +0 -158
- data/.travis.yml +0 -21
- data/CHANGELOG.md +0 -45
- data/Gemfile +0 -8
- data/Gemfile.lock +0 -97
- data/Rakefile +0 -12
- data/bin/console +0 -16
- data/bin/setup +0 -8
- data/object_inspector.gemspec +0 -47
- data/scripts/benchmarking/formatters.rb +0 -118
- data/scripts/benchmarking/object_inspector.rb +0 -74
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d20f26835756f0ebb2f4ecb6371662cc35a4cb9d62e72682a5b76d8e96ca8290
|
4
|
+
data.tar.gz: c41e95352adedc432259b57f8ed0be5e16a9a0b7860ba23e5bbd8f8fa1cecf9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 141e7e013e692ff025d7f6c2bc11f395ed6ff8499c30e5d161d7e5fc0219f2981b688ea1db6c01a80e87363553bf07a5b8319d04db744f688a3839bcf9ff1982
|
7
|
+
data.tar.gz: 4a811cba205e011f8d8ce390c89da2aa93dd01e21692ce28516739b35c7907c7f7e416f606c39fdfb92edba237f76ac439175dd90c1fefc498b7e8ad25bbcfae
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
-
#
|
1
|
+
# Object Inspector
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/object_inspector)
|
4
|
-
[](https://travis-ci.org/pdobb/object_inspector)
|
5
|
-
[](https://codeclimate.com/github/pdobb/object_inspector/test_coverage)
|
6
4
|
[](https://codeclimate.com/github/pdobb/object_inspector/maintainability)
|
7
5
|
|
8
|
-
|
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.
|
9
7
|
|
10
|
-
Because object inspection code should be uniform, easy to build, and its output should be easy to read!
|
8
|
+
Why? Because object inspection code should be uniform, easy to build, and its output should be easy to read!
|
11
9
|
|
12
10
|
If you'd like to just jump into an example: [Full Example](#full-example).
|
13
11
|
|
@@ -32,18 +30,17 @@ Or install it yourself:
|
|
32
30
|
## Compatibility
|
33
31
|
|
34
32
|
Tested MRI Ruby Versions:
|
35
|
-
* 2.
|
36
|
-
*
|
37
|
-
*
|
38
|
-
* 2
|
39
|
-
* edge
|
33
|
+
* 2.7
|
34
|
+
* 3.0
|
35
|
+
* 3.1
|
36
|
+
* 3.2
|
40
37
|
|
41
|
-
|
38
|
+
Object Inspector has no other dependencies.
|
42
39
|
|
43
40
|
|
44
41
|
## Configuration
|
45
42
|
|
46
|
-
Global/default values for
|
43
|
+
Global/default values for Object Inspector can be configured via the ObjectInspector::Configuration object.
|
47
44
|
|
48
45
|
_Note: In a Rails app, the following would go in e.g. `config/initializers/object_inspector.rb`_
|
49
46
|
|
@@ -392,13 +389,13 @@ class MyDelegatingWrapperObject
|
|
392
389
|
@my_object = my_object
|
393
390
|
end
|
394
391
|
|
395
|
-
def inspect(**
|
392
|
+
def inspect(**kwargs)
|
396
393
|
super(identification: self.class.name,
|
397
394
|
name: nil,
|
398
395
|
flags: nil,
|
399
396
|
info: nil,
|
400
397
|
issues: nil,
|
401
|
-
**
|
398
|
+
**kwargs)
|
402
399
|
end
|
403
400
|
|
404
401
|
def to_model
|
@@ -512,7 +509,7 @@ See examples:
|
|
512
509
|
|
513
510
|
## Supporting Gems
|
514
511
|
|
515
|
-
|
512
|
+
Object Inspector works great with the [Object Identifier](https://github.com/pdobb/object_identifier) gem.
|
516
513
|
|
517
514
|
```ruby
|
518
515
|
class MyObject
|
@@ -545,14 +542,14 @@ MyObject.new.inspect
|
|
545
542
|
|
546
543
|
## Performance
|
547
544
|
|
548
|
-
### Benchmarking
|
545
|
+
### Benchmarking Object Inspector
|
549
546
|
|
550
547
|
ObjectInspetor is ~4x slower than Ruby's default inspect.
|
551
548
|
|
552
|
-
Performance of
|
549
|
+
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 pry console for this gem.
|
553
550
|
|
554
551
|
```ruby
|
555
|
-
play
|
552
|
+
play script/benchmarking/object_inspector.rb
|
556
553
|
# Comparison:
|
557
554
|
# Ruby: 30382.2 i/s
|
558
555
|
# ObjectInspector::Inspector: 7712.2 i/s - 3.94x slower
|
@@ -563,10 +560,10 @@ play scripts/benchmarking/object_inspector.rb
|
|
563
560
|
|
564
561
|
[ObjectInspector::TemplatingFormatter] -- which is the default Formatter -- outperforms [ObjectInspector::CombiningFormatter] by about 30% on average.
|
565
562
|
|
566
|
-
Performance of Formatters can be tested by playing the [Formatters Benchmarking Scripts] in the pry console for this gem.
|
563
|
+
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 pry console for this gem.
|
567
564
|
|
568
565
|
```ruby
|
569
|
-
play
|
566
|
+
play script/benchmarking/formatters.rb
|
570
567
|
# == Averaged =============================================================
|
571
568
|
# ...
|
572
569
|
#
|
@@ -585,7 +582,7 @@ Custom Formatters may be similarly gauged for comparison by adding them to the `
|
|
585
582
|
```ruby
|
586
583
|
custom_formatter_klasses = [MyCustomFormatter]
|
587
584
|
|
588
|
-
play
|
585
|
+
play script/benchmarking/formatters.rb
|
589
586
|
# == Averaged =============================================================
|
590
587
|
# ...
|
591
588
|
#
|
@@ -600,10 +597,20 @@ play scripts/benchmarking/formatters.rb
|
|
600
597
|
|
601
598
|
## Development
|
602
599
|
|
603
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
600
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. Or, run `rake` to run the tests plus linters as well as `yard` (to confirm proper YARD documentation practices). You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
604
601
|
|
605
|
-
To install this gem onto your local machine, run `bundle exec rake install`.
|
602
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
606
603
|
|
604
|
+
To release a new version, update the version number in `version.rb`, bump the latest ruby target versions etc. with `rake bump`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
605
|
+
|
606
|
+
### Documentation
|
607
|
+
|
608
|
+
[YARD documentation](https://yardoc.org/index.html) can be generated and viewed live:
|
609
|
+
1. Install YARD: `gem install yard`
|
610
|
+
2. Run the YARD server: `yard server --reload`
|
611
|
+
3. Open the live documentation site: `open http://localhost:8808`
|
612
|
+
|
613
|
+
While the YARD server is running, documentation in the live site will be auto-updated on source code save (and site reload).
|
607
614
|
|
608
615
|
## Contributing
|
609
616
|
|
@@ -617,5 +624,5 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
617
624
|
|
618
625
|
[ObjectInspector::TemplatingFormatter]: https://github.com/pdobb/object_inspector/blob/master/lib/object_inspector/formatters/templating_formatter.rb
|
619
626
|
[ObjectInspector::CombiningFormatter]: https://github.com/pdobb/object_inspector/blob/master/lib/object_inspector/formatters/combining_formatter.rb
|
620
|
-
[
|
621
|
-
[Formatters Benchmarking Scripts]: https://github.com/pdobb/object_inspector/blob/master/
|
627
|
+
[Object Inspector Benchmarking Scripts]: https://github.com/pdobb/object_inspector/blob/master/script/benchmarking/object_inspector.rb
|
628
|
+
[Formatters Benchmarking Scripts]: https://github.com/pdobb/object_inspector/blob/master/script/benchmarking/formatters.rb
|
@@ -1,23 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
module_function
|
3
|
+
# ObjectInspector::Conversions defines conversion functions used by
|
4
|
+
# ObjectInspector.
|
5
|
+
module ObjectInspector::Conversions
|
6
|
+
module_function
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
8
|
+
# Convert the passed in value to an {ObjectInspector::Scope} object.
|
9
|
+
# Just returns the passed in value if it already is an
|
10
|
+
# {ObjectInspector::Scope} object.
|
11
|
+
#
|
12
|
+
# @return [ObjectInspector::Scope]
|
13
|
+
#
|
14
|
+
# :reek:UncommunicativeMethodName
|
15
|
+
def Scope(value) # rubocop:disable Naming/MethodName
|
16
|
+
case value
|
17
|
+
when ObjectInspector::Scope
|
18
|
+
value
|
19
|
+
else
|
20
|
+
ObjectInspector::Scope.new(value)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -1,71 +1,69 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
attr_reader :inspector
|
3
|
+
# ObjectInspector::BaseFormatter is an abstract base class that interfaces
|
4
|
+
# with {ObjectInspector::Inspector} objects to combine the supplied
|
5
|
+
# {#identification}, {#flags}, {#info}, and {#name} strings into a friendly
|
6
|
+
# "inspect" String.
|
7
|
+
class ObjectInspector::BaseFormatter
|
8
|
+
attr_reader :inspector
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
# @param inspector [ObjectInspector::Inspector]
|
11
|
+
def initialize(inspector)
|
12
|
+
@inspector = inspector
|
13
|
+
end
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
# Perform the formatting routine.
|
16
|
+
#
|
17
|
+
# @return [String]
|
18
|
+
def call
|
19
|
+
raise NotImplementedError
|
20
|
+
end
|
22
21
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
# Delegates to {Inspector#wrapped_object_inspection_result}.
|
23
|
+
#
|
24
|
+
# @return [String] if given
|
25
|
+
# @return [NilClass] if not given
|
26
|
+
def wrapped_object_inspection_result
|
27
|
+
@wrapped_object_inspection_result ||=
|
28
|
+
@inspector.wrapped_object_inspection_result
|
29
|
+
end
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
31
|
+
# Delegates to {Inspector#identification}.
|
32
|
+
#
|
33
|
+
# @return [String] if given
|
34
|
+
def identification
|
35
|
+
@identification ||= @inspector.identification
|
36
|
+
end
|
38
37
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
38
|
+
# Delegates to {Inspector#flags}.
|
39
|
+
#
|
40
|
+
# @return [String] if given
|
41
|
+
# @return [NilClass] if not given
|
42
|
+
def flags
|
43
|
+
@flags ||= @inspector.flags
|
44
|
+
end
|
46
45
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
46
|
+
# Delegates to {Inspector#issues}.
|
47
|
+
#
|
48
|
+
# @return [String] if given
|
49
|
+
# @return [NilClass] if not given
|
50
|
+
def issues
|
51
|
+
@issues ||= @inspector.issues
|
52
|
+
end
|
54
53
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
54
|
+
# Delegates to {Inspector#info}.
|
55
|
+
#
|
56
|
+
# @return [String] if given
|
57
|
+
# @return [NilClass] if not given
|
58
|
+
def info
|
59
|
+
@info ||= @inspector.info
|
60
|
+
end
|
62
61
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end
|
62
|
+
# Delegates to {Inspector#name}.
|
63
|
+
#
|
64
|
+
# @return [String] if given
|
65
|
+
# @return [NilClass] if not given
|
66
|
+
def name
|
67
|
+
@name ||= @inspector.name
|
70
68
|
end
|
71
69
|
end
|
@@ -1,63 +1,61 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
# ObjectInspector::CombiningFormatter implements
|
4
|
+
# {ObjectInspector::BaseFormatter} to return the standard/default inspect
|
5
|
+
# output format by combining Strings.
|
6
|
+
#
|
7
|
+
# @attr (see BaseFormatter)
|
8
|
+
class ObjectInspector::CombiningFormatter < ObjectInspector::BaseFormatter
|
9
|
+
# Perform the formatting routine.
|
7
10
|
#
|
8
|
-
# @
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
if wrapped_object_inspection_result
|
15
|
-
build_wrapped_object_string
|
16
|
-
else
|
17
|
-
build_string
|
18
|
-
end
|
11
|
+
# @return [String]
|
12
|
+
def call
|
13
|
+
if wrapped_object_inspection_result
|
14
|
+
build_wrapped_object_string
|
15
|
+
else
|
16
|
+
build_string
|
19
17
|
end
|
18
|
+
end
|
20
19
|
|
21
|
-
|
20
|
+
private
|
22
21
|
|
23
|
-
|
24
|
-
|
22
|
+
def build_wrapped_object_string
|
23
|
+
"#{build_string} "\
|
25
24
|
"#{ObjectInspector.configuration.presented_object_separator} "\
|
26
25
|
"#{wrapped_object_inspection_result}"
|
27
|
-
|
26
|
+
end
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
def build_string
|
29
|
+
"<#{combine_strings}>"
|
30
|
+
end
|
32
31
|
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
def combine_strings
|
33
|
+
strings.join
|
34
|
+
end
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
36
|
+
# Override in subclasses as needed.
|
37
|
+
def strings
|
38
|
+
[
|
39
|
+
build_identification_string,
|
40
|
+
build_flags_string,
|
41
|
+
build_info_string,
|
42
|
+
build_name_string,
|
43
|
+
].compact
|
44
|
+
end
|
46
45
|
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
def build_identification_string
|
47
|
+
identification.to_s
|
48
|
+
end
|
50
49
|
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
def build_flags_string
|
51
|
+
"(#{flags.to_s.upcase})" if flags
|
52
|
+
end
|
54
53
|
|
55
|
-
|
56
|
-
|
57
|
-
|
54
|
+
def build_info_string
|
55
|
+
" #{info}" if info
|
56
|
+
end
|
58
57
|
|
59
|
-
|
60
|
-
|
61
|
-
end
|
58
|
+
def build_name_string
|
59
|
+
" :: #{name}" if name
|
62
60
|
end
|
63
61
|
end
|