Source code for duck.cli.commands.makeproject

"""
Module containing makeproject command class.
"""
import os

from duck.logging import console
from duck.utils.path import joinpaths


[docs] class MakeProjectCommand: # makeproject command
[docs] @classmethod def setup(cls): # Setup before command execution os.environ["DUCK_SETTINGS_MODULE"] = "duck.etc.structures.projects.testing.web.settings"
[docs] @classmethod def main( cls, name, dest_dir: str = ".", overwrite_existing: bool = False, project_type: str = "normal" ): # Setup minimum settings module for CLI to function correctly cls.setup() cls.makeproject(name, dest_dir, overwrite_existing, project_type)
[docs] @classmethod def print_success(cls, name, dest_project_path): # Nice, low-key welcome block shown after a project is created. console.log_raw(f'✓ Project "{name}" created successfully!\n', level=console.SUCCESS) console.log_raw(f' Location: {dest_project_path}', level=console.SUCCESS) console.log_raw(f' Docs: https://docs.duckframework.com', level=console.SUCCESS) console.log_raw(f' Contribute: https://duckframework.com/contribute \n', level=console.SUCCESS) console.log_raw(f'Run `python web/main.py` inside "{name}" to get started.\n', level=console.SUCCESS)
[docs] @classmethod def makeproject( cls, name, dest_dir: str = ".", overwrite_existing: bool = False, project_type: str = "normal", ): # Execute command after setup. from duck.setup.makeproject import makeproject dest_dir = os.path.abspath(dest_dir) dest_project_path = joinpaths(dest_dir, name) # Project label project_label = f'{project_type.title()} Project' if project_type != "normal" else "Project" # Log initial setup console.log( f'Creating Duck {project_label} "{name}"...\n', level=console.DEBUG, ) try: makeproject( name, dest_dir, overwrite_existing=overwrite_existing, project_type=project_type, ) # Print success message cls.print_success(name, dest_project_path) except FileExistsError: console.log( f'A project named "{name}" already exists at:\n {dest_project_path}', level=console.WARNING, ) # Get input overwrite = input("\nOverwrite the existing project? (y/N): ").strip() # Newline for spacing console.log_raw("") if overwrite.lower().startswith("y"): makeproject( name, dest_dir, overwrite_existing=True, project_type=project_type, ) # Print success message cls.print_success(name, dest_project_path) else: console.log("Cancelled — no changes made.", level=console.DEBUG) except Exception as e: # Project creation failed. console.log(f"Error creating project: {str(e)}", level=console.ERROR) raise e