1
1
# This is a project for an automated file renamer
2
2
# TODO: make the empty-prefixed calls identity operations for those base directories
3
3
# TODO: make choice of extension available
4
+ # TODO: consider file name + extension limitations
4
5
5
6
import os
6
7
# from exceptions import EmptyArgsException
@@ -16,9 +17,22 @@ def validate_prefix(prefix):
16
17
return '' .join ((char for char in prefix if char not in ' _0123456789' )) # Deleting unwanted characters
17
18
18
19
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 ):
20
34
empty_args = []
21
- for key , value in args .items ():
35
+ for key , value in kwargs .items ():
22
36
if value == '' or value is None :
23
37
empty_args .append (key )
24
38
if empty_args :
@@ -48,7 +62,8 @@ def find_end_of_exercise_number_from_directory(directory):
48
62
return os .path .basename (directory ).split ('_' )[1 ]
49
63
50
64
51
- def main_file_name (directory , prefix = '' ):
65
+ def main_file_name (** kwargs ): # directory, prefix=''
66
+ directory , prefix = kwargs ['directory' ], kwargs ['prefix' ]
52
67
res = os .path .basename (directory )
53
68
pos = find_end_of_prefix (res ) + 1
54
69
res = res [:pos ] + 'f_' + res [pos :]
@@ -58,7 +73,8 @@ def main_file_name(directory, prefix=''):
58
73
return res
59
74
60
75
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' ]
62
78
prefix = validate_prefix (prefix )
63
79
for directory in os .listdir (base_dir ):
64
80
prefix_end = find_end_of_prefix (directory ) + 1
@@ -96,7 +112,7 @@ def renamer(base_dir, prefix, problem_name=None):
96
112
97
113
pos_1 = file_data .find ('from' ) + 5
98
114
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 :]
100
116
101
117
with open (directory + '/' + file , 'w' ) as f :
102
118
f .write (file_data )
@@ -117,7 +133,8 @@ def renamer(base_dir, prefix, problem_name=None):
117
133
118
134
119
135
# 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' ]
121
138
for directory in os .listdir (base_dir ):
122
139
directory = base_dir + '/' + directory
123
140
if os .path .isdir (directory ):
@@ -153,21 +170,24 @@ def imp_adjustment(base_dir, prefix=None, problem_name=None):
153
170
154
171
# The function for transforming names of problems into appropriate file names
155
172
# 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
157
174
trans_dict = str .maketrans (' ' , '_' , '.' )
158
175
res = problem_name .translate (trans_dict ).lower ()
159
176
res = res [:res .find ('_' ) + 1 ] + 'f_' + res [res .find ('_' ) + 1 :]
160
177
return res
161
178
162
179
163
180
# 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' ]
165
184
try :
166
185
validate_args (base_dir = base_dir , prefix = prefix , problem_name = problem_name )
167
186
except EmptyArgsException :
168
187
return
169
188
170
189
prefix = validate_prefix (prefix )
190
+ extension = validate_extension (extension )
171
191
172
192
main_file_name = prefix + '_' + get_file_name (problem_name )
173
193
directory_name = os .path .join (base_dir , main_file_name .replace ('f_' , '' ))
@@ -177,14 +197,14 @@ def file_creation(base_dir, prefix, problem_name):
177
197
os .mkdir (directory_name )
178
198
179
199
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 :
181
201
pass
182
202
except FileExistsError :
183
203
pass
184
204
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 :
186
206
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 :
188
208
for line in template :
189
209
new_test_file .write (line )
190
210
except FileNotFoundError :
@@ -194,8 +214,10 @@ def file_creation(base_dir, prefix, problem_name):
194
214
METHODS_DICT = {'renamer' : renamer , 'import_adjustment' : imp_adjustment , 'file_creation' : file_creation }
195
215
196
216
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 )
199
221
200
222
201
223
if __name__ == '__main__' :
@@ -209,12 +231,12 @@ def general_function_handler(method, base_dir, prefix, problem_name):
209
231
if method == 'renamer' :
210
232
base_dir = str (input ("Base directory: " ))
211
233
prefix = str (input ("Prefix: " ))
212
- renamer (base_dir , prefix )
234
+ renamer (base_dir = base_dir , prefix = prefix )
213
235
elif method == 'import_adjustment' :
214
236
base_dir = str (input ("Base directory: " ))
215
- imp_adjustment (base_dir )
237
+ imp_adjustment (base_dir = base_dir )
216
238
elif method == 'file_creation' :
217
239
base_dir = str (input ("Base directory: " ))
218
240
prefix = str (input ("Prefix: " ))
219
241
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 )
0 commit comments