Skip to content

Mantis + GraphViz

21/03/2011

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

Получение данных

Я решил найти API нашей системы багтрекинга Mantis чтобы взять оттуда список багов и построить граф зависимостей. Я помню что когда то читал об этом API. Оказалось что Mantis предоставляет SOAP API для получения всей необходимой информации о багах (MantisConnect). Так как из Node работать с SOAP оказалось не очень удобно, я переключился на PHP. Я использовал класс NuSOAP чтобы не изобретать велосипед лишний раз. Обращение к Мантису с помощью NuSOAP делается примерно так:

require_once('nusoap-0.9.5/lib/nusoap.php');
$WSDL_POINT = "https://mantis.example.com/api/soap/mantisconnect.php";
$username = 'username';
$password = 'password';

$proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
$proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
$proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
$proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
$useCURL = isset($_POST['usecurl']) ? $_POST['usecurl'] : '0';

$client = new nusoap_client($WSDL_POINT, false,
					$proxyhost, $proxyport, $proxyusername, $proxypassword);

Теперь можно вызывать методы. Я решил просто создать в Мантисе фильтр на нужные баги и получать его результаты:

$params = array(
    'username' => $username,
    'password'         => $password,
    'project_id'         => 42, // Проект, который нас интересует (можно посмотреть в веб-интерейсе Mantis)
    'filter_id'          => 987, // ID фильтра, можно посмотреть на странице управления фильтрами
    'page_number'         => 1,
    'per_page'       => 400 // получить 400 записей
);
$result = $client->call('mc_filter_get_issues', $params,  'https://mantis.example.com:443/api/soap/mantisconnect.php', 'http://soap.amazon.com');

В $result окажется результат обращения к API — массив багов с соответствующими полями. Теперь надо перевести его в формат, подходящий для построения графика.

Graphviz и DOT-файлы

По примеру cg2dot я решил выводить данные в виде DOT-файла. Описание формата можно найти в Wikipedia — он довольно простой. Я просто прошёл по массиву багов и вывел все описания в виде 12345 [label="24430: example issue description"]; и связи parent-child в виде 12345 -> 12346. К сожалению, я не нашёл способа одновременно рисовать направленные и ненаправленные ребра, потому для related to я использовал стрелки в обоих направлениях. Все строки записываются внутри конструкции digraph issues { / }. Я ещё добавил строку rankdir=LR чтобы узлы отрисовывались сверху вниз. По умолчанию dot отрисовывает их в строку, и с длинными описаниями багов получается довольно неудобная картина.

В результате у меня получился граф зависимостей багов. Я ещё немного дописал код чтобы баги разного приоритета выводились разными цветами (12345 [color="green"];). Получившийся код я запускаю прямо из командной строки:

C:\xampp\htdocs\issues>php index.php | "c:\Program Files\Graphviz2.24\bin\dot.exe" -Tpng -o21-mar-11_19-41.png

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

UPD: испытал код на мантисе для Dwarf Fortress, получился огромный граф.

Ссылки по теме

Advertisements
Добавить комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: