Una herramienta para añadir y completar la documentación del código fuente PHP [cerrado]


Tengo varios proyectos PHP antiguos terminados con muchas inclusiones que me gustaría documentar en el estilo javadoc/phpDocumentor.

Si bien trabajar a través de cada archivo manualmente y ser forzado a hacer una revisión de código junto con la documentación sería lo mejor, estoy, simplemente por limitaciones de tiempo, interesado en herramientas que me ayuden a automatizar la tarea tanto como sea posible.

La herramienta en la que estoy pensando idealmente tendría las siguientes características:

  • Analizar un árbol de proyecto PHP y dime dónde hay archivos, clases y funciones/métodos indocumentados (es decir, elementos que faltan el comentario docblock apropiado)

  • Proporcione un método para agregar fácilmente los docblocks que faltan creando las estructuras vacías e, idealmente, abriendo el archivo en un editor (interno o externo no me importa) para que pueda poner la descripción.

Opcional:

  • Reconocimiento automático de tipos de parámetros, retorno valores y cosas así. Pero eso no es realmente necesario.

El lenguaje en cuestión es PHP, aunque me imagino que una herramienta C/Java podría ser capaz de manejar archivos PHP después de algunos ajustes.

Gracias por su gran entrada!

Author: Pekka 웃, 2009-12-20

9 answers

Creo PHP_Codesniffer puede indicar cuando no hay ningún bloque de documentación-ver los ejemplos de informes sobre esta página (citando a uno de esos) :

--------------------------------------------------------------------------------
FOUND 5 ERROR(S) AND 1 WARNING(S) AFFECTING 5 LINE(S)
--------------------------------------------------------------------------------
  2 | ERROR   | Missing file doc comment
 20 | ERROR   | PHP keywords must be lowercase; expected "false" but found
    |         | "FALSE"
 47 | ERROR   | Line not indented correctly; expected 4 spaces but found 1
 47 | WARNING | Equals sign not aligned with surrounding assignments
 51 | ERROR   | Missing function doc comment
 88 | ERROR   | Line not indented correctly; expected 9 spaces but found 6
--------------------------------------------------------------------------------

Supongo que podría usar PHP_CodeSniffer para al menos obtener una lista de todos los archivos / clases / métodos que no tienen documentación; por lo que recuerdo, puede generar XML como salida, lo que sería más fácil de analizar usando alguna herramienta automatizada that que podría ser el primer paso de algún docblock-generator ;-)


Además, si está utilizando phpDocumentor para generar la documentación, ¿puede este no reportar errores por bloques faltantes ?

Después de un par de pruebas, puede running por ejemplo, ejecutarlo en un archivo de clase con poca documentación, con la opción --undocumentedelements, como esta :

phpdoc --filename MyClass.php --target doc --undocumentedelements

Da esto en el medio de la salida:

Reading file /home/squale/developpement/tests/temp/test-phpdoc/MyClass.php -- Parsing file
WARNING in MyClass.php on line 2: Class "MyClass" has no Class-level DocBlock.
WARNING in MyClass.php on line 2: no @package tag was used in a DocBlock for class MyClass
WARNING in MyClass.php on line 5: Method "__construct" has no method-level DocBlock.
WARNING in MyClass.php on line 16: File "/home/squale/developpement/tests/temp/test-phpdoc/MyClass.php" has no page-level DocBlock, use @package in the first DocBlock to create one
done

Pero, aquí, también, incluso si es útil como herramienta de informes, no es tan útil cuando se trata de generando los docblocks faltantes...


Ahora, no conozco ninguna herramienta que pre-genere los docblocks faltantes para usted : generalmente uso PHP_CodeSniffer y / o phpDocumentor en mi mecanismo de integración continua, reporta docblocks faltantes, y, luego, cada desarrollador agrega lo que falta, desde su IDE...

... Lo que funciona bastante bien: generalmente no hay más de un par de docblocks faltantes todos los días, por lo que la tarea se puede hacer a mano (y Eclipse PDT proporciona una característica para pre-generar el docblock para un método, cuando se está editando un archivo/método específico) .

Aparte de eso, realmente no conozco ninguna herramienta totalmente automatizada para generar docblocks... Pero estoy bastante seguro de que podríamos crear una herramienta interesante, usando cualquiera de los dos :


Después de un poco más de búsqueda, sin embargo, encontré esto blog-post (está en francés maybe tal vez algunas personas aquí serán capaces de entender) : Ajout automatique de Tags PHPDoc à l'aide de PHP_Beautifier .
Posible traducción del título:"Adición automática de etiquetas PHPDoc, usando PHP_Beautifier"

La idea en realidad no es mala:

  • El PHP_Beautifier la herramienta es bastante agradable y poderosa, cuando se trata de formatear algún código PHP que no está bien formateado
    • Lo he usado muchos tiempos para el código que ni siquiera podía leer ^^
  • Y se puede extender, usando lo que llama " filtros".

La idea que se usa en el blog-post al que enlacé es:

  • cree un nuevo filtro PHP_Beautifier, que detectará los siguientes tokens :
    • T_CLASS
    • T_FUNCTION
    • T_INTERFACE
  • Y añádase un " borrador" doc-bloquear justo antes de ellos, si no hay ya uno


Para ejecutar la herramienta en algún archivo MyClass.php, primero tuve que instalar PHP_Beautifier:

pear install --alldeps Php_Beautifier-beta

Luego, descargue el filtro al directorio en el que estaba trabajando (podría haberlo puesto en el directorio predeterminado, por supuesto) :

wget http://fxnion.free.fr/downloads/phpDoc.filter.phpcs
cp phpDoc.filter.phpcs phpDoc.filter.php

Y, después de eso, creé un nuevo script beautifier-1.php (Basado en lo que se propone en el blog-post al que enlacé, una vez más), que :

  • Cargar el contenido de mi archivo MyClass.php
  • Instancias PHP_Beautifier
  • Añadir algunos filtros para embellecer el código
  • Añade el filtro phpDoc que acabamos de descargar
  • Embellecer la fuente de nuestro archivo, y hacer eco a la salida estándar.


Al código del script beautifier-1.php le gustará esto :
(Una vez más, la parte más grande es un copy-paste de la entrada del blog; solo traduje los comentarios y cambié un par de cosas pequeñas)

require_once 'PHP/Beautifier.php';

// Load the content of my source-file, with missing docblocks
$sourcecode = file_get_contents('MyClass.php');

$oToken = new PHP_Beautifier(); 

// The phpDoc.filter.php file is not in the default directory,
// but in the "current" one => we need to add it to the list of
// directories that PHP_Beautifier will search in for filters
$oToken->addFilterDirectory(dirname(__FILE__));

// Adding some nice filters, to format the code
$oToken->addFilter('ArrayNested');  
$oToken->addFilter('Lowercase');        
$oToken->addFilter('IndentStyles', array('style'=>'k&r'));

// Adding the phpDoc filter, asking it to add a license
// at the beginning of the file
$oToken->addFilter('phpDoc', array('license'=>'php'));

// The code is in $sourceCode
// We could also have used the setInputFile method,
// instead of having the code in a variable
$oToken->setInputString($sourcecode);        
$oToken->process();

// And here we get the result, all clean !              
echo $oToken->get();

Nota que también tuve que trazar dos pequeñas cosas en phpDoc.filter.php, para evitar una advertencia y un aviso...
El parche correspondiente se puede descargar allí: http://extern.pascal-martin.fr/so/phpDoc.filter-pmn.patch


Ahora, si ejecutamos ese script beautifier-1.php:

$ php ./beautifier-1.php

Con un archivo MyClass.php que contiene inicialmente este código :

class MyClass {
    public function __construct($myString, $myInt) {
        // 
    }

    /**
     * Method with some comment
     * @param array $params blah blah
     */
    public function doSomething(array $params = array()) {
        // ...
    }

    protected $_myVar;
}

Este es el tipo de resultado que obtenemos once una vez que nuestro archivo está Embellecido :

<?php
/**
 *
 * PHP version 5
 *
 * LICENSE: This source file is subject to version 3.0 of the PHP license
 * that is available through the world-wide-web at the following URI:
 * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
 * the PHP License and are unable to obtain it through the web, please
 * send a note to [email protected] so we can mail you a copy immediately.
 * @category   PHP
 * @package
 * @subpackage Filter
 * @author FirstName LastName <mail>
 * @copyright 2009 FirstName LastName
 * @link
 * @license     http://www.php.net/license/3_0.txt  PHP License 3.0
 * @version    CVS: $Id:$
 */


/**
 * @todo Description of class MyClass
 * @author 
 * @version 
 * @package 
 * @subpackage 
 * @category 
 * @link 
 */
class MyClass {

    /**
     * @todo Description of function __construct
     * @param  $myString 
     * @param  $myInt
     * @return 
     */
    public function __construct($myString, $myInt) {
        //

    }
    /**
     * Method with some comment
     * @param array $params blah blah
     */
    public function doSomething(array $params = array()) {
        // ...

    }

    protected $_myVar;
}

Podemos notar: {[39]]}

  • La licencia bloque al principio del archivo
  • El docblock que se ha añadido en la clase MyClass
  • El docblock que se ha añadido en el método __construct
  • El docblock en el doSomething ya estaba presente en nuestro código : no se ha eliminado.
  • Hay algunas etiquetas @todo ^^


Ahora, no es perfecto, por supuesto :

  • No documenta todas las cosas que podríamos querer también
    • Por ejemplo, aquí, no documentó la protected $_myVar
  • No mejora los docblocks existentes
  • Y no abre el archivo en ningún editor gráfico
    • Pero eso sería mucho más difícil, supongo...


Pero estoy bastante seguro de que esta idea podría usarse como punto de partida para algo mucho más interesante :

  • Sobre las cosas que no se documentan: agregar nuevas etiquetas que se reconocerán no debería ser demasiado difícil
    • Usted acaba de tener para añadirlos a una lista al principio del filtro
  • Mejorar los docblocks existentes podría ser más difícil, tengo que admitir
  • Lo bueno es que esto podría ser totalmente automatizado{[66]]}
  • Usando Eclipse PDT, tal vez esto podría establecerse como una Herramienta externa , por lo que al menos podemos lanzarlo desde nuestro IDE ?
 42
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-14 10:05:20

Dado que PHPCS ya se mencionó, añado la API de reflexión para verificar si faltan DocBlocks. El artículo vinculado a continuación es un breve tutorial sobre cómo podría abordar su problema:

También hay un Paquete de PERA PHP_DocBlockGenerator que puede crear el bloque de página de archivo y los DocBlocks para includes, variables globales, funciones, parámetros, clases, constantes, propiedades y métodos (y otros cosa).

 3
Author: Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-30 21:39:57

Puede usar el rastreador de código para PHP para probar su código contra un conjunto predefinido de directrices de codificación. También comprobará si faltan docblocks y generará un informe que puede usar para identificar los archivos.

 1
Author: Dan Soap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-20 17:32:49

Php-tracer-weaver puede instrumentar código y generar docblocks con los tipos de parámetros, deducidos a través del análisis de tiempo de ejecución.

 1
Author: troelskn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-20 19:20:22

El 1.4.las versiones x de phpDocumentor tienen la opción-ue (und undocumentedelements) [1], que hará que los elementos indocumentados se listen como advertencias sobre los errores.página html que genera durante su ejecución doc.

Además, PHP_DocBlockGenerator [2] de PEAR parece que puede generar docblocks faltantes para usted.

[1] -- http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_phpDocumentor.howto.pkg.html#using.command-line.undocumentedelements

[2] -- http://pear.php.net/package/PHP_DocBlockGenerator

 1
Author: ashnazg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-06 21:05:02

Utilizamos codesniffer para esta funcionalidad en el trabajo, utilizando estándares estándar PEAR o Zend. No le permitirá editar los archivos sobre la marcha, pero definitivamente le dará una lista, con líneas y descripción de qué tipo de docblock falta.

HTH, Jc

 0
Author: JC.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-20 20:31:36

No tengo idea de si es de ayuda, pero si Codesniffer puede señalar las funciones/métodos, entonces un IDE PHP decente (ofrezco PhpED) puede inspeccionar y andamiaje fácilmente los comentarios PHPDoc para cada función.

Simplemente escriba /** encima de cada función y presione ENTER, y PhpED completará automáticamente el código con @param1, @param1, @return, etc. rellenado correctamente, listo para sus descripciones adicionales. Aquí está el primero que probé con el fin de proporcionar un ejemplo:

  /**
  * put your comment here...
  * 
  * @param mixed $url
  * @param mixed $method
  * @param mixed $timeout
  * @param mixed $vars
  * @param mixed $allow_redirects
  * @return mixed
  */
  public static function curl_get_file_contents($url, $method = 'get', $timeout = 30, $vars = array(), $allow_redirects = true)

Esto es fácilmente ajustado a:

  /**
  * Retrieves a file using the cURL extension
  * 
  * @param string $url
  * @param string $method
  * @param int $timeout
  * @param array $vars parameters to pass to cURL
  * @param int $allow_redirects boolean choice to follow any redirects $url serves up
  * @return mixed
  */
  public static function curl_get_file_contents($url, $method = 'get', $timeout = 30, $vars = array(), $allow_redirects = true)  

No es exactamente una solución automatizada, pero lo suficientemente rápido para mí como un desarrollador perezoso:)

 0
Author: Raise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-07 01:17:35

¿Quieres automatizar el problema de rellenar los datos de tipo "javadoc"?

El DMS Software Reengineering Toolkit podría configurarse para hacer esto.

Analiza el texto fuente como lo hacen los compiladores, construye estructuras internas del compilador, le permite implementar análisis arbitrarios, hacer modificaciones a esas estructuras y luego regenerar ("prettyprint") el texto fuente cambiado de acuerdo con los cambios de estructura. Incluso conserva los comentarios y el formato de la texto original; por supuesto, puede insertar comentarios adicionales y aparecerán y este parece ser su objetivo principal. DMS hace esto para muchos lenguajes, incluyendo PHP

Lo que te gustaría hacer es analizar cada archivo PHP, localizar cada clase/método, generar los comentarios "javadoc" que deberían ser esa entidad (diferencia para clases y métodos, ¿verdad?) y luego comprobar que los comentarios correspondientes estaban realmente presentes en las estructuras del compilador. Si no, simplemente insértelos. PrettyPrint el resultado final. Debido a que tiene acceso a las estructuras del compilador que representan el código, no debería ser difícil generar parámetros y devolver información, como usted sugirió. Lo que no puede hacer, por supuesto, es generar comentarios sobre intendend purpose; pero podría generar un marcador de posición para que lo rellenes más tarde.

 0
Author: Ira Baxter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-09 01:48:19

Tuve que hacer un gran lote de automatización de docblock fijación recientemente, sobre todo basado en la respuesta correcta por encima kwith algunos cambios específicos del contexto. Es un truco, pero estoy enlazando aquí en caso de que sea útil para alguien más en el futuro. Esencialmente, hace un análisis básico de tokens de bloque de comentarios dentro de PHP Beautifier.

Https://gist.github.com/israelshirk/408f2656100196e73367

 0
Author: Israel Zion Shirk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-03 04:52:08