db-gui 0.2.2 → 0.3.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: 8a23c4423702e92a9b634a90e32d385ac6482ebe1259656a467469c483bfb50e
4
- data.tar.gz: a5dd6514f0d2dd0e0c06b9adc06b1df13ca36be01a3e205eb37aa101568c9117
3
+ metadata.gz: 1a78c9674da527b498d11f7147b066c48d4b9de25f4ad3bffc6d3c7f908e7380
4
+ data.tar.gz: 7d8c82fae0cdc343a6ef2dae98a0b820cd73fa9c6c4c128f60d1ecc751429a0a
5
5
  SHA512:
6
- metadata.gz: e3d60b076358330b17e79cc29f54e15f0fb72a7a5f2459bd1e319268d5c56dae9be0107bc0d3b6b3c1fcd7603c3e5666d7c9fecf3a83d7187b727cd8b8addc44
7
- data.tar.gz: 01c2e579505a3f05aea916a5b977911bbd344844bab274e7d457f88e66d7626e6bee9f6addba5fbb15df1b273045242bf8f2d8a84743a4d23f6488d284ef136c
6
+ metadata.gz: '021209590135c5c94cea318db98b73362c944909d5da2e168544a8524c357f4382baef9776205575459fd0f32f26ec4b86be6de943ec9f04ab0a534574b103d8'
7
+ data.tar.gz: 5596987aded997443eff090340dcf0b407c335e84cf2194194ec30101493d96a0b662b61fb51cae55b67a493f17d443c171dd63cc37fdd2ceb8f14c6fad0c453
data/CHANGELOG.md CHANGED
@@ -1,9 +1,19 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.3.0
4
+
5
+ - Support the ability to save/load multiple databases (DB configs)
6
+ - Add more resiliency against errors when copying table or record data via menu items
7
+
8
+ ## 0.2.3
9
+
10
+ - Edit -> Copy Table (with query & headers) menu item to copy table data with query (e.g. SQL) & headers as a formatted string to the clipboard
11
+
3
12
  ## 0.2.2
4
13
 
5
14
  - Edit -> Copy Table (with headers) menu item to copy table data with headers as a formatted string to the clipboard
6
15
  - Edit -> Copy Selected Row (with headers) menu item to copy selected row data with headers as a formatted string to the clipboard
16
+ - Query -> Run menu item to run query
7
17
 
8
18
  ## 0.2.1
9
19
 
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # DB GUI (Database Graphical User Interface) 0.2.2
1
+ # DB GUI (Database Graphical User Interface) 0.3.0
2
2
  ## [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=40 /> Glimmer DSL for LibUI Application](https://github.com/AndyObtiva/glimmer-dsl-libui)
3
3
  [![Gem Version](https://badge.fury.io/rb/db-gui.svg)](http://badge.fury.io/rb/db-gui)
4
4
 
@@ -12,7 +12,7 @@ It currently supports PostgreSQL as a start, with the potential of supporting ma
12
12
 
13
13
  Run:
14
14
  ```
15
- gem install db-gui -v0.2.2
15
+ gem install db-gui -v0.3.0
16
16
  ```
17
17
 
18
18
  ## Usage
@@ -32,11 +32,14 @@ Note that it stores the last connection details under `~/.db_gui`, and will auto
32
32
 
33
33
  Click on this menu item to copy the table data as a formatted string to the clipboard.
34
34
 
35
-
36
35
  **Edit -> Copy Table (with headers)**
37
36
 
38
37
  Click on this menu item to copy the table data with headers as a formatted string to the clipboard.
39
38
 
39
+ **Edit -> Copy Table (with query & headers)**
40
+
41
+ Click on this menu item to copy the table data with query (e.g. SQL) & headers as a formatted string to the clipboard.
42
+
40
43
  **Edit -> Copy Selected Row**
41
44
 
42
45
  Click on this menu item to copy the selected row data as a formatted string to the clipboard.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.0
data/app/db-gui.rb CHANGED
@@ -13,6 +13,11 @@ class DbGui
13
13
  APP_ROOT = File.expand_path('../..', __FILE__)
14
14
  VERSION = File.read(File.join(APP_ROOT, 'VERSION'))
15
15
  LICENSE = File.read(File.join(APP_ROOT, 'LICENSE.txt'))
16
+ DIR_DB_GUI = File.expand_path(File.join('~', '.db_gui'))
17
+ FileUtils.rm(DIR_DB_GUI) if File.file?(DIR_DB_GUI)
18
+ FileUtils.mkdir_p(DIR_DB_GUI)
19
+ FILE_DB_CONFIGS = File.expand_path(File.join(DIR_DB_GUI, '.db_config'))
20
+ FILE_DB_COMMANDS = File.expand_path(File.join(DIR_DB_GUI, '.db_commands'))
16
21
  end
17
22
 
18
23
  require 'db_gui/view/db_gui_application.rb'
@@ -4,17 +4,15 @@ require 'clipboard'
4
4
 
5
5
  class DbGui
6
6
  module Model
7
- Db = Struct.new(:host, :port, :dbname, :username, :password, :db_command_timeout, keyword_init: true) do
8
- DIR_DB_GUI = File.expand_path(File.join('~', '.db_gui'))
9
- FileUtils.rm(DIR_DB_GUI) if File.file?(DIR_DB_GUI)
10
- FileUtils.mkdir_p(DIR_DB_GUI)
11
- FILE_DB_CONFIGS = File.expand_path(File.join(DIR_DB_GUI, '.db_configs'))
12
- FILE_DB_COMMANDS = File.expand_path(File.join(DIR_DB_GUI, '.db_commands'))
7
+ Db = Struct.new(:name, :host, :port, :dbname, :username, :password, :db_command_timeout, keyword_init: true) do
8
+
13
9
  COUNT_RETRIES = ENV.fetch('DB_COMMAND_COUNT_RETRIES', 7)
14
10
  REGEX_ROW_COUNT = /^\((\d+) row/
15
11
  ERROR_PREFIX = 'ERROR:'
16
12
  NEW_LINE = OS.windows? ? "\r\n" : "\n"
17
13
 
14
+ attr_accessor :deleteable
15
+ alias deleteable? deleteable
18
16
  attr_accessor :connected
19
17
  alias connected? connected
20
18
  attr_accessor :db_command_result
@@ -22,13 +20,37 @@ class DbGui
22
20
  attr_accessor :db_command_result_selection
23
21
 
24
22
  def initialize
25
- load_db_config
26
23
  load_db_command
24
+ reset
25
+ to_h.keys.each do |attribute|
26
+ Glimmer::DataBinding::Observer.proc do |value|
27
+ notify_observers(:saveable)
28
+ end.observe(self, attribute)
29
+ end
30
+ end
31
+
32
+ def reset
33
+ self.name = Db::NAME_NEW
34
+ self.host = nil
27
35
  self.port ||= 5432 # PostgreSQL default port
36
+ self.dbname = nil
37
+ self.username = nil
38
+ self.password = nil
28
39
  self.db_command_result = ''
29
40
  self.db_command_timeout ||= ENV.fetch('DB_COMMAND_TIMEOUT_IN_MILLISECONDS', 300).to_i
30
41
  self.db_command_result_selection = 0
31
- connect if to_h.except(:password).none? {|value| value.nil? || (value.respond_to?(:empty?) && value.empty?) }
42
+ end
43
+
44
+ def new?
45
+ name === Db::NAME_NEW
46
+ end
47
+
48
+ def saveable
49
+ !new?
50
+ end
51
+
52
+ def deleteable
53
+ !new?
32
54
  end
33
55
 
34
56
  def toggle_connection
@@ -42,7 +64,6 @@ class DbGui
42
64
  def connect
43
65
  io
44
66
  self.connected = true
45
- save_db_config
46
67
  end
47
68
 
48
69
  def disconnect
@@ -78,7 +99,6 @@ class DbGui
78
99
 
79
100
  def run_db_command
80
101
  run_io_command(db_command)
81
- save_db_config
82
102
  save_db_command
83
103
  end
84
104
 
@@ -103,14 +123,19 @@ class DbGui
103
123
  Clipboard.copy(formatted_table_string)
104
124
  end
105
125
 
106
- def copy_selected_row
126
+ def copy_table_with_headers
107
127
  return if db_command_result_rows.empty?
108
- Clipboard.copy(formatted_selected_row_string)
128
+ Clipboard.copy(formatted_table_string(include_headers: true))
109
129
  end
110
130
 
111
- def copy_table_with_headers
131
+ def copy_table_with_query_and_headers
112
132
  return if db_command_result_rows.empty?
113
- Clipboard.copy(formatted_table_string(include_headers: true))
133
+ Clipboard.copy(formatted_table_string(include_query: true, include_headers: true))
134
+ end
135
+
136
+ def copy_selected_row
137
+ return if db_command_result_rows.empty?
138
+ Clipboard.copy(formatted_selected_row_string)
114
139
  end
115
140
 
116
141
  def copy_selected_row_with_headers
@@ -118,16 +143,18 @@ class DbGui
118
143
  Clipboard.copy(formatted_selected_row_string(include_headers: true))
119
144
  end
120
145
 
121
- def formatted_table_string(rows = nil, include_headers: false)
146
+ def formatted_table_string(rows = nil, include_query: false, include_headers: false)
122
147
  rows ||= db_command_result_rows
123
148
  rows = rows.dup
124
149
  rows.prepend(db_command_result_headers) if include_headers
125
- column_max_lengths = row_column_max_lengths(rows) # TODO calculate those after prepending headers
126
- rows.map do |row|
150
+ column_max_lengths = row_column_max_lengths(rows)
151
+ formatted_string = rows.map do |row|
127
152
  row.each_with_index.map do |data, column_index|
128
153
  data.ljust(column_max_lengths[column_index])
129
154
  end.join(" | ")
130
155
  end.join(NEW_LINE)
156
+ formatted_string.prepend("#{db_command}\n\n") if include_query
157
+ formatted_string
131
158
  end
132
159
 
133
160
  def formatted_selected_row_string(include_headers: false)
@@ -155,26 +182,8 @@ class DbGui
155
182
  @line = nil
156
183
  end
157
184
 
158
- def save_db_config
159
- db_config_hash = to_h
160
- db_configs_array = [db_config_hash] # TODO in the future, support storing multiple DB configs
161
- db_configs_file_content = YAML.dump(db_configs_array)
162
- File.write(FILE_DB_CONFIGS, db_configs_file_content)
163
- end
164
-
165
- def load_db_config
166
- db_configs_file_content = File.read(FILE_DB_CONFIGS)
167
- db_configs_array = [YAML.load(db_configs_file_content)].flatten
168
- db_config_hash = db_configs_array.first # TODO in the future, support loading multiple DB configs
169
- db_config_hash.each do |attribute, value|
170
- self.send("#{attribute}=", value)
171
- end
172
- rescue => e
173
- puts "No database configurations stored yet. #{e.message}"
174
- end
175
-
176
185
  def save_db_command
177
- db_commands_array = [db_command] # TODO in the future, support storing multiple DB configs
186
+ db_commands_array = [db_command] # TODO in the future, support storing multiple DB commands
178
187
  db_commands_file_content = YAML.dump(db_commands_array)
179
188
  File.write(FILE_DB_COMMANDS, db_commands_file_content)
180
189
  end
@@ -205,6 +214,8 @@ class DbGui
205
214
  def compute_db_command_result_count_headers_rows
206
215
  count = 0
207
216
  headers = rows = []
217
+ # TODO db_command_result.lines has an issue in case the data in the DB in a certain row contains \n
218
+ # Try to bisect data more correctly, maybe by looking at \n one by one
208
219
  db_command_result_lines = db_command_result.lines.reject { |line| line == "\n" }
209
220
  if db_command_result_lines.any?
210
221
  headers = db_command_result_lines.first.split('|').map(&:strip)
@@ -231,5 +242,6 @@ class DbGui
231
242
  column_max_lengths
232
243
  end
233
244
  end
245
+ Db::NAME_NEW = '(New Config)'
234
246
  end
235
247
  end
@@ -0,0 +1,83 @@
1
+ require 'glimmer/data_binding/observable_model'
2
+ require 'db_gui/model/db'
3
+
4
+ class DbGui
5
+ module Presenter
6
+ class DbPresenter
7
+ include Glimmer::DataBinding::ObservableModel
8
+
9
+ attr_accessor :dbs, :selected_db, :new_db
10
+
11
+ def initialize
12
+ @new_db = Model::Db.new
13
+ @dbs = [@new_db]
14
+ @selected_db = @new_db
15
+ load_db_config
16
+ selected_db.connect
17
+ end
18
+
19
+ def newable
20
+ selected_db != new_db
21
+ end
22
+
23
+ def selected_db_name
24
+ selected_db.name
25
+ end
26
+
27
+ def selected_db_name=(db_name)
28
+ self.selected_db = dbs.find { |db| db.name == db_name }
29
+ notify_observers(:newable)
30
+ save_config
31
+ end
32
+
33
+ def save
34
+ if selected_db == new_db && selected_db.name != Model::Db::NAME_NEW
35
+ saved_db = new_db.clone
36
+ new_db.reset
37
+ dbs << saved_db # this will trigger an update to the combobox items
38
+ self.selected_db_name = saved_db.name
39
+ else
40
+ notify_observers(:dbs)
41
+ self.selected_db_name = selected_db.name
42
+ end
43
+ save_config
44
+ end
45
+
46
+ def new
47
+ self.selected_db_name = new_db.name
48
+ end
49
+
50
+ def delete
51
+ dbs.delete(selected_db)
52
+ self.selected_db_name = new_db.name
53
+ end
54
+
55
+ def save_config
56
+ dbs_attributes = dbs.reject {|db| db.name == Model::Db::NAME_NEW }.map(&:to_h)
57
+ selected_db_name
58
+ db_config = {
59
+ selected_db_name:,
60
+ dbs: dbs_attributes,
61
+ }
62
+ db_config_yaml = YAML.dump(db_config)
63
+ File.write(FILE_DB_CONFIGS, db_config_yaml)
64
+ end
65
+
66
+ def load_db_config
67
+ db_config_yaml = File.read(FILE_DB_CONFIGS)
68
+ db_config = YAML.load(db_config_yaml)
69
+ db_config[:dbs].each do |db_config|
70
+ db = Model::Db.new
71
+ db_config.each do |attribute, value|
72
+ db.send("#{attribute}=", value)
73
+ end
74
+ self.dbs << db
75
+ end
76
+ self.selected_db_name = db_config[:selected_db_name]
77
+ rescue => e
78
+ puts "No database configurations stored yet. #{e.message}"
79
+ end
80
+
81
+ end
82
+ end
83
+ end
@@ -7,12 +7,12 @@ class DbGui
7
7
 
8
8
  TIMEOUT_MAX_IN_MILLISECONDS = (ENV['TIMEOUT_MAX_IN_MILLISECONDS'] || 60*60*1000).to_i
9
9
 
10
- option :db
10
+ option :db_presenter
11
11
 
12
12
  body {
13
13
  vertical_box {
14
14
  non_wrapping_multiline_entry {
15
- text <=> [db, :db_command]
15
+ text <=> [db_presenter, 'selected_db.db_command']
16
16
  }
17
17
 
18
18
  horizontal_box {
@@ -20,7 +20,7 @@ class DbGui
20
20
 
21
21
  button('Run') {
22
22
  on_clicked do
23
- db.run_db_command
23
+ db_presenter.selected_db.run_db_command
24
24
  end
25
25
  }
26
26
 
@@ -29,7 +29,7 @@ class DbGui
29
29
  }
30
30
  spinbox(0, TIMEOUT_MAX_IN_MILLISECONDS) {
31
31
  stretchy false
32
- value <=> [db, :db_command_timeout, on_read: :to_i]
32
+ value <=> [db_presenter, 'selected_db.db_command_timeout', on_read: :to_i]
33
33
  }
34
34
 
35
35
  label('Row(s): ') {
@@ -37,7 +37,7 @@ class DbGui
37
37
  }
38
38
  label {
39
39
  stretchy false
40
- text <= [db, :db_command_result_count, computed_by: :db_command_result, on_read: :to_s]
40
+ text <= [db_presenter, 'selected_db.db_command_result_count', computed_by: 'selected_db.db_command_result', on_read: :to_s]
41
41
  }
42
42
  }
43
43
  }
@@ -5,25 +5,25 @@ class DbGui
5
5
  class DbCommandResultTable
6
6
  include Glimmer::LibUI::CustomControl
7
7
 
8
- option :db
8
+ option :db_presenter
9
9
 
10
10
  body {
11
11
  vertical_box {
12
- content(db, :db_command_result) {
13
- if db.db_command_result_error?
14
- label(db.db_command_result)
15
- elsif db.db_command_result_count > 0
12
+ content(db_presenter, 'selected_db.db_command_result') {
13
+ if db_presenter.selected_db.db_command_result_error?
14
+ label(db_presenter.selected_db.db_command_result)
15
+ elsif db_presenter.selected_db.db_command_result_count > 0
16
16
  table {
17
- db.db_command_result_headers.each do |header|
17
+ db_presenter.selected_db.db_command_result_headers.each do |header|
18
18
  text_column(header)
19
19
  end
20
20
 
21
- cell_rows db.db_command_result_rows
21
+ cell_rows db_presenter.selected_db.db_command_result_rows
22
22
  selection_mode :one
23
- selection db.db_command_result_selection
23
+ selection db_presenter.selected_db.db_command_result_selection
24
24
 
25
25
  on_selection_changed do |t, selection, added_selection, removed_selection|
26
- db.db_command_result_selection = selection
26
+ db_presenter.selected_db.db_command_result_selection = selection
27
27
  end
28
28
  }
29
29
  else
@@ -5,48 +5,89 @@ class DbGui
5
5
  class DbConfigForm
6
6
  include Glimmer::LibUI::CustomControl
7
7
 
8
- option :db
8
+ option :db_presenter
9
9
 
10
10
  body {
11
11
  vertical_box {
12
12
  form {
13
+ combobox { |me|
14
+ label 'Selected Config:'
15
+ items <= [db_presenter, :dbs, on_read: ->(dbs) { dbs.map(&:name) }]
16
+ selected_item <=> [db_presenter, :selected_db_name]
17
+ enabled <= [db_presenter, 'selected_db.connected', on_read: :!]
18
+ }
19
+
13
20
  entry {
14
21
  label 'Host:'
15
- text <=> [db, :host]
16
- enabled <= [db, :connected, on_read: :!]
22
+ text <=> [db_presenter, 'selected_db.host']
23
+ enabled <= [db_presenter, 'selected_db.connected', on_read: :!]
17
24
  }
18
25
 
19
26
  spinbox(0, 1_000_000) {
20
27
  label 'Port:'
21
- value <=> [db, :port]
22
- enabled <= [db, :connected, on_read: :!]
28
+ value <=> [db_presenter, 'selected_db.port']
29
+ enabled <= [db_presenter, 'selected_db.connected', on_read: :!]
23
30
  }
24
31
 
25
32
  entry {
26
33
  label 'Database Name:'
27
- text <=> [db, :dbname]
28
- enabled <= [db, :connected, on_read: :!]
34
+ text <=> [db_presenter, 'selected_db.dbname']
35
+ enabled <= [db_presenter, 'selected_db.connected', on_read: :!]
29
36
  }
30
37
 
31
38
  entry {
32
39
  label 'Username:'
33
- text <=> [db, :username]
34
- enabled <= [db, :connected, on_read: :!]
40
+ text <=> [db_presenter, 'selected_db.username']
41
+ enabled <= [db_presenter, 'selected_db.connected', on_read: :!]
35
42
  }
36
43
 
37
44
  password_entry {
38
45
  label 'Password:'
39
- text <=> [db, :password]
40
- enabled <= [db, :connected, on_read: :!]
46
+ text <=> [db_presenter, 'selected_db.password']
47
+ enabled <= [db_presenter, 'selected_db.connected', on_read: :!]
48
+ }
49
+
50
+ horizontal_box {
51
+ entry {
52
+ text <=> [db_presenter, 'selected_db.name']
53
+ enabled <= [db_presenter, 'selected_db.connected', on_read: :!]
54
+ }
55
+ button {
56
+ stretchy false
57
+ text 'Save'
58
+ enabled <= [db_presenter, 'selected_db.saveable']
59
+
60
+ on_clicked do
61
+ db_presenter.save
62
+ end
63
+ }
64
+ button {
65
+ stretchy false
66
+ text 'Delete'
67
+ enabled <= [db_presenter, 'selected_db.deleteable']
68
+
69
+ on_clicked do
70
+ db_presenter.delete
71
+ end
72
+ }
73
+ button {
74
+ stretchy false
75
+ text 'New'
76
+ enabled <= [db_presenter, 'newable']
77
+
78
+ on_clicked do
79
+ db_presenter.new
80
+ end
81
+ }
41
82
  }
42
83
  }
43
84
 
44
85
  button {
45
86
  stretchy false
46
- text <= [db, :connected, on_read: -> (connected) { connected ? 'Disconnect (currently connected)' : 'Connect (currently disconnected)' }]
87
+ text <= [db_presenter, 'selected_db.connected', on_read: -> (connected) { connected ? 'Disconnect (currently connected)' : 'Connect (currently disconnected)' }]
47
88
 
48
89
  on_clicked do
49
- db.toggle_connection
90
+ db_presenter.selected_db.toggle_connection
50
91
  end
51
92
  }
52
93
  }
@@ -1,4 +1,4 @@
1
- require 'db_gui/model/db'
1
+ require 'db_gui/presenter/db_presenter'
2
2
 
3
3
  require 'db_gui/view/db_gui_menu_bar'
4
4
  require 'db_gui/view/db_config_form'
@@ -10,11 +10,11 @@ class DbGui
10
10
  class DbGuiApplication
11
11
  include Glimmer::LibUI::Application
12
12
 
13
- attr_reader :db
13
+ attr_reader :db_presenter
14
14
 
15
15
  before_body do
16
- @db = Model::Db.new
17
- db_gui_menu_bar(db:)
16
+ @db_presenter = Presenter::DbPresenter.new
17
+ db_gui_menu_bar(db_presenter:)
18
18
  end
19
19
 
20
20
  body {
@@ -25,13 +25,13 @@ class DbGui
25
25
  margined true
26
26
 
27
27
  vertical_box {
28
- db_config_form(db:) {
28
+ db_config_form(db_presenter:) {
29
29
  stretchy false
30
30
  }
31
31
 
32
- db_command_form(db:)
32
+ db_command_form(db_presenter:)
33
33
 
34
- db_command_result_table(db:)
34
+ db_command_result_table(db_presenter:)
35
35
  }
36
36
  }
37
37
  }
@@ -3,47 +3,75 @@ class DbGui
3
3
  class DbGuiMenuBar
4
4
  include Glimmer::LibUI::CustomControl
5
5
 
6
- option :db
6
+ option :db_presenter
7
7
 
8
8
  body {
9
9
  menu('Query') {
10
10
  menu_item('Run') {
11
11
  on_clicked do
12
- db.run_db_command
12
+ db_presenter.selected_db.run_db_command
13
13
  end
14
14
  }
15
15
  }
16
16
 
17
17
  menu('Edit') {
18
18
  menu_item('Copy Table') {
19
- enabled <= [db, :db_command_result_rows, computed_by: :db_command_result, on_read: -> (data) { !data.empty? }]
19
+ enabled <= [db_presenter, 'selected_db.db_command_result_rows', computed_by: 'selected_db.db_command_result', on_read: -> (data) { !data.empty? }]
20
20
 
21
21
  on_clicked do
22
- db.copy_table
22
+ begin
23
+ db_presenter.selected_db.copy_table
24
+ rescue => e
25
+ puts "Encountered an error copying table: #{e.full_message}"
26
+ end
23
27
  end
24
28
  }
25
29
 
26
30
  menu_item('Copy Table (with headers)') {
27
- enabled <= [db, :db_command_result_rows, computed_by: :db_command_result, on_read: -> (data) { !data.empty? }]
31
+ enabled <= [db_presenter, 'selected_db.db_command_result_rows', computed_by: 'selected_db.db_command_result', on_read: -> (data) { !data.empty? }]
32
+
33
+ on_clicked do
34
+ begin
35
+ db_presenter.selected_db.copy_table_with_headers
36
+ rescue => e
37
+ puts "Encountered an error copying table (with headers): #{e.full_message}"
38
+ end
39
+ end
40
+ }
41
+
42
+ menu_item('Copy Table (with query & headers)') {
43
+ enabled <= [db_presenter, 'selected_db.db_command_result_rows', computed_by: 'selected_db.db_command_result', on_read: -> (data) { !data.empty? }]
28
44
 
29
45
  on_clicked do
30
- db.copy_table_with_headers
46
+ begin
47
+ db_presenter.selected_db.copy_table_with_query_and_headers
48
+ rescue => e
49
+ puts "Encountered an error copying table (with query & headers): #{e.full_message}"
50
+ end
31
51
  end
32
52
  }
33
53
 
34
54
  menu_item('Copy Selected Row') {
35
- enabled <= [db, :db_command_result_rows, computed_by: :db_command_result, on_read: -> (data) { !data.empty? }]
55
+ enabled <= [db_presenter, 'selected_db.db_command_result_rows', computed_by: 'selected_db.db_command_result', on_read: -> (data) { !data.empty? }]
36
56
 
37
57
  on_clicked do
38
- db.copy_selected_row
58
+ begin
59
+ db_presenter.selected_db.copy_selected_row
60
+ rescue => e
61
+ puts "Encountered an error copying selected row: #{e.full_message}"
62
+ end
39
63
  end
40
64
  }
41
65
 
42
66
  menu_item('Copy Selected Row (with headers)') {
43
- enabled <= [db, :db_command_result_rows, computed_by: :db_command_result, on_read: -> (data) { !data.empty? }]
67
+ enabled <= [db_presenter, 'selected_db.db_command_result_rows', computed_by: 'selected_db.db_command_result', on_read: -> (data) { !data.empty? }]
44
68
 
45
69
  on_clicked do
46
- db.copy_selected_row_with_headers
70
+ begin
71
+ db_presenter.selected_db.copy_selected_row_with_headers
72
+ rescue => e
73
+ puts "Encountered an error copying selected row (with headers): #{e.full_message}"
74
+ end
47
75
  end
48
76
  }
49
77
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: db-gui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Maleh
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.12.7
18
+ version: 0.13.1
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: 0.12.7
25
+ version: 0.13.1
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: clipboard
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -100,6 +100,7 @@ files:
100
100
  - app/db-gui.rb
101
101
  - app/db_gui/launch.rb
102
102
  - app/db_gui/model/db.rb
103
+ - app/db_gui/presenter/db_presenter.rb
103
104
  - app/db_gui/view/db_command_form.rb
104
105
  - app/db_gui/view/db_command_result_table.rb
105
106
  - app/db_gui/view/db_config_form.rb