Skip to content

Commit d93a77d

Browse files
committed
update all tests
1 parent 6271cb8 commit d93a77d

7 files changed

Lines changed: 165 additions & 27 deletions

File tree

pins/constructors.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,23 @@ def board_databricks(path, versioned=True, cache=DEFAULT, allow_pickle_read=None
607607
608608
See <https://docs.databricks.com/aws/en/dev-tools/sdk-python>
609609
610+
611+
Examples
612+
--------
613+
614+
>>> import pytest; pytest.skip()
615+
616+
>>> import pins
617+
>>> from dotenv import load_dotenv
618+
>>> load_dotenv() # eg, for a .env file with DATABRICKS_HOST and DATABRICKS_TOKEN set
619+
>>> board = pins.board_databricks("/Volumes/examples/my-board/test-volume")
620+
>>> board.pin_list()
621+
['df_csv']
622+
623+
>>> board.pin_read("df_csv")
624+
x y z
625+
0 1 a 3
626+
1 2 b 4
610627
"""
611628

612629
return board("dbc", path, versioned, cache, allow_pickle_read)

pins/tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
EXAMPLE_REL_PATH = "pins/tests/pins-compat"
1818
PATH_TO_EXAMPLE_BOARD = files("pins") / "tests/pins-compat"
19+
PATH_TO_EXAMPLE_BOARD_DBC = "/Volumes/workshops/my-board/my-volume/test"
1920
PATH_TO_EXAMPLE_VERSION = PATH_TO_EXAMPLE_BOARD / "df_csv/20220214T163720Z-9bfad/"
2021
EXAMPLE_PIN_NAME = "df_csv"
2122

@@ -27,13 +28,13 @@
2728
pytest.param(lambda: BoardBuilder("s3"), id="s3", marks=m.fs_s3),
2829
pytest.param(lambda: BoardBuilder("gcs"), id="gcs", marks=m.fs_gcs),
2930
pytest.param(lambda: BoardBuilder("abfs"), id="abfs", marks=m.fs_abfs),
31+
pytest.param(lambda: DbcBoardBuilder("dbc"), id="dbc", marks=m.fs_dbc)
3032
]
3133

3234
# rsc should only be used once, because users are created at docker setup time
3335
param_rsc = pytest.param(lambda: RscBoardBuilder("rsc"), id="rsc", marks=m.fs_rsc)
34-
param_dbc = pytest.param(lambda: DbcBoardBuilder("dbc"), id="dbc", marks=m.fs_dbc)
3536

36-
params_backend = [*params_safe, param_rsc, param_dbc]
37+
params_backend = [*params_safe, param_rsc]
3738

3839

3940
@pytest.fixture(params=params_backend, scope="session")

pins/tests/helpers.py

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import contextlib
2+
import functools
23
import json
34
import os
45
import shutil
@@ -21,20 +22,54 @@
2122
# TODO: should use pkg_resources for this path?
2223
RSC_KEYS_FNAME = "pins/tests/rsconnect_api_keys.json"
2324

25+
DATABRICKS_VOLUME = "/Volumes/workshops/my-board/my-volume/test"
26+
2427
BOARD_CONFIG = {
2528
"file": {"path": ["PINS_TEST_FILE__PATH", None]},
2629
"s3": {"path": ["PINS_TEST_S3__PATH", "ci-pins"]},
2730
"gcs": {"path": ["PINS_TEST_GCS__PATH", "pins-python"]},
2831
"abfs": {"path": ["PINS_TEST_AZURE__PATH", "ci-pins"]},
2932
"rsc": {"path": ["PINS_TEST_RSC__PATH", RSC_SERVER_URL]},
30-
"dbc": {"path": ["PINS_TEST_DBC__PATH", "DATABRICKS_VOLUME"]},
33+
"dbc": {"path": ["PINS_TEST_DBC__PATH", DATABRICKS_VOLUME]},
3134
}
3235

3336
# TODO: Backend initialization should be independent of helpers, but these
3437
# high-level initializers are super handy.
3538
# putting imports inside rsconnect particulars for now
3639

3740

41+
def skip_if_dbc(func):
42+
"""Decorator to skip test if board protocol is 'dbc'"""
43+
@functools.wraps(func)
44+
def wrapper(*args, **kwargs):
45+
import inspect
46+
board = None
47+
48+
# Get function signature to map args to parameter names.
49+
# We have to do this since parameterized pytest runs passes in
50+
# args in different orders
51+
sig = inspect.signature(func)
52+
bound_args = sig.bind_partial(*args, **kwargs)
53+
all_args = {**bound_args.arguments, **kwargs}
54+
55+
if 'board' in all_args:
56+
board = all_args['board']
57+
elif 'board_with_cache' in all_args:
58+
board = all_args['board_with_cache']
59+
else:
60+
# Check all arguments for something that looks like a board
61+
for arg_value in all_args.values():
62+
if hasattr(arg_value, 'fs') and hasattr(arg_value.fs, 'protocol'):
63+
board = arg_value
64+
break
65+
66+
if board and board.fs.protocol == "dbc":
67+
pytest.skip("All Databricks tests must be read only")
68+
69+
return func(*args, **kwargs)
70+
return wrapper
71+
72+
3873
def rsc_from_key(name):
3974
from pins.rsconnect.api import RsConnectApi
4075

@@ -209,24 +244,32 @@ def __init__(self, fs_name, path=None, *args, **kwargs):
209244
self.path = None
210245
self.fs_name = fs_name
211246
self.current_board = None
212-
self.volume = os.environ.get("DATABRICKS_VOLUME")
247+
self.volume = DATABRICKS_VOLUME
213248

214249
def create_tmp_board(self, src_board=None, versioned=True):
215-
temp_name = str(uuid.uuid4())
216-
board_name = os.path.join(self.volume, temp_name)
217-
db_board = board_databricks(board_name, cache=None)
218-
board = BaseBoard(board_name, fs=db_board.fs, versioned=versioned)
250+
# TODO: use temp boards when boards are not read-only
251+
# temp_name = str(uuid.uuid4())
252+
# board_name = os.path.join(self.volume, temp_name)
253+
# db_board = board_databricks(board_name, cache=None)
254+
# board = BaseBoard(board_name, fs=db_board.fs, versioned=versioned)
255+
# if src_board is not None:
256+
# board.fs.put(src_board, board_name)
257+
258+
db_board = board_databricks(self.volume, cache=None)
259+
board = BaseBoard(self.volume, fs=db_board.fs, versioned=versioned)
219260
self.current_board = board
220-
if src_board is not None:
221-
board.fs.put(src_board, board_name)
222261
return board
223262

224263
def teardown_board(self, board):
225-
board.fs.rm(board.board)
264+
pass
265+
# TODO: update when board not read-only
266+
# board.fs.rm(board.board)
226267

227268
def teardown(self):
228-
board = board_databricks(self.volume)
229-
board.fs.rm(self.current_board.board)
269+
pass
270+
# TODO: update when board not read-only
271+
# board = board_databricks(self.volume)
272+
# board.fs.rm(self.current_board.board)
230273

231274

232275
# Snapshot ====================================================================

0 commit comments

Comments
 (0)