12
12
main_bp_init_template ,
13
13
requirements_template ,
14
14
config_template ,
15
- runtime_template )
15
+ runtime_template ,
16
+ html_index ,
17
+ style_css )
16
18
17
19
class KickstartFlaskApp ():
18
20
19
21
def __init__ (self ):
20
22
self .project_name : str = 'Hello-Flask'
21
23
self .root_app_name : str = 'server'
22
24
self .app_version : float = 1.0
23
- self .description : str = ''
25
+ self .description : str = (f'This is a simple Flask app initiated with '
26
+ f'kickstart-flask-app Python package' )
24
27
self .author : str = getuser ()
25
28
self .main_bp_name : str = 'main_bp'
26
- self .setup_heroku_deployment_files : str = 'yes'
29
+ self .setup_heroku_deployment_files_check : str = 'yes'
30
+ self .setup_flask_templates_and_static_files_check : str = 'yes'
27
31
self .fields_names = [f'Project name. Default ({ self .project_name } )' ,
28
32
f'Root app name. Default ({ self .root_app_name } )' ,
29
33
f'App version. Default ({ self .app_version } )' ,
30
34
f'Description. Default ({ self .description } )' ,
31
35
f'Author. Default ({ self .author } )' ,
32
36
f'Main Blueprint name. Default ({ self .main_bp_name } )' ,
33
- f'Setup Heroku deployment files. Default ({ self .setup_heroku_deployment_files } )' ]
37
+ f'Setup Heroku deployment files. Default ({ self .setup_heroku_deployment_files_check } )' ]
34
38
self .runtime : str = "." .join (map (str , version_info [:3 ]))
39
+
40
+ """
41
+ Main files to run the app
42
+ """
35
43
self .flask_files = ['wsgi.py' ,
36
44
'__init__.py' ,
37
45
'routes.py' ,
@@ -40,14 +48,27 @@ def __init__(self):
40
48
'tests.py' ,
41
49
'requirement.txt'
42
50
]
43
- self .flask_files_paths = []
44
- self .flask_files_templates = []
51
+ self .flask_files_paths : dict = []
52
+ self .flask_files_templates : dict = []
53
+
54
+ """
55
+ Flask directories: templates and static
56
+ """
57
+ self .flask_dirs : dict = ['templates' ,
58
+ 'static'
59
+ ]
60
+ self .flask_dirs_paths : dict = []
61
+ self .flask_dirs_files : dict = ['index.html' , 'style.css' ]
62
+ self .flask_dirs_templates : dict = []
45
63
64
+ """
65
+ Required files to deploy the application to Heroku
66
+ """
46
67
self .heroku_files = ['runtime.txt' , 'Procfile' ]
47
68
self .heroku_files_paths = []
48
69
self .heroku_files_templates = []
49
70
50
- def get_input (self , input_msg , default = None ):
71
+ def get_input (self , input_msg , default = None ) -> str :
51
72
if version_info >= (3 , 0 ):
52
73
input_value = input (f'{ input_msg } : ' )
53
74
else :
@@ -59,7 +80,8 @@ def get_input(self, input_msg, default=None):
59
80
60
81
61
82
def write_content (self , file , content , path ) -> None :
62
- with open (f'{ path } /{ file } ' , 'w' ) as file :
83
+ file_path = os .path .join (path , file )
84
+ with open (file_path , 'w' ) as file :
63
85
if version_info >= (3 , 0 ):
64
86
file .write (content )
65
87
else :
@@ -75,13 +97,22 @@ def populate_project_files(self) -> None:
75
97
self .flask_files_templates ):
76
98
self .write_content (flask_file , flask_file_template , flask_file_path )
77
99
100
+ def setup_flask_templates_and_static_files (self ) -> None :
101
+ for flask_dir , flask_dir_path , flask_dir_file , flask_dir_template in zip (self .flask_dirs ,
102
+ self .flask_dirs_paths ,
103
+ self .flask_dirs_files ,
104
+ self .flask_dirs_templates ):
105
+ full_dir_path = os .path .join (flask_dir_path , flask_dir )
106
+ os .makedirs (full_dir_path , exist_ok = True )
107
+ self .write_content (flask_dir_file , flask_dir_template , full_dir_path )
108
+
78
109
def setup_heroku_files (self ) -> None :
79
110
for heroku_file , heroku_file_path , heroku_file_template in zip (self .heroku_files ,
80
111
self .heroku_files_paths ,
81
112
self .heroku_files_templates ):
82
113
self .write_content (heroku_file , heroku_file_template , heroku_file_path )
83
114
84
- def main (self ):
115
+ def main (self ) -> None :
85
116
86
117
self .project_name = self .get_input (f'Project name. Default ({ self .project_name } )' ,
87
118
default = self .project_name )
@@ -95,10 +126,15 @@ def main(self):
95
126
default = self .author )
96
127
self .main_bp_name = self .get_input (f'Main Blueprint name. Default ({ self .main_bp_name } )' ,
97
128
default = self .main_bp_name )
98
- self .setup_heroku_deployment_files = self .get_input (f'Setup Heroku deployment files (yes/no). Default ({ self .setup_heroku_deployment_files } )' ,
99
- default = self .setup_heroku_deployment_files )
129
+ self .setup_heroku_deployment_files_check = self .get_input (
130
+ (
131
+ f'Setup Heroku deployment files (yes/no). Default'
132
+ f'({ self .setup_heroku_deployment_files_check } )'
133
+ ),
134
+ default = self .setup_heroku_deployment_files_check )
100
135
101
- self .flask_files_paths = [f'{ self .project_name } ' ,
136
+ self .flask_files_paths = [
137
+ f'{ self .project_name } ' ,
102
138
f'{ self .project_name } /{ self .root_app_name } ' ,
103
139
f'{ self .project_name } /{ self .root_app_name } /{ self .main_bp_name } ' ,
104
140
f'{ self .project_name } /{ self .root_app_name } /{ self .main_bp_name } ' ,
@@ -107,25 +143,44 @@ def main(self):
107
143
f'{ self .project_name } '
108
144
]
109
145
110
- self .flask_files_templates = [wsgi_template .substitute (app_name = self .root_app_name ),
111
- app_init_template .substitute (app_name = self .root_app_name , main_bp_name = self .main_bp_name ) ,
112
- main_bp_routes_template .substitute (app_name = self .root_app_name , main_bp_name = self .main_bp_name ),
113
- main_bp_init_template .substitute (app_name = self .root_app_name , main_bp_name = self .main_bp_name ),
114
- config_template .substitute (app_name = self .root_app_name , project_name = self .project_name , runtime = self .runtime ),
146
+ self .flask_files_templates = [
147
+ wsgi_template .substitute (app_name = self .root_app_name ),
148
+ app_init_template .substitute (app_name = self .root_app_name ,
149
+ main_bp_name = self .main_bp_name ) ,
150
+ main_bp_routes_template .substitute (app_name = self .root_app_name ,
151
+ main_bp_name = self .main_bp_name ),
152
+ main_bp_init_template .substitute (app_name = self .root_app_name ,
153
+ main_bp_name = self .main_bp_name ),
154
+ config_template .substitute (app_name = self .root_app_name ,
155
+ project_name = self .project_name , runtime = self .runtime ,
156
+ description = self .description ),
115
157
tests_template .substitute (),
116
158
requirements_template .substitute ()
117
159
]
118
160
119
161
self .create_project_structure ()
120
162
self .populate_project_files ()
121
163
122
- if 'y' .lower () in self .setup_heroku_deployment_files :
164
+ # setup Heroku files if (y)es
165
+ if 'y' .lower () in self .setup_heroku_deployment_files_check :
123
166
self .heroku_files_paths = [f'{ self .project_name } ' ] * len (self .heroku_files )
124
- self .heroku_files_templates = [runtime_template .substitute (runtime = self .runtime ),
167
+ self .heroku_files_templates = [
168
+ runtime_template .substitute (runtime = self .runtime ),
125
169
procfile_template .substitute ()
126
170
]
127
171
self .setup_heroku_files ()
128
172
173
+ # setup Flask templates and static dirs and files if (y)es
174
+ if 'y' .lower () in self .setup_flask_templates_and_static_files_check :
175
+ self .flask_dirs_paths = [
176
+ f'{ self .project_name } /{ self .root_app_name } '
177
+ ] * len (self .flask_dirs )
178
+ self .flask_dirs_templates = [
179
+ html_index .substitute (project_name = self .project_name , description = self .description ),
180
+ style_css .substitute ()
181
+ ]
182
+ self .setup_flask_templates_and_static_files ()
183
+
129
184
def console () -> None :
130
185
kickstart_flask_app = KickstartFlaskApp ()
131
186
kickstart_flask_app .main ()
0 commit comments