diff --git a/bin/project_new.sh b/bin/project_new.sh new file mode 100755 index 0000000..003b9a0 --- /dev/null +++ b/bin/project_new.sh @@ -0,0 +1,807 @@ +#!/bin/bash +# +# Script: project_new.sh +# Description: Crea una carpeta de proyecto con la estructura requerida +# Modified: 2025-03-13 +# 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} ${head_002}" +apps_title="${proj_001}" +PROJECT_FOLDER="" +PROJECT_NAME="" +PROJECT_PATH="" +PROJECT_TYPE="" +PROJECT_DESCRIPTION="" +PROJECT_LICENSE="" +PROJECT_LICENSE_TEXT="" +VALID_TYPES=("ansible" "odoo" "sp32home" "nodejs" "python" "cobol" "php" "c" "cpp" "csharp" "rust" "otros") + +# Estructura de datos para licencias: nombre, badge, texto corto +declare -A LICENSE_BADGES +LICENSE_BADGES["AGPL-3.0"]="https://img.shields.io/badge/License-AGPL--3.0-blue.svg" +LICENSE_BADGES["GPL-3.0"]="https://img.shields.io/badge/License-GPL--3.0-blue.svg" +LICENSE_BADGES["LGPL-3.0"]="https://img.shields.io/badge/License-LGPL--3.0-blue.svg" +LICENSE_BADGES["MIT"]="https://img.shields.io/badge/License-MIT-yellow.svg" +LICENSE_BADGES["Apache-2.0"]="https://img.shields.io/badge/License-Apache_2.0-blue.svg" +LICENSE_BADGES["BSD-3-Clause"]="https://img.shields.io/badge/License-BSD_3--Clause-blue.svg" +LICENSE_BADGES["BSD-2-Clause"]="https://img.shields.io/badge/License-BSD_2--Clause-orange.svg" +LICENSE_BADGES["CC-BY-4.0"]="https://img.shields.io/badge/License-CC_BY_4.0-lightgrey.svg" +LICENSE_BADGES["CC-BY-SA-4.0"]="https://img.shields.io/badge/License-CC_BY--SA_4.0-lightgrey.svg" +LICENSE_BADGES["CC0-1.0"]="https://img.shields.io/badge/License-CC0_1.0-lightgrey.svg" +LICENSE_BADGES["EPL-2.0"]="https://img.shields.io/badge/License-EPL_2.0-red.svg" +LICENSE_BADGES["MPL-2.0"]="https://img.shields.io/badge/License-MPL_2.0-brightgreen.svg" +LICENSE_BADGES["Unlicense"]="https://img.shields.io/badge/license-Unlicense-blue.svg" +LICENSE_BADGES["OPL-1.0"]="https://img.shields.io/badge/License-OPL--1.0-orange.svg" +LICENSE_BADGES["OEEL-1.0"]="https://img.shields.io/badge/License-OEEL--1.0-red.svg" +LICENSE_BADGES["CC-BY-NC-4.0"]="https://img.shields.io/badge/License-CC_BY--NC_4.0-lightgrey.svg" +LICENSE_BADGES["CC-BY-NC-SA-4.0"]="https://img.shields.io/badge/License-CC_BY--NC--SA_4.0-lightgrey.svg" +LICENSE_BADGES["CC-BY-ND-4.0"]="https://img.shields.io/badge/License-CC_BY--ND_4.0-lightgrey.svg" +LICENSE_BADGES["CC-BY-NC-ND-4.0"]="https://img.shields.io/badge/License-CC_BY--NC--ND_4.0-lightgrey.svg" +LICENSE_BADGES["Copyright"]="https://img.shields.io/badge/License-Copyright-darkred.svg" +LICENSE_BADGES["Proprietary"]="https://img.shields.io/badge/License-Proprietary-darkblue.svg" + +declare -A LICENSE_TEXTS +LICENSE_TEXTS["AGPL-3.0"]="Este proyecto está licenciado bajo la Licencia Pública General Affero de GNU (AGPL-3.0)." +LICENSE_TEXTS["GPL-3.0"]="Este proyecto está licenciado bajo la Licencia Pública General de GNU (GPL-3.0)." +LICENSE_TEXTS["LGPL-3.0"]="Este proyecto está licenciado bajo la Licencia Pública General Menor de GNU (LGPL-3.0)." +LICENSE_TEXTS["MIT"]="Este proyecto está licenciado bajo la Licencia MIT." +LICENSE_TEXTS["Apache-2.0"]="Este proyecto está licenciado bajo la Licencia Apache 2.0." +LICENSE_TEXTS["BSD-3-Clause"]="Este proyecto está licenciado bajo la Licencia BSD de 3 cláusulas." +LICENSE_TEXTS["BSD-2-Clause"]="Este proyecto está licenciado bajo la Licencia BSD de 2 cláusulas." +LICENSE_TEXTS["CC-BY-4.0"]="Este proyecto está licenciado bajo Creative Commons Attribution 4.0 International." +LICENSE_TEXTS["CC-BY-SA-4.0"]="Este proyecto está licenciado bajo Creative Commons Attribution-ShareAlike 4.0 International." +LICENSE_TEXTS["CC0-1.0"]="Este proyecto está dedicado al dominio público bajo Creative Commons Zero v1.0 Universal." +LICENSE_TEXTS["EPL-2.0"]="Este proyecto está licenciado bajo la Licencia Pública Eclipse 2.0." +LICENSE_TEXTS["MPL-2.0"]="Este proyecto está licenciado bajo la Licencia Pública de Mozilla 2.0." +LICENSE_TEXTS["Unlicense"]="Este proyecto está en el dominio público bajo The Unlicense." +LICENSE_TEXTS["OPL-1.0"]="Este proyecto está licenciado bajo la Licencia Pública de Odoo (OPL-1.0)." +LICENSE_TEXTS["OEEL-1.0"]="Este proyecto está licenciado bajo la Licencia de Empresa de Odoo (OEEL-1.0)." +LICENSE_TEXTS["CC-BY-NC-4.0"]="Este proyecto está licenciado bajo Creative Commons Attribution-NonCommercial 4.0 International." +LICENSE_TEXTS["CC-BY-NC-SA-4.0"]="Este proyecto está licenciado bajo Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International." +LICENSE_TEXTS["CC-BY-ND-4.0"]="Este proyecto está licenciado bajo Creative Commons Attribution-NoDerivatives 4.0 International." +LICENSE_TEXTS["CC-BY-NC-ND-4.0"]="Este proyecto está licenciado bajo Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International." +LICENSE_TEXTS["Copyright"]="Este proyecto está protegido por derechos de autor (Copyright). Todos los derechos reservados." +LICENSE_TEXTS["Proprietary"]="Este proyecto está bajo licencia propietaria. Todos los derechos reservados." + +# 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 + PROJECTS_DIR_NAME=$(head -n 1 "$CONFIG_DIR/projects.dat") + else + PROJECTS_DIR_NAME="proyectos" + echo "$PROJECTS_DIR_NAME" > "$CONFIG_DIR/projects.dat" + fi + + # La carpeta de proyectos siempre está dentro de devs (BASE_DIR) + PROJECT_FOLDER="$BASE_DIR/$PROJECTS_DIR_NAME" + + # 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 "${proj_002}" "${proj_003}" "" + + if [ $codex -ne 0 ]; then + echo "${head_canceled}" + exit 1 + fi + + PROJECT_NAME="$value" + + # Validar que el nombre no esté vacío + if [ -z "$PROJECT_NAME" ]; then + dialog_error_box "$head_error" "${proj_004}" + 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" "${proj_005}" + request_project_name + return + fi + + PROJECT_PATH="$PROJECT_FOLDER/$PROJECT_NAME" + + # Verificar si el proyecto ya existe + if [ -d "$PROJECT_PATH" ]; then + # Crear mensaje personalizado con el nombre del proyecto + proyecto_existe_msg="El proyecto '$PROJECT_NAME' ya existe. ¿Desea seleccionar otro nombre?" + dialog_yesno "$proyecto_existe_msg" + + if [ $? -eq 0 ]; then + request_project_name + else + echo "${proj_007}" + 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 + if [ "${VALID_TYPES[$i]}" == "otros" ]; then + # Seleccionar "otros" como opción por defecto + OPTIONS="$OPTIONS ${VALID_TYPES[$i]} ${VALID_TYPES[$i]} on" + else + OPTIONS="$OPTIONS ${VALID_TYPES[$i]} ${VALID_TYPES[$i]} off" + fi + done + + dialog_input_radio "${proj_008}" "${proj_009}" "$OPTIONS" 22 22 70 + + if [ $codex -ne 0 ]; then + echo "${head_canceled}" + 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" "${proj_010}" + request_project_type + fi +} + +# Función para solicitar la licencia del proyecto +function request_project_license() { + # Construir las opciones para el diálogo + OPTIONS="" + + # Obtenemos todas las claves del array asociativo + license_keys=("${!LICENSE_BADGES[@]}") + + # Ordenamos las claves alfabéticamente + IFS=$'\n' sorted_keys=($(sort <<<"${license_keys[*]}")) + unset IFS + + # Filtramos las licencias específicas de Odoo si el proyecto no es de tipo odoo + filtered_keys=() + for license in "${sorted_keys[@]}"; do + # Si es licencia de Odoo (OPL o OEEL) y el proyecto no es de tipo odoo, la omitimos + if [[ "$license" == "OPL-1.0" || "$license" == "OEEL-1.0" ]]; then + if [[ "$PROJECT_TYPE" == "odoo" ]]; then + filtered_keys+=("$license") + fi + else + filtered_keys+=("$license") + fi + done + + # Establecemos AGPL-3.0 como seleccionada por defecto (es la licencia predeterminada del proyecto) + # Para proyectos Odoo, usar OPL-1.0 como predeterminada + default_license="AGPL-3.0" + if [[ "$PROJECT_TYPE" == "odoo" ]]; then + default_license="OPL-1.0" + fi + + for license in "${filtered_keys[@]}"; do + if [ "$license" == "$default_license" ]; then + OPTIONS="$OPTIONS $license \"$license\" on" + else + OPTIONS="$OPTIONS $license \"$license\" off" + fi + done + + # Reducimos el tamaño del diálogo para que muestre menos opciones a la vez + dialog_input_radio "${proj_014}" "${proj_015}" "$OPTIONS" 22 22 70 + + if [ $codex -ne 0 ]; then + echo "${head_canceled}" + exit 1 + fi + + PROJECT_LICENSE="$value" + PROJECT_LICENSE_TEXT="${LICENSE_TEXTS[$PROJECT_LICENSE]}" + + # Si por alguna razón no se encuentra la licencia, usamos la predeterminada según el tipo de proyecto + if [ -z "$PROJECT_LICENSE_TEXT" ]; then + if [[ "$PROJECT_TYPE" == "odoo" ]]; then + PROJECT_LICENSE="OPL-1.0" + else + PROJECT_LICENSE="AGPL-3.0" + fi + PROJECT_LICENSE_TEXT="${LICENSE_TEXTS[$PROJECT_LICENSE]}" + fi +} + +# Función para solicitar la descripción del proyecto +function request_project_description() { + # Aumentar número de filas y columnas para mostrar más líneas en el diálogo + # Parámetros: mensaje, ayuda, valor_defecto, filas, ancho + # La altura predeterminada es CROWS=8, aumentamos a 12 para mostrar las 3 líneas + dialog_input_box "${proj_012}" "${proj_013}" "" 12 80 + + if [ $codex -ne 0 ]; then + echo "${head_canceled}" + exit 1 + fi + + PROJECT_DESCRIPTION="$value" + + # Usar una descripción por defecto si está vacía + if [ -z "$PROJECT_DESCRIPTION" ]; then + PROJECT_DESCRIPTION="Proyecto de tipo $PROJECT_TYPE creado con MRDevs Tools." + 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" + + # Inicializar repositorio git + cd "$PROJECT_PATH" + git init + + # Crear archivo setup.md básico + cat > "$PROJECT_PATH/docs/setup.md" << EOF +# Configuración del Entorno de Desarrollo + +Este documento describe los pasos necesarios para configurar el entorno de desarrollo para el proyecto $PROJECT_NAME. + +## Requisitos Previos + +- [Requisito 1] +- [Requisito 2] +- [Requisito 3] + +## Instalación + +1. Clone el repositorio: + \`\`\`bash + git clone [URL-del-repositorio] + cd $PROJECT_NAME + \`\`\` + +2. Configure el entorno según el tipo de proyecto ($PROJECT_TYPE). + +3. [Pasos adicionales específicos del proyecto] + +## Configuración + +[Instrucciones de configuración específicas] + +## Pruebas + +[Instrucciones para ejecutar pruebas] + +## Solución de Problemas + +[Problemas comunes y soluciones] + +--- + +> Nota: Este es un documento de configuración inicial que debe ser completado con la información específica del proyecto. +EOF + + # Obtener fecha actual + CURRENT_DATE=$(date +%Y-%m-%d) + + # Crear archivo README.md mejorado + cat > "$PROJECT_PATH/README.md" << EOF +# $PROJECT_NAME + +![License](${LICENSE_BADGES[$PROJECT_LICENSE]}) +![Status](https://img.shields.io/badge/Status-En%20Desarrollo-yellow) + +## 📋 Descripción + +$PROJECT_DESCRIPTION + +## 🔧 Tecnologías + +\`\`\` +Tipo de Proyecto: $PROJECT_TYPE +Fecha de Creación: $CURRENT_DATE +\`\`\` + +## 📁 Estructura + +\`\`\` +$PROJECT_NAME/ +├── docs/ # Documentación del proyecto +├── src/ # Código fuente +EOF + + # Añadir estructura específica según el tipo de proyecto + case "$PROJECT_TYPE" in + "ansible") + cat >> "$PROJECT_PATH/README.md" << EOF +├── inventories/ # Inventarios de Ansible +├── roles/ # Roles de Ansible +└── playbooks/ # Playbooks de Ansible +\`\`\` + +## 🚀 Uso + +1. Actualice el inventario en \`inventories/\` +2. Configure los roles necesarios en \`roles/\` +3. Ejecute los playbooks mediante \`ansible-playbook playbooks/nombre-playbook.yml\` +EOF + ;; + "odoo") + cat >> "$PROJECT_PATH/README.md" << EOF +├── addons/ # Módulos personalizados de Odoo +├── data/ # Archivos de datos +├── scripts/ # Scripts de utilidad +└── build/ # Configuración de construcción +\`\`\` + +## 🚀 Uso + +1. Configure el entorno en la carpeta \`build/\` +2. Ejecute \`scripts/start.sh\` para iniciar el entorno Odoo +3. Acceda a la aplicación en http://localhost:8069 +EOF + ;; + "sp32home") + cat >> "$PROJECT_PATH/README.md" << EOF +├── hardware/ # Diseños y esquemas de hardware +├── firmware/ # Código firmware ESP32 +├── libraries/ # Bibliotecas personalizadas +└── build/ # Archivos de construcción +\`\`\` + +## 🚀 Uso + +1. Revise los esquemas en \`hardware/\` +2. Compile el firmware usando PlatformIO o Arduino IDE +3. Cargue el firmware en su dispositivo ESP32 +EOF + ;; + "nodejs") + cat >> "$PROJECT_PATH/README.md" << EOF +├── src/ +│ ├── controllers/ # Controladores de la aplicación +│ ├── models/ # Modelos de datos +│ └── routes/ # Definición de rutas +├── public/ # Archivos estáticos +└── tests/ # Pruebas unitarias y de integración +\`\`\` + +## 🚀 Uso + +1. Instale las dependencias: \`npm install\` +2. Configure las variables de entorno en \`.env\` +3. Ejecute la aplicación: \`npm start\` +EOF + ;; + "python") + cat >> "$PROJECT_PATH/README.md" << EOF +├── src/ +│ └── $PROJECT_NAME/ # Código fuente del paquete +└── tests/ # Pruebas unitarias +\`\`\` + +## 🚀 Uso + +1. Cree un entorno virtual: \`python -m venv .venv\` +2. Active el entorno virtual: \`source .venv/bin/activate\` +3. Instale las dependencias: \`pip install -r requirements.txt\` +4. Instale el paquete en modo desarrollo: \`pip install -e .\` +EOF + ;; + "php") + cat >> "$PROJECT_PATH/README.md" << EOF +├── src/ # Código fuente PHP +├── public/ # Archivos públicos y punto de entrada +├── assets/ # Recursos estáticos (CSS, JS, imágenes) +├── templates/ # Plantillas +└── vendor/ # Dependencias (gestionadas por Composer) +\`\`\` + +## 🚀 Uso + +1. Instale las dependencias: \`composer install\` +2. Configure el servidor web para apuntar a la carpeta \`public/\` +3. Visite la aplicación en su navegador +EOF + ;; + "c") + cat >> "$PROJECT_PATH/README.md" << EOF +├── include/ # Archivos de cabecera (.h) +├── src/ # Archivos fuente (.c) +├── lib/ # Bibliotecas +├── tests/ # Pruebas unitarias +└── build/ # Archivos de compilación +\`\`\` + +## 🚀 Uso + +1. Configure el proyecto: \`mkdir build && cd build && cmake ..\` +2. Compile el proyecto: \`make\` +3. Ejecute las pruebas: \`make test\` +4. Ejecute la aplicación: \`./bin/$PROJECT_NAME\` +EOF + ;; + "cpp") + cat >> "$PROJECT_PATH/README.md" << EOF +├── include/ # Archivos de cabecera (.hpp) +├── src/ # Archivos fuente (.cpp) +├── lib/ # Bibliotecas +├── tests/ # Pruebas unitarias +└── build/ # Archivos de compilación +\`\`\` + +## 🚀 Uso + +1. Configure el proyecto: \`mkdir build && cd build && cmake ..\` +2. Compile el proyecto: \`make\` +3. Ejecute las pruebas: \`make test\` +4. Ejecute la aplicación: \`./bin/$PROJECT_NAME\` +EOF + ;; + "csharp") + cat >> "$PROJECT_PATH/README.md" << EOF +├── src/ # Código fuente C# +├── Tests/ # Pruebas unitarias +├── Models/ # Modelos de datos +├── Controllers/ # Controladores (si es una aplicación web) +└── Properties/ # Configuraciones y propiedades +\`\`\` + +## 🚀 Uso + +1. Restaure las dependencias: \`dotnet restore\` +2. Compile el proyecto: \`dotnet build\` +3. Ejecute las pruebas: \`dotnet test\` +4. Ejecute la aplicación: \`dotnet run\` +EOF + ;; + "rust") + cat >> "$PROJECT_PATH/README.md" << EOF +├── src/ # Código fuente Rust +├── tests/ # Pruebas +├── examples/ # Ejemplos de uso +└── target/ # Directorio de compilación (generado) +\`\`\` + +## 🚀 Uso + +1. Compile el proyecto: \`cargo build\` +2. Ejecute las pruebas: \`cargo test\` +3. Ejecute la aplicación: \`cargo run\` +4. Compile para producción: \`cargo build --release\` +EOF + ;; + "cobol") + cat >> "$PROJECT_PATH/README.md" << EOF +├── src/ +│ ├── main/ # Programas principales +│ └── copy/ # Libros de copybook +└── build/ # Archivos de compilación +\`\`\` + +## 🚀 Uso + +1. Configure el entorno COBOL según su implementación (GnuCOBOL, MicroFocus, etc.) +2. Compile los programas usando la configuración en \`build/\` +3. Ejecute los programas compilados +EOF + ;; + "otros") + cat >> "$PROJECT_PATH/README.md" << EOF +\`\`\` + +## 🚀 Uso + +Consulte la documentación específica en la carpeta \`docs/\` para instrucciones de configuración y uso. +EOF + ;; + esac + + # Añadir secciones comunes al final + cat >> "$PROJECT_PATH/README.md" << EOF + +## 🔍 Prerrequisitos + +> Por definir según las necesidades específicas del proyecto + +## ⚙️ Configuración + +Para configurar el entorno de desarrollo, siga las instrucciones en [docs/setup.md](docs/setup.md). + +## 📄 Licencia + +$PROJECT_LICENSE_TEXT +Ver el archivo [LICENSE](LICENSE) para más detalles. + +## 👥 Autores + +- **$(git config user.name)** - Desarrollador Principal - [$(git config user.email)](mailto:$(git config user.email)) + +--- + +Generado con MRDevs Tools © $(date +%Y) +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" + ;; + "php") + mkdir -p "$PROJECT_PATH/src" + mkdir -p "$PROJECT_PATH/public" + mkdir -p "$PROJECT_PATH/assets/css" + mkdir -p "$PROJECT_PATH/assets/js" + mkdir -p "$PROJECT_PATH/assets/img" + mkdir -p "$PROJECT_PATH/templates" + mkdir -p "$PROJECT_PATH/vendor" + # Crear un archivo index.php básico + echo ' "$PROJECT_PATH/public/index.php" + # Crear composer.json básico + cat > "$PROJECT_PATH/composer.json" << EOF +{ + "name": "rosero-one/$PROJECT_NAME", + "description": "Proyecto PHP $PROJECT_NAME", + "type": "project", + "require": { + "php": ">=7.4" + }, + "autoload": { + "psr-4": { + "App\\\\": "src/" + } + } +} +EOF + ;; + "c") + mkdir -p "$PROJECT_PATH/include" + mkdir -p "$PROJECT_PATH/src" + mkdir -p "$PROJECT_PATH/lib" + mkdir -p "$PROJECT_PATH/tests" + mkdir -p "$PROJECT_PATH/build" + # Crear un archivo CMakeLists.txt básico + cat > "$PROJECT_PATH/CMakeLists.txt" << EOF +cmake_minimum_required(VERSION 3.10) +project($PROJECT_NAME C) + +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) + +include_directories(include) + +file(GLOB SOURCES "src/*.c") +add_executable(\${PROJECT_NAME} \${SOURCES}) +EOF + # Crear un archivo main.c básico + cat > "$PROJECT_PATH/src/main.c" << EOF +#include + +int main(int argc, char *argv[]) { + printf("Hola desde $PROJECT_NAME!\n"); + return 0; +} +EOF + ;; + "cpp") + mkdir -p "$PROJECT_PATH/include" + mkdir -p "$PROJECT_PATH/src" + mkdir -p "$PROJECT_PATH/lib" + mkdir -p "$PROJECT_PATH/tests" + mkdir -p "$PROJECT_PATH/build" + # Crear un archivo CMakeLists.txt básico + cat > "$PROJECT_PATH/CMakeLists.txt" << EOF +cmake_minimum_required(VERSION 3.10) +project($PROJECT_NAME CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +include_directories(include) + +file(GLOB SOURCES "src/*.cpp") +add_executable(\${PROJECT_NAME} \${SOURCES}) +EOF + # Crear un archivo main.cpp básico + cat > "$PROJECT_PATH/src/main.cpp" << EOF +#include + +int main(int argc, char *argv[]) { + std::cout << "Hola desde $PROJECT_NAME!" << std::endl; + return 0; +} +EOF + ;; + "csharp") + mkdir -p "$PROJECT_PATH/src" + mkdir -p "$PROJECT_PATH/Tests" + mkdir -p "$PROJECT_PATH/Models" + mkdir -p "$PROJECT_PATH/Controllers" + mkdir -p "$PROJECT_PATH/Properties" + # Crear un archivo de proyecto .csproj básico + cat > "$PROJECT_PATH/$PROJECT_NAME.csproj" << EOF + + + + Exe + net6.0 + enable + enable + + + +EOF + # Crear un archivo Program.cs básico + cat > "$PROJECT_PATH/src/Program.cs" << EOF +namespace $PROJECT_NAME; + +public class Program +{ + public static void Main(string[] args) + { + Console.WriteLine("Hola desde $PROJECT_NAME!"); + } +} +EOF + ;; + "rust") + mkdir -p "$PROJECT_PATH/src" + mkdir -p "$PROJECT_PATH/tests" + mkdir -p "$PROJECT_PATH/examples" + # Crear un archivo Cargo.toml básico + cat > "$PROJECT_PATH/Cargo.toml" << EOF +[package] +name = "$PROJECT_NAME" +version = "0.1.0" +edition = "2021" + +[dependencies] +EOF + # Crear un archivo main.rs básico + cat > "$PROJECT_PATH/src/main.rs" << EOF +fn main() { + println!("Hola desde $PROJECT_NAME!"); +} +EOF + # Crear un archivo lib.rs básico + cat > "$PROJECT_PATH/src/lib.rs" << EOF +// Biblioteca principal para $PROJECT_NAME + +#[cfg(test)] +mod tests { + #[test] + fn it_works() { + assert_eq!(2 + 2, 4); + } +} +EOF + ;; + "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/.protype" + + # Guardar información de la licencia en un archivo + echo "$PROJECT_LICENSE" > "$PROJECT_PATH/.license" + + # Hacer commit inicial del proyecto + cd "$PROJECT_PATH" + git add . + git commit -m "[INIT] Proyecto $PROJECT_NAME" + + # Mostrar mensaje de éxito + dialog_error_box "$head_info" "${proj_011}\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 + + # Solicitar licencia del proyecto + request_project_license + + # Solicitar descripción del proyecto + request_project_description + + # Crear estructura del proyecto + create_project_structure +} + +# Ejecutar función principal +main