toolcase 0.2.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: 42ab4cde5229fee97fb5723d029c109caa0f20932fa4b9e6dbc17e7a1aec22ed
4
- data.tar.gz: 5bb7a33c4b6c9ec54c5d456d705f78a4ec1b642bba831428daa78b32357733a5
3
+ metadata.gz: 38fd1d4c41d5004980f75591681b837525521f2e568c33eae57053aa8905706d
4
+ data.tar.gz: 5d429619ea3dc02504c7b3cfbd2c43937fa8102c053a077dd18b8ce411832d80
5
5
  SHA512:
6
- metadata.gz: 229e6fc407eae590b1403245be100df24839c66614e3dfcbaccb9fc43365eb35286e0e494d7f453e25e5ffec0bc29146474caf01a1c60cd1c67a2956d513cb27
7
- data.tar.gz: 4668874433002a46ed9b173b1d3e8735500d0c64513b8ed42d1c3a19147fc3b8fcdddeb3a62b9d00f296244d2cc81c513b366c6cc79680cac770d38a28a36655
6
+ metadata.gz: fbe251672369dd5f4c3f1b4d71442df24eaeb1346f438ec4ed614e71c3f82664bdc1214d8f006e74689c8359c9da59f387a6d3afeec5277d9592b2fce22ccace
7
+ data.tar.gz: fc748d1c3bf72798dbeb573518a07031f1627c547436facf49ea1ecae44899914a9c7801e0fcef67dd3e4317379b2a649c8329240d6f7f52772b12e2b94b1278
data/README.md CHANGED
@@ -104,6 +104,13 @@ Factory.remove(:windows)
104
104
  Factory.remove(Windows)
105
105
  ```
106
106
 
107
+ A registry can be cleared completely or by tag.
108
+
109
+ ```ruby
110
+ Factory.clear(:linux)
111
+ Factory.clear
112
+ ```
113
+
107
114
  ## Development
108
115
 
109
116
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -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)
17
+ tags = tags.is_a?(Array) ? tags : [tags]
13
18
 
14
- elements << element
15
- tagged_elements[tag] << element
16
- identifiers[id] = element unless id.nil?
17
-
18
- element
19
+ container[id] = [element, Set.new(tags)]
19
20
  end
20
21
 
21
22
  def default(object = nil)
@@ -24,83 +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
 
56
+ def clear(tag = nil)
57
+ subset(tag).each { |object| remove(object) }
58
+ end
59
+
60
60
  def inherited(child)
61
61
  super
62
- child.elements.concat(registries)
63
- child.tagged_elements.merge!(tagged_elements)
64
- child.identifiers.merge!(identifiers)
62
+ child.container.merge!(container)
65
63
  child.default(default)
66
64
  end
67
65
 
68
66
  def registries(tag = nil)
69
- container(tag).clone.freeze
67
+ subset(tag)
68
+ end
69
+
70
+ def tags
71
+ container.values.flat_map { |_, tags| tags.to_a }.uniq
70
72
  end
71
73
 
72
74
  protected
73
75
 
74
76
  EMPTY = [].freeze
75
77
 
76
- def elements
77
- @elements ||= []
78
- end
79
-
80
- def resolve_object_or_id(obj_or_id)
81
- id = identifiers.key?(obj_or_id) ? obj_or_id : identifiers.find { |_, value| value == obj_or_id }&.first
82
- element = id.nil? ? obj_or_id : identifiers[id]
83
- return unless include?(element)
84
-
85
- yield(id, element)
78
+ def container
79
+ @container ||= {}
86
80
  end
87
81
 
88
- def tagged_elements
89
- @tagged_elements ||= Hash.new { |hash, key| hash[key] = [] }
82
+ def subset(tag)
83
+ container.values.select do |_, tags|
84
+ tag.nil? || tags.include?(tag)
85
+ end.map(&:first)
90
86
  end
91
87
 
92
- def find_in_tagged(element)
93
- tagged_elements.find { |_, list| list.include?(element) }&.last
94
- 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
95
90
 
96
- def identifiers
97
- @identifiers ||= {}
91
+ yield(id) unless id.nil?
98
92
  end
99
93
 
100
- def container(tag)
101
- return elements if tag.nil?
102
-
103
- tagged_elements.key?(tag) ? tagged_elements[tag] : EMPTY
94
+ def default_id
95
+ SecureRandom.uuid
104
96
  end
105
97
  end
106
98
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Toolcase
4
- VERSION = "0.2.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.2.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: 2021-12-29 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