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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 78150ace9b1f03ae373409b70582aab42fded3b8ca7cf7268c9e15fcc8eba8a6
4
- data.tar.gz: 98fa5ae6f33bc0116f4510d58f698c5e493fd17582843f6b067888d9cf5d82db
3
+ metadata.gz: 1b8d078e3adf404673581fa27324c5047a56f553607ed5a061cfd2235beda3af
4
+ data.tar.gz: 46b3b5395ebe4f3b28613abe64aa0732d4e5b090cdada60680706c6552e73a1a
5
5
  SHA512:
6
- metadata.gz: 9473879ba7b4f83ce62116855eff9b7dac6ea4923ed4cd43610490be669792bea01ed6ec273c8de58351b127a33efd36ecf0670da0a681d6116d6ebbc6fa9db4
7
- data.tar.gz: f4decc447ab5a9b79a6531fdaf40d0cadec9ecfca4f0f460d85ac8c629df1ae7f4d39aaa83b8bf23f822a7d7558133a4ac99cfb278bbe8364e4a6b2aa348bf4d
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
- git tag v0.1.0
74
- git push origin v0.1.0
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class CallbackCollection
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -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
- raise FrozenError, "Cannot define a callback after initialization." if callbacks.frozen?
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.1.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.1.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: