"""Amazon SQS connector.""" import time import boto3 def get_sqs_resources(): """Get SQS client. Returns: boto3.resources.base.ServiceResource: SQS resource represents object-oriented interface of SQS. """ sqs_resource = boto3.resource('sqs') return sqs_resource def get_queue_by_name(queue_name, sqs_resource=None): """Get Amazon SQS queue. Args: queue_name (str): the name of the queue. sqs_resource (boto3.resources.base.ServiceResource): optional SQS resource. Returns: boto3.resources.factory.sqs.Queue: Instance of Amazon SQS queue """ sqs = sqs_resource if sqs_resource else get_sqs_resources() return sqs.get_queue_by_name(QueueName=queue_name) def get_queue_number_of_messages(queue): """Get Amazon SQS queue ApproximateNumberOfMessages (health check). Args: queue (boto3.resources.factory.sqs.Queue): the queue. Returns: int: approximate number of messages """ queue.reload() message_count = int(queue.attributes.get('ApproximateNumberOfMessages')) if message_count == 0: time.sleep(2) queue.reload() message_count = int( queue.attributes.get('ApproximateNumberOfMessages')) return message_count def yield_sublists(src_list, sublist_size): """Yield successive sublist_size length chunks from src_list. Example usage: my_list = [x for x in range(0, 100)] for sublist in yield_sublists(my_list, 10): print(sublist) Args: src_list (list): list to divide sublist_size (int): size of each sublist returned Returns: generator: slices of the original src_list """ for i in range(0, len(src_list), sublist_size): yield src_list[i:i + sublist_size] def get_message(queue): """Receive 1 message from the queue. Args: queue (boto3.resources.factory.sqs.Queue): the SQS queue Returns: boto3.resources.factory.sqs.Message: SQS message or None """ queue.reload() messages = queue.receive_messages( MaxNumberOfMessages=1, WaitTimeSeconds=20, AttributeNames=['All']) if not messages: return None return messages[0]