pasosdeJesus/msip

View on GitHub
doc/convenciones.md

Summary

Maintainability
Test Coverage
# Convenciones respecto al código fuente

Respecto a licenciamiento y uso de gitlab por favor ver 
<https://gitlab.com/pasosdeJesus/msip/-/blob/main/CONTRIBUTING.md?ref_type=heads>


Para ruby adoptamos las convenciones de thoughtbot <https://github.com/thoughtbot/guides>,  junto con la guía de estilo de Shopify:
<https://ruby-style-guide.shopify.dev/>

Y para javascript usamos: 
<https://developer.mozilla.org/en-US/docs/MDN/Writing_guidelines/Writing_style_guide/Code_style_guide/JavaScript>

En las siguientes secciones enfatizamos o cambiamos algunas convenciones.


# Uso de español en fuentes

Esperamos inicialmente desarrolladores de habla hispana, por eso 
esperamos los identificadores y comentarios que se introduzcan en español.  
Para traducir términos recomendamos wikipedia 
y <https://fundeu.es/wp-content/uploads/2018/02/Glosario-de-Comunicaci%C3%B3n-Estrat%C3%A9gica-Fund%C3%A9u.pdf>

Si algún componente resulta muy popular como para ser usado por hablantes 
de otros idiomas, esperamos su ayuda o financiación para traducir a inglés.


# Variables de configuración de la aplicación

Manejamos 4:

* Unas pocas en el espacio de nombre `msip.config.nombrevar`.
* Unas pocas en el espacio de nombres `config.x.nombrevar` o `config.x.motor_nombrevar`
* Otras como funciones de clase que retornan constantes principalmente en modelos relacionados con la funcionalidad por ejemplo `Sip::Persona::convencion_sexo` o `Cor1440Gen::Proyectofinanciero::actividades_comunes_id` y que deben documentarse.
* Variables de ambiente, como recomienda <https://12factor.net/>, que se
  esperan en un archivo `.env`

Los valores de las tres primeras van en el código fuente de la aplicación.

Las últimas las detallamos en la siguiente sección.

## Variables de configuración como variables de ambiente


* Deja las variables de configuración como variables de ambiente en 
  `.env.plantilla` (que en la  primera configuración debe copiarse 
  en `.env`) y usalas a lo largo de las fuentes. 
  * Puedes iniciar el archivo `.env.plantilla` copiandolo de otra motor
    o aplicación similar o en su defecto de msip.
  * Predefine cada variable en un bloque de la 
    forma siguiente (cambia `BD_USUARIO` por el nombre de la variable 
    y su valor predeterminado en lugar de `msipdes`):
    ```
    if (test "$BD_USUARIO" = "") then {
      export BD_USUARIO=msipdes
    } fi
    ```
  * En lugar de archivos plantilla agrega variables de ambiente en donde 
    puede haber configuraciones variables a lo largo de la aplicación. Si 
    necesitas introducir variables, recomendamos que sea en mayúscula, 
    remplazando espacios por _ y que comiencen con el nombre del motor 
    (e.g `MSIP_FORMATO_FECHA`). Recuerda definir los valores predeterminados
    en `.env.plantilla` y además en el código ruby en lugar de 
    `ENV['MIMOTOR_VAR']` mejor emplea 
    `ENV.fetch('MIMOTOR_VAR', 'valor predeterminado')` o si la aplicación 
    debe fallar si no está definida usa `ENV.fetch('MIMOTOR_VAR')`. 
    La idea es que al final del proceso todas las configuraciones que no
    convenga incluir en las fuentes se concentren en `.env.plantilla` 
    y en lo posible que sea el único archivo plantilla.

* Emplea la gema `dotenv-rails` para leer las variables de ambiente
  en modos de desarrollo y producción y el sistema operativo para 
  garantizarlas en modo producción.
  * Agrega la gema `dotenv-rails` en una sección sólo para modos 
  `development` y `test` de tu `Gemfile`

*  Copia de `msip/test/dummy` los scripts `bin/corre`, `bin/detiene` y 
   `bin/migra` en el directorio `bin.`



# SQL

* Palabras reservadas de SQL en mayúscula.
* Nombres de tablas en singular y preferible que sean una sola palabra 
  (sin usar `_`).  Si son de un motor comienzan con el nombre del motor 
  y `_` por ejemplo `msip_grupo`.  La excepcion pueden ser tablas 
  combinadas (Join tables), cuyo nombre se puede componer del nombre de las 
  dos tablas que une  ordenadas alfabéticamente (por ejemplo `msip_pais` 
  con `msip_grupo` sería `msip_grupo_pais`).
* SQL no es sensitivo a mayúsculas/minúsculas pero Ruby si lo es.  Sugerimos 
  escribir nombres de campos que se compongan de varias palabras con 
  capitalización camello pero empezando en minúscula, por ejemplo  
  `colorFlotaSubitemFuente` en lugar de `color_flota_subitem_fuente` 
  pero los que sean llaves foraneas si mejor terminados en `_id`, por 
  ejemplo `caso_id` 
* Emplear funciones para utilidades generales. Separar palabras con raya al 
  piso `_`.  Si se definen en un motor ponerle de prefijo el nombre del 
  motor seguido de `_`.
* Para las restricciones (constraints) de una tabla sugerimos:
  - Llave primaria `nombretabla_pkey` si es el caso autoincrementanda
    con secuencia `nombretabla_id_seq` (que es la convención usada
    por rails para renombramientos con `rename_table`).

## Tablas y modelos en singular, controladores y vistas en plural

En el mundo SQL una convención usual es emplear en singular nombres de tablas, 
pero rails buscando dejar más legible algunos casos de uso ha propuesto 
emplear plural para nombres de tablas y modelos.

Preferimos la convención tradicional de SQL y por lo mismo los modelos 
también deben especificarse en singular, sin embargo si mantenemos
la convención de controladores y vistas en plural.

En el caso de tablas combinadas cuyo nombre se componga de dos palabras,
si es relación 1 a n para el nombre del controlador dejar en plural la 
tabla que es n y en singular la que es 1, por ejemplo `aportes_persona`.  
Si es una relación n a n dejar en plural ambas por ejemplo `casos_fuentes.`

# Ruby

## Diseño
En nuevos sistemas de información emplear motores tanto como sea posible. 
Se recomienda que sean descendientes de msip, que da unidad en manejo de 
tablas básicas, usuarios y autenticación.

Por ejemplo algunas de las aplicaciones en el repositorio de Pasos de Jesús 
en gitlab dependen de msip así:
![Dependencias](https://gitlab.com/pasosdeJesus/msip/raw/main/doc/dependencias.png)

## Control de acceso

En los motores y aplicaciones genéricas se especifica con brevedad el control 
de acceso llamando métodos de motores en la función `initialize` de 
`app/modles/ability.rb` 
(e.g `initialize_msip`, `initialize_mr519_gen`, `initialize_heb412_gen` e 
`initialize_sivel2_gen`). 
En aplicaciones finales con exactamente el mismo control de acceso de las 
aplicaciones genéricas pueden llamarse esas funciones. Pero en aplicaciones 
que mezclen varios motores se recomienda escribir completas las reglas en el 
archivo `app/models/ability.rb` para facilitar auditoria y evitar cambios 
inesperados al actualizar motores.

## Fuentes

* En formularios en general en vez de cadenas para las etiquetas de los campos
  usamos el mecanismo de i18n de rails. Es decir en lugar de

    Sector Social Principal:
    <%= f.association :sectorsocial,
        collection: Sivel2Gen::Sectorsocial.habilitados,
        label: false,
        include_blank: false,
        label_method: :nombre,
        value_method: :id,
    } %>
  usar 
    <%= f.association :sectorsocial,
        collection: Sivel2Gen::Sectorsocial.habilitados,
        include_blank: false,
        label_method: :nombre,
        value_method: :id,
    } %>
  y definir en `config/locale/es.yml` en el modelo asociado al formulario:
    "sivel2_gen/victima":
      ...
      sectorsocialsec: Sectores sociales secundarios

* Usar en fuentes codificación UTF-8
* Terminar líneas sólo con `\n` (como es típico en el mundo Unix).
* 2 espacios de indentación.
* Para configurarlo en vim, agregue al final de ```~/.vim/ftplugin/ruby.vim```:
``` vim
set shiftwidth=2
set softtabstop=2
set expandtab
set autoindent
```

* <http://betterspecs.org/>
* <http://www.caliban.org/ruby/rubyguide.shtml>
* <https://hakiri.io/blog/ruby-security-tools-and-resources>
* Escribir documentación sobre el uso para desarrolladores en el 
  directorio `doc`
* Documentar las fuentes con YARD y agregar en el Makefile la tarea `yard`
  que permita generarla en el directorio `yard_doc`  con:

    make yard

  para esto el archivo `.yardopts` debe contener:

  --output-dir yard_doc

* Para facilitar la extracción de un diccionarion de datos de las fuentes y su
  documentación:
  * Las clases de modulos deben comenzar con
    ```
    module NombreModulo
      # Descripción de la clase
      class NombreClase
    ```
  * Las clases que implementen relaciones entre tablas deben tener
    una descripción que comience con la palabra "Relación"



# Javascript

Seguir sugerencias de 
<https://developer.mozilla.org/en-US/docs/MDN/Writing_guidelines/Writing_style_guide/Code_style_guide/JavaScript>


* Para localizar elementos en el DOM preferir ids y clases (o atributos data) 
  en lugar de posiciones.  Así pueden moverse los elementos en la página sin 
  requrir cambios en el javascript.


Podrá verificar sintaxis de archivos del directorio `app/assets/javascript/` 
con:
```sh
  make
```

Mientras remplazamos Coffescript, en adJ para instalar coffeescript basta:
```sh
  sudo yarn global add coffeescript
```

# HTML/CSS

Para CSS seguir https://github.com/thoughtbot/guides/tree/main/css