From adc44f45a2e3f2763e78d4a8f7c6c44c490cc3fd Mon Sep 17 00:00:00 2001 From: zming <517046497@qq.com> Date: Fri, 2 Feb 2018 11:16:36 +0800 Subject: [PATCH 01/39] update tests --- seafileapi/repos.py | 4 ++-- tests/fixtures.py | 3 +-- tests/test_repos.py | 4 +--- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/seafileapi/repos.py b/seafileapi/repos.py index 1005d7eae6..70a8fa7e47 100644 --- a/seafileapi/repos.py +++ b/seafileapi/repos.py @@ -5,8 +5,8 @@ class Repos(object): def __init__(self, client): self.client = client - def create_repo(self, name, desc, password=None): - data = {'name': name, 'desc': desc} + def create_repo(self, name, password=None): + data = {'name': name} if password: data['passwd'] = password repo_json = self.client.post('/api2/repos/', data=data).json() diff --git a/tests/fixtures.py b/tests/fixtures.py index 950f5a0a26..9247e3243b 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -19,8 +19,7 @@ def client(): @pytest.yield_fixture(scope='function') def repo(client): repo_name = 'tmp-测试资料库-%s' % randstring() - repo_desc = 'tmp, 一个测试资料库-%s' % randstring() - repo = client.repos.create_repo(repo_name, repo_desc) + repo = client.repos.create_repo(repo_name) try: yield repo finally: diff --git a/tests/test_repos.py b/tests/test_repos.py index 907f564ef2..d1ab6421d7 100644 --- a/tests/test_repos.py +++ b/tests/test_repos.py @@ -25,11 +25,9 @@ def test_list_repos(client): def _create_repo(client, password=None): repo_name = '测试资料库-%s' % randstring() - repo_desc = '一个测试资料库-%s' % randstring() - repo = client.repos.create_repo(repo_name, repo_desc, password=password) + repo = client.repos.create_repo(repo_name, password=password) assert repo.name == repo_name - assert repo.desc == repo_desc assert len(repo.id) == 36 assert repo.encrypted == (password is not None) assert repo.owner == 'self' From b2f5745197749ac7aa209f99c9694d4475bce5e1 Mon Sep 17 00:00:00 2001 From: Dongsu Park Date: Thu, 28 May 2015 18:40:54 +0200 Subject: [PATCH 02/39] functests.sh: use py.test instead of nosetests --- functests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functests.sh b/functests.sh index 1dc19989ca..6982768ce6 100755 --- a/functests.sh +++ b/functests.sh @@ -18,4 +18,4 @@ SRCDIR=$(dirname "${SCRIPT}") cd "${SRCDIR}" -nosetests $@ +py.test $@ From 6d9c73d9b1a6a641dcb4ca0dbd69c987812d34ea Mon Sep 17 00:00:00 2001 From: Dongsu Park Date: Sat, 30 May 2015 17:43:45 +0200 Subject: [PATCH 03/39] seafileapi: implement rename, moveTo, copyTo methods implement methods in the class _SeafDirentBase: rename(), moveTo(), and copyTo(). --- seafileapi/files.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/seafileapi/files.py b/seafileapi/files.py index 6cc273edaf..ff7e412106 100644 --- a/seafileapi/files.py +++ b/seafileapi/files.py @@ -39,14 +39,34 @@ def delete(self): resp = self.client.delete(url) return resp - def rename(self): - pass + def rename(self, newname): + """Change filename to newname + """ + url = '/api2/repos/%s/file/' % self.repo.id + querystr(p=self.path) + postdata = {'operation': 'rename', 'newname': newname} + resp = self.client.post(url, data=postdata) + self.id = resp.headers['oid'] - def copyTo(self, dst_dir, dst_repo=None): - pass + def copyTo(self, file_names, dst_dir, dst_repo=None): + """Copy filename to newname (also to a different directory) + """ + src_dir = os.path.dirname(self.path) + url = '/api2/repos/%s/fileops/copy/' % self.repo.id + querystr(p=src_dir) + if dst_repo is None: + dst_repo = self.repo.id + postdata = {'operation': 'copy', 'file_names': file_names, 'dst_repo': dst_repo, 'dst_dir': dst_dir} + resp = self.client.post(url, data=postdata) + self.id = resp.headers['oid'] def moveTo(self, dst_dir, dst_repo=None): - pass + """Move filename to newname (also to a different directory) + """ + url = '/api2/repos/%s/file/' % self.repo.id + querystr(p=self.path) + if dst_repo is None: + dst_repo = self.repo.id + postdata = {'operation': 'move', 'dst_repo': dst_repo, 'dst_dir': dst_dir} + resp = self.client.post(url, data=postdata) + self.id = resp.headers['oid'] def get_share_link(self): pass From 14faea64fbf1063b5b97753259df85e4c240ba73 Mon Sep 17 00:00:00 2001 From: Dongsu Park Date: Tue, 2 Jun 2015 17:20:37 +0200 Subject: [PATCH 04/39] seafileapi: make moveTo, rename update self.path self.path should be also updated after renaming/moving a file. --- seafileapi/files.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/seafileapi/files.py b/seafileapi/files.py index ff7e412106..0434de2e2c 100644 --- a/seafileapi/files.py +++ b/seafileapi/files.py @@ -46,6 +46,7 @@ def rename(self, newname): postdata = {'operation': 'rename', 'newname': newname} resp = self.client.post(url, data=postdata) self.id = resp.headers['oid'] + self.path = os.path.join(os.path.dirname(self.path), newname) def copyTo(self, file_names, dst_dir, dst_repo=None): """Copy filename to newname (also to a different directory) @@ -67,6 +68,7 @@ def moveTo(self, dst_dir, dst_repo=None): postdata = {'operation': 'move', 'dst_repo': dst_repo, 'dst_dir': dst_dir} resp = self.client.post(url, data=postdata) self.id = resp.headers['oid'] + self.path = os.path.join(dst_dir, os.path.basename(self.path)) def get_share_link(self): pass From 6afb351e31129ab4f9b195120ff496519ed36542 Mon Sep 17 00:00:00 2001 From: Dongsu Park Date: Tue, 2 Jun 2015 17:33:23 +0200 Subject: [PATCH 05/39] tests: add a test for rename, moveTo, copyTo --- tests/test_files.py | 60 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/tests/test_files.py b/tests/test_files.py index e862757e40..94a87b0341 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -88,3 +88,63 @@ def test_upload_string_as_file_content(repo): f = rootdir.upload(fcontent, fname) assert f.name == fname assert f.get_content() == fcontent + +'/测试目录一-%s' % randstring() +@pytest.mark.parametrize('parentpath', [ + '/', + '/seafdir-%s' % randstring() +]) +def test_rename_move_copy(repo, parentpath): + rootdir = repo.get_dir('/') + assert len(rootdir.ls()) == 0 + + if parentpath == '/': + parentdir = rootdir + else: + parentdir = rootdir.mkdir(parentpath[1:]) + + # create a file + testfile = parentdir.create_empty_file('测试文件-%s.txt' % randstring()) + assert testfile.size == 0 + + entries = parentdir.ls(force_refresh=True) + assert len(entries) == 1 + + entry = entries[0] + assert entry.path == testfile.path + assert entry.id == testfile.id + assert entry.size == testfile.size + + # rename a file + newfname = 'newfile.txt' + testfile.rename(newfname) + assert testfile.name == newfname + + # create a folder + testdir = parentdir.mkdir('测试目录-%s' % randstring()) + assert len(parentdir.ls()) == 2 + assert len(testdir.ls()) == 0 + + direntry = [entry for entry in parentdir.ls() if entry.isdir][0] + assert direntry.path == testdir.path + + # move a file to the new folder + testfile.moveTo(testdir.name, dst_repo=None) + + assert testfile.name == newfname + fileentry = [entry for entry in testdir.ls() if not entry.isdir][0] + assert fileentry.path == testfile.path + + # copy a file to the parent folder + filenames.append(testfile) + testfile.copyTo(filenames, parentdir.name, dst_repo=None) + + assert testfile.name == newfname + fileentry = [entry for entry in parentdir.ls() if not entry.isdir][0] + assert fileentry.path == testfile.path + + # clean up test directories / files + testfile.delete() + assert len(parentdir.ls(force_refresh=True)) == 1 + testdir.delete() + assert len(parentdir.ls(force_refresh=True)) == 0 From 4f7aac5d1a6ea9bc7e434773b8bcad7112e4d233 Mon Sep 17 00:00:00 2001 From: Dongsu Park Date: Tue, 2 Jun 2015 17:47:59 +0200 Subject: [PATCH 06/39] functests.sh: add a missing export call for SEAFILE_TEST_SERVER_ADDRESS --- functests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/functests.sh b/functests.sh index 6982768ce6..b73af57951 100755 --- a/functests.sh +++ b/functests.sh @@ -8,6 +8,7 @@ : ${SEAFILE_TEST_ADMIN_USERNAME="admin@seafiletest.com"} : ${SEAFILE_TEST_ADMIN_PASSWORD="adminadmin"} +export SEAFILE_TEST_SERVER_ADDRESS export SEAFILE_TEST_USERNAME export SEAFILE_TEST_PASSWORD export SEAFILE_TEST_ADMIN_USERNAME From 07792a4796e9d16787db1dc08ece77cc96d373d2 Mon Sep 17 00:00:00 2001 From: zming <517046497@qq.com> Date: Fri, 2 Feb 2018 16:15:26 +0800 Subject: [PATCH 07/39] update --- seafileapi/files.py | 79 ++++++++---- tests/test_files.py | 293 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 311 insertions(+), 61 deletions(-) diff --git a/seafileapi/files.py b/seafileapi/files.py index 0434de2e2c..d36f2ea5c6 100644 --- a/seafileapi/files.py +++ b/seafileapi/files.py @@ -40,35 +40,66 @@ def delete(self): return resp def rename(self, newname): - """Change filename to newname + """Change file/folder name to newname """ - url = '/api2/repos/%s/file/' % self.repo.id + querystr(p=self.path) + suffix = 'dir' if self.isdir else 'file' + url = '/api2/repos/%s/%s/' % (self.repo.id, suffix) + querystr(p=self.path, reloaddir='true') postdata = {'operation': 'rename', 'newname': newname} resp = self.client.post(url, data=postdata) - self.id = resp.headers['oid'] - self.path = os.path.join(os.path.dirname(self.path), newname) - - def copyTo(self, file_names, dst_dir, dst_repo=None): - """Copy filename to newname (also to a different directory) + succeeded = resp.status_code == 200 + if succeeded: + if self.isdir: + new_dirent = self.repo.get_dir(os.path.join(os.path.dirname(self.path), newname)) + else: + new_dirent = self.repo.get_file(os.path.join(os.path.dirname(self.path), newname)) + for key in self.__dict__.keys(): + self.__dict__[key] = new_dirent.__dict__[key] + return succeeded + + def _copy_move_task(self, operation, dirent_type, dst_dir, dst_repo_id=None): + url = '/api/v2.1/copy-move-task/' + src_repo_id = self.repo.id + src_parent_dir = os.path.dirname(self.path) + src_dirent_name = os.path.basename(self.path) + dst_repo_id = dst_repo_id + dst_parent_dir = dst_dir + operation = operation + dirent_type = dirent_type + postdata = {'src_repo_id': src_repo_id, 'src_parent_dir': src_parent_dir, + 'src_dirent_name': src_dirent_name, 'dst_repo_id': dst_repo_id, + 'dst_parent_dir': dst_parent_dir, 'operation': operation, + 'dirent_type': dirent_type} + return self.client.post(url, data=postdata) + + def copyTo(self, dst_dir, dst_repo_id=None): + """Copy file/folder to other directory (also to a different repo) """ - src_dir = os.path.dirname(self.path) - url = '/api2/repos/%s/fileops/copy/' % self.repo.id + querystr(p=src_dir) - if dst_repo is None: - dst_repo = self.repo.id - postdata = {'operation': 'copy', 'file_names': file_names, 'dst_repo': dst_repo, 'dst_dir': dst_dir} - resp = self.client.post(url, data=postdata) - self.id = resp.headers['oid'] - - def moveTo(self, dst_dir, dst_repo=None): - """Move filename to newname (also to a different directory) + if dst_repo_id is None: + dst_repo_id = self.repo.id + + dirent_type = 'dir' if self.isdir else 'file' + resp = self._copy_move_task('copy', dirent_type, dst_dir, dst_repo_id) + return resp.status_code == 200 + + def moveTo(self, dst_dir, dst_repo_id=None): + """Move file/folder to other directory (also to a different repo) """ - url = '/api2/repos/%s/file/' % self.repo.id + querystr(p=self.path) - if dst_repo is None: - dst_repo = self.repo.id - postdata = {'operation': 'move', 'dst_repo': dst_repo, 'dst_dir': dst_dir} - resp = self.client.post(url, data=postdata) - self.id = resp.headers['oid'] - self.path = os.path.join(dst_dir, os.path.basename(self.path)) + if dst_repo_id is None: + dst_repo_id = self.repo.id + + dirent_type = 'dir' if self.isdir else 'file' + resp = self._copy_move_task('move', dirent_type, dst_dir, dst_repo_id) + succeeded = resp.status_code == 200 + if succeeded: + new_repo = self.client.repos.get_repo(dst_repo_id) + dst_path = os.path.join(dst_dir, os.path.basename(self.path)) + if self.isdir: + new_dirent = new_repo.get_dir(dst_path) + else: + new_dirent = new_repo.get_file(dst_path) + for key in self.__dict__.keys(): + self.__dict__[key] = new_dirent.__dict__[key] + return succeeded def get_share_link(self): pass diff --git a/tests/test_files.py b/tests/test_files.py index 94a87b0341..5509da09bc 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -1,5 +1,6 @@ #coding: UTF-8 +import os import pytest from tests.utils import randstring, datafile, filesize @@ -10,7 +11,7 @@ ]) def test_create_delete_file_dir(repo, parentpath): rootdir = repo.get_dir('/') - assert len(rootdir.ls()) == 0 + assert len(rootdir.ls(force_refresh=True)) == 0 if parentpath == '/': parentdir = rootdir @@ -31,10 +32,10 @@ def test_create_delete_file_dir(repo, parentpath): # create a folder testdir = parentdir.mkdir('测试目录-%s' % randstring()) - assert len(parentdir.ls()) == 2 - assert len(testdir.ls()) == 0 + assert len(parentdir.ls(force_refresh=True)) == 2 + assert len(testdir.ls(force_refresh=True)) == 0 - direntry = [entry for entry in parentdir.ls() if entry.isdir][0] + direntry = [e for e in parentdir.ls(force_refresh=True) if e.isdir][0] assert direntry.path == testdir.path testfile.delete() @@ -49,7 +50,7 @@ def test_create_delete_file_dir(repo, parentpath): ]) def test_upload_file(repo, parentpath): rootdir = repo.get_dir('/') - assert len(rootdir.ls()) == 0 + assert len(rootdir.ls(force_refresh=True)) == 0 if parentpath == '/': parentdir = rootdir @@ -89,14 +90,14 @@ def test_upload_string_as_file_content(repo): assert f.name == fname assert f.get_content() == fcontent -'/测试目录一-%s' % randstring() @pytest.mark.parametrize('parentpath', [ '/', - '/seafdir-%s' % randstring() + #'/测试目录一-%s' % randstring() + '/qweqwe%s' % randstring() ]) -def test_rename_move_copy(repo, parentpath): +def test_rename_file(repo, parentpath): rootdir = repo.get_dir('/') - assert len(rootdir.ls()) == 0 + assert len(rootdir.ls(force_refresh=True)) == 0 if parentpath == '/': parentdir = rootdir @@ -107,44 +108,262 @@ def test_rename_move_copy(repo, parentpath): testfile = parentdir.create_empty_file('测试文件-%s.txt' % randstring()) assert testfile.size == 0 - entries = parentdir.ls(force_refresh=True) - assert len(entries) == 1 - - entry = entries[0] - assert entry.path == testfile.path - assert entry.id == testfile.id - assert entry.size == testfile.size + assert len(parentdir.ls(force_refresh=True)) == 1 # rename a file newfname = 'newfile.txt' testfile.rename(newfname) - assert testfile.name == newfname + assert newfname == testfile.name + +@pytest.mark.parametrize('parentpath', [ + '/', + '/测试目录一-%s' % randstring() +]) +def test_rename_folder(repo, parentpath): + rootdir = repo.get_dir('/') + assert len(rootdir.ls(force_refresh=True)) == 0 + + if parentpath == '/': + parentdir = rootdir + else: + parentdir = rootdir.mkdir(parentpath[1:]) # create a folder - testdir = parentdir.mkdir('测试目录-%s' % randstring()) - assert len(parentdir.ls()) == 2 - assert len(testdir.ls()) == 0 + testfolder = parentdir.mkdir('测试文件夹-%s' % randstring()) + assert testfolder.size == 0 - direntry = [entry for entry in parentdir.ls() if entry.isdir][0] - assert direntry.path == testdir.path + assert len(parentdir.ls(force_refresh=True)) == 1 - # move a file to the new folder - testfile.moveTo(testdir.name, dst_repo=None) + # rename a file + newfname = 'newfolder' + testfolder.rename(newfname) + assert newfname == testfolder.name - assert testfile.name == newfname - fileentry = [entry for entry in testdir.ls() if not entry.isdir][0] - assert fileentry.path == testfile.path +@pytest.mark.parametrize('parentpath', [ + '/', + '/测试目录一-%s' % randstring() +]) +def test_copy_file(repo, parentpath): + rootdir = repo.get_dir('/') + assert len(rootdir.ls(force_refresh=True)) == 0 - # copy a file to the parent folder - filenames.append(testfile) - testfile.copyTo(filenames, parentdir.name, dst_repo=None) + if parentpath == '/': + parentdir = rootdir + else: + parentdir = rootdir.mkdir(parentpath[1:]) - assert testfile.name == newfname - fileentry = [entry for entry in parentdir.ls() if not entry.isdir][0] - assert fileentry.path == testfile.path + # create a file + testfile = parentdir.create_empty_file('测试文件-%s.txt' % randstring()) + assert testfile.size == 0 - # clean up test directories / files - testfile.delete() assert len(parentdir.ls(force_refresh=True)) == 1 - testdir.delete() - assert len(parentdir.ls(force_refresh=True)) == 0 + + tempfolder = parentdir.mkdir('tempfolder_%s' % randstring()) + assert len(tempfolder.ls(force_refresh=True)) == 0 + testfile.copyTo(tempfolder.path) + assert len(tempfolder.ls(force_refresh=True)) == 1 + assert os.path.basename(tempfolder.ls(force_refresh=True)[-1].path) == os.path.basename(testfile.path) + +@pytest.mark.parametrize('parentpath', [ + '/', + '/测试目录一-%s' % randstring() +]) +def test_copy_file_to_other_repo(client, repo, parentpath): + rootdir = repo.get_dir('/') + assert len(rootdir.ls(force_refresh=True)) == 0 + + if parentpath == '/': + parentdir = rootdir + else: + parentdir = rootdir.mkdir(parentpath[1:]) + + # create a file + testfile = parentdir.create_empty_file('测试文件-%s.txt' % randstring()) + assert testfile.size == 0 + + assert len(parentdir.ls(force_refresh=True)) == 1 + + temp_repo = client.repos.create_repo('temp_repo') + try: + root_dir = temp_repo.get_dir('/') + temp_dir = root_dir.mkdir('temp_dir') + assert len(temp_dir.ls(force_refresh=True)) == 0 + testfile.copyTo(temp_dir.path, temp_repo.id) + assert len(temp_dir.ls(force_refresh=True)) == 1 + assert os.path.basename(temp_dir.ls(force_refresh=True)[0].path) == os.path.basename(testfile.path) + finally: + temp_repo.delete() + +@pytest.mark.parametrize('parentpath', [ + '/', + '/测试目录一-%s' % randstring() +]) +def test_copy_folder(repo, parentpath): + rootdir = repo.get_dir('/') + assert len(rootdir.ls(force_refresh=True)) == 0 + + if parentpath == '/': + parentdir = rootdir + else: + parentdir = rootdir.mkdir(parentpath[1:]) + + # create a folder + testfolder = parentdir.mkdir('测试文件夹-%s' % randstring()) + assert testfolder.size == 0 + tempfolder = parentdir.mkdir('temp-folder-%s' % randstring()) + assert tempfolder.size == 0 + + assert len(tempfolder.ls(force_refresh=True)) == 0 + assert len(parentdir.ls(force_refresh=True)) == 2 + + # copy a file + testfolder.copyTo(tempfolder.path) + assert len(tempfolder.ls(force_refresh=True)) == 1 + assert os.path.basename(tempfolder.ls(force_refresh=True)[0].path) == os.path.basename(testfolder.path) + +@pytest.mark.parametrize('parentpath', [ + '/', + '/测试目录一-%s' % randstring() +]) +def test_copy_folder_to_other_repo(client, repo, parentpath): + rootdir = repo.get_dir('/') + assert len(rootdir.ls(force_refresh=True)) == 0 + + if parentpath == '/': + parentdir = rootdir + else: + parentdir = rootdir.mkdir(parentpath[1:]) + + # create a folder + testfolder = parentdir.mkdir('测试文件夹-%s' % randstring()) + assert testfolder.size == 0 + + assert len(parentdir.ls(force_refresh=True)) == 1 + + temp_repo = client.repos.create_repo('temp_repo') + try: + root_folder = temp_repo.get_dir('/') + tempfolder = root_folder.mkdir('tempfolder') + + assert len(tempfolder.ls(force_refresh=True)) == 0 + # copy a folder + testfolder.copyTo(tempfolder.path, temp_repo.id) + assert len(tempfolder.ls(force_refresh=True)) == 1 + assert os.path.basename(tempfolder.ls(force_refresh=True)[0].path) == os.path.basename(testfolder.path) + finally: + temp_repo.delete() + +@pytest.mark.parametrize('parentpath', [ + '/', + '/测试目录一-%s' % randstring() +]) +def test_move_file(repo, parentpath): + rootdir = repo.get_dir('/') + assert len(rootdir.ls(force_refresh=True)) == 0 + + if parentpath == '/': + parentdir = rootdir + else: + parentdir = rootdir.mkdir(parentpath[1:]) + + # create a file + testfile = parentdir.create_empty_file('测试文件-%s.txt' % randstring()) + assert testfile.size == 0 + + assert len(parentdir.ls(force_refresh=True)) == 1 + + tempfolder = parentdir.mkdir('tempfolder_%s' % randstring()) + assert len(tempfolder.ls(force_refresh=True)) == 0 + + testfile.moveTo(tempfolder.path) + assert testfile.path == os.path.join(tempfolder.path, os.path.basename(testfile.path)) + assert len(tempfolder.ls(force_refresh=True)) == 1 + +@pytest.mark.parametrize('parentpath', [ + '/', + '/测试目录一-%s' % randstring() +]) +def test_move_file_to_other_repo(client, repo, parentpath): + rootdir = repo.get_dir('/') + assert len(rootdir.ls(force_refresh=True)) == 0 + + if parentpath == '/': + parentdir = rootdir + else: + parentdir = rootdir.mkdir(parentpath[1:]) + + # create a file + testfile = parentdir.create_empty_file('测试文件-%s.txt' % randstring()) + assert testfile.size == 0 + + assert len(parentdir.ls(force_refresh=True)) == 1 + + temp_repo = client.repos.create_repo('temp_repo') + try: + root_dir = temp_repo.get_dir('/') + temp_dir = root_dir.mkdir('temp_dir') + assert len(temp_dir.ls(force_refresh=True)) == 0 + testfile.moveTo(temp_dir.path, temp_repo.id) + assert testfile.path == os.path.join(temp_dir.path, os.path.basename(testfile.path)) + assert len(temp_dir.ls(force_refresh=True)) == 1 + assert testfile.repo.id == temp_repo.id + finally: + temp_repo.delete() + +@pytest.mark.parametrize('parentpath', [ + '/', + '/测试目录一-%s' % randstring() +]) +def test_move_folder(repo, parentpath): + rootdir = repo.get_dir('/') + assert len(rootdir.ls(force_refresh=True)) == 0 + + if parentpath == '/': + parentdir = rootdir + else: + parentdir = rootdir.mkdir(parentpath[1:]) + + # create a folder + testfolder = parentdir.mkdir('测试文件夹-%s' % randstring()) + assert testfolder.size == 0 + tempfolder = parentdir.mkdir('temp-folder-%s' % randstring()) + assert tempfolder.size == 0 + + assert len(parentdir.ls(force_refresh=True)) == 2 + + # move a folder + testfolder.moveTo(tempfolder.path) + assert testfolder.path == os.path.join(tempfolder.path, os.path.basename(testfolder.path)) + +@pytest.mark.parametrize('parentpath', [ + '/', + '/测试目录一-%s' % randstring() +]) +def test_move_folder_to_other_repo(client, repo, parentpath): + rootdir = repo.get_dir('/') + assert len(rootdir.ls(force_refresh=True)) == 0 + + if parentpath == '/': + parentdir = rootdir + else: + parentdir = rootdir.mkdir(parentpath[1:]) + + # create a folder + testfolder = parentdir.mkdir('测试文件夹-%s' % randstring()) + assert testfolder.size == 0 + + assert len(parentdir.ls(force_refresh=True)) == 1 + + temp_repo = client.repos.create_repo('temp_repo') + try: + root_folder = temp_repo.get_dir('/') + tempfolder = root_folder.mkdir('tempfolder') + + assert len(tempfolder.ls(force_refresh=True)) == 0 + # move a folder + testfolder.moveTo(tempfolder.path, temp_repo.id) + assert testfolder.path == os.path.join(tempfolder.path, os.path.basename(testfolder.path)) + assert testfolder.repo.id == temp_repo.id + assert len(tempfolder.ls(force_refresh=True)) == 1 + finally: + temp_repo.delete() From 9744abe88d736e11faf1583fd56131ca2925de82 Mon Sep 17 00:00:00 2001 From: zming <517046497@qq.com> Date: Wed, 31 Jan 2018 18:09:10 +0800 Subject: [PATCH 08/39] public document --- doc.md | 468 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 468 insertions(+) create mode 100644 doc.md diff --git a/doc.md b/doc.md new file mode 100644 index 0000000000..abf9479110 --- /dev/null +++ b/doc.md @@ -0,0 +1,468 @@ +# Python Seafile +

+

+ +# Python Seafile +## Get Client ## +**Request Parameters** + +* server +* username +* password + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') +``` + +**Return Type** + +A Client Object + +## SeafFile ## +### Get Content ### + +**Request Parameters** + +None + +**Sample Case** + + + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seaffile = repo.get_file('/root/test.md') + + content = seaffile.get_content() +``` + +**Return Type** + +File Content + +### Delete a file ### +**Request Parameters** + +None + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seaffile = repo.get_file('/root/test.md') + + seaffile.delete() +``` + +**Return Type** + +A Response Instance + +## SeafDir ## +### List ### +**Request Parameters** + +* force_refresh (default False) + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seafdir = repo.get_dir('/root') + + lst = seafdir.ls(force_refresh=True) + print lst + Out >>> [SeafDir[repo=01ccc4,path=/Seahub/6.1.x,entries=14], + SeafDir[repo=01ccc4,path=/Seahub/6.2.2-pro,entries=1], + SeafDir[repo=01ccc4,path=/Seahub/6.2.3,entries=15], + SeafDir[repo=01ccc4,path=/Seahub/6.2.x,entries=5], + SeafFile[repo=01ccc4,path=/Seahub/.DS_Store,size=6148], + SeafFile[repo=01ccc4,path=/Seahub/error.md,size=127], + SeafFile[repo=01ccc4,path=/Seahub/preview-research.md,size=1030]] + + print [dirent.name for dirent in lst] + Out >>> ['6.1.x', + '6.2.2-pro', + '6.2.3', + '6.2.x', + '.DS_Store', + 'error.md', + 'preview-research.md'] +``` + +**Return Type** + +List of SeafDir and SeafFile + +### Create Empty File ### +**Request Parameters** + +* name + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seafdir = repo.get_dir('/root') + + new_file = seafdir.create_empty_file('tmp_file.md') +``` + +**Return Type** + +A SeafFile Object of new empty file + +### Create New Folder ### +**Request Parameters** + +* name + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seafdir = repo.get_dir('/root') + + new_dir = seafdir.mkdir('tmp_dir') +``` + +**Return Type** + +A SeafDir Object of new dir + +### Upload ### +**Request Parameters** +* fileobj +* filename + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seafdir = repo.get_dir('/root') + + file = seafdir.upload('this is file content', 'tmp_file.md') +``` + +**Return Type** + +A SeafFile Object of upload file + + +### Upload Local File ### +**Request Parameters** + +* filepath +* name (default None, default use local file name) + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seafdir = repo.get_dir('/root') + + file = seafdir.upload_local_file('/home/ubuntu/env.md') +``` + +**Return Type** + +A SeafFile Object of upload file + +**Exception** + +* Local file does not exist. + +### delete a folder ### +**Request Parameters** + +None + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seafdir = repo.get_dir('/root') + + seafdir.delete() +``` + +**Return Type** + +A Response Instance + +## Repo ## +### From Json ### +**Request Parameters** + +* client +* repo_json + +**Sample Case** + +```python + + import seafileapi + from seafileapi.repo import Repo + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo_json = {'id': '09c16e2a-ff1a-4207-99f3-1351c3f1e507', 'name': 'test_repo', 'encrypted': False, 'permission': 'rw', 'owner': 'test@admin.com'} + repo = Repo.from_json(client, repo_json) +``` + + +**Return Type** + +A Repo Object + +### Is ReadOnly ### + +**Request Parameters** + +None + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + is_readonly = repo.is_readonly() +``` + +**Return Type** + +True or False + +### Get File ### + +**Request Parameters** + +* path + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seaffile = repo.get_file('/root/test.md') +``` + +**Return Type** + +A SeafFile Object + +**Exception** + +* File does not exist. + +### Get Dir ### + +**Request Parameters** + +* path + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seafdir = repo.get_dir('/root') +``` + +**Return Type** + +A SeafDir Object + +**Exception** + +* Dir does not exist. + +### Delete Repo ### + +**Request Parameters** + +None + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + repo.delete() +``` + +**Return Type** + +None + + +## Repos ## +### Get Repo ### +**Request Parameters** + +* repo_id + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') +``` + +**Return Type** + +A Repo Object + +**Exception** + +* Repo does not exist. + +### List Repo ### + +**Request Parameters** + +None + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo_list = client.repos.list_repos() + + print repo_list + Out >>> [, + , + , + , + , + ] + + print [repo.name for repo in repo_list] + Out >>> ['alphabox', + 'hello', + 'Doc', + 'obj_test', + 'fs_test', + 'global'] +``` + + +**Return Type** + +A list of Repo Object + +### Create Repo ### + +**Request Parameters** + +* name +* password (default None) + +**Sample Case** + +```python + + import seafileapi + + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + repo = client.repos.create_repo('test_repo') +``` + +**Return Type** + +A Repo Object + From 954c440aa239553e6f8216265b62ff1e634c2238 Mon Sep 17 00:00:00 2001 From: zming <517046497@qq.com> Date: Fri, 2 Feb 2018 16:48:08 +0800 Subject: [PATCH 09/39] review --- README.md | 2 + doc.md | 323 ++++++++++++++++++++++++------------------------------ 2 files changed, 145 insertions(+), 180 deletions(-) diff --git a/README.md b/README.md index c710859593..c99211e64c 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,5 @@ python-seafile ============== python client for seafile web api + +Doc: https://github.com/haiwen/seahub/blob/master/doc.md diff --git a/doc.md b/doc.md index abf9479110..c5092bfc6d 100644 --- a/doc.md +++ b/doc.md @@ -3,39 +3,32 @@ @@ -43,6 +36,8 @@

# Python Seafile + + ## Get Client ## **Request Parameters** @@ -63,33 +58,33 @@ A Client Object -## SeafFile ## -### Get Content ### +## Library ## +### Get Library ### **Request Parameters** -None +* repo_id **Sample Case** - - ```python import seafileapi client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') - seaffile = repo.get_file('/root/test.md') - - content = seaffile.get_content() ``` **Return Type** -File Content +A Library Object + +**Exception** + +* Library does not exist. + +### Check Library Permission ### -### Delete a file ### **Request Parameters** None @@ -99,23 +94,21 @@ None ```python import seafileapi - + client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') - seaffile = repo.get_file('/root/test.md') - - seaffile.delete() + is_readonly = repo.is_readonly() ``` **Return Type** -A Response Instance +Boolean + +### List all Libraries ### -## SeafDir ## -### List ### **Request Parameters** -* force_refresh (default False) +None **Sample Case** @@ -124,37 +117,35 @@ A Response Instance import seafileapi client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') - repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') - seafdir = repo.get_dir('/root') - - lst = seafdir.ls(force_refresh=True) - print lst - Out >>> [SeafDir[repo=01ccc4,path=/Seahub/6.1.x,entries=14], - SeafDir[repo=01ccc4,path=/Seahub/6.2.2-pro,entries=1], - SeafDir[repo=01ccc4,path=/Seahub/6.2.3,entries=15], - SeafDir[repo=01ccc4,path=/Seahub/6.2.x,entries=5], - SeafFile[repo=01ccc4,path=/Seahub/.DS_Store,size=6148], - SeafFile[repo=01ccc4,path=/Seahub/error.md,size=127], - SeafFile[repo=01ccc4,path=/Seahub/preview-research.md,size=1030]] + repo_list = client.repos.list_repos() - print [dirent.name for dirent in lst] - Out >>> ['6.1.x', - '6.2.2-pro', - '6.2.3', - '6.2.x', - '.DS_Store', - 'error.md', - 'preview-research.md'] + print repo_list + Out >>> [, + , + , + , + , + ] + + print [repo.name for repo in repo_list] + Out >>> ['alphabox', + 'hello', + 'Doc', + 'obj_test', + 'fs_test', + 'global'] ``` **Return Type** -List of SeafDir and SeafFile +A list of Libraries Object + +### Create Library ### -### Create Empty File ### **Request Parameters** * name +* password (default None) **Sample Case** @@ -163,42 +154,19 @@ List of SeafDir and SeafFile import seafileapi client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') - repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') - seafdir = repo.get_dir('/root') - - new_file = seafdir.create_empty_file('tmp_file.md') + repo = client.repos.create_repo('test_repo') ``` **Return Type** -A SeafFile Object of new empty file +A Library Object -### Create New Folder ### -**Request Parameters** -* name +### Delete Library ### -**Sample Case** - -```python - - import seafileapi - - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') - repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') - seafdir = repo.get_dir('/root') - - new_dir = seafdir.mkdir('tmp_dir') -``` - -**Return Type** - -A SeafDir Object of new dir - -### Upload ### **Request Parameters** -* fileobj -* filename + +None **Sample Case** @@ -208,21 +176,19 @@ A SeafDir Object of new dir client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') - seafdir = repo.get_dir('/root') - - file = seafdir.upload('this is file content', 'tmp_file.md') + repo.delete() ``` **Return Type** -A SeafFile Object of upload file +None +## Directory ## +### Get Directory ### -### Upload Local File ### **Request Parameters** -* filepath -* name (default None, default use local file name) +* path **Sample Case** @@ -233,22 +199,27 @@ A SeafFile Object of upload file client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') - - file = seafdir.upload_local_file('/home/ubuntu/env.md') + print seafdir.__dict__ + Out >>> {'client': SeafileApiClient[server=http://127.0.0.1:8000, user=admin@admin.com], + 'entries': [], + 'id': 'c3742dd86004d51c358845fa3178c87e4ab3aa60', + 'path': '/root', + 'repo': , + 'size': 0} ``` **Return Type** -A SeafFile Object of upload file +A Directory Object **Exception** -* Local file does not exist. +* Directory does not exist. -### delete a folder ### +### List Directory Entries ### **Request Parameters** -None +* force_refresh (default False) **Sample Case** @@ -260,39 +231,54 @@ None repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') - seafdir.delete() + lst = seafdir.ls(force_refresh=True) + print lst + Out >>> [SeafDir[repo=01ccc4,path=/Seahub/6.1.x,entries=14], + SeafDir[repo=01ccc4,path=/Seahub/6.2.2-pro,entries=1], + SeafDir[repo=01ccc4,path=/Seahub/6.2.3,entries=15], + SeafDir[repo=01ccc4,path=/Seahub/6.2.x,entries=5], + SeafFile[repo=01ccc4,path=/Seahub/.DS_Store,size=6148], + SeafFile[repo=01ccc4,path=/Seahub/error.md,size=127], + SeafFile[repo=01ccc4,path=/Seahub/preview-research.md,size=1030]] + + print [dirent.name for dirent in lst] + Out >>> ['6.1.x', + '6.2.2-pro', + '6.2.3', + '6.2.x', + '.DS_Store', + 'error.md', + 'preview-research.md'] ``` **Return Type** -A Response Instance +List of Directory and File + -## Repo ## -### From Json ### +### Create New Folder ### **Request Parameters** -* client -* repo_json +* name **Sample Case** ```python import seafileapi - from seafileapi.repo import Repo client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') - repo_json = {'id': '09c16e2a-ff1a-4207-99f3-1351c3f1e507', 'name': 'test_repo', 'encrypted': False, 'permission': 'rw', 'owner': 'test@admin.com'} - repo = Repo.from_json(client, repo_json) -``` + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seafdir = repo.get_dir('/root') + new_dir = seafdir.mkdir('tmp_dir') +``` **Return Type** -A Repo Object - -### Is ReadOnly ### +A Directory Object of new directory +### Delete Directory ### **Request Parameters** None @@ -305,14 +291,18 @@ None client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') - is_readonly = repo.is_readonly() + seafdir = repo.get_dir('/root') + + seafdir.delete() ``` **Return Type** -True or False +A Response Instance + -### Get File ### +## File ## +### Get File ### **Request Parameters** @@ -327,21 +317,28 @@ True or False client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seaffile = repo.get_file('/root/test.md') + + print seafile.__dict__ + Out >>> {'client': SeafileApiClient[server=http://127.0.0.1:8000, user=admin@admin.com], + 'id': '0000000000000000000000000000000000000000', + 'path': '/root/test.md', + 'repo': , + 'size': 0} ``` **Return Type** -A SeafFile Object +A File Object **Exception** * File does not exist. -### Get Dir ### +### Get Content ### **Request Parameters** -* path +None **Sample Case** @@ -351,22 +348,19 @@ A SeafFile Object client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') - seafdir = repo.get_dir('/root') + seaffile = repo.get_file('/root/test.md') + + content = seaffile.get_content() ``` **Return Type** -A SeafDir Object - -**Exception** - -* Dir does not exist. - -### Delete Repo ### +File Content +### Create Empty File ### **Request Parameters** -None +* name **Sample Case** @@ -376,19 +370,21 @@ None client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') - repo.delete() + seafdir = repo.get_dir('/root') + + new_file = seafdir.create_empty_file('tmp_file.md') ``` **Return Type** -None +A File Object of new empty file -## Repos ## -### Get Repo ### +### Upload File ### **Request Parameters** -* repo_id +* filepath +* name (default None, default use local file name) **Sample Case** @@ -398,18 +394,21 @@ None client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seafdir = repo.get_dir('/root') + + file = seafdir.upload_local_file('/home/ubuntu/env.md') ``` **Return Type** -A Repo Object +A File Object of upload file **Exception** -* Repo does not exist. +* Local file does not exist. -### List Repo ### +### Delete a file ### **Request Parameters** None @@ -421,48 +420,12 @@ None import seafileapi client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') - repo_list = client.repos.list_repos() - - print repo_list - Out >>> [, - , - , - , - , - ] - - print [repo.name for repo in repo_list] - Out >>> ['alphabox', - 'hello', - 'Doc', - 'obj_test', - 'fs_test', - 'global'] -``` - - -**Return Type** - -A list of Repo Object - -### Create Repo ### - -**Request Parameters** - -* name -* password (default None) - -**Sample Case** - -```python - - import seafileapi + repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') + seaffile = repo.get_file('/root/test.md') - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') - repo = client.repos.create_repo('test_repo') + seaffile.delete() ``` **Return Type** -A Repo Object - +A Response Instance From 328266a790af42746c15b10c04606a507059ed1b Mon Sep 17 00:00:00 2001 From: zming <517046497@qq.com> Date: Sat, 3 Feb 2018 13:37:03 +0800 Subject: [PATCH 10/39] update doc link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c99211e64c..8b2cea4888 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,4 @@ python-seafile python client for seafile web api -Doc: https://github.com/haiwen/seahub/blob/master/doc.md +Doc: https://github.com/haiwen/python-seafile/blob/master/doc.md From 3dd5fd1630097919163458a843c7c36e2f7861e8 Mon Sep 17 00:00:00 2001 From: zming <517046497@qq.com> Date: Fri, 1 Jun 2018 18:20:48 +0800 Subject: [PATCH 11/39] share to user for dir --- seafileapi/client.py | 3 +++ seafileapi/files.py | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/seafileapi/client.py b/seafileapi/client.py index 9bf79ee88f..52a6ea6b1b 100644 --- a/seafileapi/client.py +++ b/seafileapi/client.py @@ -43,6 +43,9 @@ def get(self, *args, **kwargs): def post(self, *args, **kwargs): return self._send_request('POST', *args, **kwargs) + def put(self, *args, **kwargs): + return self._send_request('PUT', *args, **kwargs) + def delete(self, *args, **kwargs): return self._send_request('delete', *args, **kwargs) diff --git a/seafileapi/files.py b/seafileapi/files.py index d36f2ea5c6..2c3144d148 100644 --- a/seafileapi/files.py +++ b/seafileapi/files.py @@ -76,7 +76,7 @@ def copyTo(self, dst_dir, dst_repo_id=None): """ if dst_repo_id is None: dst_repo_id = self.repo.id - + dirent_type = 'dir' if self.isdir else 'file' resp = self._copy_move_task('copy', dirent_type, dst_dir, dst_repo_id) return resp.status_code == 200 @@ -86,7 +86,7 @@ def moveTo(self, dst_dir, dst_repo_id=None): """ if dst_repo_id is None: dst_repo_id = self.repo.id - + dirent_type = 'dir' if self.isdir else 'file' resp = self._copy_move_task('move', dirent_type, dst_dir, dst_repo_id) succeeded = resp.status_code == 200 @@ -122,6 +122,16 @@ def ls(self, force_refresh=False): return self.entries + def share_to_user(self, email, permission): + url = '/api2/repos/%s/dir/shared_items/' % self.repo.id + querystr(p=self.path) + putdata = { + 'share_type': 'user', + 'username': email, + 'permission': permission + } + resp = self.client.put(url, data=putdata) + return resp.status_code == 200 + def create_empty_file(self, name): """Create a new empty file in this dir. Return a :class:`SeafFile` object of the newly created file. @@ -210,7 +220,7 @@ def num_entries(self): if self.entries is None: self.load_entries() return len(self.entries) if self.entries is not None else 0 - + def __str__(self): return 'SeafDir[repo=%s,path=%s,entries=%s]' % \ (self.repo.id[:6], self.path, self.num_entries) @@ -219,6 +229,7 @@ def __str__(self): class SeafFile(_SeafDirentBase): isdir = False + def update(self, fileobj): """Update the content of this file""" pass From d3480ba03f1c1b7138314415c4cb26c25a690991 Mon Sep 17 00:00:00 2001 From: sniper-py Date: Wed, 25 Sep 2019 17:42:59 +0800 Subject: [PATCH 12/39] update ignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index db4561eaa1..66b01cd072 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,5 @@ docs/_build/ # PyBuilder target/ + +.idea/ From b4b077e53a48ceccfedd4b96dca419e7f2bbcfbf Mon Sep 17 00:00:00 2001 From: sniper-py Date: Wed, 25 Sep 2019 17:44:18 +0800 Subject: [PATCH 13/39] 2to3 dict --- seafileapi/files.py | 4 ++-- seafileapi/utils.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/seafileapi/files.py b/seafileapi/files.py index 2c3144d148..ea34559fa0 100644 --- a/seafileapi/files.py +++ b/seafileapi/files.py @@ -52,7 +52,7 @@ def rename(self, newname): new_dirent = self.repo.get_dir(os.path.join(os.path.dirname(self.path), newname)) else: new_dirent = self.repo.get_file(os.path.join(os.path.dirname(self.path), newname)) - for key in self.__dict__.keys(): + for key in list(self.__dict__.keys()): self.__dict__[key] = new_dirent.__dict__[key] return succeeded @@ -97,7 +97,7 @@ def moveTo(self, dst_dir, dst_repo_id=None): new_dirent = new_repo.get_dir(dst_path) else: new_dirent = new_repo.get_file(dst_path) - for key in self.__dict__.keys(): + for key in list(self.__dict__.keys()): self.__dict__[key] = new_dirent.__dict__[key] return succeeded diff --git a/seafileapi/utils.py b/seafileapi/utils.py index b529880f15..5f863edad5 100644 --- a/seafileapi/utils.py +++ b/seafileapi/utils.py @@ -46,7 +46,7 @@ def querystr(**kwargs): def utf8lize(obj): if isinstance(obj, dict): - return {k: to_utf8(v) for k, v in obj.iteritems()} + return {k: to_utf8(v) for k, v in obj.items()} if isinstance(obj, list): return [to_utf8(x) for x in ob] From bc69e77ce76355bf1f68ca5b3889c5e8a20d1b25 Mon Sep 17 00:00:00 2001 From: sniper-py Date: Wed, 25 Sep 2019 17:44:18 +0800 Subject: [PATCH 14/39] 2to3 except --- seafileapi/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seafileapi/utils.py b/seafileapi/utils.py index 5f863edad5..ad7812ed98 100644 --- a/seafileapi/utils.py +++ b/seafileapi/utils.py @@ -28,7 +28,7 @@ def decorator(func): def wrapped(*args, **kwargs): try: return func(*args, **kwargs) - except ClientHttpError, e: + except ClientHttpError as e: if e.code == 404: raise DoesNotExist(msg) else: From e29d92be4f4b04749232fd924e884068dfdd16a7 Mon Sep 17 00:00:00 2001 From: sniper-py Date: Wed, 25 Sep 2019 17:44:30 +0800 Subject: [PATCH 15/39] 2to3 unicode --- seafileapi/utils.py | 4 ++-- tests/test_files.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/seafileapi/utils.py b/seafileapi/utils.py index ad7812ed98..7d52e60fe3 100644 --- a/seafileapi/utils.py +++ b/seafileapi/utils.py @@ -37,7 +37,7 @@ def wrapped(*args, **kwargs): return decorator def to_utf8(obj): - if isinstance(obj, unicode): + if isinstance(obj, str): return obj.encode('utf-8') return obj @@ -51,7 +51,7 @@ def utf8lize(obj): if isinstance(obj, list): return [to_utf8(x) for x in ob] - if instance(obj, unicode): + if instance(obj, str): return obj.encode('utf-8') return obj diff --git a/tests/test_files.py b/tests/test_files.py index 5509da09bc..111a521372 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -84,7 +84,7 @@ def test_upload_file(repo, parentpath): def test_upload_string_as_file_content(repo): # test pass as string as file content when upload file rootdir = repo.get_dir('/') - fname = u'testfile-%s' % randstring() + fname = 'testfile-%s' % randstring() fcontent = 'line 1\nline 2\n\r' f = rootdir.upload(fcontent, fname) assert f.name == fname From 032545eff3783bd357037edaf918b007d5af922c Mon Sep 17 00:00:00 2001 From: sniper-py Date: Wed, 25 Sep 2019 17:44:30 +0800 Subject: [PATCH 16/39] 2to3 urllib --- seafileapi/repo.py | 2 +- seafileapi/utils.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/seafileapi/repo.py b/seafileapi/repo.py index ded895e551..312ba42274 100644 --- a/seafileapi/repo.py +++ b/seafileapi/repo.py @@ -1,4 +1,4 @@ -from urllib import urlencode +from urllib.parse import urlencode from seafileapi.utils import utf8lize from seafileapi.files import SeafDir, SeafFile from seafileapi.utils import raise_does_not_exist diff --git a/seafileapi/utils.py b/seafileapi/utils.py index 7d52e60fe3..7903414315 100644 --- a/seafileapi/utils.py +++ b/seafileapi/utils.py @@ -1,7 +1,7 @@ import string import random from functools import wraps -from urllib import urlencode +from urllib.parse import urlencode from seafileapi.exceptions import ClientHttpError, DoesNotExist def randstring(length=0): From 209d7f598f19ca114901137e016726899093b1c9 Mon Sep 17 00:00:00 2001 From: sniper-py Date: Wed, 25 Sep 2019 18:24:34 +0800 Subject: [PATCH 17/39] remove utf8lize --- seafileapi/files.py | 3 +-- seafileapi/repo.py | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/seafileapi/files.py b/seafileapi/files.py index ea34559fa0..ed01e64543 100644 --- a/seafileapi/files.py +++ b/seafileapi/files.py @@ -2,7 +2,7 @@ import os import posixpath import re -from seafileapi.utils import querystr, utf8lize +from seafileapi.utils import querystr ZERO_OBJ_ID = '0000000000000000000000000000000000000000' @@ -208,7 +208,6 @@ def load_entries(self, dirents_json=None): self.entries = [self._load_dirent(entry_json) for entry_json in dirents_json] def _load_dirent(self, dirent_json): - dirent_json = utf8lize(dirent_json) path = posixpath.join(self.path, dirent_json['name']) if dirent_json['type'] == 'file': return SeafFile(self.repo, path, dirent_json['id'], dirent_json['size']) diff --git a/seafileapi/repo.py b/seafileapi/repo.py index 312ba42274..01811a2db0 100644 --- a/seafileapi/repo.py +++ b/seafileapi/repo.py @@ -1,5 +1,4 @@ from urllib.parse import urlencode -from seafileapi.utils import utf8lize from seafileapi.files import SeafDir, SeafFile from seafileapi.utils import raise_does_not_exist @@ -18,7 +17,6 @@ def __init__(self, client, repo_id, repo_name, @classmethod def from_json(cls, client, repo_json): - repo_json = utf8lize(repo_json) repo_id = repo_json['id'] repo_name = repo_json['name'] From 528b528f6cf8e986e42f013005586142dc6fafcc Mon Sep 17 00:00:00 2001 From: Shailesh Appukuttan Date: Wed, 15 Jul 2020 16:28:47 +0200 Subject: [PATCH 18/39] Make changes to source repo to work with HBP seafile --- README.md | 18 +++- hbp_seafile/__init__.py | 14 +++ {seafileapi => hbp_seafile}/admin.py | 0 hbp_seafile/client.py | 118 ++++++++++++++++++++++ {seafileapi => hbp_seafile}/exceptions.py | 0 {seafileapi => hbp_seafile}/files.py | 0 {seafileapi => hbp_seafile}/group.py | 0 {seafileapi => hbp_seafile}/repo.py | 0 {seafileapi => hbp_seafile}/repos.py | 0 {seafileapi => hbp_seafile}/utils.py | 0 requirements.txt | 1 + seafileapi/__init__.py | 5 - seafileapi/client.py | 77 -------------- setup.py | 14 +-- 14 files changed, 153 insertions(+), 94 deletions(-) create mode 100644 hbp_seafile/__init__.py rename {seafileapi => hbp_seafile}/admin.py (100%) create mode 100644 hbp_seafile/client.py rename {seafileapi => hbp_seafile}/exceptions.py (100%) rename {seafileapi => hbp_seafile}/files.py (100%) rename {seafileapi => hbp_seafile}/group.py (100%) rename {seafileapi => hbp_seafile}/repo.py (100%) rename {seafileapi => hbp_seafile}/repos.py (100%) rename {seafileapi => hbp_seafile}/utils.py (100%) delete mode 100644 seafileapi/__init__.py delete mode 100644 seafileapi/client.py diff --git a/README.md b/README.md index 8b2cea4888..c687aab1e9 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,16 @@ -[![Build Status](https://secure.travis-ci.org/haiwen/python-seafile.svg?branch=master)](http://travis-ci.org/haiwen/python-seafile) - -python-seafile +hbp_seafile ============== -python client for seafile web api +Python client interface for HBP Collaboratory Seafile storage + + +Original implementation source: +https://github.com/haiwen/python-seafile +by Shuai Lin (linshuai2012@gmail.com) + + +Updated for integration with HBP v2 Collaboratory's Seafile storage +by Shailesh Appukuttan (appukuttan.shailesh@gmail.com) + -Doc: https://github.com/haiwen/python-seafile/blob/master/doc.md +Documentation: https://github.com/haiwen/python-seafile/blob/master/doc.md diff --git a/hbp_seafile/__init__.py b/hbp_seafile/__init__.py new file mode 100644 index 0000000000..461f418d40 --- /dev/null +++ b/hbp_seafile/__init__.py @@ -0,0 +1,14 @@ +""" +A Python package for working with the Human Brain Project Model Validation Framework. + +Andrew Davison and Shailesh Appukuttan, CNRS, 2017-2020 + +License: BSD 3-clause, see LICENSE.txt + +""" + +from seafileapi.client import SeafileApiClient + +def connect(server, username, password): + client = SeafileApiClient(server, username, password) + return client diff --git a/seafileapi/admin.py b/hbp_seafile/admin.py similarity index 100% rename from seafileapi/admin.py rename to hbp_seafile/admin.py diff --git a/hbp_seafile/client.py b/hbp_seafile/client.py new file mode 100644 index 0000000000..5dd5c5516f --- /dev/null +++ b/hbp_seafile/client.py @@ -0,0 +1,118 @@ +import requests +from seafileapi.utils import urljoin +from seafileapi.exceptions import ClientHttpError +from seafileapi.repos import Repos +import re + +class SeafileApiClient(object): + """Wraps seafile web api""" + def __init__(self, server="https://drive.ebrains.eu", username=None, password=None, token=None): + """Wraps various basic operations to interact with seahub http api. + """ + self.server = server + self.username = username + self.password = password + self._token = token + + self.repos = Repos(self) + self.groups = Groups(self) + + if token is None: + self._get_token() + + def _check_token_valid(self): + url = "https://drive.ebrains.eu/api2/auth/ping/" + data = requests.get(url, auth=HBPAuth(self.token), verify=self.verify) + if data.status_code == 200: + return True + else: + return False + + def _get_token(self): + """ + HBP authentication based on _hbp_auth() in + https://github.com/HumanBrainProject/hbp-validation-client) + """ + base_url = "https://validation-v2.brainsimulation.eu" + redirect_uri = base_url + '/auth' + session = requests.Session() + # log-in page of model validation service + r_login = session.get(base_url + "/login", allow_redirects=False) + if r_login.status_code != 302: + raise Exception( + "Something went wrong. Status code {} from login, expected 302" + .format(r_login.status_code)) + # redirects to EBRAINS IAM log-in page + iam_auth_url = r_login.headers.get('location') + r_iam1 = session.get(iam_auth_url, allow_redirects=False) + if r_iam1.status_code != 200: + raise Exception( + "Something went wrong loading EBRAINS log-in page. Status code {}" + .format(r_iam1.status_code)) + # fill-in and submit form + match = re.search(r'action=\"(?P[^\"]+)\"', r_iam1.text) + if not match: + raise Exception("Received an unexpected page") + iam_authenticate_url = match['url'].replace("&", "&") + r_iam2 = session.post( + iam_authenticate_url, + data={"username": self.username, "password": self.password}, + headers={"Referer": iam_auth_url, "Host": "iam.ebrains.eu", "Origin": "https://iam.ebrains.eu"}, + allow_redirects=False + ) + if r_iam2.status_code != 302: + raise Exception( + "Something went wrong. Status code {} from authenticate, expected 302" + .format(r_iam2.status_code)) + # redirects back to model validation service + r_val = session.get(r_iam2.headers['Location']) + if r_val.status_code != 200: + raise Exception( + "Something went wrong. Status code {} from final authentication step" + .format(r_val.status_code)) + config = r_val.json() + self._token = config['token']['access_token'] + + def __str__(self): + return 'SeafileApiClient[server=%s, user=%s]' % (self.server, self.username) + + __repr__ = __str__ + + def get(self, *args, **kwargs): + return self._send_request('GET', *args, **kwargs) + + def post(self, *args, **kwargs): + return self._send_request('POST', *args, **kwargs) + + def put(self, *args, **kwargs): + return self._send_request('PUT', *args, **kwargs) + + def delete(self, *args, **kwargs): + return self._send_request('delete', *args, **kwargs) + + def _send_request(self, method, url, *args, **kwargs): + if not url.startswith('http'): + url = urljoin(self.server, url) + + headers = kwargs.get('headers', {}) + headers.setdefault('Authorization', 'Bearer ' + self._token) + kwargs['headers'] = headers + + expected = kwargs.pop('expected', 200) + if not hasattr(expected, '__iter__'): + expected = (expected, ) + resp = requests.request(method, url, *args, **kwargs) + if resp.status_code not in expected: + msg = 'Expected %s, but get %s' % \ + (' or '.join(map(str, expected)), resp.status_code) + raise ClientHttpError(resp.status_code, msg) + + return resp + + +class Groups(object): + def __init__(self, client): + pass + + def create_group(self, name): + pass diff --git a/seafileapi/exceptions.py b/hbp_seafile/exceptions.py similarity index 100% rename from seafileapi/exceptions.py rename to hbp_seafile/exceptions.py diff --git a/seafileapi/files.py b/hbp_seafile/files.py similarity index 100% rename from seafileapi/files.py rename to hbp_seafile/files.py diff --git a/seafileapi/group.py b/hbp_seafile/group.py similarity index 100% rename from seafileapi/group.py rename to hbp_seafile/group.py diff --git a/seafileapi/repo.py b/hbp_seafile/repo.py similarity index 100% rename from seafileapi/repo.py rename to hbp_seafile/repo.py diff --git a/seafileapi/repos.py b/hbp_seafile/repos.py similarity index 100% rename from seafileapi/repos.py rename to hbp_seafile/repos.py diff --git a/seafileapi/utils.py b/hbp_seafile/utils.py similarity index 100% rename from seafileapi/utils.py rename to hbp_seafile/utils.py diff --git a/requirements.txt b/requirements.txt index f2293605cf..a6de386366 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ requests +re diff --git a/seafileapi/__init__.py b/seafileapi/__init__.py deleted file mode 100644 index d6c3b8dfcf..0000000000 --- a/seafileapi/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from seafileapi.client import SeafileApiClient - -def connect(server, username, password): - client = SeafileApiClient(server, username, password) - return client diff --git a/seafileapi/client.py b/seafileapi/client.py deleted file mode 100644 index 52a6ea6b1b..0000000000 --- a/seafileapi/client.py +++ /dev/null @@ -1,77 +0,0 @@ -import requests -from seafileapi.utils import urljoin -from seafileapi.exceptions import ClientHttpError -from seafileapi.repos import Repos - -class SeafileApiClient(object): - """Wraps seafile web api""" - def __init__(self, server, username=None, password=None, token=None): - """Wraps various basic operations to interact with seahub http api. - """ - self.server = server - self.username = username - self.password = password - self._token = token - - self.repos = Repos(self) - self.groups = Groups(self) - - if token is None: - self._get_token() - - def _get_token(self): - data = { - 'username': self.username, - 'password': self.password, - } - url = urljoin(self.server, '/api2/auth-token/') - res = requests.post(url, data=data) - if res.status_code != 200: - raise ClientHttpError(res.status_code, res.content) - token = res.json()['token'] - assert len(token) == 40, 'The length of seahub api auth token should be 40' - self._token = token - - def __str__(self): - return 'SeafileApiClient[server=%s, user=%s]' % (self.server, self.username) - - __repr__ = __str__ - - def get(self, *args, **kwargs): - return self._send_request('GET', *args, **kwargs) - - def post(self, *args, **kwargs): - return self._send_request('POST', *args, **kwargs) - - def put(self, *args, **kwargs): - return self._send_request('PUT', *args, **kwargs) - - def delete(self, *args, **kwargs): - return self._send_request('delete', *args, **kwargs) - - def _send_request(self, method, url, *args, **kwargs): - if not url.startswith('http'): - url = urljoin(self.server, url) - - headers = kwargs.get('headers', {}) - headers.setdefault('Authorization', 'Token ' + self._token) - kwargs['headers'] = headers - - expected = kwargs.pop('expected', 200) - if not hasattr(expected, '__iter__'): - expected = (expected, ) - resp = requests.request(method, url, *args, **kwargs) - if resp.status_code not in expected: - msg = 'Expected %s, but get %s' % \ - (' or '.join(map(str, expected)), resp.status_code) - raise ClientHttpError(resp.status_code, msg) - - return resp - - -class Groups(object): - def __init__(self, client): - pass - - def create_group(self, name): - pass diff --git a/setup.py b/setup.py index d2165df374..0e7ea84e90 100644 --- a/setup.py +++ b/setup.py @@ -1,18 +1,18 @@ from setuptools import setup, find_packages -__version__ = '0.1.1' +__version__ = '0.1' -setup(name='seafileapi', +setup(name='hbp_seafile', version=__version__, - license='BSD', - description='Client interface for Seafile Web API', - author='Shuai Lin', - author_email='linshuai2012@gmail.com', + license='Apache-2.0 License', + description='Python client interface for HBP Collaboratory Seafile storage', + author='Shuai Lin, Shailesh Appukuttan', + author_email='linshuai2012@gmail.com, appukuttan.shailesh@gmail.com', url='http://seafile.com', platforms=['Any'], packages=find_packages(), - install_requires=['requests'], + install_requires=['requests', 're'], classifiers=['Development Status :: 4 - Beta', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', From a2e30b8d44e3a358f16005104102a88caf642f34 Mon Sep 17 00:00:00 2001 From: Shailesh Appukuttan Date: Wed, 15 Jul 2020 16:32:46 +0200 Subject: [PATCH 19/39] update requirements --- requirements.txt | 1 - setup.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index a6de386366..f2293605cf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1 @@ requests -re diff --git a/setup.py b/setup.py index 0e7ea84e90..4a586a234b 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ url='http://seafile.com', platforms=['Any'], packages=find_packages(), - install_requires=['requests', 're'], + install_requires=['requests'], classifiers=['Development Status :: 4 - Beta', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', From 3204471915e30b32219042268403ca13a08b1cc2 Mon Sep 17 00:00:00 2001 From: Shailesh Appukuttan Date: Wed, 15 Jul 2020 17:33:39 +0200 Subject: [PATCH 20/39] changes to conform to new package name --- README.md | 27 +++++++++++++- doc.md | 76 ++++++++++++++++++++-------------------- eu_logo.jpg | Bin 0 -> 132699 bytes hbp_seafile/__init__.py | 8 ++--- hbp_seafile/client.py | 8 ++--- hbp_seafile/files.py | 2 +- hbp_seafile/repo.py | 4 +-- hbp_seafile/repos.py | 4 +-- hbp_seafile/utils.py | 2 +- pytest.ini | 2 +- tests/fixtures.py | 4 +-- tests/test_repos.py | 2 +- 12 files changed, 82 insertions(+), 57 deletions(-) create mode 100644 eu_logo.jpg diff --git a/README.md b/README.md index c687aab1e9..e17f2ceab6 100644 --- a/README.md +++ b/README.md @@ -13,4 +13,29 @@ Updated for integration with HBP v2 Collaboratory's Seafile storage by Shailesh Appukuttan (appukuttan.shailesh@gmail.com) -Documentation: https://github.com/haiwen/python-seafile/blob/master/doc.md +Documentation: https://github.com/appukuttan-shailesh/hbp-seafile/blob/master/doc.md + +Installation: `pip install hbp_seafile` + + +Example usage (refer to docs for more): + +```python + # 1. import module + import hbp_seafile + + # 2. create client object + # 2.1 either via + client = hbp_seafile.connect('hbp_username', 'password') + # 2.2 or via + from hbp_seafile.client import SeafileApiClient + client = SeafileApiClient(username="hbp_username", password="password") + + +``` + + +
EU Logo
+ +### ACKNOWLEDGEMENTS +This open source software code was developed in part in the Human Brain Project, funded from the European Union's Horizon 2020 Framework Programme for Research and Innovation under Specific Grant Agreements No. 720270 and No. 785907 (Human Brain Project SGA1 and SGA2). \ No newline at end of file diff --git a/doc.md b/doc.md index c5092bfc6d..dfcb011893 100644 --- a/doc.md +++ b/doc.md @@ -49,9 +49,9 @@ ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') ``` **Return Type** @@ -69,9 +69,9 @@ A Client Object ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') ``` @@ -93,9 +93,9 @@ None ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') is_readonly = repo.is_readonly() ``` @@ -114,18 +114,18 @@ None ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo_list = client.repos.list_repos() print repo_list - Out >>> [, - , - , - , - , - ] + Out >>> [, + , + , + , + , + ] print [repo.name for repo in repo_list] Out >>> ['alphabox', @@ -151,9 +151,9 @@ A list of Libraries Object ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.create_repo('test_repo') ``` @@ -172,9 +172,9 @@ None ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') repo.delete() ``` @@ -194,9 +194,9 @@ None ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') print seafdir.__dict__ @@ -204,7 +204,7 @@ None 'entries': [], 'id': 'c3742dd86004d51c358845fa3178c87e4ab3aa60', 'path': '/root', - 'repo': , + 'repo': , 'size': 0} ``` @@ -225,9 +225,9 @@ A Directory Object ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') @@ -265,9 +265,9 @@ List of Directory and File ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') @@ -287,9 +287,9 @@ None ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') @@ -312,9 +312,9 @@ A Response Instance ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seaffile = repo.get_file('/root/test.md') @@ -322,7 +322,7 @@ A Response Instance Out >>> {'client': SeafileApiClient[server=http://127.0.0.1:8000, user=admin@admin.com], 'id': '0000000000000000000000000000000000000000', 'path': '/root/test.md', - 'repo': , + 'repo': , 'size': 0} ``` @@ -344,9 +344,9 @@ None ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seaffile = repo.get_file('/root/test.md') @@ -366,9 +366,9 @@ File Content ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') @@ -390,9 +390,9 @@ A File Object of new empty file ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') @@ -417,9 +417,9 @@ None ```python - import seafileapi + import hbp_seafile - client = seafileapi.connect('http://127.0.0.1:8000', 'test@admin.com', 'password') + client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seaffile = repo.get_file('/root/test.md') diff --git a/eu_logo.jpg b/eu_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac937356d334139276e1f22a22744f99bbfeacc1 GIT binary patch literal 132699 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 literal 0 HcmV?d00001 diff --git a/hbp_seafile/__init__.py b/hbp_seafile/__init__.py index 461f418d40..e3bff5005f 100644 --- a/hbp_seafile/__init__.py +++ b/hbp_seafile/__init__.py @@ -7,8 +7,8 @@ """ -from seafileapi.client import SeafileApiClient +from hbp_seafile.client import SeafileApiClient -def connect(server, username, password): - client = SeafileApiClient(server, username, password) - return client +def connect(username=None, password=None, token=None, server="https://drive.ebrains.eu"): + client = SeafileApiClient(username, password, token, server) + return client \ No newline at end of file diff --git a/hbp_seafile/client.py b/hbp_seafile/client.py index 5dd5c5516f..a8c04f7471 100644 --- a/hbp_seafile/client.py +++ b/hbp_seafile/client.py @@ -1,12 +1,12 @@ import requests -from seafileapi.utils import urljoin -from seafileapi.exceptions import ClientHttpError -from seafileapi.repos import Repos +from hbp_seafile.utils import urljoin +from hbp_seafile.exceptions import ClientHttpError +from hbp_seafile.repos import Repos import re class SeafileApiClient(object): """Wraps seafile web api""" - def __init__(self, server="https://drive.ebrains.eu", username=None, password=None, token=None): + def __init__(self, username=None, password=None, token=None, server="https://drive.ebrains.eu"): """Wraps various basic operations to interact with seahub http api. """ self.server = server diff --git a/hbp_seafile/files.py b/hbp_seafile/files.py index ed01e64543..fca9fa32df 100644 --- a/hbp_seafile/files.py +++ b/hbp_seafile/files.py @@ -2,7 +2,7 @@ import os import posixpath import re -from seafileapi.utils import querystr +from hbp_seafile.utils import querystr ZERO_OBJ_ID = '0000000000000000000000000000000000000000' diff --git a/hbp_seafile/repo.py b/hbp_seafile/repo.py index 01811a2db0..31944372cc 100644 --- a/hbp_seafile/repo.py +++ b/hbp_seafile/repo.py @@ -1,6 +1,6 @@ from urllib.parse import urlencode -from seafileapi.files import SeafDir, SeafFile -from seafileapi.utils import raise_does_not_exist +from hbp_seafile.files import SeafDir, SeafFile +from hbp_seafile.utils import raise_does_not_exist class Repo(object): """ diff --git a/hbp_seafile/repos.py b/hbp_seafile/repos.py index 70a8fa7e47..d4331ae412 100644 --- a/hbp_seafile/repos.py +++ b/hbp_seafile/repos.py @@ -1,5 +1,5 @@ -from seafileapi.repo import Repo -from seafileapi.utils import raise_does_not_exist +from hbp_seafile.repo import Repo +from hbp_seafile.utils import raise_does_not_exist class Repos(object): def __init__(self, client): diff --git a/hbp_seafile/utils.py b/hbp_seafile/utils.py index 7903414315..dfd4d3c859 100644 --- a/hbp_seafile/utils.py +++ b/hbp_seafile/utils.py @@ -2,7 +2,7 @@ import random from functools import wraps from urllib.parse import urlencode -from seafileapi.exceptions import ClientHttpError, DoesNotExist +from hbp_seafile.exceptions import ClientHttpError, DoesNotExist def randstring(length=0): if length == 0: diff --git a/pytest.ini b/pytest.ini index bcac8822ac..60236f1d46 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,2 +1,2 @@ [pytest] -addopts = -s -v --doctest-modules --ignore=build --ignore=dist --ignore=seafileapi.egg-info --ignore=setup.py +addopts = -s -v --doctest-modules --ignore=build --ignore=dist --ignore=hbp_seafile.egg-info --ignore=setup.py diff --git a/tests/fixtures.py b/tests/fixtures.py index 9247e3243b..2ef6f57645 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -3,7 +3,7 @@ import os import pytest -import seafileapi +import hbp_seafile from tests.utils import randstring SERVER = os.environ.get('SEAFILE_TEST_SERVER_ADDRESS', 'http://127.0.0.1:8000') @@ -14,7 +14,7 @@ @pytest.fixture(scope='session') def client(): - return seafileapi.connect(SERVER, USER, PASSWORD) + return hbp_seafile.connect(SERVER, USER, PASSWORD) @pytest.yield_fixture(scope='function') def repo(client): diff --git a/tests/test_repos.py b/tests/test_repos.py index d1ab6421d7..8aa9e95725 100644 --- a/tests/test_repos.py +++ b/tests/test_repos.py @@ -2,7 +2,7 @@ import pytest -from seafileapi.exceptions import DoesNotExist +from hbp_seafile.exceptions import DoesNotExist from tests.utils import randstring def test_create_delete_repo(client): From 45eda042a611d8da2826dd36f0e7a9f5bdd37b63 Mon Sep 17 00:00:00 2001 From: Shailesh Appukuttan Date: Wed, 15 Jul 2020 17:36:22 +0200 Subject: [PATCH 21/39] change to py3 prints in docs --- doc.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc.md b/doc.md index dfcb011893..3c524dea35 100644 --- a/doc.md +++ b/doc.md @@ -119,7 +119,7 @@ None client = hbp_seafile.connect('hbp_username', 'password') repo_list = client.repos.list_repos() - print repo_list + print(repo_list) Out >>> [, , , @@ -127,7 +127,7 @@ None , ] - print [repo.name for repo in repo_list] + print([repo.name for repo in repo_list]) Out >>> ['alphabox', 'hello', 'Doc', @@ -199,7 +199,7 @@ None client = hbp_seafile.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') - print seafdir.__dict__ + print(seafdir.__dict__) Out >>> {'client': SeafileApiClient[server=http://127.0.0.1:8000, user=admin@admin.com], 'entries': [], 'id': 'c3742dd86004d51c358845fa3178c87e4ab3aa60', @@ -232,7 +232,7 @@ A Directory Object seafdir = repo.get_dir('/root') lst = seafdir.ls(force_refresh=True) - print lst + print(lst) Out >>> [SeafDir[repo=01ccc4,path=/Seahub/6.1.x,entries=14], SeafDir[repo=01ccc4,path=/Seahub/6.2.2-pro,entries=1], SeafDir[repo=01ccc4,path=/Seahub/6.2.3,entries=15], @@ -241,7 +241,7 @@ A Directory Object SeafFile[repo=01ccc4,path=/Seahub/error.md,size=127], SeafFile[repo=01ccc4,path=/Seahub/preview-research.md,size=1030]] - print [dirent.name for dirent in lst] + print([dirent.name for dirent in lst]) Out >>> ['6.1.x', '6.2.2-pro', '6.2.3', @@ -318,7 +318,7 @@ A Response Instance repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seaffile = repo.get_file('/root/test.md') - print seafile.__dict__ + print(seafile.__dict__) Out >>> {'client': SeafileApiClient[server=http://127.0.0.1:8000, user=admin@admin.com], 'id': '0000000000000000000000000000000000000000', 'path': '/root/test.md', From 5c9cd9593d2057b647b1767bc83c0c23fdaa9bc4 Mon Sep 17 00:00:00 2001 From: Shailesh Appukuttan Date: Wed, 15 Jul 2020 17:53:22 +0200 Subject: [PATCH 22/39] Update readme with more details --- README.md | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e17f2ceab6..232ca72bc0 100644 --- a/README.md +++ b/README.md @@ -21,17 +21,41 @@ Installation: `pip install hbp_seafile` Example usage (refer to docs for more): ```python - # 1. import module + # 1. Import module import hbp_seafile - # 2. create client object + # 2. Create client object # 2.1 either via client = hbp_seafile.connect('hbp_username', 'password') # 2.2 or via from hbp_seafile.client import SeafileApiClient client = SeafileApiClient(username="hbp_username", password="password") - + + # 3. Working with Collab drives (libraries / repos) + # 3.1 Get list of all libraries that user has access to + list_repos = client.repos.list_repos() + # 3.2 Get info of specific library + repo_obj = client.repos.get_repo('0fee1620-062d-4643-865b-951de1eee355') + print(repo_obj.__dict__) + + # 4. Working with directories + # 4.1 Get info of a directory + repo_obj = client.repos.get_repo('0fee1620-062d-4643-865b-951de1eee355') + dir_obj = repo_obj.get_dir('/') # specify dir path; '/' signifies root directory + print(dir_obj.__dict__) + # 4.2 Get contents of directory + dir_obj.ls() + + + # 5. Working with files + # 5.1 Get info of a file + repo_obj = client.repos.get_repo('0fee1620-062d-4643-865b-951de1eee355') + file_obj = repo_obj.get_file('/sample-latest.csv') # specify file path + print(file_obj.__dict__) + # 5.2 Get file content + file_content = file_obj.get_content() + print(file_content) ``` From 8bc917038a23350dfda622bf587f3bd9032c6b30 Mon Sep 17 00:00:00 2001 From: Shailesh Appukuttan Date: Thu, 16 Jul 2020 17:28:04 +0200 Subject: [PATCH 23/39] add more convenience methods --- hbp_seafile/access.py | 18 ++++++++++++++++++ hbp_seafile/files.py | 12 ++++++------ hbp_seafile/repo.py | 32 ++++++++++++++++--------------- hbp_seafile/repos.py | 44 ++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 84 insertions(+), 22 deletions(-) create mode 100644 hbp_seafile/access.py diff --git a/hbp_seafile/access.py b/hbp_seafile/access.py new file mode 100644 index 0000000000..964307b08a --- /dev/null +++ b/hbp_seafile/access.py @@ -0,0 +1,18 @@ +from hbp_seafile.repos import Repos +from hbp_seafile.files import SeafFile + +def get_file_by_url(client, file_url): + """Get a single repo associated with specified repo_url + Example inputs: + 1) https://drive.ebrains.eu/lib/0fee1620-062d-4643-865b-951de1eee355/file/sample-latest.csv + 2) https://drive.ebrains.eu/lib/0fee1620-062d-4643-865b-951de1eee355/file/Dir1/data.json + """ + if "drive.ebrains.eu/lib/" in file_url: + repo_id = file_url.split("drive.ebrains.eu/lib/")[1].split("/")[0] + file_path = "/" + "/".join(file_url.split("drive.ebrains.eu/lib/")[1].split("/")[2:]) + else: + raise ValueError("Parameter `file_url` does not have expected format!") + + repo_obj = Repos(client).get_repo(repo_id) + file_obj = repo_obj.get_file(file_path) + return file_obj \ No newline at end of file diff --git a/hbp_seafile/files.py b/hbp_seafile/files.py index fca9fa32df..77d8ddd3e8 100644 --- a/hbp_seafile/files.py +++ b/hbp_seafile/files.py @@ -221,22 +221,24 @@ def num_entries(self): return len(self.entries) if self.entries is not None else 0 def __str__(self): - return 'SeafDir[repo=%s,path=%s,entries=%s]' % \ + return 'SeafDir[repo=%s, path=%s, entries=%s]' % \ (self.repo.id[:6], self.path, self.num_entries) __repr__ = __str__ class SeafFile(_SeafDirentBase): isdir = False - + def update(self, fileobj): """Update the content of this file""" pass def __str__(self): - return 'SeafFile[repo=%s,path=%s,size=%s]' % \ + return 'SeafFile[repo=%s, path=%s, size=%s]' % \ (self.repo.id[:6], self.path, self.size) + __repr__ = __str__ + def _get_download_link(self): url = '/api2/repos/%s/file/' % self.repo.id + querystr(p=self.path) resp = self.client.get(url) @@ -245,6 +247,4 @@ def _get_download_link(self): def get_content(self): """Get the content of the file""" url = self._get_download_link() - return self.client.get(url).content - - __repr__ = __str__ + return self.client.get(url).content \ No newline at end of file diff --git a/hbp_seafile/repo.py b/hbp_seafile/repo.py index 31944372cc..88b42e18df 100644 --- a/hbp_seafile/repo.py +++ b/hbp_seafile/repo.py @@ -6,25 +6,27 @@ class Repo(object): """ A seafile library """ - def __init__(self, client, repo_id, repo_name, - encrypted, owner, perm): + def __init__(self, client, **kwargs): self.client = client - self.id = repo_id - self.name = repo_name - self.encrypted = encrypted - self.owner = owner - self.perm = perm - @classmethod - def from_json(cls, client, repo_json): + allowed_keys = ['encrypted', 'group_name', 'groupid', 'head_commit_id', 'id', 'modifier_contact_email', 'modifier_email', 'modifier_name', 'mtime', 'mtime_relative', 'name', 'owner', 'owner_contact_email', 'owner_name', 'permission', 'root', 'share_from', 'share_from_contact_email', 'share_from_name', 'share_type', 'size', 'size_formatted', 'type', 'version', 'virtual'] + # Update __dict__ but only for keys that have been predefined + # (silently ignore others) + self.__dict__.update((key, value) for key, value in kwargs.items() if key in allowed_keys) + # To NOT silently ignore rejected keys + # rejected_keys = set(kwargs.keys()) - set(allowed_keys) + # if rejected_keys: + # raise ValueError("Invalid arguments in constructor:{}".format(rejected_keys)) + + def __str__(self): + return "(id='{}', name='{}')".format(self.id, self.name) - repo_id = repo_json['id'] - repo_name = repo_json['name'] - encrypted = repo_json['encrypted'] - perm = repo_json['permission'] - owner = repo_json['owner'] + def __repr__(self): + return "hbp_seafile.repo.Repo(id='{}', name='{}')".format(self.id, self.name) - return cls(client, repo_id, repo_name, encrypted, owner, perm) + @classmethod + def from_json(cls, client, repo_json): + return cls(client, **repo_json) def is_readonly(self): return 'w' not in self.perm diff --git a/hbp_seafile/repos.py b/hbp_seafile/repos.py index d4331ae412..26bbb8deb4 100644 --- a/hbp_seafile/repos.py +++ b/hbp_seafile/repos.py @@ -23,4 +23,46 @@ def get_repo(self, repo_id): def list_repos(self): repos_json = self.client.get('/api2/repos/').json() - return [Repo.from_json(self.client, j) for j in repos_json] + return [Repo.from_json(self.client, j) for j in repos_json] + + def get_repos_by_filter(self, filter_name, filter_value): + """Get all repos which have `filter_name` = `filter_value`. + Note + """ + repos_json = self.client.get('/api2/repos/').json() + print + match_repos = [] + for j in repos_json: + if filter_name in j.keys() and j[filter_name] == filter_value: + match_repos.append(Repo.from_json(self.client, j)) + return match_repos + + def get_repos_by_name(self, repo_name): + """Get all repos which have the name `repo_name`. + Note: can return multiple entries for same repo (same UUID) + """ + return self.get_repos_by_filter("name", repo_name) + + def get_repo_by_url(self, repo_url): + """Get a single repo associated with specified repo_url + Example inputs: + 1) https://wiki.ebrains.eu/bin/view/Collabs/shailesh-testing + 2) wiki.ebrains.eu/bin/view/Collabs/shailesh-testing + 3) shailesh-testing + + Note: not guaranteed to identify as url and repo not easily linkable; url and name need not be same + """ + if "wiki.ebrains.eu/bin/view/Collabs/" in repo_url: + repo_path = repo_url.split("wiki.ebrains.eu/bin/view/Collabs/")[1] + else: + repo_path = repo_url + repo_owner = "collab-" + repo_path + "-administrator" + + match_repos = self.get_repos_by_filter("owner", repo_owner) + + if len(match_repos) == 0: + raise Exception("Couldn't identify any repo associated with specified URL!") + elif len(match_repos) > 1: + raise Exception("Couldn't uniquely identify the repo associated with specified URL!") + else: + return match_repos[0] \ No newline at end of file From 838d39ac27ac60050a2968288915db72701318ea Mon Sep 17 00:00:00 2001 From: Shailesh Appukuttan Date: Fri, 17 Jul 2020 19:07:50 +0200 Subject: [PATCH 24/39] bug fixes and improvements --- doc.md | 2 +- hbp_seafile/files.py | 51 ++++++++++++++++++++++++++++++++++++-------- hbp_seafile/repo.py | 4 ++-- hbp_seafile/repos.py | 3 ++- 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/doc.md b/doc.md index 3c524dea35..0d34a6e483 100644 --- a/doc.md +++ b/doc.md @@ -27,7 +27,7 @@
  • Get File
  • Get Content
  • Create Empty File
  • -
  • Upload File
  • +
  • Upload File
  • Delete file
  • diff --git a/hbp_seafile/files.py b/hbp_seafile/files.py index 77d8ddd3e8..75876626af 100644 --- a/hbp_seafile/files.py +++ b/hbp_seafile/files.py @@ -4,6 +4,7 @@ import re from hbp_seafile.utils import querystr +# Note: only files and dirs with contents is assigned an ID; else their ID is set to all zeros ZERO_OBJ_ID = '0000000000000000000000000000000000000000' class _SeafDirentBase(object): @@ -13,7 +14,7 @@ class _SeafDirentBase(object): """ isdir = None - def __init__(self, repo, path, object_id, size=0): + def __init__(self, repo, path, object_id, obj_type, size=0): """ :param:`path` the full path of this entry within its repo, like "/documents/example.md" @@ -24,6 +25,7 @@ def __init__(self, repo, path, object_id, size=0): self.repo = repo self.path = path self.id = object_id + self.type = obj_type self.size = size @property @@ -112,15 +114,20 @@ def __init__(self, *args, **kwargs): self.entries = None self.entries = kwargs.pop('entries', None) - def ls(self, force_refresh=False): + def ls(self, entity_type=None, force_refresh=True): """List the entries in this dir. Return a list of objects of class :class:`SeafFile` or :class:`SeafDir`. """ + if entity_type and entity_type not in ["file", "dir"]: + raise ValueError("Invalid value for parameter `entity_type`; must be 'file' or 'dir'!") if self.entries is None or force_refresh: self.load_entries() - return self.entries + if entity_type: + return [x for x in self.entries if x.type == entity_type] + else: + return self.entries def share_to_user(self, email, permission): url = '/api2/repos/%s/dir/shared_items/' % self.repo.id + querystr(p=self.path) @@ -143,20 +150,37 @@ def create_empty_file(self, name): resp = self.client.post(url, data=postdata) self.id = resp.headers['oid'] self.load_entries(resp.json()) - return SeafFile(self.repo, path, ZERO_OBJ_ID, 0) + return SeafFile(self.repo, path, ZERO_OBJ_ID, "file", 0) + + def check_exists(self, name, entity_type=None): + """Check if an entity with specified name exists in current directory + Note: seafile doesn't allow even a sub-directory and file, + within the same directory, to have the same name + """ + entity_list = self.ls(entity_type=entity_type, force_refresh=True) + for e in entity_list: + if e.name == name: + return e + return False def mkdir(self, name): """Create a new sub folder right under this dir. Return a :class:`SeafDir` object of the newly created sub folder. """ + # check if entity with same name already exists + if self.check_exists(name): + raise FileExistsError("File/directory with name = `{}` already exists in current directory!".format(name)) + path = posixpath.join(self.path, name) url = '/api2/repos/%s/dir/' % self.repo.id + querystr(p=path, reloaddir='true') postdata = {'operation': 'mkdir'} resp = self.client.post(url, data=postdata) self.id = resp.headers['oid'] self.load_entries(resp.json()) - return SeafDir(self.repo, path, ZERO_OBJ_ID) + + # fetch and return created directory object + return SeafDir(self.repo, path, ZERO_OBJ_ID, "dir") def upload(self, fileobj, filename): """Upload a file to this folder. @@ -176,7 +200,7 @@ def upload(self, fileobj, filename): self.client.post(upload_url, files=files) return self.repo.get_file(posixpath.join(self.path, filename)) - def upload_local_file(self, filepath, name=None): + def upload_local_file(self, filepath, name=None, overwrite=False): """Upload a file to this folder. :param:filepath The path to the local file @@ -185,7 +209,16 @@ def upload_local_file(self, filepath, name=None): Return a :class:`SeafFile` object of the newly uploaded file. """ name = name or os.path.basename(filepath) - with open(filepath, 'r') as fp: + + # check if entity with same name already exists + entity_obj = self.check_exists(name) + if entity_obj: + if overwrite: + a = entity_obj.delete() + else: + raise FileExistsError("File/directory with name = `{}` already exists in current directory!".format(name)) + + with open(filepath, 'rb') as fp: return self.upload(fp, name) def _get_upload_link(self): @@ -210,9 +243,9 @@ def load_entries(self, dirents_json=None): def _load_dirent(self, dirent_json): path = posixpath.join(self.path, dirent_json['name']) if dirent_json['type'] == 'file': - return SeafFile(self.repo, path, dirent_json['id'], dirent_json['size']) + return SeafFile(self.repo, path, dirent_json['id'], dirent_json['type'], dirent_json['size']) else: - return SeafDir(self.repo, path, dirent_json['id'], 0) + return SeafDir(self.repo, path, dirent_json['id'], dirent_json['type'], 0) @property def num_entries(self): diff --git a/hbp_seafile/repo.py b/hbp_seafile/repo.py index 88b42e18df..01d31f7ce5 100644 --- a/hbp_seafile/repo.py +++ b/hbp_seafile/repo.py @@ -42,7 +42,7 @@ def get_file(self, path): query = '?' + urlencode(dict(p=path)) file_json = self.client.get(url + query).json() - return SeafFile(self, path, file_json['id'], file_json['size']) + return SeafFile(self, path, file_json['id'], "file", file_json['size']) @raise_does_not_exist('The requested dir does not exist') def get_dir(self, path): @@ -56,7 +56,7 @@ def get_dir(self, path): resp = self.client.get(url + query) dir_id = resp.headers['oid'] dir_json = resp.json() - dir = SeafDir(self, path, dir_id) + dir = SeafDir(self, path, dir_id, "dir") dir.load_entries(dir_json) return dir diff --git a/hbp_seafile/repos.py b/hbp_seafile/repos.py index 26bbb8deb4..97ce2b7eba 100644 --- a/hbp_seafile/repos.py +++ b/hbp_seafile/repos.py @@ -46,7 +46,7 @@ def get_repos_by_name(self, repo_name): def get_repo_by_url(self, repo_url): """Get a single repo associated with specified repo_url Example inputs: - 1) https://wiki.ebrains.eu/bin/view/Collabs/shailesh-testing + 1) https://wiki.ebrains.eu/bin/view/Collabs/shailesh-testing/ 2) wiki.ebrains.eu/bin/view/Collabs/shailesh-testing 3) shailesh-testing @@ -56,6 +56,7 @@ def get_repo_by_url(self, repo_url): repo_path = repo_url.split("wiki.ebrains.eu/bin/view/Collabs/")[1] else: repo_path = repo_url + repo_path = repo_path[:-1] if repo_path[-1] == "/" else repo_path repo_owner = "collab-" + repo_path + "-administrator" match_repos = self.get_repos_by_filter("owner", repo_owner) From 084f64629769ad12f3e2ee7dc8641999bf50b061 Mon Sep 17 00:00:00 2001 From: appukuttan-shailesh Date: Mon, 20 Jul 2020 16:04:26 +0200 Subject: [PATCH 25/39] minor updates --- hbp_seafile/access.py | 4 ++-- hbp_seafile/repos.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/hbp_seafile/access.py b/hbp_seafile/access.py index 964307b08a..560e67c4ea 100644 --- a/hbp_seafile/access.py +++ b/hbp_seafile/access.py @@ -12,7 +12,7 @@ def get_file_by_url(client, file_url): file_path = "/" + "/".join(file_url.split("drive.ebrains.eu/lib/")[1].split("/")[2:]) else: raise ValueError("Parameter `file_url` does not have expected format!") - + repo_obj = Repos(client).get_repo(repo_id) file_obj = repo_obj.get_file(file_path) - return file_obj \ No newline at end of file + return file_obj diff --git a/hbp_seafile/repos.py b/hbp_seafile/repos.py index 97ce2b7eba..37577b5857 100644 --- a/hbp_seafile/repos.py +++ b/hbp_seafile/repos.py @@ -60,10 +60,9 @@ def get_repo_by_url(self, repo_url): repo_owner = "collab-" + repo_path + "-administrator" match_repos = self.get_repos_by_filter("owner", repo_owner) - if len(match_repos) == 0: raise Exception("Couldn't identify any repo associated with specified URL!") elif len(match_repos) > 1: raise Exception("Couldn't uniquely identify the repo associated with specified URL!") else: - return match_repos[0] \ No newline at end of file + return match_repos[0] From f6d5e2a69f992c1a249128d306ca8b15cc3901e3 Mon Sep 17 00:00:00 2001 From: Shailesh Appukuttan Date: Mon, 20 Jul 2020 21:16:54 +0200 Subject: [PATCH 26/39] minor update in get repo --- hbp_seafile/repos.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/hbp_seafile/repos.py b/hbp_seafile/repos.py index 37577b5857..a1e17c0a1b 100644 --- a/hbp_seafile/repos.py +++ b/hbp_seafile/repos.py @@ -56,10 +56,12 @@ def get_repo_by_url(self, repo_url): repo_path = repo_url.split("wiki.ebrains.eu/bin/view/Collabs/")[1] else: repo_path = repo_url - repo_path = repo_path[:-1] if repo_path[-1] == "/" else repo_path - repo_owner = "collab-" + repo_path + "-administrator" + repo_path = repo_path.strip("/") + + match_repos = self.get_repos_by_filter("owner", "collab-" + repo_path + "-administrator") + if not match_repos: + match_repos = self.get_repos_by_filter("owner", "collab-" + repo_path + "-editor") - match_repos = self.get_repos_by_filter("owner", repo_owner) if len(match_repos) == 0: raise Exception("Couldn't identify any repo associated with specified URL!") elif len(match_repos) > 1: From 78d573866483b84994e0a1c03e46bebdb5081582 Mon Sep 17 00:00:00 2001 From: Shailesh Appukuttan Date: Tue, 28 Jul 2020 17:08:31 +0200 Subject: [PATCH 27/39] update version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 4a586a234b..2e9af55813 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import setup, find_packages -__version__ = '0.1' +__version__ = '0.1.1' setup(name='hbp_seafile', From 7854e8bbed0e06ad3a4075aae334bb244a8fa7b2 Mon Sep 17 00:00:00 2001 From: Axel Messinese Date: Wed, 2 Sep 2020 18:53:36 +0200 Subject: [PATCH 28/39] rename into ebrains_seafile --- README.md | 10 +-- doc.md | 76 ++++++++++---------- {hbp_seafile => ebrains_drive}/__init__.py | 2 +- {hbp_seafile => ebrains_drive}/access.py | 4 +- {hbp_seafile => ebrains_drive}/admin.py | 0 {hbp_seafile => ebrains_drive}/client.py | 6 +- {hbp_seafile => ebrains_drive}/exceptions.py | 0 {hbp_seafile => ebrains_drive}/files.py | 2 +- {hbp_seafile => ebrains_drive}/group.py | 0 {hbp_seafile => ebrains_drive}/repo.py | 6 +- {hbp_seafile => ebrains_drive}/repos.py | 4 +- {hbp_seafile => ebrains_drive}/utils.py | 2 +- pytest.ini | 2 +- setup.py | 8 +-- tests/fixtures.py | 4 +- tests/test_repos.py | 2 +- 16 files changed, 64 insertions(+), 64 deletions(-) rename {hbp_seafile => ebrains_drive}/__init__.py (87%) rename {hbp_seafile => ebrains_drive}/access.py (90%) rename {hbp_seafile => ebrains_drive}/admin.py (100%) rename {hbp_seafile => ebrains_drive}/client.py (97%) rename {hbp_seafile => ebrains_drive}/exceptions.py (100%) rename {hbp_seafile => ebrains_drive}/files.py (99%) rename {hbp_seafile => ebrains_drive}/group.py (100%) rename {hbp_seafile => ebrains_drive}/repo.py (94%) rename {hbp_seafile => ebrains_drive}/repos.py (96%) rename {hbp_seafile => ebrains_drive}/utils.py (95%) diff --git a/README.md b/README.md index 232ca72bc0..cbfd25f74c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -hbp_seafile +ebrains_drive ============== Python client interface for HBP Collaboratory Seafile storage @@ -15,20 +15,20 @@ by Shailesh Appukuttan (appukuttan.shailesh@gmail.com) Documentation: https://github.com/appukuttan-shailesh/hbp-seafile/blob/master/doc.md -Installation: `pip install hbp_seafile` +Installation: `pip install ebrains_drive` Example usage (refer to docs for more): ```python # 1. Import module - import hbp_seafile + import ebrains_drive # 2. Create client object # 2.1 either via - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') # 2.2 or via - from hbp_seafile.client import SeafileApiClient + from ebrains_drive.client import SeafileApiClient client = SeafileApiClient(username="hbp_username", password="password") diff --git a/doc.md b/doc.md index 0d34a6e483..8e6b284c37 100644 --- a/doc.md +++ b/doc.md @@ -49,9 +49,9 @@ ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') ``` **Return Type** @@ -69,9 +69,9 @@ A Client Object ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') ``` @@ -93,9 +93,9 @@ None ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') is_readonly = repo.is_readonly() ``` @@ -114,18 +114,18 @@ None ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo_list = client.repos.list_repos() print(repo_list) - Out >>> [, - , - , - , - , - ] + Out >>> [, + , + , + , + , + ] print([repo.name for repo in repo_list]) Out >>> ['alphabox', @@ -151,9 +151,9 @@ A list of Libraries Object ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.create_repo('test_repo') ``` @@ -172,9 +172,9 @@ None ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') repo.delete() ``` @@ -194,9 +194,9 @@ None ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') print(seafdir.__dict__) @@ -204,7 +204,7 @@ None 'entries': [], 'id': 'c3742dd86004d51c358845fa3178c87e4ab3aa60', 'path': '/root', - 'repo': , + 'repo': , 'size': 0} ``` @@ -225,9 +225,9 @@ A Directory Object ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') @@ -265,9 +265,9 @@ List of Directory and File ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') @@ -287,9 +287,9 @@ None ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') @@ -312,9 +312,9 @@ A Response Instance ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seaffile = repo.get_file('/root/test.md') @@ -322,7 +322,7 @@ A Response Instance Out >>> {'client': SeafileApiClient[server=http://127.0.0.1:8000, user=admin@admin.com], 'id': '0000000000000000000000000000000000000000', 'path': '/root/test.md', - 'repo': , + 'repo': , 'size': 0} ``` @@ -344,9 +344,9 @@ None ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seaffile = repo.get_file('/root/test.md') @@ -366,9 +366,9 @@ File Content ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') @@ -390,9 +390,9 @@ A File Object of new empty file ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') @@ -417,9 +417,9 @@ None ```python - import hbp_seafile + import ebrains_drive - client = hbp_seafile.connect('hbp_username', 'password') + client = ebrains_drive.connect('hbp_username', 'password') repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seaffile = repo.get_file('/root/test.md') diff --git a/hbp_seafile/__init__.py b/ebrains_drive/__init__.py similarity index 87% rename from hbp_seafile/__init__.py rename to ebrains_drive/__init__.py index e3bff5005f..4a04808879 100644 --- a/hbp_seafile/__init__.py +++ b/ebrains_drive/__init__.py @@ -7,7 +7,7 @@ """ -from hbp_seafile.client import SeafileApiClient +from ebrains_drive.client import SeafileApiClient def connect(username=None, password=None, token=None, server="https://drive.ebrains.eu"): client = SeafileApiClient(username, password, token, server) diff --git a/hbp_seafile/access.py b/ebrains_drive/access.py similarity index 90% rename from hbp_seafile/access.py rename to ebrains_drive/access.py index 560e67c4ea..87fbf8a992 100644 --- a/hbp_seafile/access.py +++ b/ebrains_drive/access.py @@ -1,5 +1,5 @@ -from hbp_seafile.repos import Repos -from hbp_seafile.files import SeafFile +from ebrains_drive.repos import Repos +from ebrains_drive.files import SeafFile def get_file_by_url(client, file_url): """Get a single repo associated with specified repo_url diff --git a/hbp_seafile/admin.py b/ebrains_drive/admin.py similarity index 100% rename from hbp_seafile/admin.py rename to ebrains_drive/admin.py diff --git a/hbp_seafile/client.py b/ebrains_drive/client.py similarity index 97% rename from hbp_seafile/client.py rename to ebrains_drive/client.py index a8c04f7471..da7151b014 100644 --- a/hbp_seafile/client.py +++ b/ebrains_drive/client.py @@ -1,7 +1,7 @@ import requests -from hbp_seafile.utils import urljoin -from hbp_seafile.exceptions import ClientHttpError -from hbp_seafile.repos import Repos +from ebrains_drive.utils import urljoin +from ebrains_drive.exceptions import ClientHttpError +from ebrains_drive.repos import Repos import re class SeafileApiClient(object): diff --git a/hbp_seafile/exceptions.py b/ebrains_drive/exceptions.py similarity index 100% rename from hbp_seafile/exceptions.py rename to ebrains_drive/exceptions.py diff --git a/hbp_seafile/files.py b/ebrains_drive/files.py similarity index 99% rename from hbp_seafile/files.py rename to ebrains_drive/files.py index 75876626af..e3744404e3 100644 --- a/hbp_seafile/files.py +++ b/ebrains_drive/files.py @@ -2,7 +2,7 @@ import os import posixpath import re -from hbp_seafile.utils import querystr +from ebrains_drive.utils import querystr # Note: only files and dirs with contents is assigned an ID; else their ID is set to all zeros ZERO_OBJ_ID = '0000000000000000000000000000000000000000' diff --git a/hbp_seafile/group.py b/ebrains_drive/group.py similarity index 100% rename from hbp_seafile/group.py rename to ebrains_drive/group.py diff --git a/hbp_seafile/repo.py b/ebrains_drive/repo.py similarity index 94% rename from hbp_seafile/repo.py rename to ebrains_drive/repo.py index 01d31f7ce5..0fe648b364 100644 --- a/hbp_seafile/repo.py +++ b/ebrains_drive/repo.py @@ -1,6 +1,6 @@ from urllib.parse import urlencode -from hbp_seafile.files import SeafDir, SeafFile -from hbp_seafile.utils import raise_does_not_exist +from ebrains_drive.files import SeafDir, SeafFile +from ebrains_drive.utils import raise_does_not_exist class Repo(object): """ @@ -22,7 +22,7 @@ def __str__(self): return "(id='{}', name='{}')".format(self.id, self.name) def __repr__(self): - return "hbp_seafile.repo.Repo(id='{}', name='{}')".format(self.id, self.name) + return "ebrains_drive.repo.Repo(id='{}', name='{}')".format(self.id, self.name) @classmethod def from_json(cls, client, repo_json): diff --git a/hbp_seafile/repos.py b/ebrains_drive/repos.py similarity index 96% rename from hbp_seafile/repos.py rename to ebrains_drive/repos.py index a1e17c0a1b..e42929a96b 100644 --- a/hbp_seafile/repos.py +++ b/ebrains_drive/repos.py @@ -1,5 +1,5 @@ -from hbp_seafile.repo import Repo -from hbp_seafile.utils import raise_does_not_exist +from ebrains_drive.repo import Repo +from ebrains_drive.utils import raise_does_not_exist class Repos(object): def __init__(self, client): diff --git a/hbp_seafile/utils.py b/ebrains_drive/utils.py similarity index 95% rename from hbp_seafile/utils.py rename to ebrains_drive/utils.py index dfd4d3c859..9e0d684739 100644 --- a/hbp_seafile/utils.py +++ b/ebrains_drive/utils.py @@ -2,7 +2,7 @@ import random from functools import wraps from urllib.parse import urlencode -from hbp_seafile.exceptions import ClientHttpError, DoesNotExist +from ebrains_drive.exceptions import ClientHttpError, DoesNotExist def randstring(length=0): if length == 0: diff --git a/pytest.ini b/pytest.ini index 60236f1d46..fae3339e6a 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,2 +1,2 @@ [pytest] -addopts = -s -v --doctest-modules --ignore=build --ignore=dist --ignore=hbp_seafile.egg-info --ignore=setup.py +addopts = -s -v --doctest-modules --ignore=build --ignore=dist --ignore=ebrains_drive.egg-info --ignore=setup.py diff --git a/setup.py b/setup.py index 2e9af55813..5984ef25f6 100644 --- a/setup.py +++ b/setup.py @@ -1,14 +1,14 @@ from setuptools import setup, find_packages -__version__ = '0.1.1' +__version__ = '0.1.0' -setup(name='hbp_seafile', +setup(name='ebrains-drive', version=__version__, license='Apache-2.0 License', description='Python client interface for HBP Collaboratory Seafile storage', - author='Shuai Lin, Shailesh Appukuttan', - author_email='linshuai2012@gmail.com, appukuttan.shailesh@gmail.com', + author='Ebrains, CNRS', + author_email='support@ebrains.eu', url='http://seafile.com', platforms=['Any'], packages=find_packages(), diff --git a/tests/fixtures.py b/tests/fixtures.py index 2ef6f57645..46a30995ea 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -3,7 +3,7 @@ import os import pytest -import hbp_seafile +import ebrains_drive from tests.utils import randstring SERVER = os.environ.get('SEAFILE_TEST_SERVER_ADDRESS', 'http://127.0.0.1:8000') @@ -14,7 +14,7 @@ @pytest.fixture(scope='session') def client(): - return hbp_seafile.connect(SERVER, USER, PASSWORD) + return ebrains_drive.connect(SERVER, USER, PASSWORD) @pytest.yield_fixture(scope='function') def repo(client): diff --git a/tests/test_repos.py b/tests/test_repos.py index 8aa9e95725..53ee6d2657 100644 --- a/tests/test_repos.py +++ b/tests/test_repos.py @@ -2,7 +2,7 @@ import pytest -from hbp_seafile.exceptions import DoesNotExist +from ebrains_drive.exceptions import DoesNotExist from tests.utils import randstring def test_create_delete_repo(client): From 0836a40384b7173bd61462533eebb908a4d1f28c Mon Sep 17 00:00:00 2001 From: Axel Messinese Date: Thu, 3 Sep 2020 01:32:37 +0200 Subject: [PATCH 29/39] Define env settings --- .gitignore | 3 +++ README.md | 4 ++-- doc.md | 4 ++-- ebrains_drive/__init__.py | 6 +++--- ebrains_drive/client.py | 39 ++++++++++++++++++++++++++++----------- 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 66b01cd072..afc8dd8af8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +testdrive.py +venv/ + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/README.md b/README.md index cbfd25f74c..dc9f1624d9 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,8 @@ Example usage (refer to docs for more): # 2.1 either via client = ebrains_drive.connect('hbp_username', 'password') # 2.2 or via - from ebrains_drive.client import SeafileApiClient - client = SeafileApiClient(username="hbp_username", password="password") + from ebrains_drive.client import DriveApiClient + client = DriveApiClient(username="hbp_username", password="password") # 3. Working with Collab drives (libraries / repos) diff --git a/doc.md b/doc.md index 8e6b284c37..0ee668c55d 100644 --- a/doc.md +++ b/doc.md @@ -200,7 +200,7 @@ None repo = client.repos.get_repo('09c16e2a-ff1a-4207-99f3-1351c3f1e507') seafdir = repo.get_dir('/root') print(seafdir.__dict__) - Out >>> {'client': SeafileApiClient[server=http://127.0.0.1:8000, user=admin@admin.com], + Out >>> {'client': DriveApiClient[server=http://127.0.0.1:8000, user=admin@admin.com], 'entries': [], 'id': 'c3742dd86004d51c358845fa3178c87e4ab3aa60', 'path': '/root', @@ -319,7 +319,7 @@ A Response Instance seaffile = repo.get_file('/root/test.md') print(seafile.__dict__) - Out >>> {'client': SeafileApiClient[server=http://127.0.0.1:8000, user=admin@admin.com], + Out >>> {'client': DriveApiClient[server=http://127.0.0.1:8000, user=admin@admin.com], 'id': '0000000000000000000000000000000000000000', 'path': '/root/test.md', 'repo': , diff --git a/ebrains_drive/__init__.py b/ebrains_drive/__init__.py index 4a04808879..20ca2e167b 100644 --- a/ebrains_drive/__init__.py +++ b/ebrains_drive/__init__.py @@ -7,8 +7,8 @@ """ -from ebrains_drive.client import SeafileApiClient +from ebrains_drive.client import DriveApiClient -def connect(username=None, password=None, token=None, server="https://drive.ebrains.eu"): - client = SeafileApiClient(username, password, token, server) +def connect(username=None, password=None, token=None, env=""): + client = DriveApiClient(username, password, token, env) return client \ No newline at end of file diff --git a/ebrains_drive/client.py b/ebrains_drive/client.py index da7151b014..0f6e920c66 100644 --- a/ebrains_drive/client.py +++ b/ebrains_drive/client.py @@ -4,12 +4,15 @@ from ebrains_drive.repos import Repos import re -class SeafileApiClient(object): +class DriveApiClient(object): """Wraps seafile web api""" - def __init__(self, username=None, password=None, token=None, server="https://drive.ebrains.eu"): + def __init__(self, username=None, password=None, token=None, env=""): """Wraps various basic operations to interact with seahub http api. """ - self.server = server + self._set_env(env) + + self.server = self.drive_url + self.username = username self.password = password self._token = token @@ -20,13 +23,27 @@ def __init__(self, username=None, password=None, token=None, server="https://dri if token is None: self._get_token() - def _check_token_valid(self): - url = "https://drive.ebrains.eu/api2/auth/ping/" - data = requests.get(url, auth=HBPAuth(self.token), verify=self.verify) - if data.status_code == 200: - return True - else: - return False + def _set_env(self, env=''): + self.suffix = "" + + if env == "dev": + self.suffix = "-dev" + elif env == "int": + self.suffix = "-int" + # else we keep empty suffix for production + + self.drive_url = "https://drive" + self.suffix + ".ebrains.eu" + self.iam_host = "iam" + self.suffix + ".ebrains.eu" + self.iam_url = "https://" + self.iam_host + + def get_drive_url(self): + return self.drive_url + + def get_iam_host(self): + return self.iam_host + + def get_iam_url(self): + return self.iam_url def _get_token(self): """ @@ -74,7 +91,7 @@ def _get_token(self): self._token = config['token']['access_token'] def __str__(self): - return 'SeafileApiClient[server=%s, user=%s]' % (self.server, self.username) + return 'DriveApiClient[server=%s, user=%s]' % (self.server, self.username) __repr__ = __str__ From 102512aaa12224852a29ad789f541cbcd39040de Mon Sep 17 00:00:00 2001 From: Axel Messinese Date: Mon, 7 Sep 2020 10:55:00 +0200 Subject: [PATCH 30/39] remove hardcoded drive url from function --- ebrains_drive/client.py | 2 +- ebrains_drive/{access.py => file.py} | 17 ++++++++++++----- ebrains_drive/repos.py | 27 ++++++++++++++++----------- 3 files changed, 29 insertions(+), 17 deletions(-) rename ebrains_drive/{access.py => file.py} (67%) diff --git a/ebrains_drive/client.py b/ebrains_drive/client.py index 0f6e920c66..2a67383a29 100644 --- a/ebrains_drive/client.py +++ b/ebrains_drive/client.py @@ -74,7 +74,7 @@ def _get_token(self): r_iam2 = session.post( iam_authenticate_url, data={"username": self.username, "password": self.password}, - headers={"Referer": iam_auth_url, "Host": "iam.ebrains.eu", "Origin": "https://iam.ebrains.eu"}, + headers={"Referer": iam_auth_url, "Host": self.iam_host, "Origin": self.iam_url}, allow_redirects=False ) if r_iam2.status_code != 302: diff --git a/ebrains_drive/access.py b/ebrains_drive/file.py similarity index 67% rename from ebrains_drive/access.py rename to ebrains_drive/file.py index 87fbf8a992..ee831941c9 100644 --- a/ebrains_drive/access.py +++ b/ebrains_drive/file.py @@ -1,18 +1,25 @@ from ebrains_drive.repos import Repos from ebrains_drive.files import SeafFile +import re + def get_file_by_url(client, file_url): """Get a single repo associated with specified repo_url Example inputs: 1) https://drive.ebrains.eu/lib/0fee1620-062d-4643-865b-951de1eee355/file/sample-latest.csv 2) https://drive.ebrains.eu/lib/0fee1620-062d-4643-865b-951de1eee355/file/Dir1/data.json """ - if "drive.ebrains.eu/lib/" in file_url: - repo_id = file_url.split("drive.ebrains.eu/lib/")[1].split("/")[0] - file_path = "/" + "/".join(file_url.split("drive.ebrains.eu/lib/")[1].split("/")[2:]) - else: + + regex = r".*\/lib\/(.*)\/file(\/.*)" + + matches = re.search(regex, file_url) + if matches is None: raise ValueError("Parameter `file_url` does not have expected format!") + else: + repo_id = matches.group(1) + file_path = matches.group(2) - repo_obj = Repos(client).get_repo(repo_id) + repo_obj = client.repos.get_repo(repo_id) file_obj = repo_obj.get_file(file_path) return file_obj + \ No newline at end of file diff --git a/ebrains_drive/repos.py b/ebrains_drive/repos.py index e42929a96b..adbd660f11 100644 --- a/ebrains_drive/repos.py +++ b/ebrains_drive/repos.py @@ -1,6 +1,8 @@ from ebrains_drive.repo import Repo from ebrains_drive.utils import raise_does_not_exist +import re + class Repos(object): def __init__(self, client): self.client = client @@ -46,21 +48,24 @@ def get_repos_by_name(self, repo_name): def get_repo_by_url(self, repo_url): """Get a single repo associated with specified repo_url Example inputs: - 1) https://wiki.ebrains.eu/bin/view/Collabs/shailesh-testing/ - 2) wiki.ebrains.eu/bin/view/Collabs/shailesh-testing - 3) shailesh-testing - - Note: not guaranteed to identify as url and repo not easily linkable; url and name need not be same + 1) https://wiki.ebrains.eu/bin/view/Collabs/collab-testing/subpage + 2) wiki.ebrains.eu/bin/view/Collabs/collab-testing + 3) collab-testing """ - if "wiki.ebrains.eu/bin/view/Collabs/" in repo_url: - repo_path = repo_url.split("wiki.ebrains.eu/bin/view/Collabs/")[1] + + regex = r"(?:\/Collabs\/)(.*?)(?:\/.*$|$)" + + matches = re.search(regex, repo_url) + if matches is None: + collab_name = repo_url else: - repo_path = repo_url - repo_path = repo_path.strip("/") + collab_name = matches.group(1) - match_repos = self.get_repos_by_filter("owner", "collab-" + repo_path + "-administrator") + match_repos = self.get_repos_by_filter("owner", "collab-" + collab_name + "-administrator") + if not match_repos: + match_repos = self.get_repos_by_filter("owner", "collab-" + collab_name + "-editor") if not match_repos: - match_repos = self.get_repos_by_filter("owner", "collab-" + repo_path + "-editor") + match_repos = self.get_repos_by_filter("owner", "collab-" + collab_name + "-viewer") if len(match_repos) == 0: raise Exception("Couldn't identify any repo associated with specified URL!") From 643a105ffb8a7989c9f524c93116c9860658896a Mon Sep 17 00:00:00 2001 From: Axel Messinese Date: Mon, 7 Sep 2020 19:16:58 +0200 Subject: [PATCH 31/39] transform File into class as repos for coherence --- ebrains_drive/client.py | 2 ++ ebrains_drive/file.py | 38 +++++++++++++++++++++----------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/ebrains_drive/client.py b/ebrains_drive/client.py index 2a67383a29..7b3d321471 100644 --- a/ebrains_drive/client.py +++ b/ebrains_drive/client.py @@ -2,6 +2,7 @@ from ebrains_drive.utils import urljoin from ebrains_drive.exceptions import ClientHttpError from ebrains_drive.repos import Repos +from ebrains_drive.file import File import re class DriveApiClient(object): @@ -19,6 +20,7 @@ def __init__(self, username=None, password=None, token=None, env=""): self.repos = Repos(self) self.groups = Groups(self) + self.file = File(self) if token is None: self._get_token() diff --git a/ebrains_drive/file.py b/ebrains_drive/file.py index ee831941c9..edbd3bd0b7 100644 --- a/ebrains_drive/file.py +++ b/ebrains_drive/file.py @@ -3,23 +3,27 @@ import re -def get_file_by_url(client, file_url): - """Get a single repo associated with specified repo_url - Example inputs: - 1) https://drive.ebrains.eu/lib/0fee1620-062d-4643-865b-951de1eee355/file/sample-latest.csv - 2) https://drive.ebrains.eu/lib/0fee1620-062d-4643-865b-951de1eee355/file/Dir1/data.json - """ +class File(object): + def __init__(self, client): + self.client = client - regex = r".*\/lib\/(.*)\/file(\/.*)" + def get_file_by_url(self, file_url): + """Get a single repo associated with specified repo_url + Example inputs: + 1) https://drive.ebrains.eu/lib/0fee1620-062d-4643-865b-951de1eee355/file/sample-latest.csv + 2) https://drive.ebrains.eu/lib/0fee1620-062d-4643-865b-951de1eee355/file/Dir1/data.json + """ - matches = re.search(regex, file_url) - if matches is None: - raise ValueError("Parameter `file_url` does not have expected format!") - else: - repo_id = matches.group(1) - file_path = matches.group(2) + regex = r".*\/lib\/(.*)\/file(\/.*)" - repo_obj = client.repos.get_repo(repo_id) - file_obj = repo_obj.get_file(file_path) - return file_obj - \ No newline at end of file + matches = re.search(regex, file_url) + if matches is None: + raise ValueError("Parameter `file_url` does not have expected format!") + else: + repo_id = matches.group(1) + file_path = matches.group(2) + + repo_obj = self.client.repos.get_repo(repo_id) + file_obj = repo_obj.get_file(file_path) + return file_obj + \ No newline at end of file From 8c23246bd85713235264d54cd0c26e90972c17a1 Mon Sep 17 00:00:00 2001 From: Axel Messinese Date: Fri, 11 Sep 2020 11:07:36 +0200 Subject: [PATCH 32/39] package version indexed on git tag --- setup.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 5984ef25f6..ac4a1ebab0 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,13 @@ from setuptools import setup, find_packages +from version_query import predict_version_str -__version__ = '0.1.0' +__version__ = predict_version_str() setup(name='ebrains-drive', version=__version__, license='Apache-2.0 License', - description='Python client interface for HBP Collaboratory Seafile storage', + description='Python client interface for EBrains Collaboratory Seafile storage', author='Ebrains, CNRS', author_email='support@ebrains.eu', url='http://seafile.com', From d5c08d44c423c38e91e246859ab34e2eeca109b1 Mon Sep 17 00:00:00 2001 From: Axel Messinese Date: Fri, 11 Sep 2020 11:15:16 +0200 Subject: [PATCH 33/39] add version-query to requirement --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index f2293605cf..ca04b18d2f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ requests +version-query==1.1.0 From 8bb0198a129343c185ce28f6288aac7639520000 Mon Sep 17 00:00:00 2001 From: Shailesh Appukuttan Date: Fri, 25 Sep 2020 10:03:35 +0200 Subject: [PATCH 34/39] Update links in readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dc9f1624d9..9b1dc4719d 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Updated for integration with HBP v2 Collaboratory's Seafile storage by Shailesh Appukuttan (appukuttan.shailesh@gmail.com) -Documentation: https://github.com/appukuttan-shailesh/hbp-seafile/blob/master/doc.md +Documentation: https://github.com/HumanBrainProject/ebrains-drive/blob/master/doc.md Installation: `pip install ebrains_drive` @@ -59,7 +59,7 @@ Example usage (refer to docs for more): ``` -
    EU Logo
    +
    EU Logo
    ### ACKNOWLEDGEMENTS This open source software code was developed in part in the Human Brain Project, funded from the European Union's Horizon 2020 Framework Programme for Research and Innovation under Specific Grant Agreements No. 720270 and No. 785907 (Human Brain Project SGA1 and SGA2). \ No newline at end of file From 1b14722d103628a5ba87d73dae72e212d6b31ba1 Mon Sep 17 00:00:00 2001 From: Shailesh Appukuttan Date: Wed, 25 Nov 2020 15:10:59 +0100 Subject: [PATCH 35/39] fix for duplicate repos in listing --- ebrains_drive/repos.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/ebrains_drive/repos.py b/ebrains_drive/repos.py index adbd660f11..40118ea781 100644 --- a/ebrains_drive/repos.py +++ b/ebrains_drive/repos.py @@ -23,13 +23,23 @@ def get_repo(self, repo_id): repo_json = self.client.get('/api2/repos/' + repo_id).json() return Repo.from_json(self.client, repo_json) + def _remove_duplicate_repos(self, repos): + unique_repos = [] + for repo in repos: + if repo.id not in [r.id for r in unique_repos]: + unique_repos.append(repo) + else: + if repo.owner != "Organization": + unique_repos = [repo if r.id == repo.id else r for r in unique_repos] + return unique_repos + def list_repos(self): repos_json = self.client.get('/api2/repos/').json() - return [Repo.from_json(self.client, j) for j in repos_json] + repos = [Repo.from_json(self.client, j) for j in repos_json] + return self._remove_duplicate_repos(repos) def get_repos_by_filter(self, filter_name, filter_value): """Get all repos which have `filter_name` = `filter_value`. - Note """ repos_json = self.client.get('/api2/repos/').json() print @@ -37,11 +47,10 @@ def get_repos_by_filter(self, filter_name, filter_value): for j in repos_json: if filter_name in j.keys() and j[filter_name] == filter_value: match_repos.append(Repo.from_json(self.client, j)) - return match_repos + return self._remove_duplicate_repos(match_repos) def get_repos_by_name(self, repo_name): """Get all repos which have the name `repo_name`. - Note: can return multiple entries for same repo (same UUID) """ return self.get_repos_by_filter("name", repo_name) From ec054a84beee4b01e54ac114072cc2c37136f5c3 Mon Sep 17 00:00:00 2001 From: Axel Messinese Date: Mon, 14 Dec 2020 12:45:32 +0100 Subject: [PATCH 36/39] Replace CNRS validation endpoint by an ebrains client --- ebrains_drive/client.py | 53 ++++++++--------------------------------- 1 file changed, 10 insertions(+), 43 deletions(-) diff --git a/ebrains_drive/client.py b/ebrains_drive/client.py index 7b3d321471..319feac77f 100644 --- a/ebrains_drive/client.py +++ b/ebrains_drive/client.py @@ -48,49 +48,16 @@ def get_iam_url(self): return self.iam_url def _get_token(self): - """ - HBP authentication based on _hbp_auth() in - https://github.com/HumanBrainProject/hbp-validation-client) - """ - base_url = "https://validation-v2.brainsimulation.eu" - redirect_uri = base_url + '/auth' - session = requests.Session() - # log-in page of model validation service - r_login = session.get(base_url + "/login", allow_redirects=False) - if r_login.status_code != 302: - raise Exception( - "Something went wrong. Status code {} from login, expected 302" - .format(r_login.status_code)) - # redirects to EBRAINS IAM log-in page - iam_auth_url = r_login.headers.get('location') - r_iam1 = session.get(iam_auth_url, allow_redirects=False) - if r_iam1.status_code != 200: - raise Exception( - "Something went wrong loading EBRAINS log-in page. Status code {}" - .format(r_iam1.status_code)) - # fill-in and submit form - match = re.search(r'action=\"(?P[^\"]+)\"', r_iam1.text) - if not match: - raise Exception("Received an unexpected page") - iam_authenticate_url = match['url'].replace("&", "&") - r_iam2 = session.post( - iam_authenticate_url, - data={"username": self.username, "password": self.password}, - headers={"Referer": iam_auth_url, "Host": self.iam_host, "Origin": self.iam_url}, - allow_redirects=False - ) - if r_iam2.status_code != 302: - raise Exception( - "Something went wrong. Status code {} from authenticate, expected 302" - .format(r_iam2.status_code)) - # redirects back to model validation service - r_val = session.get(r_iam2.headers['Location']) - if r_val.status_code != 200: - raise Exception( - "Something went wrong. Status code {} from final authentication step" - .format(r_val.status_code)) - config = r_val.json() - self._token = config['token']['access_token'] + response = requests.post( + self.iam_url+'/auth/realms/hbp/protocol/openid-connect/token', + auth=('ebrains-drive', ''), + data={ + 'grant_type':'password', + 'username':self.username, + 'password':self.password + }) + + self._token = response.json()['access_token'] def __str__(self): return 'DriveApiClient[server=%s, user=%s]' % (self.server, self.username) From 8ff11fc60e77c1b605485f550efc350c1a5f443a Mon Sep 17 00:00:00 2001 From: Andrew Davison Date: Thu, 3 Jun 2021 20:30:27 +0200 Subject: [PATCH 37/39] Fix capitalisation in setup.py, and change package url to one more specific to this fork. --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index ac4a1ebab0..aad83af910 100644 --- a/setup.py +++ b/setup.py @@ -7,10 +7,10 @@ setup(name='ebrains-drive', version=__version__, license='Apache-2.0 License', - description='Python client interface for EBrains Collaboratory Seafile storage', - author='Ebrains, CNRS', + description='Python client interface for EBRAINS Collaboratory Seafile storage', + author='EBRAINS, CNRS', author_email='support@ebrains.eu', - url='http://seafile.com', + url='https://github.com/HumanBrainProject/ebrains-drive/', platforms=['Any'], packages=find_packages(), install_requires=['requests'], From ebfcf8c44a318c8cded9b83efece5c924a6fe923 Mon Sep 17 00:00:00 2001 From: Andrew Davison Date: Wed, 4 Jan 2023 15:01:20 +0100 Subject: [PATCH 38/39] Remove test data with unknown contents --- tests/data/aliedit.tar.gz | Bin 219668 -> 0 bytes tests/data/test.txt | 3 +++ 2 files changed, 3 insertions(+) delete mode 100644 tests/data/aliedit.tar.gz create mode 100644 tests/data/test.txt diff --git a/tests/data/aliedit.tar.gz b/tests/data/aliedit.tar.gz deleted file mode 100644 index f974b0f1c4c2716b295f7df165645461d578ddfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219668 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ⅇ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 Date: Wed, 4 Jan 2023 15:22:46 +0100 Subject: [PATCH 39/39] trying to get tests to work with drive-int --- ebrains_drive/files.py | 2 +- tests/fixtures.py | 10 ++++++---- tests/test_files.py | 8 ++++---- tests/utils.py | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/ebrains_drive/files.py b/ebrains_drive/files.py index e3744404e3..013061925d 100644 --- a/ebrains_drive/files.py +++ b/ebrains_drive/files.py @@ -190,7 +190,7 @@ def upload(self, fileobj, filename): Return a :class:`SeafFile` object of the newly uploaded file. """ - if isinstance(fileobj, str): + if isinstance(fileobj, bytes): fileobj = io.BytesIO(fileobj) upload_url = self._get_upload_link() files = { diff --git a/tests/fixtures.py b/tests/fixtures.py index 46a30995ea..ac3699000d 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -6,15 +6,17 @@ import ebrains_drive from tests.utils import randstring -SERVER = os.environ.get('SEAFILE_TEST_SERVER_ADDRESS', 'http://127.0.0.1:8000') + USER = os.environ.get('SEAFILE_TEST_USERNAME', 'test@seafiletest.com') -PASSWORD = os.environ.get('SEAFILE_TEST_PASSWORD', 'testtest') +TOKEN = os.environ.get('SEAFILE_TEST_TOKEN', 'testtest') ADMIN_USER = os.environ.get('SEAFILE_TEST_ADMIN_USERNAME', 'admin@seafiletest.com') -ADMIN_PASSWORD = os.environ.get('SEAFILE_TEST_ADMIN_PASSWORD', 'adminadmin') +ADMIN_TOKEN = os.environ.get('SEAFILE_TEST_ADMIN_TOKEN', 'adminadmin') + @pytest.fixture(scope='session') def client(): - return ebrains_drive.connect(SERVER, USER, PASSWORD) + return ebrains_drive.client.DriveApiClient(username=USER, token=TOKEN, env="int") + @pytest.yield_fixture(scope='function') def repo(client): diff --git a/tests/test_files.py b/tests/test_files.py index 111a521372..f240cb0413 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -57,12 +57,12 @@ def test_upload_file(repo, parentpath): else: parentdir = rootdir.mkdir(parentpath[1:]) - fname = 'aliedit.tar.gz' + fname = 'test.txt' fpath = datafile(fname) - with open(fpath, 'r') as fp: + with open(fpath, 'rb') as fp: testfile = parentdir.upload(fp, fname) - with open(fpath, 'r') as fp: + with open(fpath, 'rb') as fp: fcontent = fp.read() assert testfile.size == filesize(fpath) @@ -85,7 +85,7 @@ def test_upload_string_as_file_content(repo): # test pass as string as file content when upload file rootdir = repo.get_dir('/') fname = 'testfile-%s' % randstring() - fcontent = 'line 1\nline 2\n\r' + fcontent = 'line 1\nline 2\n\r'.encode("utf-8") f = rootdir.upload(fcontent, fname) assert f.name == fname assert f.get_content() == fcontent diff --git a/tests/utils.py b/tests/utils.py index 63cc8d6ba1..de0d5ab9d0 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -3,7 +3,7 @@ import random def randstring(length=12): - return ''.join(random.choice(string.lowercase) for i in range(length)) + return ''.join(random.choice(string.ascii_lowercase) for i in range(length)) def datafile(filename): return os.path.join(os.path.dirname(__file__), 'data', filename)