суббота, 14 августа 2010 г.

RDia — иерархия классов и модулей Ruby для GraphViz

Возникло у меня желание автоматом создавать граф иерархии классов и модулей Ruby в формате DOT для последующей обработки утилитами GraphViz. Вообще-то такая возможность есть в штатном автодокументаторе RDoc, но она меня не устроила — немного не то, не настраивается, не во всех шаблонах доступна.

Немного поковырялся и написал, благо Ruby поддерживает богатые возможности самоисследования. Базируется работа программы, которую я решил обозвать RDia, именно на них, а не на разборе кода, ибо очевидно, что транслятор Ruby с этим разбором справится дешевле и качественнее. Кроме того, этот подход позволяет отображать и классы/модули, созданные динамически.

Собственно файл я выложил на гугльдоки, его можно скачать, посмотреть и сделать исполняемым. Вообще, с ним можно делать что угодно в рамках GNU GPL.

Под катом подробное описание и примеры.

Параметры командной строки

В простейшем случае, вызываем программу с именем библиотеки, для которой нам нужно получить диаграмму классов. Имя в данном случае — то, которое указывается в операторе “require”. Если ничего, кроме имени библиотеки не указано, результат будет выдан на стандартный вывод.

Вообще же скрипт принимает следующие опции:

-o file,
или --output file

Перенаправить вывод в файл.

-x lib[,...],
или --exclude lib[,...]

Перечень через запятую, библиотек, которые мы хотим исключить из вывода. Это нужно, когда желаемая нами библиотека вызывает другую, которую мы в диаграмме видеть не хотим.

Правда, классы «исключенной» библиотеки в диаграмму попасть могут, в качестве «ведомых» в том смысле, что на них ссылаются (наследуют, включают) классы/модули основной библиотеки.

-p lib[,...],
или --preload lib[,...]

Синоним предыдущей опции. Дело в том, что обработка производится посредством “require”-загрузки при включенных хуках на объявление классов. Соответственно, «исключение» происходит посредством все того же “require”, только до включения хуков.

-X,
или --exclude-exceptions

Исключаем из вывода класс Exception и всех его потомков. Дерево исключений бывает очень большим и иногда будет полезно обойтись без него.

-s,
или --hide-source

Не отображать информацию о файле и строке исходников, где сделано объявление.

-a,
или --anonimous

Включить отображение анонимных классов/модулей. По-умолчанию они пропускаются.

-C,
--clusters,
-N,
или --namespaces

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

-c,
--auto-clusters,
-n,
или --auto-namespaces

Формировать кластеры только для динамически созданных классов/модулей и их непосредственного окружения.

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

-g params,
или --graph params

Позволяет установить произвольные опции графа. За информацией обращаться к документации GraphViz. Строка “params” просто вписывается в начало графа.

Примеры

$ rdia -a -o date.dot date && dot -T png -o date.png date.dot

Теперь то же самое, но не будем включать анонимов и исключим “rational”:

$ rdia -o date2.dot -x rational date && dot -T png -o date2.png date2.dot

Пример с динамическими классами и авто-кластерами (кстати, часть того, из-за чего я и задумался о подобном инструменте):

$ rdia -c -o utils.dot -X yaodb/utils && dot -T png -o utils.png utils.dot

То же самое, но теперь кластеры во всей красе:

$ rdia -C -o utils2.dot -X yaodb/utils && dot -T png -o utils2.png utils2.dot

Ну, и наконец, смертельный номер:

$ rdia -a -o rss.dot rss/2.0 && dot -T png -o rss.png rss.dot

PS: Последний пример ужался при загрузке в Blogger. Его исходный размер — 4075x7464 px.

Комментариев нет:

Отправить комментарий