lab42_data_class 0.8.1 → 0.8.4

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: 6534869faa807d9d3f774d0fd1deef2d12d23475f06ab07208a46f7ef998056b
4
- data.tar.gz: f099a45edac8b2daf5d0637e7345ba3301c1ac379f2d0f4319b34172f847e431
3
+ metadata.gz: 447747114cf7e2577b5a36da76f39dbc7ffe7e2935bb573d697878a1e4fc77bb
4
+ data.tar.gz: 5413ab67f94a9a1fb231043c9f6cc3229e8a57c89dab94572d546f1b97476550
5
5
  SHA512:
6
- metadata.gz: 005cd3a1d4a52bfabaa371fb36769bce9530ed061d331f0009d39342a5af70c9126373eda6164471c0a58a14e27039261568439d40742b35b18e426b1fa61733
7
- data.tar.gz: ed3c5a31cc163448ba912e76284946c0f4ed47bd7b2ee3841e7e5918ad350f5763656da819bea96826da614285de7b981092ae4ee924dce574e638dd684919af
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
@@ -7,8 +7,12 @@ module Lab42
7
7
  class Constraint
8
8
  attr_reader :name, :function
9
9
 
10
- def call(value) = function.(value)
10
+ def call(value)
11
+ function.(value)
12
+ end
13
+
11
14
  def setter_constraint? = false
15
+ def to_proc = function
12
16
  def to_s = "Constraint<#{name}>"
13
17
 
14
18
  private
@@ -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)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "lab42/data_class/constraints/constraint"
3
+ require_relative "../../constraints/constraint"
4
4
  module Lab42
5
5
  module DataClass
6
6
  class Proxy
@@ -5,9 +5,9 @@ module Lab42
5
5
  module DataClass
6
6
  class Proxy
7
7
  module Constraints
8
- def check_constraints_against_defaults(constraints)
8
+ def check_constraints_against_defaults
9
9
  errors = constraints
10
- .map(&_check_constraint_against_default)
10
+ .flat_map(&_check_constraint_against_default)
11
11
  .compact
12
12
  raise ConstraintError, errors.join("\n\n") unless errors.empty?
13
13
  end
@@ -19,7 +19,7 @@ module Lab42
19
19
  "constraints cannot be defined for undefined attributes #{errors.inspect}"
20
20
  end
21
21
 
22
- check_constraints_against_defaults(constraints)
22
+ check_constraints_against_defaults
23
23
  end
24
24
 
25
25
  private
@@ -32,9 +32,11 @@ module Lab42
32
32
  end
33
33
  end
34
34
 
35
- def _check_constraint_against_default_value(attr, value, constraint)
36
- unless Maker.make_constraint(constraint).(value)
37
- "default value #{value.inspect} is not allowed for attribute #{attr.inspect}"
35
+ def _check_constraint_against_default_value(attr, value, constraints)
36
+ constraints.map do |constraint|
37
+ unless constraint.(value)
38
+ "default value #{value.inspect} is not allowed for attribute #{attr.inspect}"
39
+ end
38
40
  end
39
41
  rescue StandardError => e
40
42
  "constraint error during validation of default value of attribute #{attr.inspect}\n #{e.message}"
@@ -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.1"
5
+ VERSION = "0.8.4"
6
6
  end
7
7
  end
8
8
  # SPDX-License-Identifier: Apache-2.0
data/lib/lab42/list.rb CHANGED
@@ -7,27 +7,44 @@ module Lab42
7
7
  include Enumerable
8
8
  attr_reader :car, :cdr, :length
9
9
 
10
- def ==(other) =
10
+ def ==(other)
11
11
  self.class.list?(other) &&
12
12
  length == other.length &&
13
13
  car == other.car &&
14
14
  cdr == other.cdr
15
+ end
15
16
 
16
- def cadr = cdr.car
17
+ def cadr
18
+ cdr.car
19
+ end
17
20
 
18
- def caddr = cdr.cdr.car
21
+ def caddr
22
+ cdr.cdr.car
23
+ end
19
24
 
20
- def cddr = cdr.cdr
25
+ def cddr
26
+ cdr.cdr
27
+ end
21
28
 
22
- def cdddr = cdr.cdr.cdr
29
+ def cdddr
30
+ cdr.cdr.cdr
31
+ end
23
32
 
24
- def cons(new_head) = self.class.cons(new_head, self)
33
+ def cons(new_head)
34
+ self.class.cons(new_head, self)
35
+ end
25
36
 
26
- def deconstruct = [car, cdr]
37
+ def deconstruct
38
+ [car, cdr]
39
+ end
27
40
 
28
- def each(&blk) = self.class.each(self, &blk)
41
+ def each(&blk)
42
+ self.class.each(self, &blk)
43
+ end
29
44
 
30
- def empty? = false
45
+ def empty?
46
+ false
47
+ end
31
48
  end
32
49
  end
33
50
  # SPDX-License-Identifier: Apache-2.0
data/lib/lab42/nil.rb CHANGED
@@ -4,10 +4,25 @@ module Lab42
4
4
  module Nil
5
5
  extend self, Enumerable
6
6
 
7
- def deconstruct = []
8
- def each = self
9
- def empty? = true
10
- def length = 0
7
+ def deconstruct
8
+ []
9
+ end
10
+
11
+ def each
12
+ self
13
+ end
14
+
15
+ def empty?
16
+ true
17
+ end
18
+
19
+ def length
20
+ 0
21
+ end
22
+
23
+ def cons(new_head)
24
+ List.cons(new_head, self)
25
+ end
11
26
  end
12
27
  end
13
28
  # 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.1
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