mirror of
https://github.com/ivan-usov-org/bec.git
synced 2025-04-22 02:20:02 +02:00
194 lines
7.3 KiB
Python
194 lines
7.3 KiB
Python
"""
|
|
Helper script to create a new plugin structure
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
|
|
import yaml
|
|
|
|
# current directory:
|
|
current_dir = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
|
|
class PluginStructure:
|
|
"""
|
|
Example usage. Run this script with the target directory as an argument
|
|
It will then automatically create the plugin structure in the target directory
|
|
|
|
>>> python create_plugin_structure.py /path/to/my_plugin
|
|
"""
|
|
|
|
def __init__(self, target_dir):
|
|
"""This class can be used to produce the folder structure
|
|
of BEC. This includes copying templates for the structures
|
|
"""
|
|
self.target_dir = target_dir
|
|
_, self.plugin_name = os.path.split(target_dir)
|
|
self.create_dir("")
|
|
|
|
def create_dir(self, dir_name):
|
|
os.makedirs(os.path.join(self.target_dir, dir_name), exist_ok=True)
|
|
|
|
def create_init_file(self, dir_name):
|
|
init_file = os.path.join(self.target_dir, dir_name, "__init__.py")
|
|
with open(init_file, "w", encoding="utf-8") as f:
|
|
f.write("")
|
|
|
|
def copy_plugin_setup_files(self):
|
|
# copy setup files
|
|
self.copy_toml_file()
|
|
git_hooks = os.path.join(current_dir, "plugin_setup_files", "git_hooks/*")
|
|
self.create_dir(".git_hooks")
|
|
os.system(f"cp -R {git_hooks} {self.target_dir}/.git_hooks/")
|
|
gitignore = os.path.join(current_dir, "plugin_setup_files", "gitignore")
|
|
os.system(f"cp {gitignore} {self.target_dir}/.gitignore")
|
|
|
|
# copy license
|
|
repo_license = os.path.join(current_dir, "plugin_setup_files", "plugin_repo_cliense.md")
|
|
os.system(f"cp {repo_license} {self.target_dir}/LICENSE")
|
|
|
|
def copy_toml_file(self):
|
|
"""Copy the toml file and change the template name in the file"""
|
|
# copy toml file
|
|
toml_file = os.path.join(current_dir, "plugin_setup_files", "pyproject.toml")
|
|
with open(toml_file, "r", encoding="utf-8") as f:
|
|
toml_template_str = f.read()
|
|
# change template name in toml file
|
|
toml_template_str = toml_template_str.replace("{template_name}", self.plugin_name)
|
|
|
|
toml_file = os.path.join(self.target_dir, "pyproject.toml")
|
|
# write toml file
|
|
with open(toml_file, "w", encoding="utf-8") as f:
|
|
f.write(toml_template_str)
|
|
|
|
def add_plugins(self):
|
|
self.create_dir(self.plugin_name)
|
|
self.create_init_file(self.plugin_name)
|
|
|
|
def add_scans(self):
|
|
self.create_dir(f"{self.plugin_name}/scans")
|
|
self.create_init_file(f"{self.plugin_name}/scans")
|
|
|
|
# copy scan_plugin_template.py
|
|
scan_plugin_template_file = os.path.join(
|
|
current_dir, "plugin_setup_files", "scan_plugin_template.py"
|
|
)
|
|
os.system(f"cp {scan_plugin_template_file} {self.target_dir}/{self.plugin_name}/scans")
|
|
|
|
def add_client(self):
|
|
self.create_dir(f"{self.plugin_name}/bec_ipython_client")
|
|
self.create_init_file(f"{self.plugin_name}/bec_ipython_client")
|
|
|
|
# high level interface
|
|
self.create_dir(f"{self.plugin_name}/bec_ipython_client/high_level_interface")
|
|
self.create_init_file(f"{self.plugin_name}/bec_ipython_client/high_level_interface")
|
|
|
|
# plugins
|
|
self.create_dir(f"{self.plugin_name}/bec_ipython_client/plugins")
|
|
self.create_init_file(f"{self.plugin_name}/bec_ipython_client/plugins")
|
|
|
|
# startup
|
|
self.create_dir(f"{self.plugin_name}/bec_ipython_client/startup")
|
|
self.create_init_file(f"{self.plugin_name}/bec_ipython_client/startup")
|
|
|
|
## copy pre_startup.py
|
|
pre_startup_file = os.path.join(current_dir, "plugin_setup_files", "pre_startup.py")
|
|
os.system(
|
|
f"cp {pre_startup_file} {self.target_dir}/{self.plugin_name}/bec_ipython_client/startup"
|
|
)
|
|
## copy post_startup.py
|
|
post_startup_file = os.path.join(current_dir, "plugin_setup_files", "post_startup.py")
|
|
os.system(
|
|
f"cp {post_startup_file} {self.target_dir}/{self.plugin_name}/bec_ipython_client/startup"
|
|
)
|
|
|
|
def add_devices(self):
|
|
self.create_dir(f"{self.plugin_name}/devices")
|
|
self.create_init_file(f"{self.plugin_name}/devices")
|
|
# device template?
|
|
|
|
def add_device_configs(self):
|
|
self.create_dir(f"{self.plugin_name}/device_configs")
|
|
self.create_init_file(f"{self.plugin_name}/device_configs")
|
|
|
|
def add_services(self):
|
|
self.create_dir(f"{self.plugin_name}/services")
|
|
self.create_init_file(f"{self.plugin_name}/services")
|
|
|
|
def add_bec_widgets(self):
|
|
self.create_dir(f"{self.plugin_name}/bec_widgets")
|
|
self.create_init_file(f"{self.plugin_name}/bec_widgets")
|
|
|
|
self.create_dir(f"{self.plugin_name}/bec_widgets/configs")
|
|
self.create_dir(f"{self.plugin_name}/bec_widgets/widgets")
|
|
self.create_init_file(f"{self.plugin_name}/bec_widgets/widgets")
|
|
|
|
def add_file_writer(self):
|
|
self.create_dir(f"{self.plugin_name}/file_writer")
|
|
self.create_init_file(f"{self.plugin_name}/file_writer")
|
|
|
|
def add_deployments(self):
|
|
self.create_dir(f"{self.plugin_name}/deployments")
|
|
self.create_init_file(f"{self.plugin_name}/deployments")
|
|
self.create_dir(f"{self.plugin_name}/deployments/device_server")
|
|
self.create_init_file(f"{self.plugin_name}/deployments/device_server")
|
|
|
|
ds_startup = os.path.join(current_dir, "plugin_setup_files", "setup_device_server.py")
|
|
os.system(
|
|
f"cp {ds_startup} {self.target_dir}/{self.plugin_name}/deployments/device_server/startup.py"
|
|
)
|
|
|
|
def add_gitlab_ci(self):
|
|
out = {
|
|
"include": [
|
|
{
|
|
"project": "bec/awi_utils",
|
|
"file": "/templates/plugin-repo-template.yml",
|
|
"inputs": {"name": self.plugin_name, "target": self.plugin_name},
|
|
}
|
|
]
|
|
}
|
|
with open(os.path.join(self.target_dir, ".gitlab-ci.yml"), "w", encoding="utf-8") as f:
|
|
yaml.dump(out, f)
|
|
|
|
def add_tests(self):
|
|
self.create_dir("tests/tests_bec_ipython_client")
|
|
self.copy_tests_readme("tests/tests_bec_ipython_client")
|
|
self.create_dir("tests/tests_dap_services")
|
|
self.copy_tests_readme("tests/tests_dap_services")
|
|
self.create_dir("tests/tests_bec_widgets")
|
|
self.copy_tests_readme("tests/tests_bec_widgets")
|
|
self.create_dir("tests/tests_devices")
|
|
self.copy_tests_readme("tests/tests_devices")
|
|
self.create_dir("tests/tests_scans")
|
|
self.copy_tests_readme("tests/tests_scans")
|
|
self.create_dir("tests/tests_file_writer")
|
|
self.copy_tests_readme("tests/tests_file_writer")
|
|
|
|
def copy_tests_readme(self, file_path: str):
|
|
readme_file = os.path.join(current_dir, "plugin_setup_files", "README_template_tests.md")
|
|
os.system(f"cp {readme_file} {self.target_dir}/{file_path}/README.md")
|
|
|
|
def add_bin(self):
|
|
self.create_dir("bin")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
struc = PluginStructure(sys.argv[1])
|
|
struc.add_plugins()
|
|
struc.copy_plugin_setup_files()
|
|
struc.add_scans()
|
|
struc.add_client()
|
|
struc.add_devices()
|
|
struc.add_device_configs()
|
|
struc.add_services()
|
|
struc.add_bec_widgets()
|
|
struc.add_file_writer()
|
|
struc.add_tests()
|
|
struc.add_bin()
|
|
struc.add_deployments()
|
|
struc.add_gitlab_ci()
|
|
|
|
print(f"Plugin structure created in {sys.argv[1]}")
|