toolcase 0.3.0 → 1.1.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: f099f2193339ea7d0f31bb988a30b282133bc4e4b0310e63b4a7c7467ed282b2
4
- data.tar.gz: 47299ea8eca5e21633d93df94928b85dd6236c0434eb7baf094944e42930a8cc
3
+ metadata.gz: 59b70826e002497b7a94fafe6eb333de5189f8fa52ef1c4385aa84570d5e0e49
4
+ data.tar.gz: 9de36cee21aff4d68056a133feeae117e81568348e18ba34f2cc0f7b4cdcb795
5
5
  SHA512:
6
- metadata.gz: 511d82c8b0fe08718bdd95f8acb8ca5fbe5a4f91ec927d5c9fd90a95ef2997536642c422675cd599306d6d5c00cf086275bcdf08aa124bebd5dd34e4e376e49e
7
- data.tar.gz: 322680fd34075024744fc159978c18af956da80b37fbc00304eadb41c0ef7d171f5fac247e85034b00b92a1abfce8f3274090d4028fb3a4cc2cec92de325a964
6
+ metadata.gz: cf999c92c9abb3afe882b8963130bbcf106c9205ba3175c4a43709074444a2b5ae9486a7ccca2dbb4a97c966842dcfe25d109cec40f18fe7b2dfec24bad27523
7
+ data.tar.gz: f6825afe59b5ed39aae2d16f02a8d7fb4690bf66ec64884e496e6b9a0c1bac56a670e85f85a5f62b7f6e037ca5f846f8242ca59259d31e7cd3270c76d4f496bc
@@ -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,87 +25,80 @@ 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)
68
+ end
69
+
70
+ def tags
71
+ container.values.flat_map { |_, tags| tags.to_a }.uniq
72
+ end
73
+
74
+ def identifiers(tag = nil)
75
+ entries_by_tag(tag).keys
74
76
  end
75
77
 
76
78
  protected
77
79
 
78
80
  EMPTY = [].freeze
79
81
 
80
- def elements
81
- @elements ||= []
82
+ def container
83
+ @container ||= {}
82
84
  end
83
85
 
84
- def resolve_object_or_id(obj_or_id)
85
- id = identifiers.key?(obj_or_id) ? obj_or_id : identifiers.find { |_, value| value == obj_or_id }&.first
86
- element = id.nil? ? obj_or_id : identifiers[id]
87
- return unless include?(element)
88
-
89
- yield(id, element)
86
+ def subset(tag)
87
+ entries_by_tag(tag).values.map(&:first)
90
88
  end
91
89
 
92
- def tagged_elements
93
- @tagged_elements ||= Hash.new { |hash, key| hash[key] = [] }
90
+ def entries_by_tag(tag)
91
+ container.select { |_, (_, tags)| tag.nil? || tags.include?(tag) }
94
92
  end
95
93
 
96
- def find_in_tagged(element)
97
- tagged_elements.find { |_, list| list.include?(element) }&.last
98
- end
94
+ def object_or_id(obj_or_id)
95
+ id = container.key?(obj_or_id) ? obj_or_id : container.find { |_, (value, _)| value == obj_or_id }&.first
99
96
 
100
- def identifiers
101
- @identifiers ||= {}
97
+ yield(id) unless id.nil?
102
98
  end
103
99
 
104
- def container(tag)
105
- return elements if tag.nil?
106
-
107
- tagged_elements.key?(tag) ? tagged_elements[tag] : EMPTY
100
+ def default_id
101
+ SecureRandom.uuid
108
102
  end
109
103
  end
110
104
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Toolcase
4
- VERSION = "0.3.0"
4
+ VERSION = "1.1.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.3.0
4
+ version: 1.1.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-12 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