dba 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ff91c96a26c84120b2294eaceafbc9cd97d50ae7b8138ed08657efe355fe905b
4
- data.tar.gz: 1e25615aea3aab8f5820f790d038363ea2854488e950d3925e48953d1055006c
3
+ metadata.gz: 74ad1c9318dc8528558d79b8e4705689f883c109724a6f184a392bfab3c3996f
4
+ data.tar.gz: f344a83c6abd29713f6975ab50fc524cdfa618a2df9be9de990ed8dd3a371ebf
5
5
  SHA512:
6
- metadata.gz: b77b8fe626319fe20ac77cb31bb5bd2ed349438ea76ef6472b7367e22a804d1027a99744bde3ad2e32e7104f88a52b125a49f32c40223095281f648f150c8f64
7
- data.tar.gz: 21d2f2a661aacc27375c7e9031c1057471ca627f0fb1bcb2c47dc051096e9d15d507d186854bb2fbac2b9851ba63ef2c807d7f91814ecd9490c564c6e073bdf1
6
+ metadata.gz: 98370ebd4bc8ee85bd617dbe6bf91d9e641d08ad29a3bc833625f1f3f0f527f622ed5620c43f8c174faa7c57527a38ea2d8ffcf74eef9708f7c33d04d9bd95ac
7
+ data.tar.gz: 255c954574e9545968238a5c7ddb2fd6fc11bad9379792f1b58dc0ee2e4d15591134d7be85f77b2d17d32d62b5e598261935a4cbc65d16d0796a93b4b2d2a0cd
data/CHANGES.md CHANGED
@@ -1,3 +1,17 @@
1
+ # 2.4.0
2
+
3
+ * **Required ruby version is now 3.1.0**
4
+
5
+ * Added bigdecimal gem dependency
6
+
7
+
8
+ # 2.3.0
9
+
10
+ * Added diagram command for generating diagrams with Graphviz, DBML, or PlantUML
11
+
12
+ * Usage is now printed to STDOUT instead of STDERR
13
+
14
+
1
15
  # 2.2.0
2
16
 
3
17
  * Fixed compatibility with psych 4+
data/README.md CHANGED
@@ -18,6 +18,7 @@ You can connect to any database supported by [sequel](https://rubygems.org/gems/
18
18
  $ dba
19
19
  Usage: dba COMMAND
20
20
 
21
+ dba diagram [PATH]
21
22
  dba diff URL
22
23
  dba dump TABLE EXTENSION
23
24
  dba edit TABLE IDENTIFIER
@@ -28,7 +29,7 @@ You can connect to any database supported by [sequel](https://rubygems.org/gems/
28
29
  dba sample TABLE [COLUMN]
29
30
  dba schema [TABLE]
30
31
  dba select TABLE COLUMN VALUE
31
- dba tables
32
+ dba tables
32
33
 
33
34
 
34
35
  ## ERROR: could not find database
data/dba.gemspec CHANGED
@@ -1,18 +1,19 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'dba'
3
- s.version = '2.2.0'
3
+ s.version = '2.4.0'
4
4
  s.license = 'GPL-3.0'
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.authors = ['Tim Craft']
7
- s.email = ['mail@timcraft.com']
7
+ s.email = ['email@timcraft.com']
8
8
  s.homepage = 'https://github.com/readysteady/dba'
9
9
  s.description = 'Ruby command line tool for working with development databases'
10
10
  s.summary = 'See description'
11
11
  s.files = Dir.glob('lib/**/*.rb') + %w[CHANGES.md LICENSE.txt README.md dba.gemspec]
12
- s.required_ruby_version = '>= 2.5.0'
13
- s.add_dependency('zeitwerk', '~> 2', '>= 2.2')
14
- s.add_dependency('sequel', '~> 5')
15
- s.add_dependency('pastel', '~> 0')
12
+ s.required_ruby_version = '>= 3.1.0'
13
+ s.add_dependency 'bigdecimal', '~> 3'
14
+ s.add_dependency 'pastel', '~> 0'
15
+ s.add_dependency 'sequel', '~> 5'
16
+ s.add_dependency 'zeitwerk', '~> 2'
16
17
  s.require_path = 'lib'
17
18
  s.executables = ['dba']
18
19
  end
data/lib/dba/database.rb CHANGED
@@ -75,11 +75,7 @@ module DBA::Database
75
75
  def database_config
76
76
  source = ERB.new(File.read(database_config_path)).result
77
77
 
78
- if YAML.respond_to?(:unsafe_load)
79
- YAML.unsafe_load(source)
80
- else
81
- YAML.load(source)
82
- end
78
+ YAML.unsafe_load(source)
83
79
  end
84
80
 
85
81
  def development_database_args
@@ -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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2019-2024 TIMCRAFT
1
+ # Copyright (c) 2019-2025 TIMCRAFT
2
2
  #
3
3
  # This program is free software: you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -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,35 +1,43 @@
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.4.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: 2025-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: zeitwerk
14
+ name: bigdecimal
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: '2.2'
19
+ version: '3'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '2'
30
- - - ">="
26
+ version: '3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pastel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
31
32
  - !ruby/object:Gem::Version
32
- version: '2.2'
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
33
41
  - !ruby/object:Gem::Dependency
34
42
  name: sequel
35
43
  requirement: !ruby/object:Gem::Requirement
@@ -45,22 +53,22 @@ dependencies:
45
53
  - !ruby/object:Gem::Version
46
54
  version: '5'
47
55
  - !ruby/object:Gem::Dependency
48
- name: pastel
56
+ name: zeitwerk
49
57
  requirement: !ruby/object:Gem::Requirement
50
58
  requirements:
51
59
  - - "~>"
52
60
  - !ruby/object:Gem::Version
53
- version: '0'
61
+ version: '2'
54
62
  type: :runtime
55
63
  prerelease: false
56
64
  version_requirements: !ruby/object:Gem::Requirement
57
65
  requirements:
58
66
  - - "~>"
59
67
  - !ruby/object:Gem::Version
60
- version: '0'
68
+ version: '2'
61
69
  description: Ruby command line tool for working with development databases
62
70
  email:
63
- - mail@timcraft.com
71
+ - email@timcraft.com
64
72
  executables:
65
73
  - dba
66
74
  extensions: []
@@ -75,13 +83,18 @@ files:
75
83
  - lib/dba/command.rb
76
84
  - lib/dba/csv.rb
77
85
  - lib/dba/database.rb
86
+ - lib/dba/dbml_printer.rb
87
+ - lib/dba/diagram.rb
88
+ - lib/dba/diagram_printer.rb
78
89
  - lib/dba/diff.rb
90
+ - lib/dba/dot_printer.rb
79
91
  - lib/dba/dump.rb
80
92
  - lib/dba/edit.rb
81
93
  - lib/dba/find.rb
82
94
  - lib/dba/indexes.rb
83
95
  - lib/dba/ldjson.rb
84
96
  - lib/dba/load.rb
97
+ - lib/dba/plant_uml_printer.rb
85
98
  - lib/dba/printer.rb
86
99
  - lib/dba/pull.rb
87
100
  - lib/dba/row_command.rb
@@ -107,14 +120,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
107
120
  requirements:
108
121
  - - ">="
109
122
  - !ruby/object:Gem::Version
110
- version: 2.5.0
123
+ version: 3.1.0
111
124
  required_rubygems_version: !ruby/object:Gem::Requirement
112
125
  requirements:
113
126
  - - ">="
114
127
  - !ruby/object:Gem::Version
115
128
  version: '0'
116
129
  requirements: []
117
- rubygems_version: 3.4.10
130
+ rubygems_version: 3.5.22
118
131
  signing_key:
119
132
  specification_version: 4
120
133
  summary: See description