toolcase 0.4.0 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c95b47f26273821d56bed57d92d27a73feebc80774dcc9b32c3f3d34f4b636f6
4
- data.tar.gz: 64e59a350c95aa60ab8ba59486563a586494ae8df12a983a021514e1a03167fa
3
+ metadata.gz: 38fd1d4c41d5004980f75591681b837525521f2e568c33eae57053aa8905706d
4
+ data.tar.gz: 5d429619ea3dc02504c7b3cfbd2c43937fa8102c053a077dd18b8ce411832d80
5
5
  SHA512:
6
- metadata.gz: c2f3f9ef874e3eb43c81a1dbc0ebd67c3f3b2c757b58e0a498b8cd45aecbb530d039c09a0ef67cf18d5fbeb7958cc8e2d6853b389660c0f3f803ebec18818fb8
7
- data.tar.gz: 6787e2f3616321b212ba9f49aadc3280609a06cf0bb464b360ca36af23d470d0f02c367d4ca1b3f26bd45b720044ec07c1d43866bf411c27148a1a780bd50777
6
+ metadata.gz: fbe251672369dd5f4c3f1b4d71442df24eaeb1346f438ec4ed614e71c3f82664bdc1214d8f006e74689c8359c9da59f387a6d3afeec5277d9592b2fce22ccace
7
+ data.tar.gz: fc748d1c3bf72798dbeb573518a07031f1627c547436facf49ea1ecae44899914a9c7801e0fcef67dd3e4317379b2a649c8329240d6f7f52772b12e2b94b1278
@@ -1,21 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'set'
4
+ require 'securerandom'
5
+
3
6
  module Toolcase
4
7
  # Registry mixin. Allows to convert a class into a registrable container.
5
8
  # It can then be used to register strategies/handlers and use the class as an abstract factory.
6
9
  module Registry
7
- def register(object = nil, id: nil, tag: :nil, &block)
10
+ def register(object = nil, id: default_id, tags: EMPTY, &block)
11
+ return if container.key?(id)
12
+
8
13
  element = nil
9
14
  element = object unless object.nil?
10
15
  element = block if block_given?
11
16
 
12
- return if element.nil? || include?(element)
13
-
14
- elements << element
15
- tagged_elements[tag] << element
16
- identifiers[id] = element unless id.nil?
17
+ tags = tags.is_a?(Array) ? tags : [tags]
17
18
 
18
- element
19
+ container[id] = [element, Set.new(tags)]
19
20
  end
20
21
 
21
22
  def default(object = nil)
@@ -24,91 +25,74 @@ module Toolcase
24
25
  end
25
26
 
26
27
  def [](id)
27
- identifiers.fetch(id, default)
28
+ container.key?(id) ? container[id].first : default
28
29
  end
29
30
 
30
31
  def find_by(tag = nil, &block)
31
- container(tag).find(-> { default }, &block)
32
+ subset(tag).find(-> { default }, &block)
32
33
  end
33
34
 
34
35
  def include?(object, tag = nil)
35
- container(tag).include?(object)
36
+ subset(tag).include?(object)
36
37
  end
37
38
 
38
39
  def size(tag = nil)
39
- container(tag).size
40
+ subset(tag).size
40
41
  end
41
42
 
42
- def replace(old_object_or_id, new_object)
43
- resolve_object_or_id(old_object_or_id) do |id, element|
44
- identifiers[id] = new_object unless id.nil?
45
- elements[elements.index(element)] = new_object
46
-
47
- tagged_list = find_in_tagged(element)
48
- tagged_list[tagged_list.index(element)] = new_object unless tagged_list.nil?
43
+ def replace(old, new_object)
44
+ object_or_id(old) do |id|
45
+ old_tuple = container[id]
46
+ container[id] = [new_object, old_tuple.last]
49
47
  end
50
48
  end
51
49
 
52
- def remove(object_or_id)
53
- resolve_object_or_id(object_or_id) do |id, element|
54
- identifiers.delete(id)
55
- elements.delete(element)
56
- find_in_tagged(element)&.delete(element)
50
+ def remove(value_or_id)
51
+ object_or_id(value_or_id) do |id|
52
+ container.delete(id)
57
53
  end
58
54
  end
59
55
 
60
56
  def clear(tag = nil)
61
- registries(tag).each { |object| remove(object) }
57
+ subset(tag).each { |object| remove(object) }
62
58
  end
63
59
 
64
60
  def inherited(child)
65
61
  super
66
- child.elements.concat(registries)
67
- child.tagged_elements.merge!(tagged_elements)
68
- child.identifiers.merge!(identifiers)
62
+ child.container.merge!(container)
69
63
  child.default(default)
70
64
  end
71
65
 
72
66
  def registries(tag = nil)
73
- container(tag).clone.freeze
67
+ subset(tag)
74
68
  end
75
69
 
76
70
  def tags
77
- tagged_elements.keys.reject { |key| key == :nil }
71
+ container.values.flat_map { |_, tags| tags.to_a }.uniq
78
72
  end
79
73
 
80
74
  protected
81
75
 
82
76
  EMPTY = [].freeze
83
77
 
84
- def elements
85
- @elements ||= []
78
+ def container
79
+ @container ||= {}
86
80
  end
87
81
 
88
- def resolve_object_or_id(obj_or_id)
89
- id = identifiers.key?(obj_or_id) ? obj_or_id : identifiers.find { |_, value| value == obj_or_id }&.first
90
- element = id.nil? ? obj_or_id : identifiers[id]
91
- return unless include?(element)
92
-
93
- yield(id, element)
82
+ def subset(tag)
83
+ container.values.select do |_, tags|
84
+ tag.nil? || tags.include?(tag)
85
+ end.map(&:first)
94
86
  end
95
87
 
96
- def tagged_elements
97
- @tagged_elements ||= Hash.new { |hash, key| hash[key] = [] }
98
- end
99
-
100
- def find_in_tagged(element)
101
- tagged_elements.find { |_, list| list.include?(element) }&.last
102
- end
88
+ def object_or_id(obj_or_id)
89
+ id = container.key?(obj_or_id) ? obj_or_id : container.find { |_, (value, _)| value == obj_or_id }&.first
103
90
 
104
- def identifiers
105
- @identifiers ||= {}
91
+ yield(id) unless id.nil?
106
92
  end
107
93
 
108
- def container(tag)
109
- return elements if tag.nil?
110
-
111
- tagged_elements.key?(tag) ? tagged_elements[tag] : EMPTY
94
+ def default_id
95
+ SecureRandom.uuid
112
96
  end
113
97
  end
114
98
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Toolcase
4
- VERSION = "0.4.0"
4
+ VERSION = "1.0.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toolcase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - enchf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-26 00:00:00.000000000 Z
11
+ date: 2022-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug