l43_open_object 0.2.0 → 0.2.2

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: 9976c1247191d0a07f77df9ba0b986cd57412458c1167a7a8751f82c03fce094
4
- data.tar.gz: d65d9275e3cdd6b756d913918310487764bb60cb8a43617183fbf7f020b3857c
3
+ metadata.gz: b3fd83f7a3355c0740be183a64fb5dc69b57829ac953f08258aeb83b1d9fcdad
4
+ data.tar.gz: 2c93657c412878854ebc9e371e6a57a66d2ce0594a6cfe07a52fdda8d6ecb43e
5
5
  SHA512:
6
- metadata.gz: b280373d581088fc015c9d460dd806a5bfb0c3049cf274582453bccb53951523b95320bdef551e273ff00e5a04f50f0e47a964585438a7a29cd17c52cc94f9b1
7
- data.tar.gz: 5aee83609062b79c9fa3947c1126c22a45351ba816dba24af83ba6779a9e77487d670feec520d01ec91a3a5a9ba2d29ecc8222369c83298368ed34af34d797a2
6
+ metadata.gz: 33fb3f9a98acf4cd0ed278ce46d16fcb92bb01d581ab161c271999bee012bec0a3c6716adc9e921ac4cbc9e7619ffc6db67d465f6df65b87c28d7ce523fdd3be
7
+ data.tar.gz: 150a6bf8b7db2c5d18e9306ba6b08636bc5e699a22e0204389ecf9b2084f58554c607a16082215a549b88e1f483194e59d40979337f4d1cb355e601a442fac23
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L43
4
+ module OpenObject
5
+ module Behavior
6
+
7
+ def ==(other)
8
+ return false unless self.class === other
9
+ other.to_h == to_h
10
+ end
11
+
12
+ def update(**kwds)
13
+ if frozen?
14
+ new_values = to_h.merge(**kwds)
15
+ self.class.new(**new_values)
16
+ else
17
+ kwds.each do |k, v|
18
+ instance_variable_set("@#{k}", v)
19
+ end
20
+ self
21
+ end
22
+ end
23
+
24
+ def update_attribute(attribute, &blk)
25
+ raise ArgumentError, "cannot update attribute #{attribute.inspect} without a block" unless blk
26
+ update(attribute => blk.(to_h[attribute]))
27
+ end
28
+ end
29
+ end
30
+ end
31
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L43
4
+ module OpenObject
5
+ module Initializer extend self
6
+
7
+ def define_initialize(klass, atts, defaults, blk)
8
+ klass.define_method :initialize do |**kwds|
9
+ missing = atts - kwds.keys
10
+ raise ArgumentError, "missing required keyword parameters: #{missing.inspect}" unless missing.empty?
11
+ spurious = kwds.keys - atts - defaults.keys
12
+ raise ArgumentError, "spurious keyword parameters: #{spurious.inspect}" unless spurious.empty?
13
+
14
+ values = defaults.merge(kwds)
15
+ values.each do |key, value|
16
+ instance_variable_set("@#{key}", value)
17
+ end
18
+ if respond_to?(:_init)
19
+ _init
20
+ end
21
+ do_we_freeze = instance_exec(&blk) if blk
22
+ if do_we_freeze == :stay_warm
23
+ Initializer.define_dynamic_to_h(klass, values.keys)
24
+ else
25
+ Initializer.define_to_h(klass, values.keys)
26
+ to_h
27
+ freeze
28
+ end
29
+ end
30
+ end
31
+
32
+ def define_dynamic_to_h(klass, keys)
33
+ klass.define_method :to_h do |*|
34
+ keys.inject({}) do |r, k|
35
+ r.update(k => instance_variable_get("@#{k}"))
36
+ end
37
+ end
38
+ klass.alias_method :deconstruct_keys, :to_h
39
+ end
40
+
41
+ def define_to_h(klass, keys)
42
+ klass.define_method :to_h do |*|
43
+ @__to_h__ ||= keys.inject({}) do |r, k|
44
+ r.update(k => instance_variable_get("@#{k}"))
45
+ end
46
+ end
47
+ klass.alias_method :deconstruct_keys, :to_h
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -1,46 +1,34 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'open_object/initializer'
4
+ require_relative 'open_object/behavior'
3
5
  module L43
4
6
  module OpenObject
5
- VERSION = "0.2.0"
7
+ VERSION = "0.2.2"
6
8
 
7
- def attributes(*atts, **defaults)
9
+ def attributes(*atts, **defaults, &blk)
8
10
  attr_reader(*atts)
9
11
  attr_reader(*defaults.keys)
10
12
 
11
- define_method :== do |other|
12
- return false unless self.class === other
13
- other.to_h == to_h
14
- end
13
+ Initializer.define_initialize(self, atts, defaults, blk)
14
+ include Behavior
15
15
 
16
- define_method :initialize do |**kwds|
17
- missing = atts - kwds.keys
18
- raise ArgumentError, "missing required keyword parameters: #{missing.inspect}" unless missing.empty?
19
- spurious = kwds.keys - atts - defaults.keys
20
- raise ArgumentError, "spurious keyword parameters: #{spurious.inspect}" unless spurious.empty?
16
+ # define_method :update do |**kwds|
17
+ # if frozen?
18
+ # new_values = to_h.merge(**kwds)
19
+ # self.class.new(**new_values)
20
+ # else
21
+ # kwds.each do |k, v|
22
+ # instance_variable_set("@#{k}", v)
23
+ # end
24
+ # self
25
+ # end
26
+ # end
21
27
 
22
- values = defaults.merge(kwds)
23
- values.each do |key, value|
24
- instance_variable_set("@#{key}", value)
25
- end
26
- _init if respond_to?(:_init)
27
- freeze
28
- end
29
-
30
- define_method :to_h do |*|
31
- first = atts.inject Hash.new do |h, attribute|
32
- h.update(attribute => send(attribute))
33
- end
34
- defaults.keys.inject first do |h, attribute|
35
- h.update(attribute => send(attribute))
36
- end
37
- end
38
- alias_method :deconstruct_keys, :to_h
39
-
40
- define_method :update do |**kwds|
41
- new_values = to_h.merge(**kwds)
42
- self.class.new(**new_values)
43
- end
28
+ # define_method :update_attribute do |attribute, &blk|
29
+ # raise ArgumentError, "cannot update attribute #{attribute.inspect} without a block" unless blk
30
+ # update(attribute => blk.(to_h[attribute]))
31
+ # end
44
32
  end
45
33
  end
46
34
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: l43_open_object
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Dober
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-04-25 00:00:00.000000000 Z
10
+ date: 2026-03-07 00:00:00.000000000 Z
12
11
  dependencies: []
13
12
  description: |-
14
13
  When using the class method `attributes` in a class you get:
@@ -25,11 +24,12 @@ files:
25
24
  - LICENSE
26
25
  - lib/l43.rb
27
26
  - lib/l43/open_object.rb
27
+ - lib/l43/open_object/behavior.rb
28
+ - lib/l43/open_object/initializer.rb
28
29
  homepage: https://codeberg.org/lab419/l43_open_object
29
30
  licenses:
30
31
  - AGPL-3.0-or-later
31
32
  metadata: {}
32
- post_install_message:
33
33
  rdoc_options: []
34
34
  require_paths:
35
35
  - lib
@@ -44,8 +44,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
46
  requirements: []
47
- rubygems_version: 3.5.8
48
- signing_key:
47
+ rubygems_version: 4.0.3
49
48
  specification_version: 4
50
49
  summary: Define attributes with potential defaults, get all the goodies...
51
50
  test_files: []