lab42_data_class 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e882ef6623d30a0203797a53f31e4d3607e3d3e883adbb20ac63ee517db6c71e
4
- data.tar.gz: 3ce45a762f3b3628ea6ee19392b1a2202f3da5f55b8f4b9d341b25f4236581aa
3
+ metadata.gz: 3c062e2633e5881141e65113d2d60878733611bece697c933876ef1d9f62270e
4
+ data.tar.gz: bb5e524274338fda67063a8514cbe17a27c92ec8b62106061793456245729e30
5
5
  SHA512:
6
- metadata.gz: a50fabe74deb22f46e0bc33c062547514fba922e138a3af2bbd6faeabe69f137a98ef5925166e04367366474bcfddf59d4c4067e81f0ebfc2ef61f86312702b0
7
- data.tar.gz: 61a6d7e6d7b4fca517622d49516cda9406daab3265b076eff18a0e65fa9ad60a188b295d302b64918600deef5c68d3a2684a6344e4bc2e96ff61dff9aa89d998
6
+ metadata.gz: ddfaa83d7d62a4f3ccdb6df66cc1b3462ee626ac970b2654e138d338c3e0ba8e016882445552d8fff4ffb13636953f17757991625bc1c54b5b3883c1eed43f89
7
+ data.tar.gz: 4dae3c50dc6b01e5f311f61e4f8aaf2b712db66a4ace5172b91df242411246e71dc2b30f29cded81ab5b95c77c0858f81282e72a481aff0921d4dbeea990d2f6
data/README.md CHANGED
@@ -105,25 +105,6 @@ Then I have defined a method on my dataclass
105
105
  ```ruby
106
106
  expect(my_instance.show).to eq("<42>")
107
107
  ```
108
- ### Context: Making a dataclass from a class
109
-
110
- Given
111
- ```ruby
112
- class DC
113
- dataclass x: 1, y: 41
114
- def sum; x + y end
115
- end
116
- ```
117
-
118
- Then we can define methods on it
119
- ```ruby
120
- expect(DC.new.sum).to eq(42)
121
- ```
122
-
123
- And we have a nice name for our instances
124
- ```ruby
125
- expect(DC.new.class.name).to eq("DC")
126
- ```
127
108
 
128
109
  ### Context: Equality
129
110
 
@@ -146,12 +127,59 @@ But not in the sense of `equal?`, of course
146
127
  expect(instance2).not_to be_equal(instance1)
147
128
  ```
148
129
 
149
- #### Immutability of `dataclass` modified classes
130
+ #### Context: Immutability of `dataclass` modified classes
150
131
 
151
132
  Then we still get frozen instances
152
133
  ```ruby
153
134
  expect(instance1).to be_frozen
154
135
  ```
136
+
137
+ ### Context: Inheritance
138
+
139
+ ... is a no, we do not want inheritance although we **like** code reuse, how to do it then?
140
+
141
+ Well there shall be many different possibilities, depending on your style, use case and
142
+ context, here is just one example:
143
+
144
+ Given a class factory
145
+ ```ruby
146
+ let :token do
147
+ ->(*a, **k) do
148
+ DataClass(*a, **(k.merge(text: "")))
149
+ end
150
+ end
151
+ ```
152
+
153
+ Then we have reused the `token` successfully
154
+ ```ruby
155
+ empty = token.()
156
+ integer = token.(:value)
157
+ boolean = token.(value: false)
158
+
159
+ expect(empty.new.to_h).to eq(text: "")
160
+ expect(integer.new(value: -1).to_h).to eq(text: "", value: -1)
161
+ expect(boolean.new.value).to eq(false)
162
+ ```
163
+
164
+ #### Context: Mixing in a module can be used of course
165
+
166
+ Given a behavior like
167
+ ```ruby
168
+ module Humanize
169
+ def humanize
170
+ "my value is #{value}"
171
+ end
172
+ end
173
+
174
+ let(:class_level) { DataClass(value: 1).include(Humanize) }
175
+ ```
176
+
177
+ Then we can access the included method
178
+ ```ruby
179
+ expect(class_level.new.humanize).to eq("my value is 1")
180
+ ```
181
+
182
+
155
183
  # LICENSE
156
184
 
157
185
  Copyright 2022 Robert Dober robert.dober@gmail.com
@@ -4,7 +4,7 @@ require 'set'
4
4
  module Lab42
5
5
  module DataClass
6
6
  class Proxy
7
- attr_reader :actual_params, :block, :defaults, :klass, :has_parent, :members, :positionals
7
+ attr_reader :actual_params, :block, :defaults, :klass, :members, :positionals
8
8
 
9
9
  def check!(**params)
10
10
  @actual_params = params
@@ -31,8 +31,7 @@ module Lab42
31
31
 
32
32
  private
33
33
  def initialize(*args, **kwds, &blk)
34
- @klass = kwds.fetch(:__klass__){ Class.new }
35
- @has_parent = !!kwds.delete(:__klass__)
34
+ @klass = Class.new
36
35
 
37
36
  @block = blk
38
37
  @defaults = kwds
@@ -80,7 +79,7 @@ module Lab42
80
79
  ->(*) do
81
80
  define_method :merge do |**params|
82
81
  values = to_h.merge(params)
83
- DataClass(*proxy.positionals, __klass__: self.class, **proxy.defaults, &proxy.block)
82
+ DataClass(*proxy.positionals, **proxy.defaults, &proxy.block)
84
83
  .new(**values)
85
84
  end
86
85
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Lab42
4
4
  module DataClass
5
- VERSION = "0.2.0"
5
+ VERSION = "0.3.0"
6
6
  end
7
7
  end
8
8
  # SPDX-License-Identifier: Apache-2.0
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './data_class/for_module'
4
3
  require_relative './data_class/proxy'
5
4
 
6
5
  module Kernel
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.2.0
4
+ version: 0.3.0
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-21 00:00:00.000000000 Z
11
+ date: 2022-01-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  An Immutable DataClass for Ruby
@@ -23,7 +23,6 @@ files:
23
23
  - LICENSE
24
24
  - README.md
25
25
  - lib/lab42/data_class.rb
26
- - lib/lab42/data_class/for_module.rb
27
26
  - lib/lab42/data_class/proxy.rb
28
27
  - lib/lab42/data_class/version.rb
29
28
  homepage: https://github.com/robertdober/lab42_data_class
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'proxy'
4
-
5
- module Lab42
6
- module DataClass
7
- class ::Module
8
- def dataclass(*args, **defaults)
9
- proxy = Lab42::DataClass::Proxy.new(*args, __klass__: self, **defaults)
10
- proxy.define_class!
11
- end
12
- end
13
- end
14
- end
15
- # SPDX-License-Identifier: Apache-2.0