From 15d48ea253e095bb03e6666b70a170ea14954a31 Mon Sep 17 00:00:00 2001 From: mil1i Date: Tue, 9 Aug 2022 09:32:25 -0600 Subject: [PATCH 1/3] formatting changes --- .vscode/settings.json | 3 + library/security_group_manager.py | 253 ++++++++++++++++++------------ main.py | 199 +++++++++++++++-------- 3 files changed, 292 insertions(+), 163 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..de288e1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.formatting.provider": "black" +} \ No newline at end of file diff --git a/library/security_group_manager.py b/library/security_group_manager.py index f3fafea..df2894f 100644 --- a/library/security_group_manager.py +++ b/library/security_group_manager.py @@ -1,35 +1,33 @@ - - class SecurityGroupManager: def __init__(self, args, session): self.args = args self.aws_connection = session self.aws_region = args.region self.bad_ports = args.ports - self.all_groups = list() - self.all_security_groups = list() - self.groups_in_use = list() - self.bad_groups = list() - self.bad_groups_in_use = list() - self.delete_groups = list() - self.delete_bad_groups = list() - self.instances = list() - self.instances_security_groups = list() - self.elastic_network_instances = list() - self.eni_security_groups = list() - self.ecs_clusters = list() - self.ecs_services = list() - self.ecs_security_groups = list() - self.elb_lbs = list() - self.elb_security_groups = list() - self.elbv2_lbs = list() - self.elbv2_security_groups = list() - self.rds_instances = list() - self.rds_security_groups = list() - self.lambda_functions = list() - self.lambda_security_groups = list() - self.marked_sgs = list() - self.restore_sgs = list() + self.all_groups = [] + self.all_security_groups = [] + self.groups_in_use = [] + self.bad_groups = [] + self.bad_groups_in_use = [] + self.delete_groups = [] + self.delete_bad_groups = [] + self.instances = [] + self.instances_security_groups = [] + self.elastic_network_instances = [] + self.eni_security_groups = [] + self.ecs_clusters = [] + self.ecs_services = [] + self.ecs_security_groups = [] + self.elb_lbs = [] + self.elb_security_groups = [] + self.elbv2_lbs = [] + self.elbv2_security_groups = [] + self.rds_instances = [] + self.rds_security_groups = [] + self.lambda_functions = [] + self.lambda_security_groups = [] + self.marked_sgs = [] + self.restore_sgs = [] # Get ALL security groups names def get_all_security_groups(self): @@ -38,19 +36,27 @@ def get_all_security_groups(self): security_groups_dict = paginator.paginate().build_full_result() self.all_security_groups = security_groups_dict["SecurityGroups"] for group in self.all_security_groups: - if group["GroupName"] in self.args.equals or group["GroupName"].startswith(tuple(self.args.startswith)) \ - or group["GroupName"].endswith(tuple(self.args.endswith)): + if ( + group["GroupName"] in self.args.equals + or group["GroupName"].startswith(tuple(self.args.startswith)) + or group["GroupName"].endswith(tuple(self.args.endswith)) + ): self.groups_in_use.append(group["GroupId"]) for perm in group["IpPermissions"]: try: if perm["FromPort"] == perm["ToPort"]: - if perm["ToPort"] in self.bad_ports and "0.0.0.0/0" in [ip["CidrIp"] for ip in perm["IpRanges"]]: + if perm["ToPort"] in self.bad_ports and "0.0.0.0/0" in [ + ip["CidrIp"] for ip in perm["IpRanges"] + ]: self.bad_groups.append(group["GroupId"]) - elif any([bp in range(perm["FromPort"], perm['ToPort']) for bp in self.bad_ports]) \ - and "0.0.0.0/0" in [ip["CidrIp"] for ip in perm["IpRanges"]]: - self.bad_groups.append(group['GroupId']) + elif any( + [bp in range(perm["FromPort"], perm["ToPort"]) for bp in self.bad_ports] + ) and "0.0.0.0/0" in [ip["CidrIp"] for ip in perm["IpRanges"]]: + self.bad_groups.append(group["GroupId"]) except KeyError: - if perm["IpProtocol"] == "-1" and "0.0.0.0/0" in [ip["CidrIp"] for ip in perm["IpRanges"]]: + if perm["IpProtocol"] == "-1" and "0.0.0.0/0" in [ + ip["CidrIp"] for ip in perm["IpRanges"] + ]: self.bad_groups.append(group["GroupId"]) self.all_groups.append(group["GroupId"]) return self.all_groups @@ -82,77 +88,119 @@ def get_resources_using_group(self, reportdir): try: import xlsxwriter except ImportError as e: + import sys + xlsxwriter = None - exit(f"Missing required dependency: {e.name}") + sys.exit(f"Missing required dependency: {e.name}") import os - workbook = xlsxwriter.Workbook(os.path.join(os.path.abspath(reportdir), "sg-bad-groups.xlsx")) + + workbook = xlsxwriter.Workbook( + os.path.join(os.path.abspath(reportdir), "sg-bad-groups.xlsx") + ) column_title_format = workbook.add_format() column_title_format.set_bold(True) column_title_format.set_bg_color("lime") print("Generating report containing security groups with bad rules...") - resources_using = dict() + resources_using = {} for sg in self.bad_groups_in_use: worksheet = workbook.add_worksheet(sg) col = 0 - resources_using[sg] = dict() - resources_using[sg]["instances"] = list() - resources_using[sg]["eni"] = list() - resources_using[sg]["ecs"] = list() - resources_using[sg]["elb"] = list() - resources_using[sg]["elbv2"] = list() - resources_using[sg]["rds"] = list() - resources_using[sg]["lambda"] = list() + resources_using[sg] = {} + resources_using[sg]["instances"] = [] + resources_using[sg]["eni"] = [] + resources_using[sg]["ecs"] = [] + resources_using[sg]["elb"] = [] + resources_using[sg]["elbv2"] = [] + resources_using[sg]["rds"] = [] + resources_using[sg]["lambda"] = [] # EC2 Instances for inst in self.instances_security_groups: for i, sgs in inst.items(): if sg in sgs: resources_using[sg]["instances"].append(i) - col = self._populate_xlsx_column(sheet=worksheet, column_num=col, resource=resources_using[sg]["instances"], - column_id="EC2 InstanceId", column_format=column_title_format) + col = self._populate_xlsx_column( + sheet=worksheet, + column_num=col, + resource=resources_using[sg]["instances"], + column_id="EC2 InstanceId", + column_format=column_title_format, + ) # Elastic Network Interfaces for i in self.eni_security_groups: for e, sgs in i.items(): if sg in sgs: resources_using[sg]["eni"].append(e) - col = self._populate_xlsx_column(sheet=worksheet, column_num=col, resource=resources_using[sg]["eni"], - column_id="ENI Id", column_format=column_title_format) + col = self._populate_xlsx_column( + sheet=worksheet, + column_num=col, + resource=resources_using[sg]["eni"], + column_id="ENI Id", + column_format=column_title_format, + ) # ECS Services for svc in self.ecs_services: for s, sgs in svc.items(): if sg in sgs: resources_using[sg]["ecs"].append(s) - col = self._populate_xlsx_column(sheet=worksheet, column_num=col, resource=resources_using[sg]["ecs"], - column_id="ECS Service", column_format=column_title_format) + col = self._populate_xlsx_column( + sheet=worksheet, + column_num=col, + resource=resources_using[sg]["ecs"], + column_id="ECS Service", + column_format=column_title_format, + ) # ELBv1 for elb in self.elb_security_groups: for e1, sgs in elb.items(): if sg in sgs: resources_using[sg]["elb"].append(e1) - col = self._populate_xlsx_column(sheet=worksheet, column_num=col, resource=resources_using[sg]["elb"], - column_id="ELB Id", column_format=column_title_format) + col = self._populate_xlsx_column( + sheet=worksheet, + column_num=col, + resource=resources_using[sg]["elb"], + column_id="ELB Id", + column_format=column_title_format, + ) # ELBv2 for elbv2 in self.elbv2_security_groups: for e2, sgs in elbv2.items(): if sg in sgs: resources_using[sg]["elbv2"].append(e2) - col = self._populate_xlsx_column(sheet=worksheet, column_num=col, resource=resources_using[sg]["elbv2"], - column_id="ELBv2 Id", column_format=column_title_format) + col = self._populate_xlsx_column( + sheet=worksheet, + column_num=col, + resource=resources_using[sg]["elbv2"], + column_id="ELBv2 Id", + column_format=column_title_format, + ) # RDS Instances for rdi in self.rds_security_groups: for r, sgs in rdi.items(): if sg in sgs: resources_using[sg]["rds"].append(r) - col = self._populate_xlsx_column(sheet=worksheet, column_num=col, resource=resources_using[sg]["rds"], - column_id="RDS InstanceId", column_format=column_title_format) + col = self._populate_xlsx_column( + sheet=worksheet, + column_num=col, + resource=resources_using[sg]["rds"], + column_id="RDS InstanceId", + column_format=column_title_format, + ) # Lambda Functions for lf in self.lambda_security_groups: for f, sgs in lf.items(): if sg in sgs: resources_using[sg]["lambda"].append(f) - col = self._populate_xlsx_column(sheet=worksheet, column_num=col, resource=resources_using[sg]["lambda"], - column_id="Lambda Function", column_format=column_title_format) + col = self._populate_xlsx_column( + sheet=worksheet, + column_num=col, + resource=resources_using[sg]["lambda"], + column_id="Lambda Function", + column_format=column_title_format, + ) workbook.close() - print(f"Report generated and saved to: {os.path.join(os.path.abspath(reportdir), 'sg-bad-groups.xlsx')}") + print( + f"Report generated and saved to: {os.path.join(os.path.abspath(reportdir), 'sg-bad-groups.xlsx')}" + ) return resources_using def get_unused_groups(self): @@ -211,7 +259,7 @@ def _get_instances(self): # Get all security groups used by instances def get_instance_security_groups(self): for inst in self._get_instances(): - sg_in_group = list() + sg_in_group = [] for sg in inst["SecurityGroups"]: self._add_to_groups_in_use(sg["GroupId"]) self._find_bad_security_groups(sg["GroupId"]) @@ -229,7 +277,7 @@ def _get_elastic_network_interfaces(self): # Security Groups in use by Network Interfaces def get_eni_security_groups(self): for i in self._get_elastic_network_interfaces(): - sg_in_group = list() + sg_in_group = [] for sg in i["Groups"]: self._add_to_groups_in_use(sg["GroupId"]) self._find_bad_security_groups(sg["GroupId"]) @@ -247,7 +295,7 @@ def _get_elb(self): # Security groups used by classic ELBs def get_elb_security_groups(self): for lb in self._get_elb(): - sg_in_group = list() + sg_in_group = [] for sg in lb["SecurityGroups"]: self._add_to_groups_in_use(sg) self._find_bad_security_groups(sg) @@ -265,7 +313,7 @@ def _get_elbv2(self): # Security groups used by ALBs def get_elbv2_security_groups(self): for lb in self._get_elbv2(): - sg_in_group = list() + sg_in_group = [] try: # if i["Type"] == "network": # continue @@ -288,7 +336,7 @@ def _get_rds_instances(self): # Security groups used by RDS def get_rds_security_groups(self): for rdi in self._get_rds_instances(): - sg_in_group = list() + sg_in_group = [] for sg in rdi["VpcSecurityGroups"]: self._add_to_groups_in_use(sg["VpcSecurityGroupId"]) self._find_bad_security_groups(sg["VpcSecurityGroupId"]) @@ -298,7 +346,7 @@ def get_rds_security_groups(self): def _get_lambda_functions(self): lambda_client = self.aws_connection.client("lambda", region_name=self.aws_region) - paginator = lambda_client.get_paginator('list_functions') + paginator = lambda_client.get_paginator("list_functions") lambda_functions = paginator.paginate().build_full_result() self.lambda_functions = [function for function in lambda_functions["Functions"]] return self.lambda_functions @@ -307,7 +355,7 @@ def _get_lambda_functions(self): def get_lambda_security_groups(self): for function in self._get_lambda_functions(): functionName = function["FunctionName"] - sg_in_group = list() + sg_in_group = [] try: functionVpcConfig = function["VpcConfig"] functionSecurityGroupIds = functionVpcConfig["SecurityGroupIds"] @@ -343,14 +391,19 @@ def get_ecs_services_security_groups(self): for svc in service: sgs_service = [] try: - sgs_service = [sg for sg in - service[svc]["networkConfiguration"]["awsvpcConfiguration"]["securityGroups"]] + sgs_service = list( + service[svc]["networkConfiguration"]["awsvpcConfiguration"][ + "securityGroups" + ] + ) except KeyError: pass sgs_deployments = [] try: - svc_deployments = [deployment["networkConfiguration"]["awsvpcConfiguration"]["securityGroups"] - for deployment in service[svc]["deployments"]] + svc_deployments = [ + deployment["networkConfiguration"]["awsvpcConfiguration"]["securityGroups"] + for deployment in service[svc]["deployments"] + ] sgs_deployments = [sg for sg in svc_deployments] except KeyError: pass @@ -368,18 +421,24 @@ def get_ecs_services_security_groups(self): def dump_to_file(sgdir, sg): import json import os + import sys + try: - fobj = open(os.path.join(os.path.abspath(sgdir), f"{sg['GroupId']}.{sg['GroupName']}.json"), "w+") + fobj = open( + os.path.join(os.path.abspath(sgdir), f"{sg['GroupId']}.{sg['GroupName']}.json"), + "w+", + ) fobj.truncate() json.dump(sg, fobj) except FileExistsError as err: - exit(f"Unable to create file:\n {err}") + sys.exit(f"Unable to create file:\n {err}") # Read security group from json dump def load_from_file(self, sgdir): import json import glob import os + try: files = [f for f in glob.glob(os.path.join(os.path.abspath(sgdir), "*.json"))] for file in files: @@ -388,65 +447,63 @@ def load_from_file(self, sgdir): self.restore_sgs.append(sgobj) return self.restore_sgs except FileNotFoundError as err: - exit(f"Unable to locate files:\n {err}") + import sys + + sys.exit(f"Unable to locate files:\n {err}") # Restore security groups def restore_security_groups(self, ec2): import botocore.exceptions + for sg in self.restore_sgs: load_sg = ec2.SecurityGroup(sg["GroupId"]) try: load_sg.create_tags( DryRun=self.args.dryrun, Tags=[ - { - "Key": "MarkedForDeletion", - "Value": "false" - }, - ] + {"Key": "MarkedForDeletion", "Value": "false"}, + ], ) except botocore.exceptions.ClientError as error: - if error.response["Error"]["Code"] == 'DryRunOperation': + if error.response["Error"]["Code"] == "DryRunOperation": print(f"DryRunOperation - CreateTags: {error.response['Error']['Message']}") if self.args.restore_ingress_rules: try: load_sg.authorize_ingress( - DryRun=self.args.dryrun, - IpPermissions=sg["IpPermissions"] + DryRun=self.args.dryrun, IpPermissions=sg["IpPermissions"] ) except botocore.exceptions.ClientError as error: - if error.response["Error"]["Code"] == 'DryRunOperation': - print(f"DryRunOperation - AuthorizeIngress: {error.response['Error']['Message']}\n") - print(f"Restored security group: \'{sg['GroupId']}\'") + if error.response["Error"]["Code"] == "DryRunOperation": + print( + f"DryRunOperation - AuthorizeIngress: {error.response['Error']['Message']}\n" + ) + print(f"Restored security group: '{sg['GroupId']}'") # Mark for Deletion preparation def mark_for_deletion(self, ec2, sg): import botocore.exceptions + tag_client = self.aws_connection.client("ec2", region_name=self.aws_region) if self.is_marked_for_deletion(tag_client, sg): - print(f"security group already marked for deletion: \'{sg['GroupId']}\'") + print(f"security group already marked for deletion: '{sg['GroupId']}'") return marked_sg = ec2.SecurityGroup(sg["GroupId"]) try: - print(f"creating tag to mark security group for deletion: \'{sg['GroupId']}\'") + print(f"creating tag to mark security group for deletion: '{sg['GroupId']}'") marked_sg.create_tags( DryRun=self.args.dryrun, Tags=[ - { - "Key": "MarkedForDeletion", - "Value": "true" - }, - ] + {"Key": "MarkedForDeletion", "Value": "true"}, + ], ) except botocore.exceptions.ClientError as error: - if error.response["Error"]["Code"] == 'DryRunOperation': + if error.response["Error"]["Code"] == "DryRunOperation": print(f"DryRunOperation - CreateTags: {error.response['Error']['Message']}") if self.args.remove_ingress_rules: try: - marked_sg.revoke_ingress( - DryRun=self.args.dryrun, - IpPermissions=sg["IpPermissions"] - ) + marked_sg.revoke_ingress(DryRun=self.args.dryrun, IpPermissions=sg["IpPermissions"]) except botocore.exceptions.ClientError as error: - if error.response["Error"]["Code"] == 'DryRunOperation': - print(f"DryRunOperation - RevokeIngress: {error.response['Error']['Message']}\n") + if error.response["Error"]["Code"] == "DryRunOperation": + print( + f"DryRunOperation - RevokeIngress: {error.response['Error']['Message']}\n" + ) diff --git a/main.py b/main.py index 5cf0eeb..d3974d2 100644 --- a/main.py +++ b/main.py @@ -1,11 +1,15 @@ #!/usr/bin/env python3 + +import sys + try: import boto3 import botocore.exceptions except ImportError as e: boto3, botocore, botocore.exceptions = None, None, None - exit("You must install boto3 python module in order to run this tool!") + sys.exit("You must install boto3 python module in order to run this tool!") + import argparse import os from library.security_group_manager import SecurityGroupManager @@ -17,37 +21,95 @@ def main(): # Parse arguments parser = argparse.ArgumentParser(description="Show unused security groups") - parser.add_argument("--profile", type=str, default=default_profile, help="AWS Profile to use for making the call") - parser.add_argument("-r", "--region", type=str, default=default_region, help="The default region is us-east-1.") - parser.add_argument("-p", "--ports", type=int, nargs="+", - default=[20, 21, 22, 389, 53, 445, 1433, 1434, 3306, 3389, 4333, 5432, 5500], - help="Specify ports deemed bad to be opened to the public to filter for. (seperate by space)") - parser.add_argument("--equals", type=str, nargs="+", dest="equals", - default=["default", "eks-cluster-default"], - help="Specify security group names to whitelist, exact match. (seperate by space)") - parser.add_argument("--starts-with", type=str, nargs="+", dest="startswith", - default=["d-", "AWS-OpsWorks-", "aurora-rds-"], - help="Specify security group names to whitelist, name starts with. (seperate by space)") - parser.add_argument("--ends-with", type=str, nargs="+", dest="endswith", - default=["-ecs-service-sg", "-ecs-task-sg"], - help="Specify security group names to whitelist, name ends with. (seperate by space)") - parser.add_argument("--outdir", type=str, default=None, help="Directory to dump security groups in json format") - parser.add_argument("--restore", type=str, default=None, help="Directory to use to restore SecurityGroups from") - parser.add_argument("--restore-ingress-rules", dest="restore_ingress_rules", action="store_true", - help="Restore ingress rules to security group when restoring from backup") - parser.add_argument("--report", type=str, default=None, help="Directory to create the security output report in") - parser.add_argument("-b", "--bad-only", dest="badonly", - help="Filter for only ports flagged as bad", action="store_true") - parser.add_argument("-d", "--delete", help="Delete security groups from AWS", action="store_true") - parser.add_argument("-m", "--mark", help="Mark security group for removal prior to deleting", action="store_true") - parser.add_argument("--remove-ingress-rules", dest="remove_ingress_rules", action="store_true", - help="Remove ingress rules from security group when marking for deletion") - parser.add_argument("--dryrun", help="Enable the DryRun flag to not make changes to any resources", - action="store_true") + parser.add_argument( + "--profile", + type=str, + default=default_profile, + help="AWS Profile to use for making the call", + ) + parser.add_argument( + "-r", "--region", type=str, default=default_region, help="The default region is us-east-1." + ) + parser.add_argument( + "-p", + "--ports", + type=int, + nargs="+", + default=[20, 21, 22, 389, 53, 445, 1433, 1434, 3306, 3389, 4333, 5432, 5500], + help="Specify ports deemed bad to be opened to the public to filter for. (seperate by space)", + ) + parser.add_argument( + "--equals", + type=str, + nargs="+", + dest="equals", + default=["default", "eks-cluster-default"], + help="Specify security group names to whitelist, exact match. (seperate by space)", + ) + parser.add_argument( + "--starts-with", + type=str, + nargs="+", + dest="startswith", + default=["d-", "AWS-OpsWorks-", "aurora-rds-"], + help="Specify security group names to whitelist, name starts with. (seperate by space)", + ) + parser.add_argument( + "--ends-with", + type=str, + nargs="+", + dest="endswith", + default=["-ecs-service-sg", "-ecs-task-sg"], + help="Specify security group names to whitelist, name ends with. (seperate by space)", + ) + parser.add_argument( + "--outdir", type=str, default=None, help="Directory to dump security groups in json format" + ) + parser.add_argument( + "--restore", type=str, default=None, help="Directory to use to restore SecurityGroups from" + ) + parser.add_argument( + "--restore-ingress-rules", + dest="restore_ingress_rules", + action="store_true", + help="Restore ingress rules to security group when restoring from backup", + ) + parser.add_argument( + "--report", type=str, default=None, help="Directory to create the security output report in" + ) + parser.add_argument( + "-b", + "--bad-only", + dest="badonly", + help="Filter for only ports flagged as bad", + action="store_true", + ) + parser.add_argument( + "-d", "--delete", help="Delete security groups from AWS", action="store_true" + ) + parser.add_argument( + "-m", + "--mark", + help="Mark security group for removal prior to deleting", + action="store_true", + ) + parser.add_argument( + "--remove-ingress-rules", + dest="remove_ingress_rules", + action="store_true", + help="Remove ingress rules from security group when marking for deletion", + ) + parser.add_argument( + "--dryrun", + help="Enable the DryRun flag to not make changes to any resources", + action="store_true", + ) args = parser.parse_args() if args.mark and not args.outdir: - exit("Please specify a directory to backup security groups to before marking for deletion") + sys.exit( + "Please specify a directory to backup security groups to before marking for deletion" + ) if args.profile: session = boto3.Session(profile_name=args.profile, region_name=args.region) @@ -61,32 +123,35 @@ def main(): ec2resource = session.resource("ec2", region_name=args.region) if len(sg_manager.marked_sgs) <= 0: print("No security groups marked for deletion!") - exit(0) + sys.exit(0) for sg in sg_manager.marked_sgs: delete_sg = ec2resource.SecurityGroup(sg["GroupId"]) try: delete_sg.delete(DryRun=args.dryrun) print(f"{sg['GroupId']}: deleted security group") except botocore.exceptions.ClientError as error: - if error.response["Error"]["Code"] == 'DryRunOperation': - print(f"DryRunOperation - DeleteSecurityGroup ({sg['GroupId']}):" - f" {error.response['Error']['Message']}") + if error.response["Error"]["Code"] == "DryRunOperation": + print( + f"DryRunOperation - DeleteSecurityGroup ({sg['GroupId']}):" + f" {error.response['Error']['Message']}" + ) print(f"Deleted {len(sg_manager.marked_sgs)} security groups") - exit(0) + sys.exit(0) if args.restore: sg_manager.load_from_file(args.restore) ec2resource = session.resource("ec2", region_name=args.region) sg_manager.restore_security_groups(ec2resource) print(f"Completed restoring security groups from '{args.restore}'") - exit(0) + sys.exit(0) sg_manager.get_unused_groups() if args.outdir: for sg in sg_manager.all_security_groups: - if sg["GroupId"] in sg_manager.delete_bad_groups or \ - (sg["GroupId"] in sg_manager.delete_groups and not args.badonly): + if sg["GroupId"] in sg_manager.delete_bad_groups or ( + sg["GroupId"] in sg_manager.delete_groups and not args.badonly + ): ec2client = session.client("ec2", region_name=args.region) if not sg_manager.is_marked_for_deletion(ec2client, sg): sg_manager.dump_to_file(args.outdir, sg) @@ -98,34 +163,38 @@ def main(): sg_manager.get_resources_using_group(args.report) if len(set(sg_manager.delete_groups)) > 0: - print("---------------") - print("Activity Report") - print("---------------") - - print(u"Total number of EC2 Instances evaluated: {0:d}".format(len(sg_manager.instances))) - print(u"Total number of ECS Clusters evaluated: {0:d}".format(len(sg_manager.ecs_clusters))) - print(u"Total number of ECS Services evaluated: {0:d}".format(len(sg_manager.ecs_services))) - print(u"Total number of Load Balancers evaluated: {0:d}".format(len(sg_manager.elb_lbs) + - len(sg_manager.elbv2_lbs))) - print(u"Total number of RDS Instances evaluated: {0:d}".format(len(sg_manager.rds_instances))) - print(u"Total number of Network Interfaces evaluated: {0:d}".format(len(sg_manager.elastic_network_instances))) - print(u"Total number of Lambda Functions evaluated: {0:d}".format(len(sg_manager.lambda_functions))) - - print("\n---------------") - print("SUMMARY") - print("---------------") - print(u"Total number of Security Groups evaluated: {0:d}".format(len(set(sg_manager.all_groups)))) - - print("\n---IN-USE----\n") - print(u"Total number of Security Groups in-use evaluated: {0:d}".format(len(set(sg_manager.groups_in_use)))) - print(u"Total number of Bad Security Groups in-use evaluated: {0:d}".format( - len(set(sg_manager.bad_groups_in_use)))) - print("\n--NOT-IN-USE--\n") - print(u"Total number of Unused Security Groups targeted for removal: {0:d}". - format(len(set(sg_manager.delete_groups)))) - print(u"Total number of Unused Bad Security Groups targeted for removal: {0:d}". - format(len(set(sg_manager.delete_bad_groups)))) - print("---------------") + print( + f""" +--------------- +Activity Report +--------------- + +Total number of EC2 Instances evaluated: {len(sg_manager.instances):d} +Total number of ECS Clusters evaluated: {len(sg_manager.ecs_clusters):d} +Total number of ECS Services evaluated: {len(sg_manager.ecs_services):d} +Total number of Load Balancers evaluated: {(len(sg_manager.elb_lbs) + len(sg_manager.elbv2_lbs)):d} +Total number of RDS Instances evaluated: {len(sg_manager.rds_instances):d} +Total number of Network Interfaces evaluated: {len(sg_manager.elastic_network_instances):d} +Total number of Lambda Functions evaluated: {len(sg_manager.lambda_functions):d} + +--------------- +SUMMARY +--------------- +Total number of Security Groups evaluated: {len(set(sg_manager.all_groups)):d} + + +--IN-USE-- + +Total number of Security Groups in-use evaluated: {len(set(sg_manager.groups_in_use)):d} +Total number of Bad Security Groups in-use evaluated: {len(set(sg_manager.bad_groups_in_use)):d} + +--NOT-IN-USE-- + +Total number of Unused Security Groups targeted for removal: {len(set(sg_manager.delete_groups)):d}" +Total number of Unused Bad Security Groups targeted for removal: {len(set(sg_manager.delete_bad_groups)):d} +--------------- +""" + ) if __name__ == "__main__": From 2065b7dec9102f8c071406fe8b73efc1017e6c3d Mon Sep 17 00:00:00 2001 From: mil1i Date: Tue, 9 Aug 2022 14:52:17 -0600 Subject: [PATCH 2/3] Update poetry dependencies --- library/security_group_manager.py | 2 +- poetry.lock | 492 ++++++++++++++++++++++++++++++ pyproject.toml | 1 + requirements.txt | 206 ++++++++++++- 4 files changed, 684 insertions(+), 17 deletions(-) create mode 100644 poetry.lock diff --git a/library/security_group_manager.py b/library/security_group_manager.py index df2894f..6166286 100644 --- a/library/security_group_manager.py +++ b/library/security_group_manager.py @@ -435,8 +435,8 @@ def dump_to_file(sgdir, sg): # Read security group from json dump def load_from_file(self, sgdir): - import json import glob + import json import os try: diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..5a2da54 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,492 @@ +[[package]] +name = "astroid" +version = "2.11.7" +description = "An abstract syntax tree for Python with inference support." +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} +wrapt = ">=1.11,<2" + +[[package]] +name = "black" +version = "22.6.0" +description = "The uncompromising code formatter." +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "boto3" +version = "1.24.48" +description = "The AWS SDK for Python" +category = "main" +optional = false +python-versions = ">= 3.7" + +[package.dependencies] +botocore = ">=1.27.48,<1.28.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.6.0,<0.7.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.27.48" +description = "Low-level, data-driven core of boto 3." +category = "main" +optional = false +python-versions = ">= 3.7" + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = ">=1.25.4,<1.27" + +[package.extras] +crt = ["awscrt (==0.13.8)"] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.5" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "dill" +version = "0.3.5.1" +description = "serialize all of python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "main" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "lazy-object-proxy" +version = "1.7.1" +description = "A fast and thorough lazy object proxy." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] + +[[package]] +name = "pylint" +version = "2.14.5" +description = "python code static checker" +category = "main" +optional = false +python-versions = ">=3.7.2" + +[package.dependencies] +astroid = ">=2.11.6,<=2.12.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = ">=0.2" +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "s3transfer" +version = "0.6.0" +description = "An Amazon S3 Transfer Manager" +category = "main" +optional = false +python-versions = ">= 3.7" + +[package.dependencies] +botocore = ">=1.12.36,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "tomlkit" +version = "0.11.2" +description = "Style preserving TOML library" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "typing-extensions" +version = "4.3.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "urllib3" +version = "1.26.11" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "wrapt" +version = "1.14.1" +description = "Module for decorators, wrappers and monkey patching." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "xlsxwriter" +version = "1.4.5" +description = "A Python module for creating Excel XLSX files." +category = "main" +optional = false +python-versions = "*" + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "12b66d81091c12ca24e44d22db008b1398df0668934ef0e7f32ba4e104ea39fe" + +[metadata.files] +astroid = [ + {file = "astroid-2.11.7-py3-none-any.whl", hash = "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b"}, + {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, +] +black = [ + {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, + {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, + {file = "black-22.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6797f58943fceb1c461fb572edbe828d811e719c24e03375fd25170ada53825e"}, + {file = "black-22.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c85928b9d5f83b23cee7d0efcb310172412fbf7cb9d9ce963bd67fd141781def"}, + {file = "black-22.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6fe02afde060bbeef044af7996f335fbe90b039ccf3f5eb8f16df8b20f77666"}, + {file = "black-22.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cfaf3895a9634e882bf9d2363fed5af8888802d670f58b279b0bece00e9a872d"}, + {file = "black-22.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94783f636bca89f11eb5d50437e8e17fbc6a929a628d82304c80fa9cd945f256"}, + {file = "black-22.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2ea29072e954a4d55a2ff58971b83365eba5d3d357352a07a7a4df0d95f51c78"}, + {file = "black-22.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e439798f819d49ba1c0bd9664427a05aab79bfba777a6db94fd4e56fae0cb849"}, + {file = "black-22.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187d96c5e713f441a5829e77120c269b6514418f4513a390b0499b0987f2ff1c"}, + {file = "black-22.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:074458dc2f6e0d3dab7928d4417bb6957bb834434516f21514138437accdbe90"}, + {file = "black-22.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a218d7e5856f91d20f04e931b6f16d15356db1c846ee55f01bac297a705ca24f"}, + {file = "black-22.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:568ac3c465b1c8b34b61cd7a4e349e93f91abf0f9371eda1cf87194663ab684e"}, + {file = "black-22.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c1734ab264b8f7929cef8ae5f900b85d579e6cbfde09d7387da8f04771b51c6"}, + {file = "black-22.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a3ac16efe9ec7d7381ddebcc022119794872abce99475345c5a61aa18c45ad"}, + {file = "black-22.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b9fd45787ba8aa3f5e0a0a98920c1012c884622c6c920dbe98dbd05bc7c70fbf"}, + {file = "black-22.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ba9be198ecca5031cd78745780d65a3f75a34b2ff9be5837045dce55db83d1c"}, + {file = "black-22.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3db5b6409b96d9bd543323b23ef32a1a2b06416d525d27e0f67e74f1446c8f2"}, + {file = "black-22.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:560558527e52ce8afba936fcce93a7411ab40c7d5fe8c2463e279e843c0328ee"}, + {file = "black-22.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b154e6bbde1e79ea3260c4b40c0b7b3109ffcdf7bc4ebf8859169a6af72cd70b"}, + {file = "black-22.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:4af5bc0e1f96be5ae9bd7aaec219c901a94d6caa2484c21983d043371c733fc4"}, + {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, + {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, +] +boto3 = [ + {file = "boto3-1.24.48-py3-none-any.whl", hash = "sha256:632676a480854d7c18ae634e2e83a93dc27211b88e19340e047bbd432128819e"}, + {file = "boto3-1.24.48.tar.gz", hash = "sha256:db27c33a7ccccbf76035ab47e92054ce8ab98b809cf49eb15a2502eedc3ba332"}, +] +botocore = [ + {file = "botocore-1.27.48-py3-none-any.whl", hash = "sha256:5958ef6dd3b0f84eb1ee0aac75499ac504fcc0787fd6611be727968d51dcbfa7"}, + {file = "botocore-1.27.48.tar.gz", hash = "sha256:8de2f4285046ed306439723a11706067d6901c3f7be418b7b104ba8e002b5638"}, +] +click = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] +colorama = [ + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, +] +dill = [ + {file = "dill-0.3.5.1-py2.py3-none-any.whl", hash = "sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302"}, + {file = "dill-0.3.5.1.tar.gz", hash = "sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +jmespath = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] +lazy-object-proxy = [ + {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"}, + {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, +] +mccabe = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pylint = [ + {file = "pylint-2.14.5-py3-none-any.whl", hash = "sha256:fabe30000de7d07636d2e82c9a518ad5ad7908590fe135ace169b44839c15f90"}, + {file = "pylint-2.14.5.tar.gz", hash = "sha256:487ce2192eee48211269a0e976421f334cf94de1806ca9d0a99449adcdf0285e"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +s3transfer = [ + {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, + {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +tomlkit = [ + {file = "tomlkit-0.11.2-py3-none-any.whl", hash = "sha256:69e0675671a2eed1c08a53f342c955c4ead5d373a10f756219bf39f3d4f0018a"}, + {file = "tomlkit-0.11.2.tar.gz", hash = "sha256:d1b49c3e460f5910b22d799b13513504acb4f5fcaee01660ee66f07bd45a271c"}, +] +typing-extensions = [ + {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"}, + {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"}, +] +urllib3 = [ + {file = "urllib3-1.26.11-py2.py3-none-any.whl", hash = "sha256:c33ccba33c819596124764c23a97d25f32b28433ba0dedeb77d873a38722c9bc"}, + {file = "urllib3-1.26.11.tar.gz", hash = "sha256:ea6e8fb210b19d950fab93b60c9009226c63a28808bc8386e05301e25883ac0a"}, +] +wrapt = [ + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, +] +xlsxwriter = [ + {file = "XlsxWriter-1.4.5-py2.py3-none-any.whl", hash = "sha256:f9335f1736e2c4fd80e940fe1b6d92d967bf454a1e5d639b0b7a4459ade790cc"}, + {file = "XlsxWriter-1.4.5.tar.gz", hash = "sha256:0956747859567ec01907e561a7d8413de18a7aae36860f979f9da52b9d58bc19"}, +] diff --git a/pyproject.toml b/pyproject.toml index ab5a95a..ce78c56 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,6 +10,7 @@ boto3 = "^1.18.10" pylint = "^2.9.6" astroid = "^2.6.5" xlsxwriter = "^1.4.4" +black = "^22.6.0" [tool.poetry.dev-dependencies] diff --git a/requirements.txt b/requirements.txt index 0da2e09..fcaaea7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,16 +1,190 @@ -astroid>=2.6.5 -boto3>=1.18.10 -botocore>=1.21.10 -isort>=5.8.0 -jmespath>=0.10.0 -lazy-object-proxy>=1.6.0 -mccabe>=0.6.1 -pylint>=2.7.4 -python-dateutil>=2.8.1 -s3transfer>=0.5.0 -six>=1.16.0 -toml>=0.10.2 -urllib3>=1.26.6 -wheel>=0.36.2 -wrapt>=1.12.1 -xlsxwriter>=1.4.4 \ No newline at end of file +astroid==2.11.7; python_full_version >= "3.6.2" \ + --hash=sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b \ + --hash=sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946 +black==22.6.0; python_full_version >= "3.6.2" \ + --hash=sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69 \ + --hash=sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807 \ + --hash=sha256:6797f58943fceb1c461fb572edbe828d811e719c24e03375fd25170ada53825e \ + --hash=sha256:c85928b9d5f83b23cee7d0efcb310172412fbf7cb9d9ce963bd67fd141781def \ + --hash=sha256:f6fe02afde060bbeef044af7996f335fbe90b039ccf3f5eb8f16df8b20f77666 \ + --hash=sha256:cfaf3895a9634e882bf9d2363fed5af8888802d670f58b279b0bece00e9a872d \ + --hash=sha256:94783f636bca89f11eb5d50437e8e17fbc6a929a628d82304c80fa9cd945f256 \ + --hash=sha256:2ea29072e954a4d55a2ff58971b83365eba5d3d357352a07a7a4df0d95f51c78 \ + --hash=sha256:e439798f819d49ba1c0bd9664427a05aab79bfba777a6db94fd4e56fae0cb849 \ + --hash=sha256:187d96c5e713f441a5829e77120c269b6514418f4513a390b0499b0987f2ff1c \ + --hash=sha256:074458dc2f6e0d3dab7928d4417bb6957bb834434516f21514138437accdbe90 \ + --hash=sha256:a218d7e5856f91d20f04e931b6f16d15356db1c846ee55f01bac297a705ca24f \ + --hash=sha256:568ac3c465b1c8b34b61cd7a4e349e93f91abf0f9371eda1cf87194663ab684e \ + --hash=sha256:6c1734ab264b8f7929cef8ae5f900b85d579e6cbfde09d7387da8f04771b51c6 \ + --hash=sha256:c9a3ac16efe9ec7d7381ddebcc022119794872abce99475345c5a61aa18c45ad \ + --hash=sha256:b9fd45787ba8aa3f5e0a0a98920c1012c884622c6c920dbe98dbd05bc7c70fbf \ + --hash=sha256:7ba9be198ecca5031cd78745780d65a3f75a34b2ff9be5837045dce55db83d1c \ + --hash=sha256:a3db5b6409b96d9bd543323b23ef32a1a2b06416d525d27e0f67e74f1446c8f2 \ + --hash=sha256:560558527e52ce8afba936fcce93a7411ab40c7d5fe8c2463e279e843c0328ee \ + --hash=sha256:b154e6bbde1e79ea3260c4b40c0b7b3109ffcdf7bc4ebf8859169a6af72cd70b \ + --hash=sha256:4af5bc0e1f96be5ae9bd7aaec219c901a94d6caa2484c21983d043371c733fc4 \ + --hash=sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c \ + --hash=sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9 +boto3==1.24.48; python_version >= "3.7" \ + --hash=sha256:632676a480854d7c18ae634e2e83a93dc27211b88e19340e047bbd432128819e \ + --hash=sha256:db27c33a7ccccbf76035ab47e92054ce8ab98b809cf49eb15a2502eedc3ba332 +botocore==1.27.48; python_version >= "3.7" \ + --hash=sha256:5958ef6dd3b0f84eb1ee0aac75499ac504fcc0787fd6611be727968d51dcbfa7 \ + --hash=sha256:8de2f4285046ed306439723a11706067d6901c3f7be418b7b104ba8e002b5638 +click==8.1.3; python_version >= "3.7" and python_full_version >= "3.6.2" \ + --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 \ + --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e +colorama==0.4.5; sys_platform == "win32" and python_full_version >= "3.7.2" and python_version >= "3.7" and platform_system == "Windows" \ + --hash=sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da \ + --hash=sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4 +dill==0.3.5.1; python_full_version >= "3.7.2" \ + --hash=sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302 \ + --hash=sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86 +isort==5.10.1; python_full_version >= "3.7.2" and python_version < "4.0" \ + --hash=sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7 \ + --hash=sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951 +jmespath==1.0.1; python_version >= "3.7" \ + --hash=sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980 \ + --hash=sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe +lazy-object-proxy==1.7.1; python_version >= "3.6" and python_full_version >= "3.7.2" \ + --hash=sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4 \ + --hash=sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b \ + --hash=sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36 \ + --hash=sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb \ + --hash=sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443 \ + --hash=sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b \ + --hash=sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9 \ + --hash=sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd \ + --hash=sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442 \ + --hash=sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c \ + --hash=sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44 \ + --hash=sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1 \ + --hash=sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc \ + --hash=sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb \ + --hash=sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35 \ + --hash=sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0 \ + --hash=sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6 \ + --hash=sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c \ + --hash=sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42 \ + --hash=sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029 \ + --hash=sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69 \ + --hash=sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28 \ + --hash=sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a \ + --hash=sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e \ + --hash=sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38 \ + --hash=sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7 \ + --hash=sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a \ + --hash=sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55 \ + --hash=sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148 \ + --hash=sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de \ + --hash=sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad \ + --hash=sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1 \ + --hash=sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8 \ + --hash=sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09 \ + --hash=sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f \ + --hash=sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61 \ + --hash=sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84 +mccabe==0.7.0; python_version >= "3.6" and python_full_version >= "3.7.2" \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e \ + --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 +mypy-extensions==0.4.3; python_full_version >= "3.6.2" \ + --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ + --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 +pathspec==0.9.0; python_full_version >= "3.6.2" \ + --hash=sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a \ + --hash=sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1 +platformdirs==2.5.2; python_version >= "3.7" and python_full_version >= "3.7.2" \ + --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ + --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 +pylint==2.14.5; python_full_version >= "3.7.2" \ + --hash=sha256:fabe30000de7d07636d2e82c9a518ad5ad7908590fe135ace169b44839c15f90 \ + --hash=sha256:487ce2192eee48211269a0e976421f334cf94de1806ca9d0a99449adcdf0285e +python-dateutil==2.8.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7" \ + --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 +s3transfer==0.6.0; python_version >= "3.7" \ + --hash=sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd \ + --hash=sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947 +six==1.16.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7" \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 +tomli==2.0.1; python_version < "3.11" and python_full_version >= "3.7.2" and python_version >= "3.7" and python_full_version < "3.11.0a7" \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f +tomlkit==0.11.2; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.2" \ + --hash=sha256:69e0675671a2eed1c08a53f342c955c4ead5d373a10f756219bf39f3d4f0018a \ + --hash=sha256:d1b49c3e460f5910b22d799b13513504acb4f5fcaee01660ee66f07bd45a271c +typing-extensions==4.3.0; python_version < "3.10" and python_full_version >= "3.7.2" and python_version >= "3.7" \ + --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ + --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 +urllib3==1.26.11; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7" \ + --hash=sha256:c33ccba33c819596124764c23a97d25f32b28433ba0dedeb77d873a38722c9bc \ + --hash=sha256:ea6e8fb210b19d950fab93b60c9009226c63a28808bc8386e05301e25883ac0a +wrapt==1.14.1; python_full_version >= "3.7.2" \ + --hash=sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3 \ + --hash=sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef \ + --hash=sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28 \ + --hash=sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59 \ + --hash=sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87 \ + --hash=sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1 \ + --hash=sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b \ + --hash=sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462 \ + --hash=sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1 \ + --hash=sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320 \ + --hash=sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2 \ + --hash=sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4 \ + --hash=sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069 \ + --hash=sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310 \ + --hash=sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f \ + --hash=sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656 \ + --hash=sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c \ + --hash=sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8 \ + --hash=sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164 \ + --hash=sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907 \ + --hash=sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3 \ + --hash=sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3 \ + --hash=sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d \ + --hash=sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7 \ + --hash=sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00 \ + --hash=sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4 \ + --hash=sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1 \ + --hash=sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1 \ + --hash=sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff \ + --hash=sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d \ + --hash=sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1 \ + --hash=sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569 \ + --hash=sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed \ + --hash=sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471 \ + --hash=sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248 \ + --hash=sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68 \ + --hash=sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d \ + --hash=sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77 \ + --hash=sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7 \ + --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ + --hash=sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a \ + --hash=sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853 \ + --hash=sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c \ + --hash=sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456 \ + --hash=sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f \ + --hash=sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc \ + --hash=sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1 \ + --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af \ + --hash=sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b \ + --hash=sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0 \ + --hash=sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57 \ + --hash=sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5 \ + --hash=sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d \ + --hash=sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383 \ + --hash=sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7 \ + --hash=sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86 \ + --hash=sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735 \ + --hash=sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b \ + --hash=sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3 \ + --hash=sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3 \ + --hash=sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe \ + --hash=sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5 \ + --hash=sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb \ + --hash=sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d +xlsxwriter==1.4.5 \ + --hash=sha256:f9335f1736e2c4fd80e940fe1b6d92d967bf454a1e5d639b0b7a4459ade790cc \ + --hash=sha256:0956747859567ec01907e561a7d8413de18a7aae36860f979f9da52b9d58bc19 From e4a945d45deda7bdf2a906aebcf535604859ac22 Mon Sep 17 00:00:00 2001 From: mil1i Date: Tue, 9 Aug 2022 15:50:23 -0600 Subject: [PATCH 3/3] Add setup.cfg --- library/security_group_manager.py | 2 +- poetry.lock | 78 ++++++++++++++++++++++++++++++- pyproject.toml | 4 ++ setup.cfg | 2 + 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 setup.cfg diff --git a/library/security_group_manager.py b/library/security_group_manager.py index 6166286..03be81b 100644 --- a/library/security_group_manager.py +++ b/library/security_group_manager.py @@ -229,7 +229,7 @@ def get_marked_for_deletion_groups(self): for tag in sg["Tags"]: if tag["Key"] == "MarkedForDeletion" and tag["Value"] == "true": self.marked_sgs.append(sg) - except KeyError as err: + except KeyError: continue return self.marked_sgs diff --git a/poetry.lock b/poetry.lock index 5a2da54..d312209 100644 --- a/poetry.lock +++ b/poetry.lock @@ -95,6 +95,46 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, [package.extras] graph = ["objgraph (>=1.7.2)"] +[[package]] +name = "flake8" +version = "5.0.4" +description = "the modular source code checker: pep8 pyflakes and co" +category = "main" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" + +[[package]] +name = "flake8-black" +version = "0.3.3" +description = "flake8 plugin to call black as a code style validator" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +black = ">=22.1.0" +flake8 = ">=3.0.0" +tomli = "*" + +[[package]] +name = "flake8-length" +version = "0.3.0" +description = "Flake8 plugin for a smart line length validation." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +flake8 = "*" + +[package.extras] +dev = ["pytest", "mypy", "isort"] + [[package]] name = "isort" version = "5.10.1" @@ -161,6 +201,22 @@ python-versions = ">=3.7" docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] +[[package]] +name = "pycodestyle" +version = "2.9.1" +description = "Python style guide checker" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "pylint" version = "2.14.5" @@ -273,7 +329,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "12b66d81091c12ca24e44d22db008b1398df0668934ef0e7f32ba4e104ea39fe" +content-hash = "4ff84de57dec35fae7ab1e216f6e1a487a5ead705f55fba5540cfd6e3a497742" [metadata.files] astroid = [ @@ -325,6 +381,18 @@ dill = [ {file = "dill-0.3.5.1-py2.py3-none-any.whl", hash = "sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302"}, {file = "dill-0.3.5.1.tar.gz", hash = "sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86"}, ] +flake8 = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] +flake8-black = [ + {file = "flake8-black-0.3.3.tar.gz", hash = "sha256:8211f5e20e954cb57c709acccf2f3281ce27016d4c4b989c3e51f878bb7ce12a"}, + {file = "flake8_black-0.3.3-py3-none-any.whl", hash = "sha256:7d667d0059fd1aa468de1669d77cc934b7f1feeac258d57bdae69a8e73c4cd90"}, +] +flake8-length = [ + {file = "flake8-length-0.3.0.tar.gz", hash = "sha256:6e3c068005b0b3b5c8345923fe3e9a107c980baa1354dd19d820018f87409427"}, + {file = "flake8_length-0.3.0-py3-none-any.whl", hash = "sha256:8d042a8879719b72a2b6ac598d133763bbc53c463b22a64655c93237af913d4e"}, +] isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, @@ -388,6 +456,14 @@ platformdirs = [ {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] +pycodestyle = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] +pyflakes = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] pylint = [ {file = "pylint-2.14.5-py3-none-any.whl", hash = "sha256:fabe30000de7d07636d2e82c9a518ad5ad7908590fe135ace169b44839c15f90"}, {file = "pylint-2.14.5.tar.gz", hash = "sha256:487ce2192eee48211269a0e976421f334cf94de1806ca9d0a99449adcdf0285e"}, diff --git a/pyproject.toml b/pyproject.toml index ce78c56..89f3a63 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,8 +11,12 @@ pylint = "^2.9.6" astroid = "^2.6.5" xlsxwriter = "^1.4.4" black = "^22.6.0" +flake8-black = "^0.3.3" +flake8-length = "^0.3.0" +flake8 = "^5.0.4" [tool.poetry.dev-dependencies] +flake8 = "^5.0.4" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..51b50a0 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 100 \ No newline at end of file