forked from Ultimaker/Uranium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
create_plugin.py
50 lines (40 loc) · 1.92 KB
/
create_plugin.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
import argparse
import os.path
import zipfile
def checkValidPlugin(path):
# A plugin must be a folder
if not os.path.isdir(path):
return False
# A plugin must contain an __init__.py
if not os.path.isfile(os.path.join(path, "__init__.py")):
return False
# .. and a plugin must contain an plugin.json!
if not os.path.isfile(os.path.join(path, "plugin.json")):
return False
return True
def zipDirectory(path, zip_handle):
# zip_handle is zipfile handle
for root, dirs, files in os.walk(path):
for file in files:
filename = os.path.join(root, file)
if os.path.isfile(filename) and not file.startswith(".git") and ".git" not in root:
_, extension = os.path.splitext(filename)
if extension not in excluded_extentions:
zip_handle.write(os.path.join(root, file), os.path.relpath(os.path.join(root, file), os.path.join(path, '..')))
excluded_extentions = [".pyc"]
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("plugin_location", type = str, help = "Location of plugin folder")
args = parser.parse_args()
full_plugin_path = os.path.join(os.getcwd(), args.plugin_location)
if not checkValidPlugin(full_plugin_path):
print("Provided plug-in location is not a valid plug-in folder.")
exit()
plugin_name = os.path.basename(os.path.normpath(full_plugin_path))
plugin_file_location = plugin_name + ".umplugin"
with zipfile.ZipFile(plugin_file_location, "w") as plugin_zip:
# Ensure that the root folder is created correctly. We need to tell zip to not compress the folder!
subdirectory = zipfile.ZipInfo(plugin_name + "/")
plugin_zip.writestr(subdirectory, "", compress_type = zipfile.ZIP_STORED) #Writing an empty string creates the directory.
zipDirectory(full_plugin_path, plugin_zip)
print("Done!")