"""Digital ETL specific utility functions.""" import csv import gzip import json import boto3 from flows import s3 from flows.digital import config as flow_config def send_success_notification(correlation_id, date_end, date_start, upcs): """Send SNS message after ETL completes. Args: correlation_id (str): pre-chained correlation id. date_end (str): YYYY-MM-DD exclusive date end range of ETL. date_start (str): YYYY-MM-DD inclusive date start range of ETL. upcs (list): upcs in the ETL. Returns: dict: with MessageId string. """ payload = { 'action': flow_config.SNS_ACTION_SUCCESS, 'correlation_id': correlation_id, 'date_end': date_end, 'date_start': date_start, 'source': flow_config.SNS_SOURCE, 'upcs': upcs} sns = boto3.client('sns', region_name=flow_config.SNS_REGION_NAME) return sns.publish( TopicArn=flow_config.SNS_TOPIC_ARN, Message=json.dumps(payload), Subject=payload['action']) def queue_build_cache(correlation_id, date_end, date_start, upcs): """Send the build cache job message to SQS. Args: correlation_id (str): pre-chained correlation id. date_end (str): YYYY-MM-DD exclusive date end range of ETL. date_start (str): YYYY-MM-DD inclusive date start range of ETL. upcs (list): upcs in the ETL. Returns: dict: contains message metadata returned from AWS. """ payload = { 'action': flow_config.SQS_BUILD_CACHE_ACTION, 'correlation_id': correlation_id, 'date_end': date_end, 'date_start': date_start, 'source': flow_config.SQS_BUILD_CACHE_SOURCE, 'upcs': upcs} sqs = boto3.client( 'sqs', region_name=flow_config.SQS_BUILD_CACHE_REGION_NAME) return sqs.send_message( QueueUrl=flow_config.SQS_BUILD_CACHE_URL, MessageBody=json.dumps(payload)) def read_csv_from_s3(s3_path): """Read gzipped csv file from s3. Args: s3_path (str): path to csv on s3. Returns: iterable(list): parsed csv entries: [['v1', 'v2'], ['v3', 'v4']]. """ raw = s3.get_object(s3_path).get()['Body'].read() preprocessed = filter( lambda f: len(f) > 0, map( lambda m: m.strip(), gzip.decompress(raw).decode('utf8').split('\n') ) ) yield from csv.reader(preprocessed)