
Возникло у меня желание автоматом создавать граф иерархии классов и модулей Ruby в формате DOT для последующей обработки утилитами GraphViz. Вообще-то такая возможность есть в штатном автодокументаторе RDoc, но она меня не устроила — немного не то, не настраивается, не во всех шаблонах доступна.
Немного поковырялся и написал, благо Ruby поддерживает богатые возможности самоисследования. Базируется работа программы, которую я решил обозвать RDia, именно на них, а не на разборе кода, ибо очевидно, что транслятор Ruby с этим разбором справится дешевле и качественнее. Кроме того, этот подход позволяет отображать и классы/модули, созданные динамически.
Собственно файл я выложил на гугльдоки, его можно скачать, посмотреть и сделать исполняемым. Вообще, с ним можно делать что угодно в рамках GNU GPL.
Под катом подробное описание и примеры.
Параметры командной строки
В простейшем случае, вызываем программу с именем библиотеки, для которой нам
нужно получить диаграмму классов. Имя в данном случае — то, которое указывается
в операторе “require
”. Если ничего, кроме имени
библиотеки не указано, результат будет выдан на стандартный вывод.
Вообще же скрипт принимает следующие опции:
-o file ,или --output file
|
Перенаправить вывод в файл. |
-x lib[,...] ,или --exclude lib[,...]
|
Перечень через запятую, библиотек, которые мы хотим исключить из вывода. Это нужно, когда желаемая нами библиотека вызывает другую, которую мы в диаграмме видеть не хотим. Правда, классы «исключенной» библиотеки в диаграмму попасть могут, в качестве «ведомых» в том смысле, что на них ссылаются (наследуют, включают) классы/модули основной библиотеки. |
-p lib[,...] ,или --preload lib[,...]
|
Синоним предыдущей опции. Дело в том, что обработка производится посредством
“ |
-X ,или --exclude-exceptions
|
Исключаем из вывода класс |
-s ,или --hide-source
|
Не отображать информацию о файле и строке исходников, где сделано объявление. |
-a ,или --anonimous
|
Включить отображение анонимных классов/модулей. По-умолчанию они пропускаются. |
-C ,--clusters ,-N ,или --namespaces
|
Формировать подграфы-кластеры для каждого namespace, поскольку таковым является любой класс или модуль, итог может получиться весьма монструозным. По-умолчанию, соответственно, отключено. |
-c ,--auto-clusters ,-n ,или --auto-namespaces
|
Формировать кластеры только для динамически созданных классов/модулей и их непосредственного окружения. По-умолчанию тоже отключено, но выглядит не так страшно и более полезно, чем предыдущая возможность. |
-g params ,или --graph params
|
Позволяет установить произвольные опции графа. За информацией обращаться
к документации GraphViz. Строка “ |
Примеры
$ 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.
Комментариев нет:
Отправить комментарий