Skip to content

Commit 443e67d

Browse files
committed
fix: do not error for new pins manifest
1 parent 506bcc5 commit 443e67d

File tree

10 files changed

+90
-2
lines changed

10 files changed

+90
-2
lines changed

pins/boards.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ def info(self, path):
5353

5454

5555
class BaseBoard:
56+
reserved_pin_names = {"_pins.yaml"}
57+
5658
def __init__(
5759
self,
5860
board: "str | Path",
@@ -174,8 +176,11 @@ def pin_list(self):
174176
This is a low-level function; use pin_search() to get more data about
175177
each pin in a convenient form.
176178
"""
179+
177180
full_paths = self.fs.ls(self.board)
178-
return list(map(self.keep_final_path_component, full_paths))
181+
pin_names = map(self.keep_final_path_component, full_paths)
182+
183+
return [name for name in pin_names if name not in self.reserved_pin_names]
179184

180185
def pin_fetch(self, name: str, version: Optional[str] = None) -> Meta:
181186
meta = self.pin_meta(name, version)
@@ -513,6 +518,8 @@ def validate_pin_name(self, name: str) -> None:
513518

514519
if "/" in name:
515520
raise ValueError(f"Invalid pin name: {name}")
521+
elif name in self.reserved_pin_names:
522+
raise ValueError(f"The pin name '{name}' is reserved for internal use.")
516523

517524
def path_to_pin(self, name: str) -> str:
518525
self.validate_pin_name(name)

pins/tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
PATH_TO_EXAMPLE_VERSION = PATH_TO_EXAMPLE_BOARD / "df_csv/20220214T163720Z-9bfad/"
1313
EXAMPLE_PIN_NAME = "df_csv"
1414

15+
PATH_TO_MANIFEST_BOARD = files("pins") / "tests/pin-board"
1516

1617
# Based on https://github.com/machow/siuba/blob/main/siuba/tests/helpers.py
1718
BACKEND_MARKS = ["fs_s3", "fs_file", "fs_gcs", "fs_abfs", "fs_rsc"]

pins/tests/pin-board/_pins.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
x:
2+
- x/20221215T180351Z-c3943/
3+
'y':
4+
- y/20221215T180357Z-9ae7a/
5+
- y/20221215T180400Z-b81d5/
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
file: x.json
2+
file_size: 23
3+
pin_hash: c3943ca5a9aab2df
4+
type: json
5+
title: 'x: a pinned integer vector'
6+
description: ~
7+
tags: ~
8+
created: 20221215T180351Z
9+
api_version: 1.0
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[1,2,3,4,5,6,7,8,9,10]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
file: y.rds
2+
file_size: 61
3+
pin_hash: 9ae7a970010c84e0
4+
type: rds
5+
title: 'y: a pinned integer vector'
6+
description: ~
7+
tags: ~
8+
created: 20221215T180357Z
9+
api_version: 1.0
61 Bytes
Binary file not shown.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
file: y.json
2+
file_size: 53
3+
pin_hash: b81d5bea9e760608
4+
type: json
5+
title: 'y: a pinned integer vector'
6+
description: ~
7+
tags: ~
8+
created: 20221215T180400Z
9+
api_version: 1.0
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

pins/tests/test_compat.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pins.errors import PinsError
66
from pins.tests.helpers import xfail_fs
7-
from pins.tests.conftest import PATH_TO_EXAMPLE_BOARD
7+
from pins.tests.conftest import PATH_TO_EXAMPLE_BOARD, PATH_TO_MANIFEST_BOARD
88

99

1010
NOT_A_PIN = "not_a_pin_abcdefg"
@@ -22,6 +22,15 @@ def board(backend):
2222
backend.teardown_board(board)
2323

2424

25+
@pytest.fixture(scope="session")
26+
def board_manifest(backend):
27+
board = backend.create_tmp_board(str(PATH_TO_MANIFEST_BOARD.absolute()))
28+
29+
yield board
30+
31+
backend.teardown_board(board)
32+
33+
2534
# pin_list --------------------------------------------------------------------
2635

2736

@@ -145,3 +154,40 @@ def test_compat_pin_read_supported(board):
145154

146155

147156
# pin_write ----
157+
158+
# manifest -----
159+
160+
161+
def test_board_pin_write_manifest_name_error(board_manifest):
162+
if board_manifest.fs.protocol == "rsc":
163+
pytest.skip()
164+
165+
with pytest.raises(PinsError) as exc_info:
166+
board_manifest.pin_write([1], "_pins.yaml", type="json")
167+
168+
assert "name '_pins.yaml' is reserved for internal use." in exc_info.value.args[0]
169+
170+
171+
def test_board_manifest_pin_list_no_internal_name(board_manifest):
172+
assert board_manifest.pin_list() == ["x", "y"]
173+
174+
175+
def test_board_manifest_pin_exist_internal_name_errors(board_manifest):
176+
with pytest.raises(PinsError) as exc_info:
177+
board_manifest.pin_exists("_pins.yaml")
178+
179+
assert "reserved for internal use." in exc_info.value.args[0]
180+
181+
182+
def test_board_manifest_pin_read_internal_errors(board_manifest):
183+
with pytest.raises(PinsError) as exc_info:
184+
board_manifest.pin_read("_pins.yaml")
185+
186+
assert "reserved for internal use." in exc_info.value.args[0]
187+
188+
189+
def test_board_manifest_pin_search(board_manifest):
190+
res = board_manifest.pin_search("x", as_df=False)
191+
192+
assert len(res) == 1
193+
assert res[0].name == "x"

0 commit comments

Comments
 (0)