toolcase 0.4.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 +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
|