| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- from flask import request, session
- from datetime import datetime
- import re
- # from transport.common import Reader, Writer
- import json
- import requests
- from io import StringIO
- import pandas as pd
- def template():
- return {'url':None, 'headers':{'key':'value'}}
- class Reader:
- """
- This class is designed to read data from an Http request file handler provided to us by flask
- The file will be heald in memory and processed accordingly
- NOTE: This is inefficient and can crash a micro-instance (becareful)
- """
- def __init__(self,**_args):
- self._url = _args['url']
- self._headers = None if 'headers' not in _args else _args['headers']
- self._data = None if 'data' not in _args else _args['data']
- self._method = 'get' if 'method' not in _args else _args['method'].lower()
-
- # def isready(self):
- # return self.file_length > 0
- def format(self,_response):
- _mimetype= _response.headers['Content-Type']
- if 'text/plain' in _mimetype or 'text/csv' in _mimetype:
- _content = _response.text
- return pd.read_csv(StringIO(_content))
- #
- # @TODO: Add support for excel, JSON and other file formats that fit into a data-frame
- #
-
- return _response.text
- def get (self,key,_args):
- """
- This function inspects an argument and tries to determine if the corresponding attribute is set
- i.e the attribute will be prefixed by underscore
-
- """
- _attr = f'_{key}'
- return _args[key] if key in _args else (getattr(self,_attr) if hasattr(self,_attr) else None)
- def read(self,**_args):
- _method = self.get('method',_args)
- _headers = self.get('headers',_args)
- _data = self.get('data',_args)
- _url = self.get('url',_args)
- _requestPpointer = getattr(requests,_method)
- _resp = _requestPpointer(_url,headers=_headers,data=_data)
- return self.format(_resp)
- # if self._headers :
- # r = requests.get(self._url,headers = self._headers)
- # else:
- # r = requests.get(self._url,headers = self._headers)
- # return self.format(r)
-
- class Writer:
- """
- This class is designed to submit data to an endpoint (url)
- """
- def __init__(self,**_args):
- """
- @param key required session key
- """
- self._url = _args['url']
- self._name = _args['name']
- self._method = 'post' if 'method' not in _args else _args['method']
-
- # self.session = params['queue']
- # self.session['sql'] = []
- # self.session['csv'] = []
- # self.tablename = re.sub('..+$','',params['filename'])
- # self.session['uid'] = params['uid']
- #self.xchar = params['xchar']
-
-
- def format_sql(self,row):
- values = "','".join([col.replace('"','').replace("'",'') for col in row])
- return "".join(["INSERT INTO :table VALUES('",values,"');\n"]).replace(':table',self.tablename)
- def isready(self):
- return True
- def write(self,_data,**_args):
- #
- #
- _method = self._method if 'method' not in _args else _args['method']
- _method = _method.lower()
- _mimetype = 'text/csv'
- if type(_data) == dict :
- _mimetype = 'application/json'
- _content = _data
- else:
- _content = _data.to_dict(orient='records')
- _headers = {'Content-Type':_mimetype}
- _pointer = getattr(requests,_method)
-
- _pointer ({self._name:_content},headers=_headers)
- # label = params['label']
- # row = params ['row']
-
- # if label == 'usable':
- # self.session['csv'].append(self.format(row,','))
- # self.session['sql'].append(self.format_sql(row))
|