Skip to content

Commit d80da1e

Browse files
authored
Merge pull request #230 from ewjoachim/restrict-iterable-str
2 parents 859ddd3 + d3eb162 commit d80da1e

File tree

3 files changed

+44
-9
lines changed

3 files changed

+44
-9
lines changed

pypitoken/restrictions.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -371,11 +371,16 @@ def check(self, context: Context) -> None:
371371
@classmethod
372372
def from_parameters(
373373
cls,
374-
project_names: list[str] | None = None,
374+
project_names: Iterable[str] | None = None,
375375
**kwargs,
376376
) -> ProjectNamesRestriction | None:
377377
if project_names is not None:
378-
return cls(project_names=project_names)
378+
if isinstance(project_names, str):
379+
raise exceptions.InvalidRestriction(
380+
"project_names should be an iterable of strings. "
381+
"Received a single string not wrapped in an iterable."
382+
)
383+
return cls(project_names=list(project_names))
379384
return None
380385

381386

@@ -435,11 +440,16 @@ def check(self, context: Context) -> None:
435440
@classmethod
436441
def from_parameters(
437442
cls,
438-
project_ids: list[str] | None = None,
443+
project_ids: Iterable[str] | None = None,
439444
**kwargs,
440445
) -> ProjectIDsRestriction | None:
441446
if project_ids is not None:
442-
return cls(project_ids=project_ids)
447+
if isinstance(project_ids, str):
448+
raise exceptions.InvalidRestriction(
449+
"project_ids should be an iterable of strings. "
450+
"Received a single string not wrapped in an iterable."
451+
)
452+
return cls(project_ids=list(project_ids))
443453
return None
444454

445455

@@ -598,11 +608,16 @@ def check(self, context: Context) -> None:
598608
@classmethod
599609
def from_parameters(
600610
cls,
601-
legacy_project_names: list[str] | None = None,
611+
legacy_project_names: Iterable[str] | None = None,
602612
**kwargs,
603613
) -> LegacyProjectNamesRestriction | None:
604614
if legacy_project_names is not None:
605-
return cls(project_names=legacy_project_names)
615+
if isinstance(legacy_project_names, str):
616+
raise exceptions.InvalidRestriction(
617+
"legacy_project_names should be an iterable of strings. "
618+
"Received a single string not wrapped in an iterable."
619+
)
620+
return cls(project_names=list(legacy_project_names))
606621
return None
607622

608623

pypitoken/token.py

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

33
import datetime
44
import functools
5+
from typing import Iterable
56

67
import pymacaroons
78
from typing_extensions import ParamSpec
@@ -152,11 +153,11 @@ def restrict(
152153
self,
153154
not_before: int | datetime.datetime | None = None,
154155
not_after: int | datetime.datetime | None = None,
155-
project_names: list[str] | None = None,
156-
project_ids: list[str] | None = None,
156+
project_names: Iterable[str] | None = None,
157+
project_ids: Iterable[str] | None = None,
157158
user_id: str | None = None,
158159
# Legacy params
159-
legacy_project_names: list[str] | None = None,
160+
legacy_project_names: Iterable[str] | None = None,
160161
legacy_not_before: int | datetime.datetime | None = None,
161162
legacy_not_after: int | datetime.datetime | None = None,
162163
legacy_noop: bool | None = None,

tests/test_restrictions.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,13 @@ def test__LegacyProjectNamesRestriction__from_parameters__not_empty():
198198
) == restrictions.LegacyProjectNamesRestriction(project_names=["a", "b"])
199199

200200

201+
def test__LegacyProjectNamesRestriction__from_parameters__bare_string():
202+
with pytest.raises(exceptions.InvalidRestriction):
203+
restrictions.LegacyProjectNamesRestriction.from_parameters(
204+
legacy_project_names="a"
205+
)
206+
207+
201208
def test__LegacyDateRestriction__load_value__pass():
202209
assert restrictions.LegacyDateRestriction._load_value(
203210
value={"nbf": 1_234_567_890, "exp": 1_234_567_900}
@@ -546,6 +553,11 @@ def test__ProjectNamesRestriction__from_parameters__empty():
546553
assert restrictions.ProjectNamesRestriction.from_parameters() is None
547554

548555

556+
def test__ProjectNamesRestriction__from_parameters__bare_string():
557+
with pytest.raises(exceptions.InvalidRestriction):
558+
restrictions.ProjectNamesRestriction.from_parameters(project_names="a")
559+
560+
549561
def test__ProjectNamesRestriction__from_parameters__not_empty():
550562
assert restrictions.ProjectNamesRestriction.from_parameters(
551563
project_names=["a", "b"]
@@ -669,6 +681,13 @@ def test__ProjectIDsRestriction__from_parameters__empty():
669681
assert restrictions.ProjectIDsRestriction.from_parameters() is None
670682

671683

684+
def test__ProjectIDsRestriction__from_parameters__bare_string():
685+
with pytest.raises(exceptions.InvalidRestriction):
686+
restrictions.ProjectIDsRestriction.from_parameters(
687+
project_ids="00000000-0000-0000-0000-000000000000"
688+
)
689+
690+
672691
def test__ProjectIDsRestriction__from_parameters__not_empty():
673692
assert restrictions.ProjectIDsRestriction.from_parameters(
674693
project_ids=[

0 commit comments

Comments
 (0)