Soporte para PHPStan

Existe la posibilidad de que se analice el soporte de PHPStan1? Es una herramienta piola, y no parece ser compatible con un proyecto Toba, al menos como lo estoy intentando.

Si determinan que puede ser útil, puedo comentar en que avance y donde me quede trabado (estimo por falta de lectura de la documentación).

Hola Tomas,

estoy mirando un poco la herramienta asi que si queres vamos viendo juntos como llevarlo adelante, podemos ir agregando cosas en este branch .

Solo hay una cuestion que no se si sea salvable.

PHPStan no es tan estático como promete, de hecho hay algún issue al respecto (que pinta mas a won’tfix que a otra cosa)… lo cual en Toba puede ser un problema ya que al intentar ejecutar ciertas partes del código le va a pedir una conexión a la bd. Por ahora el problema que encontre es que se corta abruptamente por consumo de memoria incluso teniendo un limite muy superior, ya me sume a un issue donde se plantea lo mismo para ver si hay forma de resolverlo.

Fuera de eso, es mas que probable que haya que hacer algún tipo de extensión para que entienda cuestiones particulares del framework… pero como decís, para eso hay que indagar mas en la documentación.

Saludos

Dale, veo si puedo forkear el branch.

Te comento un poco lo que hice en un proyecto Toba (instalando Toba con composer):

  1. Ejecute un análisis así como viene en la documentación sobre el directorio php del proyecto:

phpstan analyse -l 4 php

Salida larga, pero en resumen:


 ------ ----------------------------------------------------------------------------------------------------------------------------     
  Line   transacciones/pant_ficha_transacciones.php                                                                                       
 ------ ----------------------------------------------------------------------------------------------------------------------------      
         Class pant_ficha_transacciones was not found while trying to analyse it - autoloading is probably not configured properly.       
 ------ ----------------------------------------------------------------------------------------------------------------------------      
                                                                                                                                            
 ------ ----------------------------------------------------------------------------------------------------------------                    
  Line   zonas/zona_persona.php                                                                                                             
 ------ ----------------------------------------------------------------------------------------------------------------                   
         Class zona_persona was not found while trying to analyse it - autoloading is probably not configured properly.                     
 ------ ----------------------------------------------------------------------------------------------------------------                
                                                                                                                                             
 ------ ------------------------------------------------------------------------------------------------------------------                       
  Line   zonas/zona_productos.php                                                                                                                
 ------ ------------------------------------------------------------------------------------------------------------------                       
         Class zona_productos was not found while trying to analyse it - autoloading is probably not configured properly.                       
 ------ ------------------------------------------------------------------------------------------------------------------                       

O sea, no esta levantando el autoload (y es correcto porque toba lo maneja aparte de composer)

  1. Cree un archivo de config phpstan.neon para decirle que haga autoload del directorio php:

Archivo phpstan.neon:


parameters:
        autoload_directories:
                - php

Ejecute:

phpstan analyse -l 4 php

Salida:


Note: Using configuration file /path/al/proyecto/phpstan.neon.
  11/204 [▓░░░░░░░░░░░░░░░░░░░░░░░░░░░]   5%
Warning: require_once(consola/consola.php): failed to open stream: No such file or directory in /path/al/proyecto/php/extension_toba/stock_comando.php on line 3

Fatal error: require_once(): Failed opening required 'consola/consola.php' (include_path='/path/al/proyecto/vendor/pear/console_getopt:/path/al/proyecto/vendor/pear/pear-core-minimal/src:/path/al/proyecto/vendor/pear/pear_exception:/path/al/proyecto/vendor/siu-toba/numbers_words:/path/al/proyecto/vendor/siu-toba/structures_graph:/path/al/proyecto/vendor/siu-toba/text_highlighter:/path/al/proyecto/vendor/pear/console_getopt:/path/al/proyecto/vendor/pear/pear-core-minimal/src:/path/al/proyecto/vendor/pear/pear_exception:/path/al/proyecto/vendor/siu-toba/numbers_words:/path/al/proyecto/vendor/siu-toba/structures_graph:/path/al/proyecto/vendor/siu-toba/text_highlighter:.:/usr/share/php') in /path/al/proyecto/php/extension_toba/stock_comando.php on line 3

  1. Intentando y probando varias cosas, termine con el archivo phpstan.neon de la siguiente manera

parameters:
        autoload_directories:
                - php
                - vendor/siu-toba/framework/php
        excludes_analyse:
                - vendor/siu-toba/framework/php/convenciones
                - vendor/siu-toba/framework/php/modelo/migraciones_instancia
                - vendor/siu-toba/framework/php/3ros

Los exclude son necesarios porque detecta clases duplicadas. En este punto, la salida que obtengo al ejecutar el ya mencionado comando es esta:


Note: Using configuration file /path/al/proyecto/phpstan.neon.
PHPStan crashed in the previous run probably because of excessive memory consumption.
It consumed around 34 MB of memory.


To avoid this issue, allow to use more memory with the --memory-limit option.
  24/204 [▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░]  11%
Warning: Declaration of ci_abm_lotes::evt__form__baja($datos) should be compatible with stock_ci::evt__form__baja() in /path/al/proyecto/php/lotes/ci_abm_lotes.php on line 294
  68/204 [▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░]  33%
Warning: require_once(consola/consola.php): failed to open stream: No such file or directory in /path/al/proyecto/php/extension_toba/stock_comando.php on line 3

Fatal error: require_once(): Failed opening required 'consola/consola.php' (include_path='/path/al/proyecto/vendor/pear/console_getopt:/path/al/proyecto/vendor/pear/pear-core-minimal/src:/path/al/proyecto/vendor/pear/pear_exception:/path/al/proyecto/vendor/siu-toba/numbers_words:/path/al/proyecto/vendor/siu-toba/structures_graph:/path/al/proyecto/vendor/siu-toba/text_highlighter:/path/al/proyecto/vendor/pear/console_getopt:/path/al/proyecto/vendor/pear/pear-core-minimal/src:/path/al/proyecto/vendor/pear/pear_exception:/path/al/proyecto/vendor/siu-toba/numbers_words:/path/al/proyecto/vendor/siu-toba/structures_graph:/path/al/proyecto/vendor/siu-toba/text_highlighter:.:/usr/share/php') in /path/al/proyecto/php/extension_toba/stock_comando.php on line 3

O sea, no termino de entender porque sigue sin poder levantar los archivos. De hecho el path que dice que no existe, esta bien y existe (y no tengo problemas de permisos).

Una cosa que se me ocurre probar (aun no me hice el tiempo) es ver si se puede hacer un autoload de todo toba en composer tal como indican aca1. No es util para toba en si pero por ahi le sirve a phpstan. Tenes idea si eso se puede hacer?

Hola Tomas,

El branch esta pensado para correr PHPStan dentro de Toba… asi que le archivo neon tuyo probablemente deba incluir el de Toba estimo.

O sea, no esta levantando el autoload (y es correcto porque toba lo maneja aparte de composer) 2) Cree un archivo de config `phpstan.neon` para decirle que haga autoload del directorio php: Archivo phpstan.neon:

parameters:
        autoload_directories:
                - php

Yo opte por pasarle directamente el archivo autoload que tiene que levantar, ya que los que usa el framework tienen por nombre [b]IdProyecto_autoload.php[/b] con lo cual no necesariamente puede reconocerlo.
```

Note: Using configuration file /path/al/proyecto/phpstan.neon.
11/204 [▓░░░░░░░░░░░░░░░░░░░░░░░░░░░] 5%
Warning: require_once(consola/consola.php): failed to open stream: No such file or directory in /path/al/proyecto/php/extension_toba/stock_comando.php on line 3

Fatal error: require_once(): Failed opening required ‘consola/consola.php’ (include_path=‘/path/al/proyecto/vendor/pear/console_getopt:/path/al/proyecto/vendor/pear/pear-core-minimal/src:/path/al/proyecto/vendor/pear/pear_exception:/path/al/proyecto/vendor/siu-toba/numbers_words:/path/al/proyecto/vendor/siu-toba/structures_graph:/path/al/proyecto/vendor/siu-toba/text_highlighter:/path/al/proyecto/vendor/pear/console_getopt:/path/al/proyecto/vendor/pear/pear-core-minimal/src:/path/al/proyecto/vendor/pear/pear_exception:/path/al/proyecto/vendor/siu-toba/numbers_words:/path/al/proyecto/vendor/siu-toba/structures_graph:/path/al/proyecto/vendor/siu-toba/text_highlighter:.:/usr/share/php’) in /path/al/proyecto/php/extension_toba/stock_comando.php on line 3

</blockquote>
Todo lo que sea extension de comandos va a ser un problema a resolver, por dos motivos:
- Tiene diseño top-down, asi que cada archivo va incluyendo lo que necesita hacia abajo... hay una cantidad minima de herencia ahi.
- A causa de eso, no hacen uso del autoload y por ende es cuasi imposible que PHPStan enganche las clases correctas salvo que arranque a ejecutar desde el launcher de Toba.

Ciertamente ahi voy a tener que encontrar la manera de que reconozca la presencia de esos archivos por mas que no esten en el autoload.

<blockquote>3) Intentando y probando varias cosas, termine con el archivo phpstan.neon de la siguiente manera


parameters:
autoload_directories:
- php
- vendor/siu-toba/framework/php
excludes_analyse:
- vendor/siu-toba/framework/php/convenciones
- vendor/siu-toba/framework/php/modelo/migraciones_instancia
- vendor/siu-toba/framework/php/3ros



Los exclude son necesarios porque detecta clases duplicadas. En este punto, la salida que obtengo al ejecutar el ya mencionado comando es esta:</blockquote>
Bien, es mas o menos similar a lo que llegue yo.. solo que aun asi se muere impunemente en menos del 10%, tendria que agregar la exclusion para las migraciones de la instancia que me estan faltando.

<blockquote>

68/204 [▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░] 33%
Warning: require_once(consola/consola.php): failed to open stream: No such file or directory in /path/al/proyecto/php/extension_toba/stock_comando.php on line 3

Fatal error: require_once(): Failed opening required ‘consola/consola.php’ (include_path=‘/path/al/proyecto/vendor/pear/console_getopt:/path/al/proyecto/vendor/pear/pear-core-minimal/src:/path/al/proyecto/vendor/pear/pear_exception:/path/al/proyecto/vendor/siu-toba/numbers_words:/path/al/proyecto/vendor/siu-toba/structures_graph:/path/al/proyecto/vendor/siu-toba/text_highlighter:/path/al/proyecto/vendor/pear/console_getopt:/path/al/proyecto/vendor/pear/pear-core-minimal/src:/path/al/proyecto/vendor/pear/pear_exception:/path/al/proyecto/vendor/siu-toba/numbers_words:/path/al/proyecto/vendor/siu-toba/structures_graph:/path/al/proyecto/vendor/siu-toba/text_highlighter:.:/usr/share/php’) in /path/al/proyecto/php/extension_toba/stock_comando.php on line 3

</blockquote>
Es lo que te decia mas arriba, intenta cargar desde tus clases... cuando en la consola el camino es inverso, salvo que tengas el require_once explicito, no va a encontrar la clase.
Ademas, justamente esa parte requiere de parametros para determinar proyecto, directorio de instalacion, etc... no es muy "static" friendly.

<blockquote>Una cosa que se me ocurre probar (aun no me hice el tiempo) es ver si se puede hacer un autoload de todo toba en composer tal como indican aca[1]. No es util para toba en si pero por ahi le sirve a phpstan. Tenes idea si eso se puede hacer?

[1]: https://getcomposer.org/doc/04-schema.md#psr-4</blockquote>
Toba ya tiene apuntado en composer el autoload con formato psr-4, lo que hay que ir haciendo es pasar el resto de las clases a namespaces e incorporarlas ahi dentro.
Me parece que es mas sencillo hacer asi:


parameters:
autoload_files:
- php/proyecto_autoload.php
- vendor/siu-toba/framework/php/toba_autoload.php



Y con eso intentar garantizarse que levanta ambos,  igual.. .aun con eso, la parte de consola seguramente siga fallando.. asi que quizas debas meter esa parte dentro del exclude.

Saludos

mmmm, vuelvo al primer error con eso así, donde no encuentra ninguna de las clases. Si solo incluyo esos archivos, donde “ejecuta” los autoload? Por lo que veo es una clase con métodos unicamente.

Igual mi idea no era que tengas que tocar todo el framework para que funcione esta tool, pensé que por ahí había un script que hacia los include globales y podía alcanzar con eso, pero ahora que decís, es verdad que tampoco hay namespaces en gran parte del código.

Si te puedo ayudar en algo, avisame.

En teoria los autoload los tiene que registrar nomas, una vez hecho eso solamente se invocan cuando no se encuentra cargada la definicion de una clase en memoria… sino no deberia pasar nunca.

Igual mi idea no era que tengas que tocar todo el framework para que funcione esta tool, pensé que por ahí había un script que hacia los include globales y podía alcanzar con eso, pero ahora que decís, es verdad que tampoco hay namespaces en gran parte del código.
Hay partes que es dificil que funcionen.. pero eso al menos lo podriamos agregar al exclude para que no lo analice... al menos igualmente quedaria el resto. Seguramente si hacemos una extension para la herramienta podamos definir con mayor detalle algunas cosas que con la config por ahi no nos alcanza, voy a chusmear un poco mas para ver que nos proveeria eso.

Ciertamente te voy a pedir que me ayudes con el testing del lado de los proyectos, aun cuando Toba pudiera lanzar un analisis sobre si mismo… lo bueno seria que los proyectos puedan adoptarlo para CI.

Saludos

Perfecto, quedo a la espera entonces