polyfill-data 1.0.3 → 1.0.4
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
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +9 -0
- data/lib/data.rb +20 -1
- data/lib/polyfill/data/version.rb +1 -1
- data/test/test_data.rb +79 -2
- data.tar.gz.sig +0 -0
- metadata +2 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62f13af5e73dbe544ce73a294748dee539285c7f8405ec7e68f4d2187b51364c
|
4
|
+
data.tar.gz: 0d4c325885a85e5ced977b50e38af25d44508d6c85a7d6e02f512a9e56d2dff8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73f956793df2920f6c13d564d56592c72a19327ed9451dd536c3f69a8057038775e5a02e1ec8962f85c135d588b0d54df8f337297eaf18f992e6d29ce910d6de
|
7
|
+
data.tar.gz: 25d0e20f500b2715c2ec352f8f2a46150832e40a9482f782450b2e0b2ebe3d9c6f78cafa19fc978b8fa78569771d22d10626b423ba71e555aa05f42112d38d03
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
7
|
|
8
|
+
## 1.0.4
|
9
|
+
|
10
|
+
### Fixed
|
11
|
+
|
12
|
+
- loading from `Marshal.load` will create a frozen object
|
13
|
+
- `dup` will return a frozen object
|
14
|
+
- `define` cannot be used on Data subclasses
|
15
|
+
- `with` returns `self` when given no arguments
|
16
|
+
|
8
17
|
## 1.0.3
|
9
18
|
|
10
19
|
### Fixed
|
data/lib/data.rb
CHANGED
@@ -9,6 +9,7 @@ else
|
|
9
9
|
class Data < Object
|
10
10
|
class << self
|
11
11
|
undef_method :new
|
12
|
+
attr_reader :members
|
12
13
|
end
|
13
14
|
|
14
15
|
def self.define(*args, &block)
|
@@ -20,7 +21,7 @@ else
|
|
20
21
|
Data.const_set(name, klass)
|
21
22
|
end
|
22
23
|
|
23
|
-
klass.
|
24
|
+
klass.instance_variable_set(:@members, args)
|
24
25
|
|
25
26
|
klass.define_singleton_method(:new) do |*new_args, **new_kwargs, &block|
|
26
27
|
init_kwargs = if new_args.any?
|
@@ -36,6 +37,7 @@ else
|
|
36
37
|
end
|
37
38
|
class << klass
|
38
39
|
alias_method :[], :new
|
40
|
+
undef_method :define
|
39
41
|
end
|
40
42
|
|
41
43
|
args.map do |arg|
|
@@ -107,7 +109,24 @@ else
|
|
107
109
|
alias_method :to_s, :inspect
|
108
110
|
|
109
111
|
def with(**kwargs)
|
112
|
+
return self if kwargs.empty?
|
113
|
+
|
110
114
|
self.class.new(**@attributes.merge(kwargs))
|
111
115
|
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def marshal_dump
|
120
|
+
@attributes
|
121
|
+
end
|
122
|
+
|
123
|
+
def marshal_load(attributes)
|
124
|
+
@attributes = attributes
|
125
|
+
freeze
|
126
|
+
end
|
127
|
+
|
128
|
+
def initialize_copy(source)
|
129
|
+
super.freeze
|
130
|
+
end
|
112
131
|
end
|
113
132
|
end
|
data/test/test_data.rb
CHANGED
@@ -13,6 +13,8 @@ class TestData < Minitest::Test
|
|
13
13
|
|
14
14
|
# Because some code is shared with Struct, check we don't share unnecessary functionality
|
15
15
|
assert_raises(TypeError) { Data.define(:foo, keyword_init: true) }
|
16
|
+
|
17
|
+
refute_respond_to(Data.define, :define, "Cannot define from defined Data class")
|
16
18
|
end
|
17
19
|
|
18
20
|
def test_define_edge_cases
|
@@ -59,6 +61,7 @@ class TestData < Minitest::Test
|
|
59
61
|
assert_equal(1, test.foo)
|
60
62
|
assert_equal(2, test.bar)
|
61
63
|
assert_equal(test, klass.new(1, 2))
|
64
|
+
assert_predicate(test, :frozen?)
|
62
65
|
|
63
66
|
# Keywords
|
64
67
|
test_kw = klass.new(foo: 1, bar: 2)
|
@@ -121,8 +124,6 @@ class TestData < Minitest::Test
|
|
121
124
|
test = klass.new(bar: 2, foo: 1)
|
122
125
|
assert_equal([1, 2], test.deconstruct)
|
123
126
|
|
124
|
-
assert_predicate(test, :frozen?)
|
125
|
-
|
126
127
|
assert_kind_of(Integer, test.hash)
|
127
128
|
end
|
128
129
|
|
@@ -165,6 +166,65 @@ class TestData < Minitest::Test
|
|
165
166
|
refute_operator(o1, :eql?, o3)
|
166
167
|
end
|
167
168
|
|
169
|
+
def test_with
|
170
|
+
klass = Data.define(:foo, :bar)
|
171
|
+
source = klass.new(foo: 1, bar: 2)
|
172
|
+
|
173
|
+
# Simple
|
174
|
+
test = source.with
|
175
|
+
assert_equal(source.object_id, test.object_id)
|
176
|
+
|
177
|
+
# Changes
|
178
|
+
test = source.with(foo: 10)
|
179
|
+
|
180
|
+
assert_equal(1, source.foo)
|
181
|
+
assert_equal(2, source.bar)
|
182
|
+
assert_equal(source, klass.new(foo: 1, bar: 2))
|
183
|
+
|
184
|
+
assert_equal(10, test.foo)
|
185
|
+
assert_equal(2, test.bar)
|
186
|
+
assert_equal(test, klass.new(foo: 10, bar: 2))
|
187
|
+
|
188
|
+
test = source.with(foo: 10, bar: 20)
|
189
|
+
|
190
|
+
assert_equal(1, source.foo)
|
191
|
+
assert_equal(2, source.bar)
|
192
|
+
assert_equal(source, klass.new(foo: 1, bar: 2))
|
193
|
+
|
194
|
+
assert_equal(10, test.foo)
|
195
|
+
assert_equal(20, test.bar)
|
196
|
+
assert_equal(test, klass.new(foo: 10, bar: 20))
|
197
|
+
|
198
|
+
# Keyword splat
|
199
|
+
changes = { foo: 10, bar: 20 }
|
200
|
+
test = source.with(**changes)
|
201
|
+
|
202
|
+
assert_equal(1, source.foo)
|
203
|
+
assert_equal(2, source.bar)
|
204
|
+
assert_equal(source, klass.new(foo: 1, bar: 2))
|
205
|
+
|
206
|
+
assert_equal(10, test.foo)
|
207
|
+
assert_equal(20, test.bar)
|
208
|
+
assert_equal(test, klass.new(foo: 10, bar: 20))
|
209
|
+
|
210
|
+
# Wrong protocol
|
211
|
+
assert_raises(ArgumentError, "wrong number of arguments (given 1, expected 0)") do
|
212
|
+
source.with(10)
|
213
|
+
end
|
214
|
+
assert_raises(ArgumentError, "unknown keywords: :baz, :quux") do
|
215
|
+
source.with(foo: 1, bar: 2, baz: 3, quux: 4)
|
216
|
+
end
|
217
|
+
assert_raises(ArgumentError, "wrong number of arguments (given 1, expected 0)") do
|
218
|
+
source.with(1, bar: 2)
|
219
|
+
end
|
220
|
+
assert_raises(ArgumentError, "wrong number of arguments (given 2, expected 0)") do
|
221
|
+
source.with(1, 2)
|
222
|
+
end
|
223
|
+
assert_raises(ArgumentError, "wrong number of arguments (given 1, expected 0)") do
|
224
|
+
source.with({ bar: 2 })
|
225
|
+
end unless RUBY_VERSION < "2.8.0"
|
226
|
+
end
|
227
|
+
|
168
228
|
def test_memberless
|
169
229
|
klass = Data.define
|
170
230
|
|
@@ -187,6 +247,23 @@ class TestData < Minitest::Test
|
|
187
247
|
assert_equal('km', distance.unit)
|
188
248
|
end
|
189
249
|
|
250
|
+
def test_dup
|
251
|
+
klass = Data.define(:foo, :bar)
|
252
|
+
test = klass.new(foo: 1, bar: 2)
|
253
|
+
assert_equal(klass.new(foo: 1, bar: 2), test.dup)
|
254
|
+
assert_predicate(test.dup, :frozen?)
|
255
|
+
end
|
256
|
+
|
257
|
+
Klass = Data.define(:foo, :bar)
|
258
|
+
|
259
|
+
def test_marshal
|
260
|
+
test = Klass.new(foo: 1, bar: 2)
|
261
|
+
loaded = Marshal.load(Marshal.dump(test))
|
262
|
+
assert_equal(test, loaded)
|
263
|
+
refute_same(test, loaded)
|
264
|
+
assert_predicate(loaded, :frozen?)
|
265
|
+
end
|
266
|
+
|
190
267
|
def test_namespaced_constant
|
191
268
|
klass = Data.define("Measure", :amount, :unit)
|
192
269
|
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polyfill-data
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Gay
|
@@ -36,7 +36,7 @@ cert_chain:
|
|
36
36
|
-----END CERTIFICATE-----
|
37
37
|
date: 2023-01-22 00:00:00.000000000 Z
|
38
38
|
dependencies: []
|
39
|
-
description: Add the ruby 3.2 Data class to older rubies
|
39
|
+
description: Add the ruby 3.2 Data class to older rubies. Do nothing in 3.2
|
40
40
|
email:
|
41
41
|
- jim@saturnflyer.com
|
42
42
|
executables: []
|
metadata.gz.sig
CHANGED
Binary file
|