520 lines
No EOL
16 KiB
Bash
Executable file
520 lines
No EOL
16 KiB
Bash
Executable file
#!/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. <mauro@rosero.one>]
|
|
#
|
|
# 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 <https://www.gnu.org/licenses/>.
|
|
|
|
# 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" "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"
|
|
|
|
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."
|
|
|
|
# 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 "${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
|
|
OPTIONS="$OPTIONS ${VALID_TYPES[$i]} ${VALID_TYPES[$i]} off"
|
|
done
|
|
|
|
dialog_input_radio "${proj_008}" "${proj_009}" "$OPTIONS"
|
|
|
|
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 descripción del proyecto
|
|
function request_project_description() {
|
|
dialog_input_box "${proj_012}" "${proj_013}" ""
|
|
|
|
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 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
|
|
|
|
# Establecemos AGPL-3.0 como seleccionada por defecto (es la licencia predeterminada del proyecto)
|
|
for license in "${sorted_keys[@]}"; do
|
|
if [ "$license" == "AGPL-3.0" ]; then
|
|
OPTIONS="$OPTIONS $license \"$license\" on"
|
|
else
|
|
OPTIONS="$OPTIONS $license \"$license\" off"
|
|
fi
|
|
done
|
|
|
|
dialog_input_radio "${proj_014}" "${proj_015}" "$OPTIONS"
|
|
|
|
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 AGPL-3.0 por defecto
|
|
if [ -z "$PROJECT_LICENSE_TEXT" ]; then
|
|
PROJECT_LICENSE="AGPL-3.0"
|
|
PROJECT_LICENSE_TEXT="${LICENSE_TEXTS[$PROJECT_LICENSE]}"
|
|
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 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
|
|
|
|

|
|

|
|
|
|
## 📋 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
|
|
;;
|
|
"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)] ($(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"
|
|
;;
|
|
"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"
|
|
|
|
# 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 |