u-observers 2.2.1 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +82 -1
- data/README.pt-BR.md +84 -3
- data/lib/micro/observers/set.rb +12 -5
- data/lib/micro/observers/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: 55ea9f6a206dba9526be1d7777969b26311f725652b3020344db33563a5835c8
|
4
|
+
data.tar.gz: d8a6e1bf2e73d15fadbd71e82aa17e0c511fb11d97a7839ba165c50589324b66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9b907879c02a2071b6c194af9f5c1a6e50a3bd17655beaed0f9dfb7858c892f657c9a57666d320d23d0055a48625d168d625fbae19ca7a560722b8c1b475d31
|
7
|
+
data.tar.gz: 4a551b0a43d15b5968d843d2a3b737ae245e177da3ac0c595f9265be887ff3b2b1205a3544c368973cae993869a9083fbffdc2cf64dab9b18c5d6d17eae5282b
|
data/README.md
CHANGED
@@ -45,6 +45,10 @@ Because of this issue, I decided to create a gem that encapsulates the pattern w
|
|
45
45
|
- [Defining observers that execute only once](#defining-observers-that-execute-only-once)
|
46
46
|
- [`observers.attach(*args, perform_once: true)`](#observersattachargs-perform_once-true)
|
47
47
|
- [`observers.once(event:, call:, ...)`](#observersonceevent-call-)
|
48
|
+
- [Defining observers using blocks](#defining-observers-using-blocks)
|
49
|
+
- [order.observers.on()](#orderobserverson)
|
50
|
+
- [order.observers.on()](#orderobserverson-1)
|
51
|
+
- [Replacing a block by a `lambda`/`proc`](#replacing-a-block-by-a-lambdaproc)
|
48
52
|
- [Detaching observers](#detaching-observers)
|
49
53
|
- [ActiveRecord and ActiveModel integrations](#activerecord-and-activemodel-integrations)
|
50
54
|
- [notify_observers_on()](#notify_observers_on)
|
@@ -67,7 +71,7 @@ gem 'u-observers'
|
|
67
71
|
| u-observers | branch | ruby | activerecord |
|
68
72
|
| ----------- | ------- | -------- | ------------- |
|
69
73
|
| unreleased | main | >= 2.2.0 | >= 3.2, < 6.1 |
|
70
|
-
| 2.
|
74
|
+
| 2.3.0 | v2.x | >= 2.2.0 | >= 3.2, < 6.1 |
|
71
75
|
| 1.0.0 | v1.x | >= 2.2.0 | >= 3.2, < 6.1 |
|
72
76
|
|
73
77
|
> **Note**: The ActiveRecord isn't a dependency, but you could add a module to enable some static methods that were designed to be used with its [callbacks](https://guides.rubyonrails.org/active_record_callbacks.html).
|
@@ -375,6 +379,83 @@ order.cancel! # Nothing will happen because there aren't observers.
|
|
375
379
|
|
376
380
|
[⬆️ Back to Top](#table-of-contents-)
|
377
381
|
|
382
|
+
### Defining observers using blocks
|
383
|
+
|
384
|
+
The methods `#on()` and `#once()` can receive the event name (a `symbol`) and a block to define observers.
|
385
|
+
|
386
|
+
#### order.observers.on()
|
387
|
+
|
388
|
+
```ruby
|
389
|
+
class Order
|
390
|
+
include Micro::Observers
|
391
|
+
|
392
|
+
def cancel!
|
393
|
+
observers.notify!(:canceled)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
order = Order.new
|
398
|
+
order.observers.on(:canceled) do |event|
|
399
|
+
puts "The order #(#{event.subject.object_id}) has been canceled."
|
400
|
+
end
|
401
|
+
|
402
|
+
order.observers.some? # true
|
403
|
+
|
404
|
+
order.cancel! # The order #(70301497466060) has been canceled.
|
405
|
+
|
406
|
+
order.observers.some? # true
|
407
|
+
```
|
408
|
+
|
409
|
+
#### order.observers.on()
|
410
|
+
|
411
|
+
```ruby
|
412
|
+
class Order
|
413
|
+
include Micro::Observers
|
414
|
+
|
415
|
+
def cancel!
|
416
|
+
observers.notify!(:canceled)
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
order = Order.new
|
421
|
+
order.observers.once(:canceled) do |event|
|
422
|
+
puts "The order #(#{event.subject.object_id}) has been canceled."
|
423
|
+
end
|
424
|
+
|
425
|
+
order.observers.some? # true
|
426
|
+
|
427
|
+
order.cancel! # The order #(70301497466060) has been canceled.
|
428
|
+
|
429
|
+
order.observers.some? # false
|
430
|
+
```
|
431
|
+
|
432
|
+
#### Replacing a block by a `lambda`/`proc`
|
433
|
+
|
434
|
+
Ruby allows you to replace any block with a `lambda`/`proc`. e.g.
|
435
|
+
|
436
|
+
```ruby
|
437
|
+
class Order
|
438
|
+
include Micro::Observers
|
439
|
+
|
440
|
+
def cancel!
|
441
|
+
observers.notify!(:canceled)
|
442
|
+
end
|
443
|
+
end
|
444
|
+
|
445
|
+
NotifyAfterCancel = -> event { puts "The order #(#{event.subject.object_id}) has been canceled." }
|
446
|
+
|
447
|
+
order = Order.new
|
448
|
+
order.observers.once(:canceled, &NotifyAfterCancel)
|
449
|
+
|
450
|
+
order.observers.some? # true
|
451
|
+
order.cancel! # The order #(70301497466060) has been canceled.
|
452
|
+
|
453
|
+
order.observers.some? # false
|
454
|
+
order.cancel! # Nothing will happen because there aren't observers.
|
455
|
+
```
|
456
|
+
|
457
|
+
[⬆️ Back to Top](#table-of-contents-)
|
458
|
+
|
378
459
|
### Detaching observers
|
379
460
|
|
380
461
|
As shown in the first example, you can use the `observers.detach()` to remove observers.
|
data/README.pt-BR.md
CHANGED
@@ -44,6 +44,10 @@ Por causa desse problema, decidi criar uma gem que encapsula o padrão sem alter
|
|
44
44
|
- [Definindo observers que executam apenas uma vez](#definindo-observers-que-executam-apenas-uma-vez)
|
45
45
|
- [`observers.attach(*args, perform_once: true)`](#observersattachargs-perform_once-true)
|
46
46
|
- [`observers.once(event:, call:, ...)`](#observersonceevent-call-)
|
47
|
+
- [Definindo observers com blocos](#definindo-observers-com-blocos)
|
48
|
+
- [order.observers.on()](#orderobserverson)
|
49
|
+
- [order.observers.on()](#orderobserverson-1)
|
50
|
+
- [Substituindo um bloco por um `lambda`/`proc`](#substituindo-um-bloco-por-um-lambdaproc)
|
47
51
|
- [Desanexando observers](#desanexando-observers)
|
48
52
|
- [Integrações ActiveRecord e ActiveModel](#integrações-activerecord-e-activemodel)
|
49
53
|
- [notify_observers_on()](#notify_observers_on)
|
@@ -66,7 +70,7 @@ gem 'u-observers'
|
|
66
70
|
| u-observers | branch | ruby | activerecord |
|
67
71
|
| ----------- | ------- | -------- | ------------- |
|
68
72
|
| unreleased | main | >= 2.2.0 | >= 3.2, < 6.1 |
|
69
|
-
| 2.
|
73
|
+
| 2.3.0 | v2.x | >= 2.2.0 | >= 3.2, < 6.1 |
|
70
74
|
| 1.0.0 | v1.x | >= 2.2.0 | >= 3.2, < 6.1 |
|
71
75
|
|
72
76
|
> **Nota**: O ActiveRecord não é uma dependência, mas você pode adicionar um módulo para habilitar alguns métodos estáticos que foram projetados para serem usados com seus [callbacks](https://guides.rubyonrails.org/active_record_callbacks.html).
|
@@ -373,7 +377,84 @@ order.observers.some? # false
|
|
373
377
|
order.cancel! # Nothing will happen because there aren't observers.
|
374
378
|
```
|
375
379
|
|
376
|
-
[⬆️
|
380
|
+
[⬆️ Voltar para o índice](#índice-)
|
381
|
+
|
382
|
+
### Definindo observers com blocos
|
383
|
+
|
384
|
+
Os métodos `#on()` e `#once()` podem receber um evento (a `symbol`) e um bloco para definir observers.
|
385
|
+
|
386
|
+
#### order.observers.on()
|
387
|
+
|
388
|
+
```ruby
|
389
|
+
class Order
|
390
|
+
include Micro::Observers
|
391
|
+
|
392
|
+
def cancel!
|
393
|
+
observers.notify!(:canceled)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
order = Order.new
|
398
|
+
order.observers.on(:canceled) do |event|
|
399
|
+
puts "The order #(#{event.subject.object_id}) has been canceled."
|
400
|
+
end
|
401
|
+
|
402
|
+
order.observers.some? # true
|
403
|
+
|
404
|
+
order.cancel! # The order #(70301497466060) has been canceled.
|
405
|
+
|
406
|
+
order.observers.some? # true
|
407
|
+
```
|
408
|
+
|
409
|
+
#### order.observers.on()
|
410
|
+
|
411
|
+
```ruby
|
412
|
+
class Order
|
413
|
+
include Micro::Observers
|
414
|
+
|
415
|
+
def cancel!
|
416
|
+
observers.notify!(:canceled)
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
order = Order.new
|
421
|
+
order.observers.once(:canceled) do |event|
|
422
|
+
puts "The order #(#{event.subject.object_id}) has been canceled."
|
423
|
+
end
|
424
|
+
|
425
|
+
order.observers.some? # true
|
426
|
+
|
427
|
+
order.cancel! # The order #(70301497466060) has been canceled.
|
428
|
+
|
429
|
+
order.observers.some? # false
|
430
|
+
```
|
431
|
+
|
432
|
+
#### Substituindo um bloco por um `lambda`/`proc`
|
433
|
+
|
434
|
+
Ruby permite que você substitua qualquer bloco com um `lambda`/`proc`. Exemplo:
|
435
|
+
|
436
|
+
```ruby
|
437
|
+
class Order
|
438
|
+
include Micro::Observers
|
439
|
+
|
440
|
+
def cancel!
|
441
|
+
observers.notify!(:canceled)
|
442
|
+
end
|
443
|
+
end
|
444
|
+
|
445
|
+
NotifyAfterCancel = -> event { puts "The order #(#{event.subject.object_id}) has been canceled." }
|
446
|
+
|
447
|
+
order = Order.new
|
448
|
+
order.observers.once(:canceled, &NotifyAfterCancel)
|
449
|
+
|
450
|
+
order.observers.some? # true
|
451
|
+
order.cancel! # The order #(70301497466060) has been canceled.
|
452
|
+
|
453
|
+
order.observers.some? # false
|
454
|
+
order.cancel! # Nothing will happen because there aren't observers.
|
455
|
+
```
|
456
|
+
|
457
|
+
[⬆️ Voltar para o índice](#índice-)
|
377
458
|
|
378
459
|
### Desanexando observers
|
379
460
|
|
@@ -409,7 +490,7 @@ order.observers.some? # false
|
|
409
490
|
order.observers.count # 0
|
410
491
|
```
|
411
492
|
|
412
|
-
[⬆️
|
493
|
+
[⬆️ Voltar para o índice](#índice-)
|
413
494
|
|
414
495
|
### Integrações ActiveRecord e ActiveModel
|
415
496
|
|
data/lib/micro/observers/set.rb
CHANGED
@@ -42,13 +42,20 @@ module Micro
|
|
42
42
|
def attach(*args); @subscribers.attach(args) and self; end
|
43
43
|
def detach(*args); @subscribers.detach(args) and self; end
|
44
44
|
|
45
|
-
|
46
|
-
|
45
|
+
CallableOptions = -> (arg, block) do
|
46
|
+
arg.is_a?(Symbol) && block ? { event: arg, call: block } : arg
|
47
|
+
end
|
48
|
+
|
49
|
+
def on(arg = Utils::EMPTY_HASH, &block)
|
50
|
+
@subscribers.on(CallableOptions[arg, block]) and self
|
51
|
+
end
|
47
52
|
|
48
|
-
def
|
49
|
-
@subscribers.
|
53
|
+
def once(arg = Utils::EMPTY_HASH, &block)
|
54
|
+
@subscribers.once(CallableOptions[arg, block]) and self
|
50
55
|
end
|
51
56
|
|
57
|
+
def off(*args); @subscribers.off(args) and self; end
|
58
|
+
|
52
59
|
def notify(*events, data: nil)
|
53
60
|
broadcast_if_subject_changed(Event::Names.fetch(events), data)
|
54
61
|
end
|
@@ -93,7 +100,7 @@ module Micro
|
|
93
100
|
self
|
94
101
|
end
|
95
102
|
|
96
|
-
private_constant :INVALID_BOOLEAN_MSG, :CALL_EVENT
|
103
|
+
private_constant :INVALID_BOOLEAN_MSG, :CALL_EVENT; :CallableOptions
|
97
104
|
end
|
98
105
|
|
99
106
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: u-observers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rodrigo Serradura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|