У меня есть несколько законченных, более старых проектов PHP с большим количеством из, включает это, я хотел бы зарегистрировать в стиле javadoc/phpDocumentor.
Работая через каждый файл вручную и будучи вынужденным сделать обзор кода вместе с документированием был бы лучшей вещью, я, просто несвоевременные ограничения, заинтересованные инструментами, чтобы помочь мне автоматизировать задачу как можно больше.
Инструмент, о котором я думаю, идеально имел бы следующие функции:
Проанализируйте дерево проекта PHP и скажите мне, где существуют недокументированные файлы, классы и функции/методы (т.е. элементы, пропускающие соответствующий комментарий docblock)
Обеспечьте метод к промежуточному легко добавляют пропавших без вести docblocks путем создания пустых структур и, идеально, открытия файла в редакторе (внутренний или внешний, я не забочусь), таким образом, я могу вставить описание.
Дополнительный:
Рассматриваемый язык является PHP, хотя я мог предположить, что инструмент C/Java смог обрабатывать файлы 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; -)
Кроме того, если вы используете phpDocumentor для генерации документации, может ли он не сообщать об ошибках для отсутствующих блоков?
После пары тестов он может - например, запустив его в файле класса с небольшим количеством документации, с - параметр undocumentedelements
, например:
Возможный перевод названия: «Автоматическое добавление тегов phpDoc с использованием PHP_Beautifier»
Идея на самом деле неплохая:
PHP_Beautifier
довольно приятный и мощный, когда дело касается формирование некоторого PHP-кода, который плохо отформатирован
PHP_Beautifier_Filter
для получения списка предоставленных фильтров Идея, использованная в сообщении блога, на которое я ссылаюсь, заключается в следующем:
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
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
Но я почти уверен, что эту идею можно было бы использовать как отправную точку для чего-то гораздо более интересного:
Вы можете использовать Code Sniffer для PHP, чтобы проверить свой код на соответствие заранее определенному набору руководящих принципов кодирования. Он также проверит отсутствие блоков документов и сгенерирует отчет, который можно использовать для идентификации файлов.
Версии phpDocumentor 1.4.x имеют параметр -ue (--undocumentedelements) [1], который приводит к тому, что недокументированные элементы отображаются в виде предупреждений на создаваемой странице errors.html. во время выполнения документа.
Кроме того, PHP_DocBlockGenerator [2] из PEAR выглядит так, как будто он может генерировать недостающие докблоки для вас.
Мы используем codeniffer для этой функциональности на работе, используя стандартные стандарты PEAR или Zend. Это не позволит вам редактировать файлы "на лету", но определенно предоставит вам список со строками и описанием того, какой тип документа отсутствует.
HTH, Jc
php-tracer-weaver может инструментально кодировать и генерировать докблоки с типами параметров, вычтенными посредством анализа времени выполнения.
Поскольку PHPCS уже упоминался, я добавляю Reflection API для проверки отсутствующих DocBlocks. Статья, ссылка на которую приведена ниже, представляет собой краткое руководство по решению вашей проблемы:
Существует также PEAR-пакет PHP_DocBlockGenerator
который может создать блок файловой страницы и DocBlocks для include, глобальных переменных, функций, параметров, классов, констант, свойств и методов (и других вещей).
Вы действительно хотите автоматизировать проблему заполнения данных типа «javadoc»?
Для этого можно настроить DMS Software Reengineering Toolkit .
Он анализирует исходный текст точно так же, как это делают компиляторы, строит внутренние структуры компилятора, позволяет выполнять произвольный анализ, вносить изменения в эти структуры, а затем регенерировать («довольно печатать») исходный текст, измененный в соответствии с изменениями структуры. Он даже сохраняет комментарии и форматирование исходного текста; Вы, конечно, можете вставить дополнительные комментарии, и они появятся, и это, кажется, ваша основная цель. DMS делает это для многих языков, включая PHP
. Вам нужно проанализировать каждый файл PHP, найти каждый класс / метод, сгенерировать комментарии «javadoc», которые должны быть этой сущностью (различие для классов и методов , не так ли?), а затем проверьте, действительно ли соответствующие комментарии присутствовали в структурах компилятора. Если нет, просто вставьте их. PrettyPrint конечный результат. Поскольку он имеет доступ к структурам компилятора, которые представляют код, не должно быть сложно сгенерировать параметр и вернуть информацию, как вы предложили. Что он, конечно, не может сделать, так это генерировать комментарии о намерении цели ; но он может создать заполнитель, который вы сможете заполнить позже.
Понятия не имею, поможет ли это, но если 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)
Не совсем автоматизированное решение, но достаточно быстрое для меня, как ленивого разработчика:)