Skip to content

Commit 4b61169

Browse files
committed
feat: generalize automatic titles
1 parent 8b66245 commit 4b61169

File tree

4 files changed

+37
-18
lines changed

4 files changed

+37
-18
lines changed

pins/boards.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ def prepare_pin_version(
531531
raise NotImplementedError("Type argument is required.")
532532

533533
if title is None:
534-
title = default_title(x, type)
534+
title = default_title(x, name)
535535

536536
# create metadata from object on disk ---------------------------------
537537
# save all pin data to a temporary folder (including data.txt), so we

pins/drivers.py

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import builtins
2-
31
from pathlib import Path
42

53
from .config import get_allow_pickle_read, PINS_ENV_INSECURE_READ
@@ -119,17 +117,14 @@ def save_data(
119117
return fname
120118

121119

122-
def default_title(obj, type):
123-
if type == "csv":
124-
import pandas as pd
125-
126-
if isinstance(obj, pd.DataFrame):
127-
# TODO(compat): title says CSV rather than data.frame
128-
# see https://github.com/machow/pins-python/issues/5
129-
shape_str = " x ".join(map(str, obj.shape))
130-
return f"A pinned {shape_str} CSV"
131-
raise NotImplementedError(
132-
f"No default csv title support for class: {builtins.type(obj)}"
133-
)
120+
def default_title(obj, name):
121+
import pandas as pd
134122

135-
raise NotImplementedError(f"Cannot create default title for type: {type}")
123+
if isinstance(obj, pd.DataFrame):
124+
# TODO(compat): title says CSV rather than data.frame
125+
# see https://github.com/machow/pins-python/issues/5
126+
shape_str = " x ".join(map(str, obj.shape))
127+
return f"{name}: a pinned {shape_str} DataFrame"
128+
else:
129+
obj_name = type(obj).__qualname__
130+
return f"{name}: a pinned {obj_name} object"

pins/tests/test_boards.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def test_board_pin_write_default_title(board):
3838

3939
df = pd.DataFrame({"x": [1, 2, 3], "y": [4, 5, 6]})
4040
meta = board.pin_write(df, "df_csv", title=None, type="csv")
41-
assert meta.title == "A pinned 3 x 2 CSV"
41+
assert meta.title == "df_csv: a pinned 3 x 2 DataFrame"
4242

4343

4444
def test_board_pin_write_prepare_pin(board, tmp_dir2):

pins/tests/test_drivers.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import fsspec
22
import pytest
3+
import pandas as pd
34

45
from pathlib import Path
56

67
from pins.tests.helpers import rm_env
78

89
from pins.meta import MetaRaw
910
from pins.config import PINS_ENV_INSECURE_READ
10-
from pins.drivers import load_data, save_data
11+
from pins.drivers import load_data, save_data, default_title
1112
from pins.errors import PinsInsecureReadError
1213

1314

@@ -21,6 +22,29 @@ def some_joblib(tmp_dir2):
2122
return p_obj
2223

2324

25+
# default title ---------------------------------------------------------------
26+
27+
28+
class ExC:
29+
class D:
30+
pass
31+
32+
33+
@pytest.mark.parametrize(
34+
"obj, dst_title",
35+
[
36+
(pd.DataFrame({"x": [1, 2]}), "somename: a pinned 2 x 1 DataFrame"),
37+
(pd.DataFrame({"x": [1], "y": [2]}), "somename: a pinned 1 x 2 DataFrame"),
38+
(ExC(), "somename: a pinned ExC object"),
39+
(ExC().D(), "somename: a pinned ExC.D object"),
40+
([1, 2, 3], "somename: a pinned list object"),
41+
],
42+
)
43+
def test_default_title(obj, dst_title):
44+
res = default_title(obj, "somename")
45+
assert res == dst_title
46+
47+
2448
def test_driver_roundtrip_csv(tmp_dir2):
2549
# TODO: I think this test highlights the challenge of getting the flow
2650
# between metadata, drivers, and the metafactory right.

0 commit comments

Comments
 (0)