Skip to content

Commit e7c068e

Browse files
committed
allow folder names with leading /
1 parent f58d90d commit e7c068e

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Unreleased
22
----------
3-
-
3+
**Improvements**
4+
- `folders.get_folder()` can now handle folder names that include a leading or trailing "/" character.
45

56
v1.8.1 (2023-01-19)
67
----------

src/sasctl/_services/folders.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class Folders(Service):
1818

1919
_SERVICE_ROOT = "/folders"
2020

21-
list_folders, get_folder, update_folder, delete_folder = Service._crud_funcs(
21+
list_folders, _get_folder, update_folder, delete_folder = Service._crud_funcs(
2222
"/folders", "folder"
2323
)
2424

@@ -61,3 +61,33 @@ def create_folder(cls, name, parent=None, description=None):
6161
params={"parentFolderUri": parent_uri},
6262
headers={"Content-Type": "application/vnd.sas.content.folder+json"},
6363
)
64+
65+
@classmethod
66+
def get_folder(cls, folder, refresh=False):
67+
"""Return a folder instance.
68+
69+
Parameters
70+
----------
71+
folder : str or dict
72+
Name, ID, or dictionary representation of the folder.
73+
refresh : bool, optional
74+
Obtain an updated copy of the folder.
75+
76+
Returns
77+
-------
78+
RestObj or None
79+
A dictionary containing the folder attributes or None.
80+
81+
Notes
82+
-------
83+
If `folder` is a complete representation of the folder it will be
84+
returned unless `refresh` is set. This prevents unnecessary REST
85+
calls when data is already available on the client.
86+
87+
"""
88+
# If users pass in a folder name like "/Public" instead of "Public"
89+
# then just cleanup the folder name so that it matches what's returned by Viya.
90+
if isinstance(folder, str):
91+
folder = folder.strip("/")
92+
93+
return cls._get_folder(folder, refresh=refresh)

tests/unit/test_folders.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,25 @@ def test_create_folder_with_parent():
7575
with mock.patch("sasctl._services.folders.Folders.post"):
7676
with pytest.raises(ValueError):
7777
folders.create_folder(FOLDER_NAME, parent="Doesnt Matter")
78+
79+
80+
@mock.patch("sasctl.core.Session.request")
81+
def test_get_folder_with_path(request):
82+
"""Verify that simple folder paths instead of names are handled."""
83+
request.return_value.status_code = 200
84+
request.return_value.json.return_value = {"name": "Spam"}
85+
86+
folder = folders.get_folder("/Spam")
87+
assert folder is not None
88+
assert folder.name == "Spam"
89+
90+
# Service should do a search on folder name first followed by a get for folder details.
91+
assert request.call_count == 2
92+
93+
url, params = request.call_args_list[0]
94+
search_filter = params["params"]
95+
96+
# / should have been stripped out of folder name
97+
assert '"Spam"' in search_filter
98+
assert '"/Spam"' not in search_filter
99+

0 commit comments

Comments
 (0)