diff --git a/singer_sdk/streams/core.py b/singer_sdk/streams/core.py index e460f9f81..d8696dab0 100644 --- a/singer_sdk/streams/core.py +++ b/singer_sdk/streams/core.py @@ -110,6 +110,9 @@ class Stream(metaclass=abc.ABCMeta): # noqa: PLR0904 selected_by_default: bool = True """Whether this stream is selected by default in the catalog.""" + __abstract__: bool = False + """Flag to indicate this stream is abstract and will not generate a catalog entry.""" # noqa: E501 + def __init__( self, tap: Tap, @@ -321,6 +324,9 @@ def selected(self) -> bool: Returns: True if the stream is selected. """ + if self.__abstract__: + return self.has_selected_descendents + return self.mask.get((), True) @selected.setter diff --git a/singer_sdk/tap_base.py b/singer_sdk/tap_base.py index d25e0b279..49462acc0 100644 --- a/singer_sdk/tap_base.py +++ b/singer_sdk/tap_base.py @@ -338,6 +338,7 @@ def _singer_catalog(self) -> Catalog: return Catalog( (stream.tap_stream_id, stream._singer_catalog_entry) # noqa: SLF001 for stream in self.streams.values() + if not stream.__abstract__ ) def discover_streams(self) -> t.Sequence[Stream]: