| 
9 | 9 | Flask Signals: https://flask.palletsprojects.com/en/1.1.x/signals/  | 
10 | 10 | """  | 
11 | 11 | 
 
  | 
12 |  | -from __future__ import annotations  | 
13 |  | - | 
14 |  | -from contextlib import suppress  | 
15 |  | -from typing import Protocol  | 
 | 12 | +# observer.py  | 
16 | 13 | 
 
  | 
 | 14 | +from __future__ import annotations  | 
 | 15 | +from typing import List  | 
17 | 16 | 
 
  | 
18 |  | -# define a generic observer type  | 
19 |  | -class Observer(Protocol):  | 
 | 17 | +class Observer:  | 
20 | 18 |     def update(self, subject: Subject) -> None:  | 
 | 19 | +        """  | 
 | 20 | +        Receive update from the subject.  | 
 | 21 | +
  | 
 | 22 | +        Args:  | 
 | 23 | +            subject (Subject): The subject instance sending the update.  | 
 | 24 | +        """  | 
21 | 25 |         pass  | 
22 | 26 | 
 
  | 
23 | 27 | 
 
  | 
24 | 28 | class Subject:  | 
 | 29 | +    _observers: List[Observer]  | 
 | 30 | + | 
25 | 31 |     def __init__(self) -> None:  | 
26 |  | -        self._observers: list[Observer] = []  | 
 | 32 | +        """  | 
 | 33 | +        Initialize the subject with an empty observer list.  | 
 | 34 | +        """  | 
 | 35 | +        self._observers = []  | 
27 | 36 | 
 
  | 
28 | 37 |     def attach(self, observer: Observer) -> None:  | 
 | 38 | +        """  | 
 | 39 | +        Attach an observer to the subject.  | 
 | 40 | +
  | 
 | 41 | +        Args:  | 
 | 42 | +            observer (Observer): The observer instance to attach.  | 
 | 43 | +        """  | 
29 | 44 |         if observer not in self._observers:  | 
30 | 45 |             self._observers.append(observer)  | 
31 | 46 | 
 
  | 
32 | 47 |     def detach(self, observer: Observer) -> None:  | 
33 |  | -        with suppress(ValueError):  | 
 | 48 | +        """  | 
 | 49 | +        Detach an observer from the subject.  | 
 | 50 | +
  | 
 | 51 | +        Args:  | 
 | 52 | +            observer (Observer): The observer instance to detach.  | 
 | 53 | +        """  | 
 | 54 | +        try:  | 
34 | 55 |             self._observers.remove(observer)  | 
 | 56 | +        except ValueError:  | 
 | 57 | +            pass  | 
35 | 58 | 
 
  | 
36 |  | -    def notify(self, modifier: Observer | None = None) -> None:  | 
 | 59 | +    def notify(self) -> None:  | 
 | 60 | +        """  | 
 | 61 | +        Notify all attached observers by calling their update method.  | 
 | 62 | +        """  | 
37 | 63 |         for observer in self._observers:  | 
38 |  | -            if modifier != observer:  | 
39 |  | -                observer.update(self)  | 
 | 64 | +            observer.update(self)  | 
40 | 65 | 
 
  | 
41 | 66 | 
 
  | 
42 | 67 | class Data(Subject):  | 
 | 
0 commit comments