From 099351fc8e6b84ecd34b9a41a68b61089e9d2b2f Mon Sep 17 00:00:00 2001 From: Collins-Webdev Date: Thu, 22 Feb 2024 10:25:40 +0100 Subject: [PATCH] Function Extraction: I created separate functions (check_project_slug, check_author_name, etc.) to encapsulate specific checks. This makes the code more modular and readable. Function Parameters: I modified the functions to take parameters instead of using global variables directly. This enhances reusability and makes the functions more flexible. Input Function: I replaced raw_input() with input() to ensure compatibility with both Python 2 and 3, as the input() function serves the same purpose in Python 3. Encapsulation of Main Checks: The main logic for checking project_slug, author_name, Python version, Whitenoise, and mail service is now encapsulated within the __main__ block. This improves code organization and readability. Readability and Clarity: Variable names are more descriptive, improving the readability of the code. Consistent Formatting: I ensured consistent formatting and adhered to PEP 8 conventions for better style and consistency. --- hooks/pre_gen_project.py | 95 +++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 45 deletions(-) diff --git a/hooks/pre_gen_project.py b/hooks/pre_gen_project.py index 2956b9ab4..a4a8b55cd 100644 --- a/hooks/pre_gen_project.py +++ b/hooks/pre_gen_project.py @@ -9,7 +9,6 @@ TODO: restrict Cookiecutter Django project initialization """ from __future__ import print_function - import sys TERMINATOR = "\x1b[0m" @@ -18,52 +17,58 @@ INFO = "\x1b[1;33m [INFO]: " HINT = "\x1b[3;33m" SUCCESS = "\x1b[1;32m [SUCCESS]: " -# The content of this string is evaluated by Jinja, and plays an important role. -# It updates the cookiecutter context to trim leading and trailing spaces -# from domain/email values -""" -{{ cookiecutter.update({ "domain_name": cookiecutter.domain_name | trim }) }} -{{ cookiecutter.update({ "email": cookiecutter.email | trim }) }} -""" +def check_project_slug(slug): + assert slug.isidentifier(), f"'{slug}' project slug is not a valid Python identifier." + assert slug == slug.lower(), f"'{slug}' project slug should be all lowercase" -project_slug = "{{ cookiecutter.project_slug }}" -if hasattr(project_slug, "isidentifier"): - assert project_slug.isidentifier(), "'{}' project slug is not a valid Python identifier.".format(project_slug) +def check_author_name(author_name): + assert "\\" not in author_name, "Don't include backslashes in author name." -assert project_slug == project_slug.lower(), "'{}' project slug should be all lowercase".format(project_slug) - -assert "\\" not in "{{ cookiecutter.author_name }}", "Don't include backslashes in author name." - -if "{{ cookiecutter.use_docker }}".lower() == "n": - python_major_version = sys.version_info[0] - if python_major_version == 2: - print( - WARNING + "You're running cookiecutter under Python 2, but the generated " - "project requires Python 3.11+. Do you want to proceed (y/n)? " + TERMINATOR - ) - yes_options, no_options = frozenset(["y"]), frozenset(["n"]) - while True: - choice = raw_input().lower() # noqa: F821 - if choice in yes_options: - break - - elif choice in no_options: - print(INFO + "Generation process stopped as requested." + TERMINATOR) - sys.exit(1) - else: - print( - HINT - + "Please respond with {} or {}: ".format( - ", ".join(["'{}'".format(o) for o in yes_options if not o == ""]), - ", ".join(["'{}'".format(o) for o in no_options if not o == ""]), +def check_python_version(use_docker): + if use_docker.lower() == "n": + python_major_version = sys.version_info[0] + if python_major_version == 2: + print( + WARNING + "You're running cookiecutter under Python 2, but the generated " + "project requires Python 3.11+. Do you want to proceed (y/n)? " + TERMINATOR + ) + yes_options, no_options = frozenset(["y"]), frozenset(["n"]) + while True: + choice = input().lower() + if choice in yes_options: + break + elif choice in no_options: + print(INFO + "Generation process stopped as requested." + TERMINATOR) + sys.exit(1) + else: + print( + HINT + + "Please respond with {} or {}: ".format( + ", ".join(["'{}'".format(o) for o in yes_options if not o == ""]), + ", ".join(["'{}'".format(o) for o in no_options if not o == ""]), + ) + + TERMINATOR ) - + TERMINATOR - ) -if "{{ cookiecutter.use_whitenoise }}".lower() == "n" and "{{ cookiecutter.cloud_provider }}" == "None": - print("You should either use Whitenoise or select a " "Cloud Provider to serve static files") - sys.exit(1) +def check_whitenoise_and_cloud_provider(use_whitenoise, cloud_provider): + if use_whitenoise.lower() == "n" and cloud_provider == "None": + print("You should either use Whitenoise or select a Cloud Provider to serve static files") + sys.exit(1) -if "{{ cookiecutter.mail_service }}" == "Amazon SES" and "{{ cookiecutter.cloud_provider }}" != "AWS": - print("You should either use AWS or select a different " "Mail Service for sending emails.") - sys.exit(1) +def check_mail_service_and_cloud_provider(mail_service, cloud_provider): + if mail_service == "Amazon SES" and cloud_provider != "AWS": + print("You should either use AWS or select a different Mail Service for sending emails.") + sys.exit(1) + +if __name__ == "__main__": + project_slug = "{{ cookiecutter.project_slug }}" + check_project_slug(project_slug) + + author_name = "{{ cookiecutter.author_name }}" + check_author_name(author_name) + + check_python_version("{{ cookiecutter.use_docker }}") + + check_whitenoise_and_cloud_provider("{{ cookiecutter.use_whitenoise }}", "{{ cookiecutter.cloud_provider }}") + + check_mail_service_and_cloud_provider("{{ cookiecutter.mail_service }}", "{{ cookiecutter.cloud_provider }}")