callback-collection 0.1.0 → 0.2.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 +44 -2
- data/lib/callback_collection/version.rb +1 -1
- data/lib/callback_collection.rb +30 -4
- 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: 1b8d078e3adf404673581fa27324c5047a56f553607ed5a061cfd2235beda3af
|
|
4
|
+
data.tar.gz: 46b3b5395ebe4f3b28613abe64aa0732d4e5b090cdada60680706c6552e73a1a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bb5f40c036768f917b0b2478fb1abfac644cc1514cb770c012503f03e3a5aea4c7f1607cd5f88ad74a9de4febad7b01096ca415c972654ff54c2febd0877ad6a
|
|
7
|
+
data.tar.gz: 3579c01beef765ea0388ee4ce0344fc89ddfbc35ecd524b9307c0536fbe14529ce77b9eee1da348c3271ed948a2649297c2f905bb37438ce27261bb0844ea81f
|
data/README.md
CHANGED
|
@@ -40,6 +40,47 @@ callbacks.respond_with(:success, "Ruby")
|
|
|
40
40
|
La collection est figée à la fin de son initialisation. Toute tentative
|
|
41
41
|
d'ajouter ensuite un callback lève une `FrozenError`.
|
|
42
42
|
|
|
43
|
+
### Ractors (Ruby 3.0 et versions ultérieures)
|
|
44
|
+
|
|
45
|
+
Les blocs conservent leur contexte lexical et ne peuvent donc pas être partagés
|
|
46
|
+
entre Ractors. Pour créer une collection partageable, enregistrez plutôt un
|
|
47
|
+
objet partageable et l'une de ses méthodes :
|
|
48
|
+
|
|
49
|
+
```ruby
|
|
50
|
+
module Handlers
|
|
51
|
+
def self.sum(left, right)
|
|
52
|
+
left + right
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
callbacks = CallbackCollection.new do |collection|
|
|
57
|
+
collection.register(:sum, Handlers)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
Ractor.shareable?(callbacks)
|
|
61
|
+
# => true
|
|
62
|
+
|
|
63
|
+
worker = Ractor.new(callbacks) do |collection|
|
|
64
|
+
collection.respond_with(:sum, 20, 22)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
result = worker.respond_to?(:value) ? worker.value : worker.take
|
|
68
|
+
result
|
|
69
|
+
# => 42
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Le troisième argument de `register` permet d'utiliser un nom de méthode
|
|
73
|
+
différent du nom du callback :
|
|
74
|
+
|
|
75
|
+
```ruby
|
|
76
|
+
collection.register(:total, Handlers, :sum)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Le receveur enregistré et les données qu'il utilise doivent eux-mêmes respecter
|
|
80
|
+
les règles de partage des Ractors. L'appel à `respond_with` reste identique.
|
|
81
|
+
Sous Ruby 2.7, la gem et `register` restent utilisables normalement ; seule
|
|
82
|
+
l'exécution avec `Ractor` est indisponible.
|
|
83
|
+
|
|
43
84
|
## Développement
|
|
44
85
|
|
|
45
86
|
```sh
|
|
@@ -70,8 +111,9 @@ Publiez ensuite une version en poussant le tag correspondant à
|
|
|
70
111
|
`CallbackCollection::VERSION` :
|
|
71
112
|
|
|
72
113
|
```sh
|
|
73
|
-
|
|
74
|
-
git
|
|
114
|
+
VERSION=$(ruby -Ilib -rcallback_collection/version -e 'print CallbackCollection::VERSION')
|
|
115
|
+
git tag "v${VERSION}"
|
|
116
|
+
git push origin "v${VERSION}"
|
|
75
117
|
```
|
|
76
118
|
|
|
77
119
|
GitHub Actions construit et publie alors la gem. RubyDoc génère
|
data/lib/callback_collection.rb
CHANGED
|
@@ -12,10 +12,30 @@ require_relative "callback_collection/version"
|
|
|
12
12
|
# callbacks.respond_with(:success, "data")
|
|
13
13
|
# # => "Received data"
|
|
14
14
|
class CallbackCollection
|
|
15
|
+
class RegisteredCallback
|
|
16
|
+
def initialize(receiver, method_name)
|
|
17
|
+
@receiver = receiver
|
|
18
|
+
@method_name = method_name
|
|
19
|
+
freeze
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def call(*args, **kwargs, &block)
|
|
23
|
+
return @receiver.public_send(@method_name, *args, &block) if kwargs.empty?
|
|
24
|
+
|
|
25
|
+
@receiver.public_send(@method_name, *args, **kwargs, &block)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
private_constant :RegisteredCallback
|
|
29
|
+
|
|
15
30
|
def initialize
|
|
16
31
|
callbacks
|
|
17
32
|
yield(self) if block_given?
|
|
18
33
|
callbacks.freeze
|
|
34
|
+
freeze
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def register(callback, receiver, method_name = callback)
|
|
38
|
+
store_callback(callback, RegisteredCallback.new(receiver, method_name))
|
|
19
39
|
end
|
|
20
40
|
|
|
21
41
|
def respond_with(callback, *args, **kwargs, &block)
|
|
@@ -30,10 +50,7 @@ class CallbackCollection
|
|
|
30
50
|
|
|
31
51
|
def method_missing(method_name, *args, &block)
|
|
32
52
|
if block
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
callbacks[method_name] = block
|
|
36
|
-
self
|
|
53
|
+
store_callback(method_name, block)
|
|
37
54
|
else
|
|
38
55
|
super
|
|
39
56
|
end
|
|
@@ -48,4 +65,13 @@ class CallbackCollection
|
|
|
48
65
|
def callbacks
|
|
49
66
|
@callbacks ||= {}
|
|
50
67
|
end
|
|
68
|
+
|
|
69
|
+
private
|
|
70
|
+
|
|
71
|
+
def store_callback(callback, handler)
|
|
72
|
+
raise FrozenError, "Cannot define a callback after initialization." if callbacks.frozen?
|
|
73
|
+
|
|
74
|
+
callbacks[callback] = handler
|
|
75
|
+
self
|
|
76
|
+
end
|
|
51
77
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: callback-collection
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Nicolas Vandenbogaerde
|
|
@@ -56,7 +56,7 @@ homepage: https://github.com/nicolasva/callback-collection
|
|
|
56
56
|
licenses: []
|
|
57
57
|
metadata:
|
|
58
58
|
rubygems_mfa_required: 'true'
|
|
59
|
-
documentation_uri: https://www.rubydoc.info/gems/callback-collection/0.
|
|
59
|
+
documentation_uri: https://www.rubydoc.info/gems/callback-collection/0.2.0
|
|
60
60
|
source_code_uri: https://github.com/nicolasva/callback-collection
|
|
61
61
|
rdoc_options: []
|
|
62
62
|
require_paths:
|