toolcase 0.2.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: 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