shareplum icon indicating copy to clipboard operation
shareplum copied to clipboard

f strings are not supported with Python 3.5

Open scottlinuxden opened this issue 5 years ago • 2 comments

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.

scottlinuxden avatar Aug 20 '20 13:08 scottlinuxden

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.

kannes avatar Aug 20 '20 14:08 kannes

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',

luffah avatar Mar 15 '21 15:03 luffah