polyfill-data 1.0.4 → 1.0.6

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: 62f13af5e73dbe544ce73a294748dee539285c7f8405ec7e68f4d2187b51364c
4
- data.tar.gz: 0d4c325885a85e5ced977b50e38af25d44508d6c85a7d6e02f512a9e56d2dff8
3
+ metadata.gz: a03e6512ebc7c374354a31a97017b565d8f2ff9c0fa012d8d48f61e60e8457bb
4
+ data.tar.gz: b3964f4e5f39d4399e940d4234808c07738a7cc224d651353f4cc1d08daf7068
5
5
  SHA512:
6
- metadata.gz: 73f956793df2920f6c13d564d56592c72a19327ed9451dd536c3f69a8057038775e5a02e1ec8962f85c135d588b0d54df8f337297eaf18f992e6d29ce910d6de
7
- data.tar.gz: 25d0e20f500b2715c2ec352f8f2a46150832e40a9482f782450b2e0b2ebe3d9c6f78cafa19fc978b8fa78569771d22d10626b423ba71e555aa05f42112d38d03
6
+ metadata.gz: '03952e0dd824664e91fc3ff0eb88c68ab26b933c64894a06684afa5b3b0deb7891d0974dbcdde93062eba1ea6cd297098694c1d4b7f2157ec2cfbac75f2feea5'
7
+ data.tar.gz: 6ae3beceb86909ece7547d01f850e584fdd6411f8bb954b9e09ee987e04a445566f1f8a62e19ca7f19df73f05b27ed80afbdfe5c20361e933171fa0959cb3e52
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -5,6 +5,24 @@ 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
+ ## Unreleased
9
+
10
+ ### Added
11
+
12
+ ### Fixed
13
+
14
+ ## 1.0.6
15
+
16
+ ### Fixed
17
+
18
+ - use `each` to avoid allocating an unused array
19
+
20
+ ## 1.0.5
21
+
22
+ ### Fixed
23
+
24
+ - member methods take precedence over methods defined in the block passed to `define`
25
+
8
26
  ## 1.0.4
9
27
 
10
28
  ### Fixed
data/lib/data.rb CHANGED
@@ -1,132 +1,146 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "polyfill/data/version"
4
-
5
- if RUBY_VERSION >= "3.2.0"
6
- warn "You can remove the 'polyfill-data' gem now."
7
- else
8
- Object.send(:remove_const, :Data) rescue nil
9
- class Data < Object
10
- class << self
11
- undef_method :new
12
- attr_reader :members
13
- end
14
-
15
- def self.define(*args, &block)
16
- raise ArgumentError if args.any?(/=/)
17
- klass = ::Class.new(self, &block)
18
-
19
- if args.first.is_a?(String)
20
- name = args.shift
21
- Data.const_set(name, klass)
22
- end
23
-
24
- klass.instance_variable_set(:@members, args)
25
-
26
- klass.define_singleton_method(:new) do |*new_args, **new_kwargs, &block|
27
- init_kwargs = if new_args.any?
28
- raise ArgumentError, "unknown arguments #{new_args[members.size..].join(', ')}" if new_args.size > members.size
29
- Hash[members.take(new_args.size).zip(new_args)]
30
- else
31
- new_kwargs
32
- end
33
-
34
- self.allocate.tap do |instance|
35
- instance.send(:initialize, **init_kwargs, &block)
36
- end.freeze
37
- end
38
- class << klass
39
- alias_method :[], :new
40
- undef_method :define
41
- end
42
-
43
- args.map do |arg|
44
- if klass.method_defined?(arg)
45
- raise ArgumentError, "duplicate member #{arg}"
46
- end
47
- klass.define_method(arg) do
48
- @attributes[arg]
49
- end
50
- end
51
-
52
- klass
53
- end
54
-
55
- def members
56
- self.class.members
57
- end
58
-
59
- def initialize(**kwargs)
60
- kwargs_size = kwargs.size
61
- members_size = members.size
62
-
63
- if kwargs_size > members_size
64
- extras = kwargs.reject{|k, _v| members.include?(k) }.keys
65
- raise ArgumentError, "unknown arguments #{extras.join(', ')}"
66
- elsif kwargs_size < members_size
67
- missing = members.select {|k, _v| !kwargs.include?(k) }
68
- raise ArgumentError, "missing arguments #{missing.map{ ":#{_1}" }.join(', ')}"
69
- end
70
-
71
- @attributes = Hash[members.map {|m| [m,kwargs[m]] }]
72
- end
73
-
74
- def deconstruct
75
- @attributes.values
76
- end
77
-
78
- def deconstruct_keys(array)
79
- raise TypeError unless array.is_a?(Array) || array.nil?
80
- return @attributes if array&.first.nil?
81
-
82
- @attributes.slice(*array)
83
- end
84
-
85
- def to_h(&block)
86
- @attributes.to_h(&block)
87
- end
88
-
89
- def hash
90
- to_h.hash
91
- end
92
-
93
- def eql?(other)
94
- self.class == other.class && hash == other.hash
95
- end
96
-
97
- def ==(other)
98
- self.class == other.class && to_h == other.to_h
99
- end
100
-
101
- def inspect
102
- name = ["data", self.class.name].compact.join(" ")
103
- attribute_markers = @attributes.map do |key, value|
104
- insect_key = key.to_s.start_with?("@") ? ":#{key}" : key
105
- "#{insect_key}=#{value}"
106
- end
107
- %(#<#{name} #{attribute_markers.join(", ")}>)
108
- end
109
- alias_method :to_s, :inspect
110
-
111
- def with(**kwargs)
112
- return self if kwargs.empty?
113
-
114
- self.class.new(**@attributes.merge(kwargs))
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
131
- end
132
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "polyfill/data/version"
4
+
5
+ if RUBY_VERSION >= "3.2.0"
6
+ warn "You can remove the 'polyfill-data' gem now."
7
+ else
8
+ Object.send(:remove_const, :Data) rescue nil
9
+ class Data < Object
10
+ class << self
11
+ undef_method :new
12
+ attr_reader :members
13
+ end
14
+
15
+ def self.define(*args, &block)
16
+ raise ArgumentError if args.any?(/=/)
17
+ if block
18
+ mod = Module.new
19
+ mod.define_singleton_method(:_,) do |klass|
20
+ klass.class_eval(&block)
21
+ end
22
+ arity_converter = mod.method(:_)
23
+ end
24
+ klass = ::Class.new(self)
25
+
26
+ if args.first.is_a?(String)
27
+ name = args.shift
28
+ Data.const_set(name, klass)
29
+ end
30
+
31
+ klass.instance_variable_set(:@members, args)
32
+
33
+ klass.define_singleton_method(:new) do |*new_args, **new_kwargs, &block|
34
+ init_kwargs = if new_args.any?
35
+ raise ArgumentError, "unknown arguments #{new_args[members.size..].join(', ')}" if new_args.size > members.size
36
+ Hash[members.take(new_args.size).zip(new_args)]
37
+ else
38
+ new_kwargs
39
+ end
40
+
41
+ self.allocate.tap do |instance|
42
+ instance.send(:initialize, **init_kwargs, &block)
43
+ end.freeze
44
+ end
45
+
46
+ class << klass
47
+ alias_method :[], :new
48
+ undef_method :define
49
+ end
50
+
51
+ args.each do |arg|
52
+ if klass.method_defined?(arg)
53
+ raise ArgumentError, "duplicate member #{arg}"
54
+ end
55
+ klass.define_method(arg) do
56
+ @attributes[arg]
57
+ end
58
+ end
59
+
60
+ if arity_converter
61
+ klass.class_eval(&arity_converter)
62
+ end
63
+
64
+ klass
65
+ end
66
+
67
+ def members
68
+ self.class.members
69
+ end
70
+
71
+ def initialize(**kwargs)
72
+ kwargs_size = kwargs.size
73
+ members_size = members.size
74
+
75
+ if kwargs_size > members_size
76
+ extras = kwargs.reject{|k, _v| members.include?(k) }.keys
77
+ raise ArgumentError, "unknown arguments #{extras.join(', ')}"
78
+ elsif kwargs_size < members_size
79
+ missing = members.select {|k, _v| !kwargs.include?(k) }
80
+ raise ArgumentError, "missing arguments #{missing.map{ ":#{_1}" }.join(', ')}"
81
+ end
82
+
83
+ @attributes = Hash[members.map {|m| [m,kwargs[m]] }]
84
+ end
85
+
86
+ def deconstruct
87
+ @attributes.values
88
+ end
89
+
90
+ def deconstruct_keys(array)
91
+ raise TypeError unless array.is_a?(Array) || array.nil?
92
+ return @attributes if array&.first.nil?
93
+
94
+ @attributes.slice(*array)
95
+ end
96
+
97
+ def to_h(&block)
98
+ @attributes.to_h(&block)
99
+ end
100
+
101
+ def hash
102
+ to_h.hash
103
+ end
104
+
105
+ def eql?(other)
106
+ self.class == other.class && hash == other.hash
107
+ end
108
+
109
+ def ==(other)
110
+ self.class == other.class && to_h == other.to_h
111
+ end
112
+
113
+ def inspect
114
+ attribute_markers = @attributes.map do |key, value|
115
+ insect_key = key.to_s.start_with?("@") ? ":#{key}" : key
116
+ "#{insect_key}=#{value}"
117
+ end.join(", ")
118
+
119
+ display = ["data", self.class.name, attribute_markers].compact.join(" ")
120
+
121
+ "#<#{display}>"
122
+ end
123
+ alias_method :to_s, :inspect
124
+
125
+ def with(**kwargs)
126
+ return self if kwargs.empty?
127
+
128
+ self.class.new(**@attributes.merge(kwargs))
129
+ end
130
+
131
+ private
132
+
133
+ def marshal_dump
134
+ @attributes
135
+ end
136
+
137
+ def marshal_load(attributes)
138
+ @attributes = attributes
139
+ freeze
140
+ end
141
+
142
+ def initialize_copy(source)
143
+ super.freeze
144
+ end
145
+ end
146
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Polyfill
4
4
  module Data
5
- VERSION = "1.0.4"
5
+ VERSION = "1.0.6"
6
6
  end
7
7
  end
data/test/test_data.rb CHANGED
@@ -269,4 +269,25 @@ class TestData < Minitest::Test
269
269
 
270
270
  assert_equal(Data::Measure, klass)
271
271
  end
272
+
273
+ def test_member_precedence
274
+ name_mod = Module.new do
275
+ def name
276
+ "default name"
277
+ end
278
+
279
+ def other
280
+ "other"
281
+ end
282
+ end
283
+
284
+ klass = Data.define(:name) do
285
+ include name_mod
286
+ end
287
+
288
+ data = klass.new("test")
289
+
290
+ assert_equal("test", data.name)
291
+ assert_equal("other", data.other)
292
+ end
272
293
  end
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
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Gay
@@ -34,7 +34,7 @@ cert_chain:
34
34
  dxkiKqcX+yzo9RJLD9l/E1AWX125r1Fhiif4l6ehdl7Vllc3NQUOm1abdmHtCYjw
35
35
  dG3yPWBWzzN4ovoBRqsuTJbF1wjkCjl5ex5KhfYbeDc=
36
36
  -----END CERTIFICATE-----
37
- date: 2023-01-22 00:00:00.000000000 Z
37
+ date: 2023-11-25 00:00:00.000000000 Z
38
38
  dependencies: []
39
39
  description: Add the ruby 3.2 Data class to older rubies. Do nothing in 3.2
40
40
  email:
@@ -76,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
78
  requirements: []
79
- rubygems_version: 3.1.6
79
+ rubygems_version: 3.3.5
80
80
  signing_key:
81
81
  specification_version: 4
82
82
  summary: Add the ruby 3.2 Data class to older rubies
metadata.gz.sig CHANGED
Binary file