Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
oorrja
GitHub Repository: oorrja/learntosolveit
Path: blob/master/utils/bin/add_program.py
1240 views
1
#!/usr/bin/python
2
3
"""
4
BUGS:
5
1. make cprogramming and cprogs dir into a single dir name.
6
7
"""
8
9
import os
10
import sys
11
import time
12
13
LANGUAGE_PATH = '../../languages/'
14
NOW_FORMAT = '%d-%m-%Y %H:%M'
15
PROGRAM_NAME_TEMPLATE = 'PROGRAMNAME'
16
SOURCE_PATH = '../../source/'
17
TEMPLATE_FORMAT = '../{0}_template.rst'
18
INVALID_EXIT = -1
19
PROGRAM_DIR = os.path.abspath(os.path.dirname(__file__))
20
21
USAGE = """
22
add_program.py program_name
23
24
program_name should follow pattern generic_specific.extension
25
"""
26
27
def _now():
28
return time.strftime(NOW_FORMAT, time.localtime(time.time()))
29
30
def _comment_type(ext):
31
return {
32
'c': '//',
33
'py': '#',
34
'rb': '#',
35
'java': '//',
36
'scala': '//'}.get(ext, '#')
37
38
def _source_folder_name(language):
39
return {
40
'c': 'cprogramming',
41
'py': 'python',
42
'rb': 'ruby',
43
'scala': 'scala',
44
'java': 'java'}.get(language, '')
45
46
def _program_folder_name(language):
47
return {
48
'c': 'cprogs',
49
'py': 'python',
50
'rb': 'ruby',
51
'scala': 'scala',
52
'java': 'java'}.get(language, '')
53
54
def get_language_dir(language):
55
return os.path.abspath(
56
os.path.join(
57
PROGRAM_DIR,
58
LANGUAGE_PATH,
59
_program_folder_name(language)))
60
61
def get_source_dir(language):
62
return os.path.abspath(
63
os.path.join(
64
PROGRAM_DIR,
65
SOURCE_PATH,
66
_source_folder_name(language)))
67
68
def get_template_file(language):
69
template_path = TEMPLATE_FORMAT.format(_source_folder_name(language))
70
return os.path.abspath(os.path.join(PROGRAM_DIR, template_path))
71
72
def create_program(filename):
73
ext = filename.split('.')[1]
74
with open(filename, 'w') as fh:
75
fh.write('{0} {1} - {2}'.format(
76
_comment_type(ext),
77
os.path.basename(filename),
78
_now()))
79
80
def _program_name(program):
81
return program.split('.')[0]
82
83
def _rst_filename(program):
84
return _program_name(program) + '.rst'
85
86
def create_source(template, filename, program):
87
with open(template) as template_file:
88
with open(filename, 'w') as source_file:
89
for line in template_file:
90
source_file.write(
91
line.replace(PROGRAM_NAME_TEMPLATE, program))
92
93
def update_index_file(filename, program):
94
with open(filename, 'a') as f:
95
f.write(' %s\n\n' % program)
96
97
def get_index_file(language):
98
return os.path.abspath(os.path.join(get_source_dir(language), 'index.rst'))
99
100
def exit_if_not_exists(path):
101
if not os.path.exists(path):
102
print("{0} does not exists".format(path))
103
sys.exit(-1)
104
105
def main(args):
106
try:
107
program, = args
108
except ValueError:
109
print(USAGE)
110
sys.exit(-1)
111
112
program_name, language = program.split('.')
113
114
path = get_language_dir(language)
115
exit_if_not_exists(path)
116
program_file = os.path.abspath(os.path.join(path, program))
117
create_program(program_file)
118
print('Created {0}'.format(program_file))
119
120
path = get_source_dir(language)
121
exit_if_not_exists(path)
122
source_file = os.path.abspath(os.path.join(path, _rst_filename(program)))
123
create_source(
124
get_template_file(language),
125
source_file,
126
_program_name(program))
127
128
print('Created {0}'.format(source_file))
129
130
filename = get_index_file(language)
131
exit_if_not_exists(filename)
132
update_index_file(filename, _program_name(program))
133
print('Updated {0}'.format(filename))
134
135
if __name__ == '__main__':
136
main(sys.argv[1:])
137
138