Merge pull request 'v2.2.0 - shared environment support and duckdb support' (#20) from v2.2.0 into master
	
		
	
				
					
				
			Reviewed-on: library/data-transport#20master
						commit
						1e7839198a
					
				@ -0,0 +1,102 @@
 | 
				
			||||
import os
 | 
				
			||||
import json
 | 
				
			||||
from info import __version__
 | 
				
			||||
import copy
 | 
				
			||||
import transport
 | 
				
			||||
 | 
				
			||||
"""
 | 
				
			||||
This class manages data from the registry and allows (read only)
 | 
				
			||||
@TODO: add property to the DATA attribute
 | 
				
			||||
"""
 | 
				
			||||
 | 
				
			||||
REGISTRY_PATH=os.sep.join([os.environ['HOME'],'.data-transport'])
 | 
				
			||||
#
 | 
				
			||||
# This path can be overriden by an environment variable ...
 | 
				
			||||
#
 | 
				
			||||
if 'DATA_TRANSPORT_REGISTRY_PATH' in os.environ :
 | 
				
			||||
    REGISTRY_PATH = os.environ['DATA_TRANSPORT_REGISTRY_PATH']
 | 
				
			||||
REGISTRY_FILE= 'transport-registry.json'
 | 
				
			||||
 | 
				
			||||
DATA = {}
 | 
				
			||||
 | 
				
			||||
def isloaded ():
 | 
				
			||||
    return DATA not in [{},None]
 | 
				
			||||
def exists (path=REGISTRY_PATH) :
 | 
				
			||||
    """
 | 
				
			||||
    This function determines if there is a registry at all
 | 
				
			||||
    """
 | 
				
			||||
    p = os.path.exists(path)
 | 
				
			||||
    q = os.path.exists( os.sep.join([path,REGISTRY_FILE]))
 | 
				
			||||
    
 | 
				
			||||
    return p and q
 | 
				
			||||
def load (_path=REGISTRY_PATH):
 | 
				
			||||
    global DATA
 | 
				
			||||
    
 | 
				
			||||
    if exists(_path) :
 | 
				
			||||
        path = os.sep.join([_path,REGISTRY_FILE])
 | 
				
			||||
        f = open(path)
 | 
				
			||||
        DATA = json.loads(f.read())
 | 
				
			||||
        f.close()
 | 
				
			||||
def init (email,path=REGISTRY_PATH,override=False):
 | 
				
			||||
    """
 | 
				
			||||
    Initializing the registry and will raise an exception in the advent of an issue
 | 
				
			||||
    """
 | 
				
			||||
    p = '@' in email
 | 
				
			||||
    q = False if '.' not in email else email.split('.')[-1] in ['edu','com','io','ai','org']
 | 
				
			||||
    if p and q :
 | 
				
			||||
        _config = {"email":email,'version':__version__}
 | 
				
			||||
        if not os.path.exists(path):
 | 
				
			||||
            os.makedirs(path)
 | 
				
			||||
        filename = os.sep.join([path,REGISTRY_FILE])
 | 
				
			||||
        if not os.path.exists(filename) or override == True :
 | 
				
			||||
 | 
				
			||||
            f = open(filename,'w')
 | 
				
			||||
            f.write( json.dumps(_config))
 | 
				
			||||
            f.close()
 | 
				
			||||
            # _msg = f"""{CHECK_MARK} Successfully wrote configuration to {path} from {email}"""
 | 
				
			||||
            
 | 
				
			||||
        else:
 | 
				
			||||
            raise Exception (f"""Unable to write configuration, Please check parameters (or help) and try again""")
 | 
				
			||||
    else:
 | 
				
			||||
        raise Exception (f"""Invalid Input, {email} is not well formatted, provide an email with adequate format""")
 | 
				
			||||
def lookup (label):
 | 
				
			||||
    global DATA
 | 
				
			||||
    return label in DATA
 | 
				
			||||
def get (label='default') :
 | 
				
			||||
    global DATA
 | 
				
			||||
    return copy.copy(DATA[label]) if label in DATA else {}
 | 
				
			||||
 | 
				
			||||
def set (label, auth_file, default=False,path=REGISTRY_PATH) :
 | 
				
			||||
    """
 | 
				
			||||
    This function will add a label (auth-file data) into the registry and can set it as the default
 | 
				
			||||
    """
 | 
				
			||||
    if label == 'default' :
 | 
				
			||||
        raise Exception ("""Invalid label name provided, please change the label name and use the switch""")
 | 
				
			||||
    reg_file = os.sep.join([path,REGISTRY_FILE])
 | 
				
			||||
    if os.path.exists (auth_file) and os.path.exists(path) and os.path.exists(reg_file):
 | 
				
			||||
        f = open(auth_file)
 | 
				
			||||
        _info = json.loads(f.read())
 | 
				
			||||
        f.close()
 | 
				
			||||
        f = open(reg_file)
 | 
				
			||||
        _config = json.loads(f.read())
 | 
				
			||||
        f.close()
 | 
				
			||||
 | 
				
			||||
        #
 | 
				
			||||
        # set the proposed label
 | 
				
			||||
        _object = transport.factory.instance(**_info)
 | 
				
			||||
        if _object :
 | 
				
			||||
            _config[label] = _info
 | 
				
			||||
            if default :
 | 
				
			||||
                _config['default'] = _info
 | 
				
			||||
            #
 | 
				
			||||
            # now we need to write this to the location
 | 
				
			||||
            f = open(reg_file,'w')
 | 
				
			||||
            f.write(json.dumps(_config))
 | 
				
			||||
            f.close()
 | 
				
			||||
        else:
 | 
				
			||||
            raise Exception( f"""Unable to load file locate at {path},\nLearn how to generate auth-file with wizard found at https://healthcareio.the-phi.com/data-transport""")
 | 
				
			||||
        pass         
 | 
				
			||||
    else:
 | 
				
			||||
        pass
 | 
				
			||||
    pass
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,21 @@
 | 
				
			||||
"""
 | 
				
			||||
This module implements the handler for duckdb (in memory or not)
 | 
				
			||||
"""
 | 
				
			||||
from transport.sql.common import Base, BaseReader, BaseWriter
 | 
				
			||||
 | 
				
			||||
class Duck :
 | 
				
			||||
    def __init__(self,**_args):
 | 
				
			||||
        self.database = _args['database']
 | 
				
			||||
    def get_provider(self):
 | 
				
			||||
        return "duckdb"
 | 
				
			||||
    
 | 
				
			||||
    def _get_uri(self,**_args):
 | 
				
			||||
        return f"""duckdb:///{self.database}"""
 | 
				
			||||
class Reader(Duck,BaseReader) :
 | 
				
			||||
    def __init__(self,**_args):
 | 
				
			||||
        Duck.__init__(self,**_args)
 | 
				
			||||
        BaseReader.__init__(self,**_args)
 | 
				
			||||
class Writer(Duck,BaseWriter):
 | 
				
			||||
    def __init__(self,**_args):
 | 
				
			||||
        Duck.__init__(self,**_args)
 | 
				
			||||
        BaseWriter.__init__(self,**_args)
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue