Skip to content

Commit 19591ab

Browse files
committed
Expose public API only in channels and channels.util
To avoid having a confusing API documentation, we now make all modules "internal" (use a "_" prefix) except for frequenz.channels (exposing base classes and channel implementations) and frequenz.channels.util (exposing utility receivers and Select). Signed-off-by: Leandro Lucarella <[email protected]>
1 parent 7fb7cd8 commit 19591ab

22 files changed

+124
-66
lines changed

.github/labeler.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,12 @@
3030
"part:channels":
3131
- any:
3232
- "src/frequenz/channels/**"
33-
- "!src/frequenz/channels/select.py"
3433
- "!src/frequenz/channels/util/**"
3534

3635
"part:receivers":
37-
- "src/frequenz/channels/util/**"
36+
- any:
37+
- "src/frequenz/channels/util/**"
38+
- "!src/frequenz/channels/util/_select.py"
3839

3940
"part:select":
40-
- "src/frequenz/channels/select.py"
41+
- "src/frequenz/channels/util/_select.py"

RELEASE_NOTES.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,26 @@ time.
1818
`new_receiver()` and `new_sender()` respectively. This is to make it more
1919
clear that new objects are being created.
2020

21+
* The public API surface has been reduced considerably to make it more clear
22+
where to import symbols. You should update your imports. The new symbol
23+
locations are:
24+
25+
* `frequenz.channels.Anycast`
26+
* `frequenz.channels.Broadcast`
27+
* `frequenz.channels.Anycast`
28+
* `frequenz.channels.Bidirectional`
29+
* `frequenz.channels.BidirectionalHandle`
30+
* `frequenz.channels.Broadcast`
31+
* `frequenz.channels.BufferedReceiver`
32+
* `frequenz.channels.Peekable`
33+
* `frequenz.channels.Receiver`
34+
* `frequenz.channels.Sender`
35+
* `frequenz.channels.util.Merge`
36+
* `frequenz.channels.util.MergeNamed`
37+
* `frequenz.channels.util.FileWatcher`
38+
* `frequenz.channels.util.Select`
39+
* `frequenz.channels.util.Timer`
40+
2141
## New Features
2242

2343
<!-- Here goes the main new features and examples or instructions on how to use them -->

docs/mkdocstrings_autoapi.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,30 @@
88
"""
99

1010
from pathlib import Path
11+
from typing import Tuple
1112

1213
import mkdocs_gen_files
1314

1415
SRC_PATH = "src"
1516
DST_PATH = "reference"
1617

18+
19+
def is_internal(path_parts: Tuple[str, ...]) -> bool:
20+
"""Tell if the path is internal judging by the parts.
21+
22+
Args:
23+
path_parts: Path.parts of the path to check.
24+
25+
Returns:
26+
True if the path is internal.
27+
"""
28+
29+
def with_underscore_not_init(part: str) -> bool:
30+
return part.startswith("_") and part != "__init__"
31+
32+
return any(p for p in path_parts if with_underscore_not_init(p))
33+
34+
1735
# type ignore because mkdocs_gen_files uses a very weird module-level
1836
# __getattr__() which messes up the type system
1937
nav = mkdocs_gen_files.Nav() # type: ignore
@@ -24,15 +42,17 @@
2442
doc_path = path.relative_to(SRC_PATH).with_suffix(".md")
2543
full_doc_path = Path(DST_PATH, doc_path)
2644
parts = tuple(module_path.parts)
45+
if is_internal(parts):
46+
continue
2747
if parts[-1] == "__init__":
2848
doc_path = doc_path.with_name("index.md")
2949
full_doc_path = full_doc_path.with_name("index.md")
3050
parts = parts[:-1]
3151

3252
nav[parts] = doc_path.as_posix()
3353

34-
with mkdocs_gen_files.open(full_doc_path, "w") as fd:
35-
fd.write(f"::: {'.'.join(parts)}\n")
54+
with mkdocs_gen_files.open(full_doc_path, "w") as output_file:
55+
output_file.write(f"::: {'.'.join(parts)}\n")
3656

3757
mkdocs_gen_files.set_edit_path(full_doc_path, Path("..") / path)
3858

src/frequenz/channels/__init__.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,29 @@
33

44
"""Channel implementations."""
55

6-
from frequenz.channels.anycast import Anycast
7-
from frequenz.channels.base_classes import BufferedReceiver, Peekable, Receiver, Sender
8-
from frequenz.channels.bidirectional import Bidirectional, BidirectionalHandle
9-
from frequenz.channels.broadcast import Broadcast
10-
from frequenz.channels.merge import Merge
11-
from frequenz.channels.merge_named import MergeNamed
12-
from frequenz.channels.select import Select
13-
from frequenz.channels.utils.file_watcher import FileWatcher
14-
from frequenz.channels.utils.timer import Timer
6+
from . import util
7+
from ._anycast import Anycast
8+
from ._base_classes import (
9+
BufferedReceiver,
10+
ChannelClosedError,
11+
ChannelError,
12+
Peekable,
13+
Receiver,
14+
Sender,
15+
)
16+
from ._bidirectional import Bidirectional, BidirectionalHandle
17+
from ._broadcast import Broadcast
1518

1619
__all__ = [
1720
"Anycast",
1821
"Bidirectional",
1922
"BidirectionalHandle",
2023
"Broadcast",
2124
"BufferedReceiver",
22-
"FileWatcher",
23-
"Merge",
24-
"MergeNamed",
25+
"ChannelClosedError",
26+
"ChannelError",
2527
"Peekable",
2628
"Receiver",
27-
"Select",
2829
"Sender",
29-
"Timer",
30+
"util",
3031
]

src/frequenz/channels/anycast.py renamed to src/frequenz/channels/_anycast.py

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

12-
from frequenz.channels.base_classes import ChannelClosedError
13-
from frequenz.channels.base_classes import Receiver as BaseReceiver
14-
from frequenz.channels.base_classes import Sender as BaseSender
15-
from frequenz.channels.base_classes import T
12+
from ._base_classes import ChannelClosedError
13+
from ._base_classes import Receiver as BaseReceiver
14+
from ._base_classes import Sender as BaseSender
15+
from ._base_classes import T
1616

1717

1818
class Anycast(Generic[T]):
@@ -28,9 +28,9 @@ class Anycast(Generic[T]):
2828
thread-safe.
2929
3030
When there are multiple channel receivers, they can be awaited
31-
simultaneously using [Select][frequenz.channels.Select],
32-
[Merge][frequenz.channels.Merge] or
33-
[MergeNamed][frequenz.channels.MergeNamed].
31+
simultaneously using [Select][frequenz.channels.util.Select],
32+
[Merge][frequenz.channels.util.Merge] or
33+
[MergeNamed][frequenz.channels.util.MergeNamed].
3434
3535
Example:
3636
``` python
File renamed without changes.

src/frequenz/channels/bidirectional.py renamed to src/frequenz/channels/_bidirectional.py

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

88
from typing import Generic
99

10-
from frequenz.channels.base_classes import Receiver, Sender, T, U
11-
from frequenz.channels.broadcast import Broadcast
10+
from ._base_classes import Receiver, Sender, T, U
11+
from ._broadcast import Broadcast
1212

1313

1414
class Bidirectional(Generic[T, U]):

src/frequenz/channels/broadcast.py renamed to src/frequenz/channels/_broadcast.py

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

15-
from frequenz.channels.base_classes import BufferedReceiver, ChannelClosedError
16-
from frequenz.channels.base_classes import Peekable as BasePeekable
17-
from frequenz.channels.base_classes import Sender as BaseSender
18-
from frequenz.channels.base_classes import T
15+
from ._base_classes import BufferedReceiver, ChannelClosedError
16+
from ._base_classes import Peekable as BasePeekable
17+
from ._base_classes import Sender as BaseSender
18+
from ._base_classes import T
1919

2020
logger = logging.Logger(__name__)
2121

@@ -32,9 +32,9 @@ class Broadcast(Generic[T]):
3232
are thread-safe. Because of this, `Broadcast` channels are thread-safe.
3333
3434
When there are multiple channel receivers, they can be awaited
35-
simultaneously using [Select][frequenz.channels.Select],
36-
[Merge][frequenz.channels.Merge] or
37-
[MergeNamed][frequenz.channels.MergeNamed].
35+
simultaneously using [Select][frequenz.channels.util.Select],
36+
[Merge][frequenz.channels.util.Merge] or
37+
[MergeNamed][frequenz.channels.util.MergeNamed].
3838
3939
Example:
4040
``` python
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# License: MIT
2+
# Copyright © 2022 Frequenz Energy-as-a-Service GmbH
3+
4+
"""Channel utilities."""
5+
6+
from ._file_watcher import FileWatcher
7+
from ._merge import Merge
8+
from ._merge_named import MergeNamed
9+
from ._select import Select
10+
from ._timer import Timer
11+
12+
__all__ = [
13+
"FileWatcher",
14+
"Merge",
15+
"MergeNamed",
16+
"Select",
17+
"Timer",
18+
]

src/frequenz/channels/utils/file_watcher.py renamed to src/frequenz/channels/util/_file_watcher.py

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

13-
from frequenz.channels.base_classes import ChannelClosedError, Receiver
13+
from .._base_classes import ChannelClosedError, Receiver
1414

1515

1616
class EventType(Enum):

0 commit comments

Comments
 (0)