From e58307c134f193855620b3f5d83db76bd130a01a Mon Sep 17 00:00:00 2001 From: penguinboi Date: Sat, 27 Sep 2025 13:45:01 -0400 Subject: [PATCH 1/2] Removed pipes in cog and model file names template --- grace/__init__.py | 2 +- grace/generators/cog_generator.py | 2 ++ grace/generators/model_generator.py | 9 ++++++--- ...| to_snake }}_cog.py => {{ cog_module_name }}_cog.py} | 6 +++--- ..._name | to_snake }}.py => {{ model_module_name }}.py} | 0 pyproject.toml | 2 +- 6 files changed, 13 insertions(+), 8 deletions(-) rename grace/generators/templates/cog/{{{ cog_name | to_snake }}_cog.py => {{ cog_module_name }}_cog.py} (69%) rename grace/generators/templates/model/{{{ model_name | to_snake }}.py => {{ model_module_name }}.py} (100%) diff --git a/grace/__init__.py b/grace/__init__.py index 074f533..57995c5 100644 --- a/grace/__init__.py +++ b/grace/__init__.py @@ -1 +1 @@ -__version__ = "0.10.6-alpha" +__version__ = "0.10.8-alpha" diff --git a/grace/generators/cog_generator.py b/grace/generators/cog_generator.py index 78931b3..c4cbeff 100644 --- a/grace/generators/cog_generator.py +++ b/grace/generators/cog_generator.py @@ -2,6 +2,7 @@ from re import match from logging import info from click.core import Argument +from jinja2_strcase.jinja2_strcase import to_snake class CogGenerator(Generator): @@ -20,6 +21,7 @@ def generate(self, name: str, description: str = ""): self.NAME, variables={ "cog_name": name, + "cog_module_name": to_snake(name), "cog_description": description, }, output_dir="bot/extensions" diff --git a/grace/generators/model_generator.py b/grace/generators/model_generator.py index f8ec577..739f838 100644 --- a/grace/generators/model_generator.py +++ b/grace/generators/model_generator.py @@ -3,6 +3,7 @@ from logging import info from click.core import Argument from grace.generators.migration_generator import generate_migration +from jinja2_strcase.jinja2_strcase import to_snake class ModelGenerator(Generator): @@ -21,8 +22,9 @@ def generate(self, name: str, params: tuple[str]): a SQLAlchemy-style definition. You can specify column names and types during generation using the format `column_name:Type`. - Supported types are any valid SQLAlchemy column types (e.g., `String`, `Integer`, - `Boolean`, etc.). See https://docs.sqlalchemy.org/en/20/core/types.html + Supported types are any valid SQLAlchemy column types + (e.g., `String`, `Integer`, `Boolean`, etc.). + See https://docs.sqlalchemy.org/en/20/core/types.html Example: ```bash @@ -38,6 +40,7 @@ def generate(self, name: str, params: tuple[str]): self.NAME, variables={ "model_name": name, + "model_module_name": to_snake(name), "model_columns": model_columns, "model_column_types": types }, @@ -76,4 +79,4 @@ def extract_columns(self, params: tuple[str]) -> tuple[list, list]: def generator() -> Generator: - return ModelGenerator() \ No newline at end of file + return ModelGenerator() diff --git a/grace/generators/templates/cog/{{ cog_name | to_snake }}_cog.py b/grace/generators/templates/cog/{{ cog_module_name }}_cog.py similarity index 69% rename from grace/generators/templates/cog/{{ cog_name | to_snake }}_cog.py rename to grace/generators/templates/cog/{{ cog_module_name }}_cog.py index e52038a..d0397f5 100644 --- a/grace/generators/templates/cog/{{ cog_name | to_snake }}_cog.py +++ b/grace/generators/templates/cog/{{ cog_module_name }}_cog.py @@ -3,9 +3,9 @@ class {{ cog_name | to_camel }}Cog(Cog, name="{{ cog_name | camel_case_to_space }}"{{ ', description="{}"'.format(cog_description) if cog_description }}): - def __init__(self, bot: Bot): - self.bot: Bot = bot + def __init__(self, bot: Bot): + self.bot: Bot = bot async def setup(bot: Bot): - await bot.add_cog({{ cog_name }}Cog(bot)) \ No newline at end of file + await bot.add_cog({{ cog_name }}Cog(bot)) diff --git a/grace/generators/templates/model/{{ model_name | to_snake }}.py b/grace/generators/templates/model/{{ model_module_name }}.py similarity index 100% rename from grace/generators/templates/model/{{ model_name | to_snake }}.py rename to grace/generators/templates/model/{{ model_module_name }}.py diff --git a/pyproject.toml b/pyproject.toml index 80baf1e..75aa862 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=64", "setuptools_scm>=8"] [project] name = "grace-framework" -version = "0.10.7-alpha" +version = "0.10.8-alpha" authors = [ { name="Simon Roy" } ] From 2e49dea3e578757eafdaa87996fcb2cb89a075d9 Mon Sep 17 00:00:00 2001 From: penguinboi Date: Sat, 27 Sep 2025 19:35:05 -0400 Subject: [PATCH 2/2] Fix failing tests --- grace/application.py | 5 +++- grace/generator.py | 19 ++++++++++---- grace/generators/cog_generator.py | 2 +- .../model/{{ model_module_name }}.py | 2 +- tests/generators/test_cog_generator.py | 24 ++++++++++------- tests/generators/test_project_generator.py | 26 +++++++++++++------ 6 files changed, 53 insertions(+), 25 deletions(-) diff --git a/grace/application.py b/grace/application.py index 56b2d01..d0e3d11 100644 --- a/grace/application.py +++ b/grace/application.py @@ -147,7 +147,10 @@ def load_logs(self) -> None: install( self.config.environment.get("log_level"), - fmt="[%(asctime)s] %(programname)s %(funcName)s %(module)s %(levelname)s %(message)s", + fmt=( + "[%(asctime)s] %(programname)s %(funcName)s ", + "%(module)s %(levelname)s %(message)s" + ), programname=self.config.current_environment, ) diff --git a/grace/generator.py b/grace/generator.py index f2012d5..3fe63f9 100644 --- a/grace/generator.py +++ b/grace/generator.py @@ -119,13 +119,17 @@ def validate(self, *args, **kwargs): """Validates the arguments passed to the command.""" return True - def generate_template(self, template_dir: str, variables: dict[str, Any] = {}): + def generate_template( + self, + template_dir: str, + variables: dict[str, Any] = {} + ): """Generates a template using Cookiecutter. :param template_dir: The name of the template to generate. :type template_dir: str - :param variables: The variables to pass to the template. (default is {}) + :param variables: The variables to pass to the template. (default: {}) :type variables: dict[str, Any] """ template = str(self.templates_path / template_dir) @@ -142,14 +146,19 @@ def generate_file( :param template_dir: The name of the template to generate. :type template_dir: str - :param variables: The variables to pass to the template. (default is {}) + :param variables: The variables to pass to the template. + (default is {}) :type variables: dict[str, Any] - :param output_dir: The output directory for the generated template. (default is None) + :param output_dir: The output directory for the generated template. + (default is None) :type output_dir: str """ env = Environment( - loader=PackageLoader('grace', str(self.templates_path / template_dir)), + loader=PackageLoader( + 'grace', + str(self.templates_path / template_dir) + ), extensions=['jinja2_strcase.StrcaseExtension'] ) diff --git a/grace/generators/cog_generator.py b/grace/generators/cog_generator.py index c4cbeff..8abd26f 100644 --- a/grace/generators/cog_generator.py +++ b/grace/generators/cog_generator.py @@ -41,4 +41,4 @@ def validate(self, name: str, **_kwargs) -> bool: def generator() -> Generator: - return CogGenerator() \ No newline at end of file + return CogGenerator() diff --git a/grace/generators/templates/model/{{ model_module_name }}.py b/grace/generators/templates/model/{{ model_module_name }}.py index d6f2a71..5a4f150 100644 --- a/grace/generators/templates/model/{{ model_module_name }}.py +++ b/grace/generators/templates/model/{{ model_module_name }}.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Integer{{ ", {}".format(','.join(model_column_types)) }} +from sqlalchemy import Column, {{ ", {}".format(','.join(model_column_types)) }} from bot import app from grace.model import Model diff --git a/tests/generators/test_cog_generator.py b/tests/generators/test_cog_generator.py index e93424d..6d74c93 100644 --- a/tests/generators/test_cog_generator.py +++ b/tests/generators/test_cog_generator.py @@ -9,10 +9,13 @@ def generator(): def test_generate_cog(mocker, generator): - """Test if the generate method creates the correct template with a database.""" + """ + Test if the generate method creates the correct template with a database. + """ mock_generate_file = mocker.patch.object(Generator, 'generate_file') - name = "Example" + name = 'MyExample' + module_name = 'my_example' description = "This is an example cog." generator.generate(name, description) @@ -21,21 +24,24 @@ def test_generate_cog(mocker, generator): 'cog', variables={ 'cog_name': name, + 'cog_module_name': module_name, 'cog_description': description }, - output_dir="bot/extensions" + output_dir='bot/extensions' ) def test_validate_valid_name(generator): """Test if the validate method passes for a valid project name.""" - valid_name = "CogExample" + valid_name = 'CogExample' assert generator.validate(valid_name) def test_validate_invalid_name(generator): - """Test if the validate method raises ValueError for name without a hyphen.""" - assert not generator.validate("cog-example") - assert not generator.validate("cog_example") - assert not generator.validate("Cog-Example") - assert not generator.validate("Cog_Example") + """ + Test if the validate method raises ValueError for name without a hyphen. + """ + assert not generator.validate('cog-example') + assert not generator.validate('cog_example') + assert not generator.validate('Cog-Example') + assert not generator.validate('Cog_Example') diff --git a/tests/generators/test_project_generator.py b/tests/generators/test_project_generator.py index c8148d6..a39bd2a 100644 --- a/tests/generators/test_project_generator.py +++ b/tests/generators/test_project_generator.py @@ -9,8 +9,13 @@ def generator(): def test_generate_project_with_database(mocker, generator): - """Test if the generate method creates the correct template with a database.""" - mock_generate_template = mocker.patch.object(Generator, 'generate_template') + """ + Test if the generate method creates the correct template with a database. + """ + mock_generate_template = mocker.patch.object( + Generator, + 'generate_template' + ) name = "example-project" generator.generate(name, database=True) @@ -23,8 +28,9 @@ def test_generate_project_with_database(mocker, generator): def test_generate_project_without_database(mocker, generator): - """Test if the generate method creates the correct template - without a database. + """ + Test if the generate method creates the correct template without a + database. """ mock_generate_template = mocker.patch.object(Generator, 'generate_template') name = "example-project" @@ -39,20 +45,24 @@ def test_generate_project_without_database(mocker, generator): def test_validate_valid_name(generator): - """Test if the validate method passes for a valid project name.""" + """ + Test if the validate method passes for a valid project name. + """ valid_name = "example-project" assert generator.validate(valid_name) def test_validate_invalid_name_no_hyphen(generator): - """Test if the validate method raises ValueError for - name without a hyphen. + """ + Test if the validate method raises ValueError for name without a hyphen. """ invalid_name = "ExampleProject" assert not generator.validate(invalid_name) def test_validate_invalid_name_uppercase(generator): - """Test if the validate method raises ValueError for uppercase name.""" + """ + Test if the validate method raises ValueError for uppercase name. + """ invalid_name = "Example-Project" assert not generator.validate(invalid_name)