toolcase 0.2.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/README.md +7 -0
- data/lib/toolcase/registry.rb +40 -48
- 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/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.
|
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
|
-
|
17
|
+
tags = tags.is_a?(Array) ? tags : [tags]
|
13
18
|
|
14
|
-
|
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
|
-
|
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
|
|
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.
|
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
|
-
|
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
|
77
|
-
@
|
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
|
89
|
-
|
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
|
93
|
-
|
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
|
-
|
97
|
-
@identifiers ||= {}
|
91
|
+
yield(id) unless id.nil?
|
98
92
|
end
|
99
93
|
|
100
|
-
def
|
101
|
-
|
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
|
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:
|
11
|
+
date: 2022-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|