wholable 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 42f00bcfb8063a21a4fb8f6427424078be9ce45365d2b41f5a6c053133b059d7
4
+ data.tar.gz: 267014e8011488d2b9e3db0fcdecebe6a70c0032e8f47ea60cb0d3b035174719
5
+ SHA512:
6
+ metadata.gz: 94334fe408aa2e6ac16589688f1c3e3a4d746f738ef9ec4c75d2031e10898463ce63954e0c8f147167396a0a18da79d312a75a5a3ce52bc663a773be824841d9
7
+ data.tar.gz: b921837f4c80fb2651cf6a135c367c0fd2bbf18a5dfa47c0ad52838ad6f6482b90492e18d312093660f2f4ee693f56c49768647b50c8f7e0b5c93d0a9d99c9d7
checksums.yaml.gz.sig ADDED
Binary file
data/LICENSE.adoc ADDED
@@ -0,0 +1,134 @@
1
+ = Hippocratic License
2
+
3
+ Version: 2.1.0.
4
+
5
+ Purpose. The purpose of this License is for the Licensor named above to
6
+ permit the Licensee (as defined below) broad permission, if consistent
7
+ with Human Rights Laws and Human Rights Principles (as each is defined
8
+ below), to use and work with the Software (as defined below) within the
9
+ full scope of Licensor’s copyright and patent rights, if any, in the
10
+ Software, while ensuring attribution and protecting the Licensor from
11
+ liability.
12
+
13
+ Permission and Conditions. The Licensor grants permission by this
14
+ license ("License"), free of charge, to the extent of Licensor’s
15
+ rights under applicable copyright and patent law, to any person or
16
+ entity (the "Licensee") obtaining a copy of this software and
17
+ associated documentation files (the "Software"), to do everything with
18
+ the Software that would otherwise infringe (i) the Licensor’s copyright
19
+ in the Software or (ii) any patent claims to the Software that the
20
+ Licensor can license or becomes able to license, subject to all of the
21
+ following terms and conditions:
22
+
23
+ * Acceptance. This License is automatically offered to every person and
24
+ entity subject to its terms and conditions. Licensee accepts this
25
+ License and agrees to its terms and conditions by taking any action with
26
+ the Software that, absent this License, would infringe any intellectual
27
+ property right held by Licensor.
28
+ * Notice. Licensee must ensure that everyone who gets a copy of any part
29
+ of this Software from Licensee, with or without changes, also receives
30
+ the License and the above copyright notice (and if included by the
31
+ Licensor, patent, trademark and attribution notice). Licensee must cause
32
+ any modified versions of the Software to carry prominent notices stating
33
+ that Licensee changed the Software. For clarity, although Licensee is
34
+ free to create modifications of the Software and distribute only the
35
+ modified portion created by Licensee with additional or different terms,
36
+ the portion of the Software not modified must be distributed pursuant to
37
+ this License. If anyone notifies Licensee in writing that Licensee has
38
+ not complied with this Notice section, Licensee can keep this License by
39
+ taking all practical steps to comply within 30 days after the notice. If
40
+ Licensee does not do so, Licensee’s License (and all rights licensed
41
+ hereunder) shall end immediately.
42
+ * Compliance with Human Rights Principles and Human Rights Laws.
43
+ [arabic]
44
+ . Human Rights Principles.
45
+ [loweralpha]
46
+ .. Licensee is advised to consult the articles of the United Nations
47
+ Universal Declaration of Human Rights and the United Nations Global
48
+ Compact that define recognized principles of international human rights
49
+ (the "Human Rights Principles"). Licensee shall use the Software in a
50
+ manner consistent with Human Rights Principles.
51
+ .. Unless the Licensor and Licensee agree otherwise, any dispute,
52
+ controversy, or claim arising out of or relating to (i) Section 1(a)
53
+ regarding Human Rights Principles, including the breach of Section 1(a),
54
+ termination of this License for breach of the Human Rights Principles,
55
+ or invalidity of Section 1(a) or (ii) a determination of whether any Law
56
+ is consistent or in conflict with Human Rights Principles pursuant to
57
+ Section 2, below, shall be settled by arbitration in accordance with the
58
+ Hague Rules on Business and Human Rights Arbitration (the "Rules");
59
+ provided, however, that Licensee may elect not to participate in such
60
+ arbitration, in which event this License (and all rights licensed
61
+ hereunder) shall end immediately. The number of arbitrators shall be one
62
+ unless the Rules require otherwise.
63
+ +
64
+ Unless both the Licensor and Licensee agree to the contrary: (1) All
65
+ documents and information concerning the arbitration shall be public and
66
+ may be disclosed by any party; (2) The repository referred to under
67
+ Article 43 of the Rules shall make available to the public in a timely
68
+ manner all documents concerning the arbitration which are communicated
69
+ to it, including all submissions of the parties, all evidence admitted
70
+ into the record of the proceedings, all transcripts or other recordings
71
+ of hearings and all orders, decisions and awards of the arbitral
72
+ tribunal, subject only to the arbitral tribunal’s powers to take such
73
+ measures as may be necessary to safeguard the integrity of the arbitral
74
+ process pursuant to Articles 18, 33, 41 and 42 of the Rules; and (3)
75
+ Article 26(6) of the Rules shall not apply.
76
+ . Human Rights Laws. The Software shall not be used by any person or
77
+ entity for any systems, activities, or other uses that violate any Human
78
+ Rights Laws. "Human Rights Laws" means any applicable laws,
79
+ regulations, or rules (collectively, "Laws") that protect human,
80
+ civil, labor, privacy, political, environmental, security, economic, due
81
+ process, or similar rights; provided, however, that such Laws are
82
+ consistent and not in conflict with Human Rights Principles (a dispute
83
+ over the consistency or a conflict between Laws and Human Rights
84
+ Principles shall be determined by arbitration as stated above). Where
85
+ the Human Rights Laws of more than one jurisdiction are applicable or in
86
+ conflict with respect to the use of the Software, the Human Rights Laws
87
+ that are most protective of the individuals or groups harmed shall
88
+ apply.
89
+ . Indemnity. Licensee shall hold harmless and indemnify Licensor (and
90
+ any other contributor) against all losses, damages, liabilities,
91
+ deficiencies, claims, actions, judgments, settlements, interest, awards,
92
+ penalties, fines, costs, or expenses of whatever kind, including
93
+ Licensor’s reasonable attorneys’ fees, arising out of or relating to
94
+ Licensee’s use of the Software in violation of Human Rights Laws or
95
+ Human Rights Principles.
96
+ * Failure to Comply. Any failure of Licensee to act according to the
97
+ terms and conditions of this License is both a breach of the License and
98
+ an infringement of the intellectual property rights of the Licensor
99
+ (subject to exceptions under Laws, e.g., fair use). In the event of a
100
+ breach or infringement, the terms and conditions of this License may be
101
+ enforced by Licensor under the Laws of any jurisdiction to which
102
+ Licensee is subject. Licensee also agrees that the Licensor may enforce
103
+ the terms and conditions of this License against Licensee through
104
+ specific performance (or similar remedy under Laws) to the extent
105
+ permitted by Laws. For clarity, except in the event of a breach of this
106
+ License, infringement, or as otherwise stated in this License, Licensor
107
+ may not terminate this License with Licensee.
108
+ * Enforceability and Interpretation. If any term or provision of this
109
+ License is determined to be invalid, illegal, or unenforceable by a
110
+ court of competent jurisdiction, then such invalidity, illegality, or
111
+ unenforceability shall not affect any other term or provision of this
112
+ License or invalidate or render unenforceable such term or provision in
113
+ any other jurisdiction; provided, however, subject to a court
114
+ modification pursuant to the immediately following sentence, if any term
115
+ or provision of this License pertaining to Human Rights Laws or Human
116
+ Rights Principles is deemed invalid, illegal, or unenforceable against
117
+ Licensee by a court of competent jurisdiction, all rights in the
118
+ Software granted to Licensee shall be deemed null and void as between
119
+ Licensor and Licensee. Upon a determination that any term or provision
120
+ is invalid, illegal, or unenforceable, to the extent permitted by Laws,
121
+ the court may modify this License to affect the original purpose that
122
+ the Software be used in compliance with Human Rights Principles and
123
+ Human Rights Laws as closely as possible. The language in this License
124
+ shall be interpreted as to its fair meaning and not strictly for or
125
+ against any party.
126
+ * Disclaimer. TO THE FULL EXTENT ALLOWED BY LAW, THIS SOFTWARE COMES
127
+ "AS IS," WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED, AND LICENSOR AND
128
+ ANY OTHER CONTRIBUTOR SHALL NOT BE LIABLE TO ANYONE FOR ANY DAMAGES OR
129
+ OTHER LIABILITY ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE
130
+ OR THIS LICENSE, UNDER ANY KIND OF LEGAL CLAIM.
131
+
132
+ This Hippocratic License is an link:https://ethicalsource.dev[Ethical Source license] and is offered
133
+ for use by licensors and licensees at their own risk, on an "AS IS" basis, and with no warranties
134
+ express or implied, to the maximum extent permitted by Laws.
data/README.adoc ADDED
@@ -0,0 +1,166 @@
1
+ :toc: macro
2
+ :toclevels: 5
3
+ :figure-caption!:
4
+
5
+ :data_link: link:https://alchemists.io/articles/ruby_data[Data]
6
+
7
+ = Wholable
8
+
9
+ Wholable is a mixin that turns a class into a _whole value object_ by ensuring object equality is determined by the values that make up the object instead of by identity within memory.
10
+
11
+ toc::[]
12
+
13
+ == Features
14
+
15
+ * Ensures equality (i.e. `#==` and `#eql?`) is determined by attribute values and not object identity (i.e. `#equal?`).
16
+ * Automatically defines public attribute readers (i.e. `.attr_reader`) based on provided keys.
17
+ * Ensures object inspection (i.e. `#inspect`) shows all registered attributes.
18
+ * Ensures object is frozen upon initialization.
19
+
20
+ == Requirements
21
+
22
+ . link:https://www.ruby-lang.org[Ruby].
23
+
24
+ == Setup
25
+
26
+ To install _with_ security, run:
27
+
28
+ [source,bash]
29
+ ----
30
+ # 💡 Skip this line if you already have the public certificate installed.
31
+ gem cert --add <(curl --compressed --location https://alchemists.io/projects/wholable/gems.pem)
32
+ gem install wholable --trust-policy HighSecurity
33
+ ----
34
+
35
+ To install _without_ security, run:
36
+
37
+ [source,bash]
38
+ ----
39
+ gem install wholable
40
+ ----
41
+
42
+ You can also add the gem directly to your project:
43
+
44
+ [source,bash]
45
+ ----
46
+ bundle add wholable
47
+ ----
48
+
49
+ Once the gem is installed, you only need to require it:
50
+
51
+ [source,ruby]
52
+ ----
53
+ require "wholable"
54
+ ----
55
+
56
+ == Usage
57
+
58
+ To use, include Wholable along with a list of attributes that make up your whole value object:
59
+
60
+ [source,ruby]
61
+ ----
62
+ class Person
63
+ include Wholable[:name, :email]
64
+
65
+ def initialize name:, email:
66
+ @name = name
67
+ @email = email
68
+ end
69
+ end
70
+
71
+ jill = Person.new name: "Jill Smith", email: "jill@example.com"
72
+ jill_two = Person.new name: "Jill Smith", email: "jill@example.com"
73
+ jack = Person.new name: "Jack Smith", email: "jack@example.com"
74
+
75
+ jill.frozen? # true
76
+ jill_two.frozen? # true
77
+ jack.frozen? # true
78
+
79
+ jill.inspect # "#<Person @name=\"Jill Smith\", @email=\"jill@example.com\">"
80
+ jill_two.inspect # "#<Person @name=\"Jill Smith\", @email=\"jill@example.com\">"
81
+ jack.inspect # "#<Person @name=\"Jack Smith\", @email=\"jack@example.com\">"
82
+
83
+ jill.name # "Jill Smith"
84
+ jill.email # "jill@example.com"
85
+
86
+ jill == jill # true
87
+ jill == jill_two # true
88
+ jill == jack # false
89
+
90
+ jill.eql? jill # true
91
+ jill.eql? jill_two # true
92
+ jill.eql? jack # false
93
+
94
+ jill.equal? jill # true
95
+ jill.equal? jill_two # false
96
+ jill.equal? jack # false
97
+
98
+ jill.hash # 3650965837788801745
99
+ jill_two.hash # 3650965837788801745
100
+ jack.hash # 4460658980509842640
101
+ ----
102
+
103
+ As you can see, object equality is determined by the object's values and not by the object's identity. When you include `Wholable` along with a list of keys, the following happens:
104
+
105
+ . The corresponding _public_ `attr_reader` for each key will be created which saves you time and reduces double entry.
106
+ . The object will be immediately frozen after initialization to ensure your instance is _immutable_ by default.
107
+
108
+ == Caveats
109
+
110
+ The whole value contract created for you when using this gem can be broken by doing the following:
111
+
112
+ * *Duplication*: Sending the `#dub` message will cause your whole value object to be unfrozen. This might be desired in certain situations but make sure to refreeze when able.
113
+ * *Post Attributes*: Adding additional attributes after what is defined when including `Wholable` will break your whole value object contract so ensure you let Wholable manage this for you.
114
+ * *Deep Freezing*: The automatic freezing of your instances is shallow and will not deeply freeze nested attributes. This behavior mimics the behavior of {data_link} objects.
115
+
116
+ == Influences
117
+
118
+ This implementation is based upon these original designs:
119
+
120
+ - link:https://github.com/dkubb/equalizer[Equalizer]: One of the first implementations that is over a decade old and no longer maintained.
121
+ - link:https://github.com/dry-rb/dry-equalizer[Dry Equalizer]: Deprecated and no longer maintained but was based upon the above implementation. A version of this has moved into link:https://dry-rb.org/gems/dry-core[Dry Core] but doesn't appear to work properly or be well supported. Even the documentation is not fully linked on the main page.
122
+ - link:https://github.com/piotrmurach/equatable/tree/master[Equatable]: A similar implementation to the above but is based off what you define via your `.attr_reader`. The project hasn't been maintained or updated in several years now.
123
+
124
+ == Development
125
+
126
+ To contribute, run:
127
+
128
+ [source,bash]
129
+ ----
130
+ git clone https://github.com/bkuhlmann/wholable
131
+ cd wholable
132
+ bin/setup
133
+ ----
134
+
135
+ You can also use the IRB console for direct access to all objects:
136
+
137
+ [source,bash]
138
+ ----
139
+ bin/console
140
+ ----
141
+
142
+ == Tests
143
+
144
+ To test, run:
145
+
146
+ [source,bash]
147
+ ----
148
+ bin/rake
149
+ ----
150
+
151
+ == link:https://alchemists.io/policies/license[License]
152
+
153
+ == link:https://alchemists.io/policies/security[Security]
154
+
155
+ == link:https://alchemists.io/policies/code_of_conduct[Code of Conduct]
156
+
157
+ == link:https://alchemists.io/policies/contributions[Contributions]
158
+
159
+ == link:https://alchemists.io/projects/wholable/versions[Versions]
160
+
161
+ == link:https://alchemists.io/community[Community]
162
+
163
+ == Credits
164
+
165
+ * Built with link:https://alchemists.io/projects/gemsmith[Gemsmith].
166
+ * Engineered by link:https://alchemists.io/team/brooke_kuhlmann[Brooke Kuhlmann].
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wholable
4
+ # Provides object equality comparison methods.
5
+ module Comparable
6
+ def eql?(other) = instance_of?(other.class) && hash == other.hash
7
+
8
+ def ==(other) = other.is_a?(self.class) && hash == other.hash
9
+ end
10
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wholable
4
+ # Provides core equality behavior.
5
+ class Equatable < Module
6
+ def initialize *keys
7
+ super()
8
+ @keys = keys.uniq
9
+ define_hash
10
+ define_inspect
11
+ freeze
12
+ end
13
+
14
+ def included descendant
15
+ super
16
+ define_readers descendant
17
+ descendant.include Comparable
18
+ descendant.prepend Freezable
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :keys
24
+
25
+ def define_readers descendant
26
+ descendant.class_eval <<-READERS, __FILE__, __LINE__ + 1
27
+ attr_reader #{keys.map(&:inspect).join ", "}
28
+ READERS
29
+ end
30
+
31
+ def define_hash
32
+ local_keys = keys
33
+
34
+ define_method :hash do
35
+ local_keys.map { |key| public_send key }
36
+ .prepend(self.class)
37
+ .hash
38
+ end
39
+ end
40
+
41
+ # :reek:TooManyStatements
42
+ def define_inspect
43
+ local_keys = keys
44
+
45
+ define_method :inspect do
46
+ klass = self.class
47
+ name = klass.name || klass.inspect
48
+
49
+ local_keys.map { |key| %(@#{key}=#{public_send(key).inspect}) }
50
+ .join(", ")
51
+ .then { |pairs| "#<#{name} #{pairs}>" }
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wholable
4
+ # Ensures an object is frozen after being initialized.
5
+ module Freezable
6
+ def initialize(...)
7
+ super(...)
8
+ freeze
9
+ end
10
+ end
11
+ end
data/lib/wholable.rb ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "wholable/comparable"
4
+ require "wholable/equatable"
5
+ require "wholable/freezable"
6
+
7
+ # Main namespace.
8
+ module Wholable
9
+ def self.[](...) = Equatable.new(...)
10
+ end
data/wholable.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "wholable"
5
+ spec.version = "0.0.0"
6
+ spec.authors = ["Brooke Kuhlmann"]
7
+ spec.email = ["brooke@alchemists.io"]
8
+ spec.homepage = "https://alchemists.io/projects/wholable"
9
+ spec.summary = "A whole value object mixin."
10
+ spec.license = "Hippocratic-2.1"
11
+
12
+ spec.metadata = {
13
+ "bug_tracker_uri" => "https://github.com/bkuhlmann/wholable/issues",
14
+ "changelog_uri" => "https://alchemists.io/projects/wholable/versions",
15
+ "documentation_uri" => "https://alchemists.io/projects/wholable",
16
+ "funding_uri" => "https://github.com/sponsors/bkuhlmann",
17
+ "label" => "Wholable",
18
+ "rubygems_mfa_required" => "true",
19
+ "source_code_uri" => "https://github.com/bkuhlmann/wholable"
20
+ }
21
+
22
+ spec.signing_key = Gem.default_key_path
23
+ spec.cert_chain = [Gem.default_cert_path]
24
+
25
+ spec.required_ruby_version = "~> 3.2"
26
+
27
+ spec.extra_rdoc_files = Dir["README*", "LICENSE*"]
28
+ spec.files = Dir["*.gemspec", "lib/**/*"]
29
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wholable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Brooke Kuhlmann
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEeDCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMQ8wDQYDVQQDDAZicm9v
14
+ a2UxGjAYBgoJkiaJk/IsZAEZFgphbGNoZW1pc3RzMRIwEAYKCZImiZPyLGQBGRYC
15
+ aW8wHhcNMjMwMzIyMTYxNDQxWhcNMjUwMzIxMTYxNDQxWjBBMQ8wDQYDVQQDDAZi
16
+ cm9va2UxGjAYBgoJkiaJk/IsZAEZFgphbGNoZW1pc3RzMRIwEAYKCZImiZPyLGQB
17
+ GRYCaW8wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCro8tj5/E1Hg88
18
+ f4qfiwPVd2zJQHvdYt4GHVvuHRRgx4HGhJuNp+4BId08RBn7V6V1MW6MY3kezRBs
19
+ M+7QOQ4b1xNLTvY7FYQB1wGK5a4x7TTokDrPYQxDB2jmsdDYCzVbIMrAvUfcecRi
20
+ khyGZCdByiiCl4fKv77P12tTT+NfsvXkLt/AYCGwjOUyGKTQ01Z6eC09T27GayPH
21
+ QQvIkakyFgcJtzSyGzs8bzK5q9u7wQ12MNTjJoXzW69lqp0oNvDylu81EiSUb5S6
22
+ QzzPxZBiRB1sgtbt1gUbVI262ZDq1gR+HxPFmp+Cgt7ZLIJZAtesQvtcMzseXpfn
23
+ hpmm0Sw22KGhRAy/mqHBRhDl5HqS1SJp2Ko3lcnpXeFResp0HNlt8NSu13vhC08j
24
+ GUHU9MyIXbFOsnp3K3ADrAVjPWop8EZkmUR3MV/CUm00w2cZHCSGiXl1KMpiVKvk
25
+ Ywr1gd2ZME4QLSo+EXUtLxDUa/W3xnBS8dBOuMMz02FPWYr3PN8CAwEAAaN7MHkw
26
+ CQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFAFgmv0tYMZnItuPycSM
27
+ F5wykJEVMB8GA1UdEQQYMBaBFGJyb29rZUBhbGNoZW1pc3RzLmlvMB8GA1UdEgQY
28
+ MBaBFGJyb29rZUBhbGNoZW1pc3RzLmlvMA0GCSqGSIb3DQEBCwUAA4IBgQAX+EGY
29
+ 9RLYGxF1VLZz+G1ACQc4uyrCB6kXwI06kzUa5dF9tPXqTX9ffnz3/W8ck2IQhKzu
30
+ MKO2FVijzbDWTsZeZGglS4E+4Jxpau1lU9HhOIcKolv6LeC6UdALTFudY+GLb8Xw
31
+ REXgaJkjzzhkUSILmEnRwEbY08dVSl7ZAaxVI679vfI2yapLlIwpbBgmQTiTvPr3
32
+ qyyLUno9flYEOv9fmGHunSrM+gE0/0niGTXa5GgXBXYGS2he4LQGgSBfGp/cTwMU
33
+ rDKJRcusZ12lNBeDfgqACz/BBJF8FLodgk6rGMRZz7+ZmjjHEmpG5bQpR6Q2BuWL
34
+ XMtYk/QzaWuhiR7pWjiF8jbdd7RO6or0ohq7iFkokz/5xrtQ/vPzU2RQ3Qc6YaKw
35
+ 3n5C8/6Zh9DYTkpcwPSuIfAga6wf4nXc9m6JAw8AuMLaiWN/r/2s4zJsUHYERJEu
36
+ gZGm4JqtuSg8pYjPeIJxS960owq+SfuC+jxqmRA54BisFCv/0VOJi7tiJVY=
37
+ -----END CERTIFICATE-----
38
+ date: 2023-07-27 00:00:00.000000000 Z
39
+ dependencies: []
40
+ description:
41
+ email:
42
+ - brooke@alchemists.io
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files:
46
+ - README.adoc
47
+ - LICENSE.adoc
48
+ files:
49
+ - LICENSE.adoc
50
+ - README.adoc
51
+ - lib/wholable.rb
52
+ - lib/wholable/comparable.rb
53
+ - lib/wholable/equatable.rb
54
+ - lib/wholable/freezable.rb
55
+ - wholable.gemspec
56
+ homepage: https://alchemists.io/projects/wholable
57
+ licenses:
58
+ - Hippocratic-2.1
59
+ metadata:
60
+ bug_tracker_uri: https://github.com/bkuhlmann/wholable/issues
61
+ changelog_uri: https://alchemists.io/projects/wholable/versions
62
+ documentation_uri: https://alchemists.io/projects/wholable
63
+ funding_uri: https://github.com/sponsors/bkuhlmann
64
+ label: Wholable
65
+ rubygems_mfa_required: 'true'
66
+ source_code_uri: https://github.com/bkuhlmann/wholable
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.2'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubygems_version: 3.4.17
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: A whole value object mixin.
86
+ test_files: []
metadata.gz.sig ADDED
Binary file