Skip to content

Commit daa9bd8

Browse files
authored
Add tests and simplify permission handling logic (#337)
1 parent 57faabe commit daa9bd8

17 files changed

Lines changed: 274 additions & 294 deletions

File tree

cterasdk/asynchronous/core/files/browser.py

Lines changed: 16 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ async def public_link(self, path, access='RO', expire_in=30):
142142
"""
143143
return await Link(io.public_link, self._core, path, access, expire_in).a_execute()
144144

145-
async def copy(self, *paths, destination=None, resolver=None, cursor=None, wait=False, strict_permission=False):
145+
async def copy(self, *paths, destination=None, resolver=None, cursor=None, wait=False):
146146
"""
147147
Copy one or more files or folders.
148148
@@ -156,16 +156,7 @@ async def copy(self, *paths, destination=None, resolver=None, cursor=None, wait=
156156
:raises cterasdk.exceptions.io.core.CopyError: Raised on failure copying resources.
157157
"""
158158
try:
159-
return await Copy(
160-
io.copy,
161-
self._core,
162-
wait,
163-
*paths,
164-
destination=destination,
165-
resolver=resolver,
166-
cursor=cursor,
167-
strict_permission=strict_permission
168-
).a_execute()
159+
return await Copy(io.copy, self._core, wait, *paths, destination=destination, resolver=resolver, cursor=cursor).a_execute()
169160
except ValueError:
170161
raise ValueError('Copy destination was not specified.')
171162

@@ -184,7 +175,7 @@ async def permalink(self, path):
184175
class CloudDrive(FileBrowser):
185176
"""Async CloudDrive API with upload and sharing functionality."""
186177

187-
async def upload(self, destination, handle, name=None, size=None, strict_permission=False):
178+
async def upload(self, destination, handle, name=None, size=None):
188179
"""
189180
Upload from file handle.
190181
@@ -203,11 +194,10 @@ async def upload(self, destination, handle, name=None, size=None, strict_permiss
203194
destination,
204195
handle,
205196
name,
206-
size,
207-
strict_permission=strict_permission
197+
size
208198
).a_execute()
209199

210-
async def upload_file(self, path, destination, strict_permission=False):
200+
async def upload_file(self, path, destination):
211201
"""
212202
Upload a file.
213203
@@ -223,11 +213,10 @@ async def upload_file(self, path, destination, strict_permission=False):
223213
destination,
224214
handle,
225215
name,
226-
commonfs.properties(path)['size'],
227-
strict_permission=strict_permission
216+
commonfs.properties(path)['size']
228217
)
229218

230-
async def mkdir(self, path, strict_permission=False):
219+
async def mkdir(self, path):
231220
"""
232221
Create a directory.
233222
@@ -236,9 +225,9 @@ async def mkdir(self, path, strict_permission=False):
236225
:rtype: str
237226
:raises cterasdk.exceptions.io.core.CreateDirectoryError: Raised on error creating directory.
238227
"""
239-
return await CreateDirectory(io.mkdir, self._core, path, strict_permission=strict_permission).a_execute()
228+
return await CreateDirectory(io.mkdir, self._core, path, ).a_execute()
240229

241-
async def makedirs(self, path, strict_permission=False):
230+
async def makedirs(self, path):
242231
"""
243232
Recursively create a directory.
244233
@@ -247,9 +236,9 @@ async def makedirs(self, path, strict_permission=False):
247236
:rtype: str
248237
:raises cterasdk.exceptions.io.core.CreateDirectoryError: Raised on error creating directory.
249238
"""
250-
return await CreateDirectory(io.mkdir, self._core, path, True, strict_permission=strict_permission).a_execute()
239+
return await CreateDirectory(io.mkdir, self._core, path, True, ).a_execute()
251240

252-
async def rename(self, path, name, *, resolver=None, wait=False, strict_permission=False):
241+
async def rename(self, path, name, *, resolver=None, wait=False):
253242
"""
254243
Rename a file or folder.
255244
@@ -267,11 +256,10 @@ async def rename(self, path, name, *, resolver=None, wait=False, strict_permissi
267256
wait,
268257
path,
269258
name,
270-
resolver,
271-
strict_permission=strict_permission
259+
resolver
272260
).a_execute()
273261

274-
async def delete(self, *paths, wait=False, strict_permission=False):
262+
async def delete(self, *paths, wait=False):
275263
"""
276264
Delete one or more files or folders.
277265
@@ -281,7 +269,7 @@ async def delete(self, *paths, wait=False, strict_permission=False):
281269
:rtype: cterasdk.common.object.Object or :class:`cterasdk.lib.tasks.AwaitablePortalTask`
282270
:raises cterasdk.exceptions.io.core.DeleteError: Raised on error deleting resources.
283271
"""
284-
return await Delete(io.delete, self._core, wait, *paths, strict_permission=strict_permission).a_execute()
272+
return await Delete(io.delete, self._core, wait, *paths, ).a_execute()
285273

286274
async def undelete(self, *paths, wait=False):
287275
"""
@@ -295,7 +283,7 @@ async def undelete(self, *paths, wait=False):
295283
"""
296284
return await Recover(io.undelete, self._core, wait, *paths).a_execute()
297285

298-
async def move(self, *paths, destination=None, resolver=None, cursor=None, wait=False, strict_permission=False):
286+
async def move(self, *paths, destination=None, resolver=None, cursor=None, wait=False):
299287
"""
300288
Move one or more files or folders.
301289
@@ -309,16 +297,7 @@ async def move(self, *paths, destination=None, resolver=None, cursor=None, wait=
309297
:raises cterasdk.exceptions.io.core.MoveError: Raised on error moving resources.
310298
"""
311299
try:
312-
return await Move(
313-
io.move,
314-
self._core,
315-
wait,
316-
*paths,
317-
destination=destination,
318-
resolver=resolver,
319-
cursor=cursor,
320-
strict_permission=strict_permission
321-
).a_execute()
300+
return await Move(io.move, self._core, wait, *paths, destination=destination, resolver=resolver, cursor=cursor).a_execute()
322301
except ValueError:
323302
raise ValueError('Move destination was not specified.')
324303

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import logging
2+
3+
from ...core.enum import RoleResolver
4+
from ...core.types import RoleSettings
5+
from .base_command import BaseCommand
6+
7+
8+
logger = logging.getLogger('cterasdk.core')
9+
10+
11+
class Roles(BaseCommand):
12+
"""
13+
Role Settings APIs
14+
"""
15+
16+
@staticmethod
17+
def find(role):
18+
"""
19+
Find Role
20+
"""
21+
options = {k: v for k, v in RoleResolver.__dict__.items() if not k.startswith('_')}
22+
return options.get(role, None)
23+
24+
async def get(self, role):
25+
"""
26+
Get Role
27+
28+
:param str role: Role
29+
:returns: Role settings
30+
:rtype: cterasdk.core.types.RoleSettings
31+
"""
32+
name = Roles.find(role)
33+
if name:
34+
return RoleSettings.from_server_object(await self._core.v1.api.get(f'/rolesSettings/{name}'))
35+
logger.warning('Could not find role. %s', {'role': role})
36+
return None

cterasdk/cio/common.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,26 @@
11
import urllib.parse
2+
from functools import wraps
23
from pathlib import PurePosixPath
34
from ..common import Object
45
from ..common.utils import utf8_decode
56
from ..convert.serializers import toxmlstr
67

78

9+
def resolver(func):
10+
@wraps(func)
11+
def wrapper(self, p):
12+
if isinstance(p, BasePath):
13+
p = p.reference
14+
elif isinstance(p, str):
15+
pass
16+
else:
17+
raise ValueError(
18+
f"Parameter 'p' must be str or BasePath, got {type(p).__name__}"
19+
)
20+
return func(self, p)
21+
return wrapper
22+
23+
824
class BasePath:
925
"""Base Path for CTERA Portal and CTERA Edge"""
1026

@@ -20,7 +36,7 @@ def __init__(self, scope, reference):
2036
if isinstance(reference, str):
2137
reference = reference.lstrip('/')
2238
self._scope = PurePosixPath(scope)
23-
self._reference = PurePosixPath(reference)
39+
self._reference = PurePosixPath(*reference) if isinstance(reference, tuple) else PurePosixPath(reference)
2440

2541
@property
2642
def scope(self):
@@ -58,6 +74,14 @@ def absolute_encode(self):
5874
def absolute_parent(self):
5975
return self.parent.as_posix()
6076

77+
@resolver
78+
def is_relative_to(self, p):
79+
return self.reference.is_relative_to(p)
80+
81+
@resolver
82+
def relative_to(self, p):
83+
return self.__class__(self.reference.relative_to(p).as_posix()) # pylint: disable=no-value-for-parameter
84+
6185
@property
6286
def extension(self):
6387
return self.reference.suffix
@@ -74,6 +98,13 @@ def join(self, p):
7498
def parts(self):
7599
return self.reference.parts
76100

101+
def __getitem__(self, key):
102+
if isinstance(key, slice):
103+
return self.__class__(self.parts[key]) # pylint: disable=no-value-for-parameter
104+
if isinstance(key, int):
105+
return self.parts[key]
106+
raise TypeError("Invalid argument type")
107+
77108
def __eq__(self, p):
78109
return self.absolute == p.absolute
79110

0 commit comments

Comments
 (0)