lab42_data_class 0.1.2 → 0.2.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 +4 -4
- data/README.md +23 -2
- data/lib/lab42/data_class/proxy.rb +9 -0
- data/lib/lab42/data_class/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e882ef6623d30a0203797a53f31e4d3607e3d3e883adbb20ac63ee517db6c71e
|
4
|
+
data.tar.gz: 3ce45a762f3b3628ea6ee19392b1a2202f3da5f55b8f4b9d341b25f4236581aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a50fabe74deb22f46e0bc33c062547514fba922e138a3af2bbd6faeabe69f137a98ef5925166e04367366474bcfddf59d4c4067e81f0ebfc2ef61f86312702b0
|
7
|
+
data.tar.gz: 61a6d7e6d7b4fca517622d49516cda9406daab3265b076eff18a0e65fa9ad60a188b295d302b64918600deef5c68d3a2684a6344e4bc2e96ff61dff9aa89d998
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
# Lab42::DataClass
|
8
8
|
|
9
|
-
|
9
|
+
An immutable dataclass
|
10
10
|
|
11
11
|
## Usage
|
12
12
|
|
@@ -60,7 +60,18 @@ And we can extract the values
|
|
60
60
|
expect(my_instance.to_h).to eq(name: "robert", email: nil)
|
61
61
|
```
|
62
62
|
|
63
|
-
#### Context: Immutable
|
63
|
+
#### Context: Immutable → self
|
64
|
+
|
65
|
+
Then `my_instance` is frozen:
|
66
|
+
```ruby
|
67
|
+
expect(my_instance).to be_frozen
|
68
|
+
```
|
69
|
+
And we cannot even mute `my_instance` by means of metaprogramming
|
70
|
+
```ruby
|
71
|
+
expect{ my_instance.instance_variable_set("@x", nil) }.to raise_error(FrozenError)
|
72
|
+
```
|
73
|
+
|
74
|
+
#### Context: Immutable → Cloning
|
64
75
|
|
65
76
|
Given
|
66
77
|
```ruby
|
@@ -71,6 +82,10 @@ Then we have a new instance with the old instance unchanged
|
|
71
82
|
expect(other_instance.to_h).to eq(name: "robert", email: "robert@mail.provider")
|
72
83
|
expect(my_instance.to_h).to eq(name: "robert", email: nil)
|
73
84
|
```
|
85
|
+
And the new instance is frozen again
|
86
|
+
```ruby
|
87
|
+
expect(other_instance).to be_frozen
|
88
|
+
```
|
74
89
|
|
75
90
|
### Context: Defining behavior with blocks
|
76
91
|
|
@@ -131,6 +146,12 @@ But not in the sense of `equal?`, of course
|
|
131
146
|
expect(instance2).not_to be_equal(instance1)
|
132
147
|
```
|
133
148
|
|
149
|
+
#### Immutability of `dataclass` modified classes
|
150
|
+
|
151
|
+
Then we still get frozen instances
|
152
|
+
```ruby
|
153
|
+
expect(instance1).to be_frozen
|
154
|
+
```
|
134
155
|
# LICENSE
|
135
156
|
|
136
157
|
Copyright 2022 Robert Dober robert.dober@gmail.com
|
@@ -57,6 +57,14 @@ module Lab42
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
def _define_freezing_constructor
|
61
|
+
->(*) do
|
62
|
+
define_method :new do |*a, **p, &b|
|
63
|
+
super(*a, **p, &b).freeze
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
60
68
|
def _define_initializer
|
61
69
|
proxy = self
|
62
70
|
->(*) do
|
@@ -79,6 +87,7 @@ module Lab42
|
|
79
87
|
end
|
80
88
|
|
81
89
|
def _define_methods
|
90
|
+
(class << klass; self end).module_eval(&_define_freezing_constructor)
|
82
91
|
klass.module_eval(&_define_to_h)
|
83
92
|
klass.module_eval(&_define_merge)
|
84
93
|
klass.module_eval(&_define_eql?)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lab42_data_class
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Dober
|
@@ -10,7 +10,11 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2022-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description:
|
13
|
+
description: |
|
14
|
+
An Immutable DataClass for Ruby
|
15
|
+
|
16
|
+
Exposes a class factory function `Kernel::DataClass` and a class
|
17
|
+
modifer `Module#dataclass'
|
14
18
|
email: robert.dober@gmail.com
|
15
19
|
executables: []
|
16
20
|
extensions: []
|