dba 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ff91c96a26c84120b2294eaceafbc9cd97d50ae7b8138ed08657efe355fe905b
4
- data.tar.gz: 1e25615aea3aab8f5820f790d038363ea2854488e950d3925e48953d1055006c
3
+ metadata.gz: da758f6bcc3df6dac6998bebc89cbe8d9de6e50a318bb1a0b471336df4a219e3
4
+ data.tar.gz: 0a20d9f33e0930b9dde939ac3edea265e74a95a92a5c9dbdaa68165c963158f8
5
5
  SHA512:
6
- metadata.gz: b77b8fe626319fe20ac77cb31bb5bd2ed349438ea76ef6472b7367e22a804d1027a99744bde3ad2e32e7104f88a52b125a49f32c40223095281f648f150c8f64
7
- data.tar.gz: 21d2f2a661aacc27375c7e9031c1057471ca627f0fb1bcb2c47dc051096e9d15d507d186854bb2fbac2b9851ba63ef2c807d7f91814ecd9490c564c6e073bdf1
6
+ metadata.gz: c8b210d99644562b7d1df35058e04c3e79542058ce4d46d5eddf5575b5164c8d533c8507fd33ff2e58b1ecfad15d935f471144b047924d26cf26464ea41e01cf
7
+ data.tar.gz: d95737e82ce807531b6263bdb0219937ac942ed1d886bea6f1c13e12d9679dd14de12dbb675add906280f96ae5bb455e0f8e92eaf76b902dfd2f495a30ea48a0
data/CHANGES.md CHANGED
@@ -1,3 +1,10 @@
1
+ # 2.3.0
2
+
3
+ * Added diagram command for generating diagrams with Graphviz, DBML, or PlantUML
4
+
5
+ * Usage is now printed to STDOUT instead of STDERR
6
+
7
+
1
8
  # 2.2.0
2
9
 
3
10
  * Fixed compatibility with psych 4+
data/dba.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'dba'
3
- s.version = '2.2.0'
3
+ s.version = '2.3.0'
4
4
  s.license = 'GPL-3.0'
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.authors = ['Tim Craft']
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DBA::DBMLPrinter < DBA::DiagramPrinter
4
+ def print_table_start(name)
5
+ @io.puts "Table #{name} {"
6
+ end
7
+
8
+ def print_table_end(name)
9
+ @io.puts '}'
10
+ end
11
+
12
+ def print_column(name, type)
13
+ @io.puts " #{name} #{type}"
14
+ end
15
+
16
+ def print_foreign_key(table, column, other_table, other_column)
17
+ @io.puts %{Ref: #{table}.#{column} > #{other_table}.#{other_column}}
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DBA::Diagram < DBA::Command
4
+ PRINTERS = {
5
+ '.dbml' => :DBMLPrinter,
6
+ '.dot' => :DOTPrinter,
7
+ '.gv' => :DOTPrinter,
8
+ '.pu' => :PlantUMLPrinter,
9
+ '.puml' => :PlantUMLPrinter,
10
+ }
11
+
12
+ def call(path = nil)
13
+ if path.nil?
14
+ printer = DBA::DOTPrinter.new
15
+ printer.print_diagram(database)
16
+ else
17
+ extension = File.extname(path)
18
+
19
+ printer = PRINTERS.fetch(extension) { raise DBA::Error, 'unsupported file extension' }
20
+ printer = DBA.const_get(printer)
21
+
22
+ File.open(path, 'w+') do |file|
23
+ printer = printer.new(file)
24
+ printer.print_diagram(database)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,67 @@
1
+ class DBA::DiagramPrinter
2
+ def initialize(io = STDOUT)
3
+ @io = io
4
+ end
5
+
6
+ def print_diagram(database)
7
+ print_start
8
+
9
+ @primary_keys = {}
10
+
11
+ table_names = database.tables
12
+
13
+ table_names.each do |name|
14
+ schema_hash = database.schema(name)
15
+
16
+ print_table(name, schema_hash)
17
+ end
18
+
19
+ table_names.each do |table|
20
+ database.foreign_key_list(table).each do |hash|
21
+ column = hash.fetch(:columns).first
22
+
23
+ other_table = hash.fetch(:table)
24
+
25
+ other_column = @primary_keys.fetch(other_table)
26
+
27
+ print_foreign_key(table, column, other_table, other_column)
28
+ end
29
+ end
30
+
31
+ print_end
32
+ end
33
+
34
+ def print_start
35
+ end
36
+
37
+ def print_end
38
+ end
39
+
40
+ def print_table(name, schema_hash)
41
+ print_table_start(name)
42
+
43
+ schema_hash.each do |column_name, info_hash|
44
+ column_type = info_hash[:type] || info_hash[:db_type]
45
+
46
+ if info_hash[:primary_key]
47
+ @primary_keys[name] = column_name
48
+ end
49
+
50
+ print_column(column_name, column_type)
51
+ end
52
+
53
+ print_table_end(name)
54
+ end
55
+
56
+ def print_table_start(name)
57
+ end
58
+
59
+ def print_table_end(name)
60
+ end
61
+
62
+ def print_column(name, type)
63
+ end
64
+
65
+ def print_foreign_key(table, column, other_table, other_column)
66
+ end
67
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DBA::DOTPrinter < DBA::DiagramPrinter
4
+ def print_start
5
+ @io.puts 'digraph database {'
6
+ @io.puts ' graph[rankdir="LR",ranksep=1.5,nodesep=0.5];'
7
+ @io.puts ' node[shape="Mrecord",fontname="Helvetica,Arial,sans-serif"];'
8
+ end
9
+
10
+ def print_end
11
+ @io.puts '}'
12
+ end
13
+
14
+ def print_table(name, schema_hash)
15
+ label = [name]
16
+
17
+ schema_hash.each do |column_name, info_hash|
18
+ column_type = info_hash[:type] || info_hash[:db_type]
19
+
20
+ if info_hash[:primary_key]
21
+ @primary_keys[name] = column_name
22
+
23
+ label << "{<#{column_name}>#{column_name}|#{column_type}}"
24
+ else
25
+ label << "{#{column_name}|<#{column_name}>#{column_type}}"
26
+ end
27
+ end
28
+
29
+ label = label.join('|')
30
+
31
+ @io.puts %{ #{name}[label="#{label}"];}
32
+ end
33
+
34
+ def print_foreign_key(table, column, other_table, other_column)
35
+ @io.puts %{ #{table}:#{column} -> #{other_table}:#{other_column};}
36
+ end
37
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DBA::PlantUMLPrinter < DBA::DiagramPrinter
4
+ def print_start
5
+ @io.puts '@startuml'
6
+ @io.puts 'left to right direction'
7
+ end
8
+
9
+ def print_end
10
+ @io.puts '@enduml'
11
+ end
12
+
13
+ def print_table_start(name)
14
+ @io.puts "map #{name} {"
15
+ end
16
+
17
+ def print_table_end(name)
18
+ @io.puts '}'
19
+ end
20
+
21
+ def print_column(name, type)
22
+ @io.puts " #{name} => #{type}"
23
+ end
24
+
25
+ def print_foreign_key(table, column, other_table, other_column)
26
+ @io.puts %{#{table}::#{column} *-> #{other_table}::#{other_column}}
27
+ end
28
+ end
data/lib/dba/shell.rb CHANGED
@@ -30,6 +30,7 @@ module DBA::Shell
30
30
 
31
31
  def commands
32
32
  {
33
+ 'diagram' => :Diagram,
33
34
  'diff' => :Diff,
34
35
  'dump' => :Dump,
35
36
  'edit' => :Edit,
@@ -55,7 +56,7 @@ module DBA::Shell
55
56
  end
56
57
 
57
58
  def print_usage
58
- printer = DBA::Printer.new(STDERR)
59
+ printer = DBA::Printer.new
59
60
  printer.print_usage(program_name, command_parameters)
60
61
 
61
62
  Kernel::exit(1)
data/lib/dba.rb CHANGED
@@ -18,9 +18,12 @@ module DBA
18
18
  loader = Zeitwerk::Loader.new
19
19
  loader.tag = File.basename(__FILE__, '.rb')
20
20
  loader.inflector.inflect({
21
- 'dba' => 'DBA',
22
21
  'csv' => 'CSV',
22
+ 'dba' => 'DBA',
23
+ 'dbml_printer' => 'DBMLPrinter',
24
+ 'dot_printer' => 'DOTPrinter',
23
25
  'ldjson' => 'LDJSON',
26
+ 'plant_uml_printer' => 'PlantUMLPrinter',
24
27
  'yaml' => 'YAML'
25
28
  })
26
29
  loader.push_dir(__dir__)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dba
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Craft
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-11 00:00:00.000000000 Z
11
+ date: 2024-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: zeitwerk
@@ -75,13 +75,18 @@ files:
75
75
  - lib/dba/command.rb
76
76
  - lib/dba/csv.rb
77
77
  - lib/dba/database.rb
78
+ - lib/dba/dbml_printer.rb
79
+ - lib/dba/diagram.rb
80
+ - lib/dba/diagram_printer.rb
78
81
  - lib/dba/diff.rb
82
+ - lib/dba/dot_printer.rb
79
83
  - lib/dba/dump.rb
80
84
  - lib/dba/edit.rb
81
85
  - lib/dba/find.rb
82
86
  - lib/dba/indexes.rb
83
87
  - lib/dba/ldjson.rb
84
88
  - lib/dba/load.rb
89
+ - lib/dba/plant_uml_printer.rb
85
90
  - lib/dba/printer.rb
86
91
  - lib/dba/pull.rb
87
92
  - lib/dba/row_command.rb
@@ -114,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
119
  - !ruby/object:Gem::Version
115
120
  version: '0'
116
121
  requirements: []
117
- rubygems_version: 3.4.10
122
+ rubygems_version: 3.5.11
118
123
  signing_key:
119
124
  specification_version: 4
120
125
  summary: See description