Инструмент для добавления и завершения документации исходного кода PHP

У меня есть несколько готовых, старых PHP-проектов, в которых много всего, что я хотел бы документировать в стиле javadoc / phpDocumentor.

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

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

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

  • Предоставьте метод на полпути, легко добавьте недостающие докблоки, создав пустые структуры и, в идеале, открыв файл в редакторе (внутреннем или внешнем, мне все равно), поэтому я могу добавить описание.

Необязательный:

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

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

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

Solutions Collecting From Web of "Инструмент для добавления и завершения документации исходного кода PHP"

Я думаю, 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-generator 😉

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

После нескольких тестов он может, например, запускать его в файле класса с --undocumentedelements документацией, с параметром --undocumentedelements , например:

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

Дает это в середине вывода:

 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 

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

Теперь я не знаю какого-либо инструмента, который будет предварительно генерировать недостающие докблоки для вас: я обычно использую PHP_Codesniffer и / или phpDocumentor в своем непрерывном интегрировании mecanism, он сообщает о недостающих документах, а затем каждый разработчик добавляет недостающие , из его IDE …

… Что работает очень хорошо: каждый день не хватает пары недостающих докблоков, поэтому задача может выполняться вручную (а Eclipse PDT предоставляет функцию предварительной генерации docblock для метода, когда вы редактирование определенного файла / метода) .

Appart от этого, я действительно не знаю полностью автоматизированного инструмента для создания docblocks … Но я уверен, что нам удалось создать интересный инструмент, используя либо:

  • API Reflection
  • token_get_all для анализа источника файла PHP.

Однако после немного большего поиска я нашел этот блог-пост (он на французском языке – возможно, некоторые люди здесь смогут понять) : Ajout automatique de Tags phpDoc à l'aide de PHP_Beautifier .
Возможный перевод названия: «Автоматическое добавление тегов 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 две мелочи в 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
  • Докблоки, которые были добавлены по методу __construct
  • doSomething на doSomething уже присутствовали в нашем коде: он не был удален.
  • Есть некоторые теги @todo ^^

Конечно, это не идеально, конечно:

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

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

  • О материалах, которые не документируются: добавление новых тегов, которые будут признаны, не должно быть слишком сложным
    • Вам просто нужно добавить их в список в начале фильтра
  • Усиление существующих докблоков может быть сложнее, я должен признать
  • Хорошо, что это может быть полностью автоматизировано
  • Используя Eclipse PDT, возможно, это может быть установлено как внешний инструмент , поэтому мы можем хотя бы запустить его из нашей среды IDE?

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

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

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

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

В версиях 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

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

HTH, Jc

Не знаю, если это какая-то помощь, но если 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) 

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

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

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

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

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

В последнее время мне пришлось сделать большую партию автоматизации фиксации docblock, в основном на основе правильного ответа выше с некоторыми изменениями, специфичными для контекста. Это взломать, но я связываюсь здесь, если он будет полезен кому-либо еще в будущем. По сути, он выполняет базовый синтаксический разбор токенов блока комментариев в PHP Beautifier.

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