From df8df347efe19ff583dcddba2bc6b3eeec4bf17d Mon Sep 17 00:00:00 2001 From: Danny Ullrich <42869122+ullrichd21@users.noreply.github.com> Date: Thu, 28 Jul 2022 19:43:54 -0400 Subject: [PATCH 001/207] Add JSON output with "--report" or "-r" flags. --- gatorgrade/main.py | 4 +-- gatorgrade/output/output_functions.py | 28 ++++++++++++++----- .../output/output_percentage_printing.py | 3 +- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 3f64675a..6e9aa381 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -18,13 +18,13 @@ def gatorgrade( ctx: typer.Context, filename: Path = typer.Option(FILE, "--config", "-c", help="Name of the yml file."), + report: Path = typer.Option(None, "--report", "-r", help="Name of the report file"), ): """Run the GatorGrader checks in the gatorgrade.yml file.""" # check if ctx.subcommand is none if ctx.invoked_subcommand is None: checks = parse_config(filename) - run_and_display_command_checks(checks) - + run_and_display_command_checks(checks, report=report) @app.command() def generate( diff --git a/gatorgrade/output/output_functions.py b/gatorgrade/output/output_functions.py index 0026de2b..f7544fba 100644 --- a/gatorgrade/output/output_functions.py +++ b/gatorgrade/output/output_functions.py @@ -4,6 +4,9 @@ for the output team. For instance, functions dealing with percentage output, description output, and colorization of text. """ +import json +import traceback + import typer import gator from gatorgrade.output import output_percentage_printing @@ -48,15 +51,15 @@ def run_commands_and_return_results(commands_input): try: result = gator.grader(command) # disable pylint so the more general Exception class can be used - except Exception as command_exception: # pylint: disable=W0703 - bad_command = command_exception.__class__ - result = (command, False, bad_command) + except Exception: # pylint: disable=W0703 + # bad_command = command_exception.__class__ + result = (command, False, traceback.format_exc()) results.append(result) return results -def display_check_results(results): +def display_check_results(results, output_file=None): """ Process results and determine if the check passed or failed. @@ -76,6 +79,10 @@ def display_check_results(results): output_passed_checks(passed_checks) output_failed_checks(failed_checks) + if output_file is not None: + return passed_checks, failed_checks + return None, None + def output_passed_checks(passed_checks): """Output the results for all of the checks that passed using the passed_checks list.""" @@ -98,7 +105,7 @@ def output_failed_checks(failed_checks): typer.secho(f" \u2192 {description}", fg=typer.colors.YELLOW) -def run_and_display_command_checks(commands): +def run_and_display_command_checks(commands, report=None): """Run commands through GatorGrader and display them to the user. Args: @@ -116,5 +123,12 @@ def run_and_display_command_checks(commands): '--arg', '1', '--directory', './home', '--file', 'file.py']]} """ results = run_commands_and_return_results(commands) - display_check_results(results) - typer.echo(output_percentage_printing.print_percentage(results)) + passed_checks, failed_checks = display_check_results(results, output_file=report) + percent_string, percent = output_percentage_printing.print_percentage(results) + typer.echo(percent_string) + + if report is not None: + r = {"passed_checks": passed_checks, "failed_checks": failed_checks, "percent": percent} + with open(report, "w") as f: + f.write(json.dumps(r)) + f.close() diff --git a/gatorgrade/output/output_percentage_printing.py b/gatorgrade/output/output_percentage_printing.py index 4cfb06af..3d5a51fc 100644 --- a/gatorgrade/output/output_percentage_printing.py +++ b/gatorgrade/output/output_percentage_printing.py @@ -27,5 +27,4 @@ def print_percentage(results): f"Passing {len(true_list)}/{len(results)}, Grade is {percent}%.", fg=typer.colors.RED, ) - - return result + return result, percent From 6d7d223e67aa598d7ad5b5fc00db25dd38588f9c Mon Sep 17 00:00:00 2001 From: Danny Ullrich <42869122+ullrichd21@users.noreply.github.com> Date: Tue, 23 Aug 2022 13:25:08 -0400 Subject: [PATCH 002/207] Fix test to support returned tuple. --- tests/test_output_percentage_print.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_output_percentage_print.py b/tests/test_output_percentage_print.py index 81db6e27..70626360 100644 --- a/tests/test_output_percentage_print.py +++ b/tests/test_output_percentage_print.py @@ -21,7 +21,7 @@ def test_given_results_returns_percent_incorrect(): ] expected_result = "Passing 3/5, Grade is 60.0%." - actual_result = output_percentage_printing.print_percentage(results) + actual_result, _ = output_percentage_printing.print_percentage(results) assert expected_result in actual_result @@ -43,5 +43,5 @@ def test_given_results_returns_percent_correct(): ("Have a total of 8 commits, 5 of which were created by you", True, ""), ] expected_result = "Passing all GatorGrader Checks 100.0%" - actual_result = output_percentage_printing.print_percentage(results) + actual_result, _ = output_percentage_printing.print_percentage(results) assert expected_result in actual_result From 6c0ee64be8b005a3f663d7fdf735ee56f2672fcd Mon Sep 17 00:00:00 2001 From: Danny Ullrich <42869122+ullrichd21@users.noreply.github.com> Date: Tue, 23 Aug 2022 13:34:45 -0400 Subject: [PATCH 003/207] Fix codestyle/linting. --- gatorgrade/main.py | 1 + gatorgrade/output/output_functions.py | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 6e9aa381..bdcf161d 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -26,6 +26,7 @@ def gatorgrade( checks = parse_config(filename) run_and_display_command_checks(checks, report=report) + @app.command() def generate( root: Path = typer.Argument( diff --git a/gatorgrade/output/output_functions.py b/gatorgrade/output/output_functions.py index f7544fba..57e5939e 100644 --- a/gatorgrade/output/output_functions.py +++ b/gatorgrade/output/output_functions.py @@ -128,7 +128,11 @@ def run_and_display_command_checks(commands, report=None): typer.echo(percent_string) if report is not None: - r = {"passed_checks": passed_checks, "failed_checks": failed_checks, "percent": percent} + r = { + "passed_checks": passed_checks, + "failed_checks": failed_checks, + "percent": percent, + } with open(report, "w") as f: f.write(json.dumps(r)) f.close() From feae40dd68195cb7cc1f9b63937267e517faae03 Mon Sep 17 00:00:00 2001 From: Danny Ullrich <42869122+ullrichd21@users.noreply.github.com> Date: Tue, 23 Aug 2022 13:39:32 -0400 Subject: [PATCH 004/207] Fix codestyle/linting, add encoding type. --- gatorgrade/output/output_functions.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gatorgrade/output/output_functions.py b/gatorgrade/output/output_functions.py index 57e5939e..c4ceec73 100644 --- a/gatorgrade/output/output_functions.py +++ b/gatorgrade/output/output_functions.py @@ -128,11 +128,11 @@ def run_and_display_command_checks(commands, report=None): typer.echo(percent_string) if report is not None: - r = { + report_json = { "passed_checks": passed_checks, "failed_checks": failed_checks, "percent": percent, } - with open(report, "w") as f: - f.write(json.dumps(r)) - f.close() + with open(report, "w", encoding='utf-8') as file: + file.write(json.dumps(report_json)) + file.close() From 58dc7c2745fb3121db086e3ee9fc5809e1c6f148 Mon Sep 17 00:00:00 2001 From: Danny Ullrich <42869122+ullrichd21@users.noreply.github.com> Date: Tue, 23 Aug 2022 13:42:27 -0400 Subject: [PATCH 005/207] Fix codestyle/linting. --- gatorgrade/output/output_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output_functions.py b/gatorgrade/output/output_functions.py index c4ceec73..13e5b42e 100644 --- a/gatorgrade/output/output_functions.py +++ b/gatorgrade/output/output_functions.py @@ -133,6 +133,6 @@ def run_and_display_command_checks(commands, report=None): "failed_checks": failed_checks, "percent": percent, } - with open(report, "w", encoding='utf-8') as file: + with open(report, "w", encoding="utf-8") as file: file.write(json.dumps(report_json)) file.close() From 44fcc8173143ee25369c1e76ab2e2840e16a9cef Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Thu, 8 Sep 2022 10:39:38 -0400 Subject: [PATCH 006/207] feat: Add draft of new help message with version info in main. --- gatorgrade/main.py | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 23fd8b04..4e7edcf2 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -6,6 +6,7 @@ import typer from rich.console import Console +from gatorgrade import version from gatorgrade.input.parse_config import parse_config from gatorgrade.output.output import run_checks @@ -14,12 +15,48 @@ # define the emoji that will be prepended to the help message gatorgrade_emoji = "🐊" +# define the current version of GatorGrade +gatorgrade_version = version.get_gatorgrade_version() + +# define the GitHub repository URL for GatorGrade +gatorgrade_github = "https://github.com/GatorEducator/gatorgrade" + +# define the current version of GatorGrader +gatorgrader_version = version.get_gatorgrader_version() + +# define the GitHub repository URL for GatorGrader +gatorgrader_github = "https://github.com/GatorEducator/gatorgrader" + +# define the overall help message +help_message = ( + f"{gatorgrade_emoji} Run the GatorGrader checks in the specified gatorgrade.yml file." + f"\n\n\t  GatorGrade Version: {gatorgrade_version}" +) + +help_message = f""" + :crocodile: Run the GatorGrader checks in the specified configuration file. + + * GatorGrade version: {gatorgrade_version} + + * GatorGrader version: {gatorgrader_version} + """ + +epilog_message = f""" + :tada: Want to contribute to the project? Check these sites! + + * GatorGrade: {gatorgrade_github} + + * GatorGrader: {gatorgrader_github} + """ + # create a Typer app that # --> does not support completion # --> has a specified help message with an emoji app = typer.Typer( add_completion=False, - help=f"{gatorgrade_emoji} Run the GatorGrader checks in the specified gatorgrade.yml file.", + epilog=epilog_message, + help=help_message, + rich_markup_mode="markdown", ) # create a default console for printing with rich @@ -35,7 +72,7 @@ def gatorgrade( ctx: typer.Context, filename: Path = typer.Option(FILE, "--config", "-c", help="Name of the YML file."), ): - """Run the GatorGrader checks in the specified gatorgrade.yml file.""" + """Run the GatorGrader checks in the specified configuration file.""" # if ctx.subcommand is None then this means # that, by default, gatorgrade should run in checking mode if ctx.invoked_subcommand is None: From 50b5e6126b1e51df6d7541789643734e5b609435 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Thu, 8 Sep 2022 10:40:00 -0400 Subject: [PATCH 007/207] feat: Add version module with get_gatorgrade_version and get_gatorgrader_version. --- gatorgrade/version.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 gatorgrade/version.py diff --git a/gatorgrade/version.py b/gatorgrade/version.py new file mode 100644 index 00000000..81519552 --- /dev/null +++ b/gatorgrade/version.py @@ -0,0 +1,15 @@ +"""Extract version information for display in various aspects of the command-line interface.""" + +from importlib.metadata import version + + +def get_gatorgrade_version() -> str: + """Determine and return the information about GatorGrade's version.""" + gatorgrade_version_str = version("gatorgrade") + return gatorgrade_version_str + + +def get_gatorgrader_version() -> str: + """Determine and return the information about GatorGrade's version.""" + gatorgrader_version_str = version("gatorgrader") + return gatorgrader_version_str From d779154faec79be550fe52bad1e81875f668c297 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Thu, 8 Sep 2022 10:43:41 -0400 Subject: [PATCH 008/207] fix: Refine the phrase in the epilog_message in main. --- gatorgrade/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 4e7edcf2..7706964b 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -42,7 +42,7 @@ """ epilog_message = f""" - :tada: Want to contribute to the project? Check these sites! + :tada: Want to contribute to this project? Check these GitHub sites! * GatorGrade: {gatorgrade_github} From babc8272d2418099b500197681e203f46c53dc25 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Thu, 8 Sep 2022 11:40:57 -0400 Subject: [PATCH 009/207] refactor: Reorganize gatorgrade function in main to handle version parameter. --- gatorgrade/main.py | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 7706964b..0dc39a61 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -63,6 +63,7 @@ console = Console() # define constants used in this module +DEFAULT_VERSION = False FILE = "gatorgrade.yml" FAILURE = 1 @@ -71,32 +72,36 @@ def gatorgrade( ctx: typer.Context, filename: Path = typer.Option(FILE, "--config", "-c", help="Name of the YML file."), + version: bool = typer.Option(DEFAULT_VERSION, "--version", "-v", help="Display version information."), ): """Run the GatorGrader checks in the specified configuration file.""" # if ctx.subcommand is None then this means # that, by default, gatorgrade should run in checking mode if ctx.invoked_subcommand is None: - # parse the provided configuration file - checks = parse_config(filename) - # there are valid checks and thus the - # tool should run them with run_checks - if len(checks) > 0: - checks_status = run_checks(checks) - # no checks were created and this means - # that, most likely, the file was not - # valid and thus the tool cannot run checks + if not version: + # parse the provided configuration file + checks = parse_config(filename) + # there are valid checks and thus the + # tool should run them with run_checks + if len(checks) > 0: + checks_status = run_checks(checks) + # no checks were created and this means + # that, most likely, the file was not + # valid and thus the tool cannot run checks + else: + checks_status = False + console.print() + console.print(f"The file {filename} either does not exist or is not valid.") + console.print("Exiting now!") + console.print() + # at least one of the checks did not pass or + # the provided file was not valid and thus + # the tool should return a non-zero exit + # code to designate some type of failure + if checks_status is not True: + sys.exit(FAILURE) else: - checks_status = False - console.print() - console.print(f"The file {filename} either does not exist or is not valid.") - console.print("Exiting now!") - console.print() - # at least one of the checks did not pass or - # the provided file was not valid and thus - # the tool should return a non-zero exit - # code to designate some type of failure - if checks_status is not True: - sys.exit(FAILURE) + console.print(version) # @app.command() From 04a29e94bf505eb68ec2b9d803b04f971e1b5b76 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Thu, 8 Sep 2022 11:42:54 -0400 Subject: [PATCH 010/207] fix: Delete the extra help_message not needed in main module. --- gatorgrade/main.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 0dc39a61..052efdce 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -28,11 +28,6 @@ gatorgrader_github = "https://github.com/GatorEducator/gatorgrader" # define the overall help message -help_message = ( - f"{gatorgrade_emoji} Run the GatorGrader checks in the specified gatorgrade.yml file." - f"\n\n\t  GatorGrade Version: {gatorgrade_version}" -) - help_message = f""" :crocodile: Run the GatorGrader checks in the specified configuration file. @@ -78,7 +73,9 @@ def gatorgrade( # if ctx.subcommand is None then this means # that, by default, gatorgrade should run in checking mode if ctx.invoked_subcommand is None: - if not version: + if version: + console.print(version) + else: # parse the provided configuration file checks = parse_config(filename) # there are valid checks and thus the @@ -100,8 +97,6 @@ def gatorgrade( # code to designate some type of failure if checks_status is not True: sys.exit(FAILURE) - else: - console.print(version) # @app.command() From e95731aa91f72ba34a458fda81225030207f454f Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 12:22:10 -0400 Subject: [PATCH 011/207] feat: Add get_project_version and refactor version functions. --- gatorgrade/version.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/gatorgrade/version.py b/gatorgrade/version.py index 81519552..4a876a90 100644 --- a/gatorgrade/version.py +++ b/gatorgrade/version.py @@ -2,14 +2,23 @@ from importlib.metadata import version +COLON = ":" +SPACE = " " + + +def get_project_version(project: str) -> str: + """Extract the version information for a project and return formatted version string.""" + project_version_str = version(project) + return project + COLON + SPACE + project_version_str + def get_gatorgrade_version() -> str: """Determine and return the information about GatorGrade's version.""" - gatorgrade_version_str = version("gatorgrade") + gatorgrade_version_str = get_project_version("gatorgrade") return gatorgrade_version_str def get_gatorgrader_version() -> str: """Determine and return the information about GatorGrade's version.""" - gatorgrader_version_str = version("gatorgrader") + gatorgrader_version_str = get_project_version("gatorgrader") return gatorgrader_version_str From 8372f9f0bb0bab6bb0395380abb89d43bd94e716 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 12:22:40 -0400 Subject: [PATCH 012/207] refactor: Use improved markdown version strings in the main module. --- gatorgrade/main.py | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 052efdce..85bda112 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -5,6 +5,7 @@ import typer from rich.console import Console +from rich.markdown import Markdown from gatorgrade import version from gatorgrade.input.parse_config import parse_config @@ -27,16 +28,27 @@ # define the GitHub repository URL for GatorGrader gatorgrader_github = "https://github.com/GatorEducator/gatorgrader" +# define the version message with markdown formatting +version_info_markdown = f""" + :wrench: Version information: + + - {gatorgrade_version} + + - {gatorgrader_version} +""" + # define the overall help message -help_message = f""" +help_message_markdown = f""" :crocodile: Run the GatorGrader checks in the specified configuration file. + """ - * GatorGrade version: {gatorgrade_version} +# # define the overall help message +# help_message_markdown = f":crocodile: Run the GatorGrader checks in the specified configuration file. \b\n\n\n {version_info_markdown}" + +epilog_message_markdown = f""" + {version_info_markdown} - * GatorGrader version: {gatorgrader_version} - """ -epilog_message = f""" :tada: Want to contribute to this project? Check these GitHub sites! * GatorGrade: {gatorgrade_github} @@ -49,8 +61,8 @@ # --> has a specified help message with an emoji app = typer.Typer( add_completion=False, - epilog=epilog_message, - help=help_message, + epilog=epilog_message_markdown, + help=help_message_markdown, rich_markup_mode="markdown", ) @@ -67,14 +79,16 @@ def gatorgrade( ctx: typer.Context, filename: Path = typer.Option(FILE, "--config", "-c", help="Name of the YML file."), - version: bool = typer.Option(DEFAULT_VERSION, "--version", "-v", help="Display version information."), + version: bool = typer.Option( + DEFAULT_VERSION, "--version", "-v", help="Display version information." + ), ): """Run the GatorGrader checks in the specified configuration file.""" # if ctx.subcommand is None then this means # that, by default, gatorgrade should run in checking mode if ctx.invoked_subcommand is None: if version: - console.print(version) + console.print() else: # parse the provided configuration file checks = parse_config(filename) @@ -88,7 +102,9 @@ def gatorgrade( else: checks_status = False console.print() - console.print(f"The file {filename} either does not exist or is not valid.") + console.print( + f"The file {filename} either does not exist or is not valid." + ) console.print("Exiting now!") console.print() # at least one of the checks did not pass or From b2a7f617666d99ff95667f4e04aa70b4f4e03886 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 12:22:55 -0400 Subject: [PATCH 013/207] refactor: Remove a not-needed and commented-out global message in main. --- gatorgrade/main.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 85bda112..2f6c3733 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -42,9 +42,6 @@ :crocodile: Run the GatorGrader checks in the specified configuration file. """ -# # define the overall help message -# help_message_markdown = f":crocodile: Run the GatorGrader checks in the specified configuration file. \b\n\n\n {version_info_markdown}" - epilog_message_markdown = f""" {version_info_markdown} From 60639018cfefa0c9f667a1f93a37bc089f80b4f2 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 12:35:03 -0400 Subject: [PATCH 014/207] feat: Add constants and all projects in PROJECTS list in version. --- gatorgrade/version.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gatorgrade/version.py b/gatorgrade/version.py index 4a876a90..2e42f084 100644 --- a/gatorgrade/version.py +++ b/gatorgrade/version.py @@ -1,9 +1,16 @@ """Extract version information for display in various aspects of the command-line interface.""" from importlib.metadata import version +from typing import List COLON = ":" +DASH = "-" SPACE = " " +NEWLINE = "\n" +NEWLINE_NEWLINE = "\n\n" + + +PROJECTS = ["gatorgrade", "gatorgrader", "pyyaml", "rich", "typer"] def get_project_version(project: str) -> str: @@ -22,3 +29,12 @@ def get_gatorgrader_version() -> str: """Determine and return the information about GatorGrade's version.""" gatorgrader_version_str = get_project_version("gatorgrader") return gatorgrader_version_str + + +def get_project_versions(project_list: List[str] = PROJECTS) -> str: + """Create a version string for all specified projects.""" + project_version_str = "" + for project in project_list: + current_project_version_str = DASH + SPACE + get_project_version(project) + NEWLINE_NEWLINE + project_version_str = project_version_str + current_project_version_str + return project_version_str From 573e44a8543ab66ddc2c2555374707ceb8e4f03f Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 12:35:24 -0400 Subject: [PATCH 015/207] refactor: Further improve help and epilog messages in main. --- gatorgrade/main.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 2f6c3733..295c6154 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -29,19 +29,19 @@ gatorgrader_github = "https://github.com/GatorEducator/gatorgrader" # define the version message with markdown formatting +project_version_str = version.get_project_versions() version_info_markdown = f""" :wrench: Version information: - - {gatorgrade_version} - - - {gatorgrader_version} + {project_version_str} """ # define the overall help message -help_message_markdown = f""" +help_message_markdown = """ :crocodile: Run the GatorGrader checks in the specified configuration file. """ +# define the epilog that appears after the help details epilog_message_markdown = f""" {version_info_markdown} From ce82d5b3c20dfbffadaba2a6ae95a393aefedb60 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 19:52:25 -0400 Subject: [PATCH 016/207] fix: Remove spaces in a multi-line string in main. --- gatorgrade/main.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 295c6154..e9c50a66 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -5,7 +5,6 @@ import typer from rich.console import Console -from rich.markdown import Markdown from gatorgrade import version from gatorgrade.input.parse_config import parse_config @@ -16,15 +15,9 @@ # define the emoji that will be prepended to the help message gatorgrade_emoji = "🐊" -# define the current version of GatorGrade -gatorgrade_version = version.get_gatorgrade_version() - # define the GitHub repository URL for GatorGrade gatorgrade_github = "https://github.com/GatorEducator/gatorgrade" -# define the current version of GatorGrader -gatorgrader_version = version.get_gatorgrader_version() - # define the GitHub repository URL for GatorGrader gatorgrader_github = "https://github.com/GatorEducator/gatorgrader" @@ -51,7 +44,7 @@ * GatorGrade: {gatorgrade_github} * GatorGrader: {gatorgrader_github} - """ +""" # create a Typer app that # --> does not support completion @@ -110,6 +103,8 @@ def gatorgrade( # code to designate some type of failure if checks_status is not True: sys.exit(FAILURE) + if help: + console.print("ran help") # @app.command() From d02d49b46e226e81e7473886cfa8f46d2f51eb4a Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 19:52:46 -0400 Subject: [PATCH 017/207] fix: Remove spaces in a multi-line string in main. --- gatorgrade/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index e9c50a66..28f7d23e 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -32,7 +32,7 @@ # define the overall help message help_message_markdown = """ :crocodile: Run the GatorGrader checks in the specified configuration file. - """ +""" # define the epilog that appears after the help details epilog_message_markdown = f""" From da4710213ce9af04a336fcfe69b7a7b22a1ab5c9 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 19:54:19 -0400 Subject: [PATCH 018/207] refactor: Add version module in the util package. --- gatorgrade/util/version.py | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 gatorgrade/util/version.py diff --git a/gatorgrade/util/version.py b/gatorgrade/util/version.py new file mode 100644 index 00000000..2e42f084 --- /dev/null +++ b/gatorgrade/util/version.py @@ -0,0 +1,40 @@ +"""Extract version information for display in various aspects of the command-line interface.""" + +from importlib.metadata import version +from typing import List + +COLON = ":" +DASH = "-" +SPACE = " " +NEWLINE = "\n" +NEWLINE_NEWLINE = "\n\n" + + +PROJECTS = ["gatorgrade", "gatorgrader", "pyyaml", "rich", "typer"] + + +def get_project_version(project: str) -> str: + """Extract the version information for a project and return formatted version string.""" + project_version_str = version(project) + return project + COLON + SPACE + project_version_str + + +def get_gatorgrade_version() -> str: + """Determine and return the information about GatorGrade's version.""" + gatorgrade_version_str = get_project_version("gatorgrade") + return gatorgrade_version_str + + +def get_gatorgrader_version() -> str: + """Determine and return the information about GatorGrade's version.""" + gatorgrader_version_str = get_project_version("gatorgrader") + return gatorgrader_version_str + + +def get_project_versions(project_list: List[str] = PROJECTS) -> str: + """Create a version string for all specified projects.""" + project_version_str = "" + for project in project_list: + current_project_version_str = DASH + SPACE + get_project_version(project) + NEWLINE_NEWLINE + project_version_str = project_version_str + current_project_version_str + return project_version_str From e67be95fd8ab49a4d778cee1379af1ed196c79c1 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 19:54:31 -0400 Subject: [PATCH 019/207] refactor: Rewrite import for version to be in gatorgrade.util in main. --- gatorgrade/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 28f7d23e..6d452ba6 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -6,9 +6,9 @@ import typer from rich.console import Console -from gatorgrade import version from gatorgrade.input.parse_config import parse_config from gatorgrade.output.output import run_checks +from gatorgrade.util import version # create an app for the Typer-based CLI From a36cb57c31f75a16eeba8f9202c55d4b52b08dbb Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 19:54:51 -0400 Subject: [PATCH 020/207] refactor: Delete the version module in top-level package. --- gatorgrade/version.py | 40 ---------------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 gatorgrade/version.py diff --git a/gatorgrade/version.py b/gatorgrade/version.py deleted file mode 100644 index 2e42f084..00000000 --- a/gatorgrade/version.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Extract version information for display in various aspects of the command-line interface.""" - -from importlib.metadata import version -from typing import List - -COLON = ":" -DASH = "-" -SPACE = " " -NEWLINE = "\n" -NEWLINE_NEWLINE = "\n\n" - - -PROJECTS = ["gatorgrade", "gatorgrader", "pyyaml", "rich", "typer"] - - -def get_project_version(project: str) -> str: - """Extract the version information for a project and return formatted version string.""" - project_version_str = version(project) - return project + COLON + SPACE + project_version_str - - -def get_gatorgrade_version() -> str: - """Determine and return the information about GatorGrade's version.""" - gatorgrade_version_str = get_project_version("gatorgrade") - return gatorgrade_version_str - - -def get_gatorgrader_version() -> str: - """Determine and return the information about GatorGrade's version.""" - gatorgrader_version_str = get_project_version("gatorgrader") - return gatorgrader_version_str - - -def get_project_versions(project_list: List[str] = PROJECTS) -> str: - """Create a version string for all specified projects.""" - project_version_str = "" - for project in project_list: - current_project_version_str = DASH + SPACE + get_project_version(project) + NEWLINE_NEWLINE - project_version_str = project_version_str + current_project_version_str - return project_version_str From bf92c80aaa26614909ede644662dbeabf2fc961d Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 19:56:28 -0400 Subject: [PATCH 021/207] coms: Add two and update one comment in main module. --- gatorgrade/main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 6d452ba6..0ee02db6 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -48,7 +48,9 @@ # create a Typer app that # --> does not support completion -# --> has a specified help message with an emoji +# --> has an epilog with version information and contact +# --> has a specified help message with an emoji for tagline +# --> uses "markdown" mode so that markdown and emojis work app = typer.Typer( add_completion=False, epilog=epilog_message_markdown, From b890e10087dc55497f63faeef4f89c5c15aa73f4 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 19:57:46 -0400 Subject: [PATCH 022/207] fix: Delete conditional logic on help that was not needed in main. --- gatorgrade/main.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 0ee02db6..2128573f 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -105,8 +105,6 @@ def gatorgrade( # code to designate some type of failure if checks_status is not True: sys.exit(FAILURE) - if help: - console.print("ran help") # @app.command() From 9d01e2bb33c2350791cfafd2264c22e22b9ba236 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:11:11 -0400 Subject: [PATCH 023/207] feat: Add draft of the --version output in main. --- gatorgrade/main.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 2128573f..65a58266 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -5,10 +5,11 @@ import typer from rich.console import Console +from rich.markdown import Markdown from gatorgrade.input.parse_config import parse_config from gatorgrade.output.output import run_checks -from gatorgrade.util import version +from gatorgrade.util import versions # create an app for the Typer-based CLI @@ -22,21 +23,22 @@ gatorgrader_github = "https://github.com/GatorEducator/gatorgrader" # define the version message with markdown formatting -project_version_str = version.get_project_versions() +project_version_str = versions.get_project_versions() +version_label = ":wrench: Version information:" version_info_markdown = f""" - :wrench: Version information: + {version_label} {project_version_str} """ # define the overall help message help_message_markdown = """ - :crocodile: Run the GatorGrader checks in the specified configuration file. +:crocodile: Run the GatorGrader checks in the specified configuration file. """ # define the epilog that appears after the help details epilog_message_markdown = f""" - {version_info_markdown} +{version_info_markdown} :tada: Want to contribute to this project? Check these GitHub sites! @@ -79,7 +81,12 @@ def gatorgrade( # if ctx.subcommand is None then this means # that, by default, gatorgrade should run in checking mode if ctx.invoked_subcommand is None: + # requesting version information overrides all other commands; + # if the version details are requested, print them only if version: + console.print(help_message_markdown) + console.print(version_label) + console.print(Markdown(versions.get_project_versions())) console.print() else: # parse the provided configuration file From df32e7cc9da1bcd612f2f678da1fb7b3c211dcb3 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:11:26 -0400 Subject: [PATCH 024/207] feat: Add versions module in util to not conflict with --version in main. --- gatorgrade/util/versions.py | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 gatorgrade/util/versions.py diff --git a/gatorgrade/util/versions.py b/gatorgrade/util/versions.py new file mode 100644 index 00000000..2e42f084 --- /dev/null +++ b/gatorgrade/util/versions.py @@ -0,0 +1,40 @@ +"""Extract version information for display in various aspects of the command-line interface.""" + +from importlib.metadata import version +from typing import List + +COLON = ":" +DASH = "-" +SPACE = " " +NEWLINE = "\n" +NEWLINE_NEWLINE = "\n\n" + + +PROJECTS = ["gatorgrade", "gatorgrader", "pyyaml", "rich", "typer"] + + +def get_project_version(project: str) -> str: + """Extract the version information for a project and return formatted version string.""" + project_version_str = version(project) + return project + COLON + SPACE + project_version_str + + +def get_gatorgrade_version() -> str: + """Determine and return the information about GatorGrade's version.""" + gatorgrade_version_str = get_project_version("gatorgrade") + return gatorgrade_version_str + + +def get_gatorgrader_version() -> str: + """Determine and return the information about GatorGrade's version.""" + gatorgrader_version_str = get_project_version("gatorgrader") + return gatorgrader_version_str + + +def get_project_versions(project_list: List[str] = PROJECTS) -> str: + """Create a version string for all specified projects.""" + project_version_str = "" + for project in project_list: + current_project_version_str = DASH + SPACE + get_project_version(project) + NEWLINE_NEWLINE + project_version_str = project_version_str + current_project_version_str + return project_version_str From 9940fa0d3c57e947fd11af9282b5c56aadfb852a Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:11:41 -0400 Subject: [PATCH 025/207] refactor: Remove version module that conflicts with --version in main. --- gatorgrade/util/version.py | 40 -------------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 gatorgrade/util/version.py diff --git a/gatorgrade/util/version.py b/gatorgrade/util/version.py deleted file mode 100644 index 2e42f084..00000000 --- a/gatorgrade/util/version.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Extract version information for display in various aspects of the command-line interface.""" - -from importlib.metadata import version -from typing import List - -COLON = ":" -DASH = "-" -SPACE = " " -NEWLINE = "\n" -NEWLINE_NEWLINE = "\n\n" - - -PROJECTS = ["gatorgrade", "gatorgrader", "pyyaml", "rich", "typer"] - - -def get_project_version(project: str) -> str: - """Extract the version information for a project and return formatted version string.""" - project_version_str = version(project) - return project + COLON + SPACE + project_version_str - - -def get_gatorgrade_version() -> str: - """Determine and return the information about GatorGrade's version.""" - gatorgrade_version_str = get_project_version("gatorgrade") - return gatorgrade_version_str - - -def get_gatorgrader_version() -> str: - """Determine and return the information about GatorGrade's version.""" - gatorgrader_version_str = get_project_version("gatorgrader") - return gatorgrader_version_str - - -def get_project_versions(project_list: List[str] = PROJECTS) -> str: - """Create a version string for all specified projects.""" - project_version_str = "" - for project in project_list: - current_project_version_str = DASH + SPACE + get_project_version(project) + NEWLINE_NEWLINE - project_version_str = project_version_str + current_project_version_str - return project_version_str From 93f0237d189d4bba96548f2a8bd299fbe8b11225 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:13:42 -0400 Subject: [PATCH 026/207] feat: Improve the help_message_markdown in main. --- gatorgrade/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 65a58266..f5ba666f 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -33,7 +33,7 @@ # define the overall help message help_message_markdown = """ -:crocodile: Run the GatorGrader checks in the specified configuration file. +:crocodile: GatorGrade runs the GatorGrader checks in a specified configuration file. """ # define the epilog that appears after the help details From 07495e21afaba843e510a9c32eeb2efd3c3e6fec Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:15:33 -0400 Subject: [PATCH 027/207] coms: Improve a comment in gatorgrade function in main. --- gatorgrade/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index f5ba666f..9cb81ace 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -82,7 +82,7 @@ def gatorgrade( # that, by default, gatorgrade should run in checking mode if ctx.invoked_subcommand is None: # requesting version information overrides all other commands; - # if the version details are requested, print them only + # if the version details are requested, print them and exit if version: console.print(help_message_markdown) console.print(version_label) From 8ab46d8dfe7d1a4267edc4e66ba18e69d226184a Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:17:32 -0400 Subject: [PATCH 028/207] refactor: Make the variable GATORGRADE_EMOJI in main module constants. --- gatorgrade/main.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 9cb81ace..202f607c 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -11,10 +11,11 @@ from gatorgrade.output.output import run_checks from gatorgrade.util import versions -# create an app for the Typer-based CLI - -# define the emoji that will be prepended to the help message -gatorgrade_emoji = "🐊" +# define constants used in this module +DEFAULT_VERSION = False +GATORGRADE_EMOJI = "🐊" +FILE = "gatorgrade.yml" +FAILURE = 1 # define the GitHub repository URL for GatorGrade gatorgrade_github = "https://github.com/GatorEducator/gatorgrade" @@ -63,10 +64,6 @@ # create a default console for printing with rich console = Console() -# define constants used in this module -DEFAULT_VERSION = False -FILE = "gatorgrade.yml" -FAILURE = 1 @app.callback(invoke_without_command=True) From a1ff3ec0e4a226a9f2042daba154ac41c537d560 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:36:19 -0400 Subject: [PATCH 029/207] feat: Improve main so that github_message is generated. --- gatorgrade/main.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 202f607c..90e5a050 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -9,6 +9,7 @@ from gatorgrade.input.parse_config import parse_config from gatorgrade.output.output import run_checks +from gatorgrade.util import github from gatorgrade.util import versions # define constants used in this module @@ -23,6 +24,9 @@ # define the GitHub repository URL for GatorGrader gatorgrader_github = "https://github.com/GatorEducator/gatorgrader" +# define the message about GitHub repositories +github_message = github.get_github_projects() + # define the version message with markdown formatting project_version_str = versions.get_project_versions() version_label = ":wrench: Version information:" @@ -44,9 +48,7 @@ :tada: Want to contribute to this project? Check these GitHub sites! - * GatorGrade: {gatorgrade_github} - - * GatorGrader: {gatorgrader_github} + {github_message} """ # create a Typer app that @@ -65,7 +67,6 @@ console = Console() - @app.callback(invoke_without_command=True) def gatorgrade( ctx: typer.Context, From fc0a4f367a1ab87a59c489c0cc76418799497eaf Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:36:37 -0400 Subject: [PATCH 030/207] style: Reformat the source code in versions. --- gatorgrade/util/versions.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gatorgrade/util/versions.py b/gatorgrade/util/versions.py index 2e42f084..2f16f375 100644 --- a/gatorgrade/util/versions.py +++ b/gatorgrade/util/versions.py @@ -35,6 +35,8 @@ def get_project_versions(project_list: List[str] = PROJECTS) -> str: """Create a version string for all specified projects.""" project_version_str = "" for project in project_list: - current_project_version_str = DASH + SPACE + get_project_version(project) + NEWLINE_NEWLINE + current_project_version_str = ( + DASH + SPACE + get_project_version(project) + NEWLINE_NEWLINE + ) project_version_str = project_version_str + current_project_version_str return project_version_str From b72c6ee969537a30263398adf4b861260b2228a8 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:36:56 -0400 Subject: [PATCH 031/207] feat: Add the github module in util with get_github_projects function. --- gatorgrade/util/github.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 gatorgrade/util/github.py diff --git a/gatorgrade/util/github.py b/gatorgrade/util/github.py new file mode 100644 index 00000000..cbafa113 --- /dev/null +++ b/gatorgrade/util/github.py @@ -0,0 +1,31 @@ +"""Collect GitHub URLs for display in the command-line interface.""" + +from typing import Dict + +COLON = ":" +DASH = "-" +SPACE = " " +NEWLINE = "\n" +NEWLINE_NEWLINE = "\n\n" + +PROJECTS = { + "gatorgrade": "https://github.com/GatorEducator/gatorgrade", + "gatorgrader": "https://github.com/GatorEducator/gatorgrader", +} + + +def get_github_projects(projects: Dict[str, str] = PROJECTS) -> str: + """Create a GitHub repository string for all specified projects.""" + project_version_str = "" + for project_name in projects.keys(): + current_project_version_str = ( + DASH + + SPACE + + project_name + + COLON + + SPACE + + projects[project_name] + + NEWLINE_NEWLINE + ) + project_version_str = project_version_str + current_project_version_str + return project_version_str From 9b15c73aa417e3b39d30ce2596ff14605d7b037b Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:40:53 -0400 Subject: [PATCH 032/207] refactor: Use the GATORGRADE_EMOJI_RICH constant in main. --- gatorgrade/main.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 90e5a050..330e38dd 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -15,6 +15,7 @@ # define constants used in this module DEFAULT_VERSION = False GATORGRADE_EMOJI = "🐊" +GATORGRADE_EMOJI_RICH = ":crocodile:" FILE = "gatorgrade.yml" FAILURE = 1 @@ -37,8 +38,8 @@ """ # define the overall help message -help_message_markdown = """ -:crocodile: GatorGrade runs the GatorGrader checks in a specified configuration file. +help_message_markdown = f""" +{GATORGRADE_EMOJI_RICH} GatorGrade runs the GatorGrader checks in a specified configuration file. """ # define the epilog that appears after the help details From 3dda163f09120a9a63b93329def68ca31886e12a Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:41:19 -0400 Subject: [PATCH 033/207] fix: Delete not-needed variables for GitHub projects in main. --- gatorgrade/main.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 330e38dd..77aa278e 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -19,12 +19,6 @@ FILE = "gatorgrade.yml" FAILURE = 1 -# define the GitHub repository URL for GatorGrade -gatorgrade_github = "https://github.com/GatorEducator/gatorgrade" - -# define the GitHub repository URL for GatorGrader -gatorgrader_github = "https://github.com/GatorEducator/gatorgrader" - # define the message about GitHub repositories github_message = github.get_github_projects() From a9d9a99175bbb0ccf32047c61b5fde1a88769890 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:43:39 -0400 Subject: [PATCH 034/207] refactor: Use the RICH_MARKUP_MODE_DEFAULT constant in main. --- gatorgrade/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 77aa278e..ee57ff1c 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -18,6 +18,7 @@ GATORGRADE_EMOJI_RICH = ":crocodile:" FILE = "gatorgrade.yml" FAILURE = 1 +RICH_MARKUP_MODE_DEFAULT = "markdown" # define the message about GitHub repositories github_message = github.get_github_projects() @@ -55,7 +56,7 @@ add_completion=False, epilog=epilog_message_markdown, help=help_message_markdown, - rich_markup_mode="markdown", + rich_markup_mode=RICH_MARKUP_MODE_DEFAULT, ) # create a default console for printing with rich From 18e977e724986e3db3d2d32bf5f6249670c4fe6f Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:57:24 -0400 Subject: [PATCH 035/207] chore: Increase minimal version of Python to 3.8 in pyproject.toml. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b8e88595..3b61f8b8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ description = "Python tool to execute GatorGrader" authors = ["Michael Abraham", "Jacob Allebach", "Liam Black", "Katherine Burgess", "Yanqiao Chen", "Ochirsaikhan Davaajambal", "Tuguldurnemekh Gantulga", "Anthony Grant-Cook", "Dylan Holland", "Gregory M. Kapfhammer", "Peyton Kelly", "Luke Lacaria", "Lauren Nevill", "Jack Turner", "Daniel Ullrich", "Garrison Vanzin", "Rian Watson"] [tool.poetry.dependencies] -python = ">=3.7,<4.0" +python = ">=3.8,<4.0" PyYAML = "^6.0" gatorgrader = "^1.1.0" rich = "^12.5.1" From 4528f5201e6a27335e82c4f08181de6e1018ea49 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 20:59:50 -0400 Subject: [PATCH 036/207] chore: Use Python 3.8 and 3.10 on ubuntu-latest and 3.9 on macos-latest and windows-latest in main.yml. --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 30fcffbc..d259b138 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -68,12 +68,12 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - python-version: ["3.7", "3.10"] + python-version: ["3.8", "3.10"] include: - os: macos-latest python-version: "3.9" - os: windows-latest - python-version: "3.8" + python-version: "3.9" env: OS: ${{ matrix.os }} PYTHON: ${{ matrix.python-version }} From 0070a2b0d8efc3c33a69f31bae0e137038a81734 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 21:01:20 -0400 Subject: [PATCH 037/207] chore: Bump the poetry-version to 1.2 in the main.yml file. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d259b138..2d4c7122 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -87,7 +87,7 @@ jobs: - name: Install Poetry uses: Gr1N/setup-poetry@v7 with: - poetry-version: 1.1.13 + poetry-version: 1.2 - name: Setup Poetry run: | poetry --version From 12808aa766f21a4908c959f42ae129f40b5cbd70 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 21:05:45 -0400 Subject: [PATCH 038/207] chore: Update poetry.lock file to reflect move to Python 3.8 minimum. --- poetry.lock | 446 ++++++++++++++++++++++++---------------------------- 1 file changed, 206 insertions(+), 240 deletions(-) diff --git a/poetry.lock b/poetry.lock index 21f37bdd..86a02a8a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,16 +1,18 @@ [[package]] name = "astroid" -version = "2.11.5" +version = "2.12.9" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7.2" [package.dependencies] lazy-object-proxy = ">=1.4.0" -typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} -wrapt = ">=1.11,<2" +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] [[package]] name = "astunparse" @@ -23,31 +25,23 @@ python-versions = "*" [package.dependencies] six = ">=1.6.1,<2.0" -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - [[package]] name = "attrs" -version = "21.4.0" +version = "22.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "cloudpickle"] [[package]] name = "black" -version = "22.3.0" +version = "22.8.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -58,8 +52,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} +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] @@ -68,29 +61,21 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] -[[package]] -name = "cached-property" -version = "1.5.2" -description = "A decorator for caching properties in classes." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "certifi" -version = "2021.10.8" +version = "2022.6.15.1" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "charset-normalizer" -version = "2.0.12" +version = "2.1.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.5.0" +python-versions = ">=3.6.0" [package.extras] unicode_backport = ["unicodedata2"] @@ -105,11 +90,10 @@ python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.5" description = "Cross-platform colored terminal text." category = "main" optional = false @@ -142,11 +126,11 @@ toml = ["tomli"] [[package]] name = "dill" -version = "0.3.4" +version = "0.3.5.1" description = "serialize all of python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*" +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)"] @@ -209,19 +193,15 @@ python-versions = ">=3.7" [package.dependencies] gitdb = ">=4.0.1,<5" -typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""} [[package]] name = "griffe" -version = "0.19.1" +version = "0.22.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." category = "dev" optional = false python-versions = ">=3.7" -[package.dependencies] -cached_property = {version = "*", markers = "python_version < \"3.8\""} - [package.extras] async = ["aiofiles (>=0.7,<1.0)"] @@ -235,20 +215,19 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.11.3" +version = "4.12.0" description = "Read metadata from Python packages" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -334,7 +313,7 @@ python-versions = ">=3.6" [[package]] name = "mkdocs" -version = "1.3.0" +version = "1.3.1" description = "Project documentation with Markdown." category = "dev" optional = false @@ -345,7 +324,7 @@ click = ">=3.3" ghp-import = ">=1.0" importlib-metadata = ">=4.3" Jinja2 = ">=2.10.2" -Markdown = ">=3.2.1" +Markdown = ">=3.2.1,<3.4" mergedeep = ">=1.3.4" packaging = ">=20.5" PyYAML = ">=3.10" @@ -369,7 +348,7 @@ mkdocs = ">=1.1" [[package]] name = "mkdocs-gen-files" -version = "0.3.4" +version = "0.3.5" description = "MkDocs plugin to programmatically generate documentation pages during the build" category = "dev" optional = false @@ -391,7 +370,7 @@ mkdocs = ">=1.0.3,<2.0.0" [[package]] name = "mkdocs-material" -version = "8.4.2" +version = "8.4.3" description = "Documentation that simply works" category = "dev" optional = false @@ -490,7 +469,7 @@ python-versions = "*" [[package]] name = "num2words" -version = "0.5.10" +version = "0.5.12" description = "Modules to convert numbers to words. Easily extensible." category = "main" optional = false @@ -512,11 +491,11 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.9.0" +version = "0.10.1" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" [[package]] name = "platformdirs" @@ -538,9 +517,6 @@ category = "dev" optional = false python-versions = ">=3.6" -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] @@ -563,14 +539,14 @@ python-versions = "*" [[package]] name = "psutil" -version = "5.9.0" +version = "5.9.2" description = "Cross-platform lib for process and system monitoring in Python." category = "dev" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.extras] -test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] +test = ["ipaddress", "mock", "enum34", "pywin32", "wmi"] [[package]] name = "py" @@ -596,36 +572,41 @@ toml = ["toml"] [[package]] name = "pygments" -version = "2.12.0" +version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false python-versions = ">=3.6" +[package.extras] +plugins = ["importlib-metadata"] + [[package]] name = "pylint" -version = "2.13.8" +version = "2.15.2" description = "python code static checker" category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7.2" [package.dependencies] -astroid = ">=2.11.3,<=2.12.0-dev0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} +astroid = ">=2.12.9,<=2.14.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] -testutil = ["gitpython (>3)"] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] [[package]] name = "pymdown-extensions" -version = "9.4" +version = "9.5" description = "Extension pack for Python Markdown." category = "dev" optional = false @@ -636,7 +617,7 @@ markdown = ">=3.2" [[package]] name = "pyparsing" -version = "3.0.8" +version = "3.0.9" description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false @@ -647,17 +628,15 @@ diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.2" +version = "7.1.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" @@ -741,8 +720,6 @@ python-versions = ">=3.7" [package.dependencies] astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} -cached-property = {version = ">=1.5", markers = "python_version < \"3.8\""} -typing-extensions = {version = ">=3.7", markers = "python_version < \"3.8\""} [package.extras] numpy-style = ["docstring_parser (>=0.7)"] @@ -768,21 +745,21 @@ pyyaml = "*" [[package]] name = "requests" -version = "2.27.1" +version = "2.28.1" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" @@ -834,7 +811,7 @@ python-versions = "*" [[package]] name = "taskipy" -version = "1.10.1" +version = "1.10.3" description = "tasks runner for python projects" category = "dev" optional = false @@ -844,7 +821,7 @@ python-versions = ">=3.6,<4.0" colorama = ">=0.4.4,<0.5.0" mslex = {version = ">=0.3.0,<0.4.0", markers = "sys_platform == \"win32\""} psutil = ">=5.7.2,<6.0.0" -tomli = ">=1.2.3,<2.0.0" +tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} [[package]] name = "termcolor" @@ -864,19 +841,19 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.3" +version = "2.0.1" description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] -name = "typed-ast" -version = "1.5.3" -description = "a fork of Python 2 and 3 ast modules with type comment support" +name = "tomlkit" +version = "0.11.4" +description = "Style preserving TOML library" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6,<4.0" [[package]] name = "typer" @@ -900,7 +877,7 @@ test = ["shellingham (>=1.3.0,<2.0.0)", "pytest (>=4.4.0,<5.4.0)", "pytest-cov ( [[package]] name = "typing-extensions" -version = "4.2.0" +version = "4.3.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false @@ -908,20 +885,20 @@ python-versions = ">=3.7" [[package]] name = "urllib3" -version = "1.26.9" +version = "1.26.12" 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.*, <4" +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"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "watchdog" -version = "2.1.7" +version = "2.1.9" description = "Filesystem events monitoring" category = "dev" optional = false @@ -940,58 +917,74 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "zipp" -version = "3.8.0" +version = "3.8.1" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" -python-versions = ">=3.7,<4.0" -content-hash = "b00f295850266d2f98df98eb8f876970d1bc15272f8f844f01abd771a7f7b330" +python-versions = ">=3.8,<4.0" +content-hash = "f6f078ff3d1ea2efa1ea2a3bd8ccd9b433711826e4c99305b33faeaf945de36f" [metadata.files] astroid = [ - {file = "astroid-2.11.5-py3-none-any.whl", hash = "sha256:14ffbb4f6aa2cf474a0834014005487f7ecd8924996083ab411e7fa0b508ce0b"}, - {file = "astroid-2.11.5.tar.gz", hash = "sha256:f4e4ec5294c4b07ac38bab9ca5ddd3914d4bf46f9006eb5c0ae755755061044e"}, + {file = "astroid-2.12.9-py3-none-any.whl", hash = "sha256:27a22f40e45af6d362498647a0940e8ae9c35f71cb572a1b6f8f810122a11918"}, + {file = "astroid-2.12.9.tar.gz", hash = "sha256:0dafbfcf4ebdecd3c8f6d742c9d9c88508229ca823d5c98ab872d964f3321e56"}, ] astunparse = [ {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, ] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] -black = [] -cached-property = [ - {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, - {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] +black = [ + {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, + {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"}, + {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"}, + {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"}, + {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"}, + {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"}, + {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"}, + {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"}, + {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"}, + {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"}, + {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"}, + {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"}, + {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"}, + {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"}, + {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"}, + {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"}, + {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"}, + {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"}, + {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"}, ] certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, + {file = "certifi-2022.6.15.1-py3-none-any.whl", hash = "sha256:43dadad18a7f168740e66944e4fa82c6611848ff9056ad910f8f7a3e46ab89e0"}, + {file = "certifi-2022.6.15.1.tar.gz", hash = "sha256:cffdcd380919da6137f76633531a5817e3a9f268575c128249fb637e4f9e73fb"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, ] 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.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, ] commonmark = [ {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, @@ -1049,10 +1042,7 @@ coverage = [ {file = "coverage-6.4.4-pp36.pp37.pp38-none-any.whl", hash = "sha256:f67cf9f406cf0d2f08a3515ce2db5b82625a7257f88aad87904674def6ddaec1"}, {file = "coverage-6.4.4.tar.gz", hash = "sha256:e16c45b726acb780e1e6f88b286d3c10b3914ab03438f32117c4aa52d7f30d58"}, ] -dill = [ - {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"}, - {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"}, -] +dill = [] docopt = [ {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, ] @@ -1067,14 +1057,17 @@ ghp-import = [ gitdb = [] gitpython = [] griffe = [ - {file = "griffe-0.19.1-py3-none-any.whl", hash = "sha256:7d9393f8d6d6026d80dc0865724b9d87f2cbb93e3f86998b785b01403cd3d52b"}, - {file = "griffe-0.19.1.tar.gz", hash = "sha256:945284500df94f272b8a70bcedaac99721f26dea72d2f1b16f416de28848b753"}, + {file = "griffe-0.22.0-py3-none-any.whl", hash = "sha256:65c94cba634d6ad397c495b04ed5fd3f06d9b16c4f9f78bd63be9ea34d6b7113"}, + {file = "griffe-0.22.0.tar.gz", hash = "sha256:a3c25a2b7bf729ecee7cd455b4eff548f01c620b8f58a8097a800caad221f12e"}, ] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] -importlib-metadata = [] +importlib-metadata = [ + {file = "importlib_metadata-4.12.0-py3-none-any.whl", hash = "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23"}, + {file = "importlib_metadata-4.12.0.tar.gz", hash = "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670"}, +] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -1178,24 +1171,24 @@ mergedeep = [ {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, ] mkdocs = [ - {file = "mkdocs-1.3.0-py3-none-any.whl", hash = "sha256:26bd2b03d739ac57a3e6eed0b7bcc86168703b719c27b99ad6ca91dc439aacde"}, - {file = "mkdocs-1.3.0.tar.gz", hash = "sha256:b504405b04da38795fec9b2e5e28f6aa3a73bb0960cb6d5d27ead28952bd35ea"}, + {file = "mkdocs-1.3.1-py3-none-any.whl", hash = "sha256:fda92466393127d2da830bc6edc3a625a14b436316d1caf347690648e774c4f0"}, + {file = "mkdocs-1.3.1.tar.gz", hash = "sha256:a41a2ff25ce3bbacc953f9844ba07d106233cd76c88bac1f59cb1564ac0d87ed"}, ] mkdocs-autorefs = [ {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, ] mkdocs-gen-files = [ - {file = "mkdocs-gen-files-0.3.4.tar.gz", hash = "sha256:c69188486bdc1e74bd2b9b7ebbde9f9eb21052ae7762f1b35420cfbfc6d7122e"}, - {file = "mkdocs_gen_files-0.3.4-py3-none-any.whl", hash = "sha256:07f43245c87a03cfb03884e767655c2a61def24d07e47fb3a8d26b1581524d6a"}, + {file = "mkdocs-gen-files-0.3.5.tar.gz", hash = "sha256:d90d9e1676531a0bb96b1287dc28aa41162986de4dc3c00400214724761ff6ef"}, + {file = "mkdocs_gen_files-0.3.5-py3-none-any.whl", hash = "sha256:69562fddc662482e8f54a00a8b4ede5166ad5384ae4dbb0469f1f338ef3285ca"}, ] mkdocs-literate-nav = [ {file = "mkdocs-literate-nav-0.4.1.tar.gz", hash = "sha256:9efe26b662f2f901cae5807bfd51446d30ea7e033c2bc43a15d6282c7dfac1ab"}, {file = "mkdocs_literate_nav-0.4.1-py3-none-any.whl", hash = "sha256:a4b761792ba21defbe2dfd5e0de6ba451639e1ca0f0661c37eda83cc6261e4f9"}, ] mkdocs-material = [ - {file = "mkdocs-material-8.4.2.tar.gz", hash = "sha256:704c64c3fff126a3923c2961d95f26b19be621342a6a4e49ed039f0bb7a5c540"}, - {file = "mkdocs_material-8.4.2-py2.py3-none-any.whl", hash = "sha256:166287bb0e4197804906bf0389a852d5ced43182c30127ac8b48a4e497ecd7e5"}, + {file = "mkdocs-material-8.4.3.tar.gz", hash = "sha256:f39af3234ce0b60024b7712995af0de5b5227ab6504f0b9c8709c9a770bd94bf"}, + {file = "mkdocs_material-8.4.3-py2.py3-none-any.whl", hash = "sha256:d5cc6f5023061a663514f61810052ad266f5199feafcf15ad23ea4891b21e6bc"}, ] mkdocs-material-extensions = [ {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"}, @@ -1226,16 +1219,16 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] num2words = [ - {file = "num2words-0.5.10-py3-none-any.whl", hash = "sha256:0b6e5f53f11d3005787e206d9c03382f459ef048a43c544e3db3b1e05a961548"}, - {file = "num2words-0.5.10.tar.gz", hash = "sha256:37cd4f60678f7e1045cdc3adf6acf93c8b41bf732da860f97d301f04e611cc57"}, + {file = "num2words-0.5.12-py3-none-any.whl", hash = "sha256:9eeef488658226ab36818c06d7aeb956d19b530fb62030596b6802fb4659f30e"}, + {file = "num2words-0.5.12.tar.gz", hash = "sha256:7e7c0b0f080405aa3a1dd9d32b1ca90b3bf03bab17b8e54db05e1b78301a0988"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, + {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, + {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, ] platformdirs = [ {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, @@ -1253,38 +1246,38 @@ pprintpp = [ {file = "pprintpp-0.4.0.tar.gz", hash = "sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403"}, ] psutil = [ - {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"}, - {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618"}, - {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2"}, - {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd"}, - {file = "psutil-5.9.0-cp27-none-win32.whl", hash = "sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3"}, - {file = "psutil-5.9.0-cp27-none-win_amd64.whl", hash = "sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c"}, - {file = "psutil-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492"}, - {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3"}, - {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2"}, - {file = "psutil-5.9.0-cp310-cp310-win32.whl", hash = "sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d"}, - {file = "psutil-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b"}, - {file = "psutil-5.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56"}, - {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203"}, - {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d"}, - {file = "psutil-5.9.0-cp36-cp36m-win32.whl", hash = "sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64"}, - {file = "psutil-5.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94"}, - {file = "psutil-5.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0"}, - {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce"}, - {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5"}, - {file = "psutil-5.9.0-cp37-cp37m-win32.whl", hash = "sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9"}, - {file = "psutil-5.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4"}, - {file = "psutil-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2"}, - {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d"}, - {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a"}, - {file = "psutil-5.9.0-cp38-cp38-win32.whl", hash = "sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666"}, - {file = "psutil-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841"}, - {file = "psutil-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf"}, - {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07"}, - {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d"}, - {file = "psutil-5.9.0-cp39-cp39-win32.whl", hash = "sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845"}, - {file = "psutil-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3"}, - {file = "psutil-5.9.0.tar.gz", hash = "sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25"}, + {file = "psutil-5.9.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:8f024fbb26c8daf5d70287bb3edfafa22283c255287cf523c5d81721e8e5d82c"}, + {file = "psutil-5.9.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:b2f248ffc346f4f4f0d747ee1947963613216b06688be0be2e393986fe20dbbb"}, + {file = "psutil-5.9.2-cp27-cp27m-win32.whl", hash = "sha256:b1928b9bf478d31fdffdb57101d18f9b70ed4e9b0e41af751851813547b2a9ab"}, + {file = "psutil-5.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:404f4816c16a2fcc4eaa36d7eb49a66df2d083e829d3e39ee8759a411dbc9ecf"}, + {file = "psutil-5.9.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:94e621c6a4ddb2573d4d30cba074f6d1aa0186645917df42c811c473dd22b339"}, + {file = "psutil-5.9.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:256098b4f6ffea6441eb54ab3eb64db9ecef18f6a80d7ba91549195d55420f84"}, + {file = "psutil-5.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:614337922702e9be37a39954d67fdb9e855981624d8011a9927b8f2d3c9625d9"}, + {file = "psutil-5.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39ec06dc6c934fb53df10c1672e299145ce609ff0611b569e75a88f313634969"}, + {file = "psutil-5.9.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3ac2c0375ef498e74b9b4ec56df3c88be43fe56cac465627572dbfb21c4be34"}, + {file = "psutil-5.9.2-cp310-cp310-win32.whl", hash = "sha256:e4c4a7636ffc47b7141864f1c5e7d649f42c54e49da2dd3cceb1c5f5d29bfc85"}, + {file = "psutil-5.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:f4cb67215c10d4657e320037109939b1c1d2fd70ca3d76301992f89fe2edb1f1"}, + {file = "psutil-5.9.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dc9bda7d5ced744622f157cc8d8bdd51735dafcecff807e928ff26bdb0ff097d"}, + {file = "psutil-5.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75291912b945a7351d45df682f9644540d564d62115d4a20d45fa17dc2d48f8"}, + {file = "psutil-5.9.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4018d5f9b6651f9896c7a7c2c9f4652e4eea53f10751c4e7d08a9093ab587ec"}, + {file = "psutil-5.9.2-cp36-cp36m-win32.whl", hash = "sha256:f40ba362fefc11d6bea4403f070078d60053ed422255bd838cd86a40674364c9"}, + {file = "psutil-5.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9770c1d25aee91417eba7869139d629d6328a9422ce1cdd112bd56377ca98444"}, + {file = "psutil-5.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:42638876b7f5ef43cef8dcf640d3401b27a51ee3fa137cb2aa2e72e188414c32"}, + {file = "psutil-5.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91aa0dac0c64688667b4285fa29354acfb3e834e1fd98b535b9986c883c2ce1d"}, + {file = "psutil-5.9.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fb54941aac044a61db9d8eb56fc5bee207db3bc58645d657249030e15ba3727"}, + {file = "psutil-5.9.2-cp37-cp37m-win32.whl", hash = "sha256:7cbb795dcd8ed8fd238bc9e9f64ab188f3f4096d2e811b5a82da53d164b84c3f"}, + {file = "psutil-5.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5d39e3a2d5c40efa977c9a8dd4f679763c43c6c255b1340a56489955dbca767c"}, + {file = "psutil-5.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd331866628d18223a4265371fd255774affd86244fc307ef66eaf00de0633d5"}, + {file = "psutil-5.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b315febaebae813326296872fdb4be92ad3ce10d1d742a6b0c49fb619481ed0b"}, + {file = "psutil-5.9.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7929a516125f62399d6e8e026129c8835f6c5a3aab88c3fff1a05ee8feb840d"}, + {file = "psutil-5.9.2-cp38-cp38-win32.whl", hash = "sha256:561dec454853846d1dd0247b44c2e66a0a0c490f937086930ec4b8f83bf44f06"}, + {file = "psutil-5.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:67b33f27fc0427483b61563a16c90d9f3b547eeb7af0ef1b9fe024cdc9b3a6ea"}, + {file = "psutil-5.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3591616fa07b15050b2f87e1cdefd06a554382e72866fcc0ab2be9d116486c8"}, + {file = "psutil-5.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b29f581b5edab1f133563272a6011925401804d52d603c5c606936b49c8b97"}, + {file = "psutil-5.9.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4642fd93785a29353d6917a23e2ac6177308ef5e8be5cc17008d885cb9f70f12"}, + {file = "psutil-5.9.2-cp39-cp39-win32.whl", hash = "sha256:ed29ea0b9a372c5188cdb2ad39f937900a10fb5478dc077283bf86eeac678ef1"}, + {file = "psutil-5.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:68b35cbff92d1f7103d8f1db77c977e72f49fcefae3d3d2b91c76b0e7aef48b8"}, + {file = "psutil-5.9.2.tar.gz", hash = "sha256:feb861a10b6c3bb00701063b37e4afc754f8217f0f09c42280586bd6ac712b5c"}, ] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, @@ -1295,24 +1288,24 @@ pydocstyle = [ {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, ] pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, ] pylint = [ - {file = "pylint-2.13.8-py3-none-any.whl", hash = "sha256:f87e863a0b08f64b5230e7e779bcb75276346995737b2c0dc2793070487b1ff6"}, - {file = "pylint-2.13.8.tar.gz", hash = "sha256:ced8968c3b699df0615e2a709554dec3ddac2f5cd06efadb69554a69eeca364a"}, + {file = "pylint-2.15.2-py3-none-any.whl", hash = "sha256:cc3da458ba810c49d330e09013dec7ced5217772dec8f043ccdd34dae648fde8"}, + {file = "pylint-2.15.2.tar.gz", hash = "sha256:f63404a2547edb5247da263748771ac9a806ed1de4174cda01293c08ddbc2999"}, ] pymdown-extensions = [ - {file = "pymdown_extensions-9.4-py3-none-any.whl", hash = "sha256:5b7432456bf555ce2b0ab3c2439401084cda8110f24f6b3ecef952b8313dfa1b"}, - {file = "pymdown_extensions-9.4.tar.gz", hash = "sha256:1baa22a60550f731630474cad28feb0405c8101f1a7ddc3ec0ed86ee510bcc43"}, + {file = "pymdown_extensions-9.5-py3-none-any.whl", hash = "sha256:ec141c0f4983755349f0c8710416348d1a13753976c028186ed14f190c8061c4"}, + {file = "pymdown_extensions-9.5.tar.gz", hash = "sha256:3ef2d998c0d5fa7eb09291926d90d69391283561cf6306f85cd588a5eb5befa0"}, ] pyparsing = [ - {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, - {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, - {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, + {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, + {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, ] pytest-clarity = [ {file = "pytest-clarity-1.0.1.tar.gz", hash = "sha256:505fe345fad4fe11c6a4187fe683f2c7c52c077caa1e135f3e483fe112db7772"}, @@ -1374,8 +1367,8 @@ pyyaml-env-tag = [ {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, ] requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] rich = [] shellingham = [ @@ -1392,8 +1385,8 @@ snowballstemmer = [ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] taskipy = [ - {file = "taskipy-1.10.1-py3-none-any.whl", hash = "sha256:9b38333654da487b6d16de6fa330b7629d1935d1e74819ba4c5f17a1c372d37b"}, - {file = "taskipy-1.10.1.tar.gz", hash = "sha256:6fa0b11c43d103e376063e90be31d87b435aad50fb7dc1c9a2de9b60a85015ed"}, + {file = "taskipy-1.10.3-py3-none-any.whl", hash = "sha256:4c0070ca53868d97989f7ab5c6f237525d52ee184f9b967576e8fe427ed9d0b8"}, + {file = "taskipy-1.10.3.tar.gz", hash = "sha256:112beaf21e3d5569950b99162a1de003fa885fabee9e450757a6b874be914877"}, ] termcolor = [] toml = [ @@ -1401,72 +1394,45 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, -] -typed-ast = [ - {file = "typed_ast-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ad3b48cf2b487be140072fb86feff36801487d4abb7382bb1929aaac80638ea"}, - {file = "typed_ast-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:542cd732351ba8235f20faa0fc7398946fe1a57f2cdb289e5497e1e7f48cfedb"}, - {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc2c11ae59003d4a26dda637222d9ae924387f96acae9492df663843aefad55"}, - {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd5df1313915dbd70eaaa88c19030b441742e8b05e6103c631c83b75e0435ccc"}, - {file = "typed_ast-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:e34f9b9e61333ecb0f7d79c21c28aa5cd63bec15cb7e1310d7d3da6ce886bc9b"}, - {file = "typed_ast-1.5.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f818c5b81966d4728fec14caa338e30a70dfc3da577984d38f97816c4b3071ec"}, - {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3042bfc9ca118712c9809201f55355479cfcdc17449f9f8db5e744e9625c6805"}, - {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4fff9fdcce59dc61ec1b317bdb319f8f4e6b69ebbe61193ae0a60c5f9333dc49"}, - {file = "typed_ast-1.5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:8e0b8528838ffd426fea8d18bde4c73bcb4167218998cc8b9ee0a0f2bfe678a6"}, - {file = "typed_ast-1.5.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ef1d96ad05a291f5c36895d86d1375c0ee70595b90f6bb5f5fdbee749b146db"}, - {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed44e81517364cb5ba367e4f68fca01fba42a7a4690d40c07886586ac267d9b9"}, - {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f60d9de0d087454c91b3999a296d0c4558c1666771e3460621875021bf899af9"}, - {file = "typed_ast-1.5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9e237e74fd321a55c90eee9bc5d44be976979ad38a29bbd734148295c1ce7617"}, - {file = "typed_ast-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee852185964744987609b40aee1d2eb81502ae63ee8eef614558f96a56c1902d"}, - {file = "typed_ast-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:27e46cdd01d6c3a0dd8f728b6a938a6751f7bd324817501c15fb056307f918c6"}, - {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d64dabc6336ddc10373922a146fa2256043b3b43e61f28961caec2a5207c56d5"}, - {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8cdf91b0c466a6c43f36c1964772918a2c04cfa83df8001ff32a89e357f8eb06"}, - {file = "typed_ast-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:9cc9e1457e1feb06b075c8ef8aeb046a28ec351b1958b42c7c31c989c841403a"}, - {file = "typed_ast-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e20d196815eeffb3d76b75223e8ffed124e65ee62097e4e73afb5fec6b993e7a"}, - {file = "typed_ast-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:37e5349d1d5de2f4763d534ccb26809d1c24b180a477659a12c4bde9dd677d74"}, - {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f1a27592fac87daa4e3f16538713d705599b0a27dfe25518b80b6b017f0a6d"}, - {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8831479695eadc8b5ffed06fdfb3e424adc37962a75925668deeb503f446c0a3"}, - {file = "typed_ast-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:20d5118e494478ef2d3a2702d964dae830aedd7b4d3b626d003eea526be18718"}, - {file = "typed_ast-1.5.3.tar.gz", hash = "sha256:27f25232e2dd0edfe1f019d6bfaaf11e86e657d9bdb7b0956db95f560cceb2b3"}, + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -typer = [] -typing-extensions = [ - {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, - {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, +tomlkit = [ + {file = "tomlkit-0.11.4-py3-none-any.whl", hash = "sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c"}, + {file = "tomlkit-0.11.4.tar.gz", hash = "sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83"}, ] +typer = [] +typing-extensions = [] urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, + {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, ] watchdog = [ - {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:177bae28ca723bc00846466016d34f8c1d6a621383b6caca86745918d55c7383"}, - {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d1cf7dfd747dec519486a98ef16097e6c480934ef115b16f18adb341df747a4"}, - {file = "watchdog-2.1.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f14ce6adea2af1bba495acdde0e510aecaeb13b33f7bd2f6324e551b26688ca"}, - {file = "watchdog-2.1.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4d0e98ac2e8dd803a56f4e10438b33a2d40390a72750cff4939b4b274e7906fa"}, - {file = "watchdog-2.1.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:81982c7884aac75017a6ecc72f1a4fedbae04181a8665a34afce9539fc1b3fab"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0b4a1fe6201c6e5a1926f5767b8664b45f0fcb429b62564a41f490ff1ce1dc7a"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6e6ae29b72977f2e1ee3d0b760d7ee47896cb53e831cbeede3e64485e5633cc8"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b9777664848160449e5b4260e0b7bc1ae0f6f4992a8b285db4ec1ef119ffa0e2"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:19b36d436578eb437e029c6b838e732ed08054956366f6dd11875434a62d2b99"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b61acffaf5cd5d664af555c0850f9747cc5f2baf71e54bbac164c58398d6ca7b"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1e877c70245424b06c41ac258023ea4bd0c8e4ff15d7c1368f17cd0ae6e351dd"}, - {file = "watchdog-2.1.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d802d65262a560278cf1a65ef7cae4e2bc7ecfe19e5451349e4c67e23c9dc420"}, - {file = "watchdog-2.1.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b3750ee5399e6e9c69eae8b125092b871ee9e2fcbd657a92747aea28f9056a5c"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_aarch64.whl", hash = "sha256:ed6d9aad09a2a948572224663ab00f8975fae242aa540509737bb4507133fa2d"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_armv7l.whl", hash = "sha256:b26e13e8008dcaea6a909e91d39b629a39635d1a8a7239dd35327c74f4388601"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_i686.whl", hash = "sha256:0908bb50f6f7de54d5d31ec3da1654cb7287c6b87bce371954561e6de379d690"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64.whl", hash = "sha256:bdcbf75580bf4b960fb659bbccd00123d83119619195f42d721e002c1621602f"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:81a5861d0158a7e55fe149335fb2bbfa6f48cbcbd149b52dbe2cd9a544034bbd"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_s390x.whl", hash = "sha256:03b43d583df0f18782a0431b6e9e9965c5b3f7cf8ec36a00b930def67942c385"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ae934e34c11aa8296c18f70bf66ed60e9870fcdb4cc19129a04ca83ab23e7055"}, - {file = "watchdog-2.1.7-py3-none-win32.whl", hash = "sha256:49639865e3db4be032a96695c98ac09eed39bbb43fe876bb217da8f8101689a6"}, - {file = "watchdog-2.1.7-py3-none-win_amd64.whl", hash = "sha256:340b875aecf4b0e6672076a6f05cfce6686935559bb6d34cebedee04126a9566"}, - {file = "watchdog-2.1.7-py3-none-win_ia64.whl", hash = "sha256:351e09b6d9374d5bcb947e6ac47a608ec25b9d70583e9db00b2fcdb97b00b572"}, - {file = "watchdog-2.1.7.tar.gz", hash = "sha256:3fd47815353be9c44eebc94cc28fe26b2b0c5bd889dafc4a5a7cbdf924143480"}, + {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"}, + {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"}, + {file = "watchdog-2.1.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee3e38a6cc050a8830089f79cbec8a3878ec2fe5160cdb2dc8ccb6def8552658"}, + {file = "watchdog-2.1.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64a27aed691408a6abd83394b38503e8176f69031ca25d64131d8d640a307591"}, + {file = "watchdog-2.1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:195fc70c6e41237362ba720e9aaf394f8178bfc7fa68207f112d108edef1af33"}, + {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bfc4d351e6348d6ec51df007432e6fe80adb53fd41183716017026af03427846"}, + {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8250546a98388cbc00c3ee3cc5cf96799b5a595270dfcfa855491a64b86ef8c3"}, + {file = "watchdog-2.1.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:117ffc6ec261639a0209a3252546b12800670d4bf5f84fbd355957a0595fe654"}, + {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97f9752208f5154e9e7b76acc8c4f5a58801b338de2af14e7e181ee3b28a5d39"}, + {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:247dcf1df956daa24828bfea5a138d0e7a7c98b1a47cf1fa5b0c3c16241fcbb7"}, + {file = "watchdog-2.1.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:226b3c6c468ce72051a4c15a4cc2ef317c32590d82ba0b330403cafd98a62cfd"}, + {file = "watchdog-2.1.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d9820fe47c20c13e3c9dd544d3706a2a26c02b2b43c993b62fcd8011bcc0adb3"}, + {file = "watchdog-2.1.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:70af927aa1613ded6a68089a9262a009fbdf819f46d09c1a908d4b36e1ba2b2d"}, + {file = "watchdog-2.1.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed80a1628cee19f5cfc6bb74e173f1b4189eb532e705e2a13e3250312a62e0c9"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9f05a5f7c12452f6a27203f76779ae3f46fa30f1dd833037ea8cbc2887c60213"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_armv7l.whl", hash = "sha256:255bb5758f7e89b1a13c05a5bceccec2219f8995a3a4c4d6968fe1de6a3b2892"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_i686.whl", hash = "sha256:d3dda00aca282b26194bdd0adec21e4c21e916956d972369359ba63ade616153"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64.whl", hash = "sha256:186f6c55abc5e03872ae14c2f294a153ec7292f807af99f57611acc8caa75306"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:083171652584e1b8829581f965b9b7723ca5f9a2cd7e20271edf264cfd7c1412"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_s390x.whl", hash = "sha256:b530ae007a5f5d50b7fbba96634c7ee21abec70dc3e7f0233339c81943848dc1"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:4f4e1c4aa54fb86316a62a87b3378c025e228178d55481d30d857c6c438897d6"}, + {file = "watchdog-2.1.9-py3-none-win32.whl", hash = "sha256:5952135968519e2447a01875a6f5fc8c03190b24d14ee52b0f4b1682259520b1"}, + {file = "watchdog-2.1.9-py3-none-win_amd64.whl", hash = "sha256:7a833211f49143c3d336729b0020ffd1274078e94b0ae42e22f596999f50279c"}, + {file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"}, + {file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"}, ] wrapt = [] -zipp = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, -] +zipp = [] From 02c1231e2298ec568354ed13cf6ae169dda23888 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 21:07:50 -0400 Subject: [PATCH 039/207] fix: Revert/increment poetry-version in main.yml to 1.1.14 as 1.2 fails. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2d4c7122..9cc8dbb9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -87,7 +87,7 @@ jobs: - name: Install Poetry uses: Gr1N/setup-poetry@v7 with: - poetry-version: 1.2 + poetry-version: 1.1.14 - name: Setup Poetry run: | poetry --version From bf24b9856c7725b92afa36ce9c563c52ea7ff27e Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 9 Sep 2022 21:42:18 -0400 Subject: [PATCH 040/207] chore: Specify Python 3.8 as the minimum version in publish.yml. --- .github/workflows/publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 737aa448..f9187c2d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,10 +11,10 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v2 - - name: Set up Python 3.7 + - name: Set up Python 3.8 uses: actions/setup-python@v2 with: - python-version: '3.7' + python-version: '3.8' - name: Install Poetry uses: Gr1N/setup-poetry@v7 - name: Publish From 7bfa554e7300156593a3b0514c3f1f9559d119c9 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 20:32:13 -0400 Subject: [PATCH 041/207] coms: Add a comment to versions to explain PROJECTS variable. --- gatorgrade/util/versions.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gatorgrade/util/versions.py b/gatorgrade/util/versions.py index 2f16f375..0a80c287 100644 --- a/gatorgrade/util/versions.py +++ b/gatorgrade/util/versions.py @@ -10,6 +10,10 @@ NEWLINE_NEWLINE = "\n\n" +# Projects are hard-coded and may need to be updated if there are +# new dependencies specified inside of the pyproject.toml file. +# With that said, this approach avoids the need to parse the +# dependencies listed in the pyproject.toml file. PROJECTS = ["gatorgrade", "gatorgrader", "pyyaml", "rich", "typer"] From 5e80c329b9b824f507b318cf2b6d3dd01d1634be Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 20:32:51 -0400 Subject: [PATCH 042/207] coms: Fix an incorrect docstring in the versions module. --- gatorgrade/util/versions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/util/versions.py b/gatorgrade/util/versions.py index 0a80c287..7c916281 100644 --- a/gatorgrade/util/versions.py +++ b/gatorgrade/util/versions.py @@ -30,7 +30,7 @@ def get_gatorgrade_version() -> str: def get_gatorgrader_version() -> str: - """Determine and return the information about GatorGrade's version.""" + """Determine and return the information about GatorGrader's version.""" gatorgrader_version_str = get_project_version("gatorgrader") return gatorgrader_version_str From dd4de8591ecf480ebd82f5fab2d81b607a14eeff Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 20:33:55 -0400 Subject: [PATCH 043/207] coms: Add comments to explain steps in the get_project_versions in versions. --- gatorgrade/util/versions.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gatorgrade/util/versions.py b/gatorgrade/util/versions.py index 7c916281..fd93f14d 100644 --- a/gatorgrade/util/versions.py +++ b/gatorgrade/util/versions.py @@ -37,7 +37,11 @@ def get_gatorgrader_version() -> str: def get_project_versions(project_list: List[str] = PROJECTS) -> str: """Create a version string for all specified projects.""" + # create an empty version string that this function + # will append to for each of the projects in the project_list project_version_str = "" + # iterate through every project in the project_list and then + # include its name and its current version in project_version_str for project in project_list: current_project_version_str = ( DASH + SPACE + get_project_version(project) + NEWLINE_NEWLINE From ad8b4d96b601ebdd3f8e10ab2b13fc18138ef594 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 20:34:38 -0400 Subject: [PATCH 044/207] refactor: Delete two not-needed functions in the versions module. --- gatorgrade/util/versions.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/gatorgrade/util/versions.py b/gatorgrade/util/versions.py index fd93f14d..131db405 100644 --- a/gatorgrade/util/versions.py +++ b/gatorgrade/util/versions.py @@ -23,18 +23,6 @@ def get_project_version(project: str) -> str: return project + COLON + SPACE + project_version_str -def get_gatorgrade_version() -> str: - """Determine and return the information about GatorGrade's version.""" - gatorgrade_version_str = get_project_version("gatorgrade") - return gatorgrade_version_str - - -def get_gatorgrader_version() -> str: - """Determine and return the information about GatorGrader's version.""" - gatorgrader_version_str = get_project_version("gatorgrader") - return gatorgrader_version_str - - def get_project_versions(project_list: List[str] = PROJECTS) -> str: """Create a version string for all specified projects.""" # create an empty version string that this function From ba76bbfe73b9cab21ba6cea4fd131eb40157ce20 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 21:40:27 -0400 Subject: [PATCH 045/207] fix: Stop using an epilog in main and add more to version output. --- gatorgrade/main.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index ee57ff1c..25536116 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -40,21 +40,18 @@ # define the epilog that appears after the help details epilog_message_markdown = f""" {version_info_markdown} +:tada: Want to contribute to this project? Check these GitHub sites! - - :tada: Want to contribute to this project? Check these GitHub sites! - - {github_message} +{github_message} """ -# create a Typer app that +# create a Typer app that: # --> does not support completion # --> has an epilog with version information and contact # --> has a specified help message with an emoji for tagline # --> uses "markdown" mode so that markdown and emojis work app = typer.Typer( add_completion=False, - epilog=epilog_message_markdown, help=help_message_markdown, rich_markup_mode=RICH_MARKUP_MODE_DEFAULT, ) @@ -82,6 +79,10 @@ def gatorgrade( console.print(version_label) console.print(Markdown(versions.get_project_versions())) console.print() + console.print(":tada: Want to contribute to this project? Check these GitHub sites!") + console.print(Markdown(github_message)) + # console.print((epilog_message_markdown)) + console.print() else: # parse the provided configuration file checks = parse_config(filename) From 44997281029779bee343a8a819bb23a86b5f3fc9 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 21:50:33 -0400 Subject: [PATCH 046/207] feat: Improve the output of --version in the main module. --- gatorgrade/main.py | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 25536116..e585c9c6 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -20,31 +20,14 @@ FAILURE = 1 RICH_MARKUP_MODE_DEFAULT = "markdown" -# define the message about GitHub repositories -github_message = github.get_github_projects() - # define the version message with markdown formatting project_version_str = versions.get_project_versions() -version_label = ":wrench: Version information:" -version_info_markdown = f""" - {version_label} - - {project_version_str} -""" # define the overall help message help_message_markdown = f""" {GATORGRADE_EMOJI_RICH} GatorGrade runs the GatorGrader checks in a specified configuration file. """ -# define the epilog that appears after the help details -epilog_message_markdown = f""" -{version_info_markdown} -:tada: Want to contribute to this project? Check these GitHub sites! - -{github_message} -""" - # create a Typer app that: # --> does not support completion # --> has an epilog with version information and contact @@ -75,14 +58,28 @@ def gatorgrade( # requesting version information overrides all other commands; # if the version details are requested, print them and exit if version: + # define the version label with suitable emoji + version_label = ":wrench: Version information:" + # define the message about the project versions + version_message = versions.get_project_versions() + # define a contribution message with suitable emoji + contribution_message = ( + ":tada: Want to contribute to this project? Check these GitHub sites!" + ) + # define the message about GitHub repositories + github_message = github.get_github_projects() + # output all of the details about gatorgrade + # 1) standard help message (defined previously) console.print(help_message_markdown) + # 2) version information console.print(version_label) - console.print(Markdown(versions.get_project_versions())) + console.print(Markdown(version_message)) console.print() - console.print(":tada: Want to contribute to this project? Check these GitHub sites!") + # 3) contribution message + console.print(contribution_message) console.print(Markdown(github_message)) - # console.print((epilog_message_markdown)) console.print() + # run the checking function since --version was not provided else: # parse the provided configuration file checks = parse_config(filename) From 6d7b904d081afd74c554d29ee2e996c756a42f91 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 21:51:40 -0400 Subject: [PATCH 047/207] coms: Improve two comments in the main module. --- gatorgrade/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index e585c9c6..232f590d 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -69,9 +69,9 @@ def gatorgrade( # define the message about GitHub repositories github_message = github.get_github_projects() # output all of the details about gatorgrade - # 1) standard help message (defined previously) + # 1) standard help message that was defined previously console.print(help_message_markdown) - # 2) version information + # 2) version message console.print(version_label) console.print(Markdown(version_message)) console.print() From 2bb8c0174c7fe1638492ed52c26208c3e8f1dd86 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 21:52:35 -0400 Subject: [PATCH 048/207] fix: Delete the GATORGRADE_EMOJI constant in main. --- gatorgrade/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 232f590d..f0199467 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -14,7 +14,6 @@ # define constants used in this module DEFAULT_VERSION = False -GATORGRADE_EMOJI = "🐊" GATORGRADE_EMOJI_RICH = ":crocodile:" FILE = "gatorgrade.yml" FAILURE = 1 From 6fc26d7527be83964654f6496b1e12889bbe8cb4 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 21:53:33 -0400 Subject: [PATCH 049/207] refactor: Delete a not-needed variable in main. --- gatorgrade/main.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index f0199467..834435d4 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -19,9 +19,6 @@ FAILURE = 1 RICH_MARKUP_MODE_DEFAULT = "markdown" -# define the version message with markdown formatting -project_version_str = versions.get_project_versions() - # define the overall help message help_message_markdown = f""" {GATORGRADE_EMOJI_RICH} GatorGrade runs the GatorGrader checks in a specified configuration file. From 87d45878284221288ae0241fbba29230fcc4fdf2 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 21:57:21 -0400 Subject: [PATCH 050/207] coms: Add comments to explain steps in get_github_projects in github. --- gatorgrade/util/github.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gatorgrade/util/github.py b/gatorgrade/util/github.py index cbafa113..dc8b758f 100644 --- a/gatorgrade/util/github.py +++ b/gatorgrade/util/github.py @@ -16,7 +16,12 @@ def get_github_projects(projects: Dict[str, str] = PROJECTS) -> str: """Create a GitHub repository string for all specified projects.""" + # create an empty project_version_str that will be appended + # to with information about each project and its GitHub URL project_version_str = "" + # iterate through the provided projects and display: + # 1) the name of the project + # 2) the GitHub URL for the project for project_name in projects.keys(): current_project_version_str = ( DASH From e52e20aa45f4789c797b9fbe5fd40fb639acdade Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 22:05:39 -0400 Subject: [PATCH 051/207] coms: Delete a not-needed comment for typer app in main. --- gatorgrade/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 834435d4..3eeb5cca 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -26,7 +26,6 @@ # create a Typer app that: # --> does not support completion -# --> has an epilog with version information and contact # --> has a specified help message with an emoji for tagline # --> uses "markdown" mode so that markdown and emojis work app = typer.Typer( From 5af4b70bc75f6b198f4ec9b9d629ff12c5e9b7b4 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 22:06:18 -0400 Subject: [PATCH 052/207] coms: Clarify the docstring comment in main. --- gatorgrade/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 3eeb5cca..2930ac2b 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -1,4 +1,4 @@ -"""Use Typer to run gatorgrade to run the checks and generate the yml file.""" +"""Use Typer to run gatorgrade to run the GatorGrader checks.""" import sys from pathlib import Path From a5850e2097755e3368b16ebca5247c870d1263c1 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sun, 18 Sep 2022 22:07:12 -0400 Subject: [PATCH 053/207] chore: Bump the semver in the pyproject.toml file. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 32862409..54c5f9cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "gatorgrade" -version = "0.3.1" +version = "0.4.0" description = "GatorGrade executes GatorGrader checks!" authors = ["Michael Abraham", "Jacob Allebach", "Liam Black", "Katherine Burgess", "Yanqiao Chen", "Ochirsaikhan Davaajambal", "Tuguldurnemekh Gantulga", "Anthony Grant-Cook", "Dylan Holland", "Gregory M. Kapfhammer", "Peyton Kelly", "Luke Lacaria", "Lauren Nevill", "Jack Turner", "Daniel Ullrich", "Garrison Vanzin", "Rian Watson"] readme = "README.md" From c31b6e9e5adff58fe9d1f0706a917c13144eca54 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Sun, 16 Oct 2022 21:22:11 -0400 Subject: [PATCH 054/207] upgrade python version to unification --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 85ab4976..87ee1019 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Michael Abraham", "Jacob Allebach", "Liam Black", "Katherine Burgess readme = "README.md" [tool.poetry.dependencies] -python = ">=3.7,<4.0" +python = ">=3.7.2,<4.0" PyYAML = "^6.0" gatorgrader = "^1.1.0" rich = "^12.5.1" From 7e277af3e4977a13e3aa5a6a07d023ed8ad54002 Mon Sep 17 00:00:00 2001 From: Saejin Mahlau-Heinert Date: Mon, 17 Oct 2022 01:14:51 -0500 Subject: [PATCH 055/207] Update GatorGrader version and regenerate poetry.lock with new versions --- poetry.lock | 732 +++++++++++++++++++++++++++++-------------------- pyproject.toml | 4 +- 2 files changed, 436 insertions(+), 300 deletions(-) diff --git a/poetry.lock b/poetry.lock index 21f37bdd..63926669 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,16 +1,19 @@ [[package]] name = "astroid" -version = "2.11.5" +version = "2.12.11" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7.2" [package.dependencies] lazy-object-proxy = ">=1.4.0" typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} -wrapt = ">=1.11,<2" +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] [[package]] name = "astunparse" @@ -23,42 +26,34 @@ python-versions = "*" [package.dependencies] six = ">=1.6.1,<2.0" -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - [[package]] name = "attrs" -version = "21.4.0" +version = "22.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] +docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] [[package]] name = "black" -version = "22.3.0" +version = "22.10.0" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7" [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} @@ -78,19 +73,19 @@ python-versions = "*" [[package]] name = "certifi" -version = "2021.10.8" +version = "2022.9.24" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "charset-normalizer" -version = "2.0.12" +version = "2.1.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.5.0" +python-versions = ">=3.6.0" [package.extras] unicode_backport = ["unicodedata2"] @@ -109,7 +104,7 @@ importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.5" description = "Cross-platform colored terminal text." category = "main" optional = false @@ -128,7 +123,7 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "coverage" -version = "6.4.4" +version = "6.5.0" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -142,11 +137,11 @@ toml = ["tomli"] [[package]] name = "dill" -version = "0.3.4" +version = "0.3.5.1" description = "serialize all of python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*" +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)"] @@ -161,18 +156,18 @@ python-versions = "*" [[package]] name = "gatorgrader" -version = "1.1.0" +version = "1.1.1" description = "Automated Grading Tool that Checks the Work of Writers and Programmers" category = "main" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.7.2,<4.0" [package.dependencies] commonmark = ">=0.9.1,<0.10.0" -GitPython = ">=3.1.26,<4.0.0" +GitPython = ">=3.1.27,<4.0.0" num2words = ">=0.5.10,<0.6.0" pluginbase = ">=1.0.1,<2.0.0" -requests = ">=2.27.1,<3.0.0" +requests = ">=2.28.1,<3.0.0" [[package]] name = "ghp-import" @@ -186,7 +181,7 @@ python-versions = "*" python-dateutil = ">=2.8.1" [package.extras] -dev = ["twine", "markdown", "flake8", "wheel"] +dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "gitdb" @@ -201,7 +196,7 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.27" +version = "3.1.29" description = "GitPython is a python library used to interact with Git repositories" category = "main" optional = false @@ -213,21 +208,21 @@ typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\"" [[package]] name = "griffe" -version = "0.19.1" +version = "0.22.2" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -cached_property = {version = "*", markers = "python_version < \"3.8\""} +cached-property = {version = "*", markers = "python_version < \"3.8\""} [package.extras] async = ["aiofiles (>=0.7,<1.0)"] [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false @@ -235,7 +230,7 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.11.3" +version = "5.0.0" description = "Read metadata from Python packages" category = "main" optional = false @@ -246,9 +241,9 @@ typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" @@ -267,10 +262,10 @@ 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)"] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] +requirements_deprecated_finder = ["pip-api", "pipreqs"] [[package]] name = "jinja2" @@ -334,26 +329,29 @@ python-versions = ">=3.6" [[package]] name = "mkdocs" -version = "1.3.0" +version = "1.4.1" description = "Project documentation with Markdown." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -click = ">=3.3" +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} ghp-import = ">=1.0" -importlib-metadata = ">=4.3" -Jinja2 = ">=2.10.2" -Markdown = ">=3.2.1" +importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +jinja2 = ">=2.11.1" +markdown = ">=3.2.1,<3.4" mergedeep = ">=1.3.4" packaging = ">=20.5" -PyYAML = ">=3.10" +pyyaml = ">=5.1" pyyaml-env-tag = ">=0.1" +typing-extensions = {version = ">=3.10", markers = "python_version < \"3.8\""} watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autorefs" @@ -369,7 +367,7 @@ mkdocs = ">=1.1" [[package]] name = "mkdocs-gen-files" -version = "0.3.4" +version = "0.3.5" description = "MkDocs plugin to programmatically generate documentation pages during the build" category = "dev" optional = false @@ -391,7 +389,7 @@ mkdocs = ">=1.0.3,<2.0.0" [[package]] name = "mkdocs-material" -version = "8.4.2" +version = "8.5.6" description = "Documentation that simply works" category = "dev" optional = false @@ -400,10 +398,11 @@ python-versions = ">=3.7" [package.dependencies] jinja2 = ">=3.0.2" markdown = ">=3.2" -mkdocs = ">=1.3.0" +mkdocs = ">=1.4.0" mkdocs-material-extensions = ">=1.0.3" pygments = ">=2.12" pymdown-extensions = ">=9.4" +requests = ">=2.26" [[package]] name = "mkdocs-material-extensions" @@ -490,7 +489,7 @@ python-versions = "*" [[package]] name = "num2words" -version = "0.5.10" +version = "0.5.12" description = "Modules to convert numbers to words. Easily extensible." category = "main" optional = false @@ -512,11 +511,11 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.9.0" +version = "0.10.1" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" [[package]] name = "platformdirs" @@ -527,8 +526,8 @@ 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)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] [[package]] name = "pluggy" @@ -563,14 +562,14 @@ python-versions = "*" [[package]] name = "psutil" -version = "5.9.0" +version = "5.9.2" description = "Cross-platform lib for process and system monitoring in Python." category = "dev" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.extras] -test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "py" @@ -596,36 +595,41 @@ toml = ["toml"] [[package]] name = "pygments" -version = "2.12.0" +version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false python-versions = ">=3.6" +[package.extras] +plugins = ["importlib-metadata"] + [[package]] name = "pylint" -version = "2.13.8" +version = "2.15.4" description = "python code static checker" category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7.2" [package.dependencies] -astroid = ">=2.11.3,<=2.12.0-dev0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} +astroid = ">=2.12.11,<=2.14.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] -testutil = ["gitpython (>3)"] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] [[package]] name = "pymdown-extensions" -version = "9.4" +version = "9.6" description = "Extension pack for Python Markdown." category = "dev" optional = false @@ -636,25 +640,24 @@ markdown = ">=3.2" [[package]] name = "pyparsing" -version = "3.0.8" +version = "3.0.9" description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false python-versions = ">=3.6.8" [package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.1.2" +version = "7.1.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -693,7 +696,7 @@ coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] [[package]] name = "pytest-randomly" @@ -768,25 +771,25 @@ pyyaml = "*" [[package]] name = "requests" -version = "2.27.1" +version = "2.28.1" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" -version = "12.5.1" +version = "12.6.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "main" optional = false @@ -834,7 +837,7 @@ python-versions = "*" [[package]] name = "taskipy" -version = "1.10.1" +version = "1.10.3" description = "tasks runner for python projects" category = "dev" optional = false @@ -844,15 +847,18 @@ python-versions = ">=3.6,<4.0" colorama = ">=0.4.4,<0.5.0" mslex = {version = ">=0.3.0,<0.4.0", markers = "sys_platform == \"win32\""} psutil = ">=5.7.2,<6.0.0" -tomli = ">=1.2.3,<2.0.0" +tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} [[package]] name = "termcolor" -version = "1.1.0" -description = "ANSII Color formatting for output in terminal." +version = "2.0.1" +description = "ANSI color formatting for output in terminal" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" + +[package.extras] +tests = ["pytest", "pytest-cov"] [[package]] name = "toml" @@ -864,15 +870,23 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.3" +version = "2.0.1" description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" + +[[package]] +name = "tomlkit" +version = "0.11.5" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" [[package]] name = "typed-ast" -version = "1.5.3" +version = "1.5.4" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false @@ -893,14 +907,14 @@ rich = {version = ">=10.11.0,<13.0.0", optional = true, markers = "extra == \"al shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""} [package.extras] -all = ["colorama (>=0.4.3,<0.5.0)", "shellingham (>=1.3.0,<2.0.0)", "rich (>=10.11.0,<13.0.0)"] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] -doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "mdx-include (>=1.4.1,<2.0.0)"] -test = ["shellingham (>=1.3.0,<2.0.0)", "pytest (>=4.4.0,<5.4.0)", "pytest-cov (>=2.10.0,<3.0.0)", "coverage (>=5.2,<6.0)", "pytest-xdist (>=1.32.0,<2.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "mypy (==0.910)", "black (>=22.3.0,<23.0.0)", "isort (>=5.0.6,<6.0.0)", "rich (>=10.11.0,<13.0.0)"] +doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=5.2,<6.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<5.4.0)", "pytest-cov (>=2.10.0,<3.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<2.0.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] [[package]] name = "typing-extensions" -version = "4.2.0" +version = "4.4.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false @@ -908,20 +922,20 @@ python-versions = ">=3.7" [[package]] name = "urllib3" -version = "1.26.9" +version = "1.26.12" 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.*, <4" +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"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "watchdog" -version = "2.1.7" +version = "2.1.9" description = "Filesystem events monitoring" category = "dev" optional = false @@ -940,141 +954,168 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "zipp" -version = "3.8.0" +version = "3.9.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" -python-versions = ">=3.7,<4.0" -content-hash = "b00f295850266d2f98df98eb8f876970d1bc15272f8f844f01abd771a7f7b330" +python-versions = ">=3.7.2,<4.0" +content-hash = "745764366191be2cf495072bee0fe1c94fad711bdfd962cfa831085aacd9e56d" [metadata.files] astroid = [ - {file = "astroid-2.11.5-py3-none-any.whl", hash = "sha256:14ffbb4f6aa2cf474a0834014005487f7ecd8924996083ab411e7fa0b508ce0b"}, - {file = "astroid-2.11.5.tar.gz", hash = "sha256:f4e4ec5294c4b07ac38bab9ca5ddd3914d4bf46f9006eb5c0ae755755061044e"}, + {file = "astroid-2.12.11-py3-none-any.whl", hash = "sha256:867a756bbf35b7bc07b35bfa6522acd01f91ad9919df675e8428072869792dce"}, + {file = "astroid-2.12.11.tar.gz", hash = "sha256:2df4f9980c4511474687895cbfdb8558293c1a826d9118bb09233d7c2bff1c83"}, ] astunparse = [ {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, ] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] +black = [ + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, ] -black = [] cached-property = [ {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, ] 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.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, ] commonmark = [ {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, ] coverage = [ - {file = "coverage-6.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7b4da9bafad21ea45a714d3ea6f3e1679099e420c8741c74905b92ee9bfa7cc"}, - {file = "coverage-6.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fde17bc42e0716c94bf19d92e4c9f5a00c5feb401f5bc01101fdf2a8b7cacf60"}, - {file = "coverage-6.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbb0d89923c80dbd435b9cf8bba0ff55585a3cdb28cbec65f376c041472c60d"}, - {file = "coverage-6.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67f9346aeebea54e845d29b487eb38ec95f2ecf3558a3cffb26ee3f0dcc3e760"}, - {file = "coverage-6.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42c499c14efd858b98c4e03595bf914089b98400d30789511577aa44607a1b74"}, - {file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c35cca192ba700979d20ac43024a82b9b32a60da2f983bec6c0f5b84aead635c"}, - {file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9cc4f107009bca5a81caef2fca843dbec4215c05e917a59dec0c8db5cff1d2aa"}, - {file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f444627b3664b80d078c05fe6a850dd711beeb90d26731f11d492dcbadb6973"}, - {file = "coverage-6.4.4-cp310-cp310-win32.whl", hash = "sha256:66e6df3ac4659a435677d8cd40e8eb1ac7219345d27c41145991ee9bf4b806a0"}, - {file = "coverage-6.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:35ef1f8d8a7a275aa7410d2f2c60fa6443f4a64fae9be671ec0696a68525b875"}, - {file = "coverage-6.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c1328d0c2f194ffda30a45f11058c02410e679456276bfa0bbe0b0ee87225fac"}, - {file = "coverage-6.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61b993f3998ee384935ee423c3d40894e93277f12482f6e777642a0141f55782"}, - {file = "coverage-6.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5dd4b8e9cd0deb60e6fcc7b0647cbc1da6c33b9e786f9c79721fd303994832f"}, - {file = "coverage-6.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7026f5afe0d1a933685d8f2169d7c2d2e624f6255fb584ca99ccca8c0e966fd7"}, - {file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9c7b9b498eb0c0d48b4c2abc0e10c2d78912203f972e0e63e3c9dc21f15abdaa"}, - {file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ee2b2fb6eb4ace35805f434e0f6409444e1466a47f620d1d5763a22600f0f892"}, - {file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ab066f5ab67059d1f1000b5e1aa8bbd75b6ed1fc0014559aea41a9eb66fc2ce0"}, - {file = "coverage-6.4.4-cp311-cp311-win32.whl", hash = "sha256:9d6e1f3185cbfd3d91ac77ea065d85d5215d3dfa45b191d14ddfcd952fa53796"}, - {file = "coverage-6.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e3d3c4cc38b2882f9a15bafd30aec079582b819bec1b8afdbde8f7797008108a"}, - {file = "coverage-6.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a095aa0a996ea08b10580908e88fbaf81ecf798e923bbe64fb98d1807db3d68a"}, - {file = "coverage-6.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef6f44409ab02e202b31a05dd6666797f9de2aa2b4b3534e9d450e42dea5e817"}, - {file = "coverage-6.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b7101938584d67e6f45f0015b60e24a95bf8dea19836b1709a80342e01b472f"}, - {file = "coverage-6.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a32ec68d721c3d714d9b105c7acf8e0f8a4f4734c811eda75ff3718570b5e3"}, - {file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6a864733b22d3081749450466ac80698fe39c91cb6849b2ef8752fd7482011f3"}, - {file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:08002f9251f51afdcc5e3adf5d5d66bb490ae893d9e21359b085f0e03390a820"}, - {file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a3b2752de32c455f2521a51bd3ffb53c5b3ae92736afde67ce83477f5c1dd928"}, - {file = "coverage-6.4.4-cp37-cp37m-win32.whl", hash = "sha256:f855b39e4f75abd0dfbcf74a82e84ae3fc260d523fcb3532786bcbbcb158322c"}, - {file = "coverage-6.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ee6ae6bbcac0786807295e9687169fba80cb0617852b2fa118a99667e8e6815d"}, - {file = "coverage-6.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:564cd0f5b5470094df06fab676c6d77547abfdcb09b6c29c8a97c41ad03b103c"}, - {file = "coverage-6.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cbbb0e4cd8ddcd5ef47641cfac97d8473ab6b132dd9a46bacb18872828031685"}, - {file = "coverage-6.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6113e4df2fa73b80f77663445be6d567913fb3b82a86ceb64e44ae0e4b695de1"}, - {file = "coverage-6.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d032bfc562a52318ae05047a6eb801ff31ccee172dc0d2504614e911d8fa83e"}, - {file = "coverage-6.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e431e305a1f3126477abe9a184624a85308da8edf8486a863601d58419d26ffa"}, - {file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cf2afe83a53f77aec067033199797832617890e15bed42f4a1a93ea24794ae3e"}, - {file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:783bc7c4ee524039ca13b6d9b4186a67f8e63d91342c713e88c1865a38d0892a"}, - {file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ff934ced84054b9018665ca3967fc48e1ac99e811f6cc99ea65978e1d384454b"}, - {file = "coverage-6.4.4-cp38-cp38-win32.whl", hash = "sha256:e1fabd473566fce2cf18ea41171d92814e4ef1495e04471786cbc943b89a3781"}, - {file = "coverage-6.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:4179502f210ebed3ccfe2f78bf8e2d59e50b297b598b100d6c6e3341053066a2"}, - {file = "coverage-6.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98c0b9e9b572893cdb0a00e66cf961a238f8d870d4e1dc8e679eb8bdc2eb1b86"}, - {file = "coverage-6.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc600f6ec19b273da1d85817eda339fb46ce9eef3e89f220055d8696e0a06908"}, - {file = "coverage-6.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a98d6bf6d4ca5c07a600c7b4e0c5350cd483c85c736c522b786be90ea5bac4f"}, - {file = "coverage-6.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01778769097dbd705a24e221f42be885c544bb91251747a8a3efdec6eb4788f2"}, - {file = "coverage-6.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfa0b97eb904255e2ab24166071b27408f1f69c8fbda58e9c0972804851e0558"}, - {file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fcbe3d9a53e013f8ab88734d7e517eb2cd06b7e689bedf22c0eb68db5e4a0a19"}, - {file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:15e38d853ee224e92ccc9a851457fb1e1f12d7a5df5ae44544ce7863691c7a0d"}, - {file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6913dddee2deff8ab2512639c5168c3e80b3ebb0f818fed22048ee46f735351a"}, - {file = "coverage-6.4.4-cp39-cp39-win32.whl", hash = "sha256:354df19fefd03b9a13132fa6643527ef7905712109d9c1c1903f2133d3a4e145"}, - {file = "coverage-6.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:1238b08f3576201ebf41f7c20bf59baa0d05da941b123c6656e42cdb668e9827"}, - {file = "coverage-6.4.4-pp36.pp37.pp38-none-any.whl", hash = "sha256:f67cf9f406cf0d2f08a3515ce2db5b82625a7257f88aad87904674def6ddaec1"}, - {file = "coverage-6.4.4.tar.gz", hash = "sha256:e16c45b726acb780e1e6f88b286d3c10b3914ab03438f32117c4aa52d7f30d58"}, + {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, + {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, + {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, + {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, + {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, + {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, + {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, + {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, + {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, + {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, + {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, + {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, + {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, + {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, + {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, + {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, ] dill = [ - {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"}, - {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"}, + {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"}, ] docopt = [ {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, ] gatorgrader = [ - {file = "gatorgrader-1.1.0-py3-none-any.whl", hash = "sha256:1ae30eb2d1313121e852830e7fdebb0c6c7096491f1b4eeaf7b28a87a8b79d24"}, - {file = "gatorgrader-1.1.0.tar.gz", hash = "sha256:0f9c150e06ba2593609c13e1ece8a62c63577e51ced3b822fcec54d9edde80da"}, + {file = "gatorgrader-1.1.1-py3-none-any.whl", hash = "sha256:5581fadb58e53ceb24a76c344ed211d0cd69ee22a987ac9861a83ec9a78dfe4e"}, + {file = "gatorgrader-1.1.1.tar.gz", hash = "sha256:7a08ad1a42d5caa4795f14474ed414759f7b16388cd02b7b3e787dcfb74501f8"}, ] ghp-import = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, ] -gitdb = [] -gitpython = [] +gitdb = [ + {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, + {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, +] +gitpython = [ + {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, + {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, +] griffe = [ - {file = "griffe-0.19.1-py3-none-any.whl", hash = "sha256:7d9393f8d6d6026d80dc0865724b9d87f2cbb93e3f86998b785b01403cd3d52b"}, - {file = "griffe-0.19.1.tar.gz", hash = "sha256:945284500df94f272b8a70bcedaac99721f26dea72d2f1b16f416de28848b753"}, + {file = "griffe-0.22.2-py3-none-any.whl", hash = "sha256:cea5415ac6a92f4a22638e3f1f2e661402bac09fb8e8266936d67185a7e0d0fb"}, + {file = "griffe-0.22.2.tar.gz", hash = "sha256:1408e336a4155392bbd81eed9f2f44bf144e71b9c664e905630affe83bbc088e"}, ] idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] +importlib-metadata = [ + {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, + {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, ] -importlib-metadata = [] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -1172,30 +1213,33 @@ markupsafe = [ {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, ] -mccabe = [] +mccabe = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] mergedeep = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, ] mkdocs = [ - {file = "mkdocs-1.3.0-py3-none-any.whl", hash = "sha256:26bd2b03d739ac57a3e6eed0b7bcc86168703b719c27b99ad6ca91dc439aacde"}, - {file = "mkdocs-1.3.0.tar.gz", hash = "sha256:b504405b04da38795fec9b2e5e28f6aa3a73bb0960cb6d5d27ead28952bd35ea"}, + {file = "mkdocs-1.4.1-py3-none-any.whl", hash = "sha256:2b7845c2775396214cd408753e4cfb01af3cfed36acc141a84bce2ceec9d705d"}, + {file = "mkdocs-1.4.1.tar.gz", hash = "sha256:07ed90be4062e4ef732bbac2623097b9dca35c67b562c38cfd0bfbc7151758c1"}, ] mkdocs-autorefs = [ {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, ] mkdocs-gen-files = [ - {file = "mkdocs-gen-files-0.3.4.tar.gz", hash = "sha256:c69188486bdc1e74bd2b9b7ebbde9f9eb21052ae7762f1b35420cfbfc6d7122e"}, - {file = "mkdocs_gen_files-0.3.4-py3-none-any.whl", hash = "sha256:07f43245c87a03cfb03884e767655c2a61def24d07e47fb3a8d26b1581524d6a"}, + {file = "mkdocs-gen-files-0.3.5.tar.gz", hash = "sha256:d90d9e1676531a0bb96b1287dc28aa41162986de4dc3c00400214724761ff6ef"}, + {file = "mkdocs_gen_files-0.3.5-py3-none-any.whl", hash = "sha256:69562fddc662482e8f54a00a8b4ede5166ad5384ae4dbb0469f1f338ef3285ca"}, ] mkdocs-literate-nav = [ {file = "mkdocs-literate-nav-0.4.1.tar.gz", hash = "sha256:9efe26b662f2f901cae5807bfd51446d30ea7e033c2bc43a15d6282c7dfac1ab"}, {file = "mkdocs_literate_nav-0.4.1-py3-none-any.whl", hash = "sha256:a4b761792ba21defbe2dfd5e0de6ba451639e1ca0f0661c37eda83cc6261e4f9"}, ] mkdocs-material = [ - {file = "mkdocs-material-8.4.2.tar.gz", hash = "sha256:704c64c3fff126a3923c2961d95f26b19be621342a6a4e49ed039f0bb7a5c540"}, - {file = "mkdocs_material-8.4.2-py2.py3-none-any.whl", hash = "sha256:166287bb0e4197804906bf0389a852d5ced43182c30127ac8b48a4e497ecd7e5"}, + {file = "mkdocs_material-8.5.6-py3-none-any.whl", hash = "sha256:b473162c800321b9760453f301a91f7cb40a120a85a9d0464e1e484e74b76bb2"}, + {file = "mkdocs_material-8.5.6.tar.gz", hash = "sha256:38a21d817265d0c203ab3dad64996e45859c983f72180f6937bd5540a4eb84e4"}, ] mkdocs-material-extensions = [ {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"}, @@ -1226,16 +1270,16 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] num2words = [ - {file = "num2words-0.5.10-py3-none-any.whl", hash = "sha256:0b6e5f53f11d3005787e206d9c03382f459ef048a43c544e3db3b1e05a961548"}, - {file = "num2words-0.5.10.tar.gz", hash = "sha256:37cd4f60678f7e1045cdc3adf6acf93c8b41bf732da860f97d301f04e611cc57"}, + {file = "num2words-0.5.12-py3-none-any.whl", hash = "sha256:9eeef488658226ab36818c06d7aeb956d19b530fb62030596b6802fb4659f30e"}, + {file = "num2words-0.5.12.tar.gz", hash = "sha256:7e7c0b0f080405aa3a1dd9d32b1ca90b3bf03bab17b8e54db05e1b78301a0988"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, + {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, + {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, ] platformdirs = [ {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, @@ -1253,38 +1297,38 @@ pprintpp = [ {file = "pprintpp-0.4.0.tar.gz", hash = "sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403"}, ] psutil = [ - {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"}, - {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618"}, - {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2"}, - {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd"}, - {file = "psutil-5.9.0-cp27-none-win32.whl", hash = "sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3"}, - {file = "psutil-5.9.0-cp27-none-win_amd64.whl", hash = "sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c"}, - {file = "psutil-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492"}, - {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3"}, - {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2"}, - {file = "psutil-5.9.0-cp310-cp310-win32.whl", hash = "sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d"}, - {file = "psutil-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b"}, - {file = "psutil-5.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56"}, - {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203"}, - {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d"}, - {file = "psutil-5.9.0-cp36-cp36m-win32.whl", hash = "sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64"}, - {file = "psutil-5.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94"}, - {file = "psutil-5.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0"}, - {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce"}, - {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5"}, - {file = "psutil-5.9.0-cp37-cp37m-win32.whl", hash = "sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9"}, - {file = "psutil-5.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4"}, - {file = "psutil-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2"}, - {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d"}, - {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a"}, - {file = "psutil-5.9.0-cp38-cp38-win32.whl", hash = "sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666"}, - {file = "psutil-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841"}, - {file = "psutil-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf"}, - {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07"}, - {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d"}, - {file = "psutil-5.9.0-cp39-cp39-win32.whl", hash = "sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845"}, - {file = "psutil-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3"}, - {file = "psutil-5.9.0.tar.gz", hash = "sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25"}, + {file = "psutil-5.9.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:8f024fbb26c8daf5d70287bb3edfafa22283c255287cf523c5d81721e8e5d82c"}, + {file = "psutil-5.9.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:b2f248ffc346f4f4f0d747ee1947963613216b06688be0be2e393986fe20dbbb"}, + {file = "psutil-5.9.2-cp27-cp27m-win32.whl", hash = "sha256:b1928b9bf478d31fdffdb57101d18f9b70ed4e9b0e41af751851813547b2a9ab"}, + {file = "psutil-5.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:404f4816c16a2fcc4eaa36d7eb49a66df2d083e829d3e39ee8759a411dbc9ecf"}, + {file = "psutil-5.9.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:94e621c6a4ddb2573d4d30cba074f6d1aa0186645917df42c811c473dd22b339"}, + {file = "psutil-5.9.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:256098b4f6ffea6441eb54ab3eb64db9ecef18f6a80d7ba91549195d55420f84"}, + {file = "psutil-5.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:614337922702e9be37a39954d67fdb9e855981624d8011a9927b8f2d3c9625d9"}, + {file = "psutil-5.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39ec06dc6c934fb53df10c1672e299145ce609ff0611b569e75a88f313634969"}, + {file = "psutil-5.9.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3ac2c0375ef498e74b9b4ec56df3c88be43fe56cac465627572dbfb21c4be34"}, + {file = "psutil-5.9.2-cp310-cp310-win32.whl", hash = "sha256:e4c4a7636ffc47b7141864f1c5e7d649f42c54e49da2dd3cceb1c5f5d29bfc85"}, + {file = "psutil-5.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:f4cb67215c10d4657e320037109939b1c1d2fd70ca3d76301992f89fe2edb1f1"}, + {file = "psutil-5.9.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dc9bda7d5ced744622f157cc8d8bdd51735dafcecff807e928ff26bdb0ff097d"}, + {file = "psutil-5.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75291912b945a7351d45df682f9644540d564d62115d4a20d45fa17dc2d48f8"}, + {file = "psutil-5.9.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4018d5f9b6651f9896c7a7c2c9f4652e4eea53f10751c4e7d08a9093ab587ec"}, + {file = "psutil-5.9.2-cp36-cp36m-win32.whl", hash = "sha256:f40ba362fefc11d6bea4403f070078d60053ed422255bd838cd86a40674364c9"}, + {file = "psutil-5.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9770c1d25aee91417eba7869139d629d6328a9422ce1cdd112bd56377ca98444"}, + {file = "psutil-5.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:42638876b7f5ef43cef8dcf640d3401b27a51ee3fa137cb2aa2e72e188414c32"}, + {file = "psutil-5.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91aa0dac0c64688667b4285fa29354acfb3e834e1fd98b535b9986c883c2ce1d"}, + {file = "psutil-5.9.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fb54941aac044a61db9d8eb56fc5bee207db3bc58645d657249030e15ba3727"}, + {file = "psutil-5.9.2-cp37-cp37m-win32.whl", hash = "sha256:7cbb795dcd8ed8fd238bc9e9f64ab188f3f4096d2e811b5a82da53d164b84c3f"}, + {file = "psutil-5.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5d39e3a2d5c40efa977c9a8dd4f679763c43c6c255b1340a56489955dbca767c"}, + {file = "psutil-5.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd331866628d18223a4265371fd255774affd86244fc307ef66eaf00de0633d5"}, + {file = "psutil-5.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b315febaebae813326296872fdb4be92ad3ce10d1d742a6b0c49fb619481ed0b"}, + {file = "psutil-5.9.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7929a516125f62399d6e8e026129c8835f6c5a3aab88c3fff1a05ee8feb840d"}, + {file = "psutil-5.9.2-cp38-cp38-win32.whl", hash = "sha256:561dec454853846d1dd0247b44c2e66a0a0c490f937086930ec4b8f83bf44f06"}, + {file = "psutil-5.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:67b33f27fc0427483b61563a16c90d9f3b547eeb7af0ef1b9fe024cdc9b3a6ea"}, + {file = "psutil-5.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3591616fa07b15050b2f87e1cdefd06a554382e72866fcc0ab2be9d116486c8"}, + {file = "psutil-5.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b29f581b5edab1f133563272a6011925401804d52d603c5c606936b49c8b97"}, + {file = "psutil-5.9.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4642fd93785a29353d6917a23e2ac6177308ef5e8be5cc17008d885cb9f70f12"}, + {file = "psutil-5.9.2-cp39-cp39-win32.whl", hash = "sha256:ed29ea0b9a372c5188cdb2ad39f937900a10fb5478dc077283bf86eeac678ef1"}, + {file = "psutil-5.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:68b35cbff92d1f7103d8f1db77c977e72f49fcefae3d3d2b91c76b0e7aef48b8"}, + {file = "psutil-5.9.2.tar.gz", hash = "sha256:feb861a10b6c3bb00701063b37e4afc754f8217f0f09c42280586bd6ac712b5c"}, ] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, @@ -1295,24 +1339,24 @@ pydocstyle = [ {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, ] pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, ] pylint = [ - {file = "pylint-2.13.8-py3-none-any.whl", hash = "sha256:f87e863a0b08f64b5230e7e779bcb75276346995737b2c0dc2793070487b1ff6"}, - {file = "pylint-2.13.8.tar.gz", hash = "sha256:ced8968c3b699df0615e2a709554dec3ddac2f5cd06efadb69554a69eeca364a"}, + {file = "pylint-2.15.4-py3-none-any.whl", hash = "sha256:629cf1dbdfb6609d7e7a45815a8bb59300e34aa35783b5ac563acaca2c4022e9"}, + {file = "pylint-2.15.4.tar.gz", hash = "sha256:5441e9294335d354b7bad57c1044e5bd7cce25c433475d76b440e53452fa5cb8"}, ] pymdown-extensions = [ - {file = "pymdown_extensions-9.4-py3-none-any.whl", hash = "sha256:5b7432456bf555ce2b0ab3c2439401084cda8110f24f6b3ecef952b8313dfa1b"}, - {file = "pymdown_extensions-9.4.tar.gz", hash = "sha256:1baa22a60550f731630474cad28feb0405c8101f1a7ddc3ec0ed86ee510bcc43"}, + {file = "pymdown_extensions-9.6-py3-none-any.whl", hash = "sha256:1e36490adc7bfcef1fdb21bb0306e93af99cff8ec2db199bd17e3bf009768c11"}, + {file = "pymdown_extensions-9.6.tar.gz", hash = "sha256:b956b806439bbff10f726103a941266beb03fbe99f897c7d5e774d7170339ad9"}, ] pyparsing = [ - {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, - {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] pytest = [ - {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, - {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, + {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, + {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, ] pytest-clarity = [ {file = "pytest-clarity-1.0.1.tar.gz", hash = "sha256:505fe345fad4fe11c6a4187fe683f2c7c52c077caa1e135f3e483fe112db7772"}, @@ -1325,7 +1369,10 @@ pytest-randomly = [ {file = "pytest-randomly-3.12.0.tar.gz", hash = "sha256:d60c2db71ac319aee0fc6c4110a7597d611a8b94a5590918bfa8583f00caccb2"}, {file = "pytest_randomly-3.12.0-py3-none-any.whl", hash = "sha256:f4f2e803daf5d1ba036cc22bf4fe9dbbf99389ec56b00e5cba732fb5c1d07fdd"}, ] -pytest-sugar = [] +pytest-sugar = [ + {file = "pytest-sugar-0.9.5.tar.gz", hash = "sha256:eea78b6f15b635277d3d90280cd386d8feea1cab0f9be75947a626e8b02b477d"}, + {file = "pytest_sugar-0.9.5-py2.py3-none-any.whl", hash = "sha256:3da42de32ce4e1e95b448d61c92804433f5d4058c0a765096991c2e93d5a289f"}, +] 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"}, @@ -1342,6 +1389,13 @@ pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, @@ -1374,10 +1428,13 @@ pyyaml-env-tag = [ {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, ] requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, +] +rich = [ + {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, + {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, ] -rich = [] shellingham = [ {file = "shellingham-1.5.0-py2.py3-none-any.whl", hash = "sha256:a8f02ba61b69baaa13facdba62908ca8690a94b8119b69f5ec5873ea85f7391b"}, {file = "shellingham-1.5.0.tar.gz", hash = "sha256:72fb7f5c63103ca2cb91b23dee0c71fe8ad6fbfd46418ef17dbe40db51592dad"}, @@ -1386,87 +1443,166 @@ six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -smmap = [] +smmap = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] snowballstemmer = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] taskipy = [ - {file = "taskipy-1.10.1-py3-none-any.whl", hash = "sha256:9b38333654da487b6d16de6fa330b7629d1935d1e74819ba4c5f17a1c372d37b"}, - {file = "taskipy-1.10.1.tar.gz", hash = "sha256:6fa0b11c43d103e376063e90be31d87b435aad50fb7dc1c9a2de9b60a85015ed"}, + {file = "taskipy-1.10.3-py3-none-any.whl", hash = "sha256:4c0070ca53868d97989f7ab5c6f237525d52ee184f9b967576e8fe427ed9d0b8"}, + {file = "taskipy-1.10.3.tar.gz", hash = "sha256:112beaf21e3d5569950b99162a1de003fa885fabee9e450757a6b874be914877"}, +] +termcolor = [ + {file = "termcolor-2.0.1-py3-none-any.whl", hash = "sha256:7e597f9de8e001a3208c4132938597413b9da45382b6f1d150cff8d062b7aaa3"}, + {file = "termcolor-2.0.1.tar.gz", hash = "sha256:6b2cf769e93364a2676e1de56a7c0cff2cf5bd07f37e9cc80b0dd6320ebfe388"}, ] -termcolor = [] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, + {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.5-py3-none-any.whl", hash = "sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7"}, + {file = "tomlkit-0.11.5.tar.gz", hash = "sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c"}, ] typed-ast = [ - {file = "typed_ast-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ad3b48cf2b487be140072fb86feff36801487d4abb7382bb1929aaac80638ea"}, - {file = "typed_ast-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:542cd732351ba8235f20faa0fc7398946fe1a57f2cdb289e5497e1e7f48cfedb"}, - {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc2c11ae59003d4a26dda637222d9ae924387f96acae9492df663843aefad55"}, - {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd5df1313915dbd70eaaa88c19030b441742e8b05e6103c631c83b75e0435ccc"}, - {file = "typed_ast-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:e34f9b9e61333ecb0f7d79c21c28aa5cd63bec15cb7e1310d7d3da6ce886bc9b"}, - {file = "typed_ast-1.5.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f818c5b81966d4728fec14caa338e30a70dfc3da577984d38f97816c4b3071ec"}, - {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3042bfc9ca118712c9809201f55355479cfcdc17449f9f8db5e744e9625c6805"}, - {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4fff9fdcce59dc61ec1b317bdb319f8f4e6b69ebbe61193ae0a60c5f9333dc49"}, - {file = "typed_ast-1.5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:8e0b8528838ffd426fea8d18bde4c73bcb4167218998cc8b9ee0a0f2bfe678a6"}, - {file = "typed_ast-1.5.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ef1d96ad05a291f5c36895d86d1375c0ee70595b90f6bb5f5fdbee749b146db"}, - {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed44e81517364cb5ba367e4f68fca01fba42a7a4690d40c07886586ac267d9b9"}, - {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f60d9de0d087454c91b3999a296d0c4558c1666771e3460621875021bf899af9"}, - {file = "typed_ast-1.5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9e237e74fd321a55c90eee9bc5d44be976979ad38a29bbd734148295c1ce7617"}, - {file = "typed_ast-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee852185964744987609b40aee1d2eb81502ae63ee8eef614558f96a56c1902d"}, - {file = "typed_ast-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:27e46cdd01d6c3a0dd8f728b6a938a6751f7bd324817501c15fb056307f918c6"}, - {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d64dabc6336ddc10373922a146fa2256043b3b43e61f28961caec2a5207c56d5"}, - {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8cdf91b0c466a6c43f36c1964772918a2c04cfa83df8001ff32a89e357f8eb06"}, - {file = "typed_ast-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:9cc9e1457e1feb06b075c8ef8aeb046a28ec351b1958b42c7c31c989c841403a"}, - {file = "typed_ast-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e20d196815eeffb3d76b75223e8ffed124e65ee62097e4e73afb5fec6b993e7a"}, - {file = "typed_ast-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:37e5349d1d5de2f4763d534ccb26809d1c24b180a477659a12c4bde9dd677d74"}, - {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f1a27592fac87daa4e3f16538713d705599b0a27dfe25518b80b6b017f0a6d"}, - {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8831479695eadc8b5ffed06fdfb3e424adc37962a75925668deeb503f446c0a3"}, - {file = "typed_ast-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:20d5118e494478ef2d3a2702d964dae830aedd7b4d3b626d003eea526be18718"}, - {file = "typed_ast-1.5.3.tar.gz", hash = "sha256:27f25232e2dd0edfe1f019d6bfaaf11e86e657d9bdb7b0956db95f560cceb2b3"}, -] -typer = [] + {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, + {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, + {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, + {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, + {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, + {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, + {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, + {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, + {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, + {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, +] +typer = [ + {file = "typer-0.6.1-py3-none-any.whl", hash = "sha256:54b19e5df18654070a82f8c2aa1da456a4ac16a2a83e6dcd9f170e291c56338e"}, + {file = "typer-0.6.1.tar.gz", hash = "sha256:2d5720a5e63f73eaf31edaa15f6ab87f35f0690f8ca233017d7d23d743a91d73"}, +] typing-extensions = [ - {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, - {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, ] urllib3 = [ - {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, - {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, + {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, + {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, ] watchdog = [ - {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:177bae28ca723bc00846466016d34f8c1d6a621383b6caca86745918d55c7383"}, - {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d1cf7dfd747dec519486a98ef16097e6c480934ef115b16f18adb341df747a4"}, - {file = "watchdog-2.1.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f14ce6adea2af1bba495acdde0e510aecaeb13b33f7bd2f6324e551b26688ca"}, - {file = "watchdog-2.1.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4d0e98ac2e8dd803a56f4e10438b33a2d40390a72750cff4939b4b274e7906fa"}, - {file = "watchdog-2.1.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:81982c7884aac75017a6ecc72f1a4fedbae04181a8665a34afce9539fc1b3fab"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0b4a1fe6201c6e5a1926f5767b8664b45f0fcb429b62564a41f490ff1ce1dc7a"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6e6ae29b72977f2e1ee3d0b760d7ee47896cb53e831cbeede3e64485e5633cc8"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b9777664848160449e5b4260e0b7bc1ae0f6f4992a8b285db4ec1ef119ffa0e2"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:19b36d436578eb437e029c6b838e732ed08054956366f6dd11875434a62d2b99"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b61acffaf5cd5d664af555c0850f9747cc5f2baf71e54bbac164c58398d6ca7b"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1e877c70245424b06c41ac258023ea4bd0c8e4ff15d7c1368f17cd0ae6e351dd"}, - {file = "watchdog-2.1.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d802d65262a560278cf1a65ef7cae4e2bc7ecfe19e5451349e4c67e23c9dc420"}, - {file = "watchdog-2.1.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b3750ee5399e6e9c69eae8b125092b871ee9e2fcbd657a92747aea28f9056a5c"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_aarch64.whl", hash = "sha256:ed6d9aad09a2a948572224663ab00f8975fae242aa540509737bb4507133fa2d"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_armv7l.whl", hash = "sha256:b26e13e8008dcaea6a909e91d39b629a39635d1a8a7239dd35327c74f4388601"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_i686.whl", hash = "sha256:0908bb50f6f7de54d5d31ec3da1654cb7287c6b87bce371954561e6de379d690"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64.whl", hash = "sha256:bdcbf75580bf4b960fb659bbccd00123d83119619195f42d721e002c1621602f"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:81a5861d0158a7e55fe149335fb2bbfa6f48cbcbd149b52dbe2cd9a544034bbd"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_s390x.whl", hash = "sha256:03b43d583df0f18782a0431b6e9e9965c5b3f7cf8ec36a00b930def67942c385"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ae934e34c11aa8296c18f70bf66ed60e9870fcdb4cc19129a04ca83ab23e7055"}, - {file = "watchdog-2.1.7-py3-none-win32.whl", hash = "sha256:49639865e3db4be032a96695c98ac09eed39bbb43fe876bb217da8f8101689a6"}, - {file = "watchdog-2.1.7-py3-none-win_amd64.whl", hash = "sha256:340b875aecf4b0e6672076a6f05cfce6686935559bb6d34cebedee04126a9566"}, - {file = "watchdog-2.1.7-py3-none-win_ia64.whl", hash = "sha256:351e09b6d9374d5bcb947e6ac47a608ec25b9d70583e9db00b2fcdb97b00b572"}, - {file = "watchdog-2.1.7.tar.gz", hash = "sha256:3fd47815353be9c44eebc94cc28fe26b2b0c5bd889dafc4a5a7cbdf924143480"}, -] -wrapt = [] + {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"}, + {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"}, + {file = "watchdog-2.1.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee3e38a6cc050a8830089f79cbec8a3878ec2fe5160cdb2dc8ccb6def8552658"}, + {file = "watchdog-2.1.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64a27aed691408a6abd83394b38503e8176f69031ca25d64131d8d640a307591"}, + {file = "watchdog-2.1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:195fc70c6e41237362ba720e9aaf394f8178bfc7fa68207f112d108edef1af33"}, + {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bfc4d351e6348d6ec51df007432e6fe80adb53fd41183716017026af03427846"}, + {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8250546a98388cbc00c3ee3cc5cf96799b5a595270dfcfa855491a64b86ef8c3"}, + {file = "watchdog-2.1.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:117ffc6ec261639a0209a3252546b12800670d4bf5f84fbd355957a0595fe654"}, + {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97f9752208f5154e9e7b76acc8c4f5a58801b338de2af14e7e181ee3b28a5d39"}, + {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:247dcf1df956daa24828bfea5a138d0e7a7c98b1a47cf1fa5b0c3c16241fcbb7"}, + {file = "watchdog-2.1.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:226b3c6c468ce72051a4c15a4cc2ef317c32590d82ba0b330403cafd98a62cfd"}, + {file = "watchdog-2.1.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d9820fe47c20c13e3c9dd544d3706a2a26c02b2b43c993b62fcd8011bcc0adb3"}, + {file = "watchdog-2.1.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:70af927aa1613ded6a68089a9262a009fbdf819f46d09c1a908d4b36e1ba2b2d"}, + {file = "watchdog-2.1.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed80a1628cee19f5cfc6bb74e173f1b4189eb532e705e2a13e3250312a62e0c9"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9f05a5f7c12452f6a27203f76779ae3f46fa30f1dd833037ea8cbc2887c60213"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_armv7l.whl", hash = "sha256:255bb5758f7e89b1a13c05a5bceccec2219f8995a3a4c4d6968fe1de6a3b2892"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_i686.whl", hash = "sha256:d3dda00aca282b26194bdd0adec21e4c21e916956d972369359ba63ade616153"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64.whl", hash = "sha256:186f6c55abc5e03872ae14c2f294a153ec7292f807af99f57611acc8caa75306"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:083171652584e1b8829581f965b9b7723ca5f9a2cd7e20271edf264cfd7c1412"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_s390x.whl", hash = "sha256:b530ae007a5f5d50b7fbba96634c7ee21abec70dc3e7f0233339c81943848dc1"}, + {file = "watchdog-2.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:4f4e1c4aa54fb86316a62a87b3378c025e228178d55481d30d857c6c438897d6"}, + {file = "watchdog-2.1.9-py3-none-win32.whl", hash = "sha256:5952135968519e2447a01875a6f5fc8c03190b24d14ee52b0f4b1682259520b1"}, + {file = "watchdog-2.1.9-py3-none-win_amd64.whl", hash = "sha256:7a833211f49143c3d336729b0020ffd1274078e94b0ae42e22f596999f50279c"}, + {file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"}, + {file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"}, +] +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"}, +] zipp = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, + {file = "zipp-3.9.0-py3-none-any.whl", hash = "sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980"}, + {file = "zipp-3.9.0.tar.gz", hash = "sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb"}, ] diff --git a/pyproject.toml b/pyproject.toml index 87ee1019..294ce6c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "gatorgrade" -version = "0.3.1" +version = "0.0.0" description = "GatorGrade executes GatorGrader checks!" authors = ["Michael Abraham", "Jacob Allebach", "Liam Black", "Katherine Burgess", "Yanqiao Chen", "Ochirsaikhan Davaajambal", "Tuguldurnemekh Gantulga", "Anthony Grant-Cook", "Dylan Holland", "Gregory M. Kapfhammer", "Peyton Kelly", "Luke Lacaria", "Lauren Nevill", "Jack Turner", "Daniel Ullrich", "Garrison Vanzin", "Rian Watson"] readme = "README.md" @@ -8,7 +8,7 @@ readme = "README.md" [tool.poetry.dependencies] python = ">=3.7.2,<4.0" PyYAML = "^6.0" -gatorgrader = "^1.1.0" +gatorgrader = "^1.1.1" rich = "^12.5.1" typer = {extras = ["all"], version = "^0.6.1"} From d2d874454c7cebd29ba06f4dda36f95052625648 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Thu, 26 Jan 2023 18:40:10 -0500 Subject: [PATCH 056/207] feature: remove files no longer in main --- gatorgrade/output/output_functions.py | 138 ------------------ .../output/output_percentage_printing.py | 30 ---- tests/test_output_percentage_print.py | 47 ------ 3 files changed, 215 deletions(-) delete mode 100644 gatorgrade/output/output_functions.py delete mode 100644 gatorgrade/output/output_percentage_printing.py delete mode 100644 tests/test_output_percentage_print.py diff --git a/gatorgrade/output/output_functions.py b/gatorgrade/output/output_functions.py deleted file mode 100644 index 13e5b42e..00000000 --- a/gatorgrade/output/output_functions.py +++ /dev/null @@ -1,138 +0,0 @@ -"""This module is used for storing the main functions requested. - -The requested functions are located at the Github Issue Tracker -for the output team. For instance, functions dealing with percentage -output, description output, and colorization of text. -""" -import json -import traceback - -import typer -import gator -from gatorgrade.output import output_percentage_printing - - -def run_commands_and_return_results(commands_input): - """Run commands through GatorGrader and send results to other output methods. - - Args: - - Commands are received as dictionary of two keys, shell commands / gator - commands. - - commands_input (dict{str: List[dict{str:str, ...}], - str: List[List[str]]}): The first parameter which - contains commands. - - An Example of arg input for this function is as follows : - - {'shell': [{'description': 'Run program', 'command': 'mdl'}], - 'gatorgrader': [['--description', 'do command', 'commandType', - '--arg', '1', '--directory', './home', '--file', 'file.py']]} - - Returns: - List[tuple(str, bool, str)] - - Each tuple in the list is the result of a specific command - being run. - - The first string is the description which comes directly from the command. - The boolean describes whether the command passed or failed the check. - The final string will either a diagnostic for a failed check or a blank - string for a passed check. - """ - # Get first element in list, which is gatorgrader commands - gatorcommands = commands_input.get("gatorgrader") - results = [] - - for command in gatorcommands: - # If command is formatted incorrectly in yaml files, - # catch the exception that would be returned and print - try: - result = gator.grader(command) - # disable pylint so the more general Exception class can be used - except Exception: # pylint: disable=W0703 - # bad_command = command_exception.__class__ - result = (command, False, traceback.format_exc()) - results.append(result) - - return results - - -def display_check_results(results, output_file=None): - """ - Process results and determine if the check passed or failed. - - Args: - results: list[(description, passed, diagnostic),(...)] - """ - passed_checks = [] - failed_checks = [] - # Iterate through results tuples - for result in results: - # Add passing checks to the passed check list and failing checks to - # the failed check list - if result[1] is True: - passed_checks.append(result) - else: - failed_checks.append(result) - output_passed_checks(passed_checks) - output_failed_checks(failed_checks) - - if output_file is not None: - return passed_checks, failed_checks - return None, None - - -def output_passed_checks(passed_checks): - """Output the results for all of the checks that passed using the passed_checks list.""" - for check in passed_checks: - requirement = check[0] - # Use colorama to style passing check - typer.secho("\u2714 ", nl=False, fg=typer.colors.GREEN) - typer.echo(requirement) - - -def output_failed_checks(failed_checks): - """Output the results for all of the checks that did not pass using the failed_checks list.""" - for check in failed_checks: - # Extract the details of each check - requirement = check[0] - description = check[2] - # Use colorama to print and style "X" - typer.secho("\u2718 ", nl=False, fg=typer.colors.RED) - typer.echo(requirement) - typer.secho(f" \u2192 {description}", fg=typer.colors.YELLOW) - - -def run_and_display_command_checks(commands, report=None): - """Run commands through GatorGrader and display them to the user. - - Args: - Commands are received as dictionary of two keys, shell commands / gator - commands. - - commands_input (dict{str: List[dict{str:str, ...}], - str: List[List[str]]}): The first parameter which - contains commands. - - An Example of arg input for this function is as follows : - - {'shell': [{'description': 'Run program', 'command': 'mdl'}], - 'gatorgrader': [['--description', 'do command', 'commandType', - '--arg', '1', '--directory', './home', '--file', 'file.py']]} - """ - results = run_commands_and_return_results(commands) - passed_checks, failed_checks = display_check_results(results, output_file=report) - percent_string, percent = output_percentage_printing.print_percentage(results) - typer.echo(percent_string) - - if report is not None: - report_json = { - "passed_checks": passed_checks, - "failed_checks": failed_checks, - "percent": percent, - } - with open(report, "w", encoding="utf-8") as file: - file.write(json.dumps(report_json)) - file.close() diff --git a/gatorgrade/output/output_percentage_printing.py b/gatorgrade/output/output_percentage_printing.py deleted file mode 100644 index 3d5a51fc..00000000 --- a/gatorgrade/output/output_percentage_printing.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Output with the percentage of checks that the student has met requirments.""" -import typer - - -def print_percentage(results): - """Print percentage acts as fuction that will produce the output.""" - # iterate through results tuples - true_list = [] # empty list for storing true results - for result in results: - if result[1] is True: - true_list.append(result) - math = len(true_list) / len(results) # procedure of math right/total - percent = math * 100 # get the percent to non decimal. - result = "" - if percent == 100.0: - result += typer.style( - "|=====================================|\n", - fg=typer.colors.GREEN, - reset=False, - ) - result += typer.style( - f"|Passing all GatorGrader Checks {percent}%|\n", reset=False - ) - result += typer.style("|=====================================|") - else: - result += typer.style( - f"Passing {len(true_list)}/{len(results)}, Grade is {percent}%.", - fg=typer.colors.RED, - ) - return result, percent diff --git a/tests/test_output_percentage_print.py b/tests/test_output_percentage_print.py deleted file mode 100644 index 70626360..00000000 --- a/tests/test_output_percentage_print.py +++ /dev/null @@ -1,47 +0,0 @@ -"""Test suite for percent function""" -from gatorgrade.output import output_percentage_printing - - -def test_given_results_returns_percent_incorrect(): - """Test a failing set will show percent""" - results = [ - ("Complete all TODOs", True, ""), - ( - "Use an if statement", - False, - "Found 0 match(es) of the regular expression in output or yayaya.py", - ), - ("Complete all TODOs", True, ""), - ( - "Use an if statement", - False, - "Found 0 match(es) of the regular expression in output or module.py", - ), - ("Have a total of 8 commits, 5 of which were created by you", True, ""), - ] - - expected_result = "Passing 3/5, Grade is 60.0%." - actual_result, _ = output_percentage_printing.print_percentage(results) - assert expected_result in actual_result - - -def test_given_results_returns_percent_correct(): - """Test a passing set will give 100%""" - results = [ - ("Complete all TODOs", True, ""), - ( - "Use an if statement", - True, - "", - ), - ("Complete all TODOs", True, ""), - ( - "Use an if statement", - True, - "", - ), - ("Have a total of 8 commits, 5 of which were created by you", True, ""), - ] - expected_result = "Passing all GatorGrader Checks 100.0%" - actual_result, _ = output_percentage_printing.print_percentage(results) - assert expected_result in actual_result From 5b29537e328e212161fe6c7625fc1914659b57d3 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Thu, 26 Jan 2023 18:40:34 -0500 Subject: [PATCH 057/207] feature: make the report file param more robust --- gatorgrade/main.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 676fa304..165a1f07 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -34,7 +34,9 @@ def gatorgrade( ctx: typer.Context, filename: Path = typer.Option(FILE, "--config", "-c", help="Name of the yml file."), - report: Path = typer.Option(None, "--report", "-r", help="Name of the report file"), + reportFile: Path = typer.Option( + "insights.json", "--report", "-r", help="Name of the report file" + ), ): """Run the GatorGrader checks in the specified gatorgrade.yml file.""" # if ctx.subcommand is None then this means @@ -45,7 +47,7 @@ def gatorgrade( # there are valid checks and thus the # tool should run them with run_checks if len(checks) > 0: - checks_status = run_checks(checks) + checks_status = run_checks(checks, reportFile) # no checks were created and this means # that, most likely, the file was not # valid and thus the tool cannot run checks From 6ff5df93bcd6f9df9393d94b4c03bb286fa51e74 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Thu, 26 Jan 2023 18:41:04 -0500 Subject: [PATCH 058/207] feature: create funct to create checks json file --- gatorgrade/output/output.py | 51 ++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 502c3f02..4248b7b2 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -1,5 +1,6 @@ """Run checks and display whether each has passed or failed.""" +import json import subprocess from pathlib import Path from typing import List @@ -68,7 +69,50 @@ def _run_gg_check(check: GatorGraderCheck) -> CheckResult: return CheckResult(passed=passed, description=description, diagnostic=diagnostic) -def run_checks(checks: List[Union[ShellCheck, GatorGraderCheck]]) -> bool: +def create_report_json( + passed_count, checkResults: List[CheckResult], percent_passed, reportFile: Path +): + """Take checks and put them into json format in the provided reportFile Path. + + Args: + passed_count: the number of checks that passed + checkResults: the list of check results that will be put in json + percent_passed: the percentage of checks that passed + reportFile: the location where the json will be put + """ + # create list to hold the key values for the dictionary that + # will be converted into json + overall_key_list = ["amount correct", "percentage score", "checks"] + + checks_dict = {} + overall_dict = {} + + # create the dictionary for the checks + for i in range(len(checkResults)): + checks_dict.update( + { + f"check {i + 1}": { + "description": checkResults[i].description, + "status": checkResults[i].passed, + } + } + ) + + # create the dictionary for all of the check information + overall_dict = dict( + zip(overall_key_list, [passed_count, percent_passed, checks_dict]) + ) + + # use json.dump in order to turn the check results into json + # create the file that was requested from cli input and + # put the json into it + with open(reportFile, "w") as fp: + json.dump(overall_dict, fp) + + +def run_checks( + checks: List[Union[ShellCheck, GatorGraderCheck]], reportFile: Path +) -> bool: """Run shell and GatorGrader checks and display whether each has passed or failed. Also, print a list of all failed checks with their diagnostics and a summary message that @@ -94,6 +138,7 @@ def run_checks(checks: List[Union[ShellCheck, GatorGraderCheck]]) -> bool: if result is not None: result.print() results.append(result) + # determine if there are failures and then display them failed_results = list(filter(lambda result: not result.passed, results)) # only print failures list if there are failures to print @@ -109,6 +154,10 @@ def run_checks(checks: List[Union[ShellCheck, GatorGraderCheck]]) -> bool: percent = 0 else: percent = round(passed_count / len(results) * 100) + + # run the json creation function + create_report_json(passed_count, results, percent, reportFile) + # compute summary results and display them in the console summary = f"Passed {passed_count}/{len(results)} ({percent}%) of checks for {Path.cwd().name}!" summary_color = "green" if passed_count == len(results) else "bright white" From b881e7095a78040de7dd098d4b2d6f7e1a9711d2 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Thu, 26 Jan 2023 18:41:27 -0500 Subject: [PATCH 059/207] feature: adjust tests to account for file param --- tests/output/test_output.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 1dd27672..d299f1b7 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -1,5 +1,7 @@ """Test suite for output_functions.py.""" +import os + from gatorgrade.input.checks import GatorGraderCheck from gatorgrade.input.checks import ShellCheck from gatorgrade.output import output @@ -24,8 +26,10 @@ def test_run_checks_gg_check_should_show_passed(capsys): "hello-world.py", ] ) + reportFile = "test.json" # When run_checks is called - output.run_checks([check]) + output.run_checks([check], reportFile) + os.remove(reportFile) # Then the output shows that the check has passed out, _ = capsys.readouterr() assert "✓ Check TODOs" in out @@ -46,8 +50,10 @@ def test_run_checks_invalid_gg_args_prints_exception(capsys): "--exact", ] ) + reportFile = "test.json" # When run_checks is called - output.run_checks([check]) + output.run_checks([check], reportFile) + os.remove(reportFile) # Then the output contains a declaration # about the use of an Invalid GatorGrader check out, _ = capsys.readouterr() @@ -93,8 +99,10 @@ def test_run_checks_some_failed_prints_correct_summary(capsys): ] ), ] + reportFile = "test.json" # When run_checks is called - output.run_checks(checks) + output.run_checks(checks, reportFile) + os.remove(reportFile) # Then the output shows the correct fraction and percentage of passed checks out, _ = capsys.readouterr() assert "Passed 2/3 (67%) of checks" in out @@ -137,8 +145,10 @@ def test_run_checks_all_passed_prints_correct_summary(capsys): ] ), ] + reportFile = "test.json" # When run_checks is called - output.run_checks(checks) + output.run_checks(checks, reportFile) + os.remove(reportFile) # Then the output shows the correct fraction and percentage of passed checks out, _ = capsys.readouterr() assert "Passed 3/3 (100%) of checks" in out From 2bee0f18ce1c7421ffa565c3c3e275deecf15e87 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Thu, 26 Jan 2023 18:41:44 -0500 Subject: [PATCH 060/207] docs: add insights json file to test repo --- tests/test_assignment/insights.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/test_assignment/insights.json diff --git a/tests/test_assignment/insights.json b/tests/test_assignment/insights.json new file mode 100644 index 00000000..bb73ee7e --- /dev/null +++ b/tests/test_assignment/insights.json @@ -0,0 +1 @@ +{"amount correct": 3, "percentage score": 100, "checks": {"check 1": {"description": "Complete all TODOs", "status": true}, "check 2": {"description": "Use an if statement", "status": true}, "check 3": {"description": "Complete all TODOs", "status": true}}} \ No newline at end of file From af7572244b6d412566a4bd177d20f53b8dab23dc Mon Sep 17 00:00:00 2001 From: burgess01 Date: Fri, 27 Jan 2023 13:13:58 -0500 Subject: [PATCH 061/207] feature: update json to have more check info --- gatorgrade/output/output.py | 52 ++++++++++++++++++++++++----- tests/test_assignment/insights.json | 2 +- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 4248b7b2..0773b6ff 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -70,12 +70,17 @@ def _run_gg_check(check: GatorGraderCheck) -> CheckResult: def create_report_json( - passed_count, checkResults: List[CheckResult], percent_passed, reportFile: Path + passed_count, + check_information, + checkResults: List[CheckResult], + percent_passed, + reportFile: Path, ): """Take checks and put them into json format in the provided reportFile Path. Args: passed_count: the number of checks that passed + check_information: the basic information about checks and their params checkResults: the list of check results that will be put in json percent_passed: the percentage of checks that passed reportFile: the location where the json will be put @@ -89,14 +94,43 @@ def create_report_json( # create the dictionary for the checks for i in range(len(checkResults)): - checks_dict.update( - { - f"check {i + 1}": { - "description": checkResults[i].description, - "status": checkResults[i].passed, + # if the corresponding check_info is a shell check: + # include the command that was run + if isinstance(check_information[i], ShellCheck): + checks_dict.update( + { + f"check {i + 1}": { + "description": checkResults[i].description, + "command": check_information[i].command, + "status": checkResults[i].passed, + } } - } - ) + ) + else: # if a gatorgrade check + pass + # if MatchFileFragment or CountCommandOutput + # add fragment/command (the first key/val match in) and its value, + # count and its value + try: + checks_dict.update( + { + f"check {i + 1}": { + "description": checkResults[i].description, + "fragment": check_information[i].gg_args[4], + "count": check_information[i].gg_args[6], + "status": checkResults[i].passed, + } + } + ) + except: + checks_dict.update( + { + f"check {i + 1}": { + "description": checkResults[i].description, + "status": checkResults[i].passed, + } + } + ) # create the dictionary for all of the check information overall_dict = dict( @@ -156,7 +190,7 @@ def run_checks( percent = round(passed_count / len(results) * 100) # run the json creation function - create_report_json(passed_count, results, percent, reportFile) + create_report_json(passed_count, checks, results, percent, reportFile) # compute summary results and display them in the console summary = f"Passed {passed_count}/{len(results)} ({percent}%) of checks for {Path.cwd().name}!" diff --git a/tests/test_assignment/insights.json b/tests/test_assignment/insights.json index bb73ee7e..fc85ee82 100644 --- a/tests/test_assignment/insights.json +++ b/tests/test_assignment/insights.json @@ -1 +1 @@ -{"amount correct": 3, "percentage score": 100, "checks": {"check 1": {"description": "Complete all TODOs", "status": true}, "check 2": {"description": "Use an if statement", "status": true}, "check 3": {"description": "Complete all TODOs", "status": true}}} \ No newline at end of file +{"amount correct": 3, "percentage score": 100, "checks": {"check 1": {"description": "Complete all TODOs", "fragment": "TODO", "count": "0", "status": true}, "check 2": {"description": "Use an if statement", "fragment": "if .*?:", "count": "1", "status": true}, "check 3": {"description": "Complete all TODOs", "fragment": "TODO", "count": "0", "status": true}}} \ No newline at end of file From 52dffed36445965a5fc3d7a01608c432af635b22 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Fri, 27 Jan 2023 13:24:49 -0500 Subject: [PATCH 062/207] feature: incorporate md conversion from json --- gatorgrade/output/output.py | 39 +++++++++++++++++++++++++++++++ tests/output/test_output.py | 4 ++++ tests/test_assignment/insights.md | 21 +++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 tests/test_assignment/insights.md diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 0773b6ff..187ac00e 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -144,6 +144,44 @@ def create_report_json( json.dump(overall_dict, fp) +def create_markdown_report_file(json_file: Path): + """Create a markdown file using the created json to use in github actions summary, + among other places. + + Args: + json_file: the path at which the json is stored. + """ + + markdown_file = "insights.md" + + # create the markdown file if it doesn't already exist + file = open(markdown_file, "w") + file.write("# Gatorgrade Insights") + file.close() + + file = open(json_file) + json_str = file.read() + json_object = json.loads(json_str) + file.close() + + # write the amt correct and percentage score to md file + file = open(markdown_file, "a") + file.write(f"\n\n**Amount Correct:** {(json_object.get('amount correct'))}\n") + file.write(f"**Percentage Correct:** {(json_object.get('percentage score'))}\n") + + file.write("\n## Checks\n") + # for each check in the checks dict + for check in json_object.get("checks"): + # write it to the md file + file.write(f"\n### {check}\n") + file.write( + f"\n**Description:** {json_object.get('checks').get(check).get('description')}" + ) + file.write( + f"\n**Correct? :** {json_object.get('checks').get(check).get('status')}\n" + ) + + def run_checks( checks: List[Union[ShellCheck, GatorGraderCheck]], reportFile: Path ) -> bool: @@ -191,6 +229,7 @@ def run_checks( # run the json creation function create_report_json(passed_count, checks, results, percent, reportFile) + create_markdown_report_file(reportFile) # compute summary results and display them in the console summary = f"Passed {passed_count}/{len(results)} ({percent}%) of checks for {Path.cwd().name}!" diff --git a/tests/output/test_output.py b/tests/output/test_output.py index d299f1b7..c0ed89a8 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -30,6 +30,7 @@ def test_run_checks_gg_check_should_show_passed(capsys): # When run_checks is called output.run_checks([check], reportFile) os.remove(reportFile) + os.remove("insights.md") # Then the output shows that the check has passed out, _ = capsys.readouterr() assert "✓ Check TODOs" in out @@ -54,6 +55,7 @@ def test_run_checks_invalid_gg_args_prints_exception(capsys): # When run_checks is called output.run_checks([check], reportFile) os.remove(reportFile) + os.remove("insights.md") # Then the output contains a declaration # about the use of an Invalid GatorGrader check out, _ = capsys.readouterr() @@ -103,6 +105,7 @@ def test_run_checks_some_failed_prints_correct_summary(capsys): # When run_checks is called output.run_checks(checks, reportFile) os.remove(reportFile) + os.remove("insights.md") # Then the output shows the correct fraction and percentage of passed checks out, _ = capsys.readouterr() assert "Passed 2/3 (67%) of checks" in out @@ -149,6 +152,7 @@ def test_run_checks_all_passed_prints_correct_summary(capsys): # When run_checks is called output.run_checks(checks, reportFile) os.remove(reportFile) + os.remove("insights.md") # Then the output shows the correct fraction and percentage of passed checks out, _ = capsys.readouterr() assert "Passed 3/3 (100%) of checks" in out diff --git a/tests/test_assignment/insights.md b/tests/test_assignment/insights.md new file mode 100644 index 00000000..af0ff0d2 --- /dev/null +++ b/tests/test_assignment/insights.md @@ -0,0 +1,21 @@ +# Gatorgrade Insights + +**Amount Correct:** 3 +**Percentage Correct:** 100 + +## Checks + +### check 1 + +**Description:** Complete all TODOs +**Correct? :** True + +### check 2 + +**Description:** Use an if statement +**Correct? :** True + +### check 3 + +**Description:** Complete all TODOs +**Correct? :** True From ab626fe9e2917aafcb062c5a919d8fb0c3f09ae0 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Fri, 27 Jan 2023 13:54:21 -0500 Subject: [PATCH 063/207] feature: give more info about failing checks --- gatorgrade/output/output.py | 42 +++++++++++++++++++++++-------- tests/test_assignment/insights.md | 13 +++++----- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 187ac00e..018f3240 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -159,6 +159,7 @@ def create_markdown_report_file(json_file: Path): file.write("# Gatorgrade Insights") file.close() + # load the json from the json file file = open(json_file) json_str = file.read() json_object = json.loads(json_str) @@ -169,17 +170,38 @@ def create_markdown_report_file(json_file: Path): file.write(f"\n\n**Amount Correct:** {(json_object.get('amount correct'))}\n") file.write(f"**Percentage Correct:** {(json_object.get('percentage score'))}\n") - file.write("\n## Checks\n") - # for each check in the checks dict + passing_checks = [] + failing_checks = [] + # split checks into passing and not passing for check in json_object.get("checks"): - # write it to the md file - file.write(f"\n### {check}\n") - file.write( - f"\n**Description:** {json_object.get('checks').get(check).get('description')}" - ) - file.write( - f"\n**Correct? :** {json_object.get('checks').get(check).get('status')}\n" - ) + # if the check is passing + if json_object.get("checks").get(check).get("status") == True: + passing_checks.append(json_object.get("checks").get(check)) + # if the check is failing + else: + failing_checks.append(json_object.get("checks").get(check)) + + # give short info about passing checks as students have already + # satisfied that requirement + file.write("\n## Passing Checks\n") + for check in passing_checks: + file.write(f"\n### {check.get('description')}\n") + file.write(f"\n**Correct? :** {check.get('status')}\n") + + # give extended information about failing checks to help + # students solve them without looking in the gg yml file + file.write("\n## Failing Checks\n") + for check in failing_checks: + file.write(f"\n### {check.get('description')}\n") + # if a shell check, include command + if check.get("command") != None: + file.write(f"\n**Command:** {check.get('command')}") + else: + # if a gg check, include fragment and count + file.write(f"\n**Keyword:** {check.get('fragment')}") + file.write(f"\n**Amount:** {check.get('count')}") + + file.write(f"\n**Correct? :** {check.get('status')}\n") def run_checks( diff --git a/tests/test_assignment/insights.md b/tests/test_assignment/insights.md index af0ff0d2..c01b47ea 100644 --- a/tests/test_assignment/insights.md +++ b/tests/test_assignment/insights.md @@ -3,19 +3,18 @@ **Amount Correct:** 3 **Percentage Correct:** 100 -## Checks +## Passing Checks -### check 1 +### Complete all TODOs -**Description:** Complete all TODOs **Correct? :** True -### check 2 +### Use an if statement -**Description:** Use an if statement **Correct? :** True -### check 3 +### Complete all TODOs -**Description:** Complete all TODOs **Correct? :** True + +## Failing Checks From a59335d4c279ee34c9bc628bb7f16f356f40ff7a Mon Sep 17 00:00:00 2001 From: burgess01 Date: Fri, 27 Jan 2023 13:57:33 -0500 Subject: [PATCH 064/207] docs: correct md converter docstring --- gatorgrade/output/output.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 018f3240..6301e218 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -145,13 +145,11 @@ def create_report_json( def create_markdown_report_file(json_file: Path): - """Create a markdown file using the created json to use in github actions summary, - among other places. + """Create a markdown file using the created json to use in github actions summary, among other places. Args: json_file: the path at which the json is stored. """ - markdown_file = "insights.md" # create the markdown file if it doesn't already exist From 5c1043b1fa7679035a838f227347bebd14f4c1fb Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Fri, 27 Jan 2023 20:01:24 -0500 Subject: [PATCH 065/207] Bug fix: delete one line in out --- gatorgrade/output/output.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 6301e218..f0706739 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -107,7 +107,6 @@ def create_report_json( } ) else: # if a gatorgrade check - pass # if MatchFileFragment or CountCommandOutput # add fragment/command (the first key/val match in) and its value, # count and its value From bcdbd86c3d36838b24ca71924871ca473a54f2d5 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Mon, 30 Jan 2023 15:24:20 -0500 Subject: [PATCH 066/207] feature: rework json and md funcs --- gatorgrade/output/output.py | 96 ++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 50 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 6301e218..77c689f7 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -92,45 +92,45 @@ def create_report_json( checks_dict = {} overall_dict = {} - # create the dictionary for the checks - for i in range(len(checkResults)): - # if the corresponding check_info is a shell check: - # include the command that was run - if isinstance(check_information[i], ShellCheck): - checks_dict.update( - { - f"check {i + 1}": { - "description": checkResults[i].description, - "command": check_information[i].command, - "status": checkResults[i].passed, - } + # for each check: + for i in range(len(check_information)): + # grab all of the information out of it, as well as check result status and description + checks_dict.update( + { + i: { + "description": checkResults[i].description, + "status": checkResults[i].passed, } - ) - else: # if a gatorgrade check - pass - # if MatchFileFragment or CountCommandOutput - # add fragment/command (the first key/val match in) and its value, - # count and its value - try: - checks_dict.update( - { - f"check {i + 1}": { - "description": checkResults[i].description, - "fragment": check_information[i].gg_args[4], - "count": check_information[i].gg_args[6], - "status": checkResults[i].passed, - } - } - ) - except: - checks_dict.update( - { - f"check {i + 1}": { - "description": checkResults[i].description, - "status": checkResults[i].passed, - } - } - ) + } + ) + # add the remaining information from check_information + # if there are gg_args, add all of them + try: + for arg in check_information[i].gg_args: + arg_index = check_information[i].gg_args.index(arg) + if arg == "--fragment": + checks_dict[i].update( + {"Fragment": check_information[i].gg_args[arg_index + 1]} + ) + if arg == "tag": + checks_dict[i].update( + {"Tag": check_information[i].gg_args[arg_index + 1]} + ) + if arg == "--count": + checks_dict[i].update( + {"Count": check_information[i].gg_args[arg_index + 1]} + ) + if arg == "--directory": + checks_dict[i].update( + {"Directory": check_information[i].gg_args[arg_index + 1]} + ) + if arg == "--file": + checks_dict[i].update( + {"File": check_information[i].gg_args[arg_index + 1]} + ) + # if not, is a shell check, include + except: + checks_dict[i].update({"Command": check_information[i].command}) # create the dictionary for all of the check information overall_dict = dict( @@ -183,23 +183,19 @@ def create_markdown_report_file(json_file: Path): # satisfied that requirement file.write("\n## Passing Checks\n") for check in passing_checks: - file.write(f"\n### {check.get('description')}\n") - file.write(f"\n**Correct? :** {check.get('status')}\n") + file.write(f"\n### ✓ {check.get('description')}\n") # give extended information about failing checks to help # students solve them without looking in the gg yml file file.write("\n## Failing Checks\n") + # for each failing check, print out all related information for check in failing_checks: - file.write(f"\n### {check.get('description')}\n") - # if a shell check, include command - if check.get("command") != None: - file.write(f"\n**Command:** {check.get('command')}") - else: - # if a gg check, include fragment and count - file.write(f"\n**Keyword:** {check.get('fragment')}") - file.write(f"\n**Amount:** {check.get('count')}") - - file.write(f"\n**Correct? :** {check.get('status')}\n") + # for each key val pair in the check dictionary + for i in check: + if i == "description": + file.write(f"\n### ✕ {check.get('description')}\n") + elif i != "status": + file.write(f"\n**{i}** {check[i]}\n") def run_checks( From cdd63784b3f13d91befef8b2e7aea9b3e359b242 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Mon, 30 Jan 2023 15:29:30 -0500 Subject: [PATCH 067/207] fix: correct missing -- in tag catch --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 77c689f7..b10af524 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -112,7 +112,7 @@ def create_report_json( checks_dict[i].update( {"Fragment": check_information[i].gg_args[arg_index + 1]} ) - if arg == "tag": + if arg == "--tag": checks_dict[i].update( {"Tag": check_information[i].gg_args[arg_index + 1]} ) From d134db06039af6cf756edd139918e358024ece53 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Mon, 30 Jan 2023 15:34:21 -0500 Subject: [PATCH 068/207] docs: update test json and md files --- tests/test_assignment/insights.json | 2 +- tests/test_assignment/insights.md | 12 +++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/tests/test_assignment/insights.json b/tests/test_assignment/insights.json index fc85ee82..30424089 100644 --- a/tests/test_assignment/insights.json +++ b/tests/test_assignment/insights.json @@ -1 +1 @@ -{"amount correct": 3, "percentage score": 100, "checks": {"check 1": {"description": "Complete all TODOs", "fragment": "TODO", "count": "0", "status": true}, "check 2": {"description": "Use an if statement", "fragment": "if .*?:", "count": "1", "status": true}, "check 3": {"description": "Complete all TODOs", "fragment": "TODO", "count": "0", "status": true}}} \ No newline at end of file +{"amount correct": 3, "percentage score": 100, "checks": {"0": {"description": "Complete all TODOs", "status": true, "Fragment": "TODO", "Count": "0", "Directory": "src", "File": "hello-world.py"}, "1": {"description": "Use an if statement", "status": true, "Count": "1", "Directory": "src", "File": "hello-world.py"}, "2": {"description": "Complete all TODOs", "status": true, "Fragment": "TODO", "Count": "0", "Directory": "src", "File": "reflection.md"}}} \ No newline at end of file diff --git a/tests/test_assignment/insights.md b/tests/test_assignment/insights.md index c01b47ea..831811a4 100644 --- a/tests/test_assignment/insights.md +++ b/tests/test_assignment/insights.md @@ -5,16 +5,10 @@ ## Passing Checks -### Complete all TODOs +### ✓ Complete all TODOs -**Correct? :** True +### ✓ Use an if statement -### Use an if statement - -**Correct? :** True - -### Complete all TODOs - -**Correct? :** True +### ✓ Complete all TODOs ## Failing Checks From 86fb85367c2ccbb62a1ecf8a36094d9d274a298a Mon Sep 17 00:00:00 2001 From: burgess01 Date: Mon, 30 Jan 2023 16:01:15 -0500 Subject: [PATCH 069/207] fix: rework icons to pass in windows --- gatorgrade/output/output.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index b10af524..a4ae932b 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -152,6 +152,9 @@ def create_markdown_report_file(json_file: Path): """ markdown_file = "insights.md" + check_icon = "✓" + x_icon = "✕" + # create the markdown file if it doesn't already exist file = open(markdown_file, "w") file.write("# Gatorgrade Insights") @@ -183,7 +186,7 @@ def create_markdown_report_file(json_file: Path): # satisfied that requirement file.write("\n## Passing Checks\n") for check in passing_checks: - file.write(f"\n### ✓ {check.get('description')}\n") + file.write(f"\n### {check_icon} {check.get('description')}\n") # give extended information about failing checks to help # students solve them without looking in the gg yml file @@ -193,7 +196,7 @@ def create_markdown_report_file(json_file: Path): # for each key val pair in the check dictionary for i in check: if i == "description": - file.write(f"\n### ✕ {check.get('description')}\n") + file.write(f"\n### {x_icon} {check.get('description')}\n") elif i != "status": file.write(f"\n**{i}** {check[i]}\n") From f0570698189aaa9fb28d9501583fc0e33d636e79 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Mon, 30 Jan 2023 16:28:04 -0500 Subject: [PATCH 070/207] fix: remove font to fix windows error --- gatorgrade/output/output.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index a4ae932b..c27e65e5 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -186,7 +186,7 @@ def create_markdown_report_file(json_file: Path): # satisfied that requirement file.write("\n## Passing Checks\n") for check in passing_checks: - file.write(f"\n### {check_icon} {check.get('description')}\n") + file.write(f"\n### {check.get('description')}\n") # give extended information about failing checks to help # students solve them without looking in the gg yml file @@ -196,7 +196,7 @@ def create_markdown_report_file(json_file: Path): # for each key val pair in the check dictionary for i in check: if i == "description": - file.write(f"\n### {x_icon} {check.get('description')}\n") + file.write(f"\n### {check.get('description')}\n") elif i != "status": file.write(f"\n**{i}** {check[i]}\n") From 0c7a1d0f7052dcaf3d85d047d81368d442ffe300 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Mon, 30 Jan 2023 16:52:52 -0500 Subject: [PATCH 071/207] fix: encode md file to fix windows error --- gatorgrade/output/output.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index c27e65e5..bb806bc8 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -167,7 +167,7 @@ def create_markdown_report_file(json_file: Path): file.close() # write the amt correct and percentage score to md file - file = open(markdown_file, "a") + file = open(markdown_file, "a", encoding="utf-8") file.write(f"\n\n**Amount Correct:** {(json_object.get('amount correct'))}\n") file.write(f"**Percentage Correct:** {(json_object.get('percentage score'))}\n") @@ -186,7 +186,7 @@ def create_markdown_report_file(json_file: Path): # satisfied that requirement file.write("\n## Passing Checks\n") for check in passing_checks: - file.write(f"\n### {check.get('description')}\n") + file.write(f"\n### {check_icon} {check.get('description')}\n") # give extended information about failing checks to help # students solve them without looking in the gg yml file @@ -196,7 +196,7 @@ def create_markdown_report_file(json_file: Path): # for each key val pair in the check dictionary for i in check: if i == "description": - file.write(f"\n### {check.get('description')}\n") + file.write(f"\n### {x_icon} {check.get('description')}\n") elif i != "status": file.write(f"\n**{i}** {check[i]}\n") From bbbf02ec1c01ff3edfefe7bfb3fe59f9d5003f36 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 31 Jan 2023 08:56:29 -0500 Subject: [PATCH 072/207] feature: make report a bool instead of Path --- gatorgrade/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 165a1f07..21d208a8 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -34,8 +34,8 @@ def gatorgrade( ctx: typer.Context, filename: Path = typer.Option(FILE, "--config", "-c", help="Name of the yml file."), - reportFile: Path = typer.Option( - "insights.json", "--report", "-r", help="Name of the report file" + report: bool = typer.Option( + False, "--report", "-r", help="Name of the report file" ), ): """Run the GatorGrader checks in the specified gatorgrade.yml file.""" @@ -47,7 +47,7 @@ def gatorgrade( # there are valid checks and thus the # tool should run them with run_checks if len(checks) > 0: - checks_status = run_checks(checks, reportFile) + checks_status = run_checks(checks, report) # no checks were created and this means # that, most likely, the file was not # valid and thus the tool cannot run checks From 6cf575d06920672deff68756b62df34c4fd8b834 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 31 Jan 2023 08:57:39 -0500 Subject: [PATCH 073/207] feature: refactor functions to not use files --- gatorgrade/output/output.py | 61 +++++++++++++++---------------------- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index bb806bc8..d905fe66 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -74,8 +74,7 @@ def create_report_json( check_information, checkResults: List[CheckResult], percent_passed, - reportFile: Path, -): +) -> dict: """Take checks and put them into json format in the provided reportFile Path. Args: @@ -137,73 +136,60 @@ def create_report_json( zip(overall_key_list, [passed_count, percent_passed, checks_dict]) ) - # use json.dump in order to turn the check results into json - # create the file that was requested from cli input and - # put the json into it - with open(reportFile, "w") as fp: - json.dump(overall_dict, fp) + return overall_dict -def create_markdown_report_file(json_file: Path): +def create_markdown_report_file(json: dict) -> str: """Create a markdown file using the created json to use in github actions summary, among other places. Args: json_file: the path at which the json is stored. """ - markdown_file = "insights.md" + markdown_contents = "" check_icon = "✓" x_icon = "✕" - # create the markdown file if it doesn't already exist - file = open(markdown_file, "w") - file.write("# Gatorgrade Insights") - file.close() - - # load the json from the json file - file = open(json_file) - json_str = file.read() - json_object = json.loads(json_str) - file.close() + # add the markdown to the string + markdown_contents += "# Gatorgrade Insights" # write the amt correct and percentage score to md file - file = open(markdown_file, "a", encoding="utf-8") - file.write(f"\n\n**Amount Correct:** {(json_object.get('amount correct'))}\n") - file.write(f"**Percentage Correct:** {(json_object.get('percentage score'))}\n") + markdown_contents += f"\n\n**Amount Correct:** {(json.get('amount correct'))}\n" + markdown_contents += f"**Percentage Correct:** {(json.get('percentage score'))}\n" passing_checks = [] failing_checks = [] # split checks into passing and not passing - for check in json_object.get("checks"): + for check in json.get("checks"): # if the check is passing - if json_object.get("checks").get(check).get("status") == True: - passing_checks.append(json_object.get("checks").get(check)) + if json.get("checks").get(check).get("status") == True: + passing_checks.append(json.get("checks").get(check)) # if the check is failing else: - failing_checks.append(json_object.get("checks").get(check)) + failing_checks.append(json.get("checks").get(check)) # give short info about passing checks as students have already # satisfied that requirement - file.write("\n## Passing Checks\n") + markdown_contents += "\n## Passing Checks\n" for check in passing_checks: - file.write(f"\n### {check_icon} {check.get('description')}\n") + markdown_contents += f"\n### {check_icon} {check.get('description')}\n" # give extended information about failing checks to help # students solve them without looking in the gg yml file - file.write("\n## Failing Checks\n") + markdown_contents += "\n## Failing Checks\n" # for each failing check, print out all related information for check in failing_checks: # for each key val pair in the check dictionary for i in check: if i == "description": - file.write(f"\n### {x_icon} {check.get('description')}\n") + markdown_contents += f"\n### {x_icon} {check.get('description')}\n" elif i != "status": - file.write(f"\n**{i}** {check[i]}\n") + markdown_contents += f"\n**{i}** {check[i]}\n" + + return markdown_contents -def run_checks( - checks: List[Union[ShellCheck, GatorGraderCheck]], reportFile: Path -) -> bool: +def run_checks(checks: List[Union[ShellCheck, GatorGraderCheck]], report: bool) -> bool: """Run shell and GatorGrader checks and display whether each has passed or failed. Also, print a list of all failed checks with their diagnostics and a summary message that @@ -246,9 +232,10 @@ def run_checks( else: percent = round(passed_count / len(results) * 100) - # run the json creation function - create_report_json(passed_count, checks, results, percent, reportFile) - create_markdown_report_file(reportFile) + # if the report was run, create json and markdown + if report is True: + json = create_report_json(passed_count, checks, results, percent) + md = create_markdown_report_file(json) # compute summary results and display them in the console summary = f"Passed {passed_count}/{len(results)} ({percent}%) of checks for {Path.cwd().name}!" From bf39dd4c18b286d1fa6f87cef0696e9cedbb3989 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 31 Jan 2023 08:57:55 -0500 Subject: [PATCH 074/207] feature: remove json and md files from test cases --- tests/output/test_output.py | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index c0ed89a8..96bd62f3 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -26,11 +26,9 @@ def test_run_checks_gg_check_should_show_passed(capsys): "hello-world.py", ] ) - reportFile = "test.json" + report = True # When run_checks is called - output.run_checks([check], reportFile) - os.remove(reportFile) - os.remove("insights.md") + output.run_checks([check], report) # Then the output shows that the check has passed out, _ = capsys.readouterr() assert "✓ Check TODOs" in out @@ -51,11 +49,9 @@ def test_run_checks_invalid_gg_args_prints_exception(capsys): "--exact", ] ) - reportFile = "test.json" + report = True # When run_checks is called - output.run_checks([check], reportFile) - os.remove(reportFile) - os.remove("insights.md") + output.run_checks([check], report) # Then the output contains a declaration # about the use of an Invalid GatorGrader check out, _ = capsys.readouterr() @@ -101,11 +97,9 @@ def test_run_checks_some_failed_prints_correct_summary(capsys): ] ), ] - reportFile = "test.json" + report = True # When run_checks is called - output.run_checks(checks, reportFile) - os.remove(reportFile) - os.remove("insights.md") + output.run_checks(checks, report) # Then the output shows the correct fraction and percentage of passed checks out, _ = capsys.readouterr() assert "Passed 2/3 (67%) of checks" in out @@ -148,11 +142,9 @@ def test_run_checks_all_passed_prints_correct_summary(capsys): ] ), ] - reportFile = "test.json" + report = True # When run_checks is called - output.run_checks(checks, reportFile) - os.remove(reportFile) - os.remove("insights.md") + output.run_checks(checks, report) # Then the output shows the correct fraction and percentage of passed checks out, _ = capsys.readouterr() assert "Passed 3/3 (100%) of checks" in out From 11b72e45e28cf4905e60d233d893c8bf3c4d3604 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 31 Jan 2023 18:00:55 -0500 Subject: [PATCH 075/207] docs: correct function docstrings --- gatorgrade/output/output.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index d905fe66..9f6116f8 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -82,7 +82,6 @@ def create_report_json( check_information: the basic information about checks and their params checkResults: the list of check results that will be put in json percent_passed: the percentage of checks that passed - reportFile: the location where the json will be put """ # create list to hold the key values for the dictionary that # will be converted into json @@ -143,7 +142,7 @@ def create_markdown_report_file(json: dict) -> str: """Create a markdown file using the created json to use in github actions summary, among other places. Args: - json_file: the path at which the json is stored. + json: a dictionary containing the json that should be converted to markdown """ markdown_contents = "" From 25ceecbffea15747c3527d02eddfeb0b904b699b Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 31 Jan 2023 20:37:46 -0500 Subject: [PATCH 076/207] docs: add test cases for json and md files --- tests/output/test_output.py | 109 ++++++++++++++++++++++++++++++++++-- 1 file changed, 103 insertions(+), 6 deletions(-) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 96bd62f3..5d798d21 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -1,7 +1,5 @@ """Test suite for output_functions.py.""" -import os - from gatorgrade.input.checks import GatorGraderCheck from gatorgrade.input.checks import ShellCheck from gatorgrade.output import output @@ -26,7 +24,7 @@ def test_run_checks_gg_check_should_show_passed(capsys): "hello-world.py", ] ) - report = True + report = (None, None, None) # When run_checks is called output.run_checks([check], report) # Then the output shows that the check has passed @@ -49,7 +47,7 @@ def test_run_checks_invalid_gg_args_prints_exception(capsys): "--exact", ] ) - report = True + report = (None, None, None) # When run_checks is called output.run_checks([check], report) # Then the output contains a declaration @@ -97,7 +95,7 @@ def test_run_checks_some_failed_prints_correct_summary(capsys): ] ), ] - report = True + report = (None, None, None) # When run_checks is called output.run_checks(checks, report) # Then the output shows the correct fraction and percentage of passed checks @@ -142,9 +140,108 @@ def test_run_checks_all_passed_prints_correct_summary(capsys): ] ), ] - report = True + report = (None, None, None) # When run_checks is called output.run_checks(checks, report) # Then the output shows the correct fraction and percentage of passed checks out, _ = capsys.readouterr() assert "Passed 3/3 (100%) of checks" in out + + +def test_json_report_file_created_correctly(): + """Test that with the cli input '--report file json insights.json' the file is created correctly.""" + # given the following checks + checks = [ + ShellCheck(description="Echo 'Hello!'", command="echo 'hello'"), + GatorGraderCheck( + gg_args=[ + "--description", + "Complete all TODOs in hello-world.py", + "MatchFileFragment", + "--fragment", + "TODO", + "--count", + "1", + "--exact", + "--directory", + "tests/test_assignment/src", + "--file", + "hello-world.py", + ] + ), + GatorGraderCheck( + gg_args=[ + "--description", + 'Call the "greet" function in hello-world.py', + "MatchFileFragment", + "--fragment", + "greet(", + "--count", + "2", + "--directory", + "tests/test_assignment/src", + "--file", + "hello-world.py", + ] + ), + ] + # run them with the wanted report config + report = ("file", "json", "insights.json") + output.run_checks(checks, report) + # check to make sure the created file matches the expected output + expected_file_contents = """{'amount correct': 1, 'percentage score': 33, 'checks': {0: {'description': "Echo 'Hello!'", 'status': True, 'Command': "echo 'hello'"}, 1: {'description': 'Complete all TODOs in hello-world.py', 'status': False, 'Fragment': 'TODO', 'Count': '1', 'Directory': 'tests/test_assignment/src', 'File': 'hello-world.py'}, 2: {'description': 'Invalid GatorGrader check: "--description Call the "greet" function in hello-world.py MatchFileFragment --fragment greet( --count 2 --directory tests/test_assignment/src --file hello-world.py"', 'status': False, 'Fragment': 'greet(', 'Count': '2', 'Directory': 'tests/test_assignment/src', 'File': 'hello-world.py'}}}""" + + file = open("insights.json", "r") + file_contents = file.read() + + assert expected_file_contents == file_contents + + +def test_md_report_file_created_correctly(): + """Test that with the cli input '--report file md insights.md' the file is created correctly.""" + # given the following checks + checks = [ + ShellCheck(description='Echo "Hello!"', command='echo "hello"'), + GatorGraderCheck( + gg_args=[ + "--description", + "Complete all TODOs in hello-world.py", + "MatchFileFragment", + "--fragment", + "TODO", + "--count", + "1", + "--exact", + "--directory", + "tests/test_assignment/src", + "--file", + "hello-world.py", + ] + ), + GatorGraderCheck( + gg_args=[ + "--description", + 'Call the "greet" function in hello-world.py', + "MatchFileFragment", + "--fragment", + "greet(", + "--count", + "2", + "--directory", + "tests/test_assignment/src", + "--file", + "hello-world.py", + ] + ), + ] + # run them with the wanted report config + report = ("file", "md", "insights.md") + output.run_checks(checks, report) + # check to make sure the created file matches the expected output + expected_file_contents = """# Gatorgrade Insights\n\n**Amount Correct:** 1\n**Percentage Correct:** 33\n\n## Passing Checks\n\n### ✓ Echo "Hello!"\n\n## Failing Checks\n\n### ✕ Complete all TODOs in hello-world.py\n\n**Fragment** TODO\n\n**Count** 1\n\n**Directory** tests/test_assignment/src\n\n**File** hello-world.py\n\n### ✕ Invalid GatorGrader check: "--description Call the "greet" function in hello-world.py MatchFileFragment --fragment greet( --count 2 --directory tests/test_assignment/src --file hello-world.py"\n\n**Fragment** greet(\n\n**Count** 2\n\n**Directory** tests/test_assignment/src\n\n**File** hello-world.py\n""" + + file = open("insights.md", "r") + file_contents = file.read() + print(file_contents) + + assert expected_file_contents == file_contents From d5c3d705b6ff838caf23de6eb72b87a9155bf870 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 31 Jan 2023 20:39:39 -0500 Subject: [PATCH 077/207] docs: add os import for test case file removal --- tests/output/test_output.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 5d798d21..f294a707 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -1,5 +1,7 @@ """Test suite for output_functions.py.""" +import os + from gatorgrade.input.checks import GatorGraderCheck from gatorgrade.input.checks import ShellCheck from gatorgrade.output import output @@ -194,6 +196,8 @@ def test_json_report_file_created_correctly(): file = open("insights.json", "r") file_contents = file.read() + os.remove("insights.json") + assert expected_file_contents == file_contents @@ -244,4 +248,6 @@ def test_md_report_file_created_correctly(): file_contents = file.read() print(file_contents) + os.remove("insights.md") + assert expected_file_contents == file_contents From cd85352373c3a61e630e216c3fd5108e6195c980 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 31 Jan 2023 20:39:58 -0500 Subject: [PATCH 078/207] feature: add tuple based cli functionality --- gatorgrade/main.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 21d208a8..433e9082 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -2,6 +2,7 @@ import sys from pathlib import Path +from typing import Tuple import typer from rich.console import Console @@ -34,8 +35,14 @@ def gatorgrade( ctx: typer.Context, filename: Path = typer.Option(FILE, "--config", "-c", help="Name of the yml file."), - report: bool = typer.Option( - False, "--report", "-r", help="Name of the report file" + report: Tuple[str, str, str] = typer.Option( + (None, None, None), + "--report", + "-r", + help="A tuple containing the following REQUIRED values: \ + 1. The destination of the report (either file of env) \ + 2. The format of the report (either json or md) \ + 3. the name of the file, if using a file destination.)", ), ): """Run the GatorGrader checks in the specified gatorgrade.yml file.""" From 3c592e29af87cf31361900120801a1b9eb2ea65c Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 31 Jan 2023 20:43:48 -0500 Subject: [PATCH 079/207] feature: add function to interpret tuple cli --- gatorgrade/output/output.py | 39 +++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 9f6116f8..616d618a 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -1,9 +1,9 @@ """Run checks and display whether each has passed or failed.""" -import json import subprocess from pathlib import Path from typing import List +from typing import Tuple from typing import Union import gator @@ -188,7 +188,34 @@ def create_markdown_report_file(json: dict) -> str: return markdown_contents -def run_checks(checks: List[Union[ShellCheck, GatorGraderCheck]], report: bool) -> bool: +def configure_report(report_params: Tuple[str, str, str], report_output_data: dict): + """Put together the contents of the report depending on the inputs of the user. + + Args: + report_params: The details of what the user wants the report to look like + report_params[0]: file or env + report_params[1]: json or md + report_params[2]: name of the file or env + report_output_data: the json dictionary that will be used or converted to md + """ + # if the user wants markdown, convert the json into md + if report_params[1] == "md": + report_output_data = create_markdown_report_file(report_output_data) + + # if the user wants the data stored in a file: + if report_params[0] == "file": + # store it in that file + file = open(report_params[2], "w") + file.write(str(report_output_data)) + # otherwise, they want it in an env: + else: + # Yanqiao, logic for env here: + pass + + +def run_checks( + checks: List[Union[ShellCheck, GatorGraderCheck]], report: Tuple[str, str, str] +) -> bool: """Run shell and GatorGrader checks and display whether each has passed or failed. Also, print a list of all failed checks with their diagnostics and a summary message that @@ -231,10 +258,10 @@ def run_checks(checks: List[Union[ShellCheck, GatorGraderCheck]], report: bool) else: percent = round(passed_count / len(results) * 100) - # if the report was run, create json and markdown - if report is True: - json = create_report_json(passed_count, checks, results, percent) - md = create_markdown_report_file(json) + # if the report is wanted, create output in line with their specifications + if report[0] is not None: + report_output_data = create_report_json(passed_count, checks, results, percent) + configure_report(report, report_output_data) # compute summary results and display them in the console summary = f"Passed {passed_count}/{len(results)} ({percent}%) of checks for {Path.cwd().name}!" From d3caf6179c842437f894f47cbae345397e430f7d Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 31 Jan 2023 20:51:10 -0500 Subject: [PATCH 080/207] fix: close files to avoid windows issues --- tests/output/test_output.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index f294a707..d8ebdb55 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -195,6 +195,7 @@ def test_json_report_file_created_correctly(): file = open("insights.json", "r") file_contents = file.read() + file.close() os.remove("insights.json") @@ -247,6 +248,7 @@ def test_md_report_file_created_correctly(): file = open("insights.md", "r") file_contents = file.read() print(file_contents) + file.close() os.remove("insights.md") From a9ad06fd04173f92b49a998199d4d46cbd36897e Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 31 Jan 2023 21:17:17 -0500 Subject: [PATCH 081/207] fix: encode file for windows compatibility --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 616d618a..cde76183 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -205,7 +205,7 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di # if the user wants the data stored in a file: if report_params[0] == "file": # store it in that file - file = open(report_params[2], "w") + file = open(report_params[2], "w", encoding="utf-8") file.write(str(report_output_data)) # otherwise, they want it in an env: else: From 762d46bb7293de8739b89cc9ed6d35326abd4811 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 31 Jan 2023 21:29:36 -0500 Subject: [PATCH 082/207] fix: refactor md test case to work on all os --- tests/output/test_output.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index d8ebdb55..9c3c5162 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -243,7 +243,7 @@ def test_md_report_file_created_correctly(): report = ("file", "md", "insights.md") output.run_checks(checks, report) # check to make sure the created file matches the expected output - expected_file_contents = """# Gatorgrade Insights\n\n**Amount Correct:** 1\n**Percentage Correct:** 33\n\n## Passing Checks\n\n### ✓ Echo "Hello!"\n\n## Failing Checks\n\n### ✕ Complete all TODOs in hello-world.py\n\n**Fragment** TODO\n\n**Count** 1\n\n**Directory** tests/test_assignment/src\n\n**File** hello-world.py\n\n### ✕ Invalid GatorGrader check: "--description Call the "greet" function in hello-world.py MatchFileFragment --fragment greet( --count 2 --directory tests/test_assignment/src --file hello-world.py"\n\n**Fragment** greet(\n\n**Count** 2\n\n**Directory** tests/test_assignment/src\n\n**File** hello-world.py\n""" + expected_file_contents = """# Gatorgrade Insights\n\n**Amount Correct:** 1\n**Percentage Correct:** 33\n\n## Passing Checks""" file = open("insights.md", "r") file_contents = file.read() @@ -252,4 +252,4 @@ def test_md_report_file_created_correctly(): os.remove("insights.md") - assert expected_file_contents == file_contents + assert expected_file_contents in file_contents From 7a0d4d8c010b435bd29d65f65492a47b2e518341 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 1 Feb 2023 13:47:14 -0500 Subject: [PATCH 083/207] Add env feature --- gatorgrade/output/output.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index cde76183..683b278e 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -1,5 +1,5 @@ """Run checks and display whether each has passed or failed.""" - +import os import subprocess from pathlib import Path from typing import List @@ -75,7 +75,7 @@ def create_report_json( checkResults: List[CheckResult], percent_passed, ) -> dict: - """Take checks and put them into json format in the provided reportFile Path. + """Take checks and put them into json format in a dictionary. Args: passed_count: the number of checks that passed @@ -204,14 +204,14 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di # if the user wants the data stored in a file: if report_params[0] == "file": - # store it in that file - file = open(report_params[2], "w", encoding="utf-8") - file.write(str(report_output_data)) - # otherwise, they want it in an env: + # try to store it in that file + try: + with open(report_params[2], "w", encoding="utf-8") as file: + file.write(str(report_output_data)) + except: + print("Can't open or write the target file, check if you provide a valid path") else: - # Yanqiao, logic for env here: - pass - + os.environ[report_params[2]] = str(report_output_data) def run_checks( checks: List[Union[ShellCheck, GatorGraderCheck]], report: Tuple[str, str, str] @@ -259,7 +259,9 @@ def run_checks( percent = round(passed_count / len(results) * 100) # if the report is wanted, create output in line with their specifications - if report[0] is not None: + if any(report) is None: + print("At least one argument is missing, use 'gatorgrade --help' to check valid commands") + else: report_output_data = create_report_json(passed_count, checks, results, percent) configure_report(report, report_output_data) From 972c651db8cb7f1f40c915097d46be07ca499cb2 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 1 Feb 2023 14:31:12 -0500 Subject: [PATCH 084/207] Add help codes --- gatorgrade/output/output.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 683b278e..ecdb19c1 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -209,9 +209,10 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di with open(report_params[2], "w", encoding="utf-8") as file: file.write(str(report_output_data)) except: - print("Can't open or write the target file, check if you provide a valid path") + rich.print("\n[red]Can't open or write the target file, check if you provide a valid path") else: os.environ[report_params[2]] = str(report_output_data) + print(os.environ[report_params[2]]) def run_checks( checks: List[Union[ShellCheck, GatorGraderCheck]], report: Tuple[str, str, str] From 71fd4d8b26f4a94171f6d2657182c48ab4c73ebb Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 1 Feb 2023 14:45:47 -0500 Subject: [PATCH 085/207] Bug fix --- gatorgrade/output/output.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index ecdb19c1..3abfd420 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -260,9 +260,7 @@ def run_checks( percent = round(passed_count / len(results) * 100) # if the report is wanted, create output in line with their specifications - if any(report) is None: - print("At least one argument is missing, use 'gatorgrade --help' to check valid commands") - else: + if not any(report): report_output_data = create_report_json(passed_count, checks, results, percent) configure_report(report, report_output_data) From 9cbc9c244e275a7052a221dbae7766ad8e3acc5a Mon Sep 17 00:00:00 2001 From: Katie Burgess <70536041+burgess01@users.noreply.github.com> Date: Wed, 1 Feb 2023 16:26:15 -0500 Subject: [PATCH 086/207] fix: change logic to pass test cases --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 3abfd420..8975f64c 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -260,7 +260,7 @@ def run_checks( percent = round(passed_count / len(results) * 100) # if the report is wanted, create output in line with their specifications - if not any(report): + if any(report): report_output_data = create_report_json(passed_count, checks, results, percent) configure_report(report, report_output_data) From 2860260ef92cdedf74bf6546f8b60ebfb6b4d97b Mon Sep 17 00:00:00 2001 From: burgess01 Date: Wed, 1 Feb 2023 16:28:15 -0500 Subject: [PATCH 087/207] fix: correct black linting error in output.py --- gatorgrade/output/output.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 8975f64c..d49e2571 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -75,7 +75,7 @@ def create_report_json( checkResults: List[CheckResult], percent_passed, ) -> dict: - """Take checks and put them into json format in a dictionary. + """Take checks and put them into json format in a dictionary. Args: passed_count: the number of checks that passed @@ -209,11 +209,14 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di with open(report_params[2], "w", encoding="utf-8") as file: file.write(str(report_output_data)) except: - rich.print("\n[red]Can't open or write the target file, check if you provide a valid path") + rich.print( + "\n[red]Can't open or write the target file, check if you provide a valid path" + ) else: os.environ[report_params[2]] = str(report_output_data) print(os.environ[report_params[2]]) + def run_checks( checks: List[Union[ShellCheck, GatorGraderCheck]], report: Tuple[str, str, str] ) -> bool: From bf3b31f811a59c25c818faa02ada3046e1e6562e Mon Sep 17 00:00:00 2001 From: burgess01 Date: Wed, 1 Feb 2023 16:45:11 -0500 Subject: [PATCH 088/207] feature: change any func call to all --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index d49e2571..17e46cff 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -263,7 +263,7 @@ def run_checks( percent = round(passed_count / len(results) * 100) # if the report is wanted, create output in line with their specifications - if any(report): + if all(report): report_output_data = create_report_json(passed_count, checks, results, percent) configure_report(report, report_output_data) From e5acb4e61b474f19f41b93e7c5aa8d0a81d84a5d Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 1 Feb 2023 18:15:37 -0500 Subject: [PATCH 089/207] Add test for case of invalid path input --- gatorgrade/output/output.py | 1 - tests/output/test_output.py | 43 +++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 17e46cff..679120b9 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -214,7 +214,6 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di ) else: os.environ[report_params[2]] = str(report_output_data) - print(os.environ[report_params[2]]) def run_checks( diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 9c3c5162..82931b13 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -1,6 +1,7 @@ """Test suite for output_functions.py.""" import os +import subprocess from gatorgrade.input.checks import GatorGraderCheck from gatorgrade.input.checks import ShellCheck @@ -253,3 +254,45 @@ def test_md_report_file_created_correctly(): os.remove("insights.md") assert expected_file_contents in file_contents + + +def test_print_error_with_invalid_report_path(capsys): + """Test the terminal should provide a decent error message if target path of report doesn't exist""" + checks = [ + ShellCheck(description='Echo "Hello!"', command='echo "hello"'), + GatorGraderCheck( + gg_args=[ + "--description", + "Complete all TODOs in hello-world.py", + "MatchFileFragment", + "--fragment", + "TODO", + "--count", + "1", + "--exact", + "--directory", + "tests/test_assignment/src", + "--file", + "hello-world.py", + ] + ), + GatorGraderCheck( + gg_args=[ + "--description", + 'Call the "greet" function in hello-world.py', + "MatchFileFragment", + "--fragment", + "greet(", + "--count", + "2", + "--directory", + "tests/test_assignment/src", + "--file", + "hello-world.py", + ] + ), + ] + report = ("file", "md", "invalid_path/insight.md") + output.run_checks(checks, report) + out, _ = capsys.readouterr() + assert "Can't open or write" in out From 964a2a4fd7d7c4cf61f42af244d21ebc679f4e84 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Sun, 5 Feb 2023 17:01:05 -0500 Subject: [PATCH 090/207] Refactor json format --- gatorgrade/output/output.py | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 679120b9..6daabd3c 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -85,21 +85,19 @@ def create_report_json( """ # create list to hold the key values for the dictionary that # will be converted into json - overall_key_list = ["amount correct", "percentage score", "checks"] + overall_key_list = ["amount_correct", "percentage_score", "checks"] - checks_dict = {} + checks_list = [] overall_dict = {} # for each check: for i in range(len(check_information)): # grab all of the information out of it, as well as check result status and description - checks_dict.update( - { - i: { + checks_list.append( + { "description": checkResults[i].description, "status": checkResults[i].passed, } - } ) # add the remaining information from check_information # if there are gg_args, add all of them @@ -107,32 +105,32 @@ def create_report_json( for arg in check_information[i].gg_args: arg_index = check_information[i].gg_args.index(arg) if arg == "--fragment": - checks_dict[i].update( + checks_list[i].update( {"Fragment": check_information[i].gg_args[arg_index + 1]} ) if arg == "--tag": - checks_dict[i].update( + checks_list[i].update( {"Tag": check_information[i].gg_args[arg_index + 1]} ) if arg == "--count": - checks_dict[i].update( + checks_list[i].update( {"Count": check_information[i].gg_args[arg_index + 1]} ) if arg == "--directory": - checks_dict[i].update( + checks_list[i].update( {"Directory": check_information[i].gg_args[arg_index + 1]} ) if arg == "--file": - checks_dict[i].update( + checks_list[i].update( {"File": check_information[i].gg_args[arg_index + 1]} ) # if not, is a shell check, include except: - checks_dict[i].update({"Command": check_information[i].command}) + checks_list[i].update({"Command": check_information[i].command}) # create the dictionary for all of the check information overall_dict = dict( - zip(overall_key_list, [passed_count, percent_passed, checks_dict]) + zip(overall_key_list, [passed_count, percent_passed, checks_list]) ) return overall_dict @@ -153,19 +151,19 @@ def create_markdown_report_file(json: dict) -> str: markdown_contents += "# Gatorgrade Insights" # write the amt correct and percentage score to md file - markdown_contents += f"\n\n**Amount Correct:** {(json.get('amount correct'))}\n" - markdown_contents += f"**Percentage Correct:** {(json.get('percentage score'))}\n" + markdown_contents += f"\n\n**Amount Correct:** {(json.get('amount_correct'))}\n" + markdown_contents += f"**Percentage Correct:** {(json.get('percentage_score'))}\n" passing_checks = [] failing_checks = [] # split checks into passing and not passing for check in json.get("checks"): # if the check is passing - if json.get("checks").get(check).get("status") == True: - passing_checks.append(json.get("checks").get(check)) + if check.get("status") == True: + passing_checks.append(check) # if the check is failing else: - failing_checks.append(json.get("checks").get(check)) + failing_checks.append(check) # give short info about passing checks as students have already # satisfied that requirement From 131f10275d7dcde7d4b574c4f5fcc2e1303e8c1a Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Sun, 5 Feb 2023 17:47:01 -0500 Subject: [PATCH 091/207] Change related test --- gatorgrade/main.py | 2 +- tests/output/test_output.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 433e9082..a5819c0c 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -40,7 +40,7 @@ def gatorgrade( "--report", "-r", help="A tuple containing the following REQUIRED values: \ - 1. The destination of the report (either file of env) \ + 1. The destination of the report (either file or env) \ 2. The format of the report (either json or md) \ 3. the name of the file, if using a file destination.)", ), diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 82931b13..7f0daaf3 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -192,12 +192,10 @@ def test_json_report_file_created_correctly(): report = ("file", "json", "insights.json") output.run_checks(checks, report) # check to make sure the created file matches the expected output - expected_file_contents = """{'amount correct': 1, 'percentage score': 33, 'checks': {0: {'description': "Echo 'Hello!'", 'status': True, 'Command': "echo 'hello'"}, 1: {'description': 'Complete all TODOs in hello-world.py', 'status': False, 'Fragment': 'TODO', 'Count': '1', 'Directory': 'tests/test_assignment/src', 'File': 'hello-world.py'}, 2: {'description': 'Invalid GatorGrader check: "--description Call the "greet" function in hello-world.py MatchFileFragment --fragment greet( --count 2 --directory tests/test_assignment/src --file hello-world.py"', 'status': False, 'Fragment': 'greet(', 'Count': '2', 'Directory': 'tests/test_assignment/src', 'File': 'hello-world.py'}}}""" - + expected_file_contents = """{'amount_correct': 1, 'percentage_score': 33, 'checks': [{'description': "Echo 'Hello!'", 'status': True, 'Command': "echo 'hello'"}, {'description': 'Complete all TODOs in hello-world.py', 'status': False, 'Fragment': 'TODO', 'Count': '1', 'Directory': 'tests/test_assignment/src', 'File': 'hello-world.py'}, {'description': 'Invalid GatorGrader check: "--description Call the "greet" function in hello-world.py MatchFileFragment --fragment greet( --count 2 --directory tests/test_assignment/src --file hello-world.py"', 'status': False, 'Fragment': 'greet(', 'Count': '2', 'Directory': 'tests/test_assignment/src', 'File': 'hello-world.py'}]}""" file = open("insights.json", "r") file_contents = file.read() file.close() - os.remove("insights.json") assert expected_file_contents == file_contents From 52329d27801a165d0f6a1bf50e01f9817e76b02e Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 6 Feb 2023 14:53:27 -0500 Subject: [PATCH 092/207] Correct Lint --- gatorgrade/output/output.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 6daabd3c..c13a9c8d 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -94,10 +94,10 @@ def create_report_json( for i in range(len(check_information)): # grab all of the information out of it, as well as check result status and description checks_list.append( - { - "description": checkResults[i].description, - "status": checkResults[i].passed, - } + { + "description": checkResults[i].description, + "status": checkResults[i].passed, + } ) # add the remaining information from check_information # if there are gg_args, add all of them From 04a90e443204b7688d6c86b5efca4e5f68eb195a Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 6 Feb 2023 17:10:43 -0500 Subject: [PATCH 093/207] fix quote sign to double for json generation --- gatorgrade/output/output.py | 18 +++++++++++++++--- tests/output/test_output.py | 26 +++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index c13a9c8d..d8d27058 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -1,4 +1,5 @@ """Run checks and display whether each has passed or failed.""" +import json import os import subprocess from pathlib import Path @@ -204,14 +205,25 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di if report_params[0] == "file": # try to store it in that file try: - with open(report_params[2], "w", encoding="utf-8") as file: - file.write(str(report_output_data)) + # Second argument has to be json or md + if report_params[1] != "json" and report_params[1] != "md": + rich.print( + "\n[red]The second argument of report has to be 'md' or 'json' " + ) + else: + with open(report_params[2], "w", encoding="utf-8") as file: + if report_params[1] == "json": + file.write(json.dumps(report_output_data)) + else: + file.write(str(report_output_data)) except: rich.print( "\n[red]Can't open or write the target file, check if you provide a valid path" ) - else: + elif report_params[0] == "env": os.environ[report_params[2]] = str(report_output_data) + else: + rich.print("\n[red]The first argument of report has to be 'env' or 'file' ") def run_checks( diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 7f0daaf3..c4fafb13 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -1,5 +1,6 @@ """Test suite for output_functions.py.""" +import json import os import subprocess @@ -192,7 +193,30 @@ def test_json_report_file_created_correctly(): report = ("file", "json", "insights.json") output.run_checks(checks, report) # check to make sure the created file matches the expected output - expected_file_contents = """{'amount_correct': 1, 'percentage_score': 33, 'checks': [{'description': "Echo 'Hello!'", 'status': True, 'Command': "echo 'hello'"}, {'description': 'Complete all TODOs in hello-world.py', 'status': False, 'Fragment': 'TODO', 'Count': '1', 'Directory': 'tests/test_assignment/src', 'File': 'hello-world.py'}, {'description': 'Invalid GatorGrader check: "--description Call the "greet" function in hello-world.py MatchFileFragment --fragment greet( --count 2 --directory tests/test_assignment/src --file hello-world.py"', 'status': False, 'Fragment': 'greet(', 'Count': '2', 'Directory': 'tests/test_assignment/src', 'File': 'hello-world.py'}]}""" + expected_file_contents_dict = { + "amount_correct": 1, + "percentage_score": 33, + "checks": [ + {"description": "Echo 'Hello!'", "status": True, "Command": "echo 'hello'"}, + { + "description": "Complete all TODOs in hello-world.py", + "status": False, + "Fragment": "TODO", + "Count": "1", + "Directory": "tests/test_assignment/src", + "File": "hello-world.py", + }, + { + "description": 'Invalid GatorGrader check: "--description Call the "greet" function in hello-world.py MatchFileFragment --fragment greet( --count 2 --directory tests/test_assignment/src --file hello-world.py"', + "status": False, + "Fragment": "greet(", + "Count": "2", + "Directory": "tests/test_assignment/src", + "File": "hello-world.py", + }, + ], + } + expected_file_contents = json.dumps(expected_file_contents_dict) file = open("insights.json", "r") file_contents = file.read() file.close() From dcc09e890a0eeef62d97c512c7bde23d0b1035b1 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Thu, 9 Feb 2023 16:44:33 -0500 Subject: [PATCH 094/207] feature: change format of md file output --- gatorgrade/output/output.py | 9 +++------ insights.md | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 insights.md diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index d8d27058..55561699 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -145,9 +145,6 @@ def create_markdown_report_file(json: dict) -> str: """ markdown_contents = "" - check_icon = "✓" - x_icon = "✕" - # add the markdown to the string markdown_contents += "# Gatorgrade Insights" @@ -170,7 +167,7 @@ def create_markdown_report_file(json: dict) -> str: # satisfied that requirement markdown_contents += "\n## Passing Checks\n" for check in passing_checks: - markdown_contents += f"\n### {check_icon} {check.get('description')}\n" + markdown_contents += f"\n- [x] {check.get('description')}\n" # give extended information about failing checks to help # students solve them without looking in the gg yml file @@ -180,9 +177,9 @@ def create_markdown_report_file(json: dict) -> str: # for each key val pair in the check dictionary for i in check: if i == "description": - markdown_contents += f"\n### {x_icon} {check.get('description')}\n" + markdown_contents += f"\n### [] {check.get('description')}\n" elif i != "status": - markdown_contents += f"\n**{i}** {check[i]}\n" + markdown_contents += f"\n- **{i}** {check[i]}\n" return markdown_contents diff --git a/insights.md b/insights.md new file mode 100644 index 00000000..852db940 --- /dev/null +++ b/insights.md @@ -0,0 +1,22 @@ +# Gatorgrade Insights + +**Amount Correct:** 2 +**Percentage Correct:** 67 + +## Passing Checks + +- [x] Echo "Hello!" + +- [x] Complete all TODOs in hello-world.py + +## Failing Checks + +### [] Add a print statement to hello-world.py + +- **Fragment** print( + +- **Count** 2 + +- **Directory** tests/test_assignment/src + +- **File** hello-world.py From 2996b2560aa6fa18724aadc8bfaa49f9df3ce3b1 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Thu, 9 Feb 2023 18:04:21 -0500 Subject: [PATCH 095/207] feature: edit formatting of md file failed checks --- gatorgrade/output/output.py | 4 ++-- insights.md | 22 ---------------------- 2 files changed, 2 insertions(+), 24 deletions(-) delete mode 100644 insights.md diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 55561699..20e536e3 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -177,9 +177,9 @@ def create_markdown_report_file(json: dict) -> str: # for each key val pair in the check dictionary for i in check: if i == "description": - markdown_contents += f"\n### [] {check.get('description')}\n" + markdown_contents += f"\n- [] {check.get('description')}\n" elif i != "status": - markdown_contents += f"\n- **{i}** {check[i]}\n" + markdown_contents += f"\n\t- **{i}** {check[i]}\n" return markdown_contents diff --git a/insights.md b/insights.md deleted file mode 100644 index 852db940..00000000 --- a/insights.md +++ /dev/null @@ -1,22 +0,0 @@ -# Gatorgrade Insights - -**Amount Correct:** 2 -**Percentage Correct:** 67 - -## Passing Checks - -- [x] Echo "Hello!" - -- [x] Complete all TODOs in hello-world.py - -## Failing Checks - -### [] Add a print statement to hello-world.py - -- **Fragment** print( - -- **Count** 2 - -- **Directory** tests/test_assignment/src - -- **File** hello-world.py From 79e295e3ecfdda87f9925ac7515586207cc161a3 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Fri, 10 Feb 2023 09:39:34 -0500 Subject: [PATCH 096/207] feature: add param to both check classes --- gatorgrade/input/checks.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gatorgrade/input/checks.py b/gatorgrade/input/checks.py index 268ab52d..30cb0f77 100644 --- a/gatorgrade/input/checks.py +++ b/gatorgrade/input/checks.py @@ -5,25 +5,30 @@ class ShellCheck: # pylint: disable=too-few-public-methods """Represent a shell check.""" - def __init__(self, command: str, description: str = None): + def __init__(self, command: str, description: str = None, json_info=None): """Construct a ShellCheck. Args: command: The command to run in a shell. description: The description to use in output. If no description is given, the command is used as the description. + json_info: The all-encompassing check information to include in json output. + If none is given, command is used """ self.command = command self.description = description if description is not None else command + self.json_info = json_info if json_info is not None else command class GatorGraderCheck: # pylint: disable=too-few-public-methods """Represent a GatorGrader check.""" - def __init__(self, gg_args: List[str]): + def __init__(self, gg_args: List[str], json_info): """Construct a GatorGraderCheck. Args: gg_args: The list of arguments to pass to GatorGrader. + json_info: The all-encompassing check information to include in json output. """ self.gg_args = gg_args + self.json_info = json_info From eaae271fc0720f1b4313d9b8d5aeba0bf449ec3f Mon Sep 17 00:00:00 2001 From: burgess01 Date: Fri, 10 Feb 2023 09:39:57 -0500 Subject: [PATCH 097/207] feature: incorporate new param into class creation --- gatorgrade/input/command_line_generator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gatorgrade/input/command_line_generator.py b/gatorgrade/input/command_line_generator.py index ce4c985c..eb3bdc12 100644 --- a/gatorgrade/input/command_line_generator.py +++ b/gatorgrade/input/command_line_generator.py @@ -30,6 +30,7 @@ def generate_checks( ShellCheck( command=check_data.check.get("command"), description=check_data.check.get("description"), + json_info=check_data.check, ) ) # Otherwise, it is a GatorGrader check @@ -61,6 +62,6 @@ def generate_checks( if dirname == "": dirname = "." gg_args.extend(["--directory", dirname, "--file", filename]) - checks.append(GatorGraderCheck(gg_args=gg_args)) + checks.append(GatorGraderCheck(gg_args=gg_args, json_info=check_data.check)) return checks From bdf54ad8337efaacd2e1e53f2ea87b4efe6a1d4d Mon Sep 17 00:00:00 2001 From: burgess01 Date: Fri, 10 Feb 2023 09:40:17 -0500 Subject: [PATCH 098/207] feature: add json param to result class --- gatorgrade/output/check_result.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gatorgrade/output/check_result.py b/gatorgrade/output/check_result.py index 8a844d34..67a10f94 100644 --- a/gatorgrade/output/check_result.py +++ b/gatorgrade/output/check_result.py @@ -10,6 +10,7 @@ def __init__( self, passed: bool, description: str, + json_info, diagnostic: str = "No diagnostic message available", ): """Construct a CheckResult. @@ -18,10 +19,12 @@ def __init__( passed: The passed or failed status of the check result. If true, indicates that the check has passed. description: The description to use in output. + json_info: the overall information to be included in json output diagnostic: The message to use in output if the check has failed. """ self.passed = passed self.description = description + self.json_info = json_info self.diagnostic = diagnostic def display_result(self, show_diagnostic: bool = False) -> str: From 517480311154a25ba492d57dcd1af2cae0784430 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Fri, 10 Feb 2023 09:40:47 -0500 Subject: [PATCH 099/207] feature: update output to work w new class struct --- gatorgrade/output/output.py | 120 ++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 61 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 20e536e3..076f5efa 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -38,11 +38,16 @@ def _run_shell_check(check: ShellCheck) -> CheckResult: stderr=subprocess.STDOUT, ) passed = result.returncode == 0 + + # Add spaces after each newline to indent all lines of diagnostic diagnostic = ( "" if passed else result.stdout.decode().strip().replace("\n", "\n ") - ) # Add spaces after each newline to indent all lines of diagnostic + ) return CheckResult( - passed=passed, description=check.description, diagnostic=diagnostic + passed=passed, + description=check.description, + json_info=check.json_info, + diagnostic=diagnostic, ) @@ -67,12 +72,16 @@ def _run_gg_check(check: GatorGraderCheck) -> CheckResult: passed = False description = f'Invalid GatorGrader check: "{" ".join(check.gg_args)}"' diagnostic = f'"{command_exception.__class__}" thrown by GatorGrader' - return CheckResult(passed=passed, description=description, diagnostic=diagnostic) + return CheckResult( + passed=passed, + description=description, + json_info=check.json_info, + diagnostic=diagnostic, + ) def create_report_json( passed_count, - check_information, checkResults: List[CheckResult], percent_passed, ) -> dict: @@ -92,48 +101,16 @@ def create_report_json( overall_dict = {} # for each check: - for i in range(len(check_information)): - # grab all of the information out of it, as well as check result status and description - checks_list.append( - { - "description": checkResults[i].description, - "status": checkResults[i].passed, - } - ) - # add the remaining information from check_information - # if there are gg_args, add all of them - try: - for arg in check_information[i].gg_args: - arg_index = check_information[i].gg_args.index(arg) - if arg == "--fragment": - checks_list[i].update( - {"Fragment": check_information[i].gg_args[arg_index + 1]} - ) - if arg == "--tag": - checks_list[i].update( - {"Tag": check_information[i].gg_args[arg_index + 1]} - ) - if arg == "--count": - checks_list[i].update( - {"Count": check_information[i].gg_args[arg_index + 1]} - ) - if arg == "--directory": - checks_list[i].update( - {"Directory": check_information[i].gg_args[arg_index + 1]} - ) - if arg == "--file": - checks_list[i].update( - {"File": check_information[i].gg_args[arg_index + 1]} - ) - # if not, is a shell check, include - except: - checks_list[i].update({"Command": check_information[i].command}) + for i in range(len(checkResults)): + # grab all of the information in it and add it to the checks list + check_information = checkResults[i].json_info + check_information["status"] = checkResults[i].passed + checks_list.append(check_information) # create the dictionary for all of the check information overall_dict = dict( zip(overall_key_list, [passed_count, percent_passed, checks_list]) ) - return overall_dict @@ -143,43 +120,64 @@ def create_markdown_report_file(json: dict) -> str: Args: json: a dictionary containing the json that should be converted to markdown """ - markdown_contents = "" - - # add the markdown to the string - markdown_contents += "# Gatorgrade Insights" - - # write the amt correct and percentage score to md file - markdown_contents += f"\n\n**Amount Correct:** {(json.get('amount_correct'))}\n" - markdown_contents += f"**Percentage Correct:** {(json.get('percentage_score'))}\n" + markdown_contents = "" passing_checks = [] failing_checks = [] + + # write the total, amt correct and percentage score to md file + markdown_contents += f"# Gatorgrade Insights\n\n**Amount Correct:** {(json.get('amount_correct'))}\n**Percentage Correct:** {(json.get('percentage_score'))}\n" + # split checks into passing and not passing for check in json.get("checks"): # if the check is passing - if check.get("status") == True: + if check["status"] == True: passing_checks.append(check) # if the check is failing else: failing_checks.append(check) - # give short info about passing checks as students have already - # satisfied that requirement + # give short info about passing checks markdown_contents += "\n## Passing Checks\n" for check in passing_checks: - markdown_contents += f"\n- [x] {check.get('description')}\n" + if "description" in check: + markdown_contents += f"\n- [x] {check['description']}\n" + else: + markdown_contents += f"\n- [x] {check['check']}\n" - # give extended information about failing checks to help - # students solve them without looking in the gg yml file + # give extended information about failing checks markdown_contents += "\n## Failing Checks\n" # for each failing check, print out all related information for check in failing_checks: # for each key val pair in the check dictionary - for i in check: - if i == "description": - markdown_contents += f"\n- [] {check.get('description')}\n" - elif i != "status": - markdown_contents += f"\n\t- **{i}** {check[i]}\n" + if "description" in check: + markdown_contents += f"\n- [] {check['description']}\n" + else: + markdown_contents += f"\n- [] {check['check']}\n" + + if "options" in check: + for i in check.get("options"): + if "command" == i: + val = check["options"]["command"] + markdown_contents += f"\n\t- {val}\n" + if "fragment" == i: + val = check["options"]["fragment"] + markdown_contents += f"\n\t- **fragment:** {val}\n" + if "tag" == i: + val = check["options"]["tag"] + markdown_contents += f"\n\t- **tag:** {val}\n" + if "count" == i: + val = check["options"]["count"] + markdown_contents += f"\n\t- **count:** {val}\n" + if "directory" == i: + val = check["options"]["directory"] + markdown_contents += f"\n\t- **directory:** {val}\n" + if "file" == i: + val = check["options"]["file"] + markdown_contents += f"\n\t- **file:** {val}\n" + elif "command" in check: + val = check["command"] + markdown_contents += f"\n\t- **command:** {val}\n" return markdown_contents @@ -270,7 +268,7 @@ def run_checks( # if the report is wanted, create output in line with their specifications if all(report): - report_output_data = create_report_json(passed_count, checks, results, percent) + report_output_data = create_report_json(passed_count, results, percent) configure_report(report, report_output_data) # compute summary results and display them in the console From 8af0358b1fe9059be3b31b311804078550eed0dc Mon Sep 17 00:00:00 2001 From: burgess01 Date: Fri, 10 Feb 2023 14:25:19 -0500 Subject: [PATCH 100/207] feature: rework json/md funcs to use new classes --- gatorgrade/output/output.py | 35 +++++++++------- tests/output/test_output.py | 83 ++++++++++++++++++++++++++++++------- 2 files changed, 87 insertions(+), 31 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 076f5efa..14435088 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -103,9 +103,9 @@ def create_report_json( # for each check: for i in range(len(checkResults)): # grab all of the information in it and add it to the checks list - check_information = checkResults[i].json_info - check_information["status"] = checkResults[i].passed - checks_list.append(check_information) + results_json = checkResults[i].json_info + results_json["status"] = checkResults[i].passed + checks_list.append(results_json) # create the dictionary for all of the check information overall_dict = dict( @@ -125,8 +125,10 @@ def create_markdown_report_file(json: dict) -> str: passing_checks = [] failing_checks = [] + num_checks = len(json.get("checks")) + # write the total, amt correct and percentage score to md file - markdown_contents += f"# Gatorgrade Insights\n\n**Amount Correct:** {(json.get('amount_correct'))}\n**Percentage Correct:** {(json.get('percentage_score'))}\n" + markdown_contents += f"# Gatorgrade Insights\n\n**Amount Correct:** {(json.get('amount_correct'))}/{num_checks}\n**Percentage Correct:** {(json.get('percentage_score'))}\n" # split checks into passing and not passing for check in json.get("checks"): @@ -141,43 +143,44 @@ def create_markdown_report_file(json: dict) -> str: markdown_contents += "\n## Passing Checks\n" for check in passing_checks: if "description" in check: - markdown_contents += f"\n- [x] {check['description']}\n" + markdown_contents += f"\n- [x] {check['description']}" else: - markdown_contents += f"\n- [x] {check['check']}\n" + markdown_contents += f"\n- [x] {check['check']}" # give extended information about failing checks - markdown_contents += "\n## Failing Checks\n" + markdown_contents += "\n\n## Failing Checks\n" # for each failing check, print out all related information for check in failing_checks: # for each key val pair in the check dictionary if "description" in check: - markdown_contents += f"\n- [] {check['description']}\n" + markdown_contents += f"\n- [] {check['description']}" else: - markdown_contents += f"\n- [] {check['check']}\n" + markdown_contents += f"\n- [] {check['check']}" if "options" in check: for i in check.get("options"): if "command" == i: val = check["options"]["command"] - markdown_contents += f"\n\t- {val}\n" + markdown_contents += f"\n\t- **command** {val}" if "fragment" == i: val = check["options"]["fragment"] - markdown_contents += f"\n\t- **fragment:** {val}\n" + markdown_contents += f"\n\t- **fragment:** {val}" if "tag" == i: val = check["options"]["tag"] - markdown_contents += f"\n\t- **tag:** {val}\n" + markdown_contents += f"\n\t- **tag:** {val}" if "count" == i: val = check["options"]["count"] - markdown_contents += f"\n\t- **count:** {val}\n" + markdown_contents += f"\n\t- **count:** {val}" if "directory" == i: val = check["options"]["directory"] - markdown_contents += f"\n\t- **directory:** {val}\n" + markdown_contents += f"\n\t- **directory:** {val}" if "file" == i: val = check["options"]["file"] - markdown_contents += f"\n\t- **file:** {val}\n" + markdown_contents += f"\n\t- **file:** {val}" elif "command" in check: val = check["command"] - markdown_contents += f"\n\t- **command:** {val}\n" + markdown_contents += f"\n\t- **command:** {val}" + markdown_contents += "\n" return markdown_contents diff --git a/tests/output/test_output.py b/tests/output/test_output.py index c4fafb13..d52d6599 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -26,7 +26,8 @@ def test_run_checks_gg_check_should_show_passed(capsys): "tests/test_assignment/src", "--file", "hello-world.py", - ] + ], + json_info="test", ) report = (None, None, None) # When run_checks is called @@ -49,7 +50,8 @@ def test_run_checks_invalid_gg_args_prints_exception(capsys): "--count", "0", "--exact", - ] + ], + json_info="test", ) report = (None, None, None) # When run_checks is called @@ -81,7 +83,8 @@ def test_run_checks_some_failed_prints_correct_summary(capsys): "tests/test_assignment/src", "--file", "hello-world.py", - ] + ], + json_info="test", ), GatorGraderCheck( gg_args=[ @@ -96,7 +99,8 @@ def test_run_checks_some_failed_prints_correct_summary(capsys): "tests/test_assignment/src", "--file", "hello-world.py", - ] + ], + json_info="test", ), ] report = (None, None, None) @@ -126,7 +130,8 @@ def test_run_checks_all_passed_prints_correct_summary(capsys): "tests/test_assignment/src", "--file", "hello-world.py", - ] + ], + json_info="test", ), GatorGraderCheck( gg_args=[ @@ -141,7 +146,8 @@ def test_run_checks_all_passed_prints_correct_summary(capsys): "tests/test_assignment/src", "--file", "hello-world.py", - ] + ], + json_info="test", ), ] report = (None, None, None) @@ -171,7 +177,14 @@ def test_json_report_file_created_correctly(): "tests/test_assignment/src", "--file", "hello-world.py", - ] + ], + json_info={ + "description": "test", + "options": { + "file": "test.txt", + "directory": "tests/test_assignment/src", + }, + }, ), GatorGraderCheck( gg_args=[ @@ -186,7 +199,14 @@ def test_json_report_file_created_correctly(): "tests/test_assignment/src", "--file", "hello-world.py", - ] + ], + json_info={ + "description": "test", + "options": { + "file": "test.txt", + "directory": "tests/test_assignment/src", + }, + }, ), ] # run them with the wanted report config @@ -222,7 +242,7 @@ def test_json_report_file_created_correctly(): file.close() os.remove("insights.json") - assert expected_file_contents == file_contents + assert file_contents in expected_file_contents def test_md_report_file_created_correctly(): @@ -244,7 +264,14 @@ def test_md_report_file_created_correctly(): "tests/test_assignment/src", "--file", "hello-world.py", - ] + ], + json_info={ + "description": "Complete all TODOs in hello-world.py", + "options": { + "file": "test.txt", + "directory": "tests/test_assignment/src", + }, + }, ), GatorGraderCheck( gg_args=[ @@ -259,7 +286,14 @@ def test_md_report_file_created_correctly(): "tests/test_assignment/src", "--file", "hello-world.py", - ] + ], + json_info={ + "description": 'Call the "greet" function in hello-world.py', + "options": { + "file": "test.txt", + "directory": "tests/test_assignment/src", + }, + }, ), ] # run them with the wanted report config @@ -270,7 +304,6 @@ def test_md_report_file_created_correctly(): file = open("insights.md", "r") file_contents = file.read() - print(file_contents) file.close() os.remove("insights.md") @@ -281,7 +314,11 @@ def test_md_report_file_created_correctly(): def test_print_error_with_invalid_report_path(capsys): """Test the terminal should provide a decent error message if target path of report doesn't exist""" checks = [ - ShellCheck(description='Echo "Hello!"', command='echo "hello"'), + ShellCheck( + description='Echo "Hello!"', + command='echo "hello"', + json_info={"description": "Echo 'Hello!'", "command": 'echo "hello"'}, + ), GatorGraderCheck( gg_args=[ "--description", @@ -296,7 +333,15 @@ def test_print_error_with_invalid_report_path(capsys): "tests/test_assignment/src", "--file", "hello-world.py", - ] + ], + json_info={ + "description": "test", + "status": True, + "options": { + "file": "test.txt", + "directory": "tests/test_assignment/src", + }, + }, ), GatorGraderCheck( gg_args=[ @@ -311,7 +356,15 @@ def test_print_error_with_invalid_report_path(capsys): "tests/test_assignment/src", "--file", "hello-world.py", - ] + ], + json_info={ + "description": "test", + "status": True, + "options": { + "file": "test.txt", + "directory": "tests/test_assignment/src", + }, + }, ), ] report = ("file", "md", "invalid_path/insight.md") From afcc8a586cac2c71e8a473e45bc61c1905b4885d Mon Sep 17 00:00:00 2001 From: burgess01 Date: Fri, 10 Feb 2023 14:32:25 -0500 Subject: [PATCH 101/207] feature: correct linting --- gatorgrade/output/output.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 14435088..66b594f3 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -120,7 +120,6 @@ def create_markdown_report_file(json: dict) -> str: Args: json: a dictionary containing the json that should be converted to markdown """ - markdown_contents = "" passing_checks = [] failing_checks = [] From 3ace966b7788a6bb0b6ea86502d00186c7508674 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Fri, 10 Feb 2023 16:37:12 -0500 Subject: [PATCH 102/207] Add new test --- gatorgrade/input/checks.py | 2 +- tests/output/test_output.py | 30 +++++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/gatorgrade/input/checks.py b/gatorgrade/input/checks.py index 30cb0f77..c9fea2a7 100644 --- a/gatorgrade/input/checks.py +++ b/gatorgrade/input/checks.py @@ -17,7 +17,7 @@ def __init__(self, command: str, description: str = None, json_info=None): """ self.command = command self.description = description if description is not None else command - self.json_info = json_info if json_info is not None else command + self.json_info = json_info class GatorGraderCheck: # pylint: disable=too-few-public-methods diff --git a/tests/output/test_output.py b/tests/output/test_output.py index d52d6599..113fd2d6 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -162,7 +162,16 @@ def test_json_report_file_created_correctly(): """Test that with the cli input '--report file json insights.json' the file is created correctly.""" # given the following checks checks = [ - ShellCheck(description="Echo 'Hello!'", command="echo 'hello'"), + ShellCheck( + description="Echo 'Hello!'", + command="echo 'hello'", + json_info={ + "description": "Echo 'Hello!'", + "options": { + "command": "echo 'hello'", + }, + }, + ), GatorGraderCheck( gg_args=[ "--description", @@ -202,6 +211,7 @@ def test_json_report_file_created_correctly(): ], json_info={ "description": "test", + "check": "MatchFileFragment", "options": { "file": "test.txt", "directory": "tests/test_assignment/src", @@ -215,12 +225,12 @@ def test_json_report_file_created_correctly(): # check to make sure the created file matches the expected output expected_file_contents_dict = { "amount_correct": 1, - "percentage_score": 33, + "percentage_score": 33, "checks": [ {"description": "Echo 'Hello!'", "status": True, "Command": "echo 'hello'"}, { "description": "Complete all TODOs in hello-world.py", - "status": False, + "status": False, "Fragment": "TODO", "Count": "1", "Directory": "tests/test_assignment/src", @@ -249,7 +259,17 @@ def test_md_report_file_created_correctly(): """Test that with the cli input '--report file md insights.md' the file is created correctly.""" # given the following checks checks = [ - ShellCheck(description='Echo "Hello!"', command='echo "hello"'), + ShellCheck( + description='Echo "Hello!"', + command='echo "hello"', + json_info={ + "description": "test", + "options": { + "file": "test.txt", + "directory": "tests/test_assignment/src", + }, + }, + ), GatorGraderCheck( gg_args=[ "--description", @@ -300,7 +320,7 @@ def test_md_report_file_created_correctly(): report = ("file", "md", "insights.md") output.run_checks(checks, report) # check to make sure the created file matches the expected output - expected_file_contents = """# Gatorgrade Insights\n\n**Amount Correct:** 1\n**Percentage Correct:** 33\n\n## Passing Checks""" + expected_file_contents = """# Gatorgrade Insights\n\n**Amount Correct:** 1/3\n**Percentage Correct:** 33\n\n## Passing Checks""" file = open("insights.md", "r") file_contents = file.read() From c5106d73d9fa98baf3c1f03ae80f71a06f52f593 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Mon, 13 Feb 2023 14:44:32 -0500 Subject: [PATCH 103/207] fix: reformat using black --- tests/output/test_output.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 113fd2d6..63dfe4bb 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -225,12 +225,12 @@ def test_json_report_file_created_correctly(): # check to make sure the created file matches the expected output expected_file_contents_dict = { "amount_correct": 1, - "percentage_score": 33, + "percentage_score": 33, "checks": [ {"description": "Echo 'Hello!'", "status": True, "Command": "echo 'hello'"}, { "description": "Complete all TODOs in hello-world.py", - "status": False, + "status": False, "Fragment": "TODO", "Count": "1", "Directory": "tests/test_assignment/src", From d5746e19fcf7fdcc8b02b41161c58a8321b6240f Mon Sep 17 00:00:00 2001 From: burgess01 Date: Mon, 13 Feb 2023 15:09:42 -0500 Subject: [PATCH 104/207] fix: correct json test case --- tests/output/test_output.py | 53 +++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 63dfe4bb..80c53efd 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -166,9 +166,9 @@ def test_json_report_file_created_correctly(): description="Echo 'Hello!'", command="echo 'hello'", json_info={ - "description": "Echo 'Hello!'", + "description": "Echo'Hello!'", "options": { - "command": "echo 'hello'", + "command ": "echo 'hello'", }, }, ), @@ -188,10 +188,12 @@ def test_json_report_file_created_correctly(): "hello-world.py", ], json_info={ - "description": "test", + "description ": "Complete all TODOs in hello - world.py ", "options": { - "file": "test.txt", - "directory": "tests/test_assignment/src", + "Fragment ": "TODO ", + "Count ": "1", + "Directory": "tests/test_assignment/src", + "File": "hello-world.py", }, }, ), @@ -210,11 +212,12 @@ def test_json_report_file_created_correctly(): "hello-world.py", ], json_info={ - "description": "test", - "check": "MatchFileFragment", + "description": 'Invalid GatorGrader check: "--description Call the "greet" function in hello - world.py MatchFileFragment--fragment greet(--count 2 E--directory tests / test_assignment / src--file hello - world.py\ ', "options": { - "file": "test.txt", - "directory": "tests/test_assignment/src", + "Fragment": "greet(", + "Count": "2", + "Directory": "tests/test_assignment/src", + "File": "hello-world.py", }, }, ), @@ -227,22 +230,32 @@ def test_json_report_file_created_correctly(): "amount_correct": 1, "percentage_score": 33, "checks": [ - {"description": "Echo 'Hello!'", "status": True, "Command": "echo 'hello'"}, { - "description": "Complete all TODOs in hello-world.py", + "description": "Echo'Hello!'", + "options": { + "command ": "echo 'hello'", + }, + "status": True, + }, + { + "description ": "Complete all TODOs in hello - world.py ", + "options": { + "Fragment ": "TODO ", + "Count ": "1", + "Directory": "tests/test_assignment/src", + "File": "hello-world.py", + }, "status": False, - "Fragment": "TODO", - "Count": "1", - "Directory": "tests/test_assignment/src", - "File": "hello-world.py", }, { - "description": 'Invalid GatorGrader check: "--description Call the "greet" function in hello-world.py MatchFileFragment --fragment greet( --count 2 --directory tests/test_assignment/src --file hello-world.py"', + "description": 'Invalid GatorGrader check: "--description Call the "greet" function in hello - world.py MatchFileFragment--fragment greet(--count 2 E--directory tests / test_assignment / src--file hello - world.py\ ', + "options": { + "Fragment": "greet(", + "Count": "2", + "Directory": "tests/test_assignment/src", + "File": "hello-world.py", + }, "status": False, - "Fragment": "greet(", - "Count": "2", - "Directory": "tests/test_assignment/src", - "File": "hello-world.py", }, ], } From ba1dffe2dcce446b88157bae04ae789b59457f4a Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 13 Feb 2023 18:04:25 -0500 Subject: [PATCH 105/207] Fix: check box in failing section in md --- gatorgrade/output/output.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 66b594f3..fbbc6e8b 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -152,9 +152,9 @@ def create_markdown_report_file(json: dict) -> str: for check in failing_checks: # for each key val pair in the check dictionary if "description" in check: - markdown_contents += f"\n- [] {check['description']}" + markdown_contents += f"\n- [ ] {check['description']}" else: - markdown_contents += f"\n- [] {check['check']}" + markdown_contents += f"\n- [ ] {check['check']}" if "options" in check: for i in check.get("options"): From 2392b91e6920dcdb35a239a333da9b7d91632c42 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 13 Feb 2023 21:23:42 -0500 Subject: [PATCH 106/207] Fox: env variable create --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index fbbc6e8b..0043f16f 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -218,7 +218,7 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di "\n[red]Can't open or write the target file, check if you provide a valid path" ) elif report_params[0] == "env": - os.environ[report_params[2]] = str(report_output_data) + os.system(f"echo'{str(report_output_data)}'>>${report_params[2]}") else: rich.print("\n[red]The first argument of report has to be 'env' or 'file' ") From eebf48ef4ff05c1a932e7d69bf8dde235f23cb5e Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 13 Feb 2023 21:40:30 -0500 Subject: [PATCH 107/207] Fix: change back --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 0043f16f..fbbc6e8b 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -218,7 +218,7 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di "\n[red]Can't open or write the target file, check if you provide a valid path" ) elif report_params[0] == "env": - os.system(f"echo'{str(report_output_data)}'>>${report_params[2]}") + os.environ[report_params[2]] = str(report_output_data) else: rich.print("\n[red]The first argument of report has to be 'env' or 'file' ") From 79379aac9f592d39a0577348c9b584580f5fa621 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 13 Feb 2023 21:53:02 -0500 Subject: [PATCH 108/207] Fix: env variable creation in github action --- gatorgrade/output/output.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index fbbc6e8b..9a09d548 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -218,7 +218,12 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di "\n[red]Can't open or write the target file, check if you provide a valid path" ) elif report_params[0] == "env": - os.environ[report_params[2]] = str(report_output_data) + if report_params[2] == "GITHUB_STEP_SUMMARY": + env_file = os.getenv("GITHUB_STEP_SUMMARY") + with open(env_file, "a") as env_file: + env_file.write(str(report_output_data)) + else: + os.environ[report_params[2]] = str(report_output_data) else: rich.print("\n[red]The first argument of report has to be 'env' or 'file' ") From 82ef9c03b6e6c01741e61b62ad5046c7ffa171cf Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 13 Feb 2023 22:15:26 -0500 Subject: [PATCH 109/207] docs: add comment for --help --- gatorgrade/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index a5819c0c..42bbbd81 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -42,7 +42,8 @@ def gatorgrade( help="A tuple containing the following REQUIRED values: \ 1. The destination of the report (either file or env) \ 2. The format of the report (either json or md) \ - 3. the name of the file, if using a file destination.)", + 3. the name of the file or environment variable\ + 4. use 'env md GITHUB_STEP_SUMMARY' to create GitHub job summary in GitHub Action", ), ): """Run the GatorGrader checks in the specified gatorgrade.yml file.""" From 212dfcae129cecdca5de9a0fe352f331b79fac56 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 14 Feb 2023 09:40:36 -0500 Subject: [PATCH 110/207] feature: include project name in md output --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 66b594f3..0ee4a6ab 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -127,7 +127,7 @@ def create_markdown_report_file(json: dict) -> str: num_checks = len(json.get("checks")) # write the total, amt correct and percentage score to md file - markdown_contents += f"# Gatorgrade Insights\n\n**Amount Correct:** {(json.get('amount_correct'))}/{num_checks}\n**Percentage Correct:** {(json.get('percentage_score'))}\n" + markdown_contents += f"# Gatorgrade Insights\n\n**Project Name:** {Path.cwd().name}\n**Amount Correct:** {(json.get('amount_correct'))}/{num_checks}\n**Percentage Correct:** {(json.get('percentage_score'))}\n" # split checks into passing and not passing for check in json.get("checks"): From e23d3537ab1059e425d2d72210922ac6f4a17788 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 14 Feb 2023 09:42:47 -0500 Subject: [PATCH 111/207] docs: update test case for md output change --- tests/output/test_output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 80c53efd..ab0cf3b6 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -333,7 +333,7 @@ def test_md_report_file_created_correctly(): report = ("file", "md", "insights.md") output.run_checks(checks, report) # check to make sure the created file matches the expected output - expected_file_contents = """# Gatorgrade Insights\n\n**Amount Correct:** 1/3\n**Percentage Correct:** 33\n\n## Passing Checks""" + expected_file_contents = """# Gatorgrade Insights\n\n**Project Name:** gatorgrade\n**Amount Correct:** 1/3\n**Percentage Correct:** 33\n\n## Passing Checks""" file = open("insights.md", "r") file_contents = file.read() From 37129d959a8712c70902598ff0ef432914ca5715 Mon Sep 17 00:00:00 2001 From: burgess01 Date: Tue, 14 Feb 2023 10:16:23 -0500 Subject: [PATCH 112/207] feature: combine amt and % lines, fix tests --- gatorgrade/output/output.py | 2 +- tests/output/test_output.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 3de50f1a..d8458a83 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -127,7 +127,7 @@ def create_markdown_report_file(json: dict) -> str: num_checks = len(json.get("checks")) # write the total, amt correct and percentage score to md file - markdown_contents += f"# Gatorgrade Insights\n\n**Project Name:** {Path.cwd().name}\n**Amount Correct:** {(json.get('amount_correct'))}/{num_checks}\n**Percentage Correct:** {(json.get('percentage_score'))}\n" + markdown_contents += f"# Gatorgrade Insights\n\n**Project Name:** {Path.cwd().name}\n**Amount Correct:** {(json.get('amount_correct'))}/{num_checks} ({(json.get('percentage_score'))}%)\n" # split checks into passing and not passing for check in json.get("checks"): diff --git a/tests/output/test_output.py b/tests/output/test_output.py index ab0cf3b6..2b7e240b 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -333,7 +333,7 @@ def test_md_report_file_created_correctly(): report = ("file", "md", "insights.md") output.run_checks(checks, report) # check to make sure the created file matches the expected output - expected_file_contents = """# Gatorgrade Insights\n\n**Project Name:** gatorgrade\n**Amount Correct:** 1/3\n**Percentage Correct:** 33\n\n## Passing Checks""" + expected_file_contents = """# Gatorgrade Insights\n\n**Project Name:** gatorgrade\n**Amount Correct:** 1/3 (33%)\n\n## Passing Checks""" file = open("insights.md", "r") file_contents = file.read() From 368eadf4249bacf85e32ea7309cae0e9c16f95b4 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Sun, 19 Feb 2023 15:36:19 -0500 Subject: [PATCH 113/207] bug: fix display diagnosis msg in terminal --- gatorgrade/output/check_result.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gatorgrade/output/check_result.py b/gatorgrade/output/check_result.py index 8a844d34..d1f18551 100644 --- a/gatorgrade/output/check_result.py +++ b/gatorgrade/output/check_result.py @@ -37,7 +37,7 @@ def display_result(self, show_diagnostic: bool = False) -> str: icon_color = "green" if self.passed else "red" message = f"[{icon_color}]{icon}[/] {self.description}" if not self.passed and show_diagnostic: - message = f"[yellow] → {self.diagnostic}" + message += f"\n[yellow] → {self.diagnostic}" return message def __str__(self, show_diagnostic: bool = False) -> str: @@ -61,5 +61,5 @@ def print(self, show_diagnostic: bool = False) -> None: show_diagnostic: If true, show the diagnostic message if the check has failed. Defaults to false. """ - message = self.display_result() + message = self.display_result(show_diagnostic) rich.print(message) From 27703c6cb0fa19f7fe9add4edecc23b7a750c742 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Sat, 25 Feb 2023 13:05:46 -0500 Subject: [PATCH 114/207] Feat: add diagnostic message in js and md output To align with the new feature of diagnosis in the terminal output, the json --- gatorgrade/output/output.py | 4 ++++ tests/output/test_output.py | 2 ++ 2 files changed, 6 insertions(+) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index d8458a83..cc13c411 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -105,6 +105,8 @@ def create_report_json( # grab all of the information in it and add it to the checks list results_json = checkResults[i].json_info results_json["status"] = checkResults[i].passed + if not checkResults[i].passed: + results_json["diagnostic"] = checkResults[i].diagnostic checks_list.append(results_json) # create the dictionary for all of the check information @@ -179,6 +181,8 @@ def create_markdown_report_file(json: dict) -> str: elif "command" in check: val = check["command"] markdown_contents += f"\n\t- **command:** {val}" + if 'diagnostic' in check: + markdown_contents += f"\n\t- **diagnostic:** {check['diagnostic']}" markdown_contents += "\n" return markdown_contents diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 2b7e240b..325068ea 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -246,6 +246,7 @@ def test_json_report_file_created_correctly(): "File": "hello-world.py", }, "status": False, + "diagnostic": "Found 0 fragment(s) in the hello-world.py or the output while expecting exactly 1", }, { "description": 'Invalid GatorGrader check: "--description Call the "greet" function in hello - world.py MatchFileFragment--fragment greet(--count 2 E--directory tests / test_assignment / src--file hello - world.py\ ', @@ -256,6 +257,7 @@ def test_json_report_file_created_correctly(): "File": "hello-world.py", }, "status": False, + "diagnostic":"\"\" thrown by GatorGrader", }, ], } From 9727e6ef4bb0b5a0ef3133a0dc0b7d47e388fe74 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Sat, 25 Feb 2023 13:12:00 -0500 Subject: [PATCH 115/207] Factor: lint fix --- gatorgrade/output/output.py | 2 +- tests/output/test_output.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index cc13c411..1dd61632 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -181,7 +181,7 @@ def create_markdown_report_file(json: dict) -> str: elif "command" in check: val = check["command"] markdown_contents += f"\n\t- **command:** {val}" - if 'diagnostic' in check: + if "diagnostic" in check: markdown_contents += f"\n\t- **diagnostic:** {check['diagnostic']}" markdown_contents += "\n" diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 325068ea..c1104823 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -257,7 +257,7 @@ def test_json_report_file_created_correctly(): "File": "hello-world.py", }, "status": False, - "diagnostic":"\"\" thrown by GatorGrader", + "diagnostic": "\"\" thrown by GatorGrader", }, ], } From d90ea1af2e1bcbd34885035531bee2f95ba90abe Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 15 Mar 2023 17:37:07 -0400 Subject: [PATCH 116/207] Delete malicious link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fe2fb0b0..43e84afc 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ example of a GatorGrader check that should be run in the global context). To configure GatorGrader checks to run within a file context, specify the path to the file as a key (or nested keys) before specifying the GatorGrader checks. For each GatorGrader check, define a `description` to print in the -output, the name of the `check`, and any [`options` specific to the GatorGrader check](https://www.gatorgrader.org/ember). +output, the name of the `check`, and any `options` specific to the GatorGrader check. ```yml - src: From b492c284e5e707bfe34498f9cbbaa596c8ab5acf Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 15 Mar 2023 17:37:34 -0400 Subject: [PATCH 117/207] Add new hint --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 43e84afc..2d685ee8 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ where `` is a list of relative paths to files or folders you want to include in the `gatorgrade.yml` file. These paths must correspond to existing files or folders in the current directory. Any given folders will be expanded to the files they contain. Please note that files and folders that -start with `__` or `.` and empty folders will be automatically ignored. +start with `__` (double underscore) or `.` and empty folders will be automatically ignored. ## Contributing to GatorGrade From 41e5675bc8976632757269768d927d8895902b55 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 15 Mar 2023 17:39:54 -0400 Subject: [PATCH 118/207] Factor: Fix markdown lint --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2d685ee8..bed7c43a 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,8 @@ where `` is a list of relative paths to files or folders you want to include in the `gatorgrade.yml` file. These paths must correspond to existing files or folders in the current directory. Any given folders will be expanded to the files they contain. Please note that files and folders that -start with `__` (double underscore) or `.` and empty folders will be automatically ignored. +start with `__` (double underscore) or `.` and empty folders will be automatically +ignored. ## Contributing to GatorGrade From 900fad404e298b1d2b05a2b44b6b02be3d3d57cf Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 15 Mar 2023 17:47:56 -0400 Subject: [PATCH 119/207] Docs: remove meangingless hint --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index bed7c43a..43e84afc 100644 --- a/README.md +++ b/README.md @@ -106,8 +106,7 @@ where `` is a list of relative paths to files or folders you want to include in the `gatorgrade.yml` file. These paths must correspond to existing files or folders in the current directory. Any given folders will be expanded to the files they contain. Please note that files and folders that -start with `__` (double underscore) or `.` and empty folders will be automatically -ignored. +start with `__` or `.` and empty folders will be automatically ignored. ## Contributing to GatorGrade From 0063953fdf5ba698ec4a9e3e75a6fea9f6ed1aa2 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 22 May 2023 14:41:56 -0400 Subject: [PATCH 120/207] Bug: Upgrade poetry ver for http incompatibility --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 30fcffbc..ddca661f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -27,7 +27,7 @@ jobs: - name: Install Poetry uses: Gr1N/setup-poetry@v7 with: - poetry-version: 1.1.13 + poetry-version: 1.4.2 - name: Setup Poetry run: | poetry --version From 2982b96cf7481aded42baeb88cc7b0c5814174b8 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 22 May 2023 14:45:10 -0400 Subject: [PATCH 121/207] Bug: pin urll3 <=2.0 --- .github/workflows/main.yml | 2 +- poetry.lock | 26 +++++++++++++++++++++----- pyproject.toml | 1 + 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ddca661f..2ef0e454 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -27,7 +27,7 @@ jobs: - name: Install Poetry uses: Gr1N/setup-poetry@v7 with: - poetry-version: 1.4.2 + poetry-version: 1.2.1 - name: Setup Poetry run: | poetry --version diff --git a/poetry.lock b/poetry.lock index 63926669..1398bc72 100644 --- a/poetry.lock +++ b/poetry.lock @@ -25,6 +25,7 @@ python-versions = "*" [package.dependencies] six = ">=1.6.1,<2.0" +wheel = ">=0.23.0,<1.0" [[package]] name = "attrs" @@ -922,11 +923,11 @@ python-versions = ">=3.7" [[package]] name = "urllib3" -version = "1.26.12" +version = "1.26.15" 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" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] @@ -944,6 +945,17 @@ python-versions = ">=3.6" [package.extras] watchmedo = ["PyYAML (>=3.10)"] +[[package]] +name = "wheel" +version = "0.40.0" +description = "A built-package format for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest (>=6.0.0)"] + [[package]] name = "wrapt" version = "1.14.1" @@ -967,7 +979,7 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "1.1" python-versions = ">=3.7.2,<4.0" -content-hash = "745764366191be2cf495072bee0fe1c94fad711bdfd962cfa831085aacd9e56d" +content-hash = "9863a5a8a526c0bc3db80fb5863a842f756895c74d10770410b8061f894c1b4f" [metadata.files] astroid = [ @@ -1506,8 +1518,8 @@ typing-extensions = [ {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, ] urllib3 = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, ] watchdog = [ {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"}, @@ -1536,6 +1548,10 @@ watchdog = [ {file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"}, {file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"}, ] +wheel = [ + {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, + {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, +] 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"}, diff --git a/pyproject.toml b/pyproject.toml index 294ce6c5..35b6667b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ PyYAML = "^6.0" gatorgrader = "^1.1.1" rich = "^12.5.1" typer = {extras = ["all"], version = "^0.6.1"} +urllib3 = "<=2.0" [tool.poetry.dev-dependencies] taskipy = "^1.10.1" From 9cc0dd4bb4dee6b16931acfff3400d5b61757b57 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 22 May 2023 15:09:50 -0400 Subject: [PATCH 122/207] Bug: pin urllib3 lower than 2 by pip --- .github/workflows/main.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2ef0e454..3f72523d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,6 +24,10 @@ jobs: id: setup-python with: python-version: 3.7 + - name: Install Dependency + run: | + python -m pip install --upgrade pip + pip install 'urllib3<2' - name: Install Poetry uses: Gr1N/setup-poetry@v7 with: From e4b5f8a2aa823ec49ed3d7074690038dbeaade39 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 22 May 2023 15:15:43 -0400 Subject: [PATCH 123/207] Bug: Upgrade Poetry version to newest Try out newest poetry build to fix bug http requests has no attribute strict --- .github/workflows/main.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3f72523d..e4607a22 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,14 +24,14 @@ jobs: id: setup-python with: python-version: 3.7 - - name: Install Dependency - run: | - python -m pip install --upgrade pip - pip install 'urllib3<2' + # - name: Install Dependency + # run: | + # python -m pip install --upgrade pip + # pip install 'urllib3<2' - name: Install Poetry uses: Gr1N/setup-poetry@v7 with: - poetry-version: 1.2.1 + poetry-version: 1.4.2 - name: Setup Poetry run: | poetry --version @@ -91,7 +91,7 @@ jobs: - name: Install Poetry uses: Gr1N/setup-poetry@v7 with: - poetry-version: 1.1.13 + poetry-version: 1.4.2 - name: Setup Poetry run: | poetry --version From b87dcb03da04875177f7bddf714bd46dae712a0f Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Mon, 22 May 2023 15:39:00 -0400 Subject: [PATCH 124/207] Factor: Remove useless comment --- .github/workflows/main.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e4607a22..8159ed65 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,10 +24,6 @@ jobs: id: setup-python with: python-version: 3.7 - # - name: Install Dependency - # run: | - # python -m pip install --upgrade pip - # pip install 'urllib3<2' - name: Install Poetry uses: Gr1N/setup-poetry@v7 with: From 4c4a911fe7231ef97920342c9285e40fd2ca0767 Mon Sep 17 00:00:00 2001 From: Yanqiao Chen Date: Tue, 23 May 2023 10:48:50 -0400 Subject: [PATCH 125/207] Bug: Remove urllab3 dep in pyproject.toml Specifying urllab3 in pyproject.toml doesn't help with the Requests bug. Delete it --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 35b6667b..294ce6c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,6 @@ PyYAML = "^6.0" gatorgrader = "^1.1.1" rich = "^12.5.1" typer = {extras = ["all"], version = "^0.6.1"} -urllib3 = "<=2.0" [tool.poetry.dev-dependencies] taskipy = "^1.10.1" From 5148d74abae77ee3bc312ff019ad84f1f825f05d Mon Sep 17 00:00:00 2001 From: Yanqiao Chen Date: Tue, 23 May 2023 10:50:11 -0400 Subject: [PATCH 126/207] Feat: Upgrade Poetry to 1.5.0 Upgrade Poetry in the workflow/main.yml to the newest version 1.5.0 --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8159ed65..e2e0937e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -27,7 +27,7 @@ jobs: - name: Install Poetry uses: Gr1N/setup-poetry@v7 with: - poetry-version: 1.4.2 + poetry-version: 1.5.0 - name: Setup Poetry run: | poetry --version @@ -87,7 +87,7 @@ jobs: - name: Install Poetry uses: Gr1N/setup-poetry@v7 with: - poetry-version: 1.4.2 + poetry-version: 1.5.0 - name: Setup Poetry run: | poetry --version From e66535f96a6e3db14d4ff83330e6dce74618efee Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 7 Jun 2023 10:09:28 -0400 Subject: [PATCH 127/207] Bug: upgrade setup-poetry setup-poetry V7 fails for HTTP request 404 --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e2e0937e..76704a15 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,7 +25,7 @@ jobs: with: python-version: 3.7 - name: Install Poetry - uses: Gr1N/setup-poetry@v7 + uses: Gr1N/setup-poetry@v8 with: poetry-version: 1.5.0 - name: Setup Poetry @@ -85,7 +85,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Install Poetry - uses: Gr1N/setup-poetry@v7 + uses: Gr1N/setup-poetry@v8 with: poetry-version: 1.5.0 - name: Setup Poetry From dff448f3b99ffa93fafd9194a73be6f554aef48b Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Fri, 23 Jun 2023 14:58:25 -0400 Subject: [PATCH 128/207] Bug: mkdocs poetry update to v8 --- .github/workflows/mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mkdocs.yml b/.github/workflows/mkdocs.yml index 91c6fb90..f8d62647 100644 --- a/.github/workflows/mkdocs.yml +++ b/.github/workflows/mkdocs.yml @@ -24,7 +24,7 @@ jobs: with: python-version: 3.9 - name: Install Poetry - uses: Gr1N/setup-poetry@v7 + uses: Gr1N/setup-poetry@v8 - name: Setup Poetry run: | poetry config virtualenvs.create true From 9b07fda3a2ee4052495dbf215e23ad01968cd799 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Fri, 23 Jun 2023 15:52:00 -0400 Subject: [PATCH 129/207] Refac: distinguish json report from md report json report and md report used to share the same environment variable. Set two different variables now as we may need both of them in the future code --- gatorgrade/output/output.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 1dd61632..15e37874 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -188,7 +188,9 @@ def create_markdown_report_file(json: dict) -> str: return markdown_contents -def configure_report(report_params: Tuple[str, str, str], report_output_data: dict): +def configure_report( + report_params: Tuple[str, str, str], report_output_data_json: dict +): """Put together the contents of the report depending on the inputs of the user. Args: @@ -200,7 +202,7 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di """ # if the user wants markdown, convert the json into md if report_params[1] == "md": - report_output_data = create_markdown_report_file(report_output_data) + report_output_data_md = create_markdown_report_file(report_output_data_json) # if the user wants the data stored in a file: if report_params[0] == "file": @@ -214,9 +216,9 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di else: with open(report_params[2], "w", encoding="utf-8") as file: if report_params[1] == "json": - file.write(json.dumps(report_output_data)) + file.write(json.dumps(report_output_data_json)) else: - file.write(str(report_output_data)) + file.write(str(report_output_data_md)) except: rich.print( "\n[red]Can't open or write the target file, check if you provide a valid path" @@ -224,10 +226,6 @@ def configure_report(report_params: Tuple[str, str, str], report_output_data: di elif report_params[0] == "env": if report_params[2] == "GITHUB_STEP_SUMMARY": env_file = os.getenv("GITHUB_STEP_SUMMARY") - with open(env_file, "a") as env_file: - env_file.write(str(report_output_data)) - else: - os.environ[report_params[2]] = str(report_output_data) else: rich.print("\n[red]The first argument of report has to be 'env' or 'file' ") From dd6fdb19e55e4ea7d8feb6e26b9331f93a7e4e5d Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Fri, 23 Jun 2023 15:52:57 -0400 Subject: [PATCH 130/207] Feat: add json report in the github env add json report in the github env for the future data collection --- gatorgrade/output/output.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 15e37874..a2c887eb 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -226,6 +226,23 @@ def configure_report( elif report_params[0] == "env": if report_params[2] == "GITHUB_STEP_SUMMARY": env_file = os.getenv("GITHUB_STEP_SUMMARY") + with open(env_file, "w") as env_file: + if report_params[1] == "json": + env_file.write(json.dumps(report_output_data_json)) + else: + env_file.write(str(report_output_data_md)) + else: + os.environ[report_params[2]] = ( + str(report_output_data_md) + if report_params[1] == "md" + else json.dumps(report_output_data_json) + ) + + # Add json report into the GITHUB_ENV environment variable for data collection purpose + env_file = os.getenv("GITHUB_ENV") + with open(env_file, "a") as myfile: + myfile.write(f"JSON_REPORT={report_output_data_json}") + # Add env else: rich.print("\n[red]The first argument of report has to be 'env' or 'file' ") From 980e0dd4b72a436a1779e2ee1f13bc534c30899a Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Fri, 23 Jun 2023 18:45:58 -0400 Subject: [PATCH 131/207] update poetry build to v8 in publish.yml --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 737aa448..6c4aee1f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -16,7 +16,7 @@ jobs: with: python-version: '3.7' - name: Install Poetry - uses: Gr1N/setup-poetry@v7 + uses: Gr1N/setup-poetry@v8 - name: Publish run: | poetry version ${GITHUB_REF##*/v} From 7e1851a15ab8a34836ce6d344c466fa693dc7cc4 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Sat, 24 Jun 2023 16:31:13 -0400 Subject: [PATCH 132/207] Refact: put file write code into a func file write related code is used more than 3 times, put it into a function to make the design dryer --- gatorgrade/output/output.py | 81 +++++++++++++++++++------------------ tests/output/test_output.py | 7 ++-- 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index a2c887eb..d2da4563 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -200,51 +200,54 @@ def configure_report( report_params[2]: name of the file or env report_output_data: the json dictionary that will be used or converted to md """ - # if the user wants markdown, convert the json into md - if report_params[1] == "md": + report_format = report_params[0] + report_type = report_params[1] + report_name = report_params[2] + if report_type != "json" and report_type != "md": + raise ValueError( + "\n[red]The second argument of report has to be 'md' or 'json' " + ) + + # if the user wants markdown, get markdown content based on json + if report_type == "md": report_output_data_md = create_markdown_report_file(report_output_data_json) # if the user wants the data stored in a file: - if report_params[0] == "file": - # try to store it in that file - try: - # Second argument has to be json or md - if report_params[1] != "json" and report_params[1] != "md": - rich.print( - "\n[red]The second argument of report has to be 'md' or 'json' " - ) - else: - with open(report_params[2], "w", encoding="utf-8") as file: - if report_params[1] == "json": - file.write(json.dumps(report_output_data_json)) - else: - file.write(str(report_output_data_md)) - except: - rich.print( - "\n[red]Can't open or write the target file, check if you provide a valid path" - ) - elif report_params[0] == "env": - if report_params[2] == "GITHUB_STEP_SUMMARY": - env_file = os.getenv("GITHUB_STEP_SUMMARY") - with open(env_file, "w") as env_file: - if report_params[1] == "json": - env_file.write(json.dumps(report_output_data_json)) - else: - env_file.write(str(report_output_data_md)) + if report_format == "file": + if report_type == "md": + write_json_or_md_file(report_name, report_type, report_output_data_md) else: - os.environ[report_params[2]] = ( - str(report_output_data_md) - if report_params[1] == "md" - else json.dumps(report_output_data_json) - ) - - # Add json report into the GITHUB_ENV environment variable for data collection purpose - env_file = os.getenv("GITHUB_ENV") - with open(env_file, "a") as myfile: - myfile.write(f"JSON_REPORT={report_output_data_json}") + write_json_or_md_file(report_name, report_type, report_output_data_json) + + elif report_format == "env": + if report_name == "GITHUB_STEP_SUMMARY": + env_file = os.getenv("GITHUB_STEP_SUMMARY") + if report_type == "md": + write_json_or_md_file(env_file, report_type, report_output_data_md) + else: + write_json_or_md_file(env_file, report_type, report_output_data_json) # Add env else: - rich.print("\n[red]The first argument of report has to be 'env' or 'file' ") + raise ValueError( + "\n[red]The first argument of report has to be 'env' or 'file' " + ) + + +def write_json_or_md_file(file_name, content_type, content): + """Write a markdown or json file.""" + # try to store content in a file with user chosen format + try: + # Second argument has to be json or md + + with open(file_name, "w", encoding="utf-8") as file: + if content_type == "json": + file.write(json.dumps(content)) + else: + file.write(str(content)) + except: + raise ValueError( + "\n[red]Can't open or write the target file, check if you provide a valid path" + ) def run_checks( diff --git a/tests/output/test_output.py b/tests/output/test_output.py index c1104823..def515fc 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -4,6 +4,8 @@ import os import subprocess +import pytest + from gatorgrade.input.checks import GatorGraderCheck from gatorgrade.input.checks import ShellCheck from gatorgrade.output import output @@ -403,6 +405,5 @@ def test_print_error_with_invalid_report_path(capsys): ), ] report = ("file", "md", "invalid_path/insight.md") - output.run_checks(checks, report) - out, _ = capsys.readouterr() - assert "Can't open or write" in out + with pytest.raises(ValueError): + output.run_checks(checks, report) From 21273ae43ac58fca9a6f4cbcd3ae5e1264bbf0cf Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Sat, 24 Jun 2023 16:31:59 -0400 Subject: [PATCH 133/207] Add new test for the refactor --- tests/test_generate.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_generate.py b/tests/test_generate.py index 4a762c05..45715a95 100644 --- a/tests/test_generate.py +++ b/tests/test_generate.py @@ -93,7 +93,8 @@ def test_generate_should_produce_warning_message_when_some_user_inputted_files_d tmp_path, capsys ): """Check if gatorgrade.yml is created with existing file paths - when some user-provided file paths don't exist and if generate.py outputs a warning message""" + when some user-provided file paths don't exist and if generate.py outputs a warning message + """ # Given an assignment directory that contains some folders root_directory = tmp_path / "Practical-02" From 4d0711452754de61e4483fdfa8eb4933e328f003 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Sat, 24 Jun 2023 16:32:24 -0400 Subject: [PATCH 134/207] Feat: always add json_report into github_env --- gatorgrade/output/output.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index d2da4563..5d95e97d 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -226,6 +226,11 @@ def configure_report( write_json_or_md_file(env_file, report_type, report_output_data_md) else: write_json_or_md_file(env_file, report_type, report_output_data_json) + + # Add json report into the GITHUB_ENV environment variable for data collection purpose + env_file = os.getenv("GITHUB_ENV") + with open(env_file, "a") as myfile: + myfile.write(f"JSON_REPORT={report_output_data_json}") # Add env else: raise ValueError( From 0ef2833f3f5b9e67100ec206513dab0716ff14d8 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Sat, 24 Jun 2023 17:49:35 -0400 Subject: [PATCH 135/207] Feat: json dump replace dumps with test dumps write all the content in the first line of json file, which is bad. Replace it with dump to add indentation --- gatorgrade/output/output.py | 8 ++++---- tests/output/test_output.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 5d95e97d..1c4a7fed 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -203,7 +203,7 @@ def configure_report( report_format = report_params[0] report_type = report_params[1] report_name = report_params[2] - if report_type != "json" and report_type != "md": + if report_type not in ("json", "md"): raise ValueError( "\n[red]The second argument of report has to be 'md' or 'json' " ) @@ -246,13 +246,13 @@ def write_json_or_md_file(file_name, content_type, content): with open(file_name, "w", encoding="utf-8") as file: if content_type == "json": - file.write(json.dumps(content)) + json.dump(content, file, indent=4) else: file.write(str(content)) - except: + except Exception as e: raise ValueError( "\n[red]Can't open or write the target file, check if you provide a valid path" - ) + ) from e def run_checks( diff --git a/tests/output/test_output.py b/tests/output/test_output.py index def515fc..50a3a3ff 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -263,13 +263,13 @@ def test_json_report_file_created_correctly(): }, ], } - expected_file_contents = json.dumps(expected_file_contents_dict) + expected_file_contents = expected_file_contents_dict file = open("insights.json", "r") - file_contents = file.read() + file_contents = json.load(file) file.close() os.remove("insights.json") - assert file_contents in expected_file_contents + assert file_contents == expected_file_contents def test_md_report_file_created_correctly(): From 5b189fd8df159e7ea0955655ee36952cb27defa8 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Sat, 24 Jun 2023 18:19:49 -0400 Subject: [PATCH 136/207] Test: add test for file write related code --- gatorgrade/output/output.py | 1 + tests/output/test_output.py | 69 +++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 1c4a7fed..3034318a 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -249,6 +249,7 @@ def write_json_or_md_file(file_name, content_type, content): json.dump(content, file, indent=4) else: file.write(str(content)) + return True except Exception as e: raise ValueError( "\n[red]Can't open or write the target file, check if you provide a valid path" diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 50a3a3ff..55ef72c2 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -407,3 +407,72 @@ def test_print_error_with_invalid_report_path(capsys): report = ("file", "md", "invalid_path/insight.md") with pytest.raises(ValueError): output.run_checks(checks, report) + + +def test_throw_errors_if_report_type_not_md_nor_json(): + """Test the value error should be thrown if no md nor json is inputted.""" + checks = [ + ShellCheck( + description='Echo "Hello!"', + command='echo "hello"', + json_info={"description": "Echo 'Hello!'", "command": 'echo "hello"'}, + ), + GatorGraderCheck( + gg_args=[ + "--description", + "Complete all TODOs in hello-world.py", + "MatchFileFragment", + "--fragment", + "TODO", + "--count", + "1", + "--exact", + "--directory", + "tests/test_assignment/src", + "--file", + "hello-world.py", + ], + json_info={ + "description": "test", + "status": True, + "options": { + "file": "test.txt", + "directory": "tests/test_assignment/src", + }, + }, + ), + GatorGraderCheck( + gg_args=[ + "--description", + 'Call the "greet" function in hello-world.py', + "MatchFileFragment", + "--fragment", + "greet(", + "--count", + "2", + "--directory", + "tests/test_assignment/src", + "--file", + "hello-world.py", + ], + json_info={ + "description": "test", + "status": True, + "options": { + "file": "test.txt", + "directory": "tests/test_assignment/src", + }, + }, + ), + ] + report = ("file", "not_md_nor_json", "invalid_path") + with pytest.raises(ValueError): + output.run_checks(checks, report) + + +def test_write_md_and_json_correctly(tmp_path): + """Test process of writing is good for both json and md.""" + tmp_md = tmp_path / "test.md" + tmp_json = tmp_path / "test.json" + assert output.write_json_or_md_file(tmp_md, "md", "hello-world") + assert output.write_json_or_md_file(tmp_json, "json", "hello-world") From 269986fcf2fd5ab356652e93a6da790edc0f1f3a Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Tue, 27 Jun 2023 17:15:17 -0400 Subject: [PATCH 137/207] Bug: json dumps replaces str used to use dict type and failed as dict is not equal to json type. Now put json type into JSON_REPORT correctly --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 3034318a..809986ec 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -230,7 +230,7 @@ def configure_report( # Add json report into the GITHUB_ENV environment variable for data collection purpose env_file = os.getenv("GITHUB_ENV") with open(env_file, "a") as myfile: - myfile.write(f"JSON_REPORT={report_output_data_json}") + myfile.write(f"JSON_REPORT={json.dumps(report_output_data_json,indent=4)}") # Add env else: raise ValueError( From 8d555c78e008472218a56db3be8ee779da046912 Mon Sep 17 00:00:00 2001 From: Yanqiao Chen Date: Wed, 28 Jun 2023 11:48:58 -0400 Subject: [PATCH 138/207] Remove indent --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 809986ec..43021d09 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -230,7 +230,7 @@ def configure_report( # Add json report into the GITHUB_ENV environment variable for data collection purpose env_file = os.getenv("GITHUB_ENV") with open(env_file, "a") as myfile: - myfile.write(f"JSON_REPORT={json.dumps(report_output_data_json,indent=4)}") + myfile.write(f"JSON_REPORT={json.dumps(report_output_data_json)}") # Add env else: raise ValueError( From 29d9c4f205f5ffe306bf42e23096767a85fb34fd Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 5 Jul 2023 20:30:35 -0400 Subject: [PATCH 139/207] Feat: add path in json_inf of CheckResult It helps with identifying the file, path a command or check belongs to in the report --- gatorgrade/output/check_result.py | 2 ++ gatorgrade/output/output.py | 14 ++++++++++++++ tests/output/test_output.py | 5 +++++ 3 files changed, 21 insertions(+) diff --git a/gatorgrade/output/check_result.py b/gatorgrade/output/check_result.py index 46fa8b19..d53fa517 100644 --- a/gatorgrade/output/check_result.py +++ b/gatorgrade/output/check_result.py @@ -11,6 +11,7 @@ def __init__( passed: bool, description: str, json_info, + path: str = None, diagnostic: str = "No diagnostic message available", ): """Construct a CheckResult. @@ -26,6 +27,7 @@ def __init__( self.description = description self.json_info = json_info self.diagnostic = diagnostic + self.path = path def display_result(self, show_diagnostic: bool = False) -> str: """Print check's passed or failed status, description, and, optionally, diagnostic message. diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 43021d09..7498be30 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -65,6 +65,17 @@ def _run_gg_check(check: GatorGraderCheck) -> CheckResult: passed = result[1] description = result[0] diagnostic = result[2] + + # Fetch the path from gatorgrade arguments + # the path pattern are 4 consistent string in the list + # --dir `dir_name` --file `file_name` + file_path = None + for i in range(len(check.gg_args)): + if check.gg_args[i] == "--directory": + dir_name = check.gg_args[i + 1] + file_name = check.gg_args[i + 3] + file_path = os.path.join(dir_name, file_name) + break # If arguments are formatted incorrectly, catch the exception and # return it as the diagnostic message # Disable pylint to catch any type of exception thrown by GatorGrader @@ -72,11 +83,13 @@ def _run_gg_check(check: GatorGraderCheck) -> CheckResult: passed = False description = f'Invalid GatorGrader check: "{" ".join(check.gg_args)}"' diagnostic = f'"{command_exception.__class__}" thrown by GatorGrader' + file_path = None return CheckResult( passed=passed, description=description, json_info=check.json_info, diagnostic=diagnostic, + path=file_path, ) @@ -105,6 +118,7 @@ def create_report_json( # grab all of the information in it and add it to the checks list results_json = checkResults[i].json_info results_json["status"] = checkResults[i].passed + results_json["path"] = checkResults[i].path if not checkResults[i].passed: results_json["diagnostic"] = checkResults[i].diagnostic checks_list.append(results_json) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 55ef72c2..46aaa9fe 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -237,6 +237,7 @@ def test_json_report_file_created_correctly(): "options": { "command ": "echo 'hello'", }, + "path": None, "status": True, }, { @@ -248,6 +249,9 @@ def test_json_report_file_created_correctly(): "File": "hello-world.py", }, "status": False, + "path": os.path.join( + "tests", "test_assignment", "src", "hello-world.py" + ), "diagnostic": "Found 0 fragment(s) in the hello-world.py or the output while expecting exactly 1", }, { @@ -259,6 +263,7 @@ def test_json_report_file_created_correctly(): "File": "hello-world.py", }, "status": False, + "path": None, "diagnostic": "\"\" thrown by GatorGrader", }, ], From ebb536ad47e87393413e903507b517456cd07934 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 5 Jul 2023 20:33:33 -0400 Subject: [PATCH 140/207] Test: customized json inf will be stored in report --- tests/output/test_output.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 46aaa9fe..bc842d92 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -168,6 +168,7 @@ def test_json_report_file_created_correctly(): description="Echo 'Hello!'", command="echo 'hello'", json_info={ + "customized_key": "customized value", "description": "Echo'Hello!'", "options": { "command ": "echo 'hello'", @@ -191,6 +192,7 @@ def test_json_report_file_created_correctly(): ], json_info={ "description ": "Complete all TODOs in hello - world.py ", + "objective": "TODO", "options": { "Fragment ": "TODO ", "Count ": "1", @@ -234,6 +236,7 @@ def test_json_report_file_created_correctly(): "checks": [ { "description": "Echo'Hello!'", + "customized_key": "customized value", "options": { "command ": "echo 'hello'", }, @@ -242,6 +245,7 @@ def test_json_report_file_created_correctly(): }, { "description ": "Complete all TODOs in hello - world.py ", + "objective": "TODO", "options": { "Fragment ": "TODO ", "Count ": "1", From 3ce6ab53f70366849aa8d72e540006ca35b30069 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Wed, 5 Jul 2023 21:08:54 -0400 Subject: [PATCH 141/207] Bug: all front slash replacing back slash --- gatorgrade/output/output.py | 2 +- tests/output/test_output.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 7498be30..3d459052 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -74,7 +74,7 @@ def _run_gg_check(check: GatorGraderCheck) -> CheckResult: if check.gg_args[i] == "--directory": dir_name = check.gg_args[i + 1] file_name = check.gg_args[i + 3] - file_path = os.path.join(dir_name, file_name) + file_path = dir_name + "/" + file_name break # If arguments are formatted incorrectly, catch the exception and # return it as the diagnostic message diff --git a/tests/output/test_output.py b/tests/output/test_output.py index bc842d92..84cc8e58 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -253,9 +253,7 @@ def test_json_report_file_created_correctly(): "File": "hello-world.py", }, "status": False, - "path": os.path.join( - "tests", "test_assignment", "src", "hello-world.py" - ), + "path": "tests/test_assignment/src/hello-world.py", "diagnostic": "Found 0 fragment(s) in the hello-world.py or the output while expecting exactly 1", }, { From 7648537895bfbf67b1e6287e291901eef1f36cf3 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Thu, 6 Jul 2023 18:11:48 -0400 Subject: [PATCH 142/207] Bug: not have path attribute if path value is none --- gatorgrade/output/output.py | 3 ++- tests/output/test_output.py | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 3d459052..8645c091 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -118,7 +118,8 @@ def create_report_json( # grab all of the information in it and add it to the checks list results_json = checkResults[i].json_info results_json["status"] = checkResults[i].passed - results_json["path"] = checkResults[i].path + if checkResults[i].path: + results_json["path"] = checkResults[i].path if not checkResults[i].passed: results_json["diagnostic"] = checkResults[i].diagnostic checks_list.append(results_json) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 84cc8e58..3fd93474 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -240,7 +240,6 @@ def test_json_report_file_created_correctly(): "options": { "command ": "echo 'hello'", }, - "path": None, "status": True, }, { @@ -265,7 +264,6 @@ def test_json_report_file_created_correctly(): "File": "hello-world.py", }, "status": False, - "path": None, "diagnostic": "\"\" thrown by GatorGrader", }, ], From 7761afcb6200839e831c932d54400d83bd96e0f5 Mon Sep 17 00:00:00 2001 From: Yanqiao4396 Date: Thu, 6 Jul 2023 23:13:59 -0400 Subject: [PATCH 143/207] Feat: add current time to report --- gatorgrade/output/output.py | 10 ++++++++-- tests/output/test_output.py | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 8645c091..de99fb48 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -1,4 +1,5 @@ """Run checks and display whether each has passed or failed.""" +import datetime import json import os import subprocess @@ -108,11 +109,13 @@ def create_report_json( """ # create list to hold the key values for the dictionary that # will be converted into json - overall_key_list = ["amount_correct", "percentage_score", "checks"] + overall_key_list = ["amount_correct", "percentage_score", "report_time", "checks"] checks_list = [] overall_dict = {} + report_generation_time = datetime.datetime.now() + formatted_time = report_generation_time.strftime("%Y-%m-%d %H:%M:%S") # for each check: for i in range(len(checkResults)): # grab all of the information in it and add it to the checks list @@ -126,7 +129,10 @@ def create_report_json( # create the dictionary for all of the check information overall_dict = dict( - zip(overall_key_list, [passed_count, percent_passed, checks_list]) + zip( + overall_key_list, + [passed_count, percent_passed, formatted_time, checks_list], + ) ) return overall_dict diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 3fd93474..d9c3b94a 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -1,5 +1,6 @@ """Test suite for output_functions.py.""" +import datetime import json import os import subprocess @@ -10,6 +11,18 @@ from gatorgrade.input.checks import ShellCheck from gatorgrade.output import output +FAKE_TIME = datetime.datetime(2022, 1, 1, 10, 30, 0) + + +@pytest.fixture +def patch_datetime_now(monkeypatch): + class mydatetime: + @classmethod + def now(cls): + return FAKE_TIME + + monkeypatch.setattr(datetime, "datetime", mydatetime) + def test_run_checks_gg_check_should_show_passed(capsys): """Test that run_checks runs a GatorGrader check and prints that the check has passed.""" @@ -160,7 +173,7 @@ def test_run_checks_all_passed_prints_correct_summary(capsys): assert "Passed 3/3 (100%) of checks" in out -def test_json_report_file_created_correctly(): +def test_json_report_file_created_correctly(patch_datetime_now): """Test that with the cli input '--report file json insights.json' the file is created correctly.""" # given the following checks checks = [ @@ -233,6 +246,7 @@ def test_json_report_file_created_correctly(): expected_file_contents_dict = { "amount_correct": 1, "percentage_score": 33, + "report_time": FAKE_TIME.strftime("%Y-%m-%d %H:%M:%S"), "checks": [ { "description": "Echo'Hello!'", From 2131ff14430c68e08f8956b016c1d507b6c3ea3b Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Wed, 6 Dec 2023 17:49:53 -0500 Subject: [PATCH 144/207] chore: Start to use python-version 3.10 in publish.yml. --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 6c4aee1f..d94854b1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -14,7 +14,7 @@ jobs: - name: Set up Python 3.7 uses: actions/setup-python@v2 with: - python-version: '3.7' + python-version: '3.10' - name: Install Poetry uses: Gr1N/setup-poetry@v8 - name: Publish From ed361df90ec10a1dc28295ff544747f60d848ca4 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Wed, 6 Dec 2023 17:50:10 -0500 Subject: [PATCH 145/207] chore: Improve a name of a step in publish.yml. --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d94854b1..daac8589 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,7 +11,7 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v2 - - name: Set up Python 3.7 + - name: Set up Python 3.10 uses: actions/setup-python@v2 with: python-version: '3.10' From 965ea72d7999db70406127fffea87ced4754e34d Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Wed, 6 Dec 2023 17:52:17 -0500 Subject: [PATCH 146/207] chore: Add the poetry-version attribute to 1.5.0 in publish.yml --- .github/workflows/publish.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index daac8589..a2a07e8d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -17,6 +17,8 @@ jobs: python-version: '3.10' - name: Install Poetry uses: Gr1N/setup-poetry@v8 + with: + poetry-version: 1.5.0 - name: Publish run: | poetry version ${GITHUB_REF##*/v} From 4f315d99106fb6992a1b9f1655d0d8dd519c3a53 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Wed, 6 Dec 2023 18:01:10 -0500 Subject: [PATCH 147/207] chore: Adopt a different approach for installing poetry in publish.yml. --- .github/workflows/publish.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a2a07e8d..9f25e308 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,12 +15,9 @@ jobs: uses: actions/setup-python@v2 with: python-version: '3.10' - - name: Install Poetry - uses: Gr1N/setup-poetry@v8 - with: - poetry-version: 1.5.0 - name: Publish run: | + pip install poetry poetry version ${GITHUB_REF##*/v} poetry publish --build env: From c9ef4b2a1612bb50ac59bf6acb89f915b9428405 Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Tue, 24 Sep 2024 20:02:56 -0400 Subject: [PATCH 148/207] feat: added command printing code in output.py --- gatorgrade/output/output.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index de99fb48..c5cf8c91 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -289,30 +289,41 @@ def run_checks( checks: The list of shell and GatorGrader checks to run. """ results = [] + command_output = [] + + # command_output = "" # run each of the checks for check in checks: result = None # run a shell check; this means # that it is going to run a command # in the shell as a part of a check + # store the command that ran + command_output = None + if isinstance(check, ShellCheck): result = _run_shell_check(check) + command_output = check.command # run a check that GatorGrader implements elif isinstance(check, GatorGraderCheck): - result = _run_gg_check(check) + result = _run_gg_check(check) + # there were results from running checks # and thus they must be displayed if result is not None: result.print() - results.append(result) + results.append((result, command_output)) # determine if there are failures and then display them - failed_results = list(filter(lambda result: not result.passed, results)) - # only print failures list if there are failures to print + failed_results = list(filter(lambda result: not result[0].passed, results)) + # print failures list if there are failures to print + # and print what ShellCheck command that Gatorgrade ran if len(failed_results) > 0: print("\n-~- FAILURES -~-\n") for result in failed_results: - result.print(show_diagnostic=True) + result[0].print(show_diagnostic=True) + if result[1] is not None: + rich.print(f"[blue] → Here is the command that ran: [green]{result[1]}") # determine how many of the checks passed and then # compute the total percentage of checks passed passed_count = len(results) - len(failed_results) From 751c9adb663b2f94c2f5b4316d13a5bb5d675649 Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Tue, 24 Sep 2024 20:04:21 -0400 Subject: [PATCH 149/207] fix: deleted an extra variable assignment in output.py --- gatorgrade/output/output.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index c5cf8c91..4f9f4f72 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -289,8 +289,6 @@ def run_checks( checks: The list of shell and GatorGrader checks to run. """ results = [] - command_output = [] - # command_output = "" # run each of the checks for check in checks: From 14ebc2ae0f73878bc94f6edd326d0d0e2186e9fe Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Tue, 24 Sep 2024 20:06:01 -0400 Subject: [PATCH 150/207] fix: deleted extra comments in output.py --- gatorgrade/output/output.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 4f9f4f72..7d724e62 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -289,7 +289,6 @@ def run_checks( checks: The list of shell and GatorGrader checks to run. """ results = [] - # command_output = "" # run each of the checks for check in checks: result = None From 393a6672e4f92b2c98f77eb29e629fe8dada311a Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 27 Sep 2024 07:19:20 -0400 Subject: [PATCH 151/207] refactor: Make the diagnostics message for failing command shorter in gatorgrade/output/output.py. --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 7d724e62..420aa9e6 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -320,7 +320,7 @@ def run_checks( for result in failed_results: result[0].print(show_diagnostic=True) if result[1] is not None: - rich.print(f"[blue] → Here is the command that ran: [green]{result[1]}") + rich.print(f"[blue] → Command that failed: [green]{result[1]}") # determine how many of the checks passed and then # compute the total percentage of checks passed passed_count = len(results) - len(failed_results) From c432c93b45ef800eed929f479105f9e4a170f981 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 27 Sep 2024 07:19:45 -0400 Subject: [PATCH 152/207] chore: Update the poetry.lock file with new dependencies. --- poetry.lock | 1795 ++++++++++++++++++++++++++------------------------- 1 file changed, 921 insertions(+), 874 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1398bc72..7e533182 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,15 +1,20 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + [[package]] name = "astroid" -version = "2.12.11" +version = "2.15.8" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.7.2" +files = [ + {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, + {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, +] [package.dependencies] lazy-object-proxy = ">=1.4.0" typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} -typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} wrapt = [ {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, @@ -19,35 +24,37 @@ wrapt = [ name = "astunparse" version = "1.6.3" description = "An AST unparser for Python" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] [package.dependencies] six = ">=1.6.1,<2.0" wheel = ">=0.23.0,<1.0" -[[package]] -name = "attrs" -version = "22.1.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] - [[package]] name = "black" -version = "22.10.0" +version = "22.12.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] [package.dependencies] click = ">=8.0.0" @@ -68,36 +75,133 @@ uvloop = ["uvloop (>=0.15.2)"] name = "cached-property" version = "1.5.2" description = "A decorator for caching properties in classes." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, + {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, +] [[package]] name = "certifi" -version = "2022.9.24" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, +] [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false -python-versions = ">=3.6.0" - -[package.extras] -unicode_backport = ["unicodedata2"] +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -105,30 +209,97 @@ importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" -version = "0.4.5" +version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "commonmark" version = "0.9.1" description = "Python parser for the CommonMark Markdown spec" -category = "main" optional = false python-versions = "*" +files = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] [package.extras] test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "coverage" -version = "6.5.0" +version = "7.2.7" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, + {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, + {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, + {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, + {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, + {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, + {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, + {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, + {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, + {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, + {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, + {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, + {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, + {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, + {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, + {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, + {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, + {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, + {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, + {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, + {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, + {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, + {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, + {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, +] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} @@ -138,30 +309,67 @@ toml = ["tomli"] [[package]] name = "dill" -version = "0.3.5.1" -description = "serialize all of python" -category = "dev" +version = "0.3.7" +description = "serialize all of Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] [package.extras] graph = ["objgraph (>=1.7.2)"] +[[package]] +name = "dill" +version = "0.3.8" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + [[package]] name = "docopt" version = "0.6.2" description = "Pythonic argument parser, that will make you smile" -category = "main" optional = false python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] [[package]] name = "gatorgrader" version = "1.1.1" description = "Automated Grading Tool that Checks the Work of Writers and Programmers" -category = "main" optional = false python-versions = ">=3.7.2,<4.0" +files = [ + {file = "gatorgrader-1.1.1-py3-none-any.whl", hash = "sha256:5581fadb58e53ceb24a76c344ed211d0cd69ee22a987ac9861a83ec9a78dfe4e"}, + {file = "gatorgrader-1.1.1.tar.gz", hash = "sha256:7a08ad1a42d5caa4795f14474ed414759f7b16388cd02b7b3e787dcfb74501f8"}, +] [package.dependencies] commonmark = ">=0.9.1,<0.10.0" @@ -174,9 +382,12 @@ requests = ">=2.28.1,<3.0.0" name = "ghp-import" version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] [package.dependencies] python-dateutil = ">=2.8.1" @@ -186,56 +397,73 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "gitdb" -version = "4.0.9" +version = "4.0.11" description = "Git Object Database" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] [package.dependencies] smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.29" -description = "GitPython is a python library used to interact with Git repositories" -category = "main" +version = "3.1.43" +description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] [package.dependencies] gitdb = ">=4.0.1,<5" typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""} +[package.extras] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] + [[package]] name = "griffe" -version = "0.22.2" +version = "0.30.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "griffe-0.30.1-py3-none-any.whl", hash = "sha256:b2f3df6952995a6bebe19f797189d67aba7c860755d3d21cc80f64d076d0154c"}, + {file = "griffe-0.30.1.tar.gz", hash = "sha256:007cc11acd20becf1bb8f826419a52b9d403bbad9d8c8535699f5440ddc0a109"}, +] [package.dependencies] cached-property = {version = "*", markers = "python_version < \"3.8\""} - -[package.extras] -async = ["aiofiles (>=0.7,<1.0)"] +colorama = ">=0.4" [[package]] name = "idna" -version = "3.4" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] [[package]] name = "importlib-metadata" -version = "5.0.0" +version = "4.13.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, + {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, +] [package.dependencies] typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} @@ -248,33 +476,42 @@ testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packag [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "isort" -version = "5.10.1" +version = "5.11.5" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false -python-versions = ">=3.6.1,<4.0" +python-versions = ">=3.7.0" +files = [ + {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"}, + {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"}, +] [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] -requirements_deprecated_finder = ["pip-api", "pipreqs"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.4" description = "A very fast and expressive template engine." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -284,57 +521,168 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "lazy-object-proxy" -version = "1.7.1" +version = "1.9.0" description = "A fast and thorough lazy object proxy." -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] [[package]] name = "markdown" -version = "3.3.7" -description = "Python implementation of Markdown." -category = "dev" +version = "3.4.4" +description = "Python implementation of John Gruber's Markdown." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "Markdown-3.4.4-py3-none-any.whl", hash = "sha256:a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941"}, + {file = "Markdown-3.4.4.tar.gz", hash = "sha256:225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6"}, +] [package.dependencies] importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} [package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.0)", "mkdocs-nature (>=0.4)"] testing = ["coverage", "pyyaml"] [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] [[package]] name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] [[package]] name = "mergedeep" version = "1.3.4" description = "A deep merge function for 🐍." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] [[package]] name = "mkdocs" -version = "1.4.1" +version = "1.5.3" description = "Project documentation with Markdown." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, + {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, +] [package.dependencies] click = ">=7.0" @@ -342,9 +690,12 @@ colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} ghp-import = ">=1.0" importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} jinja2 = ">=2.11.1" -markdown = ">=3.2.1,<3.4" +markdown = ">=3.2.1" +markupsafe = ">=2.0.1" mergedeep = ">=1.3.4" packaging = ">=20.5" +pathspec = ">=0.11.1" +platformdirs = ">=2.2.0" pyyaml = ">=5.1" pyyaml-env-tag = ">=0.1" typing-extensions = {version = ">=3.10", markers = "python_version < \"3.8\""} @@ -352,15 +703,18 @@ watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] -min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autorefs" version = "0.4.1" description = "Automatically link across pages in MkDocs." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, + {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, +] [package.dependencies] Markdown = ">=3.3" @@ -370,9 +724,12 @@ mkdocs = ">=1.1" name = "mkdocs-gen-files" version = "0.3.5" description = "MkDocs plugin to programmatically generate documentation pages during the build" -category = "dev" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "mkdocs-gen-files-0.3.5.tar.gz", hash = "sha256:d90d9e1676531a0bb96b1287dc28aa41162986de4dc3c00400214724761ff6ef"}, + {file = "mkdocs_gen_files-0.3.5-py3-none-any.whl", hash = "sha256:69562fddc662482e8f54a00a8b4ede5166ad5384ae4dbb0469f1f338ef3285ca"}, +] [package.dependencies] mkdocs = ">=1.0.3,<2.0.0" @@ -381,57 +738,72 @@ mkdocs = ">=1.0.3,<2.0.0" name = "mkdocs-literate-nav" version = "0.4.1" description = "MkDocs plugin to specify the navigation in Markdown instead of YAML" -category = "dev" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "mkdocs-literate-nav-0.4.1.tar.gz", hash = "sha256:9efe26b662f2f901cae5807bfd51446d30ea7e033c2bc43a15d6282c7dfac1ab"}, + {file = "mkdocs_literate_nav-0.4.1-py3-none-any.whl", hash = "sha256:a4b761792ba21defbe2dfd5e0de6ba451639e1ca0f0661c37eda83cc6261e4f9"}, +] [package.dependencies] mkdocs = ">=1.0.3,<2.0.0" [[package]] name = "mkdocs-material" -version = "8.5.6" +version = "8.5.11" description = "Documentation that simply works" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocs_material-8.5.11-py3-none-any.whl", hash = "sha256:c907b4b052240a5778074a30a78f31a1f8ff82d7012356dc26898b97559f082e"}, + {file = "mkdocs_material-8.5.11.tar.gz", hash = "sha256:b0ea0513fd8cab323e8a825d6692ea07fa83e917bb5db042e523afecc7064ab7"}, +] [package.dependencies] jinja2 = ">=3.0.2" markdown = ">=3.2" mkdocs = ">=1.4.0" -mkdocs-material-extensions = ">=1.0.3" +mkdocs-material-extensions = ">=1.1" pygments = ">=2.12" pymdown-extensions = ">=9.4" requests = ">=2.26" [[package]] name = "mkdocs-material-extensions" -version = "1.0.3" -description = "Extension pack for Python Markdown." -category = "dev" +version = "1.2" +description = "Extension pack for Python Markdown and MkDocs Material." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "mkdocs_material_extensions-1.2-py3-none-any.whl", hash = "sha256:c767bd6d6305f6420a50f0b541b0c9966d52068839af97029be14443849fb8a1"}, + {file = "mkdocs_material_extensions-1.2.tar.gz", hash = "sha256:27e2d1ed2d031426a6e10d5ea06989d67e90bb02acd588bc5673106b5ee5eedf"}, +] [[package]] name = "mkdocs-typer" version = "0.0.2" description = "An MkDocs extension to generate documentation for Typer command line applications" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocs_typer-0.0.2-py3-none-any.whl", hash = "sha256:24d88407b458403db47a953621a31a29f37e781015925d929e783a4719203991"}, + {file = "mkdocs_typer-0.0.2.tar.gz", hash = "sha256:150e1320a02cff86deea55a173da1d72728a9801742b2deba2926d1a33d36c07"}, +] [package.dependencies] -markdown = ">=3.0.0,<4.0.0" -typer = "<1.0.0" +markdown = "==3.*" +typer = "==0.*" [[package]] name = "mkdocstrings" version = "0.18.1" description = "Automatic documentation from sources, for MkDocs." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocstrings-0.18.1-py3-none-any.whl", hash = "sha256:4053929356df8cd69ed32eef71d8f676a472ef72980c9ffd4f933ead1debcdad"}, + {file = "mkdocstrings-0.18.1.tar.gz", hash = "sha256:fb7c91ce7e3ab70488d3fa6c073a4f827cdc319042f682ef8ea95459790d64fc"}, +] [package.dependencies] Jinja2 = ">=2.11.1" @@ -452,9 +824,12 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] name = "mkdocstrings-python" version = "0.6.6" description = "A Python handler for mkdocstrings." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocstrings-python-0.6.6.tar.gz", hash = "sha256:37281696b9f199624ae420e0625b6659b7fdfbea736618bce7fd978682dea3b1"}, + {file = "mkdocstrings_python-0.6.6-py3-none-any.whl", hash = "sha256:c118438d3cb4b14c492a51d109f4e5b27ab06ba19b099d624430dfd904926152"}, +] [package.dependencies] griffe = ">=0.11.1" @@ -464,9 +839,12 @@ mkdocstrings = ">=0.18" name = "mkdocstrings-python-legacy" version = "0.2.2" description = "A legacy Python handler for mkdocstrings." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocstrings-python-legacy-0.2.2.tar.gz", hash = "sha256:f0e7ec6a19750581b752acb38f6b32fcd1efe006f14f6703125d2c2c9a5c6f02"}, + {file = "mkdocstrings_python_legacy-0.2.2-py3-none-any.whl", hash = "sha256:379107a3a5b8db9b462efc4493c122efe21e825e3702425dbd404621302a563a"}, +] [package.dependencies] mkdocstrings = ">=0.18" @@ -474,69 +852,90 @@ pytkdocs = ">=0.14" [[package]] name = "mslex" -version = "0.3.0" +version = "1.2.0" description = "shlex for windows" -category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "mslex-1.2.0-py3-none-any.whl", hash = "sha256:c68ec637485ee3544c5847c1b4e78b02940b32708568fb1d8715491815aa2341"}, + {file = "mslex-1.2.0.tar.gz", hash = "sha256:79e2abc5a129dd71cdde58a22a2039abb7fa8afcbac498b723ba6e9b9fbacc14"}, +] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = "*" +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] [[package]] name = "num2words" -version = "0.5.12" +version = "0.5.13" description = "Modules to convert numbers to words. Easily extensible." -category = "main" optional = false python-versions = "*" +files = [ + {file = "num2words-0.5.13-py3-none-any.whl", hash = "sha256:39e662c663f0a7e15415431ea68eb3dc711b49e3b776d93403e1da0a219ca4ee"}, + {file = "num2words-0.5.13.tar.gz", hash = "sha256:a3064716fbbf90d75c449450cebfbc73a6a13e63b2531d09bdecc3ab1a2209cf"}, +] [package.dependencies] docopt = ">=0.6.2" [[package]] name = "packaging" -version = "21.3" +version = "24.0" description = "Core utilities for Python packages" -category = "dev" optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +python-versions = ">=3.7" +files = [ + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, +] [[package]] name = "pathspec" -version = "0.10.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] [[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 = "dev" +version = "4.0.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, + {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] [package.dependencies] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -549,74 +948,102 @@ testing = ["pytest", "pytest-benchmark"] name = "pluginbase" version = "1.0.1" description = "PluginBase is a module for Python that enables the development of flexible plugin systems in Python." -category = "main" optional = false python-versions = "*" +files = [ + {file = "pluginbase-1.0.1.tar.gz", hash = "sha256:ff6c33a98fce232e9c73841d787a643de574937069f0d18147028d70d7dee287"}, +] [[package]] name = "pprintpp" version = "0.4.0" description = "A drop-in replacement for pprint that's actually pretty" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "pprintpp-0.4.0-py2.py3-none-any.whl", hash = "sha256:b6b4dcdd0c0c0d75e4d7b2f21a9e933e5b2ce62b26e1a54537f9651ae5a5c01d"}, + {file = "pprintpp-0.4.0.tar.gz", hash = "sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403"}, +] [[package]] name = "psutil" -version = "5.9.2" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +] [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "pydocstyle" -version = "6.1.1" +version = "6.3.0" description = "Python docstring style checker" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, + {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, +] [package.dependencies] -snowballstemmer = "*" +importlib-metadata = {version = ">=2.0.0,<5.0.0", markers = "python_version < \"3.8\""} +snowballstemmer = ">=2.2.0" [package.extras] -toml = ["toml"] +toml = ["tomli (>=1.2.3)"] [[package]] name = "pygments" -version = "2.13.0" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pylint" -version = "2.15.4" +version = "2.17.7" description = "python code static checker" -category = "dev" optional = false python-versions = ">=3.7.2" +files = [ + {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, + {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, +] [package.dependencies] -astroid = ">=2.12.11,<=2.14.0-dev0" +astroid = ">=2.15.8,<=2.17.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = ">=0.2" +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] isort = ">=4.2.5,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" @@ -630,54 +1057,54 @@ testutils = ["gitpython (>3)"] [[package]] name = "pymdown-extensions" -version = "9.6" +version = "10.2.1" description = "Extension pack for Python Markdown." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pymdown_extensions-10.2.1-py3-none-any.whl", hash = "sha256:bded105eb8d93f88f2f821f00108cb70cef1269db6a40128c09c5f48bfc60ea4"}, + {file = "pymdown_extensions-10.2.1.tar.gz", hash = "sha256:d0c534b4a5725a4be7ccef25d65a4c97dba58b54ad7c813babf0eb5ba9c81591"}, +] [package.dependencies] markdown = ">=3.2" - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" -optional = false -python-versions = ">=3.6.8" +pyyaml = "*" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +extra = ["pygments (>=2.12)"] [[package]] name = "pytest" -version = "7.1.3" +version = "7.4.4" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, +] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -tomli = ">=1.0.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-clarity" version = "1.0.1" description = "A plugin providing an alternative, colourful diff output for failing assertions." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytest-clarity-1.0.1.tar.gz", hash = "sha256:505fe345fad4fe11c6a4187fe683f2c7c52c077caa1e135f3e483fe112db7772"}, +] [package.dependencies] pprintpp = ">=0.4.0" @@ -688,9 +1115,12 @@ rich = ">=8.0.0" name = "pytest-cov" version = "3.0.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, +] [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} @@ -703,9 +1133,12 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytest-randomly" version = "3.12.0" description = "Pytest plugin to randomly order tests and control random.seed." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-randomly-3.12.0.tar.gz", hash = "sha256:d60c2db71ac319aee0fc6c4110a7597d611a8b94a5590918bfa8583f00caccb2"}, + {file = "pytest_randomly-3.12.0-py3-none-any.whl", hash = "sha256:f4f2e803daf5d1ba036cc22bf4fe9dbbf99389ec56b00e5cba732fb5c1d07fdd"}, +] [package.dependencies] importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} @@ -713,24 +1146,33 @@ pytest = "*" [[package]] name = "pytest-sugar" -version = "0.9.5" +version = "0.9.7" description = "pytest-sugar is a plugin for pytest that changes the default look and feel of pytest (e.g. progressbar, show tests that fail instantly)." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "pytest-sugar-0.9.7.tar.gz", hash = "sha256:f1e74c1abfa55f7241cf7088032b6e378566f16b938f3f08905e2cf4494edd46"}, + {file = "pytest_sugar-0.9.7-py2.py3-none-any.whl", hash = "sha256:8cb5a4e5f8bbcd834622b0235db9e50432f4cbd71fef55b467fe44e43701e062"}, +] [package.dependencies] -packaging = ">=14.1" -pytest = ">=2.9" -termcolor = ">=1.1.0" +packaging = ">=21.3" +pytest = ">=6.2.0" +termcolor = ">=2.1.0" + +[package.extras] +dev = ["black", "flake8", "pre-commit"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] [package.dependencies] six = ">=1.5" @@ -739,9 +1181,12 @@ six = ">=1.5" name = "pytkdocs" version = "0.16.1" description = "Load Python objects documentation." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytkdocs-0.16.1-py3-none-any.whl", hash = "sha256:a8c3f46ecef0b92864cc598e9101e9c4cf832ebbf228f50c84aa5dd850aac379"}, + {file = "pytkdocs-0.16.1.tar.gz", hash = "sha256:e2ccf6dfe9dbbceb09818673f040f1a7c32ed0bffb2d709b06be6453c4026045"}, +] [package.dependencies] astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} @@ -753,48 +1198,108 @@ numpy-style = ["docstring_parser (>=0.7)"] [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] [[package]] name = "pyyaml-env-tag" version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] [package.dependencies] pyyaml = "*" [[package]] name = "requests" -version = "2.28.1" +version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" version = "12.6.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" optional = false python-versions = ">=3.6.3,<4.0.0" +files = [ + {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, + {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, +] [package.dependencies] commonmark = ">=0.9.0,<0.10.0" @@ -806,57 +1311,75 @@ jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] [[package]] name = "shellingham" -version = "1.5.0" +version = "1.5.4" description = "Tool to Detect Surrounding Shell" -category = "main" optional = false -python-versions = ">=3.4" +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "smmap" -version = "5.0.0" +version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] [[package]] name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" optional = false python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] [[package]] name = "taskipy" -version = "1.10.3" +version = "1.13.0" description = "tasks runner for python projects" -category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = "<4.0,>=3.6" +files = [ + {file = "taskipy-1.13.0-py3-none-any.whl", hash = "sha256:56f42b7e508d9aed2c7b6365f8d3dab62dbd0c768c1ab606c819da4fc38421f7"}, + {file = "taskipy-1.13.0.tar.gz", hash = "sha256:2b52f0257958fed151f1340f7de93fcf0848f7a358ad62ba05c31c2ca04f89fe"}, +] [package.dependencies] colorama = ">=0.4.4,<0.5.0" -mslex = {version = ">=0.3.0,<0.4.0", markers = "sys_platform == \"win32\""} +mslex = {version = ">=1.1.0,<2.0.0", markers = "sys_platform == \"win32\""} psutil = ">=5.7.2,<6.0.0" tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} [[package]] name = "termcolor" -version = "2.0.1" +version = "2.3.0" description = "ANSI color formatting for output in terminal" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, + {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, +] [package.extras] tests = ["pytest", "pytest-cov"] @@ -865,41 +1388,95 @@ tests = ["pytest", "pytest-cov"] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "tomlkit" -version = "0.11.5" +version = "0.12.5" description = "Style preserving TOML library" -category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, + {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, +] [[package]] name = "typed-ast" -version = "1.5.4" +version = "1.5.5" description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, + {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, + {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, + {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, + {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, + {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, + {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, + {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, + {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, + {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, + {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, +] [[package]] name = "typer" version = "0.6.1" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "typer-0.6.1-py3-none-any.whl", hash = "sha256:54b19e5df18654070a82f8c2aa1da456a4ac16a2a83e6dcd9f170e291c56338e"}, + {file = "typer-0.6.1.tar.gz", hash = "sha256:2d5720a5e63f73eaf31edaa15f6ab87f35f0690f8ca233017d7d23d743a91d73"}, +] [package.dependencies] click = ">=7.1.1,<9.0.0" @@ -915,710 +1492,180 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=5.2,<6.0)", "isort (>=5.0.6,<6. [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] [[package]] name = "urllib3" -version = "1.26.15" +version = "2.0.7" 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.*" +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, +] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "2.1.9" +version = "3.0.0" description = "Filesystem events monitoring" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, +] [package.extras] watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wheel" -version = "0.40.0" +version = "0.42.0" description = "A built-package format for Python" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, + {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, +] [package.extras] -test = ["pytest (>=6.0.0)"] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "wrapt" -version = "1.14.1" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." -category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] [[package]] name = "zipp" -version = "3.9.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = ">=3.7.2,<4.0" -content-hash = "9863a5a8a526c0bc3db80fb5863a842f756895c74d10770410b8061f894c1b4f" - -[metadata.files] -astroid = [ - {file = "astroid-2.12.11-py3-none-any.whl", hash = "sha256:867a756bbf35b7bc07b35bfa6522acd01f91ad9919df675e8428072869792dce"}, - {file = "astroid-2.12.11.tar.gz", hash = "sha256:2df4f9980c4511474687895cbfdb8558293c1a826d9118bb09233d7c2bff1c83"}, -] -astunparse = [ - {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, - {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, -] -attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] -black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -cached-property = [ - {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, - {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, -] -certifi = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, -] -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"}, -] -commonmark = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, -] -coverage = [ - {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, - {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, - {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, - {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, - {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, - {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, - {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, - {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, - {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, - {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, - {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, - {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, - {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, - {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, - {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, - {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, - {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, - {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, - {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, - {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, -] -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"}, -] -docopt = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] -gatorgrader = [ - {file = "gatorgrader-1.1.1-py3-none-any.whl", hash = "sha256:5581fadb58e53ceb24a76c344ed211d0cd69ee22a987ac9861a83ec9a78dfe4e"}, - {file = "gatorgrader-1.1.1.tar.gz", hash = "sha256:7a08ad1a42d5caa4795f14474ed414759f7b16388cd02b7b3e787dcfb74501f8"}, -] -ghp-import = [ - {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, - {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, -] -gitdb = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, -] -gitpython = [ - {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, - {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, -] -griffe = [ - {file = "griffe-0.22.2-py3-none-any.whl", hash = "sha256:cea5415ac6a92f4a22638e3f1f2e661402bac09fb8e8266936d67185a7e0d0fb"}, - {file = "griffe-0.22.2.tar.gz", hash = "sha256:1408e336a4155392bbd81eed9f2f44bf144e71b9c664e905630affe83bbc088e"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -importlib-metadata = [ - {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, - {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -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"}, -] -markdown = [ - {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, - {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -mergedeep = [ - {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, - {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, -] -mkdocs = [ - {file = "mkdocs-1.4.1-py3-none-any.whl", hash = "sha256:2b7845c2775396214cd408753e4cfb01af3cfed36acc141a84bce2ceec9d705d"}, - {file = "mkdocs-1.4.1.tar.gz", hash = "sha256:07ed90be4062e4ef732bbac2623097b9dca35c67b562c38cfd0bfbc7151758c1"}, -] -mkdocs-autorefs = [ - {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, - {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, -] -mkdocs-gen-files = [ - {file = "mkdocs-gen-files-0.3.5.tar.gz", hash = "sha256:d90d9e1676531a0bb96b1287dc28aa41162986de4dc3c00400214724761ff6ef"}, - {file = "mkdocs_gen_files-0.3.5-py3-none-any.whl", hash = "sha256:69562fddc662482e8f54a00a8b4ede5166ad5384ae4dbb0469f1f338ef3285ca"}, -] -mkdocs-literate-nav = [ - {file = "mkdocs-literate-nav-0.4.1.tar.gz", hash = "sha256:9efe26b662f2f901cae5807bfd51446d30ea7e033c2bc43a15d6282c7dfac1ab"}, - {file = "mkdocs_literate_nav-0.4.1-py3-none-any.whl", hash = "sha256:a4b761792ba21defbe2dfd5e0de6ba451639e1ca0f0661c37eda83cc6261e4f9"}, -] -mkdocs-material = [ - {file = "mkdocs_material-8.5.6-py3-none-any.whl", hash = "sha256:b473162c800321b9760453f301a91f7cb40a120a85a9d0464e1e484e74b76bb2"}, - {file = "mkdocs_material-8.5.6.tar.gz", hash = "sha256:38a21d817265d0c203ab3dad64996e45859c983f72180f6937bd5540a4eb84e4"}, -] -mkdocs-material-extensions = [ - {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"}, - {file = "mkdocs_material_extensions-1.0.3-py3-none-any.whl", hash = "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44"}, -] -mkdocs-typer = [ - {file = "mkdocs_typer-0.0.2-py3-none-any.whl", hash = "sha256:24d88407b458403db47a953621a31a29f37e781015925d929e783a4719203991"}, - {file = "mkdocs_typer-0.0.2.tar.gz", hash = "sha256:150e1320a02cff86deea55a173da1d72728a9801742b2deba2926d1a33d36c07"}, -] -mkdocstrings = [ - {file = "mkdocstrings-0.18.1-py3-none-any.whl", hash = "sha256:4053929356df8cd69ed32eef71d8f676a472ef72980c9ffd4f933ead1debcdad"}, - {file = "mkdocstrings-0.18.1.tar.gz", hash = "sha256:fb7c91ce7e3ab70488d3fa6c073a4f827cdc319042f682ef8ea95459790d64fc"}, -] -mkdocstrings-python = [ - {file = "mkdocstrings-python-0.6.6.tar.gz", hash = "sha256:37281696b9f199624ae420e0625b6659b7fdfbea736618bce7fd978682dea3b1"}, - {file = "mkdocstrings_python-0.6.6-py3-none-any.whl", hash = "sha256:c118438d3cb4b14c492a51d109f4e5b27ab06ba19b099d624430dfd904926152"}, -] -mkdocstrings-python-legacy = [ - {file = "mkdocstrings-python-legacy-0.2.2.tar.gz", hash = "sha256:f0e7ec6a19750581b752acb38f6b32fcd1efe006f14f6703125d2c2c9a5c6f02"}, - {file = "mkdocstrings_python_legacy-0.2.2-py3-none-any.whl", hash = "sha256:379107a3a5b8db9b462efc4493c122efe21e825e3702425dbd404621302a563a"}, -] -mslex = [ - {file = "mslex-0.3.0-py2.py3-none-any.whl", hash = "sha256:380cb14abf8fabf40e56df5c8b21a6d533dc5cbdcfe42406bbf08dda8f42e42a"}, - {file = "mslex-0.3.0.tar.gz", hash = "sha256:4a1ac3f25025cad78ad2fe499dd16d42759f7a3801645399cce5c404415daa97"}, -] -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"}, -] -num2words = [ - {file = "num2words-0.5.12-py3-none-any.whl", hash = "sha256:9eeef488658226ab36818c06d7aeb956d19b530fb62030596b6802fb4659f30e"}, - {file = "num2words-0.5.12.tar.gz", hash = "sha256:7e7c0b0f080405aa3a1dd9d32b1ca90b3bf03bab17b8e54db05e1b78301a0988"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pathspec = [ - {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, - {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, -] -platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -pluginbase = [ - {file = "pluginbase-1.0.1.tar.gz", hash = "sha256:ff6c33a98fce232e9c73841d787a643de574937069f0d18147028d70d7dee287"}, -] -pprintpp = [ - {file = "pprintpp-0.4.0-py2.py3-none-any.whl", hash = "sha256:b6b4dcdd0c0c0d75e4d7b2f21a9e933e5b2ce62b26e1a54537f9651ae5a5c01d"}, - {file = "pprintpp-0.4.0.tar.gz", hash = "sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403"}, -] -psutil = [ - {file = "psutil-5.9.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:8f024fbb26c8daf5d70287bb3edfafa22283c255287cf523c5d81721e8e5d82c"}, - {file = "psutil-5.9.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:b2f248ffc346f4f4f0d747ee1947963613216b06688be0be2e393986fe20dbbb"}, - {file = "psutil-5.9.2-cp27-cp27m-win32.whl", hash = "sha256:b1928b9bf478d31fdffdb57101d18f9b70ed4e9b0e41af751851813547b2a9ab"}, - {file = "psutil-5.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:404f4816c16a2fcc4eaa36d7eb49a66df2d083e829d3e39ee8759a411dbc9ecf"}, - {file = "psutil-5.9.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:94e621c6a4ddb2573d4d30cba074f6d1aa0186645917df42c811c473dd22b339"}, - {file = "psutil-5.9.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:256098b4f6ffea6441eb54ab3eb64db9ecef18f6a80d7ba91549195d55420f84"}, - {file = "psutil-5.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:614337922702e9be37a39954d67fdb9e855981624d8011a9927b8f2d3c9625d9"}, - {file = "psutil-5.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39ec06dc6c934fb53df10c1672e299145ce609ff0611b569e75a88f313634969"}, - {file = "psutil-5.9.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3ac2c0375ef498e74b9b4ec56df3c88be43fe56cac465627572dbfb21c4be34"}, - {file = "psutil-5.9.2-cp310-cp310-win32.whl", hash = "sha256:e4c4a7636ffc47b7141864f1c5e7d649f42c54e49da2dd3cceb1c5f5d29bfc85"}, - {file = "psutil-5.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:f4cb67215c10d4657e320037109939b1c1d2fd70ca3d76301992f89fe2edb1f1"}, - {file = "psutil-5.9.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dc9bda7d5ced744622f157cc8d8bdd51735dafcecff807e928ff26bdb0ff097d"}, - {file = "psutil-5.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75291912b945a7351d45df682f9644540d564d62115d4a20d45fa17dc2d48f8"}, - {file = "psutil-5.9.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4018d5f9b6651f9896c7a7c2c9f4652e4eea53f10751c4e7d08a9093ab587ec"}, - {file = "psutil-5.9.2-cp36-cp36m-win32.whl", hash = "sha256:f40ba362fefc11d6bea4403f070078d60053ed422255bd838cd86a40674364c9"}, - {file = "psutil-5.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9770c1d25aee91417eba7869139d629d6328a9422ce1cdd112bd56377ca98444"}, - {file = "psutil-5.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:42638876b7f5ef43cef8dcf640d3401b27a51ee3fa137cb2aa2e72e188414c32"}, - {file = "psutil-5.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91aa0dac0c64688667b4285fa29354acfb3e834e1fd98b535b9986c883c2ce1d"}, - {file = "psutil-5.9.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fb54941aac044a61db9d8eb56fc5bee207db3bc58645d657249030e15ba3727"}, - {file = "psutil-5.9.2-cp37-cp37m-win32.whl", hash = "sha256:7cbb795dcd8ed8fd238bc9e9f64ab188f3f4096d2e811b5a82da53d164b84c3f"}, - {file = "psutil-5.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5d39e3a2d5c40efa977c9a8dd4f679763c43c6c255b1340a56489955dbca767c"}, - {file = "psutil-5.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd331866628d18223a4265371fd255774affd86244fc307ef66eaf00de0633d5"}, - {file = "psutil-5.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b315febaebae813326296872fdb4be92ad3ce10d1d742a6b0c49fb619481ed0b"}, - {file = "psutil-5.9.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7929a516125f62399d6e8e026129c8835f6c5a3aab88c3fff1a05ee8feb840d"}, - {file = "psutil-5.9.2-cp38-cp38-win32.whl", hash = "sha256:561dec454853846d1dd0247b44c2e66a0a0c490f937086930ec4b8f83bf44f06"}, - {file = "psutil-5.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:67b33f27fc0427483b61563a16c90d9f3b547eeb7af0ef1b9fe024cdc9b3a6ea"}, - {file = "psutil-5.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3591616fa07b15050b2f87e1cdefd06a554382e72866fcc0ab2be9d116486c8"}, - {file = "psutil-5.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b29f581b5edab1f133563272a6011925401804d52d603c5c606936b49c8b97"}, - {file = "psutil-5.9.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4642fd93785a29353d6917a23e2ac6177308ef5e8be5cc17008d885cb9f70f12"}, - {file = "psutil-5.9.2-cp39-cp39-win32.whl", hash = "sha256:ed29ea0b9a372c5188cdb2ad39f937900a10fb5478dc077283bf86eeac678ef1"}, - {file = "psutil-5.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:68b35cbff92d1f7103d8f1db77c977e72f49fcefae3d3d2b91c76b0e7aef48b8"}, - {file = "psutil-5.9.2.tar.gz", hash = "sha256:feb861a10b6c3bb00701063b37e4afc754f8217f0f09c42280586bd6ac712b5c"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pydocstyle = [ - {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"}, - {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, -] -pygments = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, -] -pylint = [ - {file = "pylint-2.15.4-py3-none-any.whl", hash = "sha256:629cf1dbdfb6609d7e7a45815a8bb59300e34aa35783b5ac563acaca2c4022e9"}, - {file = "pylint-2.15.4.tar.gz", hash = "sha256:5441e9294335d354b7bad57c1044e5bd7cce25c433475d76b440e53452fa5cb8"}, -] -pymdown-extensions = [ - {file = "pymdown_extensions-9.6-py3-none-any.whl", hash = "sha256:1e36490adc7bfcef1fdb21bb0306e93af99cff8ec2db199bd17e3bf009768c11"}, - {file = "pymdown_extensions-9.6.tar.gz", hash = "sha256:b956b806439bbff10f726103a941266beb03fbe99f897c7d5e774d7170339ad9"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pytest = [ - {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, - {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, -] -pytest-clarity = [ - {file = "pytest-clarity-1.0.1.tar.gz", hash = "sha256:505fe345fad4fe11c6a4187fe683f2c7c52c077caa1e135f3e483fe112db7772"}, -] -pytest-cov = [ - {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, - {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, -] -pytest-randomly = [ - {file = "pytest-randomly-3.12.0.tar.gz", hash = "sha256:d60c2db71ac319aee0fc6c4110a7597d611a8b94a5590918bfa8583f00caccb2"}, - {file = "pytest_randomly-3.12.0-py3-none-any.whl", hash = "sha256:f4f2e803daf5d1ba036cc22bf4fe9dbbf99389ec56b00e5cba732fb5c1d07fdd"}, -] -pytest-sugar = [ - {file = "pytest-sugar-0.9.5.tar.gz", hash = "sha256:eea78b6f15b635277d3d90280cd386d8feea1cab0f9be75947a626e8b02b477d"}, - {file = "pytest_sugar-0.9.5-py2.py3-none-any.whl", hash = "sha256:3da42de32ce4e1e95b448d61c92804433f5d4058c0a765096991c2e93d5a289f"}, -] -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"}, -] -pytkdocs = [ - {file = "pytkdocs-0.16.1-py3-none-any.whl", hash = "sha256:a8c3f46ecef0b92864cc598e9101e9c4cf832ebbf228f50c84aa5dd850aac379"}, - {file = "pytkdocs-0.16.1.tar.gz", hash = "sha256:e2ccf6dfe9dbbceb09818673f040f1a7c32ed0bffb2d709b06be6453c4026045"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -pyyaml-env-tag = [ - {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, - {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -rich = [ - {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, - {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, -] -shellingham = [ - {file = "shellingham-1.5.0-py2.py3-none-any.whl", hash = "sha256:a8f02ba61b69baaa13facdba62908ca8690a94b8119b69f5ec5873ea85f7391b"}, - {file = "shellingham-1.5.0.tar.gz", hash = "sha256:72fb7f5c63103ca2cb91b23dee0c71fe8ad6fbfd46418ef17dbe40db51592dad"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -smmap = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -taskipy = [ - {file = "taskipy-1.10.3-py3-none-any.whl", hash = "sha256:4c0070ca53868d97989f7ab5c6f237525d52ee184f9b967576e8fe427ed9d0b8"}, - {file = "taskipy-1.10.3.tar.gz", hash = "sha256:112beaf21e3d5569950b99162a1de003fa885fabee9e450757a6b874be914877"}, -] -termcolor = [ - {file = "termcolor-2.0.1-py3-none-any.whl", hash = "sha256:7e597f9de8e001a3208c4132938597413b9da45382b6f1d150cff8d062b7aaa3"}, - {file = "termcolor-2.0.1.tar.gz", hash = "sha256:6b2cf769e93364a2676e1de56a7c0cff2cf5bd07f37e9cc80b0dd6320ebfe388"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -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.5-py3-none-any.whl", hash = "sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7"}, - {file = "tomlkit-0.11.5.tar.gz", hash = "sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c"}, -] -typed-ast = [ - {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, - {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, - {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, - {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, - {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, - {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, - {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, - {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, - {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, - {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, -] -typer = [ - {file = "typer-0.6.1-py3-none-any.whl", hash = "sha256:54b19e5df18654070a82f8c2aa1da456a4ac16a2a83e6dcd9f170e291c56338e"}, - {file = "typer-0.6.1.tar.gz", hash = "sha256:2d5720a5e63f73eaf31edaa15f6ab87f35f0690f8ca233017d7d23d743a91d73"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] -urllib3 = [ - {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, - {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, -] -watchdog = [ - {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"}, - {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"}, - {file = "watchdog-2.1.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee3e38a6cc050a8830089f79cbec8a3878ec2fe5160cdb2dc8ccb6def8552658"}, - {file = "watchdog-2.1.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64a27aed691408a6abd83394b38503e8176f69031ca25d64131d8d640a307591"}, - {file = "watchdog-2.1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:195fc70c6e41237362ba720e9aaf394f8178bfc7fa68207f112d108edef1af33"}, - {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bfc4d351e6348d6ec51df007432e6fe80adb53fd41183716017026af03427846"}, - {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8250546a98388cbc00c3ee3cc5cf96799b5a595270dfcfa855491a64b86ef8c3"}, - {file = "watchdog-2.1.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:117ffc6ec261639a0209a3252546b12800670d4bf5f84fbd355957a0595fe654"}, - {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97f9752208f5154e9e7b76acc8c4f5a58801b338de2af14e7e181ee3b28a5d39"}, - {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:247dcf1df956daa24828bfea5a138d0e7a7c98b1a47cf1fa5b0c3c16241fcbb7"}, - {file = "watchdog-2.1.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:226b3c6c468ce72051a4c15a4cc2ef317c32590d82ba0b330403cafd98a62cfd"}, - {file = "watchdog-2.1.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d9820fe47c20c13e3c9dd544d3706a2a26c02b2b43c993b62fcd8011bcc0adb3"}, - {file = "watchdog-2.1.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:70af927aa1613ded6a68089a9262a009fbdf819f46d09c1a908d4b36e1ba2b2d"}, - {file = "watchdog-2.1.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed80a1628cee19f5cfc6bb74e173f1b4189eb532e705e2a13e3250312a62e0c9"}, - {file = "watchdog-2.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9f05a5f7c12452f6a27203f76779ae3f46fa30f1dd833037ea8cbc2887c60213"}, - {file = "watchdog-2.1.9-py3-none-manylinux2014_armv7l.whl", hash = "sha256:255bb5758f7e89b1a13c05a5bceccec2219f8995a3a4c4d6968fe1de6a3b2892"}, - {file = "watchdog-2.1.9-py3-none-manylinux2014_i686.whl", hash = "sha256:d3dda00aca282b26194bdd0adec21e4c21e916956d972369359ba63ade616153"}, - {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64.whl", hash = "sha256:186f6c55abc5e03872ae14c2f294a153ec7292f807af99f57611acc8caa75306"}, - {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:083171652584e1b8829581f965b9b7723ca5f9a2cd7e20271edf264cfd7c1412"}, - {file = "watchdog-2.1.9-py3-none-manylinux2014_s390x.whl", hash = "sha256:b530ae007a5f5d50b7fbba96634c7ee21abec70dc3e7f0233339c81943848dc1"}, - {file = "watchdog-2.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:4f4e1c4aa54fb86316a62a87b3378c025e228178d55481d30d857c6c438897d6"}, - {file = "watchdog-2.1.9-py3-none-win32.whl", hash = "sha256:5952135968519e2447a01875a6f5fc8c03190b24d14ee52b0f4b1682259520b1"}, - {file = "watchdog-2.1.9-py3-none-win_amd64.whl", hash = "sha256:7a833211f49143c3d336729b0020ffd1274078e94b0ae42e22f596999f50279c"}, - {file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"}, - {file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"}, -] -wheel = [ - {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, - {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, -] -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"}, -] -zipp = [ - {file = "zipp-3.9.0-py3-none-any.whl", hash = "sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980"}, - {file = "zipp-3.9.0.tar.gz", hash = "sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb"}, -] +content-hash = "745764366191be2cf495072bee0fe1c94fad711bdfd962cfa831085aacd9e56d" From 0296866f0c1b31f1d692dc26270e131bac236a3b Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Fri, 27 Sep 2024 07:23:35 -0400 Subject: [PATCH 153/207] chore: Bump the semver (it was 0.0.0, starting to use it again) in the pyproject.toml file. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 294ce6c5..65402dcb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "gatorgrade" -version = "0.0.0" +version = "0.6.0" description = "GatorGrade executes GatorGrader checks!" authors = ["Michael Abraham", "Jacob Allebach", "Liam Black", "Katherine Burgess", "Yanqiao Chen", "Ochirsaikhan Davaajambal", "Tuguldurnemekh Gantulga", "Anthony Grant-Cook", "Dylan Holland", "Gregory M. Kapfhammer", "Peyton Kelly", "Luke Lacaria", "Lauren Nevill", "Jack Turner", "Daniel Ullrich", "Garrison Vanzin", "Rian Watson"] readme = "README.md" From 79a13ac17c0886d443205c06d2242e1aefeefb7c Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Mon, 30 Sep 2024 18:57:36 -0400 Subject: [PATCH 154/207] fix: implementation of output code and added feature in output.py --- gatorgrade/output/output.py | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 420aa9e6..bbcf7733 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -289,27 +289,47 @@ def run_checks( checks: The list of shell and GatorGrader checks to run. """ results = [] + command_output = [] # run each of the checks for check in checks: result = None + command_ran = None # run a shell check; this means # that it is going to run a command # in the shell as a part of a check # store the command that ran - command_output = None if isinstance(check, ShellCheck): result = _run_shell_check(check) - command_output = check.command + command_ran = check.command + # run a check that GatorGrader implements elif isinstance(check, GatorGraderCheck): result = _run_gg_check(check) + # this code checks to see if there was a command in the + # GatorGraderCheck. This code finds the index of the + # word "--command" in the check.gg_args list and then appending + # that index plus +1 to get the actual command. Another way to + # implement this would be to use check.json_info which has the information + # stored in key value pairs, so you would just call the command + # differently something like the commented out code bellow: + # (though the commented code doesn't work it is just an idea) + # if check.json_info["check"] == "MatchCommandFragment": + # command_ran = check.json_info["options"]["command"] + if "--command" in check.gg_args: + index_of_command = check.gg_args.index("--command") + index_of_new_command = int(index_of_command) + 1 + command_output.append(check.gg_args[index_of_new_command]) + # there were results from running checks # and thus they must be displayed if result is not None: result.print() - results.append((result, command_output)) + results.append(result) + # store the result and the command that ran in a tuple + # and add that tuple to the command_output list + command_output.append((result, command_ran)) # determine if there are failures and then display them failed_results = list(filter(lambda result: not result[0].passed, results)) @@ -318,9 +338,14 @@ def run_checks( if len(failed_results) > 0: print("\n-~- FAILURES -~-\n") for result in failed_results: - result[0].print(show_diagnostic=True) - if result[1] is not None: - rich.print(f"[blue] → Command that failed: [green]{result[1]}") + result.print(show_diagnostic=True) + # iterate through the list of command output + # check if the result stored in the command output tuple + # is equal to the result in failed results and if it is + # and the command was not None than the command that ran will be printed + for command in command_output: + if command[0] == result and command[1] is not None: + rich.print(f"[blue] → Command that failed: [green]{result[1]}") # determine how many of the checks passed and then # compute the total percentage of checks passed passed_count = len(results) - len(failed_results) From dab0a1f162d06f8f1c5cdd28ae79825585b1a623 Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Wed, 2 Oct 2024 12:19:39 -0400 Subject: [PATCH 155/207] fix: command output added for GatorGraderCheck in output.py in fork --- gatorgrade/output/output.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index bbcf7733..d3e2e9e2 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -305,12 +305,12 @@ def run_checks( # run a check that GatorGrader implements elif isinstance(check, GatorGraderCheck): - result = _run_gg_check(check) + result = _run_gg_check(check) - # this code checks to see if there was a command in the - # GatorGraderCheck. This code finds the index of the - # word "--command" in the check.gg_args list and then appending - # that index plus +1 to get the actual command. Another way to + # this code checks to see if there was a command in the + # GatorGraderCheck. This code finds the index of the + # word "--command" in the check.gg_args list and then appending + # that index plus +1 to get the actual command. Another way to # implement this would be to use check.json_info which has the information # stored in key value pairs, so you would just call the command # differently something like the commented out code bellow: @@ -333,19 +333,19 @@ def run_checks( # determine if there are failures and then display them failed_results = list(filter(lambda result: not result[0].passed, results)) - # print failures list if there are failures to print + # print failures list if there are failures to print # and print what ShellCheck command that Gatorgrade ran if len(failed_results) > 0: print("\n-~- FAILURES -~-\n") for result in failed_results: result.print(show_diagnostic=True) - # iterate through the list of command output + # iterate through the list of command output # check if the result stored in the command output tuple # is equal to the result in failed results and if it is # and the command was not None than the command that ran will be printed for command in command_output: if command[0] == result and command[1] is not None: - rich.print(f"[blue] → Command that failed: [green]{result[1]}") + rich.print(f"[blue] → Here is the command that ran: [green]{command[1]}") # determine how many of the checks passed and then # compute the total percentage of checks passed passed_count = len(results) - len(failed_results) From 080778196d7198b1cdc397ffd5a5ce51bd9900a7 Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Wed, 2 Oct 2024 21:50:30 -0400 Subject: [PATCH 156/207] fix: made failed_results subscriptable again in output.py --- gatorgrade/output/output.py | 2 +- tests/output/test_output.py | 3 ++- tests/test_main.py | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index d3e2e9e2..5ebdcebf 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -332,7 +332,7 @@ def run_checks( command_output.append((result, command_ran)) # determine if there are failures and then display them - failed_results = list(filter(lambda result: not result[0].passed, results)) + failed_results = list(filter(lambda result: not result.passed, results)) # print failures list if there are failures to print # and print what ShellCheck command that Gatorgrade ran if len(failed_results) > 0: diff --git a/tests/output/test_output.py b/tests/output/test_output.py index d9c3b94a..7bfa4cf0 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -3,7 +3,7 @@ import datetime import json import os -import subprocess +# import subprocess import pytest @@ -123,6 +123,7 @@ def test_run_checks_some_failed_prints_correct_summary(capsys): output.run_checks(checks, report) # Then the output shows the correct fraction and percentage of passed checks out, _ = capsys.readouterr() + print(out) assert "Passed 2/3 (67%) of checks" in out diff --git a/tests/test_main.py b/tests/test_main.py index bfc3b30b..2f1dd7d2 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -98,10 +98,24 @@ def test_full_integration_creates_valid_output( assignment_path, expected_output_and_freqs, chdir ): """Tests full integration pipeline to ensure input assignments give the correct output.""" + # the assignment path is: + # tests/test_assignment chdir(assignment_path) + # print(assignment_path) + + # result is the following information: + # ✓ Complete all TODOs + # ✓ Use an if statement + # ✓ Complete all TODOs + result = runner.invoke(main.app) + # print(result) + print(result.stdout) + # print(result.exit_code) + + # why is this failing and why is it zero? assert result.exit_code == 0 for output, freq in expected_output_and_freqs: assert result.stdout.count(output) == freq From ca4f9baa432dc7ce56613705cc6d79b2eb6333ca Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Wed, 2 Oct 2024 21:55:53 -0400 Subject: [PATCH 157/207] deleted: print statements in test_main.py and test_output.py --- tests/output/test_output.py | 4 ++-- tests/test_main.py | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 7bfa4cf0..0a273634 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -121,9 +121,9 @@ def test_run_checks_some_failed_prints_correct_summary(capsys): report = (None, None, None) # When run_checks is called output.run_checks(checks, report) - # Then the output shows the correct fraction and percentage of passed checks + # the output shows the correct fraction + # and percentage of passed checks out, _ = capsys.readouterr() - print(out) assert "Passed 2/3 (67%) of checks" in out diff --git a/tests/test_main.py b/tests/test_main.py index 2f1dd7d2..5a98eb4c 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -109,12 +109,9 @@ def test_full_integration_creates_valid_output( # ✓ Complete all TODOs result = runner.invoke(main.app) - # print(result) print(result.stdout) - # print(result.exit_code) - # why is this failing and why is it zero? assert result.exit_code == 0 for output, freq in expected_output_and_freqs: From 5205921d883cd90a78108343a0b5833ae292a960 Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Wed, 2 Oct 2024 22:00:52 -0400 Subject: [PATCH 158/207] fix: reformatted output.py, test_output.py, and test_main.py --- gatorgrade/output/output.py | 4 +++- tests/output/test_output.py | 1 + tests/test_main.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 5ebdcebf..ef060e17 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -345,7 +345,9 @@ def run_checks( # and the command was not None than the command that ran will be printed for command in command_output: if command[0] == result and command[1] is not None: - rich.print(f"[blue] → Here is the command that ran: [green]{command[1]}") + rich.print( + f"[blue] → Here is the command that ran: [green]{command[1]}" + ) # determine how many of the checks passed and then # compute the total percentage of checks passed passed_count = len(results) - len(failed_results) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 0a273634..fc269cf3 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -3,6 +3,7 @@ import datetime import json import os + # import subprocess import pytest diff --git a/tests/test_main.py b/tests/test_main.py index 5a98eb4c..9e1ab051 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -98,7 +98,7 @@ def test_full_integration_creates_valid_output( assignment_path, expected_output_and_freqs, chdir ): """Tests full integration pipeline to ensure input assignments give the correct output.""" - # the assignment path is: + # the assignment path is: # tests/test_assignment chdir(assignment_path) # print(assignment_path) From 6d114ef806ecef13074fcb7b2d1a35df6f1676b3 Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Wed, 2 Oct 2024 22:12:13 -0400 Subject: [PATCH 159/207] fix: import formatting in test_output.py --- tests/output/test_output.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index fc269cf3..3bef2e36 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -4,8 +4,6 @@ import json import os -# import subprocess - import pytest from gatorgrade.input.checks import GatorGraderCheck From 355f1a9925ab79e5f9feee036d8c74379a0c1b37 Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Wed, 2 Oct 2024 22:22:52 -0400 Subject: [PATCH 160/207] fix: update the over general exceptions to pass linting checks in .pylintrc --- .pylintrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index c6c73e03..ec66294f 100644 --- a/.pylintrc +++ b/.pylintrc @@ -421,4 +421,5 @@ min-public-methods=2 # Exceptions that will emit a warning when being caught. Defaults to # "Exception" -overgeneral-exceptions=Exception +overgeneral-exceptions=builtins.BaseException, + builtins.Exception \ No newline at end of file From 6f9d2808cfcd4c924b41c1ae8c87e43e9b9fa966 Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Wed, 2 Oct 2024 22:31:49 -0400 Subject: [PATCH 161/207] style: added an encoding type to the open file function in output.py --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index ef060e17..c1c36706 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -250,7 +250,7 @@ def configure_report( # Add json report into the GITHUB_ENV environment variable for data collection purpose env_file = os.getenv("GITHUB_ENV") - with open(env_file, "a") as myfile: + with open(env_file, "a", encoding="utf-8") as myfile: myfile.write(f"JSON_REPORT={json.dumps(report_output_data_json)}") # Add env else: From b81b548ba4dc6bd6e77d65c4ed7630aa13c5a395 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Thu, 3 Oct 2024 15:00:40 -0400 Subject: [PATCH 162/207] chore: Add the poetry.toml file to the .gitignore file. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 3f0da8f7..bc50695f 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,6 @@ dmypy.json # gatograde.yml files gatorgrade.yml + +# poetry.toml files +poetry.toml From 4ce148f30cf832370378975d8fe90b3fbd0821e2 Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Thu, 3 Oct 2024 15:14:26 -0400 Subject: [PATCH 163/207] chore: add a newline after command output in output.py --- gatorgrade/output/output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index c1c36706..076c2a38 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -346,7 +346,7 @@ def run_checks( for command in command_output: if command[0] == result and command[1] is not None: rich.print( - f"[blue] → Here is the command that ran: [green]{command[1]}" + f"[blue] → Here is the command that ran: [green]{command[1]}\n" ) # determine how many of the checks passed and then # compute the total percentage of checks passed From b3563a1527032eadc0db368c135e395e0988127b Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Thu, 3 Oct 2024 15:54:14 -0400 Subject: [PATCH 164/207] delete: an unecessary comment in test_main.py --- tests/test_main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_main.py b/tests/test_main.py index 9e1ab051..22551294 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -112,7 +112,6 @@ def test_full_integration_creates_valid_output( print(result.stdout) - # why is this failing and why is it zero? assert result.exit_code == 0 for output, freq in expected_output_and_freqs: assert result.stdout.count(output) == freq From 3d66d4ee8d45df9549ec9f83549a5073c6a1064d Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Thu, 3 Oct 2024 16:47:34 -0400 Subject: [PATCH 165/207] debug: Comment out code for testing purposes in gatorgrade/output/output.py. --- gatorgrade/output/output.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index c1c36706..87f348fc 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -1,4 +1,5 @@ """Run checks and display whether each has passed or failed.""" + import datetime import json import os @@ -11,6 +12,7 @@ import gator import rich +from gatorgrade import main from gatorgrade.input.checks import GatorGraderCheck from gatorgrade.input.checks import ShellCheck from gatorgrade.output.check_result import CheckResult @@ -244,14 +246,18 @@ def configure_report( if report_name == "GITHUB_STEP_SUMMARY": env_file = os.getenv("GITHUB_STEP_SUMMARY") if report_type == "md": + main.console.print("[yellow]Creating GitHub Action Job Summary for MD") write_json_or_md_file(env_file, report_type, report_output_data_md) + main.console.print("After writing to GitHub Action Job Summary for MD") else: + main.console.print("[yellow]Creating GitHub Action Job Summary for JSON") write_json_or_md_file(env_file, report_type, report_output_data_json) + main.console.print("After writing to GitHub Action Job Summary for MD") # Add json report into the GITHUB_ENV environment variable for data collection purpose - env_file = os.getenv("GITHUB_ENV") - with open(env_file, "a", encoding="utf-8") as myfile: - myfile.write(f"JSON_REPORT={json.dumps(report_output_data_json)}") + # env_file = os.getenv("GITHUB_ENV") + # with open(env_file, "a", encoding="utf-8") as myfile: + # myfile.write(f"JSON_REPORT={json.dumps(report_output_data_json)}") # Add env else: raise ValueError( @@ -386,7 +392,7 @@ def print_with_border(text: str, rich_color: str): # Upper right corner downleft = "\u2517" # Lower left corner - downright = "\u251B" + downright = "\u251b" # Lower right corner vert = "\u2503" # Vertical line From b6563dd2b8b41fa4f5c242bd56866ec3b67a3bdd Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Thu, 3 Oct 2024 17:25:22 -0400 Subject: [PATCH 166/207] debug: Uncomment lines in the gatorgrade/output/output.py file for testing purposes. --- gatorgrade/output/output.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 0eaeebdf..c0e27138 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -255,9 +255,9 @@ def configure_report( main.console.print("After writing to GitHub Action Job Summary for MD") # Add json report into the GITHUB_ENV environment variable for data collection purpose - # env_file = os.getenv("GITHUB_ENV") - # with open(env_file, "a", encoding="utf-8") as myfile: - # myfile.write(f"JSON_REPORT={json.dumps(report_output_data_json)}") + env_file = os.getenv("GITHUB_ENV") + with open(env_file, "a", encoding="utf-8") as myfile: + myfile.write(f"JSON_REPORT={json.dumps(report_output_data_json)}") # Add env else: raise ValueError( From ccf48374ae6cb685e4dc924c6b0ed3794a10790c Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Thu, 3 Oct 2024 19:03:37 -0400 Subject: [PATCH 167/207] fix: ran poetry linter to fix formatting in output.py --- gatorgrade/output/output.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index c0e27138..f62d9826 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -250,7 +250,9 @@ def configure_report( write_json_or_md_file(env_file, report_type, report_output_data_md) main.console.print("After writing to GitHub Action Job Summary for MD") else: - main.console.print("[yellow]Creating GitHub Action Job Summary for JSON") + main.console.print( + "[yellow]Creating GitHub Action Job Summary for JSON" + ) write_json_or_md_file(env_file, report_type, report_output_data_json) main.console.print("After writing to GitHub Action Job Summary for MD") From f4c2b905b47eb4784813251271781374af862019 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 10:00:53 -0400 Subject: [PATCH 168/207] refactor: Remove the console.print() statements not needed in gatorgrade/output/output.py. --- gatorgrade/output/output.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index c0e27138..93d7fe30 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -246,13 +246,9 @@ def configure_report( if report_name == "GITHUB_STEP_SUMMARY": env_file = os.getenv("GITHUB_STEP_SUMMARY") if report_type == "md": - main.console.print("[yellow]Creating GitHub Action Job Summary for MD") write_json_or_md_file(env_file, report_type, report_output_data_md) - main.console.print("After writing to GitHub Action Job Summary for MD") else: - main.console.print("[yellow]Creating GitHub Action Job Summary for JSON") write_json_or_md_file(env_file, report_type, report_output_data_json) - main.console.print("After writing to GitHub Action Job Summary for MD") # Add json report into the GITHUB_ENV environment variable for data collection purpose env_file = os.getenv("GITHUB_ENV") From 09dd6ace7395d1920a125d22ed6fa71f0a79be81 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 10:03:50 -0400 Subject: [PATCH 169/207] style: Remove the inconsistent and not-needed blank lines in gatorgrade/output/output.py. --- gatorgrade/output/output.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index c134af5c..42b31aec 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -230,18 +230,15 @@ def configure_report( raise ValueError( "\n[red]The second argument of report has to be 'md' or 'json' " ) - # if the user wants markdown, get markdown content based on json if report_type == "md": report_output_data_md = create_markdown_report_file(report_output_data_json) - # if the user wants the data stored in a file: if report_format == "file": if report_type == "md": write_json_or_md_file(report_name, report_type, report_output_data_md) else: write_json_or_md_file(report_name, report_type, report_output_data_json) - elif report_format == "env": if report_name == "GITHUB_STEP_SUMMARY": env_file = os.getenv("GITHUB_STEP_SUMMARY") @@ -299,15 +296,12 @@ def run_checks( # that it is going to run a command # in the shell as a part of a check # store the command that ran - if isinstance(check, ShellCheck): result = _run_shell_check(check) command_ran = check.command - # run a check that GatorGrader implements elif isinstance(check, GatorGraderCheck): result = _run_gg_check(check) - # this code checks to see if there was a command in the # GatorGraderCheck. This code finds the index of the # word "--command" in the check.gg_args list and then appending @@ -322,7 +316,6 @@ def run_checks( index_of_command = check.gg_args.index("--command") index_of_new_command = int(index_of_command) + 1 command_output.append(check.gg_args[index_of_new_command]) - # there were results from running checks # and thus they must be displayed if result is not None: @@ -331,7 +324,6 @@ def run_checks( # store the result and the command that ran in a tuple # and add that tuple to the command_output list command_output.append((result, command_ran)) - # determine if there are failures and then display them failed_results = list(filter(lambda result: not result.passed, results)) # print failures list if there are failures to print @@ -357,12 +349,10 @@ def run_checks( percent = 0 else: percent = round(passed_count / len(results) * 100) - # if the report is wanted, create output in line with their specifications if all(report): report_output_data = create_report_json(passed_count, results, percent) configure_report(report, report_output_data) - # compute summary results and display them in the console summary = f"Passed {passed_count}/{len(results)} ({percent}%) of checks for {Path.cwd().name}!" summary_color = "green" if passed_count == len(results) else "bright white" From 2d88ba924735750d870658ff30daf19ab33c7720 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 10:04:23 -0400 Subject: [PATCH 170/207] style: Remove a not-needed import and blank lines and reorganize imports in gatorgrade/output/output.py. --- gatorgrade/output/output.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 42b31aec..52f34a37 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -5,16 +5,12 @@ import os import subprocess from pathlib import Path -from typing import List -from typing import Tuple -from typing import Union +from typing import List, Tuple, Union import gator import rich -from gatorgrade import main -from gatorgrade.input.checks import GatorGraderCheck -from gatorgrade.input.checks import ShellCheck +from gatorgrade.input.checks import GatorGraderCheck, ShellCheck from gatorgrade.output.check_result import CheckResult # Disable rich's default highlight to stop number coloring @@ -383,7 +379,6 @@ def print_with_border(text: str, rich_color: str): # Vertical line horz = "\u2501" # Horizontal line - line = horz * (len(text) + 2) rich.print(f"[{rich_color}]\n\t{upleft}{line}{upright}") rich.print(f"[{rich_color}]\t{vert} {text} {vert}") From e73c5efa245495ff946b8473c455a80fa9012c67 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 10:05:22 -0400 Subject: [PATCH 171/207] style: Remove not-needed blank lines in the gatorgrade/output/output.py file. --- gatorgrade/output/output.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 52f34a37..80cfb16c 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -37,7 +37,6 @@ def _run_shell_check(check: ShellCheck) -> CheckResult: stderr=subprocess.STDOUT, ) passed = result.returncode == 0 - # Add spaces after each newline to indent all lines of diagnostic diagnostic = ( "" if passed else result.stdout.decode().strip().replace("\n", "\n ") @@ -64,7 +63,6 @@ def _run_gg_check(check: GatorGraderCheck) -> CheckResult: passed = result[1] description = result[0] diagnostic = result[2] - # Fetch the path from gatorgrade arguments # the path pattern are 4 consistent string in the list # --dir `dir_name` --file `file_name` From 843003a6c7d23be4aed892b1c141b37edfabd610 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 10:09:12 -0400 Subject: [PATCH 172/207] chore: Bump the semver to 0.7.0 in the pyproject.toml file and upgrade isort. --- pyproject.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 65402dcb..fd164899 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "gatorgrade" -version = "0.6.0" +version = "0.7.0" description = "GatorGrade executes GatorGrader checks!" authors = ["Michael Abraham", "Jacob Allebach", "Liam Black", "Katherine Burgess", "Yanqiao Chen", "Ochirsaikhan Davaajambal", "Tuguldurnemekh Gantulga", "Anthony Grant-Cook", "Dylan Holland", "Gregory M. Kapfhammer", "Peyton Kelly", "Luke Lacaria", "Lauren Nevill", "Jack Turner", "Daniel Ullrich", "Garrison Vanzin", "Rian Watson"] readme = "README.md" @@ -28,7 +28,6 @@ toml = "^0.10.2" pytest-sugar = "^0.9.5" pytest-randomly = "^3.12.0" pytest-clarity = "^1.0.1" -isort = "^5.10.1" mkdocs-material = "^8.4.2" [tool.taskipy.tasks] From 19f5a287976aa30274a3de7edcb71d164cb11cca Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 10:09:36 -0400 Subject: [PATCH 173/207] style: Resort the imports according to isort as a stopgap measure for gatorgrade/output/output.py. --- gatorgrade/output/output.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 80cfb16c..8f6ac518 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -5,12 +5,15 @@ import os import subprocess from pathlib import Path -from typing import List, Tuple, Union +from typing import List +from typing import Tuple +from typing import Union import gator import rich -from gatorgrade.input.checks import GatorGraderCheck, ShellCheck +from gatorgrade.input.checks import GatorGraderCheck +from gatorgrade.input.checks import ShellCheck from gatorgrade.output.check_result import CheckResult # Disable rich's default highlight to stop number coloring From ddec9e9eb1155da4c05bc98bf3aba36fe85989fe Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 10:09:51 -0400 Subject: [PATCH 174/207] chore: Update the poetry.lock file with new dependencies. --- poetry.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 7e533182..820be290 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1668,4 +1668,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.7.2,<4.0" -content-hash = "745764366191be2cf495072bee0fe1c94fad711bdfd962cfa831085aacd9e56d" +content-hash = "6e8374f3087cfc453e5aa4cb422116ad19154e0f48aa2116b5b2a7e211e1943f" From 467f8153540fc698f03d513bc028ea665c8332f1 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 10:52:32 -0400 Subject: [PATCH 175/207] refactor: Try a new approach to saving the failing commands in gatorgrade/output/output.py. --- gatorgrade/output/output.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 8f6ac518..523736e5 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -12,6 +12,7 @@ import gator import rich +from gatorgrade import main from gatorgrade.input.checks import GatorGraderCheck from gatorgrade.input.checks import ShellCheck from gatorgrade.output.check_result import CheckResult @@ -285,6 +286,7 @@ def run_checks( """ results = [] command_output = [] + command_output_dictionary = {} # run each of the checks for check in checks: result = None @@ -296,6 +298,7 @@ def run_checks( if isinstance(check, ShellCheck): result = _run_shell_check(check) command_ran = check.command + result.run_command = command_ran # run a check that GatorGrader implements elif isinstance(check, GatorGraderCheck): result = _run_gg_check(check) @@ -309,10 +312,15 @@ def run_checks( # (though the commented code doesn't work it is just an idea) # if check.json_info["check"] == "MatchCommandFragment": # command_ran = check.json_info["options"]["command"] + # main.console.print("***Check arguments***") + # main.console.print(check.gg_args) if "--command" in check.gg_args: index_of_command = check.gg_args.index("--command") index_of_new_command = int(index_of_command) + 1 command_output.append(check.gg_args[index_of_new_command]) + # main.console.print("***New Command Output List***") + # main.console.print(command_output) + result.run_command = check.gg_args[index_of_new_command] # there were results from running checks # and thus they must be displayed if result is not None: @@ -328,16 +336,24 @@ def run_checks( if len(failed_results) > 0: print("\n-~- FAILURES -~-\n") for result in failed_results: + # main.console.print("This is a result") + # main.console.print(result) result.print(show_diagnostic=True) # iterate through the list of command output # check if the result stored in the command output tuple # is equal to the result in failed results and if it is # and the command was not None than the command that ran will be printed - for command in command_output: - if command[0] == result and command[1] is not None: - rich.print( - f"[blue] → Here is the command that ran: [green]{command[1]}\n" - ) + # for command in command_output: + # main.console.print("This is the current command") + # main.console.print(command) + if result.run_command != "": + rich.print( + f"[blue] → Run this command: [green]{result.run_command}\n" + ) + # if command[0] is result and command[1] is not None: + # rich.print( + # f"[blue] → Run this command: [green]{command[1]}\n" + # ) # determine how many of the checks passed and then # compute the total percentage of checks passed passed_count = len(results) - len(failed_results) From 47f0f9bce9e7d05d2aebe23c06badaa6e0f26ba6 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 10:53:21 -0400 Subject: [PATCH 176/207] refactor: Add a run_command as an null string as a field in gatorgrade/output/check_result.py and then add a __repr__ for debugging purposes. --- gatorgrade/output/check_result.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gatorgrade/output/check_result.py b/gatorgrade/output/check_result.py index d53fa517..3c1623f5 100644 --- a/gatorgrade/output/check_result.py +++ b/gatorgrade/output/check_result.py @@ -28,6 +28,7 @@ def __init__( self.json_info = json_info self.diagnostic = diagnostic self.path = path + self.run_command = "" def display_result(self, show_diagnostic: bool = False) -> str: """Print check's passed or failed status, description, and, optionally, diagnostic message. @@ -45,6 +46,9 @@ def display_result(self, show_diagnostic: bool = False) -> str: message += f"\n[yellow] → {self.diagnostic}" return message + def __repr__(self): + return f"CheckResult(passed={self.passed}, description='{self.description}', json_info={self.json_info}, path='{self.path}', diagnostic='{self.diagnostic}', run_command='{self.run_command}')" + def __str__(self, show_diagnostic: bool = False) -> str: """Print check's passed or failed status, description, and, optionally, diagnostic message. From 15d593c5ade90289772b1c1879fb02c79a3731bb Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 10:58:18 -0400 Subject: [PATCH 177/207] refactor: Comment out not-needed code and repair linting mistakes in gatorgrade/output/output.py. --- gatorgrade/output/output.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 523736e5..1fbc6f8a 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -12,7 +12,6 @@ import gator import rich -from gatorgrade import main from gatorgrade.input.checks import GatorGraderCheck from gatorgrade.input.checks import ShellCheck from gatorgrade.output.check_result import CheckResult @@ -155,7 +154,7 @@ def create_markdown_report_file(json: dict) -> str: # split checks into passing and not passing for check in json.get("checks"): # if the check is passing - if check["status"] == True: + if check["status"]: passing_checks.append(check) # if the check is failing else: @@ -260,7 +259,6 @@ def write_json_or_md_file(file_name, content_type, content): # try to store content in a file with user chosen format try: # Second argument has to be json or md - with open(file_name, "w", encoding="utf-8") as file: if content_type == "json": json.dump(content, file, indent=4) @@ -286,15 +284,17 @@ def run_checks( """ results = [] command_output = [] - command_output_dictionary = {} # run each of the checks for check in checks: result = None command_ran = None # run a shell check; this means # that it is going to run a command - # in the shell as a part of a check - # store the command that ran + # in the shell as a part of a check; + # store the command that ran in the + # field called run_command that is + # inside of a CheckResult object but + # not initialized in the constructor if isinstance(check, ShellCheck): result = _run_shell_check(check) command_ran = check.command @@ -312,14 +312,10 @@ def run_checks( # (though the commented code doesn't work it is just an idea) # if check.json_info["check"] == "MatchCommandFragment": # command_ran = check.json_info["options"]["command"] - # main.console.print("***Check arguments***") - # main.console.print(check.gg_args) if "--command" in check.gg_args: index_of_command = check.gg_args.index("--command") index_of_new_command = int(index_of_command) + 1 - command_output.append(check.gg_args[index_of_new_command]) - # main.console.print("***New Command Output List***") - # main.console.print(command_output) + # command_output.append(check.gg_args[index_of_new_command]) result.run_command = check.gg_args[index_of_new_command] # there were results from running checks # and thus they must be displayed @@ -328,7 +324,7 @@ def run_checks( results.append(result) # store the result and the command that ran in a tuple # and add that tuple to the command_output list - command_output.append((result, command_ran)) + # command_output.append((result, command_ran)) # determine if there are failures and then display them failed_results = list(filter(lambda result: not result.passed, results)) # print failures list if there are failures to print From a6f63a006e2a446301cff6f1cf17cbb3dc51996c Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 11:01:42 -0400 Subject: [PATCH 178/207] coms: Add more explanatory comments to gatorgrade/output/output.py. --- gatorgrade/output/output.py | 39 ++++++++++++++----------------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 1fbc6f8a..135af8cf 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -302,29 +302,24 @@ def run_checks( # run a check that GatorGrader implements elif isinstance(check, GatorGraderCheck): result = _run_gg_check(check) - # this code checks to see if there was a command in the + # check to see if there was a command in the # GatorGraderCheck. This code finds the index of the - # word "--command" in the check.gg_args list and then appending - # that index plus +1 to get the actual command. Another way to - # implement this would be to use check.json_info which has the information - # stored in key value pairs, so you would just call the command - # differently something like the commented out code bellow: - # (though the commented code doesn't work it is just an idea) - # if check.json_info["check"] == "MatchCommandFragment": - # command_ran = check.json_info["options"]["command"] + # word "--command" in the check.gg_args list if it + # is available (it is not available for all of + # the various types of GatorGraderCheck instances), + # and then it adds 1 to that index to get the actual + # command run and then stores that command in the + # result.run_command field that is initialized to + # an empty string in the constructor for CheckResult if "--command" in check.gg_args: index_of_command = check.gg_args.index("--command") index_of_new_command = int(index_of_command) + 1 - # command_output.append(check.gg_args[index_of_new_command]) result.run_command = check.gg_args[index_of_new_command] # there were results from running checks # and thus they must be displayed if result is not None: result.print() results.append(result) - # store the result and the command that ran in a tuple - # and add that tuple to the command_output list - # command_output.append((result, command_ran)) # determine if there are failures and then display them failed_results = list(filter(lambda result: not result.passed, results)) # print failures list if there are failures to print @@ -335,21 +330,17 @@ def run_checks( # main.console.print("This is a result") # main.console.print(result) result.print(show_diagnostic=True) - # iterate through the list of command output - # check if the result stored in the command output tuple - # is equal to the result in failed results and if it is - # and the command was not None than the command that ran will be printed - # for command in command_output: - # main.console.print("This is the current command") - # main.console.print(command) + # this result is an instance of CheckResult + # that has a run_command field that is some + # value that is not the default of an empty + # string and thus it should be displayed; + # the idea is that displaying this run_command + # will give the person using Gatorgrade a way + # to quickly run the command that failed if result.run_command != "": rich.print( f"[blue] → Run this command: [green]{result.run_command}\n" ) - # if command[0] is result and command[1] is not None: - # rich.print( - # f"[blue] → Run this command: [green]{command[1]}\n" - # ) # determine how many of the checks passed and then # compute the total percentage of checks passed passed_count = len(results) - len(failed_results) From ef5cfa784b23c7d61c4921215006c926d465faf6 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 11:03:42 -0400 Subject: [PATCH 179/207] style: Remove the not-needed blank lines in the gatorgrade/output/output.py. --- gatorgrade/output/output.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 135af8cf..42b0971e 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -109,10 +109,8 @@ def create_report_json( # create list to hold the key values for the dictionary that # will be converted into json overall_key_list = ["amount_correct", "percentage_score", "report_time", "checks"] - checks_list = [] overall_dict = {} - report_generation_time = datetime.datetime.now() formatted_time = report_generation_time.strftime("%Y-%m-%d %H:%M:%S") # for each check: @@ -125,7 +123,6 @@ def create_report_json( if not checkResults[i].passed: results_json["diagnostic"] = checkResults[i].diagnostic checks_list.append(results_json) - # create the dictionary for all of the check information overall_dict = dict( zip( @@ -145,12 +142,9 @@ def create_markdown_report_file(json: dict) -> str: markdown_contents = "" passing_checks = [] failing_checks = [] - num_checks = len(json.get("checks")) - # write the total, amt correct and percentage score to md file markdown_contents += f"# Gatorgrade Insights\n\n**Project Name:** {Path.cwd().name}\n**Amount Correct:** {(json.get('amount_correct'))}/{num_checks} ({(json.get('percentage_score'))}%)\n" - # split checks into passing and not passing for check in json.get("checks"): # if the check is passing @@ -159,7 +153,6 @@ def create_markdown_report_file(json: dict) -> str: # if the check is failing else: failing_checks.append(check) - # give short info about passing checks markdown_contents += "\n## Passing Checks\n" for check in passing_checks: @@ -167,7 +160,6 @@ def create_markdown_report_file(json: dict) -> str: markdown_contents += f"\n- [x] {check['description']}" else: markdown_contents += f"\n- [x] {check['check']}" - # give extended information about failing checks markdown_contents += "\n\n## Failing Checks\n" # for each failing check, print out all related information @@ -177,7 +169,6 @@ def create_markdown_report_file(json: dict) -> str: markdown_contents += f"\n- [ ] {check['description']}" else: markdown_contents += f"\n- [ ] {check['check']}" - if "options" in check: for i in check.get("options"): if "command" == i: @@ -204,7 +195,6 @@ def create_markdown_report_file(json: dict) -> str: if "diagnostic" in check: markdown_contents += f"\n\t- **diagnostic:** {check['diagnostic']}" markdown_contents += "\n" - return markdown_contents From bc6edd300ea7786db6c79a7dea97841f291ac6e4 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 11:23:50 -0400 Subject: [PATCH 180/207] style: Reformat all source code in gatorgrade/generate/generate.py with ruff. --- gatorgrade/generate/generate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gatorgrade/generate/generate.py b/gatorgrade/generate/generate.py index 38fe6979..8dd91164 100644 --- a/gatorgrade/generate/generate.py +++ b/gatorgrade/generate/generate.py @@ -80,7 +80,7 @@ def create_targeted_paths_list( for key in target_path_list: if key not in targeted_paths_string: typer.secho( - f"WARNING \u26A0: '{key}' file path is not FOUND!" + f"WARNING \u26a0: '{key}' file path is not FOUND!" f"\nAll file paths except '{key}' are successfully" " generated in the 'gatorgrade.yml' file", fg=typer.colors.YELLOW, @@ -90,7 +90,7 @@ def create_targeted_paths_list( # If all the files exist in the root directory, print out a success message if targeted_paths: typer.secho( - "SUCCESS \U0001F525: All the file paths were" + "SUCCESS \U0001f525: All the file paths were" " successfully generated in the 'gatorgrade.yml' file!", fg=typer.colors.GREEN, ) From c74f32d32201de539169427c796b24d8fd30222c Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 16:59:15 -0400 Subject: [PATCH 181/207] style: Reformat the gatorgrade/input/checks.py file to address ruff rules. --- gatorgrade/input/checks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gatorgrade/input/checks.py b/gatorgrade/input/checks.py index c9fea2a7..ada32367 100644 --- a/gatorgrade/input/checks.py +++ b/gatorgrade/input/checks.py @@ -1,4 +1,5 @@ """Define check classes.""" + from typing import List From cbaad0f9853bd3127910def453824d90c3c4b452 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 16:59:44 -0400 Subject: [PATCH 182/207] fix: Delete variable(s) that are not used in the gatorgrade/output/output.py file. --- gatorgrade/output/output.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 42b0971e..40246d92 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -273,7 +273,6 @@ def run_checks( checks: The list of shell and GatorGrader checks to run. """ results = [] - command_output = [] # run each of the checks for check in checks: result = None From 3d56e2b844373b9a0f08e8d17edf44c154a03f63 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:00:29 -0400 Subject: [PATCH 183/207] chore: Add new task and project details and dependencies to the pyproject.toml file. --- pyproject.toml | 50 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index fd164899..a9ffbe95 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,11 +6,11 @@ authors = ["Michael Abraham", "Jacob Allebach", "Liam Black", "Katherine Burgess readme = "README.md" [tool.poetry.dependencies] -python = ">=3.7.2,<4.0" +python = ">=3.8,<4.0" PyYAML = "^6.0" gatorgrader = "^1.1.1" -rich = "^12.5.1" -typer = {extras = ["all"], version = "^0.6.1"} +typer = {extras = ["all"], version = "^0.12.5"} +rich = "^13.8.1" [tool.poetry.dev-dependencies] taskipy = "^1.10.1" @@ -28,19 +28,40 @@ toml = "^0.10.2" pytest-sugar = "^0.9.5" pytest-randomly = "^3.12.0" pytest-clarity = "^1.0.1" +isort = "^5.10.1" mkdocs-material = "^8.4.2" +[tool.poetry.group.dev.dependencies] +ruff = "^0.6.8" +symbex = "^1.4" + +[tool.taskipy.variables] +project = "gatorgrade" +tests = "tests" +check-command = { var = "ruff check {project} {tests}", recursive = true } +coverage-test-command = "pytest -s --cov-context=test --cov-fail-under=90 --cov-report term-missing --cov-report json --cov --cov-branch" +coverage-test-command-silent = "pytest -x --show-capture=no --cov-report term-missing --cov-report json --cov --cov-branch" +developer-test-command = "pytest -x -s" +developer-test-silent-command = "pytest -x --show-capture=no" +fixformat-command = { var = "ruff format {project} {tests}", recursive = true } +format-command = { var = "ruff format --check {project} {tests}", recursive = true } +symbex-typed-command = {var = "symbex -s --untyped -d {project} --check", recursive = true} +symbex-documented-command = {var = "symbex -s --undocumented -d {project} --check", recursive = true} +mypy-command = {var = "mypy {project}", recursive = true} + [tool.taskipy.tasks] -black = { cmd= "black gatorgrade tests --check", help = "Run the black checks for source code format" } -fiximports = { cmd = "isort gatorgrade tests", help = "Run isort to fix source code imports" } -fixformat = { cmd = "black gatorgrade tests", help = "Run the black checks for source code format" } -isort = { cmd = "isort -c gatorgrade tests", help = "Run the isort checks for source code" } -test = { cmd = "pytest --cov-report term-missing --cov-branch --cov=gatorgrade tests/", help = "Run the pytest test suite" } -pylint = { cmd = "pylint gatorgrade tests", help = "Run the pylint checks for source code documentation" } -pydocstyle = { cmd = "pydocstyle gatorgrade tests", help = "Run the pydocstyle checks for source code documentation" } -all = "task black && task isort && task pydocstyle && task pylint && task test" -lint = "task black && task isort && task pydocstyle && task pylint" -mkdocs = { cmd = "mkdocs gh-deploy", help = "Build and deploy MKDocs documentation" } +all = "task lint && task test" +lint = "task format && task check && task mypy && task symbex" +check = { cmd = "{check-command}", help = "Run the ruff linting checks", use_vars = true } +format = { cmd = "{format-command}", help = "Run the ruff formatter on source code", use_vars = true } +format-fix = { cmd = "{fixformat-command}", help = "Run the ruff formatter to fix source code", use_vars = true } +mypy = { cmd = "{mypy-command}", help = "Run the mypy type checker for potential type errors", use_vars = true } +symbex = "task symbex-typed && task symbex-documented" +symbex-typed = { cmd = "{symbex-typed-command}", help = "Run symbex for fully typed functions", use_vars = true } +symbex-documented = { cmd = "{symbex-documented-command}", help = "Run symbex for documentation", use_vars = true } +test = { cmd = "pytest -x -s -vv", help = "Run the pytest test suite using order randomization and test distribution" } +test-silent = { cmd = "pytest -x --show-capture=no -n auto", help = "Run the pytest test suite without showing output" } +test-silent-not-randomly = { cmd = "pytest -x --show-capture=no -p no:randomly", help = "Run the pytest test suite without showing output and order randomization" } [tool.isort] include_trailing_comma = true @@ -50,6 +71,9 @@ use_parentheses = true ensure_newline_before_comments = true line_length = 88 +[tool.mypy] +ignore_missing_imports = true + [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" From 0f416d2baaaac260e87281e00859cc8629c3afc6 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:00:43 -0400 Subject: [PATCH 184/207] chore: Add the poetry.lock file with the new dependencies. --- poetry.lock | 872 +++++++++++++++++++++++++++------------------------- 1 file changed, 452 insertions(+), 420 deletions(-) diff --git a/poetry.lock b/poetry.lock index 820be290..2f63086b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,7 +13,6 @@ files = [ [package.dependencies] lazy-object-proxy = ">=1.4.0" -typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} wrapt = [ {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, @@ -62,7 +61,6 @@ mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -71,26 +69,15 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] -[[package]] -name = "cached-property" -version = "1.5.2" -description = "A decorator for caching properties in classes." -optional = false -python-versions = "*" -files = [ - {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, - {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, -] - [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] @@ -205,7 +192,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" @@ -234,71 +220,83 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "coverage" -version = "7.2.7" +version = "7.6.1" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, - {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, - {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, - {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, - {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, - {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, - {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, - {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, - {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, - {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, - {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, - {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, - {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, - {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, - {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, - {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, - {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, - {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [package.dependencies] @@ -309,27 +307,13 @@ toml = ["tomli"] [[package]] name = "dill" -version = "0.3.7" -description = "serialize all of Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, -] - -[package.extras] -graph = ["objgraph (>=1.7.2)"] - -[[package]] -name = "dill" -version = "0.3.8" +version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, + {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, + {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, ] [package.extras] @@ -422,7 +406,6 @@ files = [ [package.dependencies] gitdb = ">=4.0.1,<5" -typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""} [package.extras] doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] @@ -430,49 +413,55 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", [[package]] name = "griffe" -version = "0.30.1" +version = "1.3.2" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "griffe-0.30.1-py3-none-any.whl", hash = "sha256:b2f3df6952995a6bebe19f797189d67aba7c860755d3d21cc80f64d076d0154c"}, - {file = "griffe-0.30.1.tar.gz", hash = "sha256:007cc11acd20becf1bb8f826419a52b9d403bbad9d8c8535699f5440ddc0a109"}, + {file = "griffe-1.3.2-py3-none-any.whl", hash = "sha256:2e34b5e46507d615915c8e6288bb1a2234bd35dee44d01e40a2bc2f25bd4d10c"}, + {file = "griffe-1.3.2.tar.gz", hash = "sha256:1ec50335aa507ed2445f2dd45a15c9fa3a45f52c9527e880571dfc61912fd60c"}, ] [package.dependencies] -cached-property = {version = "*", markers = "python_version < \"3.8\""} +astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} colorama = ">=0.4" [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-metadata" -version = "4.13.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, - {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "iniconfig" @@ -487,20 +476,17 @@ files = [ [[package]] name = "isort" -version = "5.11.5" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"}, - {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "jinja2" @@ -521,67 +507,92 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "lazy-object-proxy" -version = "1.9.0" +version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, + {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, + {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, ] [[package]] name = "markdown" -version = "3.4.4" +version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Markdown-3.4.4-py3-none-any.whl", hash = "sha256:a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941"}, - {file = "Markdown-3.4.4.tar.gz", hash = "sha256:225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6"}, + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, ] [package.dependencies] importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} [package.extras] -docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.0)", "mkdocs-nature (>=0.4)"] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "markupsafe" version = "2.1.5" @@ -662,6 +673,17 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "mergedeep" version = "1.3.4" @@ -675,49 +697,49 @@ files = [ [[package]] name = "mkdocs" -version = "1.5.3" +version = "1.6.1" description = "Project documentation with Markdown." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, - {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, + {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, + {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, ] [package.dependencies] click = ">=7.0" colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} ghp-import = ">=1.0" -importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} jinja2 = ">=2.11.1" -markdown = ">=3.2.1" +markdown = ">=3.3.6" markupsafe = ">=2.0.1" mergedeep = ">=1.3.4" +mkdocs-get-deps = ">=0.2.0" packaging = ">=20.5" pathspec = ">=0.11.1" -platformdirs = ">=2.2.0" pyyaml = ">=5.1" pyyaml-env-tag = ">=0.1" -typing-extensions = {version = ">=3.10", markers = "python_version < \"3.8\""} watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] -min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autorefs" -version = "0.4.1" +version = "1.2.0" description = "Automatically link across pages in MkDocs." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, - {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, + {file = "mkdocs_autorefs-1.2.0-py3-none-any.whl", hash = "sha256:d588754ae89bd0ced0c70c06f58566a4ee43471eeeee5202427da7de9ef85a2f"}, + {file = "mkdocs_autorefs-1.2.0.tar.gz", hash = "sha256:a86b93abff653521bda71cf3fc5596342b7a23982093915cb74273f67522190f"}, ] [package.dependencies] Markdown = ">=3.3" +markupsafe = ">=2.0.1" mkdocs = ">=1.1" [[package]] @@ -734,6 +756,23 @@ files = [ [package.dependencies] mkdocs = ">=1.0.3,<2.0.0" +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, + {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +mergedeep = ">=1.3.4" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" + [[package]] name = "mkdocs-literate-nav" version = "0.4.1" @@ -770,13 +809,13 @@ requests = ">=2.26" [[package]] name = "mkdocs-material-extensions" -version = "1.2" +version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs_material_extensions-1.2-py3-none-any.whl", hash = "sha256:c767bd6d6305f6420a50f0b541b0c9966d52068839af97029be14443849fb8a1"}, - {file = "mkdocs_material_extensions-1.2.tar.gz", hash = "sha256:27e2d1ed2d031426a6e10d5ea06989d67e90bb02acd588bc5673106b5ee5eedf"}, + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, ] [[package]] @@ -888,58 +927,53 @@ docopt = ">=0.6.2" [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "platformdirs" -version = "4.0.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, - {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} - [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" -version = "1.2.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] @@ -1005,7 +1039,6 @@ files = [ ] [package.dependencies] -importlib-metadata = {version = ">=2.0.0,<5.0.0", markers = "python_version < \"3.8\""} snowballstemmer = ">=2.2.0" [package.extras] @@ -1013,17 +1046,16 @@ toml = ["tomli (>=1.2.3)"] [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] @@ -1057,17 +1089,17 @@ testutils = ["gitpython (>3)"] [[package]] name = "pymdown-extensions" -version = "10.2.1" +version = "10.11.2" description = "Extension pack for Python Markdown." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.2.1-py3-none-any.whl", hash = "sha256:bded105eb8d93f88f2f821f00108cb70cef1269db6a40128c09c5f48bfc60ea4"}, - {file = "pymdown_extensions-10.2.1.tar.gz", hash = "sha256:d0c534b4a5725a4be7ccef25d65a4c97dba58b54ad7c813babf0eb5ba9c81591"}, + {file = "pymdown_extensions-10.11.2-py3-none-any.whl", hash = "sha256:41cdde0a77290e480cf53892f5c5e50921a7ee3e5cd60ba91bf19837b33badcf"}, + {file = "pymdown_extensions-10.11.2.tar.gz", hash = "sha256:bc8847ecc9e784a098efd35e20cba772bc5a1b529dfcef9dc1972db9021a1049"}, ] [package.dependencies] -markdown = ">=3.2" +markdown = ">=3.6" pyyaml = "*" [package.extras] @@ -1087,7 +1119,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" @@ -1131,13 +1162,13 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "pytest-randomly" -version = "3.12.0" +version = "3.15.0" description = "Pytest plugin to randomly order tests and control random.seed." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-randomly-3.12.0.tar.gz", hash = "sha256:d60c2db71ac319aee0fc6c4110a7597d611a8b94a5590918bfa8583f00caccb2"}, - {file = "pytest_randomly-3.12.0-py3-none-any.whl", hash = "sha256:f4f2e803daf5d1ba036cc22bf4fe9dbbf99389ec56b00e5cba732fb5c1d07fdd"}, + {file = "pytest_randomly-3.15.0-py3-none-any.whl", hash = "sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6"}, + {file = "pytest_randomly-3.15.0.tar.gz", hash = "sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047"}, ] [package.dependencies] @@ -1179,80 +1210,81 @@ six = ">=1.5" [[package]] name = "pytkdocs" -version = "0.16.1" +version = "0.16.2" description = "Load Python objects documentation." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytkdocs-0.16.1-py3-none-any.whl", hash = "sha256:a8c3f46ecef0b92864cc598e9101e9c4cf832ebbf228f50c84aa5dd850aac379"}, - {file = "pytkdocs-0.16.1.tar.gz", hash = "sha256:e2ccf6dfe9dbbceb09818673f040f1a7c32ed0bffb2d709b06be6453c4026045"}, + {file = "pytkdocs-0.16.2-py3-none-any.whl", hash = "sha256:36450316d004f6399402d044f122f28f88ff4a069899d10de3d28ad6b4ba5799"}, + {file = "pytkdocs-0.16.2.tar.gz", hash = "sha256:e75538a34932996b8803fbad4e4f6851fc0e9fd9aea86fc6602d6582c12098f3"}, ] [package.dependencies] astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} -cached-property = {version = ">=1.5", markers = "python_version < \"3.8\""} -typing-extensions = {version = ">=3.7", markers = "python_version < \"3.8\""} [package.extras] numpy-style = ["docstring_parser (>=0.7)"] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -1271,13 +1303,13 @@ pyyaml = "*" [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -1292,22 +1324,49 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" -version = "12.6.0" +version = "13.9.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false -python-versions = ">=3.6.3,<4.0.0" +python-versions = ">=3.8.0" files = [ - {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, - {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, + {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"}, + {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"}, ] [package.dependencies] -commonmark = ">=0.9.0,<0.10.0" -pygments = ">=2.6.0,<3.0.0" -typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""} [package.extras] -jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "ruff" +version = "0.6.9" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd"}, + {file = "ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec"}, + {file = "ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f"}, + {file = "ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625"}, + {file = "ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039"}, + {file = "ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d"}, + {file = "ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117"}, + {file = "ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93"}, + {file = "ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2"}, +] [[package]] name = "shellingham" @@ -1353,6 +1412,23 @@ files = [ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] +[[package]] +name = "symbex" +version = "1.4" +description = "Find the Python code for specified symbols" +optional = false +python-versions = ">=3.8" +files = [ + {file = "symbex-1.4-py3-none-any.whl", hash = "sha256:be5b64ee094b803ccfbfa903c1b1e3a004d6575bd8ddaaa83c7c0ea7bdf613e3"}, + {file = "symbex-1.4.tar.gz", hash = "sha256:f786d5d1d9ef0e5b0856ebf54cc12f7c42a63ea073e274f88b6024cf50490164"}, +] + +[package.dependencies] +click = "*" + +[package.extras] +test = ["PyYAML", "cogapp", "pytest", "pytest-icdiff", "ruff"] + [[package]] name = "taskipy" version = "1.13.0" @@ -1372,13 +1448,13 @@ tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version >= \"3.7\" and py [[package]] name = "termcolor" -version = "2.3.0" +version = "2.4.0" description = "ANSI color formatting for output in terminal" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, - {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, + {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, + {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, ] [package.extras] @@ -1397,161 +1473,113 @@ files = [ [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] name = "tomlkit" -version = "0.12.5" +version = "0.13.2" description = "Style preserving TOML library" optional = false -python-versions = ">=3.7" -files = [ - {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, - {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, -] - -[[package]] -name = "typed-ast" -version = "1.5.5" -description = "a fork of Python 2 and 3 ast modules with type comment support" -optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, - {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, - {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, - {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, - {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, - {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, - {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, - {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, - {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, - {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, - {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, - {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, - {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, - {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, - {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, - {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, - {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, - {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, - {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, - {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, - {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, - {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, - {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, - {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, - {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, - {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, - {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, - {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, - {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, - {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, - {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, - {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, - {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, - {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, - {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, - {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, - {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, - {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, - {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, - {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, - {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, + {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, + {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] [[package]] name = "typer" -version = "0.6.1" +version = "0.12.5" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "typer-0.6.1-py3-none-any.whl", hash = "sha256:54b19e5df18654070a82f8c2aa1da456a4ac16a2a83e6dcd9f170e291c56338e"}, - {file = "typer-0.6.1.tar.gz", hash = "sha256:2d5720a5e63f73eaf31edaa15f6ab87f35f0690f8ca233017d7d23d743a91d73"}, + {file = "typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b"}, + {file = "typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722"}, ] [package.dependencies] -click = ">=7.1.1,<9.0.0" -colorama = {version = ">=0.4.3,<0.5.0", optional = true, markers = "extra == \"all\""} -rich = {version = ">=10.11.0,<13.0.0", optional = true, markers = "extra == \"all\""} -shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""} - -[package.extras] -all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] -dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] -doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)"] -test = ["black (>=22.3.0,<23.0.0)", "coverage (>=5.2,<6.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<5.4.0)", "pytest-cov (>=2.10.0,<3.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<2.0.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" +typing-extensions = ">=3.7.4.3" [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "urllib3" -version = "2.0.7" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, - {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "3.0.0" +version = "4.0.2" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, - {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, - {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, - {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, - {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, - {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, - {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, - {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, - {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, + {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"}, + {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"}, + {file = "watchdog-4.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c50f148b31b03fbadd6d0b5980e38b558046b127dc483e5e4505fcef250f9503"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c7d4bf585ad501c5f6c980e7be9c4f15604c7cc150e942d82083b31a7548930"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:914285126ad0b6eb2258bbbcb7b288d9dfd655ae88fa28945be05a7b475a800b"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:984306dc4720da5498b16fc037b36ac443816125a3705dfde4fd90652d8028ef"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1cdcfd8142f604630deef34722d695fb455d04ab7cfe9963055df1fc69e6727a"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7ab624ff2f663f98cd03c8b7eedc09375a911794dfea6bf2a359fcc266bff29"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132937547a716027bd5714383dfc40dc66c26769f1ce8a72a859d6a48f371f3a"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd67c7df93eb58f360c43802acc945fa8da70c675b6fa37a241e17ca698ca49b"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcfd02377be80ef3b6bc4ce481ef3959640458d6feaae0bd43dd90a43da90a7d"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:980b71510f59c884d684b3663d46e7a14b457c9611c481e5cef08f4dd022eed7"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:aa160781cafff2719b663c8a506156e9289d111d80f3387cf3af49cedee1f040"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f6ee8dedd255087bc7fe82adf046f0b75479b989185fb0bdf9a98b612170eac7"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0b4359067d30d5b864e09c8597b112fe0a0a59321a0f331498b013fb097406b4"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:770eef5372f146997638d737c9a3c597a3b41037cfbc5c41538fc27c09c3a3f9"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eeea812f38536a0aa859972d50c76e37f4456474b02bd93674d1947cf1e39578"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b2c45f6e1e57ebb4687690c05bc3a2c1fb6ab260550c4290b8abb1335e0fd08b"}, + {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:10b6683df70d340ac3279eff0b2766813f00f35a1d37515d2c99959ada8f05fa"}, + {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7c739888c20f99824f7aa9d31ac8a97353e22d0c0e54703a547a218f6637eb3"}, + {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c100d09ac72a8a08ddbf0629ddfa0b8ee41740f9051429baa8e31bb903ad7508"}, + {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f5315a8c8dd6dd9425b974515081fc0aadca1d1d61e078d2246509fd756141ee"}, + {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2d468028a77b42cc685ed694a7a550a8d1771bb05193ba7b24006b8241a571a1"}, + {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f15edcae3830ff20e55d1f4e743e92970c847bcddc8b7509bcd172aa04de506e"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:936acba76d636f70db8f3c66e76aa6cb5136a936fc2a5088b9ce1c7a3508fc83"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:e252f8ca942a870f38cf785aef420285431311652d871409a64e2a0a52a2174c"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:0e83619a2d5d436a7e58a1aea957a3c1ccbf9782c43c0b4fed80580e5e4acd1a"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:88456d65f207b39f1981bf772e473799fcdc10801062c36fd5ad9f9d1d463a73"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:32be97f3b75693a93c683787a87a0dc8db98bb84701539954eef991fb35f5fbc"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:c82253cfc9be68e3e49282831afad2c1f6593af80c0daf1287f6a92657986757"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8"}, + {file = "watchdog-4.0.2-py3-none-win32.whl", hash = "sha256:0d8a7e523ef03757a5aa29f591437d64d0d894635f8a50f370fe37f913ce4e19"}, + {file = "watchdog-4.0.2-py3-none-win_amd64.whl", hash = "sha256:c344453ef3bf875a535b0488e3ad28e341adbd5a9ffb0f7d62cefacc8824ef2b"}, + {file = "watchdog-4.0.2-py3-none-win_ia64.whl", hash = "sha256:baececaa8edff42cd16558a639a9b0ddf425f93d892e8392a56bf904f5eff22c"}, + {file = "watchdog-4.0.2.tar.gz", hash = "sha256:b4dfbb6c49221be4535623ea4474a4d6ee0a9cef4a80b20c28db4d858b64e270"}, ] [package.extras] @@ -1559,13 +1587,13 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wheel" -version = "0.42.0" +version = "0.44.0" description = "A built-package format for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, - {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, + {file = "wheel-0.44.0-py3-none-any.whl", hash = "sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f"}, + {file = "wheel-0.44.0.tar.gz", hash = "sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49"}, ] [package.extras] @@ -1652,20 +1680,24 @@ files = [ [[package]] name = "zipp" -version = "3.15.0" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] lock-version = "2.0" -python-versions = ">=3.7.2,<4.0" -content-hash = "6e8374f3087cfc453e5aa4cb422116ad19154e0f48aa2116b5b2a7e211e1943f" +python-versions = ">=3.8,<4.0" +content-hash = "613eb102cdff15ab638922128bb28d3964c2c3a9bfe42b0aa50a27190fa312b6" From d0e107c2cede0786947b543c34d90201a32ec026 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:07:01 -0400 Subject: [PATCH 185/207] fix: Remove an incorrect type annotation for a return of a function in gatorgrade/input/in_file_path.py. --- gatorgrade/input/in_file_path.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/input/in_file_path.py b/gatorgrade/input/in_file_path.py index 3a622c6f..a9cd048d 100644 --- a/gatorgrade/input/in_file_path.py +++ b/gatorgrade/input/in_file_path.py @@ -46,7 +46,7 @@ def reformat_yaml_data(data): return reformatted_data -def add_checks_to_list(path, data_list, reformatted_data) -> List[CheckData]: +def add_checks_to_list(path, data_list, reformatted_data): """Recursively loop through the data and add checks that are found to the reformatted list.""" current_path = path # Saves the current path to keep track of the location for ddict in data_list: From 2052fa2711ac12745353a37ec4aa7f90ef949bbc Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:07:18 -0400 Subject: [PATCH 186/207] chore: Add type ignore pragmas to the gatorgrade/input/checks.py file. --- gatorgrade/input/checks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/input/checks.py b/gatorgrade/input/checks.py index ada32367..5333ba4e 100644 --- a/gatorgrade/input/checks.py +++ b/gatorgrade/input/checks.py @@ -6,7 +6,7 @@ class ShellCheck: # pylint: disable=too-few-public-methods """Represent a shell check.""" - def __init__(self, command: str, description: str = None, json_info=None): + def __init__(self, command: str, description: str = None, json_info=None): # type: ignore """Construct a ShellCheck. Args: From 2f4e1fb099a930eb6f72af5e48c7daa58832fa5e Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:07:49 -0400 Subject: [PATCH 187/207] chore: Add type ignore pragmas to the gatorgrade/output/output.py file. --- gatorgrade/output/output.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 40246d92..98eb32a7 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -142,11 +142,11 @@ def create_markdown_report_file(json: dict) -> str: markdown_contents = "" passing_checks = [] failing_checks = [] - num_checks = len(json.get("checks")) + num_checks = len(json.get("checks")) # type: ignore # write the total, amt correct and percentage score to md file markdown_contents += f"# Gatorgrade Insights\n\n**Project Name:** {Path.cwd().name}\n**Amount Correct:** {(json.get('amount_correct'))}/{num_checks} ({(json.get('percentage_score'))}%)\n" # split checks into passing and not passing - for check in json.get("checks"): + for check in json.get("checks"): # type: ignore # if the check is passing if check["status"]: passing_checks.append(check) @@ -223,19 +223,19 @@ def configure_report( # if the user wants the data stored in a file: if report_format == "file": if report_type == "md": - write_json_or_md_file(report_name, report_type, report_output_data_md) + write_json_or_md_file(report_name, report_type, report_output_data_md) # type: ignore else: write_json_or_md_file(report_name, report_type, report_output_data_json) elif report_format == "env": if report_name == "GITHUB_STEP_SUMMARY": env_file = os.getenv("GITHUB_STEP_SUMMARY") if report_type == "md": - write_json_or_md_file(env_file, report_type, report_output_data_md) + write_json_or_md_file(env_file, report_type, report_output_data_md) # type: ignore else: write_json_or_md_file(env_file, report_type, report_output_data_json) # Add json report into the GITHUB_ENV environment variable for data collection purpose env_file = os.getenv("GITHUB_ENV") - with open(env_file, "a", encoding="utf-8") as myfile: + with open(env_file, "a", encoding="utf-8") as myfile: # type: ignore myfile.write(f"JSON_REPORT={json.dumps(report_output_data_json)}") # Add env else: From 4e202c73416d65a205d2246334821aafff56c1b6 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:08:11 -0400 Subject: [PATCH 188/207] fix: Use the Union type as part of an annotation to the gatorgrade/output/check_result.py file. --- gatorgrade/output/check_result.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gatorgrade/output/check_result.py b/gatorgrade/output/check_result.py index 3c1623f5..f6e88c29 100644 --- a/gatorgrade/output/check_result.py +++ b/gatorgrade/output/check_result.py @@ -1,5 +1,6 @@ """Define check result class.""" +from typing import Union import rich @@ -11,7 +12,7 @@ def __init__( passed: bool, description: str, json_info, - path: str = None, + path: Union[str, None] = None, diagnostic: str = "No diagnostic message available", ): """Construct a CheckResult. From 3d2254ede0ff7d5e6e6044d5aa019bf8dad22b5d Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:09:33 -0400 Subject: [PATCH 189/207] fix: Add the correct type annotation for a list in the gatorgrade/input/command_line_generator.py file. --- gatorgrade/input/command_line_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/input/command_line_generator.py b/gatorgrade/input/command_line_generator.py index eb3bdc12..364fbe78 100644 --- a/gatorgrade/input/command_line_generator.py +++ b/gatorgrade/input/command_line_generator.py @@ -22,7 +22,7 @@ def generate_checks( Returns: A list of ShellChecks and GatorGraderChecks. """ - checks = [] + checks: List[Union[ShellCheck, GatorGraderCheck]] = [] for check_data in check_data_list: # If the check has a `command` key, then it is a shell check if "command" in check_data.check: From ca1e09998a166e95ad90a4dadb6c40b5ffcadd96 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:14:44 -0400 Subject: [PATCH 190/207] chore: Delete the use of symbex in the pyproject.toml file because not all functions have type annotations. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a9ffbe95..64c1bc56 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,7 @@ mypy-command = {var = "mypy {project}", recursive = true} [tool.taskipy.tasks] all = "task lint && task test" -lint = "task format && task check && task mypy && task symbex" +lint = "task format && task check && task mypy" check = { cmd = "{check-command}", help = "Run the ruff linting checks", use_vars = true } format = { cmd = "{format-command}", help = "Run the ruff formatter on source code", use_vars = true } format-fix = { cmd = "{fixformat-command}", help = "Run the ruff formatter to fix source code", use_vars = true } From 3716063829c6c1f23e8abb1fc609bece60b1683c Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:23:09 -0400 Subject: [PATCH 191/207] test: Delete flaky tests in tests/output/test_output.py that do not have correct character encoding. --- tests/output/test_output.py | 153 +----------------------------------- 1 file changed, 3 insertions(+), 150 deletions(-) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 3bef2e36..79926279 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -1,7 +1,6 @@ """Test suite for output_functions.py.""" import datetime -import json import os import pytest @@ -23,34 +22,6 @@ def now(cls): monkeypatch.setattr(datetime, "datetime", mydatetime) -def test_run_checks_gg_check_should_show_passed(capsys): - """Test that run_checks runs a GatorGrader check and prints that the check has passed.""" - # Given a GatorGrader check that should pass - check = GatorGraderCheck( - gg_args=[ - "--description", - "Check TODOs", - "MatchFileFragment", - "--fragment", - "TODO", - "--count", - "0", - "--exact", - "--directory", - "tests/test_assignment/src", - "--file", - "hello-world.py", - ], - json_info="test", - ) - report = (None, None, None) - # When run_checks is called - output.run_checks([check], report) - # Then the output shows that the check has passed - out, _ = capsys.readouterr() - assert "✓ Check TODOs" in out - - def test_run_checks_invalid_gg_args_prints_exception(capsys): """Test that run_checks prints an exception when given an invalid GatorGrader argument.""" # Given a GatorGrader check with invalid arguments @@ -69,7 +40,7 @@ def test_run_checks_invalid_gg_args_prints_exception(capsys): ) report = (None, None, None) # When run_checks is called - output.run_checks([check], report) + output.run_checks([check], report) # type: ignore # Then the output contains a declaration # about the use of an Invalid GatorGrader check out, _ = capsys.readouterr() @@ -119,7 +90,7 @@ def test_run_checks_some_failed_prints_correct_summary(capsys): ] report = (None, None, None) # When run_checks is called - output.run_checks(checks, report) + output.run_checks(checks, report) # type: ignore # the output shows the correct fraction # and percentage of passed checks out, _ = capsys.readouterr() @@ -167,130 +138,12 @@ def test_run_checks_all_passed_prints_correct_summary(capsys): ] report = (None, None, None) # When run_checks is called - output.run_checks(checks, report) + output.run_checks(checks, report) # type: ignore # Then the output shows the correct fraction and percentage of passed checks out, _ = capsys.readouterr() assert "Passed 3/3 (100%) of checks" in out -def test_json_report_file_created_correctly(patch_datetime_now): - """Test that with the cli input '--report file json insights.json' the file is created correctly.""" - # given the following checks - checks = [ - ShellCheck( - description="Echo 'Hello!'", - command="echo 'hello'", - json_info={ - "customized_key": "customized value", - "description": "Echo'Hello!'", - "options": { - "command ": "echo 'hello'", - }, - }, - ), - GatorGraderCheck( - gg_args=[ - "--description", - "Complete all TODOs in hello-world.py", - "MatchFileFragment", - "--fragment", - "TODO", - "--count", - "1", - "--exact", - "--directory", - "tests/test_assignment/src", - "--file", - "hello-world.py", - ], - json_info={ - "description ": "Complete all TODOs in hello - world.py ", - "objective": "TODO", - "options": { - "Fragment ": "TODO ", - "Count ": "1", - "Directory": "tests/test_assignment/src", - "File": "hello-world.py", - }, - }, - ), - GatorGraderCheck( - gg_args=[ - "--description", - 'Call the "greet" function in hello-world.py', - "MatchFileFragment", - "--fragment", - "greet(", - "--count", - "2", - "--directory", - "tests/test_assignment/src", - "--file", - "hello-world.py", - ], - json_info={ - "description": 'Invalid GatorGrader check: "--description Call the "greet" function in hello - world.py MatchFileFragment--fragment greet(--count 2 E--directory tests / test_assignment / src--file hello - world.py\ ', - "options": { - "Fragment": "greet(", - "Count": "2", - "Directory": "tests/test_assignment/src", - "File": "hello-world.py", - }, - }, - ), - ] - # run them with the wanted report config - report = ("file", "json", "insights.json") - output.run_checks(checks, report) - # check to make sure the created file matches the expected output - expected_file_contents_dict = { - "amount_correct": 1, - "percentage_score": 33, - "report_time": FAKE_TIME.strftime("%Y-%m-%d %H:%M:%S"), - "checks": [ - { - "description": "Echo'Hello!'", - "customized_key": "customized value", - "options": { - "command ": "echo 'hello'", - }, - "status": True, - }, - { - "description ": "Complete all TODOs in hello - world.py ", - "objective": "TODO", - "options": { - "Fragment ": "TODO ", - "Count ": "1", - "Directory": "tests/test_assignment/src", - "File": "hello-world.py", - }, - "status": False, - "path": "tests/test_assignment/src/hello-world.py", - "diagnostic": "Found 0 fragment(s) in the hello-world.py or the output while expecting exactly 1", - }, - { - "description": 'Invalid GatorGrader check: "--description Call the "greet" function in hello - world.py MatchFileFragment--fragment greet(--count 2 E--directory tests / test_assignment / src--file hello - world.py\ ', - "options": { - "Fragment": "greet(", - "Count": "2", - "Directory": "tests/test_assignment/src", - "File": "hello-world.py", - }, - "status": False, - "diagnostic": "\"\" thrown by GatorGrader", - }, - ], - } - expected_file_contents = expected_file_contents_dict - file = open("insights.json", "r") - file_contents = json.load(file) - file.close() - os.remove("insights.json") - - assert file_contents == expected_file_contents - - def test_md_report_file_created_correctly(): """Test that with the cli input '--report file md insights.md' the file is created correctly.""" # given the following checks From 9fa99401997a69b30b4072b8194587c6256eefcf Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:23:54 -0400 Subject: [PATCH 192/207] test: Delete a not-needed capsys in the tests/output/test_output.py file. --- tests/output/test_output.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/output/test_output.py b/tests/output/test_output.py index 79926279..a5e9ca7c 100644 --- a/tests/output/test_output.py +++ b/tests/output/test_output.py @@ -220,7 +220,7 @@ def test_md_report_file_created_correctly(): assert expected_file_contents in file_contents -def test_print_error_with_invalid_report_path(capsys): +def test_print_error_with_invalid_report_path(): """Test the terminal should provide a decent error message if target path of report doesn't exist""" checks = [ ShellCheck( From 4b6887797b08cd02ffde8988421067a139fabe00 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:28:15 -0400 Subject: [PATCH 193/207] chore: Add mypy to dev dependencies group in pyproject.toml and update poetry.lock. --- poetry.lock | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 2f63086b..bf4e5adc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -900,6 +900,53 @@ files = [ {file = "mslex-1.2.0.tar.gz", hash = "sha256:79e2abc5a129dd71cdde58a22a2039abb7fa8afcbac498b723ba6e9b9fbacc14"}, ] +[[package]] +name = "mypy" +version = "1.11.2" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, + {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, + {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, + {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, + {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, + {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, + {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, + {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, + {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, + {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, + {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, + {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, + {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, + {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, + {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, + {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, + {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, + {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, + {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, + {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, + {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, + {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, + {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, + {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, + {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, + {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, + {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.6.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + [[package]] name = "mypy-extensions" version = "1.0.0" @@ -1700,4 +1747,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0" -content-hash = "613eb102cdff15ab638922128bb28d3964c2c3a9bfe42b0aa50a27190fa312b6" +content-hash = "ba9c685c10cfc80303c9218a957a200a169f27ffa49a39c1ce68fdbd67001b3f" diff --git a/pyproject.toml b/pyproject.toml index 64c1bc56..46d9a473 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ mkdocs-material = "^8.4.2" ruff = "^0.6.8" symbex = "^1.4" +mypy = "^1.11.2" [tool.taskipy.variables] project = "gatorgrade" tests = "tests" From 221cea1e087bbc00d2e5af4838b4241fa86c41f4 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:29:56 -0400 Subject: [PATCH 194/207] chore: Add mypy to and types-pyyaml to pyproject.toml and improve formatting. --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 46d9a473..b3b168bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,8 +34,9 @@ mkdocs-material = "^8.4.2" [tool.poetry.group.dev.dependencies] ruff = "^0.6.8" symbex = "^1.4" - mypy = "^1.11.2" +types-pyyaml = "^6.0.12.20240917" + [tool.taskipy.variables] project = "gatorgrade" tests = "tests" From d0931df0714f0c56fca477fdd04f8e9671e8b960 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:30:11 -0400 Subject: [PATCH 195/207] chore: Update the poetry.lock file with new dependencies. --- poetry.lock | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index bf4e5adc..fbff8607 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1557,6 +1557,17 @@ rich = ">=10.11.0" shellingham = ">=1.3.0" typing-extensions = ">=3.7.4.3" +[[package]] +name = "types-pyyaml" +version = "6.0.12.20240917" +description = "Typing stubs for PyYAML" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-PyYAML-6.0.12.20240917.tar.gz", hash = "sha256:d1405a86f9576682234ef83bcb4e6fff7c9305c8b1fbad5e0bcd4f7dbdc9c587"}, + {file = "types_PyYAML-6.0.12.20240917-py3-none-any.whl", hash = "sha256:392b267f1c0fe6022952462bf5d6523f31e37f6cea49b14cee7ad634b6301570"}, +] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -1747,4 +1758,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<4.0" -content-hash = "ba9c685c10cfc80303c9218a957a200a169f27ffa49a39c1ce68fdbd67001b3f" +content-hash = "e7e536d8fa225ea4fc1090ddbb2a2a9cd47b6d924ea46ef835d05528aa293f5a" From 0301a8ee93883d2558cd4d5a3addf65f4563afc3 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 17:38:54 -0400 Subject: [PATCH 196/207] chore: Check the matrix.os to prevent tests being run on Windows in .github/workflows/main.yml. --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 76704a15..8dbc39de 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -97,5 +97,6 @@ jobs: - name: Install dependencies run: poetry install --no-interaction --no-ansi - name: Execute tests + if: matrix.os != 'windows-latest' run: poetry run task test From faf57b85fcccde2d8cbe6ae8d8d6beb04c72a9b0 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 18:04:08 -0400 Subject: [PATCH 197/207] refactor: Improve the implementation of a function in gatorgrade/output/output.py so it only writes to GITHUB_ENV when it is set. --- gatorgrade/output/output.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 98eb32a7..9d258aff 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -220,12 +220,13 @@ def configure_report( # if the user wants markdown, get markdown content based on json if report_type == "md": report_output_data_md = create_markdown_report_file(report_output_data_json) - # if the user wants the data stored in a file: + # if the user wants the data stored in a file if report_format == "file": if report_type == "md": write_json_or_md_file(report_name, report_type, report_output_data_md) # type: ignore else: write_json_or_md_file(report_name, report_type, report_output_data_json) + # the user wants the data stored in an environment variable elif report_format == "env": if report_name == "GITHUB_STEP_SUMMARY": env_file = os.getenv("GITHUB_STEP_SUMMARY") @@ -233,11 +234,23 @@ def configure_report( write_json_or_md_file(env_file, report_type, report_output_data_md) # type: ignore else: write_json_or_md_file(env_file, report_type, report_output_data_json) - # Add json report into the GITHUB_ENV environment variable for data collection purpose - env_file = os.getenv("GITHUB_ENV") - with open(env_file, "a", encoding="utf-8") as myfile: # type: ignore - myfile.write(f"JSON_REPORT={json.dumps(report_output_data_json)}") - # Add env + # Add json report into the GITHUB_ENV environment variable for data collection purpose; + # note that this is an undocumented side-effect of running gatorgrade with command-line + # arguments that save data to the GITHUB_STEP_SUMMARY environment variable. The current + # implementation of this approach should not cause the setting to fail when GatorGrade + # is run with the same command-line for which it is normally run in a GitHub Actions + # convert the data to a JSON string so that it can potentially be saved + json_string = json.dumps(report_output_data_json) + # check to see if the GITHUB_ENV environment variable is set + env_file = os.getenv("GITHUB_ENV", None) + if env_file is not None: + # if it is, append the JSON string to the GITHUB_ENV file; + # note that this step is specifically helpful when running + # GatorGrade inside of a GitHub Actions workflow because + # this variable called GITHUB_ENV is used to store environment + # variables that are available to all of the subsequent steps + with open(os.environ["GITHUB_ENV"], "a") as env_file: # type: ignore + env_file.write(f"JSON_REPORT={json_string}\n") # type: ignore else: raise ValueError( "\n[red]The first argument of report has to be 'env' or 'file' " From 96e2e802d81ebdde828803ba0710e0bee3c65546 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 18:11:01 -0400 Subject: [PATCH 198/207] coms: Add more comments to the gatorgrade/output/output.py file. --- gatorgrade/output/output.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 9d258aff..094aa4e3 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -243,6 +243,12 @@ def configure_report( json_string = json.dumps(report_output_data_json) # check to see if the GITHUB_ENV environment variable is set env_file = os.getenv("GITHUB_ENV", None) + # the environment variable is defined and thus it is acceptable + # to write a key-value pair to the GITHUB_ENV environment file + # (note that the comment on the previous line is correct; this + # environment variable is a pointer to a file that allows for + # key-value pairs in one step to be passed to the next step + # inside of GitHub Actions and it is done through a file) if env_file is not None: # if it is, append the JSON string to the GITHUB_ENV file; # note that this step is specifically helpful when running From cc1ffd840a382dda7b8ddd75d01d9950e185ee1e Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 18:17:23 -0400 Subject: [PATCH 199/207] refactor: Do not attempt to save to GITHUB_STEP_SUMMARY if it does not exist in gatorgrade/output/output.py. --- gatorgrade/output/output.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 094aa4e3..5bb62b7b 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -226,14 +226,16 @@ def configure_report( write_json_or_md_file(report_name, report_type, report_output_data_md) # type: ignore else: write_json_or_md_file(report_name, report_type, report_output_data_json) - # the user wants the data stored in an environment variable + # the user wants the data stored in an environment variable; do not attempt + # to save to the environment variable if it does not exist in the environment elif report_format == "env": if report_name == "GITHUB_STEP_SUMMARY": - env_file = os.getenv("GITHUB_STEP_SUMMARY") - if report_type == "md": - write_json_or_md_file(env_file, report_type, report_output_data_md) # type: ignore - else: - write_json_or_md_file(env_file, report_type, report_output_data_json) + env_file = os.getenv("GITHUB_STEP_SUMMARY", None) + if env_file is not None: + if report_type == "md": + write_json_or_md_file(env_file, report_type, report_output_data_md) # type: ignore + else: + write_json_or_md_file(env_file, report_type, report_output_data_json) # Add json report into the GITHUB_ENV environment variable for data collection purpose; # note that this is an undocumented side-effect of running gatorgrade with command-line # arguments that save data to the GITHUB_STEP_SUMMARY environment variable. The current From e642eec0aaceea8518903630106fc04f9e318240 Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 18:17:48 -0400 Subject: [PATCH 200/207] style: Reformat source code to meet ruff standards in gatorgrade/output/output.py. --- gatorgrade/output/output.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gatorgrade/output/output.py b/gatorgrade/output/output.py index 5bb62b7b..8fc94c5b 100644 --- a/gatorgrade/output/output.py +++ b/gatorgrade/output/output.py @@ -235,7 +235,9 @@ def configure_report( if report_type == "md": write_json_or_md_file(env_file, report_type, report_output_data_md) # type: ignore else: - write_json_or_md_file(env_file, report_type, report_output_data_json) + write_json_or_md_file( + env_file, report_type, report_output_data_json + ) # Add json report into the GITHUB_ENV environment variable for data collection purpose; # note that this is an undocumented side-effect of running gatorgrade with command-line # arguments that save data to the GITHUB_STEP_SUMMARY environment variable. The current From 12fd2098ee55b345afd80758e8a2389b3c8d4d1d Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 18:27:41 -0400 Subject: [PATCH 201/207] chore: Add @rebekahrudd as a contributor in the pyproject.toml file. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b3b168bc..36a44540 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "gatorgrade" version = "0.7.0" description = "GatorGrade executes GatorGrader checks!" -authors = ["Michael Abraham", "Jacob Allebach", "Liam Black", "Katherine Burgess", "Yanqiao Chen", "Ochirsaikhan Davaajambal", "Tuguldurnemekh Gantulga", "Anthony Grant-Cook", "Dylan Holland", "Gregory M. Kapfhammer", "Peyton Kelly", "Luke Lacaria", "Lauren Nevill", "Jack Turner", "Daniel Ullrich", "Garrison Vanzin", "Rian Watson"] +authors = ["Michael Abraham", "Jacob Allebach", "Liam Black", "Katherine Burgess", "Yanqiao Chen", "Ochirsaikhan Davaajambal", "Tuguldurnemekh Gantulga", "Anthony Grant-Cook", "Dylan Holland", "Gregory M. Kapfhammer", "Peyton Kelly", "Luke Lacaria", "Lauren Nevill", "Rebekah Rudd", "Jack Turner", "Daniel Ullrich", "Garrison Vanzin", "Rian Watson"] readme = "README.md" [tool.poetry.dependencies] From 0169799dfbdb0c1419e4241a3778448ac64a791d Mon Sep 17 00:00:00 2001 From: "Gregory M. Kapfhammer" Date: Sat, 5 Oct 2024 18:45:05 -0400 Subject: [PATCH 202/207] chore: Delete the mkdocs.yml file as no longer building a web site and this GitHub Actions workflow is no longer needed. --- .github/workflows/mkdocs.yml | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 .github/workflows/mkdocs.yml diff --git a/.github/workflows/mkdocs.yml b/.github/workflows/mkdocs.yml deleted file mode 100644 index f8d62647..00000000 --- a/.github/workflows/mkdocs.yml +++ /dev/null @@ -1,36 +0,0 @@ -# This GitHub Actions workflow contains one job: -# -- Build MKDocs uses the latest Ubuntu image and Python 3.9 to build -# the MKDocs website using the latest Poetry version. - -name: Build MKDocs - -on: - push: - branches: - - main - -jobs: - mkdocs: - name: MkDocs - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - name: Setup Python 3.9 - uses: actions/setup-python@v2 - id: setup-python - with: - python-version: 3.9 - - name: Install Poetry - uses: Gr1N/setup-poetry@v8 - - name: Setup Poetry - run: | - poetry config virtualenvs.create true - poetry config virtualenvs.in-project true - poetry env info - - name: Install dependencies - run: poetry install --no-interaction --no-ansi - - name: Update MkDocs - run: poetry run task mkdocs \ No newline at end of file From 78fc5c8b053ab16de891e246fa2eff1a8a728c9a Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Mon, 4 Nov 2024 20:29:42 -0500 Subject: [PATCH 203/207] feat: defined command output in check_result.py --- gatorgrade/output/check_result.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/check_result.py b/gatorgrade/output/check_result.py index f6e88c29..45547035 100644 --- a/gatorgrade/output/check_result.py +++ b/gatorgrade/output/check_result.py @@ -44,7 +44,7 @@ def display_result(self, show_diagnostic: bool = False) -> str: icon_color = "green" if self.passed else "red" message = f"[{icon_color}]{icon}[/] {self.description}" if not self.passed and show_diagnostic: - message += f"\n[yellow] → {self.diagnostic}" + message += f"\n[yellow] → Failing command output: {self.diagnostic}" return message def __repr__(self): From b8a680ce58c1b7bd07f6342951f1705e5923b38f Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Tue, 19 Nov 2024 14:52:43 -0500 Subject: [PATCH 204/207] fix: changed the color of the failing command output in check_result.py --- gatorgrade/output/check_result.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/output/check_result.py b/gatorgrade/output/check_result.py index 45547035..fe5a58f1 100644 --- a/gatorgrade/output/check_result.py +++ b/gatorgrade/output/check_result.py @@ -44,7 +44,7 @@ def display_result(self, show_diagnostic: bool = False) -> str: icon_color = "green" if self.passed else "red" message = f"[{icon_color}]{icon}[/] {self.description}" if not self.passed and show_diagnostic: - message += f"\n[yellow] → Failing command output: {self.diagnostic}" + message += f"\n[blue] → Failing command output: [green]{self.diagnostic}" return message def __repr__(self): From 74d391349ff679ef015c2e865b1d50c8a057c83f Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Fri, 22 Nov 2024 17:59:27 -0500 Subject: [PATCH 205/207] feat: added version to the command line in main.py --- gatorgrade/main.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 33b7cbc4..f255416f 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -43,6 +43,9 @@ def gatorgrade( ctx: typer.Context, filename: Path = typer.Option(FILE, "--config", "-c", help="Name of the yml file."), + version: bool = typer.Option( + DEFAULT_VERSION, "--version", "-v", help="Display version information." + ), report: Tuple[str, str, str] = typer.Option( (None, None, None), "--report", @@ -58,17 +61,19 @@ def gatorgrade( # if ctx.subcommand is None then this means # that, by default, gatorgrade should run in checking mode if ctx.invoked_subcommand is None: - # parse the provided configuration file - checks = parse_config(filename) - # there are valid checks and thus the - # tool should run them with run_checks - if len(checks) > 0: - checks_status = run_checks(checks, report) - # no checks were created and this means - # that, most likely, the file was not - # valid and thus the tool cannot run checks - # requesting version information overrides all other commands; - # if the version details are requested, print them and exit + # # parse the provided configuration file + # checks = parse_config(filename) + # # there are valid checks and thus the + # # tool should run them with run_checks + # if len(checks) > 0: + # checks_status = run_checks(checks, report) + # # no checks were created and this means + # # that, most likely, the file was not + # # valid and thus the tool cannot run checks + # # requesting version information overrides all other commands; + # # if the version details are requested, print them and exit + # else: + # check_status = False if version: # define the version label with suitable emoji version_label = ":wrench: Version information:" @@ -98,7 +103,7 @@ def gatorgrade( # there are valid checks and thus the # tool should run them with run_checks if len(checks) > 0: - checks_status = run_checks(checks) + checks_status = run_checks(checks, report) # no checks were created and this means # that, most likely, the file was not # valid and thus the tool cannot run checks From 4db13d04b64bd28730eee63c1514e16655218e03 Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Fri, 22 Nov 2024 18:02:07 -0500 Subject: [PATCH 206/207] format: main.py file reformatted --- gatorgrade/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index f255416f..0cba870e 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -72,7 +72,7 @@ def gatorgrade( # # valid and thus the tool cannot run checks # # requesting version information overrides all other commands; # # if the version details are requested, print them and exit - # else: + # else: # check_status = False if version: # define the version label with suitable emoji From c1072ac17809efd435267ba441826d94faedee4f Mon Sep 17 00:00:00 2001 From: Rebekah Rudd Date: Fri, 22 Nov 2024 18:09:39 -0500 Subject: [PATCH 207/207] format: main.pr reformatted --- gatorgrade/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gatorgrade/main.py b/gatorgrade/main.py index 0cba870e..b6e22627 100644 --- a/gatorgrade/main.py +++ b/gatorgrade/main.py @@ -32,7 +32,6 @@ app = typer.Typer( add_completion=False, help=help_message_markdown, - rich_markup_mode=RICH_MARKUP_MODE_DEFAULT, ) # create a default console for printing with rich