From bb5cdc03e426f020f915f11292780688cbdb7c56 Mon Sep 17 00:00:00 2001 From: Hugo Sales Date: Wed, 8 Apr 2020 23:17:20 +0000 Subject: [PATCH] [DOCUMENTATION][TOOLS] Wrote a tool to generate entity diagrams from the database definition --- bin/generate_entity_diagrams | 102 +++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100755 bin/generate_entity_diagrams diff --git a/bin/generate_entity_diagrams b/bin/generate_entity_diagrams new file mode 100755 index 0000000000..3a85a06965 --- /dev/null +++ b/bin/generate_entity_diagrams @@ -0,0 +1,102 @@ +#!/bin/php + + $table, 'type' => '']]; + foreach ($schema['fields'] as $name => $opts) { + $fields[] = [ + 'name' => $name, + 'type' => ": {$opts['type']}" . ($opts['type'] == 'varchar' ? "({$opts['length']})" : ''), + ]; + } + + if (isset($schema['foreign keys'])) { + foreach ($schema['foreign keys'] as $name => $map) { + // Patern matching like above would be nice + list($foreign_table, + $keys) = $map; + $local_key = array_keys($keys)[0]; + $foreign_key = $keys[$local_key]; + $edges[] = "{$table}:{$local_key} -- {$foreign_table}:{$foreign_key}"; + } + } + + $cell = function ($field) { + $def = $field['name'] . $field['type']; + return ['tr' => ['td' => ['attrs' => ['port' => $field['name']], $def]]]; + }; + $html = ['table' => array_merge( + ['attrs' => ['border' => '0', 'cellborder' => '1', 'cellspacing' => '0']], + F\map($fields, $cell)), + ]; + + $tables[] = Common::indent("{$table} [label=<\n" . Common::indent(H::html($html)) . "\n>]"); +} + +$outfile = INSTALL_DIR . '/DOCUMENTATION/database/diagram.tex'; + +$replace = [ + '/%tables%/' => Common::indent(implode("\n", $tables)), + '/%edges%/' => Common::indent(implode("\n", $edges)), + // '/_/' => '\textunderscore ', +]; + +$out = $template; +foreach ($replace as $from => $to) { + $out = preg_replace($from, $to, $out); +} + +file_put_contents($outfile, $out); + +$path = dirname(__DIR__) . '/DOCUMENTATION/database'; + +system("cd {$path} && pdflatex diagram.tex > /dev/null"); +system("neato -Goverlap=false -Gsplines=true -Tpdf {$path}/database.dot -o {$path}/database.pdf"); + +echo "Generated database diagram. See {$path}/database.pdf\n";