toolcase 0.4.0 → 1.0.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: 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