lazyrails-tui 0.1.2 → 0.2.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: 4ed79bb23e4ce7770dce3149046165a4c42938f8f5d1d3cbbc9b9232ca8d2e47
4
- data.tar.gz: cf45f4fd01fe7ad2112752618419f8bb13e92bb8c52688c8afc7b36757529255
3
+ metadata.gz: 15f9781893fa5d9ccd84a85d88f3204c2bfb3593cd2ec5169dea14b5ebdf5901
4
+ data.tar.gz: '0658498a1425bbcd2135be3d9c29aec4101ff900c8998bc797962985b292f37f'
5
5
  SHA512:
6
- metadata.gz: c49ef390414997a41c1cb011dc429d8d30604be747716531a3625975416b5046bc01b45726b29c04c7543e629d20feb18168b12a02d208f5801e32dcfa5893c3
7
- data.tar.gz: 8707e7f02c11bf636c67c173c246dca40d80753b5ad740ee2c0cec28e5d7d82d6545a2b1cff972e234aa6ffb08f7ed67054d1ccdbf694271a6288c6fda3b112f
6
+ metadata.gz: b2e651987bb7be6eda53e531b86c4a417c08919cacfbb51eb456b99299cb4fc354ab878b643ab3de36d9fde28941ba22bdb9d6eaca3e07646667eb3ba9196fc9
7
+ data.tar.gz: f3bc7782b311f84a6363d05afc4adf07e29d5723cefd0a11d52bea669cfcb9f5f5628034b2d6cb6897404f9efdc562fa106a7c797ce0b1b2bdb77db06454b58c
data/lib/lazyrails/app.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  module LazyRails
4
4
  # Custom messages for async operations
5
- TestFinishedMsg = Data.define(:path, :status, :output, :command_entry) do
5
+ TestFinishedEvent = Data.define(:path, :status, :output, :command_entry) do
6
6
  def initialize(command_entry: nil, **kwargs)
7
7
  super
8
8
  end
@@ -128,29 +128,29 @@ module LazyRails
128
128
  end
129
129
 
130
130
  def update(msg)
131
- return handle_welcome(msg) if @welcome.visible? && msg.is_a?(Chamomile::KeyMsg)
132
- return handle_help_key(msg) if @help.visible? && msg.is_a?(Chamomile::KeyMsg)
133
- return handle_generator_wizard(msg) if @generator_wizard.visible? && msg.is_a?(Chamomile::KeyMsg)
131
+ return handle_welcome(msg) if @welcome.visible? && msg.is_a?(Chamomile::KeyEvent)
132
+ return handle_help_key(msg) if @help.visible? && msg.is_a?(Chamomile::KeyEvent)
133
+ return handle_generator_wizard(msg) if @generator_wizard.visible? && msg.is_a?(Chamomile::KeyEvent)
134
134
  return handle_confirmation(msg) if @confirmation
135
135
  return handle_input_mode(msg) if @input_mode.active?
136
136
 
137
137
  case msg
138
- when Chamomile::WindowSizeMsg then handle_resize(msg)
139
- when Chamomile::KeyMsg then return handle_key(msg)
140
- when Chamomile::TickMsg then return handle_tick
141
- when Chamomile::InterruptMsg then return shutdown
142
- when IntrospectLoadedMsg then return handle_introspect_loaded(msg)
143
- when GemsLoadedMsg then handle_gems_loaded(msg)
144
- when TestsLoadedMsg then handle_tests_loaded(msg)
145
- when CommandFinishedMsg then return handle_command_finished(msg)
146
- when TestFinishedMsg then handle_test_finished(msg)
147
- when TableRowsLoadedMsg then handle_table_rows_loaded(msg)
148
- when EvalFinishedMsg then handle_eval_finished(msg)
149
- when CredentialsLoadedMsg then handle_credentials_loaded(msg)
150
- when MailersLoadedMsg then handle_mailers_loaded(msg)
151
- when MailerPreviewLoadedMsg then handle_mailer_preview_loaded(msg)
152
- when JobsLoadedMsg then handle_jobs_loaded(msg)
153
- when JobActionMsg then return handle_job_action(msg)
138
+ when Chamomile::ResizeEvent then handle_resize(msg)
139
+ when Chamomile::KeyEvent then return handle_key(msg)
140
+ when Chamomile::TickEvent then return handle_tick
141
+ when Chamomile::InterruptEvent then return shutdown
142
+ when IntrospectLoadedEvent then return handle_introspect_loaded(msg)
143
+ when GemsLoadedEvent then handle_gems_loaded(msg)
144
+ when TestsLoadedEvent then handle_tests_loaded(msg)
145
+ when CommandFinishedEvent then return handle_command_finished(msg)
146
+ when TestFinishedEvent then handle_test_finished(msg)
147
+ when TableRowsLoadedEvent then handle_table_rows_loaded(msg)
148
+ when EvalFinishedEvent then handle_eval_finished(msg)
149
+ when CredentialsLoadedEvent then handle_credentials_loaded(msg)
150
+ when MailersLoadedEvent then handle_mailers_loaded(msg)
151
+ when MailerPreviewLoadedEvent then handle_mailer_preview_loaded(msg)
152
+ when JobsLoadedEvent then handle_jobs_loaded(msg)
153
+ when JobActionEvent then return handle_job_action(msg)
154
154
  end
155
155
 
156
156
  nil
@@ -163,7 +163,7 @@ module LazyRails
163
163
  left_content = render_left_panels(left_width)
164
164
  right_content = render_right_pane(right_width)
165
165
 
166
- layout = Flourish.join_horizontal(Flourish::TOP, left_content, " ", right_content)
166
+ layout = Flourish.horizontal([left_content, " ", right_content], align: :top)
167
167
 
168
168
  base = if @input_mode.active?
169
169
  "#{layout}\n#{render_filter_bar}"
@@ -448,7 +448,7 @@ module LazyRails
448
448
  end
449
449
 
450
450
  def handle_input_mode(msg)
451
- return nil unless msg.is_a?(Chamomile::KeyMsg)
451
+ return nil unless msg.is_a?(Chamomile::KeyEvent)
452
452
 
453
453
  signal = @input_mode.handle_key(msg)
454
454
 
@@ -482,7 +482,7 @@ module LazyRails
482
482
  end
483
483
 
484
484
  def handle_confirmation(msg)
485
- return nil unless msg.is_a?(Chamomile::KeyMsg)
485
+ return nil unless msg.is_a?(Chamomile::KeyEvent)
486
486
 
487
487
  @confirmation.handle_key(msg.key)
488
488
 
@@ -12,12 +12,12 @@ module LazyRails
12
12
 
13
13
  if result.success?
14
14
  data = Introspect.load(result.stdout)
15
- IntrospectLoadedMsg.new(data: data, error: nil)
15
+ IntrospectLoadedEvent.new(data: data, error: nil)
16
16
  else
17
- IntrospectLoadedMsg.new(data: nil, error: result.stderr)
17
+ IntrospectLoadedEvent.new(data: nil, error: result.stderr)
18
18
  end
19
19
  rescue StandardError => e
20
- IntrospectLoadedMsg.new(data: nil, error: e.message)
20
+ IntrospectLoadedEvent.new(data: nil, error: e.message)
21
21
  end)
22
22
  end
23
23
 
@@ -26,9 +26,9 @@ module LazyRails
26
26
  cmd(lambda do
27
27
  lockfile = File.join(project_dir, "Gemfile.lock")
28
28
  gems = Parsers::GemfileLock.parse(lockfile)
29
- GemsLoadedMsg.new(gems: gems, error: nil)
29
+ GemsLoadedEvent.new(gems: gems, error: nil)
30
30
  rescue StandardError => e
31
- GemsLoadedMsg.new(gems: [], error: e.message)
31
+ GemsLoadedEvent.new(gems: [], error: e.message)
32
32
  end)
33
33
  end
34
34
 
@@ -51,9 +51,9 @@ module LazyRails
51
51
  end
52
52
  end
53
53
 
54
- TestsLoadedMsg.new(files: files, error: nil)
54
+ TestsLoadedEvent.new(files: files, error: nil)
55
55
  rescue StandardError => e
56
- TestsLoadedMsg.new(files: [], error: e.message)
56
+ TestsLoadedEvent.new(files: [], error: e.message)
57
57
  end)
58
58
  end
59
59
 
@@ -63,7 +63,7 @@ module LazyRails
63
63
  project_dir = @project.dir
64
64
  cmd(lambda {
65
65
  result = CommandRunner.run(command, dir: project_dir)
66
- CommandFinishedMsg.new(entry: result, panel: panel_type)
66
+ CommandFinishedEvent.new(entry: result, panel: panel_type)
67
67
  })
68
68
  end
69
69
 
@@ -76,7 +76,7 @@ module LazyRails
76
76
  cmd(lambda {
77
77
  result = CommandRunner.run(test_cmd, dir: project_dir)
78
78
  status = result.success? ? :passed : :failed
79
- TestFinishedMsg.new(path: path, status: status, output: result.stdout + result.stderr, command_entry: result)
79
+ TestFinishedEvent.new(path: path, status: status, output: result.stdout + result.stderr, command_entry: result)
80
80
  })
81
81
  end
82
82
 
@@ -91,16 +91,16 @@ module LazyRails
91
91
  if result.success?
92
92
  data = JSON.parse(result.stdout, symbolize_names: false)
93
93
  if data["error"]
94
- TableRowsLoadedMsg.new(table: table_name, columns: [], rows: [], total: 0, error: data["error"])
94
+ TableRowsLoadedEvent.new(table: table_name, columns: [], rows: [], total: 0, error: data["error"])
95
95
  else
96
- TableRowsLoadedMsg.new(table: table_name, columns: data["columns"], rows: data["rows"],
96
+ TableRowsLoadedEvent.new(table: table_name, columns: data["columns"], rows: data["rows"],
97
97
  total: data["total"] || 0, error: nil)
98
98
  end
99
99
  else
100
- TableRowsLoadedMsg.new(table: table_name, columns: [], rows: [], total: 0, error: result.stderr)
100
+ TableRowsLoadedEvent.new(table: table_name, columns: [], rows: [], total: 0, error: result.stderr)
101
101
  end
102
102
  rescue StandardError => e
103
- TableRowsLoadedMsg.new(table: table_name, columns: [], rows: [], total: 0, error: e.message)
103
+ TableRowsLoadedEvent.new(table: table_name, columns: [], rows: [], total: 0, error: e.message)
104
104
  end)
105
105
  end
106
106
 
@@ -118,10 +118,10 @@ module LazyRails
118
118
  error: result.success? ? nil : result.stderr.strip,
119
119
  duration_ms: result.duration_ms
120
120
  )
121
- EvalFinishedMsg.new(entry: entry, command_entry: result)
121
+ EvalFinishedEvent.new(entry: entry, command_entry: result)
122
122
  rescue StandardError => e
123
123
  entry = EvalEntry.new(expression: expression, result: nil, error: e.message, duration_ms: 0)
124
- EvalFinishedMsg.new(entry: entry)
124
+ EvalFinishedEvent.new(entry: entry)
125
125
  end)
126
126
  end
127
127
 
@@ -132,13 +132,13 @@ module LazyRails
132
132
  args = ["bin/rails", "credentials:show"]
133
133
  args += ["--environment", env] unless env == "development"
134
134
  result = CommandRunner.run(args, dir: project_dir)
135
- CredentialsLoadedMsg.new(
135
+ CredentialsLoadedEvent.new(
136
136
  environment: credential_file.environment,
137
137
  content: result.success? ? result.stdout : nil,
138
138
  error: result.success? ? nil : result.stderr
139
139
  )
140
140
  rescue StandardError => e
141
- CredentialsLoadedMsg.new(environment: credential_file.environment, content: nil, error: e.message)
141
+ CredentialsLoadedEvent.new(environment: credential_file.environment, content: nil, error: e.message)
142
142
  end)
143
143
  end
144
144
 
@@ -167,9 +167,9 @@ module LazyRails
167
167
  end
168
168
  end
169
169
 
170
- MailersLoadedMsg.new(previews: previews, error: nil)
170
+ MailersLoadedEvent.new(previews: previews, error: nil)
171
171
  rescue StandardError => e
172
- MailersLoadedMsg.new(previews: [], error: e.message)
172
+ MailersLoadedEvent.new(previews: [], error: e.message)
173
173
  end)
174
174
  end
175
175
 
@@ -187,13 +187,13 @@ module LazyRails
187
187
  result = CommandRunner.run(["bin/rails", "runner", script], dir: project_dir)
188
188
  if result.success?
189
189
  data = JSON.parse(result.stdout, symbolize_names: true)
190
- MailerPreviewLoadedMsg.new(preview: preview, error: nil, **data)
190
+ MailerPreviewLoadedEvent.new(preview: preview, error: nil, **data)
191
191
  else
192
- MailerPreviewLoadedMsg.new(preview: preview, subject: nil, to: nil,
192
+ MailerPreviewLoadedEvent.new(preview: preview, subject: nil, to: nil,
193
193
  from: nil, body: nil, error: result.stderr)
194
194
  end
195
195
  rescue StandardError => e
196
- MailerPreviewLoadedMsg.new(preview: preview, subject: nil, to: nil,
196
+ MailerPreviewLoadedEvent.new(preview: preview, subject: nil, to: nil,
197
197
  from: nil, body: nil, error: e.message)
198
198
  end)
199
199
  end
@@ -211,16 +211,16 @@ module LazyRails
211
211
 
212
212
  if result.success?
213
213
  data = JSON.parse(result.stdout, symbolize_names: false)
214
- return JobsLoadedMsg.new(available: false, jobs: [], counts: {}, error: nil) if data["available"] == false
214
+ return JobsLoadedEvent.new(available: false, jobs: [], counts: {}, error: nil) if data["available"] == false
215
215
 
216
216
  counts = (data["counts"] || {}).transform_keys(&:to_sym)
217
217
  jobs = (data["jobs"] || []).map { |j| parse_job_entry(j) }
218
- JobsLoadedMsg.new(available: true, jobs: jobs, counts: counts, error: nil)
218
+ JobsLoadedEvent.new(available: true, jobs: jobs, counts: counts, error: nil)
219
219
  else
220
- JobsLoadedMsg.new(available: true, jobs: [], counts: {}, error: result.stderr)
220
+ JobsLoadedEvent.new(available: true, jobs: [], counts: {}, error: result.stderr)
221
221
  end
222
222
  rescue StandardError => e
223
- JobsLoadedMsg.new(available: true, jobs: [], counts: {}, error: e.message)
223
+ JobsLoadedEvent.new(available: true, jobs: [], counts: {}, error: e.message)
224
224
  end)
225
225
  end
226
226
 
@@ -245,12 +245,12 @@ module LazyRails
245
245
  )
246
246
  if result.success?
247
247
  data = JSON.parse(result.stdout, symbolize_names: false)
248
- JobActionMsg.new(action: "retry_all", job_id: nil, success: data["success"], error: data["error"])
248
+ JobActionEvent.new(action: "retry_all", job_id: nil, success: data["success"], error: data["error"])
249
249
  else
250
- JobActionMsg.new(action: "retry_all", job_id: nil, success: false, error: result.stderr)
250
+ JobActionEvent.new(action: "retry_all", job_id: nil, success: false, error: result.stderr)
251
251
  end
252
252
  rescue StandardError => e
253
- JobActionMsg.new(action: "retry_all", job_id: nil, success: false, error: e.message)
253
+ JobActionEvent.new(action: "retry_all", job_id: nil, success: false, error: e.message)
254
254
  end)
255
255
  end
256
256
 
@@ -269,12 +269,12 @@ module LazyRails
269
269
  result = CommandRunner.run(["bin/rails", "runner", script, action, id.to_s], dir: project_dir)
270
270
  if result.success?
271
271
  data = JSON.parse(result.stdout, symbolize_names: false)
272
- JobActionMsg.new(action: action, job_id: id, success: data["success"], error: data["error"])
272
+ JobActionEvent.new(action: action, job_id: id, success: data["success"], error: data["error"])
273
273
  else
274
- JobActionMsg.new(action: action, job_id: id, success: false, error: result.stderr)
274
+ JobActionEvent.new(action: action, job_id: id, success: false, error: result.stderr)
275
275
  end
276
276
  rescue StandardError => e
277
- JobActionMsg.new(action: action, job_id: id, success: false, error: e.message)
277
+ JobActionEvent.new(action: action, job_id: id, success: false, error: e.message)
278
278
  end)
279
279
  end
280
280
 
@@ -31,7 +31,7 @@ module LazyRails
31
31
  when :escape then :cancelled
32
32
  when :enter then { action: :submitted, value: @input.value, purpose: @purpose }
33
33
  else
34
- @input.update(msg)
34
+ @input.handle(msg)
35
35
  @purpose == :filter ? { action: :changed, value: @input.value } : nil
36
36
  end
37
37
  end
@@ -205,8 +205,8 @@ module LazyRails
205
205
  @width = msg.width
206
206
  @height = msg.height
207
207
  right_width = @width - (@width * App::LEFT_WIDTH_RATIO).to_i - 1
208
- @detail_viewport.set_width(right_width - 4)
209
- @detail_viewport.set_height(@height - 4)
208
+ @detail_viewport.width = right_width - 4
209
+ @detail_viewport.height = @height - 4
210
210
  update_detail_content
211
211
  end
212
212
  end
@@ -44,7 +44,7 @@ module LazyRails
44
44
  sections << output
45
45
  end
46
46
 
47
- Flourish.join_vertical(Flourish::LEFT, *sections)
47
+ Flourish.vertical(sections, align: :left)
48
48
  end
49
49
 
50
50
  def panel_cache_key(panel, focused, width, height)
@@ -110,9 +110,9 @@ module LazyRails
110
110
  end
111
111
 
112
112
  def render_right_pane(width)
113
- @detail_viewport.set_width(width - 4)
114
- @detail_viewport.set_height(@height - 4)
115
- @detail_viewport.set_content(@detail_content)
113
+ @detail_viewport.width = width - 4
114
+ @detail_viewport.height = @height - 4
115
+ @detail_viewport.content = @detail_content
116
116
 
117
117
  content = @detail_viewport.view
118
118
  border_color = UNFOCUSED_COLOR
@@ -150,20 +150,33 @@ module LazyRails
150
150
  end
151
151
  end
152
152
 
153
- # Messages for async data loading
154
- IntrospectLoadedMsg = Data.define(:data, :error)
155
- GemsLoadedMsg = Data.define(:gems, :error)
156
- TestsLoadedMsg = Data.define(:files, :error)
157
- CommandFinishedMsg = Data.define(:entry, :panel)
158
- TableRowsLoadedMsg = Data.define(:table, :columns, :rows, :total, :error)
159
- EvalFinishedMsg = Data.define(:entry, :command_entry) do
153
+ # Events for async data loading
154
+ IntrospectLoadedEvent = Data.define(:data, :error)
155
+ GemsLoadedEvent = Data.define(:gems, :error)
156
+ TestsLoadedEvent = Data.define(:files, :error)
157
+ CommandFinishedEvent = Data.define(:entry, :panel)
158
+ TableRowsLoadedEvent = Data.define(:table, :columns, :rows, :total, :error)
159
+ EvalFinishedEvent = Data.define(:entry, :command_entry) do
160
160
  def initialize(command_entry: nil, **kwargs)
161
161
  super
162
162
  end
163
163
  end
164
- CredentialsLoadedMsg = Data.define(:environment, :content, :error)
165
- MailersLoadedMsg = Data.define(:previews, :error)
166
- MailerPreviewLoadedMsg = Data.define(:preview, :subject, :to, :from, :body, :error)
167
- JobsLoadedMsg = Data.define(:available, :jobs, :counts, :error)
168
- JobActionMsg = Data.define(:action, :job_id, :success, :error)
164
+ CredentialsLoadedEvent = Data.define(:environment, :content, :error)
165
+ MailersLoadedEvent = Data.define(:previews, :error)
166
+ MailerPreviewLoadedEvent = Data.define(:preview, :subject, :to, :from, :body, :error)
167
+ JobsLoadedEvent = Data.define(:available, :jobs, :counts, :error)
168
+ JobActionEvent = Data.define(:action, :job_id, :success, :error)
169
+
170
+ # Backward compat aliases
171
+ IntrospectLoadedMsg = IntrospectLoadedEvent
172
+ GemsLoadedMsg = GemsLoadedEvent
173
+ TestsLoadedMsg = TestsLoadedEvent
174
+ CommandFinishedMsg = CommandFinishedEvent
175
+ TableRowsLoadedMsg = TableRowsLoadedEvent
176
+ EvalFinishedMsg = EvalFinishedEvent
177
+ CredentialsLoadedMsg = CredentialsLoadedEvent
178
+ MailersLoadedMsg = MailersLoadedEvent
179
+ MailerPreviewLoadedMsg = MailerPreviewLoadedEvent
180
+ JobsLoadedMsg = JobsLoadedEvent
181
+ JobActionMsg = JobActionEvent
169
182
  end
@@ -67,15 +67,13 @@ module LazyRails
67
67
  @error = nil
68
68
  @total_rows = total
69
69
 
70
- table_columns = columns.map do |col|
71
- Petals::Table::Column.new(title: col, width: column_width(col, columns.size))
72
- end
73
-
74
70
  table_rows = rows.map do |row|
75
71
  row.map { |v| v.nil? ? "NULL" : v.to_s }
76
72
  end
77
73
 
78
- @table_widget = Petals::Table.new(columns: table_columns, rows: table_rows)
74
+ @table_widget = Petals::Table.new(rows: table_rows) do |t|
75
+ columns.each { |col| t.column col, width: column_width(col, columns.size) }
76
+ end
79
77
  end
80
78
 
81
79
  def current_query_params
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LazyRails
4
- VERSION = "0.1.2"
4
+ VERSION = "0.2.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lazyrails-tui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jack Killilea
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-10 00:00:00.000000000 Z
11
+ date: 2026-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chamomile
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.1'
19
+ version: '0.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.1'
26
+ version: '0.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: chamomile-flourish
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.1'
33
+ version: '0.2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.1'
40
+ version: '0.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: chamomile-petals
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.1'
47
+ version: '0.2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.1'
54
+ version: '0.2'
55
55
  description: LazyRails gives Rails developers a fast, navigable TUI that surfaces
56
56
  everything the Rails CLI offers in a single split-pane interface.
57
57
  email: