Skip to content

Commit c301bfa

Browse files
Added the ability to choose file extensions of files that are created using the file manager
Changed several functions' signatures to ask for **kwargs
1 parent 0108e6b commit c301bfa

File tree

3 files changed

+56
-27
lines changed

3 files changed

+56
-27
lines changed

.idea/workspace.xml

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common.py

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# This is a project for an automated file renamer
22
# TODO: make the empty-prefixed calls identity operations for those base directories
33
# TODO: make choice of extension available
4+
# TODO: consider file name + extension limitations
45

56
import os
67
# from exceptions import EmptyArgsException
@@ -16,9 +17,22 @@ def validate_prefix(prefix):
1617
return ''.join((char for char in prefix if char not in ' _0123456789')) # Deleting unwanted characters
1718

1819

19-
def validate_args(**args):
20+
DEFAULT_EXTENSION = '.py'
21+
22+
23+
def validate_extension(extension):
24+
if extension == '':
25+
return DEFAULT_EXTENSION
26+
else:
27+
extension = ''.join((char for char in extension if char not in ' _0123456789')) # Deleting unwanted characters
28+
if extension[0] != '.':
29+
extension = '.' + extension
30+
return extension
31+
32+
33+
def validate_args(**kwargs):
2034
empty_args = []
21-
for key, value in args.items():
35+
for key, value in kwargs.items():
2236
if value == '' or value is None:
2337
empty_args.append(key)
2438
if empty_args:
@@ -48,7 +62,8 @@ def find_end_of_exercise_number_from_directory(directory):
4862
return os.path.basename(directory).split('_')[1]
4963

5064

51-
def main_file_name(directory, prefix=''):
65+
def main_file_name(**kwargs): # directory, prefix=''
66+
directory, prefix = kwargs['directory'], kwargs['prefix']
5267
res = os.path.basename(directory)
5368
pos = find_end_of_prefix(res) + 1
5469
res = res[:pos] + 'f_' + res[pos:]
@@ -58,7 +73,8 @@ def main_file_name(directory, prefix=''):
5873
return res
5974

6075

61-
def renamer(base_dir, prefix, problem_name=None):
76+
def renamer(**kwargs): # base_dir, prefix
77+
base_dir, prefix = kwargs['base_dir'], kwargs['prefix']
6278
prefix = validate_prefix(prefix)
6379
for directory in os.listdir(base_dir):
6480
prefix_end = find_end_of_prefix(directory) + 1
@@ -96,7 +112,7 @@ def renamer(base_dir, prefix, problem_name=None):
96112

97113
pos_1 = file_data.find('from') + 5
98114
pos_2 = file_data.find('import', pos_1) - 1
99-
file_data = file_data[:pos_1] + main_file_name(directory) + file_data[pos_2:]
115+
file_data = file_data[:pos_1] + main_file_name(directory=directory) + file_data[pos_2:]
100116

101117
with open(directory + '/' + file, 'w') as f:
102118
f.write(file_data)
@@ -117,7 +133,8 @@ def renamer(base_dir, prefix, problem_name=None):
117133

118134

119135
# TODO: unify this with the renamer function
120-
def imp_adjustment(base_dir, prefix=None, problem_name=None):
136+
def imp_adjustment(**kwargs): # base_dir
137+
base_dir = kwargs['base_dir']
121138
for directory in os.listdir(base_dir):
122139
directory = base_dir + '/' + directory
123140
if os.path.isdir(directory):
@@ -153,21 +170,24 @@ def imp_adjustment(base_dir, prefix=None, problem_name=None):
153170

154171
# The function for transforming names of problems into appropriate file names
155172
# TODO: currently, only supports Leetcode. Need to make it more general.
156-
def get_file_name(problem_name):
173+
def get_file_name(problem_name): # problem_name
157174
trans_dict = str.maketrans(' ', '_', '.')
158175
res = problem_name.translate(trans_dict).lower()
159176
res = res[:res.find('_') + 1] + 'f_' + res[res.find('_') + 1:]
160177
return res
161178

162179

163180
# TODO: check for errors using a decorator?
164-
def file_creation(base_dir, prefix, problem_name):
181+
# TODO: allow for configurable file extensions
182+
def file_creation(**kwargs): # base_dir, prefix, problem_name
183+
base_dir, prefix, problem_name, extension = kwargs['base_dir'], kwargs['prefix'], kwargs['problem_name'], kwargs['extension']
165184
try:
166185
validate_args(base_dir=base_dir, prefix=prefix, problem_name=problem_name)
167186
except EmptyArgsException:
168187
return
169188

170189
prefix = validate_prefix(prefix)
190+
extension = validate_extension(extension)
171191

172192
main_file_name = prefix + '_' + get_file_name(problem_name)
173193
directory_name = os.path.join(base_dir, main_file_name.replace('f_', ''))
@@ -177,14 +197,14 @@ def file_creation(base_dir, prefix, problem_name):
177197
os.mkdir(directory_name)
178198

179199
try:
180-
with open(directory_name + '/' + main_file_name + '.py', 'x') as f:
200+
with open(directory_name + '/' + main_file_name + extension, 'x') as f:
181201
pass
182202
except FileExistsError:
183203
pass
184204

185-
with open(directory_name + '/' + test_file_name + '.py', 'w') as new_test_file:
205+
with open(directory_name + '/' + test_file_name + extension, 'w') as new_test_file:
186206
try:
187-
with open(base_dir + f'/{prefix}_common/{prefix}_test_template.py', 'r') as template:
207+
with open(base_dir + f'/{prefix}_common/{prefix}_test_template' + extension, 'r') as template:
188208
for line in template:
189209
new_test_file.write(line)
190210
except FileNotFoundError:
@@ -194,8 +214,10 @@ def file_creation(base_dir, prefix, problem_name):
194214
METHODS_DICT = {'renamer': renamer, 'import_adjustment': imp_adjustment, 'file_creation': file_creation}
195215

196216

197-
def general_function_handler(method, base_dir, prefix, problem_name):
198-
METHODS_DICT[method](base_dir, prefix, problem_name)
217+
def general_function_handler(**kwargs): # method, base_dir, prefix, problem_name
218+
method = kwargs['method']
219+
del kwargs['method']
220+
METHODS_DICT[method](**kwargs)
199221

200222

201223
if __name__ == '__main__':
@@ -209,12 +231,12 @@ def general_function_handler(method, base_dir, prefix, problem_name):
209231
if method == 'renamer':
210232
base_dir = str(input("Base directory: "))
211233
prefix = str(input("Prefix: "))
212-
renamer(base_dir, prefix)
234+
renamer(base_dir=base_dir, prefix=prefix)
213235
elif method == 'import_adjustment':
214236
base_dir = str(input("Base directory: "))
215-
imp_adjustment(base_dir)
237+
imp_adjustment(base_dir=base_dir)
216238
elif method == 'file_creation':
217239
base_dir = str(input("Base directory: "))
218240
prefix = str(input("Prefix: "))
219241
problem_name = str(input("Problem name: "))
220-
file_creation(base_dir, prefix, problem_name)
242+
file_creation(base_dir=base_dir, prefix=prefix, problem_name=problem_name)

main.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
# label_and_entry_frame.grid(row=0, column=0, sticky='nsew')
2626
label_and_entry_frame.pack(padx=20, pady=10, fill='x')
2727
for c in range(4): label_and_entry_frame.columnconfigure(index=c, weight=1)
28-
for r in range(6): label_and_entry_frame.rowconfigure(index=r, weight=1)
28+
for r in range(7): label_and_entry_frame.rowconfigure(index=r, weight=1)
2929
label_and_entry_frame.columnconfigure(index=1, weight=2, minsize=200)
30-
label_and_entry_frame.rowconfigure(index=4, minsize=16)
30+
label_and_entry_frame.rowconfigure(index=5, minsize=16)
3131
# # Preset frame
3232
# preset_frame = tk.Frame(main_body_frame)
3333
# preset_frame.grid(row=1, column=0, sticky='nsew')
@@ -45,8 +45,10 @@
4545
prefix_label.grid(row=2, column=0, sticky='E')
4646
problem_name_label = tk.Label(label_and_entry_frame, text='Problem name: ')
4747
problem_name_label.grid(row=3, column=0, sticky='E')
48+
extension_label = tk.Label(label_and_entry_frame, text='Extension: ')
49+
extension_label.grid(row=4, column=0, sticky='E')
4850
preset_name_label = tk.Label(label_and_entry_frame, text='Preset name: ')
49-
preset_name_label.grid(row=5, column=0, sticky='E')
51+
preset_name_label.grid(row=6, column=0, sticky='E')
5052

5153
# Entry section
5254
# TODO: make method_entry a drop-down menu
@@ -58,16 +60,19 @@
5860
prefix_entry.grid(row=2, column=1, sticky='EW')
5961
problem_name_entry = tk.Entry(label_and_entry_frame)
6062
problem_name_entry.grid(row=3, column=1, sticky='EW')
63+
extension_entry = tk.Entry(label_and_entry_frame)
64+
extension_entry.grid(row=4, column=1, sticky='EW')
6165
preset_name_entry = tk.Entry(label_and_entry_frame)
62-
preset_name_entry.grid(row=5, column=1, sticky='EW')
66+
preset_name_entry.grid(row=6, column=1, sticky='EW')
6367

6468
ENTRY_OBJECT_DICT = {'method': method_entry, 'base dir': base_dir_entry, 'prefix': prefix_entry,
65-
'problem name': problem_name_entry, 'preset name': preset_name_entry}
69+
'problem name': problem_name_entry,'extension': extension_entry, 'preset name': preset_name_entry}
6670

6771
# Button section
6872
ok_button = tk.Button(bottom_frame, text='Ok',
69-
command=lambda: general_function_handler(method_entry.get(), base_dir_entry.get(),
70-
prefix_entry.get(), problem_name_entry.get()))
73+
command=lambda: general_function_handler(method=method_entry.get(), base_dir=base_dir_entry.get(),
74+
prefix=prefix_entry.get(), problem_name=problem_name_entry.get(),
75+
extension=extension_entry.get()))
7176
ok_button.pack()
7277

7378
def set_base_dir():
@@ -111,9 +116,10 @@ def save_preset():
111116
file.write(key + ': ' + value + '\n')
112117

113118
save_preset_button = tk.Button(label_and_entry_frame, text='save preset', command=save_preset)
114-
save_preset_button.grid(row=5, column=2, sticky='EW')
115-
119+
save_preset_button.grid(row=6, column=2, sticky='EW')
116120

121+
# TODO: handle the FileNotFoundError when the directory request gets cancelled more gracefully
122+
# TODO: add default preset directory
117123
def choose_preset():
118124
filename = filedialog.askopenfilename()
119125
param_dict = {}
@@ -132,7 +138,7 @@ def choose_preset():
132138
ENTRY_OBJECT_DICT[key].insert(0, value)
133139

134140
choose_preset_button = tk.Button(label_and_entry_frame, text='choose preset', command=choose_preset)
135-
choose_preset_button.grid(row=5, column=3, sticky='EW')
141+
choose_preset_button.grid(row=6, column=3, sticky='EW')
136142

137143

138144
if __name__ == '__main__':

0 commit comments

Comments
 (0)