-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathandstrap.py
executable file
·179 lines (138 loc) · 6.5 KB
/
andstrap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#!/usr/bin/python
import argparse
import sys
import os
import shutil
from os.path import join
class TemplateWriter():
def __init__(self, app_name, package_name, app_class_prefix,
compile_sdk_version, min_sdk_version, target_sdk_version, output_folder):
self.app_name = app_name
self.package_name = package_name
self.output_folder = output_folder
self.app_class_prefix = app_class_prefix
self.replacements = {
'{app_name}' : app_name,
'{package_name}' : package_name,
'{app_class_prefix}' : app_class_prefix,
'{compile_sdk_version}' : compile_sdk_version,
'{min_sdk_version}' : min_sdk_version,
'{target_sdk_version}' : target_sdk_version,
}
def __create_output_folder(self):
self.__create_folder(self.output_folder)
def __create_readme(self):
f = open(join(self.output_folder, 'README.md'), 'w')
f.write(self.app_name + '\n=========')
f.close()
def __create_folder_structure(self):
self.__create_folder(join(self.output_folder, 'libs'))
base_app_folder = self.__app_base_folder()
base_test_folder = join(base_app_folder, 'src/androidTest/java')
base_source_folder = join(base_app_folder, 'src/main/java')
base_res_folder = join(base_app_folder, 'src/main/res')
packge_path = self.package_name.split('.')
package_folder = base_source_folder
release_package_folder = join(base_app_folder, 'src/release/java')
debug_package_folder = join(base_app_folder, 'src/debug/java')
test_package_folder = base_test_folder
for folder in packge_path:
package_folder = join(package_folder, folder)
release_package_folder = join(release_package_folder, folder)
debug_package_folder = join(debug_package_folder, folder)
test_package_folder = join(test_package_folder, folder)
self.__create_folder(test_package_folder)
self.__create_folder(package_folder)
self.__create_folder(debug_package_folder)
self.__create_folder(release_package_folder)
self.__create_folder(base_res_folder)
self.__create_folder(join(base_app_folder, 'src/debug/res/values'))
self.__create_folder(join(base_app_folder, 'src/release/res/values'))
def __copy_source_files(self):
files = []
base_app_folder = self.__app_base_folder()
base_res_folder = join(base_app_folder, 'src/main/res/')
base_source_folder = join(base_app_folder, 'src/main/java/')
package_folder = base_source_folder
packge_path = self.package_name.split('.')
for folder in packge_path:
package_folder = join(package_folder, folder)
for root, dirs, files in os.walk('template/'):
for d in dirs:
if d == 'res_folders':
self.__copytree(join(root, d), base_res_folder)
elif d == 'source_folders':
self.__copytree(join(root, d), package_folder)
for f in files:
filepath = join(root, f)
if filepath in ['template/.gitignore', 'template/build.gradle', 'template/settings.gradle']:
self.__copy_files(self.output_folder, {f})
elif filepath == 'template/App/build.gradle':
shutil.copyfile(filepath, join(base_app_folder, f))
elif filepath == 'template/App/gradle.properties':
shutil.copyfile(filepath, join(base_app_folder, f))
elif filepath == 'template/App/AndroidManifest.xml':
shutil.copyfile(filepath, join(join(base_app_folder, 'src/main'), f))
elif filepath == 'template/App/release_strings.xml':
shutil.copyfile(filepath, join(base_app_folder, 'src/release/res/values/strings.xml'))
elif filepath == 'template/App/debug_strings.xml':
shutil.copyfile(filepath, join(base_app_folder, 'src/debug/res/values/strings.xml'))
#Rename android.app.Application Subclass
os.rename(join(package_folder, 'App.java'), join(package_folder, self.app_class_prefix + 'App.java'))
#Rename our ContentProvider
data_folder = join(package_folder, 'data')
os.rename(join(data_folder, 'AppContentProvider.java'), join(data_folder, self.app_class_prefix + 'ContentProvider.java'))
def __create_folder(self, folder_path):
if not os.path.exists(folder_path):
print 'Creating folder ' + folder_path
os.makedirs(folder_path)
def __run_replacement(self):
for root, dirs, files in os.walk(self.output_folder):
for filename in files:
fname = join(root, filename)
contents = open(fname).read()
out = open(fname, 'w')
for i in self.replacements.keys():
contents = contents.replace(i, str(self.replacements[i]))
out.write(contents)
out.close()
def __copy_files(self, output_base, files={}):
for f in files:
shutil.copyfile('template/' + f, join(output_base, f))
def __copytree(self, src, dst, symlinks=False, ignore=None):
for item in os.listdir(src):
s = os.path.join(src, item)
d = os.path.join(dst, item)
if os.path.isdir(s):
shutil.copytree(s, d, symlinks, ignore)
else:
shutil.copy2(s, d)
def __app_base_folder(self):
return join(self.output_folder, 'app')
def create(self):
self.__create_output_folder()
self.__create_readme()
self.__create_folder_structure()
self.__copy_source_files()
self.__run_replacement()
def create_app(app_name, package_name, app_class_prefix,
compile_sdk_version, min_sdk_version, target_sdk_version, output_folder=None):
if output_folder is None:
output_folder = app_name + 'Project'
template = TemplateWriter(app_name, package_name, app_class_prefix,
compile_sdk_version, min_sdk_version, target_sdk_version, output_folder)
template.create()
def main():
parser = argparse.ArgumentParser(description='Create an Android App skeleton')
parser.add_argument('app_name', metavar='APP_NAME', help='the name of the generated application')
parser.add_argument('package_name', metavar='PACKAGE', help='the name of the generated package')
parser.add_argument('app_class_prefix', metavar='PREFIX', help="prefix for import classes. Eg 'Weather' for WeatherApp and WeatherContentProvider")
parser.add_argument('compile_sdk_version', metavar='COMPILE_SDK_VERSION', type=int, help="Sdk version to use to compile the app. Eg 19")
parser.add_argument('min_sdk_version', metavar='MIN_SDK_VERSION', type=int, help="Minimum sdk version the app targets. Eg 14")
parser.add_argument('target_sdk_version', metavar='TARGET_SDK_VERSION', type=int, help="Target sdk version the app targets. Eg 19")
parser.add_argument('-d', '--output_directory', metavar='OUTPUT_DIR', help="Output direct for the generated project")
args = parser.parse_args()
create_app(args.app_name, args.package_name, args.app_class_prefix,
args.compile_sdk_version, args.min_sdk_version, args.target_sdk_version, args.output_directory)
if __name__ == '__main__':
main()