Инструмент, чтобы добавить и завершить [закрытую] документацию исходного кода PHP

У меня есть несколько законченных, более старых проектов PHP с большим количеством из, включает это, я хотел бы зарегистрировать в стиле javadoc/phpDocumentor.

Работая через каждый файл вручную и будучи вынужденным сделать обзор кода вместе с документированием был бы лучшей вещью, я, просто несвоевременные ограничения, заинтересованные инструментами, чтобы помочь мне автоматизировать задачу как можно больше.

Инструмент, о котором я думаю, идеально имел бы следующие функции:

  • Проанализируйте дерево проекта PHP и скажите мне, где существуют недокументированные файлы, классы и функции/методы (т.е. элементы, пропускающие соответствующий комментарий docblock)

  • Обеспечьте метод к промежуточному легко добавляют пропавших без вести docblocks путем создания пустых структур и, идеально, открытия файла в редакторе (внутренний или внешний, я не забочусь), таким образом, я могу вставить описание.

Дополнительный:

  • Автоматическое распознавание типов параметра, возвращаемых значений и такого. Но это действительно не требуется.

Рассматриваемый язык является PHP, хотя я мог предположить, что инструмент C/Java смог обрабатывать файлы PHP после некоторой тонкой настройки.

Спасибо за Ваш большой вход!

22
задан 16 revs 14 January 2011 в 23:57
поделиться

8 ответов

Я думаю PHP_Codesniffer может указывать, когда нет докблока - см. Примеры отчетов на этой странице (цитирую один из них) :

--------------------------------------------------------------------------------
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
--------------------------------------------------------------------------------

Я полагаю, вы могли бы использовать PHP_Codesniffer, по крайней мере, для получения списка всех файлов / классов / методов, для которых нет документации; насколько я помню, он может генерировать XML в качестве вывода, который было бы легче проанализировать с помощью какого-нибудь автоматизированного инструмента - это может быть первым шагом какого-нибудь генератора docblock; -)


Кроме того, если вы используете phpDocumentor для генерации документации, может ли он не сообщать об ошибках для отсутствующих блоков?

После пары тестов он может - например, запустив его в файле класса с небольшим количеством документации, с - параметр undocumentedelements , например:
Возможный перевод названия: «Автоматическое добавление тегов phpDoc с использованием PHP_Beautifier»

Идея на самом деле неплохая:

  • Инструмент PHP_Beautifier довольно приятный и мощный, когда дело касается формирование некоторого PHP-кода, который плохо отформатирован
    • Я использовал его много раз для кода, который я даже не мог прочитать ^^
  • И его можно расширить, используя то, что он называет « фильтрами ».
    • см. PHP_Beautifier_Filter для получения списка предоставленных фильтров

Идея, использованная в сообщении блога, на которое я ссылаюсь, заключается в следующем:

  • создать новый фильтр PHP_Beautifier, который будет обнаруживать следующие токены :
    • T_CLASS
    • T_FUNCTION
    • T_INTERFACE
  • И добавьте «черновой» блок документа прямо перед ними, если его еще нет


Для запуска инструмента на некоторых MyClass.php , мне пришлось сначала установить PHP_Beautifier :

pear install --alldeps Php_Beautifier-beta

Затем загрузить фильтр в каталог, в котором я работал (конечно, можно было бы поместить его в каталог по умолчанию) :

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

И после этого я создал новый скрипт beautifier-1.php (на основе того, что было предложено в сообщении в блоге, на которое я снова ссылался) , который:

  • Загружает содержимое моего файла MyClass.php
  • Instanciate PHP_Beautifier
  • Добавляет фильтры для украшения кода
  • Добавляет phpDoc фильтр, который мы только что загрузили
  • Украсить источник нашего файла,и выведите его на стандартный вывод.


Код сценария beautifier-1.php будет выглядеть так:
(Еще раз, самая большая часть - это копипаст из сообщения в блоге; я только перевел комментарии и изменил пару мелочей)

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();

Обратите внимание, что мне также пришлось проработать две мелочи в phpDoc.filter.php , чтобы избежать предупреждения и уведомления ...
Соответствующий патч можно скачать здесь: http://extern.pascal-martin.fr/so/phpDoc.filter-pmn.patch


Теперь, если мы запустим этот beautifier-1 .php сценарий:

$ php ./beautifier-1.php

С файлом MyClass.php , который изначально содержит этот код:

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

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

    protected $_myVar;
}

Вот какой результат мы получаем - как только наш файл будет украшен:

<?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 license@php.net 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;
}

Мы можно отметить:

  • Лицензионный блок в начале файла
  • Док-блок, добавленный в MyClass класс
  • Док-блок, добавленный в конструкцию __ method
  • Док-блок на doSomething уже присутствовал в нашем коде: он не был удален.
  • Есть несколько тегов @todo ^^


Теперь это не идеально, конечно:

  • Нет задокументировать все, что мы могли бы захотеть
    • Например, здесь он не документировал защищенный $ _myVar
  • Он не улучшает существующие докблоки
  • И не открывает файл ни в каком графическом редакторе
    • Но это было бы намного сложнее, я думаю ...


Но я почти уверен, что эту идею можно было бы использовать как отправную точку для чего-то гораздо более интересного:

  • О том, что не так ' t получить документально: добавление новых тегов, которые будут распознаваться, не должно быть слишком сложным
    • Вам просто нужно добавить их в список в начале фильтра.
  • Улучшить существующие док-блоки может быть сложнее, я должен признать
  • Приятно то, что это можно полностью автоматизировать
  • Использование Eclipse PDT, может быть, его можно установить как External Tool , чтобы мы могли хотя бы запустить его из нашей IDE?
42
ответ дан 29 November 2019 в 04:17
поделиться

Вы можете использовать Code Sniffer для PHP, чтобы проверить свой код на соответствие заранее определенному набору руководящих принципов кодирования. Он также проверит отсутствие блоков документов и сгенерирует отчет, который можно использовать для идентификации файлов.

1
ответ дан 29 November 2019 в 04:17
поделиться

Версии phpDocumentor 1.4.x имеют параметр -ue (--undocumentedelements) [1], который приводит к тому, что недокументированные элементы отображаются в виде предупреждений на создаваемой странице errors.html. во время выполнения документа.

Кроме того, PHP_DocBlockGenerator [2] из PEAR выглядит так, как будто он может генерировать недостающие докблоки для вас.

[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
ответ дан 29 November 2019 в 04:17
поделиться

Мы используем codeniffer для этой функциональности на работе, используя стандартные стандарты PEAR или Zend. Это не позволит вам редактировать файлы "на лету", но определенно предоставит вам список со строками и описанием того, какой тип документа отсутствует.

HTH, Jc

0
ответ дан 29 November 2019 в 04:17
поделиться

php-tracer-weaver может инструментально кодировать и генерировать докблоки с типами параметров, вычтенными посредством анализа времени выполнения.

2
ответ дан 29 November 2019 в 04:17
поделиться

Поскольку PHPCS уже упоминался, я добавляю Reflection API для проверки отсутствующих DocBlocks. Статья, ссылка на которую приведена ниже, представляет собой краткое руководство по решению вашей проблемы:

Существует также PEAR-пакет PHP_DocBlockGenerator который может создать блок файловой страницы и DocBlocks для include, глобальных переменных, функций, параметров, классов, констант, свойств и методов (и других вещей).

3
ответ дан 29 November 2019 в 04:17
поделиться

Вы действительно хотите автоматизировать проблему заполнения данных типа «javadoc»?

Для этого можно настроить DMS Software Reengineering Toolkit .

Он анализирует исходный текст точно так же, как это делают компиляторы, строит внутренние структуры компилятора, позволяет выполнять произвольный анализ, вносить изменения в эти структуры, а затем регенерировать («довольно печатать») исходный текст, измененный в соответствии с изменениями структуры. Он даже сохраняет комментарии и форматирование исходного текста; Вы, конечно, можете вставить дополнительные комментарии, и они появятся, и это, кажется, ваша основная цель. DMS делает это для многих языков, включая PHP

. Вам нужно проанализировать каждый файл PHP, найти каждый класс / метод, сгенерировать комментарии «javadoc», которые должны быть этой сущностью (различие для классов и методов , не так ли?), а затем проверьте, действительно ли соответствующие комментарии присутствовали в структурах компилятора. Если нет, просто вставьте их. PrettyPrint конечный результат. Поскольку он имеет доступ к структурам компилятора, которые представляют код, не должно быть сложно сгенерировать параметр и вернуть информацию, как вы предложили. Что он, конечно, не может сделать, так это генерировать комментарии о намерении цели ; но он может создать заполнитель, который вы сможете заполнить позже.

0
ответ дан 29 November 2019 в 04:17
поделиться

Понятия не имею, поможет ли это, но если Codesniffer может указать на функции / методы, тогда достойная PHP IDE (я предлагаю PHPEd) может легко проверить и формируйте комментарии PHPDoc для каждой функции.

Просто введите / ** над каждой функцией и нажмите ENTER, и PHPEd автоматически завершит код с помощью @ param1 , @ param1 , ] @return и т. д. заполнено правильно, готово для дополнительных описаний. Вот первое, что я попробовал, чтобы привести пример:

  /**
  * 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)

Это легко изменить до:

  /**
  * 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)  

Не совсем автоматизированное решение, но достаточно быстрое для меня, как ленивого разработчика:)

0
ответ дан 29 November 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: