toolcase 0.3.0 → 1.1.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 +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
|