toolcase 0.3.0 → 1.1.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 +41 -47
- 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: 59b70826e002497b7a94fafe6eb333de5189f8fa52ef1c4385aa84570d5e0e49
|
4
|
+
data.tar.gz: 9de36cee21aff4d68056a133feeae117e81568348e18ba34f2cc0f7b4cdcb795
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf999c92c9abb3afe882b8963130bbcf106c9205ba3175c4a43709074444a2b5ae9486a7ccca2dbb4a97c966842dcfe25d109cec40f18fe7b2dfec24bad27523
|
7
|
+
data.tar.gz: f6825afe59b5ed39aae2d16f02a8d7fb4690bf66ec64884e496e6b9a0c1bac56a670e85f85a5f62b7f6e037ca5f846f8242ca59259d31e7cd3270c76d4f496bc
|
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,87 +25,80 @@ 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)
|
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
|
81
|
-
@
|
82
|
+
def container
|
83
|
+
@container ||= {}
|
82
84
|
end
|
83
85
|
|
84
|
-
def
|
85
|
-
|
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
|
93
|
-
|
90
|
+
def entries_by_tag(tag)
|
91
|
+
container.select { |_, (_, tags)| tag.nil? || tags.include?(tag) }
|
94
92
|
end
|
95
93
|
|
96
|
-
def
|
97
|
-
|
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
|
-
|
101
|
-
@identifiers ||= {}
|
97
|
+
yield(id) unless id.nil?
|
102
98
|
end
|
103
99
|
|
104
|
-
def
|
105
|
-
|
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
|
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:
|
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-
|
11
|
+
date: 2022-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|