ai_refactor 0.2.0 → 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 +4 -4
- data/Gemfile.lock +1 -1
- data/exe/ai_refactor +15 -11
- data/lib/ai_refactor/base_refactor.rb +11 -0
- data/lib/ai_refactor/refactors/generic.rb +52 -2
- data/lib/ai_refactor/refactors/rspec_to_minitest_rails.rb +1 -7
- data/lib/ai_refactor/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa9421b9791dda3c02b930e63d0fa7bd3dc587d121a0b3748a0f9d8c649f98a3
|
4
|
+
data.tar.gz: a5cb385968939847ebb1ceb1d663b1926e410fce0571fa2ab7463440347c0f50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ff997f0533fe95da7f0361789d88b4a73ecd8fbd82a1f54179fbce3b6a3b466c40330ae615a00f850e549212fe2463ba60ca4467cc0d9f65bbd6679f326dff1
|
7
|
+
data.tar.gz: 5898b17ebaa96c24a89cae1ff741a53d3afbb7a6c4844f52a271ddfecc1ebc1923026324601cb98e56b5aed0d673bba5d583d388a7a936e4cc86b272e1858bd8
|
data/Gemfile.lock
CHANGED
data/exe/ai_refactor
CHANGED
@@ -14,7 +14,6 @@ supported_names = AIRefactor::Refactors.names
|
|
14
14
|
option_parser = OptionParser.new do |parser|
|
15
15
|
parser.banner = "Usage: ai_refactor REFACTOR_TYPE INPUT_FILE_OR_DIR [options]\n\nWhere REFACTOR_TYPE is one of: #{supported_names}\n\n"
|
16
16
|
|
17
|
-
# todo: support for a sort of generic process which uses a custom prompt file
|
18
17
|
parser.on("-p", "--prompt PROMPT_FILE", String, "Specify path to a text file that contains the ChatGPT 'system' prompt.") do |f|
|
19
18
|
options[:prompt_file_path] = f
|
20
19
|
end
|
@@ -27,11 +26,11 @@ option_parser = OptionParser.new do |parser|
|
|
27
26
|
options[:ai_model] = m
|
28
27
|
end
|
29
28
|
|
30
|
-
parser.on(
|
29
|
+
parser.on("--temperature TEMP", Float, "Specify the temperature parameter for ChatGPT (default 0.7).") do |p|
|
31
30
|
options[:ai_temperature] = p
|
32
31
|
end
|
33
32
|
|
34
|
-
parser.on(
|
33
|
+
parser.on("--max-tokens MAX_TOKENS", Integer, "Specify the max number of tokens of output ChatGPT can generate. Max will depend on the size of the prompt (default 1500)") do |m|
|
35
34
|
options[:ai_max_tokens] = m
|
36
35
|
end
|
37
36
|
|
@@ -47,18 +46,23 @@ option_parser = OptionParser.new do |parser|
|
|
47
46
|
options[:debug] = true
|
48
47
|
end
|
49
48
|
|
50
|
-
supported_refactors.each do |_name, refactorer|
|
51
|
-
refactorer.command_line_options.each do |option|
|
52
|
-
parser.on(option[:short], option[:long], option[:type], option[:help]) do |o|
|
53
|
-
options[option[:key]] = o
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
49
|
parser.on("-h", "--help", "Prints this help") do
|
59
50
|
puts parser
|
60
51
|
exit
|
61
52
|
end
|
53
|
+
|
54
|
+
parser.separator ""
|
55
|
+
|
56
|
+
supported_refactors.each do |name, refactorer|
|
57
|
+
parser.separator "For refactor type '#{name}':" if refactorer.command_line_options.size.positive?
|
58
|
+
refactorer.command_line_options.each do |option|
|
59
|
+
args = [option[:long], option[:type], option[:help]]
|
60
|
+
args.unshift(option[:short]) if option[:short]
|
61
|
+
parser.on(*args) do |o|
|
62
|
+
options[option[:key]] = o.nil? ? true : o
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
62
66
|
end
|
63
67
|
|
64
68
|
option_parser.parse!
|
@@ -21,6 +21,17 @@ module AIRefactor
|
|
21
21
|
|
22
22
|
private
|
23
23
|
|
24
|
+
def can_overwrite_output_file?(output_path)
|
25
|
+
logger.info "Do you wish to overwrite #{output_path}? (y/n)"
|
26
|
+
answer = $stdin.gets.chomp
|
27
|
+
unless answer == "y" || answer == "Y"
|
28
|
+
logger.warn "Skipping #{input_file}..."
|
29
|
+
self.failed_message = "Skipped as output file already exists"
|
30
|
+
return false
|
31
|
+
end
|
32
|
+
true
|
33
|
+
end
|
34
|
+
|
24
35
|
def prompt_file_path
|
25
36
|
self.class.prompt_file_path
|
26
37
|
end
|
@@ -5,14 +5,20 @@ module AIRefactor
|
|
5
5
|
class Generic < BaseRefactor
|
6
6
|
def run
|
7
7
|
logger.verbose "Generic refactor to #{input_file}... (using user supplied prompt #{prompt_file_path})"
|
8
|
+
logger.verbose "Write output to #{output_file_path}..." if output_file_path
|
8
9
|
|
9
10
|
processor = AIRefactor::FileProcessor.new(
|
10
11
|
input_path: input_file,
|
11
12
|
prompt_file_path: prompt_file_path,
|
12
13
|
ai_client: ai_client,
|
13
|
-
logger: logger
|
14
|
+
logger: logger,
|
15
|
+
output_path: output_file_path
|
14
16
|
)
|
15
17
|
|
18
|
+
if processor.output_exists?
|
19
|
+
return false unless can_overwrite_output_file?(output_file_path)
|
20
|
+
end
|
21
|
+
|
16
22
|
logger.verbose "Converting #{input_file}..."
|
17
23
|
|
18
24
|
begin
|
@@ -38,11 +44,38 @@ module AIRefactor
|
|
38
44
|
return false
|
39
45
|
end
|
40
46
|
|
41
|
-
output_content
|
47
|
+
output_file_path ? true : output_content
|
42
48
|
end
|
43
49
|
|
44
50
|
private
|
45
51
|
|
52
|
+
def output_file_path
|
53
|
+
return output_file_path_from_template if output_template_path
|
54
|
+
|
55
|
+
path = options[:output_file_path]
|
56
|
+
return unless path
|
57
|
+
|
58
|
+
if path == true
|
59
|
+
input_file
|
60
|
+
else
|
61
|
+
path
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def output_template_path
|
66
|
+
options[:output_template_path]
|
67
|
+
end
|
68
|
+
|
69
|
+
def output_file_path_from_template
|
70
|
+
path = output_template_path.gsub("[FILE]", File.basename(input_file))
|
71
|
+
.gsub("[NAME]", File.basename(input_file, ".*"))
|
72
|
+
.gsub("[DIR]", File.dirname(input_file))
|
73
|
+
.gsub("[REFACTOR]", self.class.refactor_name)
|
74
|
+
.gsub("[EXT]", File.extname(input_file))
|
75
|
+
raise "Output template could not be used" unless path.length.positive?
|
76
|
+
path
|
77
|
+
end
|
78
|
+
|
46
79
|
def prompt_file_path
|
47
80
|
specified_prompt_path = options[:prompt_file_path]
|
48
81
|
if specified_prompt_path&.length&.positive?
|
@@ -61,6 +94,23 @@ module AIRefactor
|
|
61
94
|
def prompt_file_path
|
62
95
|
raise "Generic refactor requires prompt file to be user specified."
|
63
96
|
end
|
97
|
+
|
98
|
+
def command_line_options
|
99
|
+
[
|
100
|
+
{
|
101
|
+
key: :output_file_path,
|
102
|
+
long: "--output [FILE]",
|
103
|
+
type: String,
|
104
|
+
help: "Write output to file instead of stdout. If no path provided will overwrite input file (will prompt to overwrite existing files)"
|
105
|
+
},
|
106
|
+
{
|
107
|
+
key: :output_template_path,
|
108
|
+
long: "--output-template TEMPLATE",
|
109
|
+
type: String,
|
110
|
+
help: "Write outputs to files instead of stdout. The template is used to create the output name, where the it can have substitutions, '[FILE]', '[NAME]', '[DIR]', '[REFACTOR]' & '[EXT]'. Eg `[DIR]/[NAME]_[REFACTOR][EXT]` (will prompt to overwrite existing files)"
|
111
|
+
}
|
112
|
+
]
|
113
|
+
end
|
64
114
|
end
|
65
115
|
end
|
66
116
|
end
|
@@ -35,13 +35,7 @@ module AIRefactor
|
|
35
35
|
)
|
36
36
|
|
37
37
|
if processor.output_exists?
|
38
|
-
|
39
|
-
answer = $stdin.gets.chomp
|
40
|
-
unless answer == "y" || answer == "Y"
|
41
|
-
logger.warn "Skipping #{input_file}..."
|
42
|
-
self.failed_message = "Skipped as output test file already exists"
|
43
|
-
return false
|
44
|
-
end
|
38
|
+
return false unless can_overwrite_output_file?(output_path)
|
45
39
|
end
|
46
40
|
|
47
41
|
logger.verbose "Converting #{input_file}..."
|
data/lib/ai_refactor/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ai_refactor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen Ierodiaconou
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|