Files
djinit/src/djinit/creators/setup.py
T
sankalp b1c1ea9b15 feat(src/djinit): add Vue scaffolding supportNew Features
- Added `use_vue` flag to enable Vue generation and introduced `create_vue_files()` method that scaffolds Vite/Vue frontend files (vite.config.js, package.json, index.html, App.vue, style.css, main.js).
- Extended context dictionaries in `FileCreator`, utility classes, and Django helper to include `use_vue`.

Enhancements
- Integrated Vue file creation into the setup pipeline via `_create_vue_files()` with success messaging.
- Propagated `use_vue` configuration through serialization and UI feedback.

Bug Fixes
- (none)
2026-05-11 00:30:19 +05:45

145 lines
6.1 KiB
Python

import os
from typing import Callable, List, Tuple
from djinit.creators.files import FileCreator
from djinit.creators.project import ProjectCreator
from djinit.ui.console import UIFormatter
class SetupCreator:
"""
Orchestrator for creating a complete Django project.
Combines ProjectCreator and FileCreator to set up the environment.
"""
def __init__(self, project_dir: str, project_name: str, primary_app: str, app_names: list, metadata: dict):
self.project_dir = project_dir
self.project_name = project_name
self.primary_app = primary_app
self.app_names = app_names
self.metadata = metadata
if project_dir == ".":
self.project_root = os.getcwd()
else:
self.project_root = os.path.join(os.getcwd(), project_dir)
self.project_creator = ProjectCreator(project_dir, project_name, app_names, metadata)
self.file_creator = FileCreator(self.project_root, project_name, app_names, metadata)
def _normalize_metadata(self) -> None:
"""Normalize metadata and app names based on structure type."""
if self.metadata.get("predefined_structure"):
self.metadata.setdefault("project_module_name", "config")
self.metadata.setdefault("nested_apps", True)
self.metadata.setdefault("nested_dir", "apps")
if not self.app_names:
self.app_names = ["users", "core"]
self.project_creator.app_names = self.app_names
elif self.metadata.get("unified_structure"):
self.metadata.setdefault("project_module_name", "core")
self.metadata.setdefault("nested_apps", True)
self.metadata.setdefault("nested_dir", "apps")
if not self.app_names:
self.app_names = []
self.project_creator.app_names = self.app_names
elif self.metadata.get("single_structure"):
self.metadata.setdefault("nested_apps", False)
if not self.app_names:
self.app_names = []
self.project_creator.app_names = self.app_names
def create(self) -> bool:
"""Run the full setup process."""
self._normalize_metadata()
steps: List[Tuple[str, Callable[[], None]]] = []
steps.append(("Creating Django project", self.project_creator.create_project))
if self.metadata.get("unified_structure"):
steps.append(("Creating unified structure", self.file_creator.create_unified_structure))
elif self.metadata.get("single_structure"):
steps.append(("Creating single folder structure", self.file_creator.create_single_structure))
elif self.metadata.get("predefined_structure"):
steps.append(("Creating predefined structure", self.file_creator.create_predefined_structure))
steps.append(("Adding apps to settings", self.project_creator.add_apps_to_settings))
else:
steps.append(("Creating Django apps", self.project_creator.create_apps))
steps.append(("Creating project URLs", self.file_creator.create_project_urls))
steps.extend(
[
("Validating project structure", self.project_creator.validate_project_structure),
("Creating utility files", self._create_utility_files),
("Creating Procfile", self.file_creator.create_procfile),
("Creating Justfile", self.file_creator.create_justfile),
("Creating runtime.txt", self.file_creator.create_runtime_txt),
("Creating CI/CD pipelines", self._create_cicd_pipelines),
("Creating Docker files", self._create_docker_files),
("Creating Vite/React files", self._create_vite_files),
("Creating Vite/Vue files", self._create_vue_files),
("Creating pytest files", self._create_pytest_files),
]
)
total_steps = len(steps)
success = True
progress, task = UIFormatter.create_live_progress(description="Setup Progress", total_steps=total_steps)
try:
with progress:
for step_number, (_, step_func) in enumerate(steps, 1):
step_func()
progress.update(task, advance=1, description=f"Step {step_number}/{total_steps}")
except Exception as e:
success = False
UIFormatter.handle_exception(e)
return success
def _create_utility_files(self) -> None:
utility_steps = [
self.file_creator.create_gitignore,
self.file_creator.create_requirements,
self.file_creator.create_readme,
self.file_creator.create_env_file,
self.file_creator.create_djinit_config,
lambda: self.file_creator.create_pyproject(self.metadata),
]
for step_func in utility_steps:
step_func()
UIFormatter.print_success("Created all utility files successfully!")
def _create_cicd_pipelines(self) -> None:
if self.metadata.get("use_github_actions", True):
self.file_creator.create_github_actions()
if self.metadata.get("use_gitlab_ci", True):
self.file_creator.create_gitlab_ci()
def _create_docker_files(self) -> None:
if self.metadata.get("use_docker", False):
self.file_creator.create_docker_files()
UIFormatter.print_success("Created Docker files successfully!")
def _create_vite_files(self) -> None:
if self.metadata.get("use_vite", False):
self.file_creator.create_vite_files()
UIFormatter.print_success("Created Vite/React files successfully!")
def _create_vue_files(self) -> None:
if self.metadata.get("use_vue", False):
self.file_creator.create_vue_files()
UIFormatter.print_success("Created Vite/Vue files successfully!")
def _create_pytest_files(self) -> None:
if self.metadata.get("use_pytest", False):
self.file_creator.create_pytest_files()
UIFormatter.print_success("Created pytest files successfully!")