Skip to content

Commit

Permalink
Python version and flake8 fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
tomgross committed Feb 19, 2020
1 parent 15c53d3 commit ccecd3b
Show file tree
Hide file tree
Showing 10 changed files with 194 additions and 192 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ language: python
sudo: required
dist: xenial
python:
- 3.5
- 3.6
- 3.7
- 3.8
install:
- pip install -r test_requirements.txt
script:
Expand Down
3 changes: 3 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,6 @@ not_skip = __init__.py

[aliass]
test=tox

[flake8]
max-line-length = 100
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@
"Intended Audience :: Developers",
"Environment :: Web Environment",
"Programming Language :: Python",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Operating System :: OS Independent",
"License :: OSI Approved :: MIT License",
],
Expand Down
5 changes: 3 additions & 2 deletions src/pcloud/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#
from pcloud.api import PyCloud
PyCloud # pyflakes

__all__ = ['PyCloud']
PyCloud # pyflakes

__all__ = ["PyCloud"]
195 changes: 96 additions & 99 deletions src/pcloud/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@
import requests


log = logging.getLogger('pycloud')
log = logging.getLogger("pycloud")


# File open flags https://docs.pcloud.com/methods/fileops/file_open.html
O_WRITE = int('0x0002', 16)
O_CREAT = int('0x0040', 16)
O_EXCL = int('0x0080', 16)
O_TRUNC = int('0x0200', 16)
O_APPEND = int('0x0400', 16)
O_WRITE = int("0x0002", 16)
O_CREAT = int("0x0040", 16)
O_EXCL = int("0x0080", 16)
O_TRUNC = int("0x0200", 16)
O_APPEND = int("0x0400", 16)


# Exceptions
Expand All @@ -25,36 +25,36 @@ class AuthenticationError(Exception):


def main():
parser = argparse.ArgumentParser(description='pCloud command line client')
parser = argparse.ArgumentParser(description="pCloud command line client")
parser.add_argument(
'username',
help='The username for login into your pCloud account')
"username", help="The username for login into your pCloud account"
)
parser.add_argument(
'password',
help='The password for login into your pCloud account')
"password", help="The password for login into your pCloud account"
)
args = parser.parse_args()
pyc = PyCloud(args.username, args.password)
print(pyc)


class PyCloud(object):

endpoint = 'https://api.pcloud.com/'
endpoint = "https://api.pcloud.com/"

def __init__(self, username, password):
self.username = username.lower().encode('utf-8')
self.password = password.encode('utf-8')
self.username = username.lower().encode("utf-8")
self.password = password.encode("utf-8")
self.session = requests.Session()
self.auth_token = self.get_auth_token()

def _do_request(self, method, authenticate=True, json=True, **kw):
if authenticate:
params = {'auth': self.auth_token}
params = {"auth": self.auth_token}
else:
params = {}
params.update(kw)
log.debug('Doing request to %s%s', self.endpoint, method)
log.debug('Params: %s', params)
log.debug("Doing request to %s%s", self.endpoint, method)
log.debug("Params: %s", params)
resp = self.session.get(self.endpoint + method, params=params)
if json:
return resp.json()
Expand All @@ -63,56 +63,53 @@ def _do_request(self, method, authenticate=True, json=True, **kw):

# Authentication
def getdigest(self):
resp = self._do_request('getdigest', authenticate=False)
return bytes(resp['digest'], 'utf-8')
resp = self._do_request("getdigest", authenticate=False)
return bytes(resp["digest"], "utf-8")

def get_auth_token(self):
digest = self.getdigest()
passworddigest = sha1(
self.password +
bytes(sha1(self.username).hexdigest(), 'utf-8') +
digest)
self.password + bytes(sha1(self.username).hexdigest(), "utf-8") + digest
)
params = {
'getauth': 1,
'logout': 1,
'username': self.username.decode('utf-8'),
'digest': digest.decode('utf-8'),
'passworddigest': passworddigest.hexdigest()}
resp = self._do_request('userinfo', authenticate=False, **params)
if 'auth' not in resp:
raise(AuthenticationError)
return resp['auth']
"getauth": 1,
"logout": 1,
"username": self.username.decode("utf-8"),
"digest": digest.decode("utf-8"),
"passworddigest": passworddigest.hexdigest(),
}
resp = self._do_request("userinfo", authenticate=False, **params)
if "auth" not in resp:
raise (AuthenticationError)
return resp["auth"]

# Folders
@RequiredParameterCheck(('path', 'folderid'))
@RequiredParameterCheck(("path", "folderid"))
def createfolder(self, **kwargs):
return self._do_request('createfolder', **kwargs)
return self._do_request("createfolder", **kwargs)

@RequiredParameterCheck(('path', 'folderid'))
@RequiredParameterCheck(("path", "folderid"))
def listfolder(self, **kwargs):
return self._do_request('listfolder', **kwargs)
return self._do_request("listfolder", **kwargs)

@RequiredParameterCheck(('path', 'folderid'))
@RequiredParameterCheck(("path", "folderid"))
def renamefolder(self, **kwargs):
return self._do_request('renamefolder', **kwargs)
return self._do_request("renamefolder", **kwargs)

@RequiredParameterCheck(('path', 'folderid'))
@RequiredParameterCheck(("path", "folderid"))
def deletefolder(self, **kwargs):
return self._do_request('deletefolder', **kwargs)
return self._do_request("deletefolder", **kwargs)

@RequiredParameterCheck(('path', 'folderid'))
@RequiredParameterCheck(("path", "folderid"))
def deletefolderrecursive(self, **kwargs):
return self._do_request('deletefolderrecursive', **kwargs)
return self._do_request("deletefolderrecursive", **kwargs)

def _upload(self, method, files, **kwargs):
kwargs['auth'] = self.auth_token
resp = self.session.post(
self.endpoint + method,
files=files,
data=kwargs)
kwargs["auth"] = self.auth_token
resp = self.session.post(self.endpoint + method, files=files, data=kwargs)
return resp.json()

@RequiredParameterCheck(('files', 'data'))
@RequiredParameterCheck(("files", "data"))
def uploadfile(self, **kwargs):
""" upload a file to pCloud
Expand All @@ -123,123 +120,123 @@ def uploadfile(self, **kwargs):
need to specify the filename too
data='Hello pCloud', filename='foo.txt'
"""
if 'files' in kwargs:
if "files" in kwargs:
files = {}
upload_files = kwargs.pop('files')
upload_files = kwargs.pop("files")
for f in upload_files:
filename = basename(f)
files = {filename: open(f, 'rb')}
kwargs['filename'] = filename
files = {filename: open(f, "rb")}
# kwargs['filename'] = filename
else: # 'data' in kwargs:
files = {'f': (kwargs.pop('filename'), kwargs.pop('data'))}
return self._upload('uploadfile', files, **kwargs)
files = {"f": (kwargs.pop("filename"), kwargs.pop("data"))}
return self._upload("uploadfile", files, **kwargs)

@RequiredParameterCheck(('progresshash',))
@RequiredParameterCheck(("progresshash",))
def uploadprogress(self, **kwargs):
return self._do_request('uploadprogress', **kwargs)
return self._do_request("uploadprogress", **kwargs)

@RequiredParameterCheck(('links',))
@RequiredParameterCheck(("links",))
def downloadfile(self, **kwargs):
return self._do_request('downloadfile', **kwargs)
return self._do_request("downloadfile", **kwargs)

def copyfile(self, **kwargs):
pass

@RequiredParameterCheck(('path', 'fileid'))
@RequiredParameterCheck(("path", "fileid"))
def checksumfile(self, **kwargs):
return self._do_request('checksumfile', **kwargs)
return self._do_request("checksumfile", **kwargs)

@RequiredParameterCheck(('path', 'fileid'))
@RequiredParameterCheck(("path", "fileid"))
def deletefile(self, **kwargs):
return self._do_request('deletefile', **kwargs)
return self._do_request("deletefile", **kwargs)

def renamefile(self, **kwargs):
return self._do_request('renamefile', **kwargs)
return self._do_request("renamefile", **kwargs)

# Auth API methods
def sendverificationemail(self, **kwargs):
return self._do_request('sendverificationemail', **kwargs)
return self._do_request("sendverificationemail", **kwargs)

def verifyemail(self, **kwargs):
return self._do_request('verifyemail', **kwargs)
return self._do_request("verifyemail", **kwargs)

def changepassword(self, **kwargs):
return self._do_request('changepassword', **kwargs)
return self._do_request("changepassword", **kwargs)

def lostpassword(self, **kwargs):
return self._do_request('lostpassword', **kwargs)
return self._do_request("lostpassword", **kwargs)

def resetpassword(self, **kwargs):
return self._do_request('resetpassword', **kwargs)
return self._do_request("resetpassword", **kwargs)

def register(self, **kwargs):
return self._do_request('register', **kwargs)
return self._do_request("register", **kwargs)

def invite(self, **kwargs):
return self._do_request('invite', **kwargs)
return self._do_request("invite", **kwargs)

def userinvites(self, **kwargs):
return self._do_request('userinvites', **kwargs)
return self._do_request("userinvites", **kwargs)

def logout(self, **kwargs):
return self._do_request('logout', **kwargs)
return self._do_request("logout", **kwargs)

def listtokens(self, **kwargs):
return self._do_request('listtokens', **kwargs)
return self._do_request("listtokens", **kwargs)

def deletetoken(self, **kwargs):
return self._do_request('deletetoken', **kwargs)
return self._do_request("deletetoken", **kwargs)

# File API methods
@RequiredParameterCheck(('flags',))
@RequiredParameterCheck(("flags",))
def file_open(self, **kwargs):
return self._do_request('file_open', **kwargs)
return self._do_request("file_open", **kwargs)

@RequiredParameterCheck(('fd',))
@RequiredParameterCheck(("fd",))
def file_read(self, **kwargs):
return self._do_request('file_read', json=False, **kwargs)
return self._do_request("file_read", json=False, **kwargs)

@RequiredParameterCheck(('fd',))
@RequiredParameterCheck(("fd",))
def file_pread(self, **kwargs):
return self._do_request('file_pread', json=False, **kwargs)
return self._do_request("file_pread", json=False, **kwargs)

@RequiredParameterCheck(('fd', 'data'))
@RequiredParameterCheck(("fd", "data"))
def file_pread_ifmod(self, **kwargs):
return self._do_request('file_pread_ifmod', json=False, **kwargs)
return self._do_request("file_pread_ifmod", json=False, **kwargs)

@RequiredParameterCheck(('fd',))
@RequiredParameterCheck(("fd",))
def file_size(self, **kwargs):
return self._do_request('file_size', **kwargs)
return self._do_request("file_size", **kwargs)

@RequiredParameterCheck(('fd',))
@RequiredParameterCheck(("fd",))
def file_truncate(self, **kwargs):
return self._do_request('file_truncate', **kwargs)
return self._do_request("file_truncate", **kwargs)

@RequiredParameterCheck(('fd', 'data'))
@RequiredParameterCheck(("fd", "data"))
def file_write(self, **kwargs):
files = {'filename': BytesIO(kwargs['data'])}
return self._upload('file_write', files, **kwargs)
files = {"filename": BytesIO(kwargs["data"])}
return self._upload("file_write", files, **kwargs)

@RequiredParameterCheck(('fd',))
@RequiredParameterCheck(("fd",))
def file_pwrite(self, **kwargs):
return self._do_request('file_pwrite', **kwargs)
return self._do_request("file_pwrite", **kwargs)

@RequiredParameterCheck(('fd',))
@RequiredParameterCheck(("fd",))
def file_checksum(self, **kwargs):
return self._do_request('file_checksum', **kwargs)
return self._do_request("file_checksum", **kwargs)

@RequiredParameterCheck(('fd',))
@RequiredParameterCheck(("fd",))
def file_seek(self, **kwargs):
return self._do_request('file_seek', **kwargs)
return self._do_request("file_seek", **kwargs)

@RequiredParameterCheck(('fd',))
@RequiredParameterCheck(("fd",))
def file_close(self, **kwargs):
return self._do_request('file_close', **kwargs)
return self._do_request("file_close", **kwargs)

@RequiredParameterCheck(('fd',))
@RequiredParameterCheck(("fd",))
def file_lock(self, **kwargs):
return self._do_request('file_lock', **kwargs)
return self._do_request("file_lock", **kwargs)


if __name__ == '__main__':
if __name__ == "__main__":
main()
Loading

0 comments on commit ccecd3b

Please sign in to comment.