Source code for fhirpack.utils
import logging
import dotenv
import requests
from pathlib import Path
from enum import Enum
from typing import Union
import magic
from fhirpy import SyncFHIRClient
import fhirpack.exceptions as exceptions
import fhirpack as fp
logger = logging.getLogger(__name__)
[docs]def valuesForKeys(data: Union[dict, list], lookupKeys: list):
lookup_keys = list(set(lookupKeys))
if isinstance(data, dict):
for k, v in data.items():
if k in lookup_keys and not isinstance(v, list) and not isinstance(v, dict):
yield v
else:
yield from valuesForKeys(v, lookupKeys)
elif isinstance(data, list):
for item in data:
yield from valuesForKeys(item, lookupKeys)
[docs]def keys(obj, prefix=""):
separator = ""
if prefix:
separator = "."
if isinstance(obj, dict):
for k, v in obj.items():
yield f"{prefix}{separator}{k}"
yield from keys(v, f"{prefix}{separator}{k}")
elif isinstance(obj, list):
for item in obj:
yield from keys(item, prefix)
[docs]def getInstallationPath():
return Path(fp.__file__).parent
[docs]def clientFromEnv():
DOTENVPATH = dotenv.find_dotenv()
CONFIG = dotenv.dotenv_values(DOTENVPATH)
logger.info(f"found .env file at {DOTENVPATH}")
logger.info(f"found {len(CONFIG)} key-value pairs in .env file")
logger.info(f"found .env file at {DOTENVPATH}")
logger.info(f"found {CONFIG} key-value pairs in .env file")
LOGINURL = CONFIG["LOGINURL"]
basicAuth = requests.auth.HTTPBasicAuth(CONFIG["USERNAME"], CONFIG["PASSWORD"])
OAUTHTOKEN = requests.get(LOGINURL, auth=basicAuth).text
dotenv.set_key(DOTENVPATH, "OAUTHTOKEN", OAUTHTOKEN)
logger.info(f"acquired OAuth token: {False if OAUTHTOKEN is None else True}")
AUTHHEADER = f"Bearer {OAUTHTOKEN}"
logger.info(f"FHIR authorization header: {AUTHHEADER[:-30]}")
APIBASE = CONFIG["APIBASE"]
client = SyncFHIRClient(APIBASE, authorization=AUTHHEADER)
return client
# TODO implement
[docs]def textToAscii():
return None
[docs]def guessBufferMIMEType(bytes: bytes):
guessedType = magic.from_buffer(bytes, mime=True).split("/")
if len(guessedType) == 2:
return guessedType[1]
else:
return None
[docs]def flattenList(input: list):
for i in input:
if isinstance(i, list):
yield from flattenList(i)
else:
yield i
[docs]def validateFrame(frame):
if frame.client is None:
raise exceptions.ServerConnectionException(
"No server connection. For this operation, a server connection is required."
)
if frame.isnull().values.any():
raise exceptions.InvalidInputDataException(
"Frame must not contain null values."
)
if not "data" in frame.columns:
raise exceptions.InvalidInputDataException(
"Frame must contain a 'data' column."
)
if isinstance(frame.data.values[0], list):
raise exceptions.InvalidInputDataException(
"Frame object must not contain lists. Most likely, use .explode()"
)
# TODO decide whether we need an alternative not in Frame/PACK
# def getURLBytes(
# input: list[str]= None,
# params: dict = {},
# ):
# if not params:
# params = {}
# print(input)
# results=[]
# for i,url in zip(range(len(input)),input):
# response = requests.get(
# url[0],
# # headers=params['headers'],
# headers=self.client._build_request_headers(),
# stream=True
# )
# data=bytearray()
# if not response.ok:
# raise Exception(f"{response}")
# for block in response.iter_content(1024):
# data.extend(block)
# if not block:
# break
# results.append(data)
# return data