object_inspector 0.1.0 → 0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 695389e5c3a953c4bfd33d5fbe987008beb63c5a1235c4a8d3fdeb894b5727e5
4
- data.tar.gz: a05becc6eec712e462d979fd6c23e4c6375cfb4bd2b9503e1752bd218bdf70ca
3
+ metadata.gz: 8f80de3b28fe43b95e5fb12538a371807689aa29da9bf7d8a91eb9c4b8b4086c
4
+ data.tar.gz: 775cecd797055357a8b4fb1c97d7c02a2821b8fbfbb0482f5a646f68da6a3710
5
5
  SHA512:
6
- metadata.gz: 0c6023ee714bcdebbb198d7d3a1635d4c696f262a7112b7f457821c03fc889bb75c68f0112a94c95c5c8ae253c0c07ef8f920b8e0708bc809274c3d4f63d10ae
7
- data.tar.gz: f9d07b12b361f774800f47805c357373b3e674c61cf74299f8672d4237bb953fa12e6e7238840df5f2afede96dbb7fad09d69b4115e760929b73613aa463fe91
6
+ metadata.gz: 3a0a0c78c42099cc7ea4b03276f6d06182ccad7e4ff657a4875cbe6690f7e277c3861fe7e5f00ebd8f7059516abb064f50ef78bf73ce26fd929f22a23143fddb
7
+ data.tar.gz: 136d08a468531350650e48585f4471948cfdbd877ea4d462d07c11acdb381b276855c9520367dd1fc00ed8a21924b96a561e32b06d7dd51292a8705127221378
data/.travis.yml CHANGED
@@ -9,6 +9,8 @@ rvm:
9
9
  - 2.4.4
10
10
  - 2.5.1
11
11
  - ruby-head
12
+ notifications:
13
+ email: false
12
14
  before_install: gem install bundler -v 1.16.1
13
15
  cache: bundler
14
16
  before_script:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ #### TODO
2
+ * Add "placeholder" symbol (*) for scope exclusions.
3
+ * Add gem defaults configuration.
4
+
5
+
6
+ ### 0.2.0 - 2018-04-12
7
+
8
+ * Automatically inspect wrapped Objects, if applicable.
9
+ * Use `display_name` if defined on object, in place of `inspect_name`.
10
+ * Add on-the-fly inspect methods when Symbols are passed in to #inspect.
11
+ * Update the `flags` and `info` demarcation symbols.
12
+ * Add ObjectInspector::TemplatingFormatter, and use it as the new default since it's faster.
13
+ * Rename ObjectInspector::DefaultFormatter to ObjectInspector::CombiningFormatter.
14
+
15
+
1
16
  ### 0.1.0 - 2018-04-09
2
17
 
3
18
  * Initial release!
data/Gemfile.lock CHANGED
@@ -6,12 +6,20 @@ PATH
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ ansi (1.5.0)
10
+ benchmark-ips (2.7.2)
11
+ builder (3.2.3)
9
12
  byebug (10.0.2)
10
13
  coderay (1.1.2)
11
14
  docile (1.3.0)
12
15
  json (2.1.0)
13
16
  method_source (0.9.0)
14
17
  minitest (5.11.3)
18
+ minitest-reporters (1.2.0)
19
+ ansi
20
+ builder
21
+ minitest (>= 5.0)
22
+ ruby-progressbar
15
23
  pry (0.11.3)
16
24
  coderay (~> 1.1.0)
17
25
  method_source (~> 0.9.0)
@@ -19,6 +27,7 @@ GEM
19
27
  byebug (~> 10.0)
20
28
  pry (~> 0.10)
21
29
  rake (10.4.2)
30
+ ruby-progressbar (1.9.0)
22
31
  simplecov (0.16.1)
23
32
  docile (~> 1.1)
24
33
  json (>= 1.8, < 3)
@@ -29,9 +38,11 @@ PLATFORMS
29
38
  ruby
30
39
 
31
40
  DEPENDENCIES
41
+ benchmark-ips (~> 2.7)
32
42
  bundler (~> 1.16)
33
43
  byebug (~> 10.0)
34
44
  minitest (~> 5.0)
45
+ minitest-reporters (~> 1.2)
35
46
  object_inspector!
36
47
  pry (~> 0.11)
37
48
  pry-byebug (~> 3.6)
data/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # ObjectInspector
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/object_inspector.png)](http://badge.fury.io/rb/object_inspector)
3
+ [![Gem Version](https://badge.fury.io/rb/object_inspector.svg)](https://badge.fury.io/rb/object_inspector)
4
4
  [![Build Status](https://travis-ci.org/objects-on-rails/display-case.svg?branch=master)](https://travis-ci.org/objects-on-rails/display-case)
5
5
  [![Test Coverage](https://api.codeclimate.com/v1/badges/34e821263d9e0c33d536/test_coverage)](https://codeclimate.com/github/pdobb/object_inspector/test_coverage)
6
6
  [![Maintainability](https://api.codeclimate.com/v1/badges/34e821263d9e0c33d536/maintainability)](https://codeclimate.com/github/pdobb/object_inspector/maintainability)
7
7
 
8
- ObjectInspector takes Object#inspect to the next level. Specify any combination of identification attributes, flags, info, and/or a name along with a self-definable scope option to represent an object in the console, in logging, or otherwise.
8
+ ObjectInspector takes Object#inspect to the next level. Specify any combination of identification attributes, flags, info, and/or a name along with an optional self-definable scope option to represent an object in the console, in logging, etc.
9
9
 
10
10
 
11
11
  ## Installation
@@ -36,19 +36,7 @@ Tested MRI Ruby Versions:
36
36
 
37
37
  ## Usage
38
38
 
39
- Given, an object of any type, call ObjectInspector::Inspect#to_s.
40
-
41
- ```ruby
42
- class MyObject
43
- def inspect
44
- ObjectInspector::Inspector.new(self).to_s
45
- end
46
- end
47
-
48
- MyObject.new.inspect # => "<MyObject>"
49
- ```
50
-
51
- Or, just use the ObjectInspector::Inspector.inspect method.
39
+ Given, an object of any type, call ObjectInspector::Inspector.inspect.
52
40
 
53
41
  ```ruby
54
42
  class MyObject
@@ -65,24 +53,23 @@ See also [Helper Usage](#helper-usage) for an even simpler usage option.
65
53
 
66
54
  ### Output Customization
67
55
 
68
- Use ObjectInspector::Inspector#initialize options -- `identification`, `flags`, `info`, and `name` -- to customize inspect output.
56
+ Use the `identification`, `flags`, `info`, and `name` options to customize inspect output.
69
57
 
70
58
  ```ruby
71
59
  class MyObject
72
60
  def inspect
73
- ObjectInspector::Inspector.inspect(
74
- self,
75
- identification: "My Object",
76
- flags: "FLAG1",
77
- info: "INFO",
78
- name: "NAME")
61
+ ObjectInspector::Inspector.inspect(self,
62
+ identification: "My Object",
63
+ flags: "FLAG1",
64
+ info: "INFO",
65
+ name: "NAME")
79
66
  end
80
67
  end
81
68
 
82
- MyObject.new.inspect # => "<My Object[FLAG1] (INFO) :: NAME>"
69
+ MyObject.new.inspect # => "<My Object(FLAG1) INFO :: NAME>"
83
70
  ```
84
71
 
85
- Or, define `inspect_identification`, `inspect_flags`, `inspect_info`, and `inspect_name` in Object.
72
+ Or, define `inspect_identification`, `inspect_flags`, `inspect_info`, and `inspect_name` as either public or private methods on Object.
86
73
 
87
74
  ```ruby
88
75
  class MyObject
@@ -92,30 +79,19 @@ class MyObject
92
79
 
93
80
  private
94
81
 
95
- def inspect_identification
96
- "My Object"
97
- end
98
-
99
- def inspect_flags
100
- "FLAG1"
101
- end
102
-
103
- def inspect_info
104
- "INFO"
105
- end
106
-
107
- def inspect_name
108
- "NAME"
109
- end
82
+ def inspect_identification; "My Object" end
83
+ def inspect_flags; "FLAG1" end
84
+ def inspect_info; "INFO" end
85
+ def inspect_name; "NAME" end
110
86
  end
111
87
 
112
- MyObject.new.inspect # => "<My Object[FLAG1] (INFO) :: NAME>"
88
+ MyObject.new.inspect # => "<My Object(FLAG1) INFO :: NAME>"
113
89
  ```
114
90
 
115
91
 
116
92
  ## Helper Usage
117
93
 
118
- To save a little typing, include ObjectInspector::InspectHelper into an object and ObjectInspector::Inspector#to_s will be called for you on `self`.
94
+ To save some typing, include ObjectInspector::InspectHelper into an object and ObjectInspector::Inspector.inspect will be called on `self` automatically.
119
95
 
120
96
  ```ruby
121
97
  class MyObject
@@ -139,7 +115,7 @@ class MyObject
139
115
  end
140
116
  end
141
117
 
142
- MyObject.new.inspect # => "<My Object[FLAG1] (INFO) :: NAME>"
118
+ MyObject.new.inspect # => "<My Object(FLAG1) INFO :: NAME>"
143
119
  ```
144
120
 
145
121
  Or, define `inspect_identification`, `inspect_flags`, `inspect_info`, and `inspect_name` in Object.
@@ -150,39 +126,46 @@ class MyObject
150
126
 
151
127
  private
152
128
 
153
- def inspect_identification
154
- "My Object"
155
- end
129
+ def inspect_identification; "My Object" end
130
+ def inspect_flags; "FLAG1" end
131
+ def inspect_info; "INFO" end
132
+ def inspect_name; "NAME" end
133
+ end
156
134
 
157
- def inspect_flags
158
- "FLAG1"
159
- end
135
+ MyObject.new.inspect # => "<My Object(FLAG1) INFO :: NAME>"
136
+ ```
160
137
 
161
- def inspect_info
162
- "INFO"
163
- end
164
138
 
165
- def inspect_name
166
- "NAME"
167
- end
139
+ ## On-the-fly Inspect Methods
140
+
141
+ When passed as an option (as opposed to being called via an Object-defined method) symbols will be called/evaluated on Object on the fly.
142
+
143
+ ```ruby
144
+ class MyObject
145
+ include ObjectInspector::InspectorsHelper
146
+
147
+ def my_method1; "Result1" end
148
+ def my_method2; "Result2" end
149
+
150
+ def inspect_info; :my_method2 end
168
151
  end
169
152
 
170
- MyObject.new.inspect # => "<My Object[FLAG1] (INFO) :: NAME>"
153
+ MyObject.new.inspect(info: "my_method1") # => "<MyObject my_method1>"
154
+ MyObject.new.inspect(info: :my_method2) # => "<MyObject Result2>"
155
+ MyObject.new.inspect # => "<MyObject my_method2>"
171
156
  ```
172
157
 
173
158
 
174
159
  #### Scope
175
160
 
176
- Use the `scope` option to define the scope of the `inspect_` methods.
161
+ Use the `scope` option to define the scope of the `inspect_*` methods.
177
162
 
178
163
  If ActiveSupport::StringInquirer is defined then the default `scope` is `"self".inquiry`.
179
164
  The default value is `:self` if ActiveSupport::StringInquirer is not defined.
180
165
 
181
166
  ```ruby
182
167
  class MyObject
183
- def inspect(scope: :self)
184
- ObjectInspector::Inspector.inspect(self, scope: scope)
185
- end
168
+ include ObjectInspector::InspectorsHelper
186
169
 
187
170
  def inspect_flags(scope:, separator: " / ".freeze)
188
171
  flags = ["FLAG1"]
@@ -197,37 +180,52 @@ class MyObject
197
180
  end
198
181
  end
199
182
 
200
- MyObject.new.inspect # => "<MyObject[FLAG1]>"
201
- MyObject.new.inspect(scope: :all) # => "<MyObject[FLAG1 / FLAG2]>"
183
+ MyObject.new.inspect # => "<MyObject(FLAG1)>"
184
+ MyObject.new.inspect(scope: :all) # => "<MyObject(FLAG1 / FLAG2)>"
202
185
  ```
203
186
 
204
187
 
205
- ## Custom Formatters
188
+ ## Wrapped Objects
206
189
 
207
- A custom inspect formatter can be defined by implementing the interface defined by [ObjectInspector::BaseFormatter](https://github.com/pdobb/object_inspector/blob/master/lib/object_inspector/base_formatter.rb) and then passing that into ObjectInspector::Inspector.new.
190
+ 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 (⇨).
208
191
 
209
192
  ```ruby
210
- class MyCustomFormatter < ObjectInspector::BaseFormatter
211
- def call
212
- "(#{combine_strings})"
193
+ class MyWrapperObject
194
+ include ObjectInspector::InspectorsHelper
195
+
196
+ def to_model
197
+ @to_model ||= MyWrappedObject.new
213
198
  end
214
199
 
215
200
  private
216
201
 
217
- def build_identification_string(identification = self.identification)
218
- identification.to_s
219
- end
202
+ def inspect_flags; "WRAPPER_FLAG1" end
203
+ end
220
204
 
221
- def build_flags_string(flags = self.flags)
222
- " #{flags}" if flags
223
- end
205
+ class MyWrappedObject
206
+ include ObjectInspector::InspectorsHelper
224
207
 
225
- def build_info_string(info = self.info)
226
- " (#{info})" if info
227
- end
208
+ private
209
+
210
+ def inspect_flags; "FLAG1" end
211
+ def inspect_info; "INFO" end
212
+ end
213
+
214
+ MyWrapperObject.new.inspect
215
+ # => "<MyWrapperObject(WRAPPER_FLAG1)> ⇨ <MyWrappedObject(FLAG1) INFO>"
216
+ ```
217
+
218
+ This feature is recursive.
219
+
220
+
221
+ ## Custom Formatters
222
+
223
+ A custom inspect formatter can be defined by implementing the interface defined by [ObjectInspector::BaseFormatter](https://github.com/pdobb/object_inspector/blob/master/lib/object_inspector/formatters/base_formatter.rb) and then passing that into ObjectInspector::Inspector.new.
228
224
 
229
- def build_name_string(name = self.name)
230
- " -- #{name}" if name
225
+ ```ruby
226
+ class MyCustomFormatter < ObjectInspector::BaseFormatter
227
+ def call
228
+ "[#{identification} Flags: #{flags} -- Info: #{info} -- Name: #{name}]"
231
229
  end
232
230
  end
233
231
 
@@ -235,35 +233,77 @@ class MyObject
235
233
  include ObjectInspector::InspectorsHelper
236
234
 
237
235
  def inspect
238
- super(formatter: MyCustomFormatter)
236
+ super(formatter: MyCustomFormatter,
237
+ identification: "IDENTIFICATION",
238
+ flags: "FLAG1 | FLAG2",
239
+ info: "INFO",
240
+ name: "NAME")
239
241
  end
242
+ end
240
243
 
241
- private
244
+ MyObject.new.inspect
245
+ # => "[IDENTIFICATION Flags: FLAG1 | FLAG2 -- Info: INFO -- Name: NAME]"
246
+ ```
242
247
 
243
- def inspect_identification
244
- "IDENTIFICATION"
245
- end
248
+ See also: [ObjectInspector::TemplatingFormatter].
249
+ See also: [ObjectInspector::CombiningFormatter].
246
250
 
247
- def inspect_flags
248
- "FLAG1"
249
- end
250
251
 
251
- def inspect_info
252
- "INFO"
253
- end
252
+ ## Performance
254
253
 
255
- def inspect_name
256
- "NAME"
257
- end
258
- end
254
+ ### Benchmarking ObjectInspector
255
+
256
+ ObjectInspetor is ~4x slower than Ruby's default inspect.
257
+
258
+ Performance of ObjectInspect can be tested by playing the [ObjectInspector Benchmarking Scripts] in the pry console for this gem.
259
259
 
260
- MyObject.new.inspect # => "(IDENTIFICATION FLAG1 (INFO) -- NAME)"
260
+ ```ruby
261
+ play scripts/benchmarking/object_inspector.rb
262
+ # Comparison:
263
+ # Ruby: 30382.2 i/s
264
+ # ObjectInspector::Inspector: 7712.2 i/s - 3.94x slower
261
265
  ```
262
266
 
263
- See also: [ObjectInspector::DefaultFormatter](https://github.com/pdobb/object_inspector/blob/master/lib/object_inspector/default_formatter.rb).
267
+
268
+ ### Benchmarking Formatters
269
+
270
+ [ObjectInspector::TemplatingFormatter] -- which is the default Formatter -- outperforms [ObjectInspector::CombiningFormatter] by about 30% on average.
271
+
272
+ Performance of Formatters can be tested by playing the [Formatters Benchmarking Scripts] in the pry console for this gem.
273
+
274
+ ```ruby
275
+ play scripts/benchmarking/formatters.rb
276
+ # == Averaged =============================================================
277
+ # ...
278
+ #
279
+ # Comparison:
280
+ # ObjectInspector::TemplatingFormatter: 45725.3 i/s
281
+ # ObjectInspector::CombiningFormatter: 34973.9 i/s - 1.31x slower
282
+ #
283
+ # == Done
284
+ ```
285
+
286
+ #### Benchmarking Custom Formatters
287
+
288
+ Custom Formatters may be similarly gauged for comparison by adding them to the `custom_formatter_klasses` array before playing the script.
289
+
290
+ ```ruby
291
+ custom_formatter_klasses = [MyCustomFormatter]
292
+
293
+ play scripts/benchmarking/formatters.rb
294
+ # == Averaged =============================================================
295
+ # ...
296
+ #
297
+ # Comparison:
298
+ # MyCustomFormatter: 52001.2 i/s
299
+ # ObjectInspector::TemplatingFormatter: 49854.2 i/s - same-ish: difference falls within error
300
+ # ObjectInspector::CombiningFormatter: 38963.5 i/s - 1.33x slower
301
+ #
302
+ # == Done
303
+ ```
264
304
 
265
305
 
266
- ## Supporting Libraries
306
+ ## Supporting Gems
267
307
 
268
308
  ObjectInspector works great with the [ObjectIdentifier](https://github.com/pdobb/object_identifier) gem.
269
309
 
@@ -272,33 +312,23 @@ class MyObject
272
312
  include ObjectInspector::InspectorsHelper
273
313
 
274
314
  def my_method1
275
- "R1"
315
+ "Result1"
276
316
  end
277
317
 
278
- def my_method1
279
- "R1"
318
+ def my_method2
319
+ "Result2"
280
320
  end
281
321
 
282
322
  private
283
323
 
284
- def inspect_identification
285
- identify(:m1, :m2)
286
- end
287
-
288
- def inspect_flags
289
- "FLAG1"
290
- end
291
-
292
- def inspect_info
293
- "INFO"
294
- end
295
-
296
- def inspect_name
297
- "NAME"
298
- end
324
+ def inspect_identification; identify(:my_method1, :my_method2) end
325
+ def inspect_flags; "FLAG1" end
326
+ def inspect_info; "INFO" end
327
+ def inspect_name; "NAME" end
299
328
  end
300
329
 
301
- MyObject.new.inspect # => "<MyObject[m1:R1, m2:R2][FLAG1] (INFO) :: NAME>"
330
+ MyObject.new.inspect
331
+ # => "<MyObject[my_method1:Result1, my_method2:Result2](FLAG1) INFO :: NAME>"
302
332
  ```
303
333
 
304
334
 
@@ -317,3 +347,9 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/pdobb/
317
347
  ## License
318
348
 
319
349
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
350
+
351
+
352
+ [ObjectInspector::TemplatingFormatter]: https://github.com/pdobb/object_inspector/blob/master/lib/object_inspector/formatters/templating_formatter.rb
353
+ [ObjectInspector::CombiningFormatter]: https://github.com/pdobb/object_inspector/blob/master/lib/object_inspector/formatters/combining_formatter.rb
354
+ [ObjectInspector Benchmarking Scripts]: https://github.com/pdobb/object_inspector/blob/master/scripts/benchmarking/object_inspector.rb
355
+ [Formatters Benchmarking Scripts]: https://github.com/pdobb/object_inspector/blob/master/scripts/benchmarking/formatters.rb
@@ -6,6 +6,8 @@ module ObjectInspector
6
6
  #
7
7
  # @attr inspector [ObjectInspector::Inspector]
8
8
  class BaseFormatter
9
+ RIGHT_ARROW_ICON = [0x21E8].pack("U").freeze
10
+
9
11
  attr_reader :inspector
10
12
 
11
13
  def initialize(inspector)
@@ -19,11 +21,19 @@ module ObjectInspector
19
21
  raise NotImplementedError
20
22
  end
21
23
 
24
+ # Delegates to {Inspector#wrapped_object_inspection}.
25
+ #
26
+ # @return [String] if given
27
+ # @return [NilClass] if not given
28
+ def wrapped_object_inspection
29
+ @wrapped_object_inspection ||= inspector.wrapped_object_inspection
30
+ end
31
+
22
32
  # Delegates to {Inspector#identification}.
23
33
  #
24
34
  # @return [String] if given
25
35
  def identification
26
- @inspector.identification
36
+ @identification ||= inspector.identification
27
37
  end
28
38
 
29
39
  # Delegates to {Inspector#flags}.
@@ -31,7 +41,7 @@ module ObjectInspector
31
41
  # @return [String] if given
32
42
  # @return [NilClass] if not given
33
43
  def flags
34
- @inspector.flags
44
+ @flags ||= inspector.flags
35
45
  end
36
46
 
37
47
  # Delegates to {Inspector#info}.
@@ -39,7 +49,7 @@ module ObjectInspector
39
49
  # @return [String] if given
40
50
  # @return [NilClass] if not given
41
51
  def info
42
- @inspector.info
52
+ @info ||= inspector.info
43
53
  end
44
54
 
45
55
  # Delegates to {Inspector#name}.
@@ -47,39 +57,7 @@ module ObjectInspector
47
57
  # @return [String] if given
48
58
  # @return [NilClass] if not given
49
59
  def name
50
- @inspector.name
51
- end
52
-
53
- private
54
-
55
- def combine_strings
56
- strings.join
57
- end
58
-
59
- # Override in subclasses as needed.
60
- def strings
61
- [
62
- build_identification_string,
63
- build_flags_string,
64
- build_info_string,
65
- build_name_string,
66
- ].compact
67
- end
68
-
69
- def build_identification_string(*)
70
- raise NotImplementedError
71
- end
72
-
73
- def build_flags_string(*)
74
- raise NotImplementedError
75
- end
76
-
77
- def build_info_string(*)
78
- raise NotImplementedError
79
- end
80
-
81
- def build_name_string(*)
82
- raise NotImplementedError
60
+ @name ||= inspector.name
83
61
  end
84
62
  end
85
63
  end
@@ -0,0 +1,59 @@
1
+ module ObjectInspector
2
+ # ObjectInspector::CombiningFormatter implements
3
+ # {ObjectInspector::BaseFormatter} to return the standard/default inspect
4
+ # output format by combining Strings.
5
+ #
6
+ # @attr (see BaseFormatter)
7
+ class CombiningFormatter < BaseFormatter
8
+ # Perform the formatting routine.
9
+ #
10
+ # @return [String]
11
+ def call
12
+ if wrapped_object_inspection
13
+ build_wrapped_object_string
14
+ else
15
+ build_string
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def build_wrapped_object_string
22
+ "#{build_string} #{RIGHT_ARROW_ICON} #{wrapped_object_inspection}"
23
+ end
24
+
25
+ def build_string
26
+ "<#{combine_strings}>"
27
+ end
28
+
29
+ def combine_strings
30
+ strings.join
31
+ end
32
+
33
+ # Override in subclasses as needed.
34
+ def strings
35
+ [
36
+ build_identification_string,
37
+ build_flags_string,
38
+ build_info_string,
39
+ build_name_string,
40
+ ].compact
41
+ end
42
+
43
+ def build_identification_string
44
+ identification.to_s
45
+ end
46
+
47
+ def build_flags_string
48
+ "(#{flags.to_s.upcase})" if flags
49
+ end
50
+
51
+ def build_info_string
52
+ " #{info}" if info
53
+ end
54
+
55
+ def build_name_string
56
+ " :: #{name}" if name
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,143 @@
1
+ module ObjectInspector
2
+ # ObjectInspector::TemplatingFormatter implements
3
+ # {ObjectInspector::BaseFormatter} to return the standard/default inspect
4
+ # output format via String templates.
5
+ #
6
+ # @attr (see BaseFormatter)
7
+ class TemplatingFormatter < BaseFormatter
8
+ def self.base_template
9
+ @base_template ||= "<%s>".freeze
10
+ end
11
+
12
+ def self.name_template
13
+ @name_template ||= "<%s :: %s>".freeze
14
+ end
15
+
16
+ def self.flags_and_name_template
17
+ @flags_and_name_template ||= "<%s(%s) :: %s>".freeze
18
+ end
19
+
20
+ def self.info_and_name_template
21
+ @info_and_name_template ||= "<%s %s :: %s>".freeze
22
+ end
23
+
24
+ def self.flags_and_info_template
25
+ @flags_and_info_template ||= "<%s(%s) %s>".freeze
26
+ end
27
+
28
+ def self.flags_and_info_and_name_template
29
+ @flags_and_info_and_name_template ||= "<%s(%s) %s :: %s>".freeze
30
+ end
31
+
32
+ def self.flags_template
33
+ @flags_template ||= "<%s(%s)>".freeze
34
+ end
35
+
36
+ def self.info_template
37
+ @info_template ||= "<%s %s>".freeze
38
+ end
39
+
40
+ # Perform the formatting routine.
41
+ #
42
+ # @return [String]
43
+ def call
44
+ if wrapped_object_inspection
45
+ build_wrapped_object_string
46
+ else
47
+ build_string
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def build_wrapped_object_string
54
+ "#{build_string} #{RIGHT_ARROW_ICON} #{wrapped_object_inspection}"
55
+ end
56
+
57
+ def build_string
58
+ if flags
59
+ if info
60
+ if name
61
+ build_flags_and_info_and_name_string
62
+ else
63
+ build_flags_and_info_string
64
+ end
65
+ elsif name
66
+ build_flags_and_name_string
67
+ else
68
+ build_flags_string
69
+ end
70
+ elsif info
71
+ if name
72
+ build_info_and_name_string
73
+ else
74
+ build_info_string
75
+ end
76
+ elsif name
77
+ build_name_string
78
+ else
79
+ build_base_string
80
+ end
81
+ end
82
+
83
+ def build_flags_and_info_and_name_string
84
+ self.class.flags_and_info_and_name_template % [
85
+ identification,
86
+ flags,
87
+ info,
88
+ name
89
+ ]
90
+ end
91
+
92
+ def build_flags_and_info_string
93
+ self.class.flags_and_info_template % [
94
+ identification,
95
+ flags,
96
+ info
97
+ ]
98
+ end
99
+
100
+ def build_flags_and_name_string
101
+ self.class.flags_and_name_template % [
102
+ identification,
103
+ flags,
104
+ name
105
+ ]
106
+ end
107
+
108
+ def build_info_and_name_string
109
+ self.class.info_and_name_template % [
110
+ identification,
111
+ info,
112
+ name
113
+ ]
114
+ end
115
+
116
+ def build_name_string
117
+ self.class.name_template % [
118
+ identification,
119
+ name
120
+ ]
121
+ end
122
+
123
+ def build_flags_string
124
+ self.class.flags_template % [
125
+ identification,
126
+ flags
127
+ ]
128
+ end
129
+
130
+ def build_info_string
131
+ self.class.info_template % [
132
+ identification,
133
+ info
134
+ ]
135
+ end
136
+
137
+ def build_base_string
138
+ self.class.base_template % [
139
+ identification
140
+ ]
141
+ end
142
+ end
143
+ end
@@ -1,6 +1,7 @@
1
1
  module ObjectInspector
2
- # ObjectInspector organizes inspection of the associated {#object} via the
3
- # passed in options and via a {ObjectInspector::BaseFormatter} instance.
2
+ # ObjectInspector::Inspector organizes inspection of the associated {#object}
3
+ # via the passed in options and via a {ObjectInspector::BaseFormatter}
4
+ # instance.
4
5
  #
5
6
  # @attr object [Object] the object being inspected
6
7
  # @attr scope [Symbol] Object inspection type. For example:
@@ -20,7 +21,7 @@ module ObjectInspector
20
21
 
21
22
  # The prefix for all methods called on {#object} for inspect
22
23
  # details/strings.
23
- def self.object_method_prefix
24
+ def self.object_inspect_method_prefix
24
25
  "inspect".freeze
25
26
  end
26
27
 
@@ -35,11 +36,16 @@ module ObjectInspector
35
36
  def initialize(
36
37
  object,
37
38
  scope: :self,
38
- formatter: DefaultFormatter,
39
+ formatter: TemplatingFormatter,
39
40
  **kargs)
40
41
  @object = object
41
42
  @formatter_klass = formatter
42
- @scope = "".respond_to?(:inquiry) ? scope.to_s.inquiry : scope.to_sym
43
+ @scope =
44
+ if ObjectInspector.use_string_inquirers?
45
+ scope.to_s.inquiry
46
+ else
47
+ scope.to_sym
48
+ end
43
49
  @kargs = kargs
44
50
  end
45
51
 
@@ -50,6 +56,19 @@ module ObjectInspector
50
56
  formatter.call
51
57
  end
52
58
 
59
+ # Generate the inspect String for a wrapped object, if applicable.
60
+ #
61
+ # @return [String] if {#object_is_a_wrapper}
62
+ # @return [NilClass] if not {#object_is_a_wrapper}
63
+ def wrapped_object_inspection
64
+ if object_is_a_wrapper?
65
+ self.class.inspect(
66
+ extract_wrapped_object,
67
+ scope: scope,
68
+ formatter: formatter_klass)
69
+ end
70
+ end
71
+
53
72
  # Core object identification details, such as the {#object} class name and
54
73
  # any core-level attributes.
55
74
  #
@@ -75,10 +94,13 @@ module ObjectInspector
75
94
  end
76
95
 
77
96
  # The generally human-friendly unique identifier for {#object}.
97
+ #
78
98
  # @return [String] if given
79
99
  # @return [NilClass] if not given
80
100
  def name
81
- value(key: :name)
101
+ value(key: :name) ||
102
+ interrogate_object(method_name: :display_name,
103
+ kargs: object_method_keyword_arguments)
82
104
  end
83
105
 
84
106
  private
@@ -88,33 +110,61 @@ module ObjectInspector
88
110
  end
89
111
 
90
112
  # @return [String] if `key` is found in {#kargs} or if {#object} responds to
91
- # `#{object_method_prefix}_#{key}` (e.g. `inspect_flags`)
113
+ # `#{object_inspect_method_prefix}_#{key}` (e.g. `inspect_flags`)
92
114
  # @return [NilClass] if not found in {#kargs} or {#object}
93
115
  def value(key:)
94
- result = kargs.fetch(key) { interrogate_object(key) }
116
+ return_value =
117
+ if (passed_in_value = kargs[key])
118
+ evaluate_passed_in_value(passed_in_value)
119
+ else
120
+ interrogate_object_inspect_method(key)
121
+ end
122
+
123
+ return_value.to_s if return_value
124
+ end
95
125
 
96
- result.to_s if result
126
+ # Call `value` on {#object} if it responds to it and the result is not nil,
127
+ # else just return `value`.
128
+ #
129
+ # @return [#to_s] if {#object} responds to `value` and if the call result
130
+ # isn't nil
131
+ # @return [#nil] if {#object} doesn't respond to `value` or if the call
132
+ # result is nil
133
+ def evaluate_passed_in_value(value)
134
+ if value.is_a?(Symbol)
135
+ interrogate_object(method_name: value) || value
136
+ else
137
+ value
138
+ end
97
139
  end
98
140
 
99
- # @return [String] if {#object} responds to `#{object_method_prefix}_#{key}`
100
- # (e.g. `inspect_flags`)
141
+ # Attempt to call `inspect_*` on {#object} based on the passed in `name`.
142
+ #
143
+ # @return [String] if {#object} responds to
144
+ # `#{object_inspect_method_prefix}_#{name}` (e.g. `inspect_flags`)
101
145
  # @return [NilClass] if not found on {#object}
102
- def interrogate_object(key)
146
+ def interrogate_object_inspect_method(name)
147
+ interrogate_object(
148
+ method_name: build_inspet_method_name(name),
149
+ kargs: object_method_keyword_arguments)
150
+ end
151
+
152
+ def interrogate_object(method_name:, kargs: {})
103
153
  interrogator =
104
154
  ObjectInterrogator.new(
105
155
  object: object,
106
- method_name: build_method_name(key),
107
- kargs: object_method_keyword_arguments)
156
+ method_name: method_name,
157
+ kargs: kargs)
108
158
 
109
159
  interrogator.call
110
160
  end
111
161
 
112
- def build_method_name(key)
113
- "#{object_method_prefix}_#{key}"
162
+ def build_inspet_method_name(name)
163
+ "#{object_inspect_method_prefix}_#{name}"
114
164
  end
115
165
 
116
- def object_method_prefix
117
- self.class.object_method_prefix
166
+ def object_inspect_method_prefix
167
+ self.class.object_inspect_method_prefix
118
168
  end
119
169
 
120
170
  def object_method_keyword_arguments
@@ -122,5 +172,14 @@ module ObjectInspector
122
172
  scope: scope,
123
173
  }
124
174
  end
175
+
176
+ def extract_wrapped_object
177
+ object.to_model
178
+ end
179
+
180
+ def object_is_a_wrapper?
181
+ object.respond_to?(:to_model) &&
182
+ object.to_model != object
183
+ end
125
184
  end
126
185
  end
@@ -1,3 +1,3 @@
1
1
  module ObjectInspector
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,11 +1,21 @@
1
- require "object_inspector/version"
2
-
3
1
  # ObjectInspector is the base namespace for all modules/classes related to the
4
2
  # object_inspector gem.
5
3
  module ObjectInspector
6
- autoload :Inspector, "object_inspector/inspector"
7
- autoload :ObjectInterrogator, "object_inspector/object_interrogator"
8
- autoload :BaseFormatter, "object_inspector/base_formatter"
9
- autoload :DefaultFormatter, "object_inspector/default_formatter"
10
- autoload :InspectorsHelper, "object_inspector/inspectors_helper"
4
+ @@use_string_inquirers = nil
5
+
6
+ def self.use_string_inquirers?
7
+ if @@use_string_inquirers.nil?
8
+ @@use_string_inquirers = !!defined?(ActiveSupport::StringInquirer)
9
+ else
10
+ @@use_string_inquirers
11
+ end
12
+ end
11
13
  end
14
+
15
+ require "object_inspector/version"
16
+ require "object_inspector/inspector"
17
+ require "object_inspector/inspectors_helper"
18
+ require "object_inspector/object_interrogator"
19
+ require "object_inspector/formatters/base_formatter"
20
+ require "object_inspector/formatters/combining_formatter"
21
+ require "object_inspector/formatters/templating_formatter"
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["paul.dobbins@icloud.com"]
11
11
 
12
12
  spec.summary = %q{ObjectInspector generates uniformly formatted inspect output with customizable amounts of detail.}
13
- spec.description = %q{ObjectInspector takes Object#inspect to the next level. Specify any combination of identification attributes, flags, info, and/or a name along with a self-definable scope option to represent an object in the console, in logging, or otherwise.}
13
+ spec.description = %q{ObjectInspector takes Object#inspect to the next level. Specify any combination of identification attributes, flags, info, and/or a name along with an optional self-definable scope option to represent an object in the console, in logging, etc.}
14
14
  spec.homepage = "https://github.com/pdobb/object_inspector"
15
15
  spec.license = "MIT"
16
16
 
@@ -37,4 +37,7 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency "byebug", "~> 10.0"
38
38
  spec.add_development_dependency "pry", "~> 0.11"
39
39
  spec.add_development_dependency "pry-byebug", "~> 3.6"
40
+ spec.add_development_dependency "benchmark-ips", "~> 2.7"
41
+ spec.add_development_dependency "minitest-reporters", "~> 1.2"
42
+ # spec.add_development_dependency "object_identifier", "~> 0.1" # Add when new version is released
40
43
  end
@@ -0,0 +1,118 @@
1
+ # Play from the console with:
2
+ # play scripts/benchmarking/formatters.rb
3
+
4
+ require "ostruct"
5
+ require "benchmark/ips"
6
+
7
+ custom_formatter_klasses ||= []
8
+
9
+ formatter_klasses = [
10
+ ObjectInspector::TemplatingFormatter,
11
+ ObjectInspector::CombiningFormatter,
12
+ *Array(custom_formatter_klasses),
13
+ ]
14
+
15
+ INSPECTOR_WITH_FLAGS_AND_INFO_AND_NAME ||=
16
+ OpenStruct.new(
17
+ identification: "IDENTIFICATION",
18
+ flags: "FLAG1 | FLAG2",
19
+ info: "INFO",
20
+ name: "NAME")
21
+ INSPECTOR_WITH_FLAGS_AND_INFO ||=
22
+ OpenStruct.new(
23
+ identification: "IDENTIFICATION",
24
+ flags: "FLAG1 | FLAG2",
25
+ info: "INFO")
26
+ INSPECTOR_WITH_FLAGS_AND_NAME ||=
27
+ OpenStruct.new(
28
+ identification: "IDENTIFICATION",
29
+ flags: "FLAG1 | FLAG2",
30
+ name: "NAME")
31
+ INSPECTOR_WITH_INFO_AND_NAME ||=
32
+ OpenStruct.new(
33
+ identification: "IDENTIFICATION",
34
+ info: "INFO",
35
+ name: "NAME")
36
+ INSPECTOR_WITH_NAME ||=
37
+ OpenStruct.new(
38
+ identification: "IDENTIFICATION",
39
+ name: "NAME")
40
+ INSPECTOR_WITH_FLAGS ||=
41
+ OpenStruct.new(
42
+ identification: "IDENTIFICATION",
43
+ flags: "FLAG1 | FLAG2")
44
+ INSPECTOR_WITH_INFO ||=
45
+ OpenStruct.new(
46
+ identification: "IDENTIFICATION",
47
+ info: "INFO")
48
+ INSPECTOR_WITH_BASE ||=
49
+ OpenStruct.new(
50
+ identification: "IDENTIFICATION")
51
+
52
+
53
+ puts "== Averaged ============================================================="
54
+ Benchmark.ips { |x|
55
+ formatter_klasses.each do |formatter_klass|
56
+ x.report(formatter_klass) {
57
+ formatter_klass.new(INSPECTOR_WITH_FLAGS_AND_INFO_AND_NAME).call
58
+ formatter_klass.new(INSPECTOR_WITH_FLAGS_AND_INFO).call
59
+ formatter_klass.new(INSPECTOR_WITH_FLAGS_AND_NAME).call
60
+ formatter_klass.new(INSPECTOR_WITH_INFO_AND_NAME).call
61
+ formatter_klass.new(INSPECTOR_WITH_NAME).call
62
+ formatter_klass.new(INSPECTOR_WITH_FLAGS).call
63
+ formatter_klass.new(INSPECTOR_WITH_INFO).call
64
+ formatter_klass.new(INSPECTOR_WITH_BASE).call
65
+ }
66
+ end
67
+
68
+ x.compare!
69
+ };
70
+ puts "== Done"
71
+
72
+
73
+ puts "== Individualized ======================================================="
74
+ Benchmark.ips { |x|
75
+ formatter_klasses.each do |formatter_klass|
76
+ x.report("#{formatter_klass} - Flags and Info and Name") {
77
+ formatter_klass.new(INSPECTOR_WITH_FLAGS_AND_INFO_AND_NAME).call
78
+ }
79
+ end
80
+ formatter_klasses.each do |formatter_klass|
81
+ x.report("#{formatter_klass} - Flags and Info") {
82
+ formatter_klass.new(INSPECTOR_WITH_FLAGS_AND_INFO).call
83
+ }
84
+ end
85
+ formatter_klasses.each do |formatter_klass|
86
+ x.report("#{formatter_klass} - Flags and Name") {
87
+ formatter_klass.new(INSPECTOR_WITH_FLAGS_AND_NAME).call
88
+ }
89
+ end
90
+ formatter_klasses.each do |formatter_klass|
91
+ x.report("#{formatter_klass} - Info and Name") {
92
+ formatter_klass.new(INSPECTOR_WITH_INFO_AND_NAME).call
93
+ }
94
+ end
95
+ formatter_klasses.each do |formatter_klass|
96
+ x.report("#{formatter_klass} - Name") {
97
+ formatter_klass.new(INSPECTOR_WITH_NAME).call
98
+ }
99
+ end
100
+ formatter_klasses.each do |formatter_klass|
101
+ x.report("#{formatter_klass} - Flags") {
102
+ formatter_klass.new(INSPECTOR_WITH_FLAGS).call
103
+ }
104
+ end
105
+ formatter_klasses.each do |formatter_klass|
106
+ x.report("#{formatter_klass} - Info") {
107
+ formatter_klass.new(INSPECTOR_WITH_INFO).call
108
+ }
109
+ end
110
+ formatter_klasses.each do |formatter_klass|
111
+ x.report("#{formatter_klass} - Base") {
112
+ formatter_klass.new(INSPECTOR_WITH_BASE).call
113
+ }
114
+ end
115
+
116
+ x.compare!
117
+ };
118
+ puts "== Done"
@@ -0,0 +1,73 @@
1
+ # Play from the console with:
2
+ # play scripts/benchmarking/object_inspector.rb
3
+
4
+ require "ostruct"
5
+ require "benchmark/ips"
6
+
7
+ inspector_klass = ObjectInspector::Inspector
8
+
9
+ OBJECT_WITH_FLAGS_AND_INFO_AND_NAME ||=
10
+ OpenStruct.new(
11
+ identification: "IDENTIFICATION",
12
+ flags: "FLAG1 | FLAG2",
13
+ info: "INFO",
14
+ name: "NAME")
15
+ OBJECT_WITH_FLAGS_AND_INFO ||=
16
+ OpenStruct.new(
17
+ identification: "IDENTIFICATION",
18
+ flags: "FLAG1 | FLAG2",
19
+ info: "INFO")
20
+ OBJECT_WITH_FLAGS_AND_NAME ||=
21
+ OpenStruct.new(
22
+ identification: "IDENTIFICATION",
23
+ flags: "FLAG1 | FLAG2",
24
+ name: "NAME")
25
+ OBJECT_WITH_INFO_AND_NAME ||=
26
+ OpenStruct.new(
27
+ identification: "IDENTIFICATION",
28
+ info: "INFO",
29
+ name: "NAME")
30
+ OBJECT_WITH_NAME ||=
31
+ OpenStruct.new(
32
+ identification: "IDENTIFICATION",
33
+ name: "NAME")
34
+ OBJECT_WITH_FLAGS ||=
35
+ OpenStruct.new(
36
+ identification: "IDENTIFICATION",
37
+ flags: "FLAG1 | FLAG2")
38
+ OBJECT_WITH_INFO ||=
39
+ OpenStruct.new(
40
+ identification: "IDENTIFICATION",
41
+ info: "INFO")
42
+ OBJECT_WITH_BASE ||=
43
+ OpenStruct.new(
44
+ identification: "IDENTIFICATION")
45
+
46
+
47
+ puts "== Averaged ============================================================="
48
+ Benchmark.ips { |x|
49
+ x.report(inspector_klass) {
50
+ inspector_klass.inspect(OBJECT_WITH_FLAGS_AND_INFO_AND_NAME)
51
+ inspector_klass.inspect(OBJECT_WITH_FLAGS_AND_INFO)
52
+ inspector_klass.inspect(OBJECT_WITH_FLAGS_AND_NAME)
53
+ inspector_klass.inspect(OBJECT_WITH_INFO_AND_NAME)
54
+ inspector_klass.inspect(OBJECT_WITH_NAME)
55
+ inspector_klass.inspect(OBJECT_WITH_FLAGS)
56
+ inspector_klass.inspect(OBJECT_WITH_INFO)
57
+ inspector_klass.inspect(OBJECT_WITH_BASE)
58
+ }
59
+
60
+ x.report("Ruby") {
61
+ OBJECT_WITH_FLAGS_AND_INFO_AND_NAME.inspect
62
+ OBJECT_WITH_FLAGS_AND_INFO.inspect
63
+ OBJECT_WITH_FLAGS_AND_NAME.inspect
64
+ OBJECT_WITH_INFO_AND_NAME.inspect
65
+ OBJECT_WITH_NAME.inspect
66
+ OBJECT_WITH_FLAGS.inspect
67
+ OBJECT_WITH_INFO.inspect
68
+ OBJECT_WITH_BASE.inspect
69
+ }
70
+
71
+ x.compare!
72
+ };
73
+ puts "== Done"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: object_inspector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Dobbins
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-10 00:00:00.000000000 Z
11
+ date: 2018-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,9 +108,37 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '3.6'
111
+ - !ruby/object:Gem::Dependency
112
+ name: benchmark-ips
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.7'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '2.7'
125
+ - !ruby/object:Gem::Dependency
126
+ name: minitest-reporters
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.2'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.2'
111
139
  description: ObjectInspector takes Object#inspect to the next level. Specify any combination
112
- of identification attributes, flags, info, and/or a name along with a self-definable
113
- scope option to represent an object in the console, in logging, or otherwise.
140
+ of identification attributes, flags, info, and/or a name along with an optional
141
+ self-definable scope option to represent an object in the console, in logging, etc.
114
142
  email:
115
143
  - paul.dobbins@icloud.com
116
144
  executables: []
@@ -128,13 +156,16 @@ files:
128
156
  - bin/console
129
157
  - bin/setup
130
158
  - lib/object_inspector.rb
131
- - lib/object_inspector/base_formatter.rb
132
- - lib/object_inspector/default_formatter.rb
159
+ - lib/object_inspector/formatters/base_formatter.rb
160
+ - lib/object_inspector/formatters/combining_formatter.rb
161
+ - lib/object_inspector/formatters/templating_formatter.rb
133
162
  - lib/object_inspector/inspector.rb
134
163
  - lib/object_inspector/inspectors_helper.rb
135
164
  - lib/object_inspector/object_interrogator.rb
136
165
  - lib/object_inspector/version.rb
137
166
  - object_inspector.gemspec
167
+ - scripts/benchmarking/formatters.rb
168
+ - scripts/benchmarking/object_inspector.rb
138
169
  homepage: https://github.com/pdobb/object_inspector
139
170
  licenses:
140
171
  - MIT
@@ -1,33 +0,0 @@
1
- module ObjectInspector
2
- # ObjectInspector::DefaultFormatter implements
3
- # {ObjectInspector::BaseFormatter} to return a standard/default inspect output
4
- # format.
5
- #
6
- # @attr (see BaseFormatter)
7
- class DefaultFormatter < BaseFormatter
8
- # Perform the formatting routine.
9
- #
10
- # @return [String]
11
- def call
12
- "<#{combine_strings}>"
13
- end
14
-
15
- private
16
-
17
- def build_identification_string(identification = self.identification)
18
- identification.to_s
19
- end
20
-
21
- def build_flags_string(flags = self.flags)
22
- "[#{flags.to_s.upcase}]" if flags
23
- end
24
-
25
- def build_info_string(info = self.info)
26
- " (#{info})" if info
27
- end
28
-
29
- def build_name_string(name = self.name)
30
- " :: #{name}" if name
31
- end
32
- end
33
- end