object_identifier 0.5.0 → 0.7.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/LICENSE.txt +1 -1
- data/README.md +21 -10
- data/lib/core_ext/object.rb +2 -2
- data/lib/object_identifier/array_wrap.rb +23 -0
- data/lib/object_identifier/configuration.rb +59 -0
- data/lib/object_identifier/formatters/base_formatter.rb +24 -0
- data/lib/object_identifier/formatters/string_formatter.rb +118 -72
- data/lib/object_identifier/object_identifier.rb +23 -0
- data/lib/object_identifier/parameters.rb +60 -0
- data/lib/object_identifier/version.rb +2 -1
- data/lib/object_identifier.rb +11 -54
- metadata +30 -21
- data/.github/workflows/ci.yml +0 -38
- data/.gitignore +0 -11
- data/.rubocop +0 -4
- data/.rubocop.yml +0 -127
- data/CHANGELOG.md +0 -30
- data/Gemfile +0 -8
- data/Gemfile.lock +0 -83
- data/Rakefile +0 -12
- data/bin/console +0 -16
- data/bin/setup +0 -8
- data/lib/object_identifier/identifier.rb +0 -22
- data/object_identifier.gemspec +0 -48
- data/scripts/benchmarking/formatters.rb +0 -77
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f93a767a479c1b5fccb0203eb79707479970876206c1325e567afe0792032d58
|
4
|
+
data.tar.gz: 3c6508fa051abfce2c19001783e98658b9e183f8725e871044a67b5185042bf8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3861571fbe466a526f9c10fe4c840ee51c7124998cf1009c81a9667c070cf1999362fa501b7030da795612b16ec81ff2f436a41613fd1256db614ecbecb46b34
|
7
|
+
data.tar.gz: 9c8505f55368a9cb64e0d8bcee68f2b5de7f0a4346a227d75d8d93465072da0d027b888789a6da90aef86867399546ac27c1a63eb945d6778050a6df46bd8bb8
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -38,15 +38,16 @@ Or install it yourself as:
|
|
38
38
|
## Compatibility
|
39
39
|
|
40
40
|
Tested MRI Ruby Versions:
|
41
|
-
*
|
42
|
-
*
|
43
|
-
*
|
44
|
-
* 2
|
41
|
+
* 2.7
|
42
|
+
* 3.0
|
43
|
+
* 3.1
|
44
|
+
* 3.2
|
45
45
|
|
46
|
+
Object Identifier has no other dependencies.
|
46
47
|
|
47
48
|
## Configuration
|
48
49
|
|
49
|
-
Global/default values for
|
50
|
+
Global/default values for Object Identifier can be configured via the ObjectIdentifier::Configuration object.
|
50
51
|
|
51
52
|
_Note: In a Rails app, the following would go in e.g. `config/initializers/object_identifier.rb`_
|
52
53
|
|
@@ -163,19 +164,19 @@ OpenStruct.new(my_value: my_value_object).identify(:my_value)
|
|
163
164
|
|
164
165
|
## Supporting Gems
|
165
166
|
|
166
|
-
|
167
|
+
Object Identifier works great with the [Object Inspector](https://github.com/pdobb/object_inspector) gem.
|
167
168
|
|
168
169
|
|
169
170
|
### Benchmarking Formatters
|
170
171
|
|
171
|
-
Performance of Formatters can be tested by playing the [Formatters Benchmarking Scripts](https://github.com/pdobb/object_identifier/
|
172
|
+
Performance of Formatters can be tested by playing the [Formatters Benchmarking Scripts](https://github.com/pdobb/object_identifier/blob/master/script/benchmarking/formatters.rb) in the pry console for this gem.
|
172
173
|
|
173
174
|
Custom Formatters may be similarly gauged for comparison by adding them to the `custom_formatter_klasses` array before playing the script.
|
174
175
|
|
175
176
|
```ruby
|
176
177
|
custom_formatter_klasses = [MyCustomFormatter]
|
177
178
|
|
178
|
-
play
|
179
|
+
play script/benchmarking/formatters.rb
|
179
180
|
# ObjectIdentifier::StringFormatter
|
180
181
|
# 58.478k (± 0.8%) i/s - 295.776k in 5.058178s
|
181
182
|
# MyCustomFormatter
|
@@ -185,11 +186,21 @@ play scripts/benchmarking/formatters.rb
|
|
185
186
|
|
186
187
|
## Development
|
187
188
|
|
188
|
-
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.
|
189
|
+
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.
|
189
190
|
|
190
191
|
To install this gem onto your local machine, run `bundle exec rake install`.
|
191
192
|
|
192
|
-
To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and
|
193
|
+
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).
|
194
|
+
|
195
|
+
|
196
|
+
### Documentation
|
197
|
+
|
198
|
+
[YARD documentation](https://yardoc.org/index.html) can be generated and viewed live:
|
199
|
+
1. Install YARD: `gem install yard`
|
200
|
+
2. Run the YARD server: `yard server --reload`
|
201
|
+
3. Open the live documentation site: `open http://localhost:8808`
|
202
|
+
|
203
|
+
While the YARD server is running, documentation in the live site will be auto-updated on source code save (and site reload).
|
193
204
|
|
194
205
|
|
195
206
|
## Contributing
|
data/lib/core_ext/object.rb
CHANGED
@@ -39,7 +39,7 @@ class Object
|
|
39
39
|
#
|
40
40
|
# (1..10).to_a.identify(:to_f, limit: 2)
|
41
41
|
# # => "Integer[to_f:1.0], Integer[to_f:2.0], ... (8 more)"
|
42
|
-
def identify(*args, **
|
43
|
-
ObjectIdentifier
|
42
|
+
def identify(*args, **kwargs)
|
43
|
+
ObjectIdentifier.(self, *args, **kwargs)
|
44
44
|
end
|
45
45
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# ObjectIdentifier::ArrayWrap mirrors the implementation of Rails'
|
4
|
+
# Array.wrap method. This allows us to get around objects that respond to
|
5
|
+
# `to_a` (such as Struct) and, instead, either utilize `to_ary` or just
|
6
|
+
# actually wrap the object in an Array ourselves.
|
7
|
+
class ObjectIdentifier::ArrayWrap
|
8
|
+
# :reek:NilCheck
|
9
|
+
# :reek:ManualDispatch
|
10
|
+
|
11
|
+
# Dispatch "Array Wrapping" logic on the given `object`.
|
12
|
+
#
|
13
|
+
# @param object The object(s) to attempt to Array wrap.
|
14
|
+
def self.call(object)
|
15
|
+
if object.nil?
|
16
|
+
[]
|
17
|
+
elsif object.respond_to?(:to_ary)
|
18
|
+
object.to_ary || [object]
|
19
|
+
else
|
20
|
+
[object]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# ObjectIdentifier is the top-level namespace/module for this gem.
|
4
|
+
module ObjectIdentifier
|
5
|
+
# Default Configuration Accessors
|
6
|
+
|
7
|
+
# The default formatter class to use ({ObjectIdentifier::StringFormatter}).
|
8
|
+
def self.default_formatter_class
|
9
|
+
configuration.formatter_class
|
10
|
+
end
|
11
|
+
|
12
|
+
# The default attributes to include on object inspections.
|
13
|
+
def self.default_attributes
|
14
|
+
configuration.default_attributes
|
15
|
+
end
|
16
|
+
|
17
|
+
# Custom Configuration Getters/Setters
|
18
|
+
|
19
|
+
# Accessor for the {ObjectIdentifier::Configuration} object.
|
20
|
+
def self.configuration
|
21
|
+
@configuration ||= ObjectIdentifier::Configuration.new
|
22
|
+
end
|
23
|
+
|
24
|
+
# @yieldparam configuration [ObjectIdentifier::Configuration]
|
25
|
+
def self.configure
|
26
|
+
yield(configuration)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Reset the current configuration settings memoized by
|
30
|
+
# {ObjectIdentifier.configuration}.
|
31
|
+
def self.reset_configuration
|
32
|
+
@configuration = ObjectIdentifier::Configuration.new
|
33
|
+
end
|
34
|
+
|
35
|
+
# ObjectIdentifier::Configuration stores the default configuration options for
|
36
|
+
# the ObjectIdentifier gem. Modification of attributes is possible at any
|
37
|
+
# time, and values will persist for the duration of the running process.
|
38
|
+
class Configuration
|
39
|
+
attr_reader :formatter_class,
|
40
|
+
:default_attributes
|
41
|
+
|
42
|
+
def initialize
|
43
|
+
@formatter_class = ObjectIdentifier::StringFormatter
|
44
|
+
@default_attributes = %i[id]
|
45
|
+
end
|
46
|
+
|
47
|
+
def formatter_class=(value)
|
48
|
+
unless value.is_a?(Class)
|
49
|
+
raise TypeError, "Formatter must be a Class constant"
|
50
|
+
end
|
51
|
+
|
52
|
+
@formatter_class = value
|
53
|
+
end
|
54
|
+
|
55
|
+
def default_attributes=(value)
|
56
|
+
@default_attributes = value.to_a.map!(&:to_sym)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# ObjectIdentifier::BaseFormatter is an abstract base class for formatters.
|
4
|
+
class ObjectIdentifier::BaseFormatter
|
5
|
+
attr_reader :objects,
|
6
|
+
:parameters
|
7
|
+
|
8
|
+
# A shortcut for calling `new(...).call`.
|
9
|
+
def self.call(...)
|
10
|
+
new(...).call
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param objects [Object, [Object, ...]] The object(s) to be interrogated for
|
14
|
+
# String values to be added to the output String.
|
15
|
+
# @param parameters [ObjectIdentifier::Parameters]
|
16
|
+
def initialize(objects, parameters: ObjectIdentifier::Parameters.build)
|
17
|
+
@objects = ObjectIdentifier::ArrayWrap.(objects)
|
18
|
+
@parameters = parameters
|
19
|
+
end
|
20
|
+
|
21
|
+
def call
|
22
|
+
raise NotImplementedError
|
23
|
+
end
|
24
|
+
end
|
@@ -2,102 +2,148 @@
|
|
2
2
|
|
3
3
|
# ObjectIdentifier::StringFormatter builds a String to identify the
|
4
4
|
# given object(s).
|
5
|
-
class ObjectIdentifier::StringFormatter
|
5
|
+
class ObjectIdentifier::StringFormatter < ObjectIdentifier::BaseFormatter
|
6
|
+
# The String to output when {#objects} is empty.
|
6
7
|
NO_OBJECTS_INDICATOR = "[no objects]"
|
7
|
-
KLASS_NOT_GIVEN = "NOT_GIVEN"
|
8
|
-
|
9
|
-
def self.call(objects, *attributes, **kargs)
|
10
|
-
new(objects, *attributes, **kargs).call
|
11
|
-
end
|
12
|
-
|
13
|
-
# @param objects [Object, [Object, ...]] the object(s) to be interrogated for
|
14
|
-
# String values to be added to the output String
|
15
|
-
# @param attributes [Array, *args] a list of method calls to interrogate the
|
16
|
-
# given object(s) with
|
17
|
-
# @param limit [Integer, nil] a given limit on the number of objects to
|
18
|
-
# interrogate
|
19
|
-
# @param klass [String, Symbol] a preferred type name for identifying the
|
20
|
-
# given object(s) as
|
21
|
-
def initialize(
|
22
|
-
objects,
|
23
|
-
attributes = ObjectIdentifier::Identifier.default_attributes,
|
24
|
-
limit: nil,
|
25
|
-
klass: KLASS_NOT_GIVEN)
|
26
|
-
@objects = ObjectIdentifier::ArrayWrap.(objects)
|
27
|
-
@attributes = ObjectIdentifier::ArrayWrap.(attributes)
|
28
|
-
@limit = (limit || @objects.size).to_i
|
29
|
-
@klass = klass.to_s
|
30
|
-
end
|
31
8
|
|
32
9
|
# Output the self-identifying string for the given object(s). Will either
|
33
10
|
# return a single object representation or a list of object
|
34
11
|
# representations, based on the number of objects we're identifying.
|
35
12
|
#
|
36
|
-
# @return [String]
|
13
|
+
# @return [String] A string that identifies the object(s).
|
37
14
|
def call
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
15
|
+
if objects.none?
|
16
|
+
NO_OBJECTS_INDICATOR
|
17
|
+
elsif objects.one?
|
18
|
+
format_item
|
19
|
+
else # objects.size > 1
|
20
|
+
format_collection
|
21
|
+
end
|
43
22
|
end
|
44
23
|
|
45
24
|
private
|
46
25
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
"#{class_name(object)}[#{format_attributes(evaluate_attributes(object))}]"
|
26
|
+
def format_collection
|
27
|
+
Collection.new(objects, parameters).call
|
51
28
|
end
|
52
29
|
|
53
|
-
|
54
|
-
|
55
|
-
object.nil? || object == [] || object == {}
|
30
|
+
def format_item(object = objects.first)
|
31
|
+
Item.new(object, parameters).call
|
56
32
|
end
|
57
33
|
|
58
|
-
|
59
|
-
|
60
|
-
|
34
|
+
# ObjectIdentifier::StringFormatter::Collection formats a collection-specific
|
35
|
+
# identification String, which will also necessarily be composed of
|
36
|
+
# {ObjectIdentifier::StringFormatter::Item} identification Strings.
|
37
|
+
class Collection
|
38
|
+
attr_reader :objects,
|
39
|
+
:parameters
|
40
|
+
|
41
|
+
# @param objects [Object, [Object, ...]] the object(s) to be interrogated
|
42
|
+
# for String values to be added to the output String
|
43
|
+
# @param parameters [ObjectIdentifier::Parameters]
|
44
|
+
def initialize(objects, parameters)
|
45
|
+
@objects = objects
|
46
|
+
@parameters = parameters
|
47
|
+
end
|
61
48
|
|
62
|
-
|
63
|
-
|
64
|
-
|
49
|
+
# Build a comma-separated list of formatted item Strings representing the
|
50
|
+
# given objects.
|
51
|
+
#
|
52
|
+
# @return [String]
|
53
|
+
def call
|
54
|
+
parts = objects.first(limit).map { |obj| format_item(obj) }
|
55
|
+
parts << "... (#{truncated_objects_count} more)" if truncated?
|
56
|
+
parts.join(", ")
|
57
|
+
end
|
65
58
|
|
66
|
-
|
67
|
-
return if attributes_hash.empty?
|
59
|
+
private
|
68
60
|
|
69
|
-
|
70
|
-
|
71
|
-
|
61
|
+
def format_item(object)
|
62
|
+
Item.new(object, parameters).call
|
63
|
+
end
|
72
64
|
|
73
|
-
|
74
|
-
|
75
|
-
->(_key, value) { value.inspect_lit }
|
76
|
-
else
|
77
|
-
->(key, value) { "#{key}:#{value.inspect_lit}" }
|
65
|
+
def limit
|
66
|
+
parameters.limit { objects_count }
|
78
67
|
end
|
79
|
-
end
|
80
68
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
if object.respond_to?(key, :include_private)
|
85
|
-
acc[key] = object.send(key)
|
86
|
-
elsif key.to_s.start_with?("@")
|
87
|
-
acc[key] = object.instance_variable_get(key)
|
88
|
-
end
|
89
|
-
}
|
90
|
-
end
|
69
|
+
def truncated?
|
70
|
+
truncated_objects_count.positive?
|
71
|
+
end
|
91
72
|
|
92
|
-
|
93
|
-
|
94
|
-
|
73
|
+
def truncated_objects_count
|
74
|
+
@truncated_objects_count ||= objects_count - limit
|
75
|
+
end
|
95
76
|
|
96
|
-
|
97
|
-
|
77
|
+
def objects_count
|
78
|
+
@objects_count ||= objects.size
|
79
|
+
end
|
98
80
|
end
|
99
81
|
|
100
|
-
|
101
|
-
|
82
|
+
# ObjectIdentifier::StringFormatter::Item formats a single-object-specific
|
83
|
+
# identification String.
|
84
|
+
class Item
|
85
|
+
attr_reader :object,
|
86
|
+
:parameters
|
87
|
+
|
88
|
+
# @param object [Object] The object to be interrogated for String values to
|
89
|
+
# be added to the output String.
|
90
|
+
# @param parameters [ObjectIdentifier::Parameters]
|
91
|
+
def initialize(object, parameters)
|
92
|
+
@object = object
|
93
|
+
@parameters = parameters
|
94
|
+
end
|
95
|
+
|
96
|
+
# @return [String] The self-identifying String for {#object}.
|
97
|
+
def call
|
98
|
+
return NO_OBJECTS_INDICATOR if blank?
|
99
|
+
|
100
|
+
"#{class_name}[#{formatted_attributes}]"
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
# :reek:NilCheck
|
106
|
+
|
107
|
+
# Simple version of Rails' Object#blank? method.
|
108
|
+
def blank?
|
109
|
+
object.nil? || object == [] || object == {}
|
110
|
+
end
|
111
|
+
|
112
|
+
def class_name
|
113
|
+
parameters.klass { object.class.name }
|
114
|
+
end
|
115
|
+
|
116
|
+
def formatted_attributes
|
117
|
+
attributes_hash.map(&attributes_formatter).join(", ")
|
118
|
+
end
|
119
|
+
|
120
|
+
# :reek:DuplicateMethodCall
|
121
|
+
|
122
|
+
def attributes_formatter
|
123
|
+
@attributes_formatter ||=
|
124
|
+
if attributes_hash.one?
|
125
|
+
->(_key, value) { value.inspect_lit }
|
126
|
+
else # attributes_hash.size > 1
|
127
|
+
->(key, value) { "#{key}:#{value.inspect_lit}" }
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
# :reek:ManualDispatch
|
132
|
+
|
133
|
+
# @return [Hash]
|
134
|
+
def attributes_hash
|
135
|
+
@attributes_hash ||=
|
136
|
+
attributes.each_with_object({}) { |key, acc|
|
137
|
+
if object.respond_to?(key, :include_private)
|
138
|
+
acc[key] = object.__send__(key)
|
139
|
+
elsif key.to_s.start_with?("@")
|
140
|
+
acc[key] = object.instance_variable_get(key)
|
141
|
+
end
|
142
|
+
}
|
143
|
+
end
|
144
|
+
|
145
|
+
def attributes
|
146
|
+
parameters.attributes
|
147
|
+
end
|
102
148
|
end
|
103
149
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# ObjectIdentifier is the top-level namespace/module for this gem.
|
4
|
+
module ObjectIdentifier
|
5
|
+
# :reek:LongParameterList
|
6
|
+
|
7
|
+
# ObjectIdentifier.call is the main entry point for use of this gem. In
|
8
|
+
# typical usage, however, this method will almost exclusively just be called
|
9
|
+
# by {Object#identify}, as defined in lib/core_ext/object.rb.
|
10
|
+
def self.call(
|
11
|
+
objects,
|
12
|
+
*attributes,
|
13
|
+
formatter_class: default_formatter_class,
|
14
|
+
**formatter_options)
|
15
|
+
|
16
|
+
parameters =
|
17
|
+
ObjectIdentifier::Parameters.build(
|
18
|
+
attributes: attributes,
|
19
|
+
formatter_options: formatter_options)
|
20
|
+
|
21
|
+
formatter_class.(objects, parameters: parameters)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# ObjectIdentifier::Parameters encapsulates the attributes list and
|
4
|
+
# formatter options that may be needed for custom formatting during object
|
5
|
+
# identification.
|
6
|
+
class ObjectIdentifier::Parameters
|
7
|
+
# This String to display if `formatter_options[:klass]` isn't present.
|
8
|
+
KLASS_NOT_GIVEN = "NOT_GIVEN"
|
9
|
+
|
10
|
+
attr_reader :attributes
|
11
|
+
|
12
|
+
# Factory method for building an {ObjectIdentifier::Parameters} object. Uses
|
13
|
+
# ObjectIdentifier.default_attributes if the given `attributes` array is
|
14
|
+
# empty.
|
15
|
+
def self.build(attributes: [], formatter_options: {})
|
16
|
+
attrs = ObjectIdentifier::ArrayWrap.(attributes)
|
17
|
+
attrs = ObjectIdentifier.default_attributes if attrs.empty?
|
18
|
+
attrs.flatten!
|
19
|
+
|
20
|
+
new(
|
21
|
+
attributes: attrs,
|
22
|
+
formatter_options: formatter_options.to_h)
|
23
|
+
end
|
24
|
+
|
25
|
+
# @param attributes [Array, *args] A list of method calls to interrogate the
|
26
|
+
# given object(s) with.
|
27
|
+
# @option formatter_options[:limit] [Integer, nil] A given limit on the number
|
28
|
+
# of objects to interrogate.
|
29
|
+
# @option formatter_options[:klass] [#to_s] A preferred type name for
|
30
|
+
# identifying the given object(s) as.
|
31
|
+
def initialize(
|
32
|
+
attributes: [],
|
33
|
+
formatter_options: {})
|
34
|
+
@attributes = attributes
|
35
|
+
@limit = formatter_options.fetch(:limit, nil)
|
36
|
+
@klass = formatter_options.fetch(:klass, KLASS_NOT_GIVEN)
|
37
|
+
end
|
38
|
+
|
39
|
+
# NOTE: Expects a block if a value wasn't supplied on initialization.
|
40
|
+
def limit
|
41
|
+
@limit || (yield if block_given?)
|
42
|
+
end
|
43
|
+
|
44
|
+
# NOTE: Expects a block if a value wasn't supplied on initialization.
|
45
|
+
def klass
|
46
|
+
if klass_given?
|
47
|
+
@klass.to_s
|
48
|
+
elsif block_given?
|
49
|
+
yield.to_s
|
50
|
+
else
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def klass_given?
|
58
|
+
@klass != KLASS_NOT_GIVEN
|
59
|
+
end
|
60
|
+
end
|
data/lib/object_identifier.rb
CHANGED
@@ -1,65 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# ObjectIdentifier is the
|
4
|
-
# object_identifier gem.
|
3
|
+
# ObjectIdentifier is the top-level namespace/module for this gem.
|
5
4
|
module ObjectIdentifier
|
6
|
-
|
7
|
-
# {Array.wrap} method. This allows us to get around objects that respond to
|
8
|
-
# `to_a` (such as Struct) and, instead, either utilize `to_ary` or just
|
9
|
-
# actually wrap the object in an Array ourselves.
|
10
|
-
class ArrayWrap
|
11
|
-
def self.call(object)
|
12
|
-
if object.nil?
|
13
|
-
[]
|
14
|
-
elsif object.respond_to?(:to_ary)
|
15
|
-
object.to_ary || [object]
|
16
|
-
else
|
17
|
-
[object]
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.configuration
|
23
|
-
@configuration ||= Configuration.new
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.configure
|
27
|
-
yield(configuration)
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.reset_configuration
|
31
|
-
@configuration = Configuration.new
|
32
|
-
end
|
33
|
-
|
34
|
-
# ObjectIdentifier::Configuration stores the default configuration options for
|
35
|
-
# the ObjectIdentifier gem. Modification of attributes is possible at any
|
36
|
-
# time, and values will persist for the duration of the running process.
|
37
|
-
class Configuration
|
38
|
-
attr_reader :formatter_class,
|
39
|
-
:default_attributes
|
5
|
+
end
|
40
6
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
7
|
+
require "object_identifier/version"
|
8
|
+
require "object_identifier/configuration"
|
9
|
+
require "object_identifier/object_identifier"
|
10
|
+
require "object_identifier/array_wrap"
|
11
|
+
require "object_identifier/parameters"
|
45
12
|
|
46
|
-
|
47
|
-
unless value.is_a?(Class)
|
48
|
-
raise TypeError, "Formatter must be a Class constant"
|
49
|
-
end
|
13
|
+
# FORMATTERS
|
50
14
|
|
51
|
-
|
52
|
-
|
15
|
+
require "object_identifier/formatters/base_formatter"
|
16
|
+
require "object_identifier/formatters/string_formatter"
|
53
17
|
|
54
|
-
|
55
|
-
@default_attributes = value.to_a.map!(&:to_sym)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
18
|
+
# CORE EXTENSIONS
|
59
19
|
|
60
|
-
require "object_identifier/version"
|
61
|
-
require "object_identifier/identifier"
|
62
|
-
require "object_identifier/formatters/string_formatter"
|
63
20
|
require "core_ext/object"
|
64
21
|
require "core_ext/string"
|
65
22
|
require "core_ext/symbol"
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: object_identifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul DobbinSchmaltz
|
8
|
-
- Evan Sherwood
|
9
8
|
autorequire:
|
10
9
|
bindir: exe
|
11
10
|
cert_chain: []
|
12
|
-
date: 2023-
|
11
|
+
date: 2023-11-21 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: benchmark-ips
|
@@ -95,6 +94,20 @@ dependencies:
|
|
95
94
|
- - ">="
|
96
95
|
- !ruby/object:Gem::Version
|
97
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pdobb-style
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
98
111
|
- !ruby/object:Gem::Dependency
|
99
112
|
name: pry
|
100
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -152,7 +165,7 @@ dependencies:
|
|
152
165
|
- !ruby/object:Gem::Version
|
153
166
|
version: '0'
|
154
167
|
- !ruby/object:Gem::Dependency
|
155
|
-
name:
|
168
|
+
name: simplecov
|
156
169
|
requirement: !ruby/object:Gem::Requirement
|
157
170
|
requirements:
|
158
171
|
- - ">="
|
@@ -166,7 +179,7 @@ dependencies:
|
|
166
179
|
- !ruby/object:Gem::Version
|
167
180
|
version: '0'
|
168
181
|
- !ruby/object:Gem::Dependency
|
169
|
-
name:
|
182
|
+
name: solargraph
|
170
183
|
requirement: !ruby/object:Gem::Requirement
|
171
184
|
requirements:
|
172
185
|
- - ">="
|
@@ -188,32 +201,28 @@ executables: []
|
|
188
201
|
extensions: []
|
189
202
|
extra_rdoc_files: []
|
190
203
|
files:
|
191
|
-
- ".github/workflows/ci.yml"
|
192
|
-
- ".gitignore"
|
193
|
-
- ".rubocop"
|
194
|
-
- ".rubocop.yml"
|
195
|
-
- CHANGELOG.md
|
196
|
-
- Gemfile
|
197
|
-
- Gemfile.lock
|
198
204
|
- LICENSE.txt
|
199
205
|
- README.md
|
200
|
-
- Rakefile
|
201
|
-
- bin/console
|
202
|
-
- bin/setup
|
203
206
|
- lib/core_ext/big_decimal.rb
|
204
207
|
- lib/core_ext/object.rb
|
205
208
|
- lib/core_ext/string.rb
|
206
209
|
- lib/core_ext/symbol.rb
|
207
210
|
- lib/object_identifier.rb
|
211
|
+
- lib/object_identifier/array_wrap.rb
|
212
|
+
- lib/object_identifier/configuration.rb
|
213
|
+
- lib/object_identifier/formatters/base_formatter.rb
|
208
214
|
- lib/object_identifier/formatters/string_formatter.rb
|
209
|
-
- lib/object_identifier/
|
215
|
+
- lib/object_identifier/object_identifier.rb
|
216
|
+
- lib/object_identifier/parameters.rb
|
210
217
|
- lib/object_identifier/version.rb
|
211
|
-
- object_identifier.gemspec
|
212
|
-
- scripts/benchmarking/formatters.rb
|
213
218
|
homepage: https://github.com/pdobb/object_identifier
|
214
219
|
licenses:
|
215
220
|
- MIT
|
216
221
|
metadata:
|
222
|
+
bug_tracker_uri: https://github.com/pdobb/object_identifier/issues
|
223
|
+
changelog_uri: https://github.com/pdobb/object_identifier/releases
|
224
|
+
source_code_uri: https://github.com/pdobb/object_identifier
|
225
|
+
homepage_uri: https://github.com/pdobb/object_identifier
|
217
226
|
rubygems_mfa_required: 'true'
|
218
227
|
post_install_message:
|
219
228
|
rdoc_options: []
|
@@ -223,15 +232,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
223
232
|
requirements:
|
224
233
|
- - ">="
|
225
234
|
- !ruby/object:Gem::Version
|
226
|
-
version: 2.
|
235
|
+
version: '2.7'
|
227
236
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
228
237
|
requirements:
|
229
238
|
- - ">="
|
230
239
|
- !ruby/object:Gem::Version
|
231
240
|
version: '0'
|
232
241
|
requirements: []
|
233
|
-
rubygems_version: 3.4.
|
242
|
+
rubygems_version: 3.4.10
|
234
243
|
signing_key:
|
235
244
|
specification_version: 4
|
236
|
-
summary:
|
245
|
+
summary: Object Identifier identifies an object by its class name and attributes.
|
237
246
|
test_files: []
|
data/.github/workflows/ci.yml
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
# This workflow uses actions that are not certified by GitHub.
|
2
|
-
# They are provided by a third-party and are governed by
|
3
|
-
# separate terms of service, privacy policy, and support
|
4
|
-
# documentation.
|
5
|
-
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
-
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
-
|
8
|
-
name: Ruby
|
9
|
-
|
10
|
-
on:
|
11
|
-
push:
|
12
|
-
branches: [ "master" ]
|
13
|
-
pull_request:
|
14
|
-
branches: [ "master" ]
|
15
|
-
|
16
|
-
permissions:
|
17
|
-
contents: read
|
18
|
-
|
19
|
-
jobs:
|
20
|
-
test:
|
21
|
-
runs-on: ubuntu-latest
|
22
|
-
strategy:
|
23
|
-
matrix:
|
24
|
-
ruby-version: ['2.7', '3.0', '3.1', '3.2']
|
25
|
-
|
26
|
-
steps:
|
27
|
-
- uses: actions/checkout@v3
|
28
|
-
- name: Set up Ruby
|
29
|
-
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
30
|
-
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
31
|
-
# uses: ruby/setup-ruby@v1
|
32
|
-
uses: ruby/setup-ruby@ee2113536afb7f793eed4ce60e8d3b26db912da4 # v1.127.0
|
33
|
-
with:
|
34
|
-
ruby-version: ${{ matrix.ruby-version }}
|
35
|
-
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
36
|
-
|
37
|
-
- name: Run tests
|
38
|
-
run: bundle exec rake
|
data/.gitignore
DELETED
data/.rubocop
DELETED
data/.rubocop.yml
DELETED
@@ -1,127 +0,0 @@
|
|
1
|
-
AllCops:
|
2
|
-
UseCache: true
|
3
|
-
DisplayCopNames: true
|
4
|
-
DisplayStyleGuide: true
|
5
|
-
ExtraDetails: false
|
6
|
-
TargetRubyVersion: 2.4.0
|
7
|
-
NewCops: enable
|
8
|
-
|
9
|
-
Layout/DotPosition:
|
10
|
-
EnforcedStyle: trailing
|
11
|
-
|
12
|
-
Layout/EndOfLine:
|
13
|
-
EnforcedStyle: lf
|
14
|
-
|
15
|
-
Layout/FirstArgumentIndentation:
|
16
|
-
EnforcedStyle: consistent_relative_to_receiver
|
17
|
-
|
18
|
-
Layout/FirstArrayElementIndentation:
|
19
|
-
EnforcedStyle: consistent
|
20
|
-
|
21
|
-
Layout/FirstHashElementIndentation:
|
22
|
-
EnforcedStyle: consistent
|
23
|
-
|
24
|
-
Layout/FirstParameterIndentation:
|
25
|
-
Enabled: false # Revisit if more settings become available.
|
26
|
-
|
27
|
-
Layout/LineContinuationSpacing:
|
28
|
-
EnforcedStyle: no_space
|
29
|
-
|
30
|
-
Layout/LineEndStringConcatenationIndentation:
|
31
|
-
EnforcedStyle: aligned
|
32
|
-
|
33
|
-
Layout/LineLength:
|
34
|
-
Max: 80
|
35
|
-
Exclude:
|
36
|
-
- "object_identifier.gemspec"
|
37
|
-
- "scripts/benchmarking/**/*"
|
38
|
-
|
39
|
-
Layout/MultilineMethodCallBraceLayout:
|
40
|
-
EnforcedStyle: same_line
|
41
|
-
|
42
|
-
Layout/MultilineMethodCallIndentation:
|
43
|
-
EnforcedStyle: indented_relative_to_receiver
|
44
|
-
|
45
|
-
Layout/MultilineMethodDefinitionBraceLayout:
|
46
|
-
EnforcedStyle: same_line
|
47
|
-
|
48
|
-
Layout/MultilineOperationIndentation:
|
49
|
-
Enabled: false # Waiting for e.g. `indented_relative_to_receiver`.
|
50
|
-
|
51
|
-
Lint/AmbiguousOperator:
|
52
|
-
Enabled: false # Conflicts with other rules.
|
53
|
-
|
54
|
-
Lint/AmbiguousRegexpLiteral:
|
55
|
-
Enabled: false # Conflicts with other rules.
|
56
|
-
|
57
|
-
Lint/OrAssignmentToConstant:
|
58
|
-
Exclude:
|
59
|
-
- "scripts/**/*"
|
60
|
-
|
61
|
-
Lint/Void:
|
62
|
-
CheckForMethodsWithNoSideEffects: true
|
63
|
-
|
64
|
-
Metrics/BlockLength:
|
65
|
-
AllowedMethods:
|
66
|
-
- describe
|
67
|
-
- context
|
68
|
-
- ips # Benchmarking
|
69
|
-
|
70
|
-
Metrics/ClassLength:
|
71
|
-
Exclude:
|
72
|
-
- "test/**/*"
|
73
|
-
|
74
|
-
Naming/MethodParameterName:
|
75
|
-
AllowedNames:
|
76
|
-
- a
|
77
|
-
- b
|
78
|
-
|
79
|
-
Style/Alias:
|
80
|
-
EnforcedStyle: prefer_alias_method
|
81
|
-
|
82
|
-
Style/BlockDelimiters:
|
83
|
-
Enabled: false # Reconsider later.
|
84
|
-
|
85
|
-
Style/ClassAndModuleChildren:
|
86
|
-
AutoCorrect: true
|
87
|
-
EnforcedStyle: compact
|
88
|
-
|
89
|
-
Style/EmptyElse:
|
90
|
-
# It"s helpful to show intent by including a comment in an else block.
|
91
|
-
Enabled: false
|
92
|
-
|
93
|
-
Style/EmptyMethod:
|
94
|
-
EnforcedStyle: expanded
|
95
|
-
|
96
|
-
Style/ExpandPathArguments:
|
97
|
-
Exclude:
|
98
|
-
- "object_inspector.gemspec"
|
99
|
-
|
100
|
-
Style/FormatString:
|
101
|
-
Enabled: false # % notation with an Array just reads better sometimes.
|
102
|
-
|
103
|
-
Style/Lambda:
|
104
|
-
EnforcedStyle: literal
|
105
|
-
|
106
|
-
Style/LambdaCall:
|
107
|
-
Enabled: false # Allow ServiceObject.(*). Only use on classes, not instances.
|
108
|
-
|
109
|
-
Style/OpenStructUse:
|
110
|
-
Exclude:
|
111
|
-
- "test/**/*"
|
112
|
-
|
113
|
-
Style/RegexpLiteral:
|
114
|
-
EnforcedStyle: mixed
|
115
|
-
|
116
|
-
Style/RescueStandardError:
|
117
|
-
EnforcedStyle: implicit
|
118
|
-
|
119
|
-
Style/SingleLineMethods:
|
120
|
-
Exclude:
|
121
|
-
- "test/**/*_test.rb"
|
122
|
-
|
123
|
-
Style/StringLiterals:
|
124
|
-
EnforcedStyle: double_quotes
|
125
|
-
|
126
|
-
Style/StringLiteralsInInterpolation:
|
127
|
-
EnforcedStyle: double_quotes
|
data/CHANGELOG.md
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
### 0.5.0 - 2023-01-04
|
2
|
-
- Add support for defining customer Formatters.
|
3
|
-
- Add ObjectInspector::Configuration#formatter_class setting for overriding the default Formatter. See the README for more.
|
4
|
-
- Add a benchmarking script for comparing performance of formatters. See the README for more.
|
5
|
-
|
6
|
-
### 0.4.1 - 2022-12-30
|
7
|
-
- Make compatible with Ruby 3.2 (and likely Ruby 3.0 and 3.1 as well).
|
8
|
-
- Update development dependencies.
|
9
|
-
|
10
|
-
### 0.4.0 - 2020-09-01
|
11
|
-
- [#4](https://github.com/pdobb/object_identifier/pull/4) Only show attribute names if identifying more than one attribute.
|
12
|
-
- Update development dependencies.
|
13
|
-
|
14
|
-
#### BREAKING
|
15
|
-
- Drop support for Ruby 2.3.
|
16
|
-
|
17
|
-
### 0.3.0 - 2019-06-27
|
18
|
-
- Fix identification of objects that implement `to_a`, such as Struct.
|
19
|
-
|
20
|
-
### 0.2.1 - 2019-02-24
|
21
|
-
- Add ability to identify instance vars.
|
22
|
-
|
23
|
-
### 0.1.0 - 2018-04-14
|
24
|
-
- Revamp gem.
|
25
|
-
- Update gem dependencies.
|
26
|
-
- Now returns "[no objects]" even if given a :klass option.
|
27
|
-
|
28
|
-
|
29
|
-
### 0.0.6 - 2016-02-06
|
30
|
-
- Fix: identify method now supports private & protected methods.
|
data/Gemfile
DELETED
data/Gemfile.lock
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
object_identifier (0.5.0)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: https://rubygems.org/
|
8
|
-
specs:
|
9
|
-
ansi (1.5.0)
|
10
|
-
ast (2.4.2)
|
11
|
-
benchmark-ips (2.10.0)
|
12
|
-
builder (3.2.4)
|
13
|
-
byebug (11.1.3)
|
14
|
-
coderay (1.1.3)
|
15
|
-
docile (1.4.0)
|
16
|
-
json (2.6.3)
|
17
|
-
kwalify (0.7.2)
|
18
|
-
method_source (1.0.0)
|
19
|
-
minitest (5.17.0)
|
20
|
-
minitest-reporters (1.5.0)
|
21
|
-
ansi
|
22
|
-
builder
|
23
|
-
minitest (>= 5.0)
|
24
|
-
ruby-progressbar
|
25
|
-
much-stub (0.1.10)
|
26
|
-
parallel (1.22.1)
|
27
|
-
parser (3.1.3.0)
|
28
|
-
ast (~> 2.4.1)
|
29
|
-
pry (0.14.1)
|
30
|
-
coderay (~> 1.1)
|
31
|
-
method_source (~> 1.0)
|
32
|
-
pry-byebug (3.10.1)
|
33
|
-
byebug (~> 11.0)
|
34
|
-
pry (>= 0.13, < 0.15)
|
35
|
-
rainbow (3.1.1)
|
36
|
-
rake (13.0.6)
|
37
|
-
reek (6.1.3)
|
38
|
-
kwalify (~> 0.7.0)
|
39
|
-
parser (~> 3.1.0)
|
40
|
-
rainbow (>= 2.0, < 4.0)
|
41
|
-
regexp_parser (2.6.1)
|
42
|
-
rexml (3.2.5)
|
43
|
-
rubocop (1.42.0)
|
44
|
-
json (~> 2.3)
|
45
|
-
parallel (~> 1.10)
|
46
|
-
parser (>= 3.1.2.1)
|
47
|
-
rainbow (>= 2.2.2, < 4.0)
|
48
|
-
regexp_parser (>= 1.8, < 3.0)
|
49
|
-
rexml (>= 3.2.5, < 4.0)
|
50
|
-
rubocop-ast (>= 1.24.1, < 2.0)
|
51
|
-
ruby-progressbar (~> 1.7)
|
52
|
-
unicode-display_width (>= 1.4.0, < 3.0)
|
53
|
-
rubocop-ast (1.24.1)
|
54
|
-
parser (>= 3.1.1.0)
|
55
|
-
ruby-progressbar (1.11.0)
|
56
|
-
simplecov (0.22.0)
|
57
|
-
docile (~> 1.1)
|
58
|
-
simplecov-html (~> 0.11)
|
59
|
-
simplecov_json_formatter (~> 0.1)
|
60
|
-
simplecov-html (0.12.3)
|
61
|
-
simplecov_json_formatter (0.1.4)
|
62
|
-
unicode-display_width (2.3.0)
|
63
|
-
|
64
|
-
PLATFORMS
|
65
|
-
ruby
|
66
|
-
|
67
|
-
DEPENDENCIES
|
68
|
-
benchmark-ips
|
69
|
-
bundler
|
70
|
-
byebug
|
71
|
-
minitest
|
72
|
-
minitest-reporters
|
73
|
-
much-stub
|
74
|
-
object_identifier!
|
75
|
-
pry
|
76
|
-
pry-byebug
|
77
|
-
rake
|
78
|
-
reek
|
79
|
-
rubocop
|
80
|
-
simplecov
|
81
|
-
|
82
|
-
BUNDLED WITH
|
83
|
-
2.4.1
|
data/Rakefile
DELETED
data/bin/console
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
require "bundler/setup"
|
5
|
-
require "object_identifier"
|
6
|
-
require "ostruct"
|
7
|
-
|
8
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
9
|
-
# with your gem easier. You can also use a different console, if you like.
|
10
|
-
|
11
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
12
|
-
require "pry"
|
13
|
-
Pry.start
|
14
|
-
|
15
|
-
# require "irb"
|
16
|
-
# IRB.start(__FILE__)
|
data/bin/setup
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# ObjectIdentifier::Identifier manages construction of identification outputs
|
4
|
-
# using the passed in formatter_class.
|
5
|
-
class ObjectIdentifier::Identifier
|
6
|
-
# NOTE: `kargs` may be specific to the Formatter being called.
|
7
|
-
def self.call(
|
8
|
-
objects,
|
9
|
-
*attributes,
|
10
|
-
formatter_class: default_formatter_class,
|
11
|
-
**formatter_options)
|
12
|
-
formatter_class.(objects, *attributes, **formatter_options)
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.default_formatter_class
|
16
|
-
ObjectIdentifier.configuration.formatter_class
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.default_attributes
|
20
|
-
ObjectIdentifier.configuration.default_attributes
|
21
|
-
end
|
22
|
-
end
|
data/object_identifier.gemspec
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
lib = File.expand_path("lib", __dir__)
|
4
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require "object_identifier/version"
|
6
|
-
|
7
|
-
Gem::Specification.new do |spec|
|
8
|
-
spec.name = "object_identifier"
|
9
|
-
spec.version = ObjectIdentifier::VERSION
|
10
|
-
spec.authors = ["Paul DobbinSchmaltz", "Evan Sherwood"]
|
11
|
-
spec.email = ["p.dobbinschmaltz@icloud.com"]
|
12
|
-
spec.required_ruby_version = ">= 2.4.0"
|
13
|
-
spec.metadata = { "rubygems_mfa_required" => "true" }
|
14
|
-
|
15
|
-
spec.summary = "ObjectIdentifier identifies an object by its class name and attributes."
|
16
|
-
spec.description = "Object Identifier allows quick, easy, and uniform identification of an object by inspecting its class name and outputting any desirable attributes/methods. It is great for logging, sending descriptive notification messages, etc."
|
17
|
-
spec.homepage = "https://github.com/pdobb/object_identifier"
|
18
|
-
spec.license = "MIT"
|
19
|
-
|
20
|
-
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
21
|
-
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
22
|
-
# if spec.respond_to?(:metadata)
|
23
|
-
# spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
|
24
|
-
# else
|
25
|
-
# raise "RubyGems 2.0 or newer is required to protect against " \
|
26
|
-
# "public gem pushes."
|
27
|
-
# end
|
28
|
-
|
29
|
-
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
30
|
-
f.match(%r{^(test|spec|features)/})
|
31
|
-
end
|
32
|
-
spec.bindir = "exe"
|
33
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
34
|
-
spec.require_paths = ["lib"]
|
35
|
-
|
36
|
-
spec.add_development_dependency "benchmark-ips"
|
37
|
-
spec.add_development_dependency "bundler"
|
38
|
-
spec.add_development_dependency "byebug"
|
39
|
-
spec.add_development_dependency "minitest"
|
40
|
-
spec.add_development_dependency "minitest-reporters"
|
41
|
-
spec.add_development_dependency "much-stub"
|
42
|
-
spec.add_development_dependency "pry"
|
43
|
-
spec.add_development_dependency "pry-byebug"
|
44
|
-
spec.add_development_dependency "rake"
|
45
|
-
spec.add_development_dependency "reek"
|
46
|
-
spec.add_development_dependency "rubocop"
|
47
|
-
spec.add_development_dependency "simplecov"
|
48
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Play from the pry console with:
|
4
|
-
# play scripts/benchmarking/formatters.rb
|
5
|
-
|
6
|
-
require "benchmark/ips"
|
7
|
-
|
8
|
-
custom_formatter_klasses ||= []
|
9
|
-
|
10
|
-
formatter_klasses = [
|
11
|
-
ObjectIdentifier::StringFormatter,
|
12
|
-
*Array(custom_formatter_klasses)
|
13
|
-
].freeze
|
14
|
-
|
15
|
-
MyObject ||= Struct.new(:id, :name)
|
16
|
-
|
17
|
-
objects = [
|
18
|
-
MyObject.new(id: 1, name: "NAME1"),
|
19
|
-
MyObject.new(id: 2, name: "NAME2"),
|
20
|
-
MyObject.new(id: 3, name: "NAME3")
|
21
|
-
].freeze
|
22
|
-
|
23
|
-
puts "== Averaged ============================================================="
|
24
|
-
Benchmark.ips { |x|
|
25
|
-
formatter_klasses.each do |formatter_klass|
|
26
|
-
x.report(formatter_klass) {
|
27
|
-
formatter_klass.new(objects[0]).call
|
28
|
-
formatter_klass.new(objects[0], %i[id name]).call
|
29
|
-
formatter_klass.new(objects[0], klass: "CustomClass").call
|
30
|
-
formatter_klass.new(objects[0], %i[id name], klass: "CustomClass").call
|
31
|
-
formatter_klass.new(objects, limit: 2).call
|
32
|
-
formatter_klass.new(objects, %i[id name], klass: "CustomClass", limit: 2).call
|
33
|
-
}
|
34
|
-
end
|
35
|
-
|
36
|
-
x.compare!
|
37
|
-
}
|
38
|
-
puts "== Done"
|
39
|
-
|
40
|
-
puts "== Individualized ======================================================="
|
41
|
-
Benchmark.ips { |x|
|
42
|
-
# rubocop:disable Style/CombinableLoops
|
43
|
-
formatter_klasses.each do |formatter_klass|
|
44
|
-
x.report("#{formatter_klass} - Default Attributes") {
|
45
|
-
formatter_klass.new(objects[0]).call
|
46
|
-
}
|
47
|
-
end
|
48
|
-
formatter_klasses.each do |formatter_klass|
|
49
|
-
x.report("#{formatter_klass} - Custom Attributes") {
|
50
|
-
formatter_klass.new(objects[0], %i[id name]).call
|
51
|
-
}
|
52
|
-
end
|
53
|
-
formatter_klasses.each do |formatter_klass|
|
54
|
-
x.report("#{formatter_klass} - Custom Class") {
|
55
|
-
formatter_klass.new(objects[0], klass: "CustomClass").call
|
56
|
-
}
|
57
|
-
end
|
58
|
-
formatter_klasses.each do |formatter_klass|
|
59
|
-
x.report("#{formatter_klass} - Custom Attributes & Custom Class") {
|
60
|
-
formatter_klass.new(objects[0], %i[id name], klass: "CustomClass").call
|
61
|
-
}
|
62
|
-
end
|
63
|
-
formatter_klasses.each do |formatter_klass|
|
64
|
-
x.report("#{formatter_klass} - Limit 2") {
|
65
|
-
formatter_klass.new(objects, limit: 2).call
|
66
|
-
}
|
67
|
-
end
|
68
|
-
formatter_klasses.each do |formatter_klass|
|
69
|
-
x.report("#{formatter_klass} - Custom Attributes & Custom Class & Limit 2") {
|
70
|
-
formatter_klass.new(objects, %i[id name], klass: "CustomClass", limit: 2).call
|
71
|
-
}
|
72
|
-
end
|
73
|
-
# rubocop:enable Style/CombinableLoops
|
74
|
-
|
75
|
-
x.compare!
|
76
|
-
}
|
77
|
-
puts "== Done"
|