lab42_data_class 0.3.0 → 0.3.1
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/README.md +31 -0
- data/lib/lab42/data_class/proxy/mixin.rb +19 -0
- data/lib/lab42/data_class/proxy.rb +3 -11
- data/lib/lab42/data_class/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e4127a34f013386209c71666f9d77e1b5c8fd439324443580e00c7e9018fdb4
|
4
|
+
data.tar.gz: c61d6f1648c9c73cd89883a0c0e6ebd6ea813f51dcdb26f141a99a962e4db5fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74b643eb6d43c00aedede31195354412a0b7dcabc5f5da0d1c3f5dbfca4dc03abc1b13a68e10307813153b6e8fe0c502a075a9c4ef17c61f1163ec251e03b3f7
|
7
|
+
data.tar.gz: '007384216191284048c0fcec62adedb04c8f41a549b92d7cdefcbaa3fa2f4536cce737d4a21a6c8d3648fe62a539fd9f201cd036566b9ff3251ac2929856a6a7'
|
data/README.md
CHANGED
@@ -179,6 +179,37 @@ Then we can access the included method
|
|
179
179
|
expect(class_level.new.humanize).to eq("my value is 1")
|
180
180
|
```
|
181
181
|
|
182
|
+
### Context: Pattern Matching
|
183
|
+
|
184
|
+
An `DataClass` object behaves like the result of it's `to_h` in pattern matching
|
185
|
+
|
186
|
+
Given
|
187
|
+
```ruby
|
188
|
+
let(:numbers) { DataClass(:name, values: []) }
|
189
|
+
let(:odds) { numbers.new(name: "odds", values: (1..4).map{ _1 + _1 + 1}) }
|
190
|
+
let(:evens) { numbers.new(name: "evens", values: (1..4).map{ _1 + _1}) }
|
191
|
+
```
|
192
|
+
|
193
|
+
Then we can match accordingly
|
194
|
+
```ruby
|
195
|
+
match = case odds
|
196
|
+
in {name: "odds", values: [1, *]}
|
197
|
+
:not_really
|
198
|
+
in {name: "evens"}
|
199
|
+
:still_naaah
|
200
|
+
in {name: "odds", values: [hd, *]}
|
201
|
+
hd
|
202
|
+
else
|
203
|
+
:strange
|
204
|
+
end
|
205
|
+
expect(match).to eq(3)
|
206
|
+
```
|
207
|
+
|
208
|
+
And in `in` expressions
|
209
|
+
```ruby
|
210
|
+
evens => {values: [_, second, *]}
|
211
|
+
expect(second).to eq(4)
|
212
|
+
```
|
182
213
|
|
183
214
|
# LICENSE
|
184
215
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Lab42
|
4
|
+
module DataClass
|
5
|
+
class Proxy
|
6
|
+
module Mixin
|
7
|
+
def ==(other)
|
8
|
+
other.is_a?(self.class) &&
|
9
|
+
to_h == other.to_h
|
10
|
+
end
|
11
|
+
|
12
|
+
def deconstruct_keys(*)
|
13
|
+
to_h
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
# SPDX-License-Identifier: Apache-2.0
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'set'
|
4
|
+
require_relative 'proxy/mixin'
|
4
5
|
module Lab42
|
5
6
|
module DataClass
|
6
7
|
class Proxy
|
@@ -16,6 +17,8 @@ module Lab42
|
|
16
17
|
klass.module_eval(&_define_attr_reader)
|
17
18
|
klass.module_eval(&_define_initializer)
|
18
19
|
_define_methods
|
20
|
+
klass.include(Mixin)
|
21
|
+
klass.module_eval(&block) if block
|
19
22
|
klass
|
20
23
|
end
|
21
24
|
|
@@ -47,15 +50,6 @@ module Lab42
|
|
47
50
|
end
|
48
51
|
end
|
49
52
|
|
50
|
-
def _define_eql?
|
51
|
-
->(*) do
|
52
|
-
define_method :== do |other|
|
53
|
-
other.is_a?(self.class) &&
|
54
|
-
to_h == other.to_h
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
53
|
def _define_freezing_constructor
|
60
54
|
->(*) do
|
61
55
|
define_method :new do |*a, **p, &b|
|
@@ -89,8 +83,6 @@ module Lab42
|
|
89
83
|
(class << klass; self end).module_eval(&_define_freezing_constructor)
|
90
84
|
klass.module_eval(&_define_to_h)
|
91
85
|
klass.module_eval(&_define_merge)
|
92
|
-
klass.module_eval(&_define_eql?)
|
93
|
-
klass.module_eval(&block) if block
|
94
86
|
end
|
95
87
|
|
96
88
|
def _define_to_h
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lab42_data_class
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Dober
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-01-
|
11
|
+
date: 2022-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
An Immutable DataClass for Ruby
|
@@ -24,6 +24,7 @@ files:
|
|
24
24
|
- README.md
|
25
25
|
- lib/lab42/data_class.rb
|
26
26
|
- lib/lab42/data_class/proxy.rb
|
27
|
+
- lib/lab42/data_class/proxy/mixin.rb
|
27
28
|
- lib/lab42/data_class/version.rb
|
28
29
|
homepage: https://github.com/robertdober/lab42_data_class
|
29
30
|
licenses:
|