diff --git a/bin/project_create.sh b/bin/project_create.sh new file mode 100755 index 0000000..dee5c11 --- /dev/null +++ b/bin/project_create.sh @@ -0,0 +1,237 @@ +#!/bin/bash +# +# Script: project_create.sh +# Description: Crea una carpeta de proyecto con la estructura requerida +# Modified: 2025-03-12 +# Derechos de Autor (C) [2025] [Mauro Rosero P. ] +# +# Este programa es software libre: usted puede redistribuirlo y/o modificarlo +# bajo los términos de la Licencia Pública Affero General de GNU tal como +# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia, +# o (a su elección) cualquier versión posterior. +# +# Este programa se distribuye con la esperanza de que sea útil, +# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de +# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la +# Licencia Pública Affero General de GNU para obtener más detalles. +# +# Debería haber recibido una copia de la Licencia Pública Affero General +# junto con este programa. Si no la recibió, consulte . + +# Directorios base +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BASE_DIR="$(dirname "$SCRIPT_DIR")" +CONFIG_DIR="$SCRIPT_DIR/config" +LIB_DIR="$SCRIPT_DIR/lib" +MSG_DIR="$SCRIPT_DIR/msg" + +# Cargar libraries +source "$LIB_DIR/base.lib" +source "$LIB_DIR/console.lib" +source "$MSG_DIR/head.es" + +# Variables globales +title="${head_000}" +apps_title="Creación de Proyecto" +PROJECT_FOLDER="" +PROJECT_TYPE="" +VALID_TYPES=("ansible" "odoo" "sp32home" "nodejs" "python" "cobol" "otros") + +# Verifica que dialog esté instalado +if ! command -v dialog &> /dev/null; then + echo "${head_001}" + exit 1 +fi + +# Función para obtener la carpeta de proyectos desde projects.dat +function get_projects_folder() { + if [ -f "$CONFIG_DIR/projects.dat" ]; then + PROJECT_FOLDER=$(head -n 1 "$CONFIG_DIR/projects.dat") + + # Si la carpeta no comienza con / (ruta absoluta), la convertimos en ruta absoluta + if [[ "$PROJECT_FOLDER" != /* ]]; then + PROJECT_FOLDER="$HOME/$PROJECT_FOLDER" + fi + else + PROJECT_FOLDER="$HOME/proyectos" + echo "proyectos" > "$CONFIG_DIR/projects.dat" + fi + + # Verificar si la carpeta base de proyectos existe, si no, crearla + if [ ! -d "$PROJECT_FOLDER" ]; then + mkdir -p "$PROJECT_FOLDER" + fi +} + +# Función para solicitar el nombre del proyecto +function request_project_name() { + dialog_input_box "Ingrese el nombre del proyecto" "El nombre debe ser único dentro de la carpeta de proyectos" "" + + if [ $codex -ne 0 ]; then + echo "Operación cancelada por el usuario." + exit 1 + fi + + PROJECT_NAME="$value" + + # Validar que el nombre no esté vacío + if [ -z "$PROJECT_NAME" ]; then + dialog_error_box "$head_error" "El nombre del proyecto no puede estar vacío." + request_project_name + return + fi + + # Validar que el nombre sea válido para una carpeta + if [[ "$PROJECT_NAME" =~ [^a-zA-Z0-9_-] ]]; then + dialog_error_box "$head_error" "El nombre del proyecto solo puede contener letras, números, guiones y guiones bajos." + request_project_name + return + fi + + PROJECT_PATH="$PROJECT_FOLDER/$PROJECT_NAME" + + # Verificar si el proyecto ya existe + if [ -d "$PROJECT_PATH" ]; then + dialog_yesno "El proyecto '$PROJECT_NAME' ya existe. ¿Desea seleccionar otro nombre?" + + if [ $? -eq 0 ]; then + request_project_name + else + echo "Operación cancelada. El proyecto ya existe." + exit 1 + fi + fi +} + +# Función para solicitar el tipo de proyecto +function request_project_type() { + # Construir las opciones para el diálogo + OPTIONS="" + for i in "${!VALID_TYPES[@]}"; do + OPTIONS="$OPTIONS ${VALID_TYPES[$i]} ${VALID_TYPES[$i]} off" + done + + dialog_input_radio "Seleccione el tipo de proyecto" "Este tipo determinará la estructura inicial del proyecto" "$OPTIONS" + + if [ $codex -ne 0 ]; then + echo "Operación cancelada por el usuario." + exit 1 + fi + + PROJECT_TYPE="$value" + + # Validar que el tipo seleccionado sea válido + VALID_TYPE=0 + for t in "${VALID_TYPES[@]}"; do + if [ "$t" == "$PROJECT_TYPE" ]; then + VALID_TYPE=1 + break + fi + done + + if [ $VALID_TYPE -eq 0 ]; then + dialog_error_box "$head_error" "El tipo de proyecto seleccionado no es válido." + request_project_type + fi +} + +# Función para crear la estructura del proyecto +function create_project_structure() { + # Crear la carpeta del proyecto + mkdir -p "$PROJECT_PATH" + + # Crear estructura básica común a todos los proyectos + mkdir -p "$PROJECT_PATH/docs" + mkdir -p "$PROJECT_PATH/src" + + # Crear archivo README.md básico + cat > "$PROJECT_PATH/README.md" << EOF +# Proyecto $PROJECT_NAME + +## Descripción +Proyecto de tipo $PROJECT_TYPE creado con MRDevs Tools. + +## Estructura +- docs/ - Documentación del proyecto +- src/ - Código fuente + +## Configuración +Para configurar el entorno de desarrollo, siga las instrucciones en docs/setup.md. + +## Licencia +Este proyecto está licenciado bajo AGPL-3.0. +EOF + + # Crear estructura específica según el tipo de proyecto + case "$PROJECT_TYPE" in + "ansible") + mkdir -p "$PROJECT_PATH/inventories" + mkdir -p "$PROJECT_PATH/roles" + mkdir -p "$PROJECT_PATH/playbooks" + touch "$PROJECT_PATH/ansible.cfg" + ;; + "odoo") + mkdir -p "$PROJECT_PATH/addons" + mkdir -p "$PROJECT_PATH/data" + mkdir -p "$PROJECT_PATH/scripts" + mkdir -p "$PROJECT_PATH/build" + touch "$PROJECT_PATH/.typset" + ;; + "sp32home") + mkdir -p "$PROJECT_PATH/hardware" + mkdir -p "$PROJECT_PATH/firmware" + mkdir -p "$PROJECT_PATH/libraries" + mkdir -p "$PROJECT_PATH/build" + ;; + "nodejs") + mkdir -p "$PROJECT_PATH/src/controllers" + mkdir -p "$PROJECT_PATH/src/models" + mkdir -p "$PROJECT_PATH/src/routes" + mkdir -p "$PROJECT_PATH/public" + mkdir -p "$PROJECT_PATH/tests" + touch "$PROJECT_PATH/package.json" + ;; + "python") + mkdir -p "$PROJECT_PATH/src/$PROJECT_NAME" + mkdir -p "$PROJECT_PATH/tests" + touch "$PROJECT_PATH/setup.py" + touch "$PROJECT_PATH/requirements.txt" + # Crear un __init__.py básico + touch "$PROJECT_PATH/src/$PROJECT_NAME/__init__.py" + ;; + "cobol") + mkdir -p "$PROJECT_PATH/src/main" + mkdir -p "$PROJECT_PATH/src/copy" + mkdir -p "$PROJECT_PATH/build" + ;; + "otros") + # Estructura mínima, ya creada anteriormente + ;; + esac + + # Crear archivo de configuración para indicar el tipo de proyecto + echo "$PROJECT_TYPE" > "$PROJECT_PATH/.project-type" + + # Mostrar mensaje de éxito + dialog_error_box "$head_info" "Proyecto '$PROJECT_NAME' de tipo '$PROJECT_TYPE' creado exitosamente en:\n$PROJECT_PATH" +} + +# Función principal +function main() { + clear + + # Obtener la carpeta de proyectos + get_projects_folder + + # Solicitar nombre del proyecto + request_project_name + + # Solicitar tipo de proyecto + request_project_type + + # Crear estructura del proyecto + create_project_structure +} + +# Ejecutar función principal +main \ No newline at end of file