Merge pull request 'Adding nextcloud support' (#5) from nextcloud into dev
adding nextcloud support and minor bug fixes with sqlite Reviewed-on: #5pull/6/head
commit
f1fa4b93e8
@ -0,0 +1,80 @@
|
|||||||
|
"""
|
||||||
|
We are implementing transport to and from nextcloud (just like s3)
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from transport.common import Reader,Writer
|
||||||
|
import pandas as pd
|
||||||
|
from io import StringIO
|
||||||
|
import json
|
||||||
|
import nextcloud_client as nextcloud
|
||||||
|
|
||||||
|
class Nextcloud :
|
||||||
|
def __init__(self,**_args):
|
||||||
|
pass
|
||||||
|
self._delimiter = None
|
||||||
|
self._handler = nextcloud.Client(_args['url'])
|
||||||
|
_uid = _args['uid']
|
||||||
|
_token = _args['token']
|
||||||
|
self._uri = _args['folder'] if 'folder' in _args else './'
|
||||||
|
if self._uri.endswith('/') :
|
||||||
|
self._uri = self._uri[:-1]
|
||||||
|
self._file = None if 'file' not in _args else _args['file']
|
||||||
|
self._handler.login(_uid,_token)
|
||||||
|
def close(self):
|
||||||
|
try:
|
||||||
|
self._handler.logout()
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class NextcloudReader(Nextcloud,Reader):
|
||||||
|
def __init__(self,**_args):
|
||||||
|
# self._file = [] if 'file' not in _args else _args['file']
|
||||||
|
super().__init__(**_args)
|
||||||
|
pass
|
||||||
|
def read(self,**_args):
|
||||||
|
_filename = self._file if 'file' not in _args else _args['file']
|
||||||
|
#
|
||||||
|
# @TODO: if _filename is none, an exception should be raised
|
||||||
|
#
|
||||||
|
_uri = '/'.join([self._uri,_filename])
|
||||||
|
if self._handler.get_file(_uri) :
|
||||||
|
#
|
||||||
|
#
|
||||||
|
_info = self._handler.file_info(_uri)
|
||||||
|
_content = self._handler.get_file_contents(_uri).decode('utf8')
|
||||||
|
if _info.get_content_type() == 'text/csv' :
|
||||||
|
#
|
||||||
|
# @TODO: enable handling of csv, xls, parquet, pickles
|
||||||
|
_file = StringIO(_content)
|
||||||
|
return pd.read_csv(_file)
|
||||||
|
else:
|
||||||
|
#
|
||||||
|
# if it is neither a structured document like csv, we will return the content as is
|
||||||
|
return _content
|
||||||
|
return None
|
||||||
|
class NextcloudWriter (Nextcloud,Writer):
|
||||||
|
"""
|
||||||
|
This class will write data to an instance of nextcloud
|
||||||
|
"""
|
||||||
|
def __init__(self,**_args) :
|
||||||
|
super().__init__(**_args)
|
||||||
|
self
|
||||||
|
def write(self,_data,**_args):
|
||||||
|
"""
|
||||||
|
This function will upload a file to a given destination
|
||||||
|
:file has the uri of the location of the file
|
||||||
|
"""
|
||||||
|
_filename = self._file if 'file' not in _args else _args['file']
|
||||||
|
_uri = '/'.join([self._uri,_filename])
|
||||||
|
if type(_data) == pd.DataFrame :
|
||||||
|
f = StringIO()
|
||||||
|
_data.to_csv(f,index=False)
|
||||||
|
_content = f.getvalue()
|
||||||
|
elif type(_data) == dict :
|
||||||
|
_content = json.dumps(_data)
|
||||||
|
else:
|
||||||
|
_content = str(_data)
|
||||||
|
self._handler.put_file_contents(_uri,_content)
|
||||||
|
|
@ -1,2 +1,2 @@
|
|||||||
__author__ = 'The Phi Technology'
|
__author__ = 'The Phi Technology'
|
||||||
__version__= '1.9.0'
|
__version__= '1.9.2'
|
||||||
|
Loading…
Reference in new issue