lab42_data_class 0.8.3 → 0.8.4

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: d5eeca60436c025c569f2b33678f4a52da196c909d8292de9fe1e1226aac9567
4
- data.tar.gz: cd593944b7fb98dc0150ec2876a70c25f4afc23bb0afe0dffc1af437e81f1fdc
3
+ metadata.gz: 447747114cf7e2577b5a36da76f39dbc7ffe7e2935bb573d697878a1e4fc77bb
4
+ data.tar.gz: 5413ab67f94a9a1fb231043c9f6cc3229e8a57c89dab94572d546f1b97476550
5
5
  SHA512:
6
- metadata.gz: 99a0f3bb88fc1f6cdcd67292da3822cb62f911d8e8970cf481db8389d1ec5751e556356c66616f68989842748a84069c913db8420a4bc97521188016036b5947
7
- data.tar.gz: 1ccda21d84aea6275132aa86f50cc8ed98415dc79f806f4abe5736b73ab6e6604d861120644072e089ba8810243018e2c9de61a594e2b0fbeed6cb302c7a8afb
6
+ metadata.gz: c96c9b135d4be1c05ef413e8623982e6f7896b73c85cb538945fc5af4b4f1686deea02800d6c8a6f9325d212b71dbe8c07f35c1b3e6613308ae71aa9d38df373
7
+ data.tar.gz: 5d17992111e0925a44b691aa71bf4cb4cc8a35a2a2f73c4f01e3034a0ca3d91a850bde0ee15dc340342d618cbef8c3f26872ae46ddd6b9551013c591c6a782de
@@ -5,22 +5,27 @@ module Lab42
5
5
  module Constraints
6
6
  module AttributeSetters
7
7
  module AttributeSetter
8
- attr_reader :attribute, :constraint, :instance
8
+ attr_reader :attribute, :constraint, :instance, :return_setter
9
9
 
10
10
  private
11
11
 
12
- def initialize(attribute:, constraint:, instance:)
12
+ def initialize(attribute:, constraint:, instance:, return_setter: false)
13
13
  @attribute = attribute
14
14
  @constraint = constraint
15
15
  @instance = instance
16
+ @return_setter = return_setter
16
17
  end
17
18
 
18
19
  def _set_attr!(value)
19
20
  new_values = instance.to_h.merge(attribute => value)
20
- instance.class.send(:_new_from_merge, {}, new_values)
21
+ instance.class.send(:_new_from_merge, {}, new_values).tap do |new_instance|
22
+ return return_setter ? new_instance.set(attribute, return_setter: true) : new_instance
23
+ end
21
24
  end
22
25
 
23
- def _value = @___value__ ||= instance[attribute]
26
+ def _value
27
+ @___value__ ||= instance[attribute]
28
+ end
24
29
  end
25
30
  end
26
31
  end
@@ -18,6 +18,12 @@ module Lab42
18
18
  def cdr
19
19
  _set_attr!(_value.cdr)
20
20
  end
21
+
22
+ def set_car(value)
23
+ constraint.constraint.(value) or raise ConstraintError,
24
+ "cannot set value #{value} in set(#{attribute}).cons"
25
+ _set_attr!(_value.cdr.cons(value))
26
+ end
21
27
  end
22
28
  end
23
29
  end
@@ -8,13 +8,15 @@ module Lab42
8
8
 
9
9
  def setter_constraint? = true
10
10
 
11
- def setter_for(attribute:, instance:)
11
+ def setter_for(attribute:, instance:, return_setter: false)
12
12
  attribute_setter.new(
13
13
  attribute:,
14
14
  constraint: self,
15
- instance:
15
+ instance:,
16
+ return_setter:
16
17
  )
17
18
  end
19
+
18
20
  private
19
21
 
20
22
  def initialize(constraint:, **other)
@@ -110,6 +110,14 @@ module Lab42
110
110
  end
111
111
  end
112
112
 
113
+ def _define_instance_methods
114
+ klass.module_eval(&_define_access)
115
+ klass.module_eval(&_define_to_h)
116
+ klass.module_eval(&_define_merge)
117
+ klass.module_eval(&_define_set)
118
+ klass.module_eval(&_define_with_attribute)
119
+ end
120
+
113
121
  def _define_freezing_constructor
114
122
  proxy = self
115
123
  ->(*) do
@@ -157,10 +165,7 @@ module Lab42
157
165
 
158
166
  def _define_methods
159
167
  _define_singleton_methods(klass.singleton_class)
160
- klass.module_eval(&_define_access)
161
- klass.module_eval(&_define_to_h)
162
- klass.module_eval(&_define_merge)
163
- klass.module_eval(&_define_set)
168
+ _define_instance_methods
164
169
  end
165
170
 
166
171
  def _define_singleton_methods(singleton)
@@ -202,11 +207,23 @@ module Lab42
202
207
  def _define_set
203
208
  proxy = self
204
209
  ->(*) do
205
- define_method :set do |attribute|
210
+ define_method :set do |attribute, return_setter: false|
211
+ setter_constraint = proxy.setter_attributes.fetch(attribute) do
212
+ raise UndefinedSetterError, "There is no constraint implementing a setter for attribute #{attribute}"
213
+ end
214
+ setter_constraint.setter_for(attribute:, instance: self, return_setter:)
215
+ end
216
+ end
217
+ end
218
+
219
+ def _define_with_attribute
220
+ proxy = self
221
+ ->(*) do
222
+ define_method :with_attribute do |attribute, &blk|
206
223
  setter_constraint = proxy.setter_attributes.fetch(attribute) do
207
224
  raise UndefinedSetterError, "There is no constraint implementing a setter for attribute #{attribute}"
208
225
  end
209
- setter_constraint.setter_for(attribute:, instance: self)
226
+ blk.(setter_constraint.setter_for(attribute:, instance: self, return_setter: true)).instance
210
227
  end
211
228
  end
212
229
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Lab42
4
4
  module DataClass
5
- VERSION = "0.8.3"
5
+ VERSION = "0.8.4"
6
6
  end
7
7
  end
8
8
  # SPDX-License-Identifier: Apache-2.0
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.8.3
4
+ version: 0.8.4
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-03-08 00:00:00.000000000 Z
11
+ date: 2022-03-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  An Immutable DataClass for Ruby