Skip to content

Commit 9e0042c

Browse files
committed
allow for missing kafka/websocket C++ adapters, enable future mmissing parquet adapter after cache cleanup
Signed-off-by: Tim Paine <[email protected]> Raise hard import errors if trying to use adapters with missing dependencies, with helpful error messages. Remove runtime requirement on pandas Signed-off-by: Tim Paine <[email protected]> Remove superfluous checks Signed-off-by: Tim Paine <[email protected]> Add oldest supported numpy as runtime dep as well Signed-off-by: Tim Paine <[email protected]> fix spacing in action, dont depend on oldest-supported-numpy Signed-off-by: Tim Paine <[email protected]> Isolate sdist build environment Signed-off-by: Tim Paine <[email protected]>
1 parent e3b7fd6 commit 9e0042c

File tree

10 files changed

+36
-27
lines changed

10 files changed

+36
-27
lines changed

.github/actions/setup-caches/action.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ runs:
6161
/Users/runner/vcpkg_download_cache
6262
key: vcpkg-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('vcpkg.json') }}
6363
restore-keys: vcpkg-${{ runner.os }}-${{ runner.arch }}-
64-
if: ${{ runner.os == 'macOS' && inputs.vcpkg == 'true'}}
64+
if: ${{ runner.os == 'macOS' && inputs.vcpkg == 'true' }}
6565

6666
- name: Setup vcpkg cache in shell (Windows)
6767
shell: bash
@@ -70,7 +70,7 @@ runs:
7070
mkdir C:\\Users\\runneradmin\\AppData\\Local\\vcpkg_download_cache
7171
echo "VCPKG_DEFAULT_BINARY_CACHE=C:\\Users\\runneradmin\\AppData\\Local\\vcpkg_cache" >> $GITHUB_ENV
7272
echo "VCPKG_DOWNLOADS=C:\\Users\\runneradmin\\AppData\\Local\\vcpkg_download_cache" >> $GITHUB_ENV
73-
if: ${{ runner.os == 'Windows' && inputs.vcpkg == 'true'}}
73+
if: ${{ runner.os == 'Windows' && inputs.vcpkg == 'true' }}
7474

7575
- name: Setup vcpkg cache (Windows)
7676
uses: actions/cache@v4
@@ -80,4 +80,4 @@ runs:
8080
C:\\Users\\runneradmin\\AppData\\Local\\vcpkg_download_cache
8181
key: vcpkg-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('vcpkg.json') }}
8282
restore-keys: vcpkg-${{ runner.os }}-${{ runner.arch }}-
83-
if: ${{ runner.os == 'Windows' && inputs.vcpkg == 'true'}}
83+
if: ${{ runner.os == 'Windows' && inputs.vcpkg == 'true' }}

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ major:
143143
dist-py: dist-py-sdist # Build python dist
144144
dist-py-sdist:
145145
rm -rf csp/lib/*
146-
python -m build --sdist -n
146+
python -m build --sdist
147147

148148
dist-py-wheel:
149149
python setup.py bdist_wheel $(EXTRA_ARGS)

csp/adapters/db.py

+1-6
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,8 @@
2525
_SQLALCHEMY_2 = False
2626

2727
import sqlalchemy as db
28-
29-
_HAS_SQLALCHEMY = True
3028
except (PackageNotFoundError, ValueError, TypeError, ImportError):
31-
_HAS_SQLALCHEMY = False
32-
db = None
29+
raise ModuleNotFoundError("csp's db adapter requires `sqlalchemy`")
3330

3431

3532
class TimeAccessor(ABC):
@@ -199,8 +196,6 @@ def __init__(
199196
:param log_query: set to True to see what query was generated to access the data
200197
:param use_raw_user_query: Don't do any alteration to user query, assume it contains all the needed columns and sorting
201198
"""
202-
if not _HAS_SQLALCHEMY:
203-
raise RuntimeError("Could not find SQLAlchemy installation")
204199
self._connection = connection
205200
self._table_name = table_name
206201
self._schema_name = schema_name

csp/adapters/kafka.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
RawTextMessageMapper,
1616
)
1717
from csp.impl.wiring import input_adapter_def, output_adapter_def, status_adapter_def
18-
from csp.lib import _kafkaadapterimpl
18+
19+
try:
20+
from csp.lib import _kafkaadapterimpl
21+
except ImportError:
22+
raise ImportError("csp's kafka adapter requires the C++ csp extension to be built, but it could not be imported")
1923

2024
_ = BytesMessageProtoMapper, DateTimeType, JSONTextMessageMapper, RawBytesMessageMapper, RawTextMessageMapper
2125
T = typing.TypeVar("T")

csp/adapters/parquet.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@
1515
from csp.impl.types.typing_utils import CspTypingUtils
1616
from csp.impl.wiring import input_adapter_def, status_adapter_def
1717
from csp.impl.wiring.node import node
18-
from csp.lib import _parquetadapterimpl
18+
19+
try:
20+
from csp.lib import _parquetadapterimpl
21+
except ImportError:
22+
raise ImportError("csp's parquet adapter requires the C++ csp extension to be built, but it could not be imported")
23+
1924

2025
__all__ = [
2126
"ParquetOutputConfig",

csp/adapters/perspective.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@
1111
import tornado.web
1212
import tornado.websocket
1313
except ImportError:
14-
raise ImportError("perspective adapter requires tornado package")
14+
raise ModuleNotFoundError("csp's perspective adapter requires `tornado`")
1515

1616

1717
try:
1818
from perspective import PerspectiveManager, Table as Table_, View as View_, __version__, set_threadpool_size
1919

2020
MAJOR, MINOR, PATCH = map(int, __version__.split("."))
2121
if (MAJOR, MINOR, PATCH) < (0, 6, 2):
22-
raise ImportError("perspective adapter requires 0.6.2 or greater of the perspective-python package")
22+
raise ModuleNotFoundError("csp's perspective adapter requires `perspective-python>=0.6.2`")
2323
except ImportError:
24-
raise ImportError("perspective adapter requires 0.6.2 or greater of the perspective-python package")
24+
raise ModuleNotFoundError("csp's perspective adapter requires `perspective-python>=0.6.2`")
2525

2626

2727
# Run perspective update in a separate tornado loop

csp/adapters/slack.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@
2020
from slack_sdk.socket_mode.request import SocketModeRequest
2121
from slack_sdk.socket_mode.response import SocketModeResponse
2222
from slack_sdk.web import WebClient
23-
24-
_HAVE_SLACK_SDK = True
2523
except ImportError:
26-
_HAVE_SLACK_SDK = False
24+
raise ModuleNotFoundError("csp's slack adapter requires `slack-sdk`")
2725

2826
T = TypeVar("T")
2927
log = getLogger(__file__)
@@ -55,8 +53,6 @@ def mention_user(userid: str) -> str:
5553

5654
class SlackAdapterManager(AdapterManagerImpl):
5755
def __init__(self, app_token: str, bot_token: str, ssl: Optional[SSLContext] = None):
58-
if not _HAVE_SLACK_SDK:
59-
raise RuntimeError("Could not find slack-sdk installation")
6056
if not app_token.startswith("xapp-") or not bot_token.startswith("xoxb-"):
6157
raise RuntimeError("Slack app token or bot token looks malformed")
6258

csp/adapters/symphony.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import http.client
22
import json
3-
import requests
43
import ssl
54
import threading
65
from logging import getLogger
@@ -14,6 +13,11 @@
1413
from csp.impl.pushadapter import PushInputAdapter
1514
from csp.impl.wiring import py_push_adapter_def
1615

16+
try:
17+
import requests
18+
except ImportError:
19+
raise ModuleNotFoundError("csp's symphony adapter requires `requests`")
20+
1721
__all__ = ["SymphonyAdapter", "SymphonyMessage"]
1822

1923
log = getLogger(__file__)

csp/adapters/websocket.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,13 @@
2020
)
2121
from csp.impl.wiring import input_adapter_def, output_adapter_def, status_adapter_def
2222
from csp.impl.wiring.delayed_node import DelayedNodeWrapperDef
23-
from csp.lib import _websocketadapterimpl
23+
24+
try:
25+
from csp.lib import _websocketadapterimpl
26+
except ImportError:
27+
raise ImportError(
28+
"csp's websocket adapter requires the C++ csp extension to be built, but it could not be imported"
29+
)
2430

2531
from .websocket_types import WebsocketHeaderUpdate
2632

@@ -39,14 +45,14 @@
3945
import tornado.web
4046
import tornado.websocket
4147
except ImportError:
42-
raise ImportError("websocket adapter requires tornado package")
48+
raise ModuleNotFoundError("csp's websocket adapter requires `tornado`")
4349

4450
try:
4551
import rapidjson
4652

4753
datetime_mode = rapidjson.DM_UNIX_TIME | rapidjson.DM_NAIVE_IS_UTC
4854
except ImportError:
49-
raise ImportError("websocket adapter requires rapidjson package")
55+
raise ModuleNotFoundError("csp's websocket adapter requires `rapidjson`")
5056

5157

5258
def diff_dict(old, new):

pyproject.toml

+2-3
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,12 @@ requires-python = ">=3.8"
1919

2020
dependencies = [
2121
"backports.zoneinfo; python_version<'3.9'",
22-
"numpy",
22+
"numpy>=1.19",
2323
"packaging",
24-
"pandas",
2524
"psutil",
2625
"pyarrow>=7.0.0",
2726
"pytz",
2827
"ruamel.yaml",
29-
"sqlalchemy",
3028
]
3129

3230
classifiers = [
@@ -75,6 +73,7 @@ develop = [
7573
"pillow",
7674
# adapters
7775
"httpx>=0.20,<1", # kafka
76+
"pandas", # pandas extension
7877
"polars", # parquet
7978
"psutil", # test_engine/test_history
8079
"slack-sdk>=3", # slack

0 commit comments

Comments
 (0)