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 +4 -4
- data/lib/toolcase/registry.rb +34 -50
- data/lib/toolcase/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38fd1d4c41d5004980f75591681b837525521f2e568c33eae57053aa8905706d
|
4
|
+
data.tar.gz: 5d429619ea3dc02504c7b3cfbd2c43937fa8102c053a077dd18b8ce411832d80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fbe251672369dd5f4c3f1b4d71442df24eaeb1346f438ec4ed614e71c3f82664bdc1214d8f006e74689c8359c9da59f387a6d3afeec5277d9592b2fce22ccace
|
7
|
+
data.tar.gz: fc748d1c3bf72798dbeb573518a07031f1627c547436facf49ea1ecae44899914a9c7801e0fcef67dd3e4317379b2a649c8329240d6f7f52772b12e2b94b1278
|
data/lib/toolcase/registry.rb
CHANGED
@@ -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:
|
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
|
-
|
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
|
-
|
28
|
+
container.key?(id) ? container[id].first : default
|
28
29
|
end
|
29
30
|
|
30
31
|
def find_by(tag = nil, &block)
|
31
|
-
|
32
|
+
subset(tag).find(-> { default }, &block)
|
32
33
|
end
|
33
34
|
|
34
35
|
def include?(object, tag = nil)
|
35
|
-
|
36
|
+
subset(tag).include?(object)
|
36
37
|
end
|
37
38
|
|
38
39
|
def size(tag = nil)
|
39
|
-
|
40
|
+
subset(tag).size
|
40
41
|
end
|
41
42
|
|
42
|
-
def replace(
|
43
|
-
|
44
|
-
|
45
|
-
|
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(
|
53
|
-
|
54
|
-
|
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
|
-
|
57
|
+
subset(tag).each { |object| remove(object) }
|
62
58
|
end
|
63
59
|
|
64
60
|
def inherited(child)
|
65
61
|
super
|
66
|
-
child.
|
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
|
-
|
67
|
+
subset(tag)
|
74
68
|
end
|
75
69
|
|
76
70
|
def tags
|
77
|
-
|
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
|
85
|
-
@
|
78
|
+
def container
|
79
|
+
@container ||= {}
|
86
80
|
end
|
87
81
|
|
88
|
-
def
|
89
|
-
|
90
|
-
|
91
|
-
|
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
|
97
|
-
|
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
|
-
|
105
|
-
@identifiers ||= {}
|
91
|
+
yield(id) unless id.nil?
|
106
92
|
end
|
107
93
|
|
108
|
-
def
|
109
|
-
|
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
|
data/lib/toolcase/version.rb
CHANGED
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
|
+
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-
|
11
|
+
date: 2022-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|