Skip to content

Commit 74d5a93

Browse files
committed
Move exceptions into its own module
We already have quite a few exceptions, so we better move them to keep the base classes cleaner. Signed-off-by: Leandro Lucarella <[email protected]>
1 parent 89cde6d commit 74d5a93

File tree

11 files changed

+134
-120
lines changed

11 files changed

+134
-120
lines changed

src/frequenz/channels/__init__.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,19 +59,17 @@
5959

6060
from . import util
6161
from ._anycast import Anycast
62-
from ._base_classes import (
62+
from ._base_classes import Peekable, Receiver, Sender
63+
from ._bidirectional import Bidirectional
64+
from ._broadcast import Broadcast
65+
from ._exceptions import (
6366
ChannelClosedError,
6467
ChannelError,
6568
Error,
66-
Peekable,
67-
Receiver,
6869
ReceiverError,
6970
ReceiverStoppedError,
70-
Sender,
7171
SenderError,
7272
)
73-
from ._bidirectional import Bidirectional
74-
from ._broadcast import Broadcast
7573

7674
__all__ = [
7775
"Anycast",

src/frequenz/channels/_anycast.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@
99
from collections import deque
1010
from typing import Deque, Generic, Optional
1111

12-
from ._base_classes import ChannelClosedError
1312
from ._base_classes import Receiver as BaseReceiver
14-
from ._base_classes import ReceiverStoppedError
1513
from ._base_classes import Sender as BaseSender
16-
from ._base_classes import SenderError, T
14+
from ._base_classes import T
15+
from ._exceptions import ChannelClosedError, ReceiverStoppedError, SenderError
1716

1817

1918
class Anycast(Generic[T]):

src/frequenz/channels/_base_classes.py

Lines changed: 3 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -6,105 +6,14 @@
66
from __future__ import annotations
77

88
from abc import ABC, abstractmethod
9-
from typing import Any, Callable, Generic, Optional, TypeVar
9+
from typing import Callable, Generic, Optional, TypeVar
10+
11+
from ._exceptions import ReceiverStoppedError
1012

1113
T = TypeVar("T")
1214
U = TypeVar("U")
1315

1416

15-
class Error(RuntimeError):
16-
"""Base error.
17-
18-
All exceptions generated by this library inherit from this exception.
19-
"""
20-
21-
def __init__(self, message: Any):
22-
"""Create a ChannelError instance.
23-
24-
Args:
25-
message: An error message.
26-
"""
27-
super().__init__(message)
28-
29-
30-
class ChannelError(Error):
31-
"""An error produced in a channel.
32-
33-
All exceptions generated by channels inherit from this exception.
34-
"""
35-
36-
def __init__(self, message: Any, channel: Any):
37-
"""Create a ChannelError instance.
38-
39-
Args:
40-
message: An error message.
41-
channel: A reference to the channel that encountered the error.
42-
"""
43-
super().__init__(message)
44-
self.channel: Any = channel
45-
46-
47-
class ChannelClosedError(ChannelError):
48-
"""Error raised when trying to operate on a closed channel."""
49-
50-
def __init__(self, channel: Any):
51-
"""Create a `ChannelClosedError` instance.
52-
53-
Args:
54-
channel: A reference to the channel that was closed.
55-
"""
56-
super().__init__(f"Channel {channel} was closed", channel)
57-
58-
59-
class SenderError(Error, Generic[T]):
60-
"""An error produced in a [Sender][frequenz.channels.Sender].
61-
62-
All exceptions generated by senders inherit from this exception.
63-
"""
64-
65-
def __init__(self, message: Any, sender: Sender[T]):
66-
"""Create an instance.
67-
68-
Args:
69-
message: An error message.
70-
sender: The [Sender][frequenz.channels.Sender] where the error
71-
happened.
72-
"""
73-
super().__init__(message)
74-
self.sender: Sender[T] = sender
75-
76-
77-
class ReceiverError(Error, Generic[T]):
78-
"""An error produced in a [Receiver][frequenz.channels.Receiver].
79-
80-
All exceptions generated by receivers inherit from this exception.
81-
"""
82-
83-
def __init__(self, message: Any, receiver: Receiver[T]):
84-
"""Create an instance.
85-
86-
Args:
87-
message: An error message.
88-
receiver: The [Receiver][frequenz.channels.Receiver] where the
89-
error happened.
90-
"""
91-
super().__init__(message)
92-
self.receiver: Receiver[T] = receiver
93-
94-
95-
class ReceiverStoppedError(ReceiverError[T]):
96-
"""The [Receiver][frequenz.channels.Receiver] stopped producing messages."""
97-
98-
def __init__(self, receiver: Receiver[T]):
99-
"""Create an instance.
100-
101-
Args:
102-
receiver: The [Receiver][frequenz.channels.Receiver] where the
103-
error happened.
104-
"""
105-
super().__init__(f"Receiver {receiver} was stopped", receiver)
106-
107-
10817
class Sender(ABC, Generic[T]):
10918
"""A channel Sender."""
11019

src/frequenz/channels/_bidirectional.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,9 @@
77

88
from typing import Generic, TypeVar
99

10-
from ._base_classes import (
11-
ChannelError,
12-
Receiver,
13-
ReceiverError,
14-
Sender,
15-
SenderError,
16-
T,
17-
U,
18-
)
10+
from ._base_classes import Receiver, Sender, T, U
1911
from ._broadcast import Broadcast
12+
from ._exceptions import ChannelError, ReceiverError, SenderError
2013

2114
V = TypeVar("V")
2215
W = TypeVar("W")

src/frequenz/channels/_broadcast.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@
1212
from typing import Deque, Dict, Generic, Optional
1313
from uuid import UUID, uuid4
1414

15-
from ._base_classes import ChannelClosedError
1615
from ._base_classes import Peekable as BasePeekable
1716
from ._base_classes import Receiver as BaseReceiver
18-
from ._base_classes import ReceiverError, ReceiverStoppedError
1917
from ._base_classes import Sender as BaseSender
20-
from ._base_classes import SenderError, T
18+
from ._base_classes import T
19+
from ._exceptions import (
20+
ChannelClosedError,
21+
ReceiverError,
22+
ReceiverStoppedError,
23+
SenderError,
24+
)
2125

2226
logger = logging.Logger(__name__)
2327

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# License: MIT
2+
# Copyright © 2022 Frequenz Energy-as-a-Service GmbH
3+
4+
"""Exception classes."""
5+
6+
from __future__ import annotations
7+
8+
from typing import TYPE_CHECKING, Any, Generic, TypeVar
9+
10+
if TYPE_CHECKING:
11+
from . import _base_classes
12+
13+
T = TypeVar("T")
14+
15+
16+
class Error(RuntimeError):
17+
"""Base error.
18+
19+
All exceptions generated by this library inherit from this exception.
20+
"""
21+
22+
def __init__(self, message: Any):
23+
"""Create a ChannelError instance.
24+
25+
Args:
26+
message: An error message.
27+
"""
28+
super().__init__(message)
29+
30+
31+
class ChannelError(Error):
32+
"""An error produced in a channel.
33+
34+
All exceptions generated by channels inherit from this exception.
35+
"""
36+
37+
def __init__(self, message: Any, channel: Any):
38+
"""Create a ChannelError instance.
39+
40+
Args:
41+
message: An error message.
42+
channel: A reference to the channel that encountered the error.
43+
"""
44+
super().__init__(message)
45+
self.channel: Any = channel
46+
47+
48+
class ChannelClosedError(ChannelError):
49+
"""Error raised when trying to operate on a closed channel."""
50+
51+
def __init__(self, channel: Any):
52+
"""Create a `ChannelClosedError` instance.
53+
54+
Args:
55+
channel: A reference to the channel that was closed.
56+
"""
57+
super().__init__(f"Channel {channel} was closed", channel)
58+
59+
60+
class SenderError(Error, Generic[T]):
61+
"""An error produced in a [Sender][frequenz.channels.Sender].
62+
63+
All exceptions generated by senders inherit from this exception.
64+
"""
65+
66+
def __init__(self, message: Any, sender: _base_classes.Sender[T]):
67+
"""Create an instance.
68+
69+
Args:
70+
message: An error message.
71+
sender: The [Sender][frequenz.channels.Sender] where the error
72+
happened.
73+
"""
74+
super().__init__(message)
75+
self.sender: _base_classes.Sender[T] = sender
76+
77+
78+
class ReceiverError(Error, Generic[T]):
79+
"""An error produced in a [Receiver][frequenz.channels.Receiver].
80+
81+
All exceptions generated by receivers inherit from this exception.
82+
"""
83+
84+
def __init__(self, message: Any, receiver: _base_classes.Receiver[T]):
85+
"""Create an instance.
86+
87+
Args:
88+
message: An error message.
89+
receiver: The [Receiver][frequenz.channels.Receiver] where the
90+
error happened.
91+
"""
92+
super().__init__(message)
93+
self.receiver: _base_classes.Receiver[T] = receiver
94+
95+
96+
class ReceiverStoppedError(ReceiverError[T]):
97+
"""The [Receiver][frequenz.channels.Receiver] stopped producing messages."""
98+
99+
def __init__(self, receiver: _base_classes.Receiver[T]):
100+
"""Create an instance.
101+
102+
Args:
103+
receiver: The [Receiver][frequenz.channels.Receiver] where the
104+
error happened.
105+
"""
106+
super().__init__(f"Receiver {receiver} was stopped", receiver)

src/frequenz/channels/util/_file_watcher.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
from watchfiles import Change, awatch
1111
from watchfiles.main import FileChange
1212

13-
from .._base_classes import Receiver, ReceiverStoppedError
13+
from .._base_classes import Receiver
14+
from .._exceptions import ReceiverStoppedError
1415

1516

1617
class FileWatcher(Receiver[pathlib.Path]):

src/frequenz/channels/util/_merge.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from collections import deque
88
from typing import Any, Deque, Set
99

10-
from .._base_classes import Receiver, ReceiverStoppedError, T
10+
from .._base_classes import Receiver, T
11+
from .._exceptions import ReceiverStoppedError
1112

1213

1314
class Merge(Receiver[T]):

src/frequenz/channels/util/_merge_named.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from collections import deque
88
from typing import Any, Deque, Set, Tuple
99

10-
from .._base_classes import Receiver, ReceiverStoppedError, T
10+
from .._base_classes import Receiver, T
11+
from .._exceptions import ReceiverStoppedError
1112

1213

1314
class MergeNamed(Receiver[Tuple[str, T]]):

src/frequenz/channels/util/_select.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
from dataclasses import dataclass
1414
from typing import Any, Dict, List, Optional, Set, TypeVar
1515

16-
from .._base_classes import Receiver, ReceiverStoppedError
16+
from .._base_classes import Receiver
17+
from .._exceptions import ReceiverStoppedError
1718

1819
logger = logging.Logger(__name__)
1920
T = TypeVar("T")

0 commit comments

Comments
 (0)