shareplum
shareplum copied to clipboard
f strings are not supported with Python 3.5
There are numerous f strings in folder.py, errors.py, and list.py that causing issues when the package imports. Those need changed to "*".format(var1, var2) calls moving forward. I changed those and shareplum now imports correctly.
Shareplum requires Python 3.6+. See https://github.com/jasonrollins/shareplum/blob/master/setup.py
Python 3.5 will not receive any more security updates starting next month, I suggest you upgrade.
Sad there is no retro compatibility within the same major python version.
If don't want to break your system (if you use stretch or older — see debian rules "Don't suffer shiny new stuff"); it is better to install python3.6 or later from the tarball in virtual env.
For others, a patch similar of what you did:
diff -u --strip-trailing-cr shareplum.bak/errors.py shareplum/errors.py
--- shareplum.bak/errors.py 2021-03-15 11:36:07.600624653 +0100
+++ shareplum/errors.py 2021-03-15 16:19:02.630614320 +0100
@@ -1,7 +1,7 @@
class ShareplumError(Exception):
def __init__(self, msg, details=None):
if details:
- super().__init__(f"{msg} : {details}")
+ super().__init__("%s : %s" % (msg, details))
else:
super().__init__(msg)
diff -u --strip-trailing-cr shareplum.bak/folder.py shareplum/folder.py
--- shareplum.bak/folder.py 2021-03-15 11:36:07.600624653 +0100
+++ shareplum/folder.py 2021-03-15 16:18:21.206683163 +0100
@@ -23,7 +23,7 @@
update_data['ServerRelativeUrl'] = self.folder_name
body = json.dumps(update_data)
- url = self.site_url + f"/_api/web/folders"
+ url = self.site_url + "/_api/web/folders"
headers = {'Accept': 'application/json;odata=verbose',
'Content-Type': 'application/json;odata=verbose',
@@ -35,7 +35,7 @@
def delete_folder(self, relative_url):
if relative_url == self.folder_name:
- url = self.site_url + f"/_api/web/GetFolderByServerRelativeUrl('{self.folder_name}')"
+ url = self.site_url + "/_api/web/GetFolderByServerRelativeUrl('%s)" % self.folder_name
headers = {'Accept': 'application/json;odata=verbose',
'If-Match': '*',
@@ -48,8 +48,9 @@
print('You must pass the relative folder url to delete a folder')
def delete_file(self, file_name):
- url = self.site_url + f"/_api/web/GetFileByServerRelativeUrl('{self.info['d']['ServerRelativeUrl']}/{file_name}')"
-
+ url = self.site_url + "/_api/web/GetFileByServerRelativeUrl('%s/%s')" % (
+ self.info['d']['ServerRelativeUrl'], file_name
+ )
headers = {'Accept': 'application/json;odata=verbose',
'If-Match': '*',
'X-HTTP-Method': 'DELETE',
@@ -60,36 +61,36 @@
@property
def items(self):
- response = get(self._session, self.site_url + f"/_api/web/GetFolderByServerRelativeUrl('{self.folder_name}')/ListItemAllFields")
+ response = get(self._session, self.site_url + "/_api/web/GetFolderByServerRelativeUrl('%s')/ListItemAllFields" % self.folder_name)
return response.json()
@property
def files(self):
- response = get(self._session, self.site_url + f"/_api/web/GetFolderByServerRelativeUrl('{self.folder_name}')/files")
+ response = get(self._session, self.site_url + "/_api/web/GetFolderByServerRelativeUrl('%s')/files" % self.folder_name)
return response.json()['value']
@property
def folders(self):
- response = get(self._session, self.site_url + f"/_api/web/GetFolderByServerRelativeUrl('{self.folder_name}')/folders")
+ response = get(self._session, self.site_url + "/_api/web/GetFolderByServerRelativeUrl('%s')/folders" % self.folder_name)
return [entry['Name'] for entry in response.json()['value']]
def upload_file(self, content, file_name):
- url = self.site_url + f"/_api/web/GetFolderByServerRelativeUrl('{self.folder_name}')/Files/add(url='{file_name}',overwrite=true)"
+ url = self.site_url + "/_api/web/GetFolderByServerRelativeUrl('%s')/Files/add(url='%s',overwrite=true)" % (self.folder_name, file_name)
headers = {'X-RequestDigest': self.contextinfo['FormDigestValue']}
post(self._session, url=url, headers=headers, data=content, timeout=self.timeout)
def check_out(self, file_name):
- url = self.site_url + f"/_api/web/GetFileByServerRelativeUrl('{self.info['d']['ServerRelativeUrl']}/{file_name}')/CheckOut()"
+ url = self.site_url + "/_api/web/GetFileByServerRelativeUrl('%s/%s')/CheckOut()" % (self.info['d']['ServerRelativeUrl'], file_name)
headers = {'X-RequestDigest': self.contextinfo['FormDigestValue']}
post(self._session, url=url, headers=headers)
def check_in(self, file_name, comment):
- url = self.site_url + f"/_api/web/GetFileByServerRelativeUrl('{self.info['d']['ServerRelativeUrl']}/{file_name}')/CheckIn(comment='{comment}',checkintype=0)"
+ url = self.site_url + "/_api/web/GetFileByServerRelativeUrl('%s/%s')/CheckIn(comment='%s',checkintype=0)" % (self.info['d']['ServerRelativeUrl'], file_name, comment)
headers = {'X-RequestDigest': self.contextinfo['FormDigestValue']}
post(self._session, url=url, headers=headers)
def get_file(self, file_name):
- response = get(self._session, self.site_url + f"/_api/web/GetFileByServerRelativeUrl('{self.info['d']['ServerRelativeUrl']}/{file_name}')/$value")
+ response = get(self._session, self.site_url + "/_api/web/GetFileByServerRelativeUrl(''%s/%s')/$value") % (self.info['d']['ServerRelativeUrl'], file_name)
return response.content
diff -u --strip-trailing-cr shareplum.bak/list.py shareplum/list.py
--- shareplum.bak/list.py 2021-03-15 11:36:07.600624653 +0100
+++ shareplum/list.py 2021-03-15 16:09:34.879555150 +0100
@@ -521,7 +521,7 @@
self.version = "v365"
def _get_schema(self):
- url = self.site_url + f"/_api/lists/getbytitle('{self.list_name}')/RenderListDataAsStream"
+ url = self.site_url + "/_api/lists/getbytitle('%s')/RenderListDataAsStream" % self.list_name
body = json.dumps({"parameters": {"RenderOptions": 4}})
@@ -556,7 +556,7 @@
update_data['StaticName'] = static_name
body = json.dumps(update_data)
- url = self.site_url + f"/_api/lists/getbytitle('{self.list_name}')/Fields"
+ url = self.site_url + "/_api/lists/getbytitle('%s')/Fields" % self.list_name
headers = {'Accept': 'application/json;odata=verbose',
'Content-Type': 'application/json;odata=verbose',