toolcase 0.3.0 → 1.1.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: 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