Skip to content

Commit cb4691b

Browse files
authored
Make common Object iterable, add WebDAV propfind (#297)
1 parent 6fe391e commit cb4691b

27 files changed

Lines changed: 111 additions & 15 deletions

File tree

cterasdk/asynchronous/core/files/browser.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,9 @@ async def permalink(self, path):
115115
:param str path: Path.
116116
"""
117117
p = self.normalize(path)
118-
contents = [e async for e in await io.listdir(self._core,
119-
p.parent, 1, False, p.name, 1)] # pylint: disable=unnecessary-comprehension
120-
if contents and contents[0].name == p.name:
121-
return contents[0].permalink
118+
async for e in await io.listdir(self._core, p.parent, 1, False, p.name, 1):
119+
if e.name == p.name:
120+
return e.permalink
122121
raise FileNotFoundError('File not found.', path)
123122

124123
def normalize(self, entries):

cterasdk/asynchronous/core/types.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ def __init__( # pylint: disable=redefined-builtin, too-many-arguments
2121
self, type, guid, deleted, name, folder_id=None, modified=None,
2222
file_timestamp=None, size=None, id=None, acl=None, gvsn=None,
2323
parent_guid=None, portal_modified_date=None, virtual_portal_id=None):
24+
super().__init__()
2425
self.type = type
2526
self.guid = guid
2627
self.folder_id = folder_id

cterasdk/audit/postman.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class Collection(Object):
1515
__instance = None
1616

1717
def __init__(self):
18+
super().__init__()
1819
self.info = Info()
1920
self.item = []
2021
Collection.__instance = self
@@ -36,13 +37,15 @@ def serialize(self):
3637
class Info(Object):
3738

3839
def __init__(self):
40+
super().__init__()
3941
self.name = f'{str(uuid.uuid4())}'
4042
self.schema = "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
4143

4244

4345
class Command(Object):
4446

4547
def __init__(self, name, request):
48+
super().__init__()
4649
self.name = name
4750
self.request = request
4851
self.response = []
@@ -51,6 +54,7 @@ def __init__(self, name, request):
5154
class Request(Object):
5255

5356
def __init__(self, method, url):
57+
super().__init__()
5458
self.method = method
5559
self.header = None
5660
self.url = url
@@ -65,6 +69,7 @@ def request_body(self, data):
6569
class Header(Object):
6670

6771
def __init__(self, key, value):
72+
super().__init__()
6873
self.key = key
6974
self.value = value
7075
self.type = 'text'
@@ -159,6 +164,7 @@ class Body(Object):
159164
"""Request Body"""
160165

161166
def __init__(self, mode):
167+
super().__init__()
162168
self.mode = mode
163169

164170

@@ -217,6 +223,7 @@ def json(body):
217223
class URL(Object):
218224

219225
def __init__(self, raw, protocol, host, port, path, query):
226+
super().__init__()
220227
self.raw = raw
221228
self.protocol = protocol
222229
self.host = host

cterasdk/cio/core.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ def instance(src, dest=None):
8181
return SrcDstParam.__instance
8282

8383
def __init__(self, src, dest=None):
84+
super().__init__()
8485
self._classname = self.__class__.__name__
8586
self.src = src
8687
self.dest = dest
@@ -97,6 +98,7 @@ def instance():
9798
return ActionResourcesParam.__instance
9899

99100
def __init__(self):
101+
super().__init__()
100102
self._classname = self.__class__.__name__
101103
self.urls = []
102104
ActionResourcesParam.__instance = self # pylint: disable=unused-private-member
@@ -115,6 +117,7 @@ def instance(path, access, expire_on):
115117
return CreateShareParam.__instance
116118

117119
def __init__(self, path, access, expire_on):
120+
super().__init__()
118121
self._classname = self.__class__.__name__
119122
self.url = path
120123
self.share = Object()
@@ -131,6 +134,7 @@ def __init__(self, path, access, expire_on):
131134
class FetchResourcesParam(Object):
132135

133136
def __init__(self):
137+
super().__init__()
134138
self._classname = 'FetchResourcesParam'
135139
self.start = 0
136140
self.limit = 100

cterasdk/clients/async_requests.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,13 @@ def __init__(self, url, **kwargs):
134134
super().__init__('DELETE', url, **kwargs)
135135

136136

137+
class PropfindRequest(BaseRequest):
138+
"""PROPFIND"""
139+
140+
def __init__(self, url, **kwargs):
141+
super().__init__('PROPFIND', url, **kwargs)
142+
143+
137144
class MkcolRequest(BaseRequest):
138145
"""MKCOL"""
139146

cterasdk/clients/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def __init__(self, builder=None, session=None, settings=None, authenticator=None
6868

6969
default_settings = ClientSessionSettings()
7070
if settings:
71-
default_settings.update(**settings.kwargs)
71+
default_settings.update(**settings)
7272

7373
self._session = session if session else async_requests.Session(default_settings, TraceSettings())
7474

cterasdk/clients/clients.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ class AsyncWebDAV(AsyncClient):
5959
async def download(self, path, **kwargs):
6060
return await super().get(path, **kwargs)
6161

62+
async def propfind(self, path):
63+
request = async_requests.PropfindRequest(self._builder(path))
64+
response = await self.async_request(request)
65+
return await response.dav()
66+
6267
async def mkcol(self, path):
6368
request = async_requests.MkcolRequest(self._builder(path))
6469
response = await self.async_request(request)
@@ -175,6 +180,9 @@ async def json(self):
175180
async def xml(self):
176181
return Deserializers.XML(await self._response.read())
177182

183+
async def dav(self):
184+
return Deserializers.DAV(await self._response.read())
185+
178186
@async_requests.decorate_stream_error
179187
async def read(self, n=-1):
180188
return await self._response.content.read(n)
@@ -251,6 +259,11 @@ class WebDAV(Client):
251259
def download(self, path, **kwargs):
252260
return super().handle(path, **kwargs)
253261

262+
def propfind(self, path):
263+
request = async_requests.PropfindRequest(self._builder(path))
264+
response = self.request(request)
265+
return response.dav()
266+
254267
def mkcol(self, path):
255268
request = async_requests.MkcolRequest(self._builder(path))
256269
response = self.request(request)
@@ -403,6 +416,9 @@ def json(self): # pylint: disable=invalid-overridden-method
403416
def xml(self): # pylint: disable=invalid-overridden-method
404417
return execute(super().xml)
405418

419+
def dav(self): # pylint: disable=invalid-overridden-method
420+
return execute(super().dav)
421+
406422
@staticmethod
407423
def new():
408424
async def new_response(response):

cterasdk/clients/common.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from . import async_requests
2-
from ..convert import tojsonstr, toxmlstr, fromjsonstr, fromxmlstr
2+
from ..convert import tojsonstr, toxmlstr, fromjsonstr, fromxmlstr, fromdavxmlstr
33

44

55
class Serializers:
@@ -11,6 +11,7 @@ class Serializers:
1111
class Deserializers:
1212
JSON = fromjsonstr
1313
XML = fromxmlstr
14+
DAV = fromdavxmlstr
1415

1516

1617
class MultipartForm:

cterasdk/clients/errors.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
class ClientError(Object):
99

1010
def __init__(self, exception, message):
11+
super().__init__()
1112
self.request = Object()
1213
self.request.method = exception.request_info.method
1314
self.request.url = str(exception.request_info.real_url)

cterasdk/common/object.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,29 @@
11
import re
22
import json
33
import logging
4+
from collections.abc import MutableMapping
45

56

6-
class Object: # pylint: disable=too-many-instance-attributes
7+
class Object(MutableMapping): # pylint: disable=too-many-instance-attributes
78

8-
@property
9-
def kwargs(self):
10-
return json.loads(str(self))
9+
def __init__(self, **kwargs):
10+
for k, v in kwargs.items():
11+
setattr(self, k, v)
12+
13+
def __getitem__(self, key):
14+
return getattr(self, key)
15+
16+
def __setitem__(self, key, value):
17+
setattr(self, key, value)
18+
19+
def __delitem__(self, key):
20+
delattr(self, key)
21+
22+
def __iter__(self):
23+
return iter(self.__dict__)
24+
25+
def __len__(self):
26+
return len(self.__dict__)
1127

1228
def __str__(self):
1329
return json.dumps(self, default=lambda o: o.__dict__, indent=5)
@@ -19,6 +35,7 @@ def __repr__(self):
1935
class Device(Object):
2036

2137
def __init__(self, uid, version, firmware):
38+
super().__init__()
2239
self.namespace = 'http://www.w3.org/2001/XMLSchema-instance'
2340
self.location = '../../db/resources/db.xsd'
2441
self.id = uid

0 commit comments

Comments
 (0)