Files
links/.venv/lib/python3.10/site-packages/tailwind/management/commands/tailwind.py
2025-05-06 20:44:33 +09:00

139 lines
4.8 KiB
Python

import os
from django.core.management.base import CommandError, LabelCommand
from tailwind import get_config
from ...npm import NPM, NPMException
from ...utils import get_tailwind_src_path, install_pip_package
from ...validate import ValidationError, Validations
class Command(LabelCommand):
help = "Runs tailwind commands"
missing_args_message = """
Command argument is missing, please add one of the following:
init - to initialize django-tailwind app
install - to install npm packages necessary to build tailwind css
build - to compile tailwind css into production css
start - to start watching css changes for dev
check-updates - to list possible updates for tailwind css and its dependencies
update - to update tailwind css and its dependencies
Usage example:
python manage.py tailwind start
"""
npm = None
validate = None
def __init__(self, *args, **kwargs):
super(Command, self).__init__(*args, **kwargs)
self.validate = Validations()
def add_arguments(self, parser):
super(Command, self).add_arguments(parser)
parser.add_argument(
"--no-input",
action="store_true",
help="Initializes Tailwind project without user prompts",
)
parser.add_argument(
"--tailwind-version",
default="4",
choices=["3", "4"],
help="Specifies the Tailwind version to install",
)
parser.add_argument(
"--app-name",
help="Sets default app name on Tailwind project initialization",
)
parser.add_argument(
"--no-package-lock",
action="store_true",
help="Disables package-lock.json creation during install",
)
def validate_app(self):
try:
self.validate.has_settings()
app_name = get_config("TAILWIND_APP_NAME")
self.validate.is_installed(app_name)
self.validate.is_tailwind_app(app_name)
except ValidationError as err:
raise CommandError(err)
def handle(self, *labels, **options):
return self.handle_labels(*labels, **options)
def handle_labels(self, *labels, **options):
self.validate.acceptable_label(labels[0])
if labels[0] != "init":
self.validate_app()
self.npm = NPM(cwd=get_tailwind_src_path(get_config("TAILWIND_APP_NAME")))
getattr(self, "handle_" + labels[0].replace("-", "_") + "_command")(*labels[1:], **options)
def handle_init_command(self, **options):
try:
from cookiecutter.main import cookiecutter
except ImportError:
self.stdout.write("Cookiecutter is not found, installing...")
try:
install_pip_package("cookiecutter")
from cookiecutter.main import cookiecutter
except ModuleNotFoundError:
raise CommandError(
"Failed to install 'cookiecutter' via pip. Please install it manually "
"(https://pypi.org/project/cookiecutter/) and run 'python manage.py tailwind init' again."
)
try:
app_path = cookiecutter(
os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
output_dir=os.getcwd(),
directory=f"app_template_v{options['tailwind_version']}",
no_input=options["no_input"],
overwrite_if_exists=False,
extra_context={"app_name": options["app_name"].strip() if options.get("app_name") else "theme"},
)
app_name = os.path.basename(app_path)
self.stdout.write(
self.style.SUCCESS(
f"Tailwind application '{app_name}' "
f"has been successfully created. "
f"Please add '{app_name}' to INSTALLED_APPS in settings.py, "
f"then run the following command to install Tailwind CSS "
f"dependencies: `python manage.py tailwind install`"
)
)
except Exception as err:
raise CommandError(err)
def handle_install_command(self, **options):
args = ["install"]
if options["no_package_lock"]:
args.append("--no-package-lock")
self.npm_command(*args)
def handle_build_command(self, **options):
self.npm_command("run", "build")
def handle_start_command(self, **options):
self.npm_command("run", "start")
def handle_check_updates_command(self, **options):
self.npm_command("outdated")
def handle_update_command(self, **options):
self.npm_command("update")
def npm_command(self, *args):
try:
self.npm.command(*args)
except NPMException as err:
raise CommandError(err)
except KeyboardInterrupt:
pass