tng 0.3.0 → 0.3.4
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 +4 -4
- data/Rakefile +38 -41
- data/bin/tng +264 -558
- data/binaries/go-ui-darwin-amd64 +0 -0
- data/binaries/go-ui-darwin-arm64 +0 -0
- data/binaries/go-ui-linux-amd64 +0 -0
- data/binaries/go-ui-linux-arm64 +0 -0
- data/binaries/tng-darwin-arm64.bundle +0 -0
- data/binaries/tng-linux-arm64.so +0 -0
- data/binaries/tng-linux-x86_64.so +0 -0
- data/lib/tng/analyzers/model.rb +2 -1
- data/lib/tng/analyzers/other.rb +4 -2
- data/lib/tng/analyzers/service.rb +2 -1
- data/lib/tng/api/http_client.rb +19 -0
- data/lib/tng/services/test_generator.rb +114 -81
- data/lib/tng/services/testng.rb +2 -8
- data/lib/tng/ui/go_ui_session.rb +406 -0
- data/lib/tng/utils.rb +3 -30
- data/lib/tng/version.rb +1 -1
- data/lib/tng.rb +24 -11
- data/tng.gemspec +4 -9
- metadata +29 -103
- data/binaries/tng.bundle +0 -0
- data/binaries/tng.so +0 -0
- data/lib/tng/ui/about_display.rb +0 -66
- data/lib/tng/ui/authentication_warning_display.rb +0 -122
- data/lib/tng/ui/configuration_display.rb +0 -52
- data/lib/tng/ui/controller_test_flow_display.rb +0 -79
- data/lib/tng/ui/display_banner.rb +0 -44
- data/lib/tng/ui/goodbye_display.rb +0 -41
- data/lib/tng/ui/model_test_flow_display.rb +0 -80
- data/lib/tng/ui/other_test_flow_display.rb +0 -78
- data/lib/tng/ui/service_test_flow_display.rb +0 -78
- data/lib/tng/ui/show_help.rb +0 -78
- data/lib/tng/ui/system_status_display.rb +0 -128
- data/lib/tng/ui/user_stats_display.rb +0 -160
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tng
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- ralucab
|
|
@@ -9,6 +9,26 @@ bindir: bin
|
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: activesupport
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '6.0'
|
|
19
|
+
- - "<"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '9.0'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
requirements:
|
|
26
|
+
- - ">="
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: '6.0'
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '9.0'
|
|
12
32
|
- !ruby/object:Gem::Dependency
|
|
13
33
|
name: httpx
|
|
14
34
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -93,20 +113,6 @@ dependencies:
|
|
|
93
113
|
- - "~>"
|
|
94
114
|
- !ruby/object:Gem::Version
|
|
95
115
|
version: '0.7'
|
|
96
|
-
- !ruby/object:Gem::Dependency
|
|
97
|
-
name: tty-file
|
|
98
|
-
requirement: !ruby/object:Gem::Requirement
|
|
99
|
-
requirements:
|
|
100
|
-
- - "~>"
|
|
101
|
-
- !ruby/object:Gem::Version
|
|
102
|
-
version: '0.10'
|
|
103
|
-
type: :runtime
|
|
104
|
-
prerelease: false
|
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
-
requirements:
|
|
107
|
-
- - "~>"
|
|
108
|
-
- !ruby/object:Gem::Version
|
|
109
|
-
version: '0.10'
|
|
110
116
|
- !ruby/object:Gem::Dependency
|
|
111
117
|
name: tty-option
|
|
112
118
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -121,48 +127,6 @@ dependencies:
|
|
|
121
127
|
- - "~>"
|
|
122
128
|
- !ruby/object:Gem::Version
|
|
123
129
|
version: '0.3'
|
|
124
|
-
- !ruby/object:Gem::Dependency
|
|
125
|
-
name: tty-progressbar
|
|
126
|
-
requirement: !ruby/object:Gem::Requirement
|
|
127
|
-
requirements:
|
|
128
|
-
- - "~>"
|
|
129
|
-
- !ruby/object:Gem::Version
|
|
130
|
-
version: 0.18.3
|
|
131
|
-
type: :runtime
|
|
132
|
-
prerelease: false
|
|
133
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
134
|
-
requirements:
|
|
135
|
-
- - "~>"
|
|
136
|
-
- !ruby/object:Gem::Version
|
|
137
|
-
version: 0.18.3
|
|
138
|
-
- !ruby/object:Gem::Dependency
|
|
139
|
-
name: tty-prompt
|
|
140
|
-
requirement: !ruby/object:Gem::Requirement
|
|
141
|
-
requirements:
|
|
142
|
-
- - "~>"
|
|
143
|
-
- !ruby/object:Gem::Version
|
|
144
|
-
version: '0.23'
|
|
145
|
-
type: :runtime
|
|
146
|
-
prerelease: false
|
|
147
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
148
|
-
requirements:
|
|
149
|
-
- - "~>"
|
|
150
|
-
- !ruby/object:Gem::Version
|
|
151
|
-
version: '0.23'
|
|
152
|
-
- !ruby/object:Gem::Dependency
|
|
153
|
-
name: tty-reader
|
|
154
|
-
requirement: !ruby/object:Gem::Requirement
|
|
155
|
-
requirements:
|
|
156
|
-
- - "~>"
|
|
157
|
-
- !ruby/object:Gem::Version
|
|
158
|
-
version: '0.9'
|
|
159
|
-
type: :runtime
|
|
160
|
-
prerelease: false
|
|
161
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
162
|
-
requirements:
|
|
163
|
-
- - "~>"
|
|
164
|
-
- !ruby/object:Gem::Version
|
|
165
|
-
version: '0.9'
|
|
166
130
|
- !ruby/object:Gem::Dependency
|
|
167
131
|
name: tty-screen
|
|
168
132
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -177,34 +141,6 @@ dependencies:
|
|
|
177
141
|
- - "~>"
|
|
178
142
|
- !ruby/object:Gem::Version
|
|
179
143
|
version: '0.8'
|
|
180
|
-
- !ruby/object:Gem::Dependency
|
|
181
|
-
name: tty-spinner
|
|
182
|
-
requirement: !ruby/object:Gem::Requirement
|
|
183
|
-
requirements:
|
|
184
|
-
- - "~>"
|
|
185
|
-
- !ruby/object:Gem::Version
|
|
186
|
-
version: 0.9.3
|
|
187
|
-
type: :runtime
|
|
188
|
-
prerelease: false
|
|
189
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
190
|
-
requirements:
|
|
191
|
-
- - "~>"
|
|
192
|
-
- !ruby/object:Gem::Version
|
|
193
|
-
version: 0.9.3
|
|
194
|
-
- !ruby/object:Gem::Dependency
|
|
195
|
-
name: tty-table
|
|
196
|
-
requirement: !ruby/object:Gem::Requirement
|
|
197
|
-
requirements:
|
|
198
|
-
- - "~>"
|
|
199
|
-
- !ruby/object:Gem::Version
|
|
200
|
-
version: '0.12'
|
|
201
|
-
type: :runtime
|
|
202
|
-
prerelease: false
|
|
203
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
204
|
-
requirements:
|
|
205
|
-
- - "~>"
|
|
206
|
-
- !ruby/object:Gem::Version
|
|
207
|
-
version: '0.12'
|
|
208
144
|
description: TNG (Test Next Generation) is a Rails gem that automatically generates
|
|
209
145
|
comprehensive test files by analyzing your Ruby code using static analysis and AI.
|
|
210
146
|
It supports models, controllers, and services with intelligent test case generation.
|
|
@@ -226,8 +162,9 @@ files:
|
|
|
226
162
|
- binaries/go-ui-darwin-arm64
|
|
227
163
|
- binaries/go-ui-linux-amd64
|
|
228
164
|
- binaries/go-ui-linux-arm64
|
|
229
|
-
- binaries/tng.bundle
|
|
230
|
-
- binaries/tng.so
|
|
165
|
+
- binaries/tng-darwin-arm64.bundle
|
|
166
|
+
- binaries/tng-linux-arm64.so
|
|
167
|
+
- binaries/tng-linux-x86_64.so
|
|
231
168
|
- lib/generators/tng/install_generator.rb
|
|
232
169
|
- lib/tng.rb
|
|
233
170
|
- lib/tng/analyzers/controller.rb
|
|
@@ -242,20 +179,9 @@ files:
|
|
|
242
179
|
- lib/tng/services/test_generator.rb
|
|
243
180
|
- lib/tng/services/testng.rb
|
|
244
181
|
- lib/tng/services/user_app_config.rb
|
|
245
|
-
- lib/tng/ui/
|
|
246
|
-
- lib/tng/ui/authentication_warning_display.rb
|
|
247
|
-
- lib/tng/ui/configuration_display.rb
|
|
248
|
-
- lib/tng/ui/controller_test_flow_display.rb
|
|
249
|
-
- lib/tng/ui/display_banner.rb
|
|
250
|
-
- lib/tng/ui/goodbye_display.rb
|
|
251
|
-
- lib/tng/ui/model_test_flow_display.rb
|
|
252
|
-
- lib/tng/ui/other_test_flow_display.rb
|
|
182
|
+
- lib/tng/ui/go_ui_session.rb
|
|
253
183
|
- lib/tng/ui/post_install_box.rb
|
|
254
|
-
- lib/tng/ui/service_test_flow_display.rb
|
|
255
|
-
- lib/tng/ui/show_help.rb
|
|
256
|
-
- lib/tng/ui/system_status_display.rb
|
|
257
184
|
- lib/tng/ui/theme.rb
|
|
258
|
-
- lib/tng/ui/user_stats_display.rb
|
|
259
185
|
- lib/tng/utils.rb
|
|
260
186
|
- lib/tng/version.rb
|
|
261
187
|
- tng.gemspec
|
|
@@ -265,8 +191,8 @@ licenses:
|
|
|
265
191
|
metadata:
|
|
266
192
|
allowed_push_host: https://rubygems.org
|
|
267
193
|
homepage_uri: https://tng.sh/
|
|
268
|
-
source_code_uri: https://github.com/tng-sh/tng-rails
|
|
269
|
-
license_uri: https://github.com/tng-sh/tng-rails/blob/
|
|
194
|
+
source_code_uri: https://github.com/tng-sh/tng-rails-public
|
|
195
|
+
license_uri: https://github.com/tng-sh/tng-rails-public/blob/main/LICENSE.md
|
|
270
196
|
post_install_message: "┌ TNG ───────────────────────────────────────────────────────────────┐\n│
|
|
271
197
|
\ │\n│ ✅ Tng
|
|
272
198
|
installed successfully! │\n│ │\n│
|
|
@@ -291,7 +217,7 @@ post_install_message: "┌ TNG ────────────────
|
|
|
291
217
|
\ │\n│ • bundle exec
|
|
292
218
|
tng --help - Show help information │\n│ │\n│
|
|
293
219
|
\ \U0001F4A1 Generate tests for individual methods with precision │\n└────────────────────────────────────────────────────────────
|
|
294
|
-
v0.3.
|
|
220
|
+
v0.3.4 ┘\n"
|
|
295
221
|
rdoc_options: []
|
|
296
222
|
require_paths:
|
|
297
223
|
- lib
|
|
@@ -304,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
304
230
|
requirements:
|
|
305
231
|
- - ">="
|
|
306
232
|
- !ruby/object:Gem::Version
|
|
307
|
-
version: 3.
|
|
233
|
+
version: '3.0'
|
|
308
234
|
requirements: []
|
|
309
235
|
rubygems_version: 3.6.7
|
|
310
236
|
specification_version: 4
|
data/binaries/tng.bundle
DELETED
|
Binary file
|
data/binaries/tng.so
DELETED
|
Binary file
|
data/lib/tng/ui/about_display.rb
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "tty-box"
|
|
4
|
-
require "pastel"
|
|
5
|
-
require "tty-screen"
|
|
6
|
-
require_relative "theme"
|
|
7
|
-
|
|
8
|
-
class AboutDisplay
|
|
9
|
-
def initialize(pastel, prompt, version)
|
|
10
|
-
@pastel = pastel
|
|
11
|
-
@prompt = prompt
|
|
12
|
-
@version = version
|
|
13
|
-
@terminal_width = begin
|
|
14
|
-
TTY::Screen.width
|
|
15
|
-
rescue StandardError
|
|
16
|
-
80
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def display
|
|
21
|
-
about_content = [
|
|
22
|
-
"",
|
|
23
|
-
@pastel.public_send(Tng::UI::Theme.color(:secondary),
|
|
24
|
-
"Tng is an LLM-powered test generation tool for Rails applications."),
|
|
25
|
-
"",
|
|
26
|
-
@pastel.public_send(Tng::UI::Theme.color(:accent), "Features:"),
|
|
27
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
28
|
-
"#{Tng::UI::Theme.icon(:bullet)} 20+ Rails file types supported"),
|
|
29
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
30
|
-
"#{Tng::UI::Theme.icon(:bullet)} Core: Controllers, Models, Services"),
|
|
31
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
32
|
-
"#{Tng::UI::Theme.icon(:bullet)} Extended: Jobs, Helpers, Lib, Policies, Presenters, Mailers, GraphQL + more"),
|
|
33
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted), "#{Tng::UI::Theme.icon(:bullet)} LLM-powered test suggestions"),
|
|
34
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted), "#{Tng::UI::Theme.icon(:bullet)} Test coverage analysis"),
|
|
35
|
-
"",
|
|
36
|
-
@pastel.public_send(Tng::UI::Theme.color(:accent), "Technology:"),
|
|
37
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
38
|
-
"#{Tng::UI::Theme.icon(:bullet)} Static code analysis with Prism"),
|
|
39
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
40
|
-
"#{Tng::UI::Theme.icon(:bullet)} Intelligent pattern recognition"),
|
|
41
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted), "#{Tng::UI::Theme.icon(:bullet)} Rails-specific optimizations"),
|
|
42
|
-
"",
|
|
43
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted), "Version: #{@version}"),
|
|
44
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
45
|
-
"Built with #{Tng::UI::Theme.icon(:heart)} for Rails developers")
|
|
46
|
-
].join("\n")
|
|
47
|
-
|
|
48
|
-
box_width = Tng::UI::Theme.calculate_box_width(@terminal_width)
|
|
49
|
-
style = Tng::UI::Theme.box_style(:default)
|
|
50
|
-
|
|
51
|
-
about_box = TTY::Box.frame(
|
|
52
|
-
title: { top_left: " About Tng " },
|
|
53
|
-
style: style[:style],
|
|
54
|
-
padding: style[:padding],
|
|
55
|
-
width: box_width
|
|
56
|
-
) do
|
|
57
|
-
about_content
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
puts Tng::UI::Theme.center_box(about_box, box_width, @terminal_width)
|
|
61
|
-
@prompt.keypress(Tng::UI::Theme.center_text(
|
|
62
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
63
|
-
"Press any key to continue..."), @terminal_width
|
|
64
|
-
))
|
|
65
|
-
end
|
|
66
|
-
end
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "tty-box"
|
|
4
|
-
require "pastel"
|
|
5
|
-
require "tty-screen"
|
|
6
|
-
require_relative "theme"
|
|
7
|
-
|
|
8
|
-
class AuthenticationWarningDisplay
|
|
9
|
-
def initialize(pastel)
|
|
10
|
-
@pastel = pastel
|
|
11
|
-
@terminal_width = begin
|
|
12
|
-
TTY::Screen.width
|
|
13
|
-
rescue StandardError
|
|
14
|
-
80
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def display_if_missing
|
|
19
|
-
return false unless authentication_config_missing?
|
|
20
|
-
|
|
21
|
-
display_warning
|
|
22
|
-
handle_user_choice
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def display_warning
|
|
26
|
-
warning_content = [
|
|
27
|
-
@pastel.public_send(Tng::UI::Theme.color(:error)).bold("Authentication Configuration Missing"),
|
|
28
|
-
"",
|
|
29
|
-
@pastel.public_send(Tng::UI::Theme.color(:primary), "TNG needs authentication setup to generate proper tests."),
|
|
30
|
-
"",
|
|
31
|
-
@pastel.public_send(Tng::UI::Theme.color(:accent), "Missing: ") + build_missing_items_summary,
|
|
32
|
-
"",
|
|
33
|
-
@pastel.public_send(Tng::UI::Theme.color(:secondary), "Quick fix:"),
|
|
34
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
35
|
-
"#{Tng::UI::Theme.icon(:bullet)} Edit config/initializers/tng.rb"),
|
|
36
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
37
|
-
"#{Tng::UI::Theme.icon(:bullet)} Uncomment authentication_methods array"),
|
|
38
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted), "#{Tng::UI::Theme.icon(:bullet)} Add your auth method details"),
|
|
39
|
-
"",
|
|
40
|
-
@pastel.public_send(Tng::UI::Theme.color(:success), "Press Enter to continue anyway"),
|
|
41
|
-
@pastel.public_send(Tng::UI::Theme.color(:error), "Press Esc to cancel and fix configuration")
|
|
42
|
-
].join("\n")
|
|
43
|
-
|
|
44
|
-
box_width = Tng::UI::Theme.calculate_box_width(@terminal_width)
|
|
45
|
-
style = Tng::UI::Theme.box_style(:warning)
|
|
46
|
-
|
|
47
|
-
warning_box = TTY::Box.frame(
|
|
48
|
-
title: { top_left: " Auth Warning " },
|
|
49
|
-
style: style[:style],
|
|
50
|
-
padding: style[:padding],
|
|
51
|
-
width: box_width
|
|
52
|
-
) do
|
|
53
|
-
warning_content
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
puts Tng::UI::Theme.center_box(warning_box, box_width, @terminal_width)
|
|
57
|
-
puts
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
private
|
|
61
|
-
|
|
62
|
-
def handle_user_choice
|
|
63
|
-
require "io/console"
|
|
64
|
-
|
|
65
|
-
loop do
|
|
66
|
-
key = $stdin.getch
|
|
67
|
-
case key
|
|
68
|
-
when "\r", "\n" # Enter key
|
|
69
|
-
return false # Continue anyway
|
|
70
|
-
when "\e" # Escape key
|
|
71
|
-
return true # Cancel (authentication missing)
|
|
72
|
-
when "\u0003" # Ctrl+C
|
|
73
|
-
puts "\n#{@pastel.public_send(Tng::UI::Theme.color(:warning), "Operation cancelled.")}"
|
|
74
|
-
exit(0)
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
rescue StandardError
|
|
78
|
-
# Fallback if getch is not available
|
|
79
|
-
puts @pastel.public_send(Tng::UI::Theme.color(:muted), "Press Enter to continue or Ctrl+C to cancel...")
|
|
80
|
-
gets
|
|
81
|
-
false
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def build_missing_items_summary
|
|
85
|
-
issues = []
|
|
86
|
-
|
|
87
|
-
issues << "empty auth methods" if Tng.authentication_enabled && authentication_methods_empty?
|
|
88
|
-
|
|
89
|
-
issues << "invalid auth config" if !authentication_methods_empty? && !authentication_methods_valid?
|
|
90
|
-
|
|
91
|
-
issues << "auth disabled" unless Tng.authentication_enabled
|
|
92
|
-
|
|
93
|
-
issues.empty? ? "unknown issue" : issues.join(", ")
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def authentication_config_missing?
|
|
97
|
-
# Check if authentication is enabled but methods are not configured
|
|
98
|
-
return true if Tng.authentication_enabled && authentication_methods_empty?
|
|
99
|
-
|
|
100
|
-
# Check if authentication methods exist but are invalid
|
|
101
|
-
return true if !authentication_methods_empty? && !authentication_methods_valid?
|
|
102
|
-
|
|
103
|
-
false
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def authentication_methods_empty?
|
|
107
|
-
methods = Tng.authentication_methods
|
|
108
|
-
methods.nil? || methods.empty?
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def authentication_methods_valid?
|
|
112
|
-
methods = Tng.authentication_methods
|
|
113
|
-
return false if methods.nil? || methods.empty?
|
|
114
|
-
|
|
115
|
-
methods.all? do |method|
|
|
116
|
-
method.is_a?(Hash) &&
|
|
117
|
-
method.key?(:method) && !method[:method].to_s.strip.empty? &&
|
|
118
|
-
method.key?(:file_location) && !method[:file_location].to_s.strip.empty? &&
|
|
119
|
-
method.key?(:auth_type) && !method[:auth_type].to_s.strip.empty?
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
end
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "tty-box"
|
|
4
|
-
require "pastel"
|
|
5
|
-
require "tty-screen"
|
|
6
|
-
require_relative "theme"
|
|
7
|
-
|
|
8
|
-
class ConfigurationDisplay
|
|
9
|
-
def initialize(pastel)
|
|
10
|
-
@pastel = pastel
|
|
11
|
-
@terminal_width = begin
|
|
12
|
-
TTY::Screen.width
|
|
13
|
-
rescue StandardError
|
|
14
|
-
80
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def display_missing_config(missing_config)
|
|
19
|
-
config_content = [
|
|
20
|
-
@pastel.public_send(Tng::UI::Theme.color(:error)).bold("Configuration Required"),
|
|
21
|
-
"",
|
|
22
|
-
@pastel.public_send(Tng::UI::Theme.color(:accent), "Missing required configuration:"),
|
|
23
|
-
missing_config.map do |key|
|
|
24
|
-
@pastel.public_send(Tng::UI::Theme.color(:secondary), "#{Tng::UI::Theme.icon(:bullet)} #{key}")
|
|
25
|
-
end.join("\n"),
|
|
26
|
-
"",
|
|
27
|
-
@pastel.public_send(Tng::UI::Theme.color(:secondary), "Quick fix:"),
|
|
28
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
29
|
-
"#{Tng::UI::Theme.icon(:bullet)} Edit config/initializers/tng.rb"),
|
|
30
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
31
|
-
"#{Tng::UI::Theme.icon(:bullet)} Set your API key and other required values"),
|
|
32
|
-
"",
|
|
33
|
-
@pastel.public_send(Tng::UI::Theme.color(:success), "Press Enter to continue after fixing"),
|
|
34
|
-
@pastel.public_send(Tng::UI::Theme.color(:error), "Press Ctrl+C to exit")
|
|
35
|
-
].join("\n")
|
|
36
|
-
|
|
37
|
-
box_width = Tng::UI::Theme.calculate_box_width(@terminal_width)
|
|
38
|
-
style = Tng::UI::Theme.box_style(:error)
|
|
39
|
-
|
|
40
|
-
config_box = TTY::Box.frame(
|
|
41
|
-
title: { top_left: " Config Required " },
|
|
42
|
-
style: style[:style],
|
|
43
|
-
padding: style[:padding],
|
|
44
|
-
width: box_width
|
|
45
|
-
) do
|
|
46
|
-
config_content
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
puts Tng::UI::Theme.center_box(config_box, box_width, @terminal_width)
|
|
50
|
-
puts
|
|
51
|
-
end
|
|
52
|
-
end
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "tty-prompt"
|
|
4
|
-
require "tty-spinner"
|
|
5
|
-
require "pastel"
|
|
6
|
-
require "tty-screen"
|
|
7
|
-
require_relative "theme"
|
|
8
|
-
|
|
9
|
-
class ControllerTestFlowDisplay
|
|
10
|
-
def initialize(prompt, pastel)
|
|
11
|
-
@prompt = prompt
|
|
12
|
-
@pastel = pastel
|
|
13
|
-
@terminal_width = begin
|
|
14
|
-
TTY::Screen.width
|
|
15
|
-
rescue StandardError
|
|
16
|
-
80
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def select_controller(controllers)
|
|
21
|
-
header = @pastel.public_send(Tng::UI::Theme.color(:primary)).bold("#{Tng::UI::Theme.icon(:config)} Select controller to test:")
|
|
22
|
-
puts Tng::UI::Theme.center_text(header, @terminal_width)
|
|
23
|
-
|
|
24
|
-
@prompt.select(
|
|
25
|
-
"",
|
|
26
|
-
cycle: true,
|
|
27
|
-
per_page: 12,
|
|
28
|
-
filter: true,
|
|
29
|
-
symbols: { marker: Tng::UI::Theme.icon(:marker) }
|
|
30
|
-
) do |menu|
|
|
31
|
-
controllers.each do |controller|
|
|
32
|
-
display_name = "#{controller[:name]} #{@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
33
|
-
"(#{controller[:path]})")}"
|
|
34
|
-
menu.choice display_name, controller
|
|
35
|
-
end
|
|
36
|
-
menu.choice @pastel.public_send(Tng::UI::Theme.color(:secondary), "#{Tng::UI::Theme.icon(:back)} Back"), :back
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def show_no_controllers_message
|
|
41
|
-
error_msg = "#{@pastel.public_send(Tng::UI::Theme.color(:error)).bold("#{Tng::UI::Theme.icon(:error)} No controllers found in your application")}\n#{@pastel.public_send(
|
|
42
|
-
Tng::UI::Theme.color(:muted), "Make sure you have controllers in app/controllers/"
|
|
43
|
-
)}"
|
|
44
|
-
puts Tng::UI::Theme.center_text(error_msg, @terminal_width)
|
|
45
|
-
@prompt.keypress(Tng::UI::Theme.center_text(
|
|
46
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
47
|
-
"Press any key to continue..."), @terminal_width
|
|
48
|
-
))
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def select_controller_method(controller, methods)
|
|
52
|
-
header = @pastel.public_send(Tng::UI::Theme.color(:primary)).bold("#{Tng::UI::Theme.icon(:rocket)} Select method to test in #{controller[:name]}")
|
|
53
|
-
puts Tng::UI::Theme.center_text(header, @terminal_width)
|
|
54
|
-
|
|
55
|
-
@prompt.select(
|
|
56
|
-
"",
|
|
57
|
-
cycle: true,
|
|
58
|
-
per_page: 10,
|
|
59
|
-
filter: true,
|
|
60
|
-
symbols: { marker: Tng::UI::Theme.icon(:marker) }
|
|
61
|
-
) do |menu|
|
|
62
|
-
methods.each do |method|
|
|
63
|
-
menu.choice method[:name], method
|
|
64
|
-
end
|
|
65
|
-
menu.choice @pastel.public_send(Tng::UI::Theme.color(:secondary), "#{Tng::UI::Theme.icon(:back)} Back"), :back
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def show_no_methods_message(controller)
|
|
70
|
-
error_msg = "#{@pastel.public_send(Tng::UI::Theme.color(:error)).bold("#{Tng::UI::Theme.icon(:error)} No methods found in #{controller[:name]}")}\n#{@pastel.public_send(
|
|
71
|
-
Tng::UI::Theme.color(:muted), "Controller may be empty or have syntax errors"
|
|
72
|
-
)}"
|
|
73
|
-
puts Tng::UI::Theme.center_text(error_msg, @terminal_width)
|
|
74
|
-
@prompt.keypress(Tng::UI::Theme.center_text(
|
|
75
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
76
|
-
"Press any key to continue..."), @terminal_width
|
|
77
|
-
))
|
|
78
|
-
end
|
|
79
|
-
end
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
require "tty-box"
|
|
2
|
-
require "pastel"
|
|
3
|
-
require "tty-screen"
|
|
4
|
-
require_relative "theme"
|
|
5
|
-
|
|
6
|
-
class DisplayBanner
|
|
7
|
-
attr_reader :pastel, :version, :terminal_width
|
|
8
|
-
|
|
9
|
-
def initialize(pastel, version)
|
|
10
|
-
@pastel = pastel
|
|
11
|
-
@version = version
|
|
12
|
-
@terminal_width = begin
|
|
13
|
-
TTY::Screen.width
|
|
14
|
-
rescue StandardError
|
|
15
|
-
80
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def render
|
|
20
|
-
banner_content = [
|
|
21
|
-
pastel.public_send(Tng::UI::Theme.color(:secondary)).bold("Tng - LLM-Powered Rails Test Generator"),
|
|
22
|
-
pastel.public_send(Tng::UI::Theme.color(:muted), "Version: #{version}"),
|
|
23
|
-
"",
|
|
24
|
-
pastel.public_send(Tng::UI::Theme.color(:accent), "Generate comprehensive tests for your Rails application"),
|
|
25
|
-
pastel.public_send(Tng::UI::Theme.color(:muted), "Powered by LLM and static analysis")
|
|
26
|
-
].join("\n")
|
|
27
|
-
|
|
28
|
-
box_width = 64
|
|
29
|
-
box_width = terminal_width if box_width > terminal_width
|
|
30
|
-
style = Tng::UI::Theme.box_style(:default)
|
|
31
|
-
|
|
32
|
-
box = TTY::Box.frame(
|
|
33
|
-
title: { top_left: " Tng ", bottom_right: " Ready " },
|
|
34
|
-
style: style[:style],
|
|
35
|
-
padding: style[:padding],
|
|
36
|
-
align: :center,
|
|
37
|
-
width: box_width
|
|
38
|
-
) do
|
|
39
|
-
banner_content
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
"#{Tng::UI::Theme.center_box(box, box_width, terminal_width)}\n"
|
|
43
|
-
end
|
|
44
|
-
end
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "tty-box"
|
|
4
|
-
require "pastel"
|
|
5
|
-
require "tty-screen"
|
|
6
|
-
require_relative "theme"
|
|
7
|
-
|
|
8
|
-
class GoodbyeDisplay
|
|
9
|
-
def initialize(pastel)
|
|
10
|
-
@pastel = pastel
|
|
11
|
-
@terminal_width = begin
|
|
12
|
-
TTY::Screen.width
|
|
13
|
-
rescue StandardError
|
|
14
|
-
80
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def display
|
|
19
|
-
box_width = Tng::UI::Theme.calculate_box_width(@terminal_width)
|
|
20
|
-
style = Tng::UI::Theme.box_style(:success)
|
|
21
|
-
|
|
22
|
-
goodbye_box = TTY::Box.frame(
|
|
23
|
-
title: { top_left: " Thank You " },
|
|
24
|
-
style: style[:style],
|
|
25
|
-
padding: style[:padding],
|
|
26
|
-
align: :center,
|
|
27
|
-
width: box_width
|
|
28
|
-
) do
|
|
29
|
-
[
|
|
30
|
-
@pastel.public_send(Tng::UI::Theme.color(:success)).bold("Thanks for using Tng!"),
|
|
31
|
-
"",
|
|
32
|
-
@pastel.public_send(Tng::UI::Theme.color(:secondary), "Happy testing!"),
|
|
33
|
-
"",
|
|
34
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted), "Your Rails tests are now supercharged with LLM")
|
|
35
|
-
].join("\n")
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
puts Tng::UI::Theme.center_box(goodbye_box, box_width, @terminal_width)
|
|
39
|
-
puts
|
|
40
|
-
end
|
|
41
|
-
end
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "tty-prompt"
|
|
4
|
-
require "tty-spinner"
|
|
5
|
-
require "pastel"
|
|
6
|
-
require "tty-screen"
|
|
7
|
-
require_relative "theme"
|
|
8
|
-
|
|
9
|
-
class ModelTestFlowDisplay
|
|
10
|
-
def initialize(prompt, pastel)
|
|
11
|
-
@prompt = prompt
|
|
12
|
-
@pastel = pastel
|
|
13
|
-
@terminal_width = begin
|
|
14
|
-
TTY::Screen.width
|
|
15
|
-
rescue StandardError
|
|
16
|
-
80
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def select_model(models)
|
|
21
|
-
header = @pastel.public_send(Tng::UI::Theme.color(:primary)).bold("#{Tng::UI::Theme.icon(:config)} Select model to test:")
|
|
22
|
-
puts Tng::UI::Theme.center_text(header, @terminal_width)
|
|
23
|
-
|
|
24
|
-
@prompt.select(
|
|
25
|
-
"",
|
|
26
|
-
cycle: true,
|
|
27
|
-
per_page: 12,
|
|
28
|
-
filter: true,
|
|
29
|
-
symbols: { marker: Tng::UI::Theme.icon(:marker) }
|
|
30
|
-
) do |menu|
|
|
31
|
-
models.each do |model|
|
|
32
|
-
display_name = "#{model[:name]} #{@pastel.public_send(Tng::UI::Theme.color(:muted), "(#{model[:path]})")}"
|
|
33
|
-
menu.choice display_name, model
|
|
34
|
-
end
|
|
35
|
-
menu.choice @pastel.public_send(Tng::UI::Theme.color(:secondary), "#{Tng::UI::Theme.icon(:back)} Back"), :back
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def show_no_models_message
|
|
40
|
-
puts
|
|
41
|
-
puts Tng::UI::Theme.center_text(
|
|
42
|
-
@pastel.public_send(Tng::UI::Theme.color(:warning),
|
|
43
|
-
"#{Tng::UI::Theme.icon(:warning)} No models found in app/models"), @terminal_width
|
|
44
|
-
)
|
|
45
|
-
puts Tng::UI::Theme.center_text(
|
|
46
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
47
|
-
"Make sure you're in a Rails project with models"), @terminal_width
|
|
48
|
-
)
|
|
49
|
-
puts
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def select_model_method(model, methods)
|
|
53
|
-
header = @pastel.public_send(Tng::UI::Theme.color(:primary)).bold("#{Tng::UI::Theme.icon(:rocket)} Select method to test in #{model[:name]}")
|
|
54
|
-
puts Tng::UI::Theme.center_text(header, @terminal_width)
|
|
55
|
-
|
|
56
|
-
@prompt.select(
|
|
57
|
-
"",
|
|
58
|
-
cycle: true,
|
|
59
|
-
per_page: 10,
|
|
60
|
-
filter: true,
|
|
61
|
-
symbols: { marker: Tng::UI::Theme.icon(:marker) }
|
|
62
|
-
) do |menu|
|
|
63
|
-
methods.each do |method|
|
|
64
|
-
menu.choice method[:name], method
|
|
65
|
-
end
|
|
66
|
-
menu.choice @pastel.public_send(Tng::UI::Theme.color(:secondary), "#{Tng::UI::Theme.icon(:back)} Back"), :back
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def show_no_methods_message(model)
|
|
71
|
-
error_msg = "#{@pastel.public_send(Tng::UI::Theme.color(:error)).bold("#{Tng::UI::Theme.icon(:error)} No methods found in #{model[:name]}")}\n#{@pastel.public_send(
|
|
72
|
-
Tng::UI::Theme.color(:muted), "Model may be empty or have syntax errors"
|
|
73
|
-
)}"
|
|
74
|
-
puts Tng::UI::Theme.center_text(error_msg, @terminal_width)
|
|
75
|
-
@prompt.keypress(Tng::UI::Theme.center_text(
|
|
76
|
-
@pastel.public_send(Tng::UI::Theme.color(:muted),
|
|
77
|
-
"Press any key to continue..."), @terminal_width
|
|
78
|
-
))
|
|
79
|
-
end
|
|
80
|
-
end
|