polyfill-data 1.0.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 +7 -0
- checksums.yaml.gz.sig +0 -0
- data/README.md +45 -0
- data/Rakefile +12 -0
- data/certs/saturnflyer.pem +25 -0
- data/lib/data.rb +99 -0
- data/lib/polyfill/data/version.rb +7 -0
- data/lib/polyfill-data.rb +1 -0
- data/test/test_data.rb +170 -0
- data/test/test_helper.rb +5 -0
- data.tar.gz.sig +0 -0
- metadata +84 -0
- metadata.gz.sig +3 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3fc564f62f95089c90ab7c84d558694513c676e2720e30a5587fda794b0446e2
|
4
|
+
data.tar.gz: 2466958db19b441691124b8085c60dbb16ad9522b257aa647bb5d816f6bb0b42
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: '09a20ba5e0db01e1693fd27f63eafcd62e3cb6e7dbf49bc9f061e7bec5f9259f3cef29de156f5319791059ac152a169157dfbd4375b13e2f73f551511fb256b7'
|
7
|
+
data.tar.gz: 056fa220c31d080a4b3c3a68d606772bc8791495d42abcad66e80d59146568255d45a613411741223b82ddcc34ee5f3978099ed2aff79e4a9257d6720331dbff
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# Polyfill - Data
|
2
|
+
|
3
|
+
Add the Ruby 3.2 Data class to earlier Rubies.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Install the gem and add to the application's Gemfile by executing:
|
8
|
+
|
9
|
+
$ bundle add polyfill-data
|
10
|
+
|
11
|
+
If bundler is not being used to manage dependencies, install the gem by executing:
|
12
|
+
|
13
|
+
$ gem install polyfill-data
|
14
|
+
|
15
|
+
Polyfill-Data is cryptographically signed. To be sure the gem you install hasn’t been tampered with:
|
16
|
+
|
17
|
+
Add my the key (if you haven’t already) as a trusted certificate
|
18
|
+
|
19
|
+
gem cert --add <(curl -Ls https://raw.github.com/saturnflyer/polyfill-data/main/certs/saturnflyer.pem)
|
20
|
+
|
21
|
+
gem install polyfill-data -P HighSecurity
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
require 'polyfill-data'
|
27
|
+
|
28
|
+
MyValue = Data.define(:some, :stuff)
|
29
|
+
a_value = MyValue.new(some: "thing", stuff: "here")
|
30
|
+
puts a_value.to_h # => { some: "thing", stuff: "here" }
|
31
|
+
|
32
|
+
another = a_value.with(stuff: "there")
|
33
|
+
puts another.eql?(a_value) # => false
|
34
|
+
puts another.to_h # => { some: "thing", stuff: "there" }
|
35
|
+
```
|
36
|
+
|
37
|
+
## Development
|
38
|
+
|
39
|
+
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.
|
40
|
+
|
41
|
+
To install this gem onto your local machine, run `bundle exec rake install`. 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 the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
42
|
+
|
43
|
+
## Contributing
|
44
|
+
|
45
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/saturnflyer/polyfill-data.
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIEPDCCAqSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAkMSIwIAYDVQQDDBlqaW0v
|
3
|
+
REM9c2F0dXJuZmx5ZXIvREM9Y29tMB4XDTIzMDExOTE1MTcwNloXDTI0MDExOTE1
|
4
|
+
MTcwNlowJDEiMCAGA1UEAwwZamltL0RDPXNhdHVybmZseWVyL0RDPWNvbTCCAaIw
|
5
|
+
DQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBALujbiQtllLpXG8My8gDdiINTlT3
|
6
|
+
MVNwkagztozhLX/PWxekC1lBhCU9Eke2xRRcIZeK8CL/Hh984wN3H156J4b9yfUa
|
7
|
+
IoxKnItgCf2eDBJ0QMcaqgdfDdJp5km7+W0AdyOq5GuPGmGObPXReZWuB1FqS5z0
|
8
|
+
cRpoM/nOfYDI0T/obhBvcGt9mPibL4O5BnpJTj3X9NiMJ1KPv0zD0nlsEZy8iraY
|
9
|
+
P69pC/KykYIRM5hw4YYgFGjnftDFXoSdGRZ+wJn6Yb1MlJ4TMxRzSEZySZeSGlsk
|
10
|
+
tTVpGi3iftSJExvNWbilJqy73XtQHi846zCcqtVghwku3+0VbYr/0mygna4QzT/b
|
11
|
+
2F4oW/1mu4aM/Phm+uyGcrmG2hioQqrZbOMGbi9Baa8xAob4HCUd1mfG+btjd61t
|
12
|
+
5ckfDjqZLo0or9ATYU1F5G6kEJIjHiz5YgHxglcthQRHyWCa/r+M4DnpQ5TwBhhS
|
13
|
+
ZWoB5+W7KlfN1guDZ4LjDAUEsWCKsBNydM0XzQIDAQABo3kwdzAJBgNVHRMEAjAA
|
14
|
+
MAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUTNduUZSXfk8psUbclUtWl2qPf7MwHgYD
|
15
|
+
VR0RBBcwFYETamltQHNhdHVybmZseWVyLmNvbTAeBgNVHRIEFzAVgRNqaW1Ac2F0
|
16
|
+
dXJuZmx5ZXIuY29tMA0GCSqGSIb3DQEBCwUAA4IBgQBpRBA0939h4raDJmIObTGj
|
17
|
+
T4ZgUdOs27GnQXKJOG50Z9o8sEuG3WDRPUBsck50PKmI6taNalaEVOeeLNXvbfl8
|
18
|
+
Fb17rZnhy/ssAUseVAojIPHxHvsgi1K76v5HJMzuM774ftDckjWVOBhJ85Jxyj9c
|
19
|
+
1VZes12ut2udsSa2vE6niS3mxrCeKCjmPQ7M5a55/fMr2tVX9qgPYZJmK0ck/Weh
|
20
|
+
e0fZ+W4iiGTZSrfHqNe2BabhLeKQtowVBMvBKbhL7DwdkufDaOv77uN5nsSMZfzh
|
21
|
+
ebdplnosS17xWRZxj+T/Vob93PmQFd7AsRnaNu9HjesRTbiBxKus7I0CeLPAelpD
|
22
|
+
Nq/5JAtQf+uEeL5/QXF9Mwv44ERxVbTX0DcZYjaepSgpYQtOew9EXLqQj0mLSsxG
|
23
|
+
dxkiKqcX+yzo9RJLD9l/E1AWX125r1Fhiif4l6ehdl7Vllc3NQUOm1abdmHtCYjw
|
24
|
+
dG3yPWBWzzN4ovoBRqsuTJbF1wjkCjl5ex5KhfYbeDc=
|
25
|
+
-----END CERTIFICATE-----
|
data/lib/data.rb
ADDED
@@ -0,0 +1,99 @@
|
|
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
|
+
end
|
13
|
+
|
14
|
+
def self.define(*args, &block)
|
15
|
+
raise ArgumentError if args.any?(/=/)
|
16
|
+
klass = ::Class.new(self, &block)
|
17
|
+
|
18
|
+
klass.define_singleton_method(:members) { args.map{ _1.intern } }
|
19
|
+
|
20
|
+
klass.define_singleton_method(:new) do |*new_args, **new_kwargs, &block|
|
21
|
+
arg_comparison = new_kwargs.any? ? new_kwargs.keys : new_args
|
22
|
+
if arg_comparison.size != args.size
|
23
|
+
raise ArgumentError
|
24
|
+
end
|
25
|
+
self.allocate.tap do |instance|
|
26
|
+
args_to_hash = if !new_kwargs.any?
|
27
|
+
Hash[members.take(new_args.size).zip(new_args)]
|
28
|
+
else
|
29
|
+
new_kwargs
|
30
|
+
end
|
31
|
+
instance.send(:initialize, **args_to_hash, &block)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
args.map do |arg|
|
36
|
+
if klass.method_defined?(arg)
|
37
|
+
raise ArgumentError, "duplicate member #{arg}"
|
38
|
+
end
|
39
|
+
klass.define_method(arg) do
|
40
|
+
@attributes[arg]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
klass
|
45
|
+
end
|
46
|
+
|
47
|
+
def members
|
48
|
+
self.class.members
|
49
|
+
end
|
50
|
+
|
51
|
+
def initialize(*args, **kwargs)
|
52
|
+
@attributes = case
|
53
|
+
when args.empty? && kwargs.empty?
|
54
|
+
{}
|
55
|
+
when args.empty?
|
56
|
+
kwargs
|
57
|
+
else
|
58
|
+
raise ArgumentError unless args.length == members.length
|
59
|
+
Hash[members.zip(args)]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def deconstruct_keys(array)
|
64
|
+
raise TypeError unless array.is_a?(Array) || array.nil?
|
65
|
+
return @attributes if array&.first.nil?
|
66
|
+
|
67
|
+
@attributes.slice(*array)
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_h(&block)
|
71
|
+
@attributes.to_h(&block)
|
72
|
+
end
|
73
|
+
|
74
|
+
def hash
|
75
|
+
to_h.hash
|
76
|
+
end
|
77
|
+
|
78
|
+
def eql?(other)
|
79
|
+
self.class == other.class && hash == other.hash
|
80
|
+
end
|
81
|
+
|
82
|
+
def ==(other)
|
83
|
+
self.class == other.class && to_h == other.to_h
|
84
|
+
end
|
85
|
+
|
86
|
+
def inspect
|
87
|
+
name = ["data", self.class.name].compact.join(" ")
|
88
|
+
attribute_markers = @attributes.map do |key, value|
|
89
|
+
insect_key = key.to_s.start_with?("@") ? ":#{key}" : key
|
90
|
+
"#{insect_key}=#{value}"
|
91
|
+
end
|
92
|
+
%(#<#{name} #{attribute_markers.join(" ")}>)
|
93
|
+
end
|
94
|
+
|
95
|
+
def with(**kwargs)
|
96
|
+
self.class.new(*@attributes.merge(kwargs).values)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "data"
|
data/test/test_data.rb
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
# -*- coding: us-ascii -*-
|
2
|
+
# frozen_string_literal: false
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class TestData < Minitest::Test
|
6
|
+
def test_define
|
7
|
+
klass = Data.define(:foo, :bar)
|
8
|
+
assert_kind_of(Class, klass)
|
9
|
+
assert_equal(%i[foo bar], klass.members)
|
10
|
+
|
11
|
+
assert_raises(NoMethodError) { Data.new(:foo) }
|
12
|
+
assert_raises(TypeError) { Data.define(0) }
|
13
|
+
|
14
|
+
# Because some code is shared with Struct, check we don't share unnecessary functionality
|
15
|
+
assert_raises(TypeError) { Data.define(:foo, keyword_init: true) }
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_define_edge_cases
|
19
|
+
# non-ascii
|
20
|
+
klass = Data.define(:"r\u{e9}sum\u{e9}")
|
21
|
+
o = klass.new(1)
|
22
|
+
assert_equal(1, o.send(:"r\u{e9}sum\u{e9}"))
|
23
|
+
|
24
|
+
# junk string
|
25
|
+
klass = Data.define(:"a\000")
|
26
|
+
o = klass.new(1)
|
27
|
+
assert_equal(1, o.send(:"a\000"))
|
28
|
+
|
29
|
+
# special characters in attribute names
|
30
|
+
klass = Data.define(:a, :b?)
|
31
|
+
x = Object.new
|
32
|
+
o = klass.new("test", x)
|
33
|
+
assert_same(x, o.b?)
|
34
|
+
|
35
|
+
klass = Data.define(:a, :b!)
|
36
|
+
x = Object.new
|
37
|
+
o = klass.new("test", x)
|
38
|
+
assert_same(x, o.b!)
|
39
|
+
|
40
|
+
assert_raises(ArgumentError) { Data.define(:x=) }
|
41
|
+
assert_raises(ArgumentError, /duplicate member/) { Data.define(:x, :x) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_define_with_block
|
45
|
+
klass = Data.define(:a, :b) do
|
46
|
+
def c
|
47
|
+
a + b
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
assert_equal(3, klass.new(1, 2).c)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_initialize
|
55
|
+
klass = Data.define(:foo, :bar)
|
56
|
+
|
57
|
+
# Regular
|
58
|
+
test = klass.new(1, 2)
|
59
|
+
assert_equal(1, test.foo)
|
60
|
+
assert_equal(2, test.bar)
|
61
|
+
assert_equal(test, klass.new(1, 2))
|
62
|
+
|
63
|
+
# Keywords
|
64
|
+
test_kw = klass.new(foo: 1, bar: 2)
|
65
|
+
assert_equal(1, test_kw.foo)
|
66
|
+
assert_equal(2, test_kw.bar)
|
67
|
+
assert_equal(test_kw, klass.new(foo: 1, bar: 2))
|
68
|
+
assert_equal(test_kw, test)
|
69
|
+
|
70
|
+
# Wrong protocol
|
71
|
+
assert_raises(ArgumentError) { klass.new(1) }
|
72
|
+
assert_raises(ArgumentError) { klass.new(1, 2, 3) }
|
73
|
+
assert_raises(ArgumentError) { klass.new(foo: 1) }
|
74
|
+
assert_raises(ArgumentError) { klass.new(foo: 1, bar: 2, baz: 3) }
|
75
|
+
# Could be converted to foo: 1, bar: 2, but too smart is confusing
|
76
|
+
assert_raises(ArgumentError) { klass.new(1, bar: 2) }
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_initialize_redefine
|
80
|
+
klass = Data.define(:foo, :bar) do
|
81
|
+
attr_reader :passed
|
82
|
+
|
83
|
+
def initialize(*args, **kwargs)
|
84
|
+
@passed = [args, kwargs]
|
85
|
+
|
86
|
+
super(foo: 1, bar: 2) # so we can experiment with passing wrong numbers of args
|
87
|
+
end
|
88
|
+
end
|
89
|
+
# require 'debug'; debugger
|
90
|
+
assert_equal([[], {foo: 1, bar: 2}], klass.new(foo: 1, bar: 2).passed)
|
91
|
+
|
92
|
+
# Positional arguments are converted to keyword ones
|
93
|
+
assert_equal([[], {foo: 1, bar: 2}], klass.new(1, 2).passed)
|
94
|
+
|
95
|
+
# Missing arguments can be fixed in initialize
|
96
|
+
assert_equal([[], {foo: 1}], klass.new(foo: 1).passed)
|
97
|
+
|
98
|
+
# Extra keyword arguments can be dropped in initialize
|
99
|
+
assert_equal([[], {foo: 1, bar: 2, baz: 3}], klass.new(foo: 1, bar: 2, baz: 3).passed)
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_instance_behavior
|
103
|
+
klass = Data.define(:foo, :bar)
|
104
|
+
|
105
|
+
test = klass.new(1, 2)
|
106
|
+
assert_equal(1, test.foo)
|
107
|
+
assert_equal(2, test.bar)
|
108
|
+
assert_equal(%i[foo bar], test.members)
|
109
|
+
assert_equal(1, test.public_send(:foo))
|
110
|
+
assert_equal(0, test.method(:foo).arity)
|
111
|
+
assert_equal([], test.method(:foo).parameters)
|
112
|
+
|
113
|
+
assert_equal({foo: 1, bar: 2}, test.to_h)
|
114
|
+
assert_equal({"foo"=>"1", "bar"=>"2"}, test.to_h { [_1.to_s, _2.to_s] })
|
115
|
+
|
116
|
+
assert_equal({foo: 1, bar: 2}, test.deconstruct_keys(nil))
|
117
|
+
assert_equal({foo: 1}, test.deconstruct_keys(%i[foo]))
|
118
|
+
assert_equal({foo: 1}, test.deconstruct_keys(%i[foo baz]))
|
119
|
+
assert_raises(TypeError) { test.deconstruct_keys(0) }
|
120
|
+
|
121
|
+
assert_kind_of(Integer, test.hash)
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_inspect
|
125
|
+
klass = Data.define(:a)
|
126
|
+
o = klass.new(1)
|
127
|
+
assert_equal("#<data a=1>", o.inspect)
|
128
|
+
|
129
|
+
Object.const_set(:Foo, klass)
|
130
|
+
assert_equal("#<data Foo a=1>", o.inspect)
|
131
|
+
Object.instance_eval { remove_const(:Foo) }
|
132
|
+
|
133
|
+
klass = Data.define(:@a)
|
134
|
+
o = klass.new(1)
|
135
|
+
assert_equal("#<data :@a=1>", o.inspect)
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_equal
|
139
|
+
klass1 = Data.define(:a)
|
140
|
+
klass2 = Data.define(:a)
|
141
|
+
o1 = klass1.new(1)
|
142
|
+
o2 = klass1.new(1)
|
143
|
+
o3 = klass2.new(1)
|
144
|
+
assert_equal(o1, o2)
|
145
|
+
refute_equal(o1, o3)
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_eql
|
149
|
+
klass1 = Data.define(:a)
|
150
|
+
klass2 = Data.define(:a)
|
151
|
+
o1 = klass1.new(1)
|
152
|
+
o2 = klass1.new(1)
|
153
|
+
o3 = klass2.new(1)
|
154
|
+
assert_operator(o1, :eql?, o2)
|
155
|
+
refute_operator(o1, :eql?, o3)
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_memberless
|
159
|
+
klass = Data.define
|
160
|
+
|
161
|
+
test = klass.new
|
162
|
+
|
163
|
+
assert_equal(klass.new, test)
|
164
|
+
refute_equal(Data.define.new, test)
|
165
|
+
|
166
|
+
assert_equal('#<data >', test.inspect)
|
167
|
+
assert_equal([], test.members)
|
168
|
+
assert_equal({}, test.to_h)
|
169
|
+
end
|
170
|
+
end
|
data/test/test_helper.rb
ADDED
data.tar.gz.sig
ADDED
Binary file
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: polyfill-data
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jim Gay
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIEPDCCAqSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAkMSIwIAYDVQQDDBlqaW0v
|
14
|
+
REM9c2F0dXJuZmx5ZXIvREM9Y29tMB4XDTIzMDExOTE1MTcwNloXDTI0MDExOTE1
|
15
|
+
MTcwNlowJDEiMCAGA1UEAwwZamltL0RDPXNhdHVybmZseWVyL0RDPWNvbTCCAaIw
|
16
|
+
DQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBALujbiQtllLpXG8My8gDdiINTlT3
|
17
|
+
MVNwkagztozhLX/PWxekC1lBhCU9Eke2xRRcIZeK8CL/Hh984wN3H156J4b9yfUa
|
18
|
+
IoxKnItgCf2eDBJ0QMcaqgdfDdJp5km7+W0AdyOq5GuPGmGObPXReZWuB1FqS5z0
|
19
|
+
cRpoM/nOfYDI0T/obhBvcGt9mPibL4O5BnpJTj3X9NiMJ1KPv0zD0nlsEZy8iraY
|
20
|
+
P69pC/KykYIRM5hw4YYgFGjnftDFXoSdGRZ+wJn6Yb1MlJ4TMxRzSEZySZeSGlsk
|
21
|
+
tTVpGi3iftSJExvNWbilJqy73XtQHi846zCcqtVghwku3+0VbYr/0mygna4QzT/b
|
22
|
+
2F4oW/1mu4aM/Phm+uyGcrmG2hioQqrZbOMGbi9Baa8xAob4HCUd1mfG+btjd61t
|
23
|
+
5ckfDjqZLo0or9ATYU1F5G6kEJIjHiz5YgHxglcthQRHyWCa/r+M4DnpQ5TwBhhS
|
24
|
+
ZWoB5+W7KlfN1guDZ4LjDAUEsWCKsBNydM0XzQIDAQABo3kwdzAJBgNVHRMEAjAA
|
25
|
+
MAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUTNduUZSXfk8psUbclUtWl2qPf7MwHgYD
|
26
|
+
VR0RBBcwFYETamltQHNhdHVybmZseWVyLmNvbTAeBgNVHRIEFzAVgRNqaW1Ac2F0
|
27
|
+
dXJuZmx5ZXIuY29tMA0GCSqGSIb3DQEBCwUAA4IBgQBpRBA0939h4raDJmIObTGj
|
28
|
+
T4ZgUdOs27GnQXKJOG50Z9o8sEuG3WDRPUBsck50PKmI6taNalaEVOeeLNXvbfl8
|
29
|
+
Fb17rZnhy/ssAUseVAojIPHxHvsgi1K76v5HJMzuM774ftDckjWVOBhJ85Jxyj9c
|
30
|
+
1VZes12ut2udsSa2vE6niS3mxrCeKCjmPQ7M5a55/fMr2tVX9qgPYZJmK0ck/Weh
|
31
|
+
e0fZ+W4iiGTZSrfHqNe2BabhLeKQtowVBMvBKbhL7DwdkufDaOv77uN5nsSMZfzh
|
32
|
+
ebdplnosS17xWRZxj+T/Vob93PmQFd7AsRnaNu9HjesRTbiBxKus7I0CeLPAelpD
|
33
|
+
Nq/5JAtQf+uEeL5/QXF9Mwv44ERxVbTX0DcZYjaepSgpYQtOew9EXLqQj0mLSsxG
|
34
|
+
dxkiKqcX+yzo9RJLD9l/E1AWX125r1Fhiif4l6ehdl7Vllc3NQUOm1abdmHtCYjw
|
35
|
+
dG3yPWBWzzN4ovoBRqsuTJbF1wjkCjl5ex5KhfYbeDc=
|
36
|
+
-----END CERTIFICATE-----
|
37
|
+
date: 2023-01-19 00:00:00.000000000 Z
|
38
|
+
dependencies: []
|
39
|
+
description: Add the ruby 3.2 Data class to older rubies
|
40
|
+
email:
|
41
|
+
- jim@saturnflyer.com
|
42
|
+
executables: []
|
43
|
+
extensions: []
|
44
|
+
extra_rdoc_files: []
|
45
|
+
files:
|
46
|
+
- README.md
|
47
|
+
- Rakefile
|
48
|
+
- certs/saturnflyer.pem
|
49
|
+
- lib/data.rb
|
50
|
+
- lib/polyfill-data.rb
|
51
|
+
- lib/polyfill/data/version.rb
|
52
|
+
- test/test_data.rb
|
53
|
+
- test/test_helper.rb
|
54
|
+
homepage: https://github.com/saturnflyer/polyfill-data
|
55
|
+
licenses:
|
56
|
+
- MIT
|
57
|
+
metadata:
|
58
|
+
homepage_uri: https://github.com/saturnflyer/polyfill-data
|
59
|
+
source_code_uri: https://github.com/saturnflyer/polyfill-data.git
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.6.0
|
69
|
+
- - "<"
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 3.2.0
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
requirements: []
|
78
|
+
rubygems_version: 3.2.27
|
79
|
+
signing_key:
|
80
|
+
specification_version: 4
|
81
|
+
summary: Add the ruby 3.2 Data class to older rubies
|
82
|
+
test_files:
|
83
|
+
- test/test_data.rb
|
84
|
+
- test/test_helper.rb
|
metadata.gz.sig
ADDED