ScriptCollection 3.5.29__py3-none-any.whl → 3.5.33__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ScriptCollection/Executables.py +16 -0
- ScriptCollection/GeneralUtilities.py +882 -873
- ScriptCollection/ScriptCollectionCore.py +10 -14
- ScriptCollection/TasksForCommonProjectStructure.py +138 -22
- {ScriptCollection-3.5.29.dist-info → ScriptCollection-3.5.33.dist-info}/METADATA +21 -21
- ScriptCollection-3.5.33.dist-info/RECORD +16 -0
- {ScriptCollection-3.5.29.dist-info → ScriptCollection-3.5.33.dist-info}/WHEEL +1 -1
- {ScriptCollection-3.5.29.dist-info → ScriptCollection-3.5.33.dist-info}/entry_points.txt +1 -0
- ScriptCollection-3.5.29.dist-info/RECORD +0 -16
- {ScriptCollection-3.5.29.dist-info → ScriptCollection-3.5.33.dist-info}/top_level.txt +0 -0
|
@@ -31,7 +31,7 @@ from .ProgramRunnerBase import ProgramRunnerBase
|
|
|
31
31
|
from .ProgramRunnerPopen import ProgramRunnerPopen
|
|
32
32
|
from .ProgramRunnerEpew import ProgramRunnerEpew, CustomEpewArgument
|
|
33
33
|
|
|
34
|
-
version = "3.5.
|
|
34
|
+
version = "3.5.33"
|
|
35
35
|
__version__ = version
|
|
36
36
|
|
|
37
37
|
|
|
@@ -1719,26 +1719,22 @@ chmod {permission} {link_file}
|
|
|
1719
1719
|
GeneralUtilities.write_lines_to_file(file, lines)
|
|
1720
1720
|
|
|
1721
1721
|
@GeneralUtilities.check_arguments
|
|
1722
|
-
def get_external_ip(self
|
|
1723
|
-
information = self.get_externalnetworkinformation_as_json_string(
|
|
1722
|
+
def get_external_ip(self) -> str:
|
|
1723
|
+
information = self.get_externalnetworkinformation_as_json_string()
|
|
1724
1724
|
parsed = json.loads(information)
|
|
1725
|
-
return parsed.
|
|
1725
|
+
return parsed.IPAddress
|
|
1726
1726
|
|
|
1727
1727
|
@GeneralUtilities.check_arguments
|
|
1728
|
-
def get_country_of_external_ip(self
|
|
1729
|
-
information = self.get_externalnetworkinformation_as_json_string(
|
|
1728
|
+
def get_country_of_external_ip(self) -> str:
|
|
1729
|
+
information = self.get_externalnetworkinformation_as_json_string()
|
|
1730
1730
|
parsed = json.loads(information)
|
|
1731
|
-
return parsed.
|
|
1731
|
+
return parsed.Country
|
|
1732
1732
|
|
|
1733
1733
|
@GeneralUtilities.check_arguments
|
|
1734
|
-
def get_externalnetworkinformation_as_json_string(self
|
|
1735
|
-
proxies = None
|
|
1736
|
-
if GeneralUtilities.string_has_content(proxy):
|
|
1737
|
-
proxies = {"http": proxy}
|
|
1734
|
+
def get_externalnetworkinformation_as_json_string(self) -> str:
|
|
1738
1735
|
headers = {'Cache-Control': 'no-cache'}
|
|
1739
|
-
response = requests.get('https://
|
|
1740
|
-
network_information_as_json_string = GeneralUtilities.bytes_to_string(
|
|
1741
|
-
response.content)
|
|
1736
|
+
response = requests.get('https://clientinformation.anion327.de/API/v1/ClientInformationBackendController/Information', timeout=5, headers=headers)
|
|
1737
|
+
network_information_as_json_string = GeneralUtilities.bytes_to_string(response.content)
|
|
1742
1738
|
return network_information_as_json_string
|
|
1743
1739
|
|
|
1744
1740
|
@GeneralUtilities.check_arguments
|
|
@@ -753,7 +753,7 @@ class TasksForCommonProjectStructure:
|
|
|
753
753
|
for file in GeneralUtilities.get_all_files_of_folder(src_folder)+GeneralUtilities.get_all_files_of_folder(tests_folder):
|
|
754
754
|
relative_file_path_in_repository = os.path.relpath(file, repository_folder)
|
|
755
755
|
if file.endswith(".py") and os.path.getsize(file) > 0 and not self.__sc.file_is_git_ignored(relative_file_path_in_repository, repository_folder):
|
|
756
|
-
GeneralUtilities.write_message_to_stdout(f"Check for linting-issues in {os.path.relpath(file,os.path.join(repository_folder,codeunitname))}.")
|
|
756
|
+
GeneralUtilities.write_message_to_stdout(f"Check for linting-issues in {os.path.relpath(file, os.path.join(repository_folder, codeunitname))}.")
|
|
757
757
|
linting_result = self.__sc.python_file_has_errors(file, repository_folder)
|
|
758
758
|
if (linting_result[0]):
|
|
759
759
|
errors_found = True
|
|
@@ -1102,9 +1102,7 @@ class TasksForCommonProjectStructure:
|
|
|
1102
1102
|
raise ValueError(f"Repository '{repository_folder}' has uncommitted changes.")
|
|
1103
1103
|
|
|
1104
1104
|
@GeneralUtilities.check_arguments
|
|
1105
|
-
def ensure_certificate_authority_for_development_purposes_is_generated(self,
|
|
1106
|
-
folder_of_current_file = os.path.dirname(script_file)
|
|
1107
|
-
product_folder: str = GeneralUtilities.resolve_relative_path("../..", folder_of_current_file)
|
|
1105
|
+
def ensure_certificate_authority_for_development_purposes_is_generated(self, product_folder: str):
|
|
1108
1106
|
product_name: str = os.path.basename(product_folder)
|
|
1109
1107
|
now = datetime.now()
|
|
1110
1108
|
ca_name = f"{product_name}CA_{now.year:04}{now.month:02}{now.day:02}{now.hour:02}{now.min:02}{now.second:02}"
|
|
@@ -1112,13 +1110,22 @@ class TasksForCommonProjectStructure:
|
|
|
1112
1110
|
generate_certificate = True
|
|
1113
1111
|
if os.path.isdir(ca_folder):
|
|
1114
1112
|
try:
|
|
1115
|
-
ca_file =
|
|
1116
|
-
certificate_is_valid = True # TODO check if certificate is
|
|
1113
|
+
ca_file = [file for file in GeneralUtilities.get_direct_files_of_folder(ca_folder) if file.endswith(".crt")][-1] # pylint:disable=unused-variable
|
|
1114
|
+
certificate_is_valid = True # TODO check if certificate is really valid
|
|
1117
1115
|
generate_certificate = not certificate_is_valid
|
|
1118
1116
|
except FileNotFoundError:
|
|
1119
1117
|
pass
|
|
1120
1118
|
if generate_certificate:
|
|
1121
1119
|
self.__sc.generate_certificate_authority(ca_folder, ca_name, "DE", "SubjST", "SubjL", "SubjO", "SubjOU")
|
|
1120
|
+
# TODO add switch to auto-install the script if desired
|
|
1121
|
+
# for windows: powershell Import-Certificate -FilePath ConSurvCA_20241121000236.crt -CertStoreLocation 'Cert:\CurrentUser\Root'
|
|
1122
|
+
# for linux: (TODO)
|
|
1123
|
+
|
|
1124
|
+
@GeneralUtilities.check_arguments
|
|
1125
|
+
def generate_certificate_for_development_purposes_for_product(self, repository_folder: str):
|
|
1126
|
+
product_name = os.path.basename(repository_folder)
|
|
1127
|
+
ca_folder: str = os.path.join(repository_folder, "Other", "Resources", "CA")
|
|
1128
|
+
self.__generate_certificate_for_development_purposes(product_name, os.path.join(repository_folder, "Other", "Resources"), ca_folder, None)
|
|
1122
1129
|
|
|
1123
1130
|
@GeneralUtilities.check_arguments
|
|
1124
1131
|
def generate_certificate_for_development_purposes_for_external_service(self, service_folder: str, domain: str = None):
|
|
@@ -1160,6 +1167,15 @@ class TasksForCommonProjectStructure:
|
|
|
1160
1167
|
self.__sc.sign_certificate(certificate_folder, ca_folder, ca_name, domain, resource_content_filename)
|
|
1161
1168
|
GeneralUtilities.ensure_file_does_not_exist(unsignedcertificate_file)
|
|
1162
1169
|
|
|
1170
|
+
@GeneralUtilities.check_arguments
|
|
1171
|
+
def copy_product_resource_to_codeunit_resource_folder(self, codeunit_folder: str, resourcename: str) -> None:
|
|
1172
|
+
src_folder = GeneralUtilities.resolve_relative_path(f"../Other/Resources/{resourcename}", codeunit_folder)
|
|
1173
|
+
GeneralUtilities.assert_condition(os.path.isdir(src_folder), f"Required product-resource {resourcename} does not exist. Expected folder: {src_folder}")
|
|
1174
|
+
trg_folder = GeneralUtilities.resolve_relative_path(f"Other/Resources/{resourcename}", codeunit_folder)
|
|
1175
|
+
GeneralUtilities.ensure_directory_does_not_exist(trg_folder)
|
|
1176
|
+
GeneralUtilities.ensure_directory_exists(trg_folder)
|
|
1177
|
+
GeneralUtilities.copy_content_of_folder(src_folder, trg_folder)
|
|
1178
|
+
|
|
1163
1179
|
@GeneralUtilities.check_arguments
|
|
1164
1180
|
def ensure_product_resource_is_imported(self, codeunit_folder: str, product_resource_name: str) -> None:
|
|
1165
1181
|
product_folder = os.path.dirname(codeunit_folder)
|
|
@@ -1803,7 +1819,7 @@ class TasksForCommonProjectStructure:
|
|
|
1803
1819
|
|
|
1804
1820
|
@GeneralUtilities.check_arguments
|
|
1805
1821
|
def copy_development_certificate_to_default_development_directory(self, codeunit_folder: str, build_environment: str, domain: str = None, certificate_resource_name: str = "DevelopmentCertificate") -> None:
|
|
1806
|
-
if build_environment
|
|
1822
|
+
if build_environment != "Productive":
|
|
1807
1823
|
codeunit_name: str = os.path.basename(codeunit_folder)
|
|
1808
1824
|
if domain is None:
|
|
1809
1825
|
domain = f"{codeunit_name}.test.local".lower()
|
|
@@ -1905,14 +1921,28 @@ class TasksForCommonProjectStructure:
|
|
|
1905
1921
|
else:
|
|
1906
1922
|
raise ValueError("Can not download OpenAPIGenerator.")
|
|
1907
1923
|
|
|
1924
|
+
@GeneralUtilities.check_arguments
|
|
1925
|
+
def generate_api_client_from_dependent_codeunit_in_angular(self, file: str, name_of_api_providing_codeunit: str, generated_program_part_name: str) -> None:
|
|
1926
|
+
codeunit_folder = GeneralUtilities.resolve_relative_path("../..", file)
|
|
1927
|
+
target_subfolder_in_codeunit = f"src/app/generated/{generated_program_part_name}"
|
|
1928
|
+
language = "typescript-angular"
|
|
1929
|
+
self.ensure_openapigenerator_is_available(codeunit_folder)
|
|
1930
|
+
openapigenerator_jar_file = os.path.join(codeunit_folder, "Other", "Resources", "OpenAPIGenerator", "open-api-generator.jar")
|
|
1931
|
+
openapi_spec_file = os.path.join(codeunit_folder, "Other", "Resources", "DependentCodeUnits", name_of_api_providing_codeunit, "APISpecification", f"{name_of_api_providing_codeunit}.latest.api.json")
|
|
1932
|
+
target_folder = os.path.join(codeunit_folder, target_subfolder_in_codeunit)
|
|
1933
|
+
GeneralUtilities.ensure_directory_exists(target_folder)
|
|
1934
|
+
ScriptCollectionCore().run_program("java", f'-jar {openapigenerator_jar_file} generate -i {openapi_spec_file} -g {language} -o {target_folder} --global-property supportingFiles --global-property models --global-property apis', codeunit_folder)
|
|
1935
|
+
|
|
1936
|
+
@GeneralUtilities.check_arguments
|
|
1908
1937
|
def generate_api_client_from_dependent_codeunit_in_dotnet(self, file: str, name_of_api_providing_codeunit: str, base_namespace: str) -> None:
|
|
1909
1938
|
codeunit_folder = GeneralUtilities.resolve_relative_path("../..", file)
|
|
1910
1939
|
codeunit_name = os.path.basename(codeunit_folder)
|
|
1911
1940
|
client_subpath = f"{codeunit_name}/APIClients/{name_of_api_providing_codeunit}"
|
|
1912
1941
|
namespace = f"{base_namespace}.APIClients.{name_of_api_providing_codeunit}"
|
|
1913
|
-
|
|
1942
|
+
target_subfolder_in_codeunit = client_subpath
|
|
1943
|
+
language = "csharp"
|
|
1944
|
+
additional_properties = f"--additional-properties packageName={namespace}"
|
|
1914
1945
|
|
|
1915
|
-
def generate_api_client_from_dependent_codeunit(self, file: str, name_of_api_providing_codeunit: str, target_subfolder_in_codeunit: str, language: str, additional_properties: str) -> None:
|
|
1916
1946
|
codeunit_folder = GeneralUtilities.resolve_relative_path("../..", file)
|
|
1917
1947
|
self.ensure_openapigenerator_is_available(codeunit_folder)
|
|
1918
1948
|
openapigenerator_jar_file = os.path.join(codeunit_folder, "Other", "Resources", "OpenAPIGenerator", "open-api-generator.jar")
|
|
@@ -1991,6 +2021,7 @@ class TasksForCommonProjectStructure:
|
|
|
1991
2021
|
|
|
1992
2022
|
@GeneralUtilities.check_arguments
|
|
1993
2023
|
def add_github_release(self, productname: str, projectversion: str, build_artifacts_folder: str, github_username: str, repository_folder: str, commandline_arguments: list[str]) -> None:
|
|
2024
|
+
GeneralUtilities.write_message_to_stdout(f"Create GitHub-release for {productname}.")
|
|
1994
2025
|
verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, 1)
|
|
1995
2026
|
github_repo = f"{github_username}/{productname}"
|
|
1996
2027
|
artifact_files = []
|
|
@@ -2075,14 +2106,68 @@ class TasksForCommonProjectStructure:
|
|
|
2075
2106
|
GeneralUtilities.write_message_to_stderr("Update dependencies resulted in an error.")
|
|
2076
2107
|
|
|
2077
2108
|
@GeneralUtilities.check_arguments
|
|
2078
|
-
def
|
|
2109
|
+
def generate_tasksfile_from_workspace_file(self, repository_folder: str) -> None:
|
|
2110
|
+
sc: ScriptCollectionCore = ScriptCollectionCore()
|
|
2111
|
+
workspace_file: str = sc.find_file_by_extension(repository_folder, "code-workspace")
|
|
2112
|
+
task_file: str = os.path.join(repository_folder, "Taskfile.yml")
|
|
2113
|
+
lines: list[str] = ["version: '3'", "", "tasks:", ""]
|
|
2114
|
+
workspace_file_content: str = GeneralUtilities.read_text_from_file(workspace_file)
|
|
2115
|
+
jsoncontent = json.loads(workspace_file_content)
|
|
2116
|
+
tasks = jsoncontent["tasks"]["tasks"]
|
|
2117
|
+
tasks.sort(key=lambda x: x["label"].split("/")[-1], reverse=False) # sort by the label of the task
|
|
2118
|
+
for task in tasks:
|
|
2119
|
+
if task["type"] == "shell":
|
|
2120
|
+
description: str = task["label"]
|
|
2121
|
+
name: str = GeneralUtilities.to_pascal_case(description)
|
|
2122
|
+
command = task["command"]
|
|
2123
|
+
relative_script_file = task["command"]
|
|
2124
|
+
|
|
2125
|
+
relative_script_file = "."
|
|
2126
|
+
if "options" in task:
|
|
2127
|
+
options = task["options"]
|
|
2128
|
+
if "cwd" in options:
|
|
2129
|
+
cwd: str = options["cwd"]
|
|
2130
|
+
cwd = cwd.replace("${workspaceFolder}", ".")
|
|
2131
|
+
relative_script_file = cwd
|
|
2132
|
+
if len(relative_script_file) == 0:
|
|
2133
|
+
relative_script_file = "."
|
|
2134
|
+
|
|
2135
|
+
command_with_args = command
|
|
2136
|
+
if "args" in task:
|
|
2137
|
+
args = task["args"]
|
|
2138
|
+
if len(args) > 1:
|
|
2139
|
+
command_with_args = f"{command_with_args} {' '.join(args)}"
|
|
2140
|
+
|
|
2141
|
+
lines.append(f" {name}:")
|
|
2142
|
+
lines.append(f' desc: "{description}"')
|
|
2143
|
+
lines.append(f' dir: "{cwd}"')
|
|
2144
|
+
lines.append(" cmds:")
|
|
2145
|
+
lines.append(f" - {command_with_args} {{{{.CLI_ARGS}}}}")
|
|
2146
|
+
lines.append(' aliases:')
|
|
2147
|
+
lines.append(f' - {name.lower()}')
|
|
2148
|
+
if "aliases" in task:
|
|
2149
|
+
aliases = task["aliases"]
|
|
2150
|
+
for alias in aliases:
|
|
2151
|
+
lines.append(f' - {alias}')
|
|
2152
|
+
lines.append("")
|
|
2153
|
+
GeneralUtilities.write_lines_to_file(task_file, lines)
|
|
2154
|
+
|
|
2155
|
+
@GeneralUtilities.check_arguments
|
|
2156
|
+
def start_local_test_service(self, file: str):
|
|
2079
2157
|
example_folder = os.path.dirname(file)
|
|
2080
2158
|
docker_compose_file = os.path.join(example_folder, "docker-compose.yml")
|
|
2081
2159
|
for service in self.__sc.get_services_from_yaml_file(docker_compose_file):
|
|
2082
2160
|
self.__sc.kill_docker_container(service)
|
|
2083
2161
|
example_name = os.path.basename(example_folder)
|
|
2084
2162
|
title = f"Test{example_name}"
|
|
2085
|
-
self.__sc.run_program("docker", f"compose -p {title.lower()} up", example_folder, title=title)
|
|
2163
|
+
self.__sc.run_program("docker", f"compose -p {title.lower()} up -d --abort-on-container-exit", example_folder, title=title)
|
|
2164
|
+
|
|
2165
|
+
@GeneralUtilities.check_arguments
|
|
2166
|
+
def stop_local_test_service(self, file: str):
|
|
2167
|
+
example_folder = os.path.dirname(file)
|
|
2168
|
+
example_name = os.path.basename(example_folder)
|
|
2169
|
+
title = f"Test{example_name}"
|
|
2170
|
+
self.__sc.run_program("docker", f"compose -p {title.lower()} down", example_folder, title=title)
|
|
2086
2171
|
|
|
2087
2172
|
@GeneralUtilities.check_arguments
|
|
2088
2173
|
def standardized_tasks_update_version_in_docker_examples(self, file, codeunit_version) -> None:
|
|
@@ -2099,14 +2184,12 @@ class TasksForCommonProjectStructure:
|
|
|
2099
2184
|
GeneralUtilities.write_text_to_file(docker_compose_file, replaced)
|
|
2100
2185
|
|
|
2101
2186
|
@GeneralUtilities.check_arguments
|
|
2102
|
-
def
|
|
2187
|
+
def start_dockerfile_example(self, current_file: str, verbosity: int, remove_old_container: bool, remove_volumes_folder: bool, commandline_arguments: list[str]) -> None:
|
|
2103
2188
|
verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
|
|
2104
2189
|
folder = os.path.dirname(current_file)
|
|
2105
2190
|
example_name = os.path.basename(folder)
|
|
2106
|
-
GeneralUtilities.write_message_to_stdout(f'Run "{example_name}"-example')
|
|
2107
|
-
sc = ScriptCollectionCore()
|
|
2108
2191
|
oci_image_artifacts_folder = GeneralUtilities.resolve_relative_path("../../../../Artifacts/BuildResult_OCIImage", folder)
|
|
2109
|
-
image_filename = os.path.basename(
|
|
2192
|
+
image_filename = os.path.basename(self.__sc.find_file_by_extension(oci_image_artifacts_folder, "tar"))
|
|
2110
2193
|
codeunit_name = os.path.basename(GeneralUtilities.resolve_relative_path("../../../../..", folder))
|
|
2111
2194
|
if remove_old_container:
|
|
2112
2195
|
docker_compose_file = f"{folder}/docker-compose.yml"
|
|
@@ -2118,19 +2201,27 @@ class TasksForCommonProjectStructure:
|
|
|
2118
2201
|
GeneralUtilities.write_message_to_stdout(f"Ensure container of {docker_compose_file} do not exist...")
|
|
2119
2202
|
for container_name in container_names:
|
|
2120
2203
|
GeneralUtilities.write_message_to_stdout(f"Ensure container of {container_name} does not exist")
|
|
2121
|
-
|
|
2204
|
+
self.__sc.run_program("docker", f"container rm -f {container_name}", oci_image_artifacts_folder, verbosity=0, throw_exception_if_exitcode_is_not_zero=False)
|
|
2122
2205
|
if remove_volumes_folder:
|
|
2123
2206
|
volumes_folder = os.path.join(folder, "Volumes")
|
|
2124
2207
|
GeneralUtilities.write_message_to_stdout(f"Ensure volumes-folder '{volumes_folder}' does not exist...")
|
|
2125
2208
|
GeneralUtilities.ensure_directory_does_not_exist(volumes_folder)
|
|
2126
2209
|
GeneralUtilities.ensure_directory_exists(volumes_folder)
|
|
2127
2210
|
GeneralUtilities.write_message_to_stdout("Load docker-image...")
|
|
2128
|
-
|
|
2211
|
+
self.__sc.run_program("docker", f"load -i {image_filename}", oci_image_artifacts_folder, verbosity=verbosity)
|
|
2129
2212
|
docker_project_name = f"{codeunit_name}_{example_name}".lower()
|
|
2130
|
-
sc_epew = ScriptCollectionCore()
|
|
2131
|
-
sc_epew.program_runner = ProgramRunnerEpew()
|
|
2132
2213
|
GeneralUtilities.write_message_to_stdout("Start docker-container...")
|
|
2133
|
-
|
|
2214
|
+
self.__sc.run_program("docker", f"compose --project-name {docker_project_name} up --abort-on-container-exit -d", folder, verbosity=verbosity)
|
|
2215
|
+
|
|
2216
|
+
@GeneralUtilities.check_arguments
|
|
2217
|
+
def stop_dockerfile_example(self, current_file: str, verbosity: int, remove_old_container: bool, remove_volumes_folder: bool, commandline_arguments: list[str]) -> None:
|
|
2218
|
+
verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
|
|
2219
|
+
folder = os.path.dirname(current_file)
|
|
2220
|
+
example_name = os.path.basename(folder)
|
|
2221
|
+
codeunit_name = os.path.basename(GeneralUtilities.resolve_relative_path("../../../../..", folder))
|
|
2222
|
+
docker_project_name = f"{codeunit_name}_{example_name}".lower()
|
|
2223
|
+
GeneralUtilities.write_message_to_stdout("Stop docker-container...")
|
|
2224
|
+
self.__sc.run_program("docker", f"compose --project-name {docker_project_name} down", folder, verbosity=verbosity)
|
|
2134
2225
|
|
|
2135
2226
|
@GeneralUtilities.check_arguments
|
|
2136
2227
|
def create_artifact_for_development_certificate(self, codeunit_folder: str):
|
|
@@ -2271,7 +2362,7 @@ class TasksForCommonProjectStructure:
|
|
|
2271
2362
|
changelog_folder = os.path.join(repository_folder, "Other", "Resources", "Changelog")
|
|
2272
2363
|
changelog_file = os.path.join(changelog_folder, f"v{project_version}.md")
|
|
2273
2364
|
if not os.path.isfile(changelog_file):
|
|
2274
|
-
raise ValueError(f"Changelog-file '{changelog_file}' does not exist.")
|
|
2365
|
+
raise ValueError(f"Changelog-file '{changelog_file}' does not exist. Try creating it using 'sccreatechangelogentry' for example.")
|
|
2275
2366
|
|
|
2276
2367
|
@GeneralUtilities.check_arguments
|
|
2277
2368
|
def __check_whether_security_txt_exists(self, repository_folder: str) -> None:
|
|
@@ -2606,6 +2697,13 @@ class TasksForCommonProjectStructure:
|
|
|
2606
2697
|
codeunits = self.get_codeunits(repository_folder)
|
|
2607
2698
|
updated_dependencies = False
|
|
2608
2699
|
verbosity: int = 1 # TODO set value dynamically
|
|
2700
|
+
update_dependencies_script_filename = "UpdateDependencies.py"
|
|
2701
|
+
# update dependencies of resources
|
|
2702
|
+
global_scripts_folder = os.path.join(repository_folder, "Other", "Scripts")
|
|
2703
|
+
if os.path.isfile(os.path.join(global_scripts_folder, update_dependencies_script_filename)):
|
|
2704
|
+
self.__sc.run_program("python", update_dependencies_script_filename, global_scripts_folder)
|
|
2705
|
+
|
|
2706
|
+
# update dependencies of codeunits
|
|
2609
2707
|
for codeunit in codeunits:
|
|
2610
2708
|
codeunit_file = os.path.join(repository_folder, codeunit, f"{codeunit}.codeunit.xml")
|
|
2611
2709
|
codeunit_has_updatable_dependencies = self.codeunit_has_updatable_dependencies(codeunit_file)
|
|
@@ -2613,7 +2711,7 @@ class TasksForCommonProjectStructure:
|
|
|
2613
2711
|
codeunit_folder = os.path.join(repository_folder, codeunit)
|
|
2614
2712
|
update_dependencies_script_folder = os.path.join(codeunit_folder, "Other")
|
|
2615
2713
|
GeneralUtilities.ensure_directory_exists(os.path.join(update_dependencies_script_folder, "Resources", "CodeAnalysisResult"))
|
|
2616
|
-
self.__sc.run_program("python",
|
|
2714
|
+
self.__sc.run_program("python", update_dependencies_script_filename, update_dependencies_script_folder, verbosity)
|
|
2617
2715
|
if self.__sc.git_repository_has_uncommitted_changes(repository_folder):
|
|
2618
2716
|
updated_dependencies = True
|
|
2619
2717
|
version_of_project = self.get_version_of_project(repository_folder)
|
|
@@ -2644,6 +2742,7 @@ class TasksForCommonProjectStructure:
|
|
|
2644
2742
|
|
|
2645
2743
|
@GeneralUtilities.check_arguments
|
|
2646
2744
|
def generic_prepare_new_release(self, generic_prepare_new_release_arguments: GenericPrepareNewReleaseArguments):
|
|
2745
|
+
GeneralUtilities.write_message_to_stdout(f"Prepare release for {generic_prepare_new_release_arguments.product_name}.")
|
|
2647
2746
|
|
|
2648
2747
|
# constants
|
|
2649
2748
|
folder_of_this_file = os.path.dirname(generic_prepare_new_release_arguments.current_file)
|
|
@@ -2688,6 +2787,7 @@ class TasksForCommonProjectStructure:
|
|
|
2688
2787
|
|
|
2689
2788
|
@GeneralUtilities.check_arguments
|
|
2690
2789
|
def generic_create_release(self, generic_create_release_arguments: GenericCreateReleaseArguments) -> tuple[bool, str]:
|
|
2790
|
+
GeneralUtilities.write_message_to_stdout(f"Create release for {generic_create_release_arguments.product_name}.")
|
|
2691
2791
|
folder_of_this_file = os.path.dirname(generic_create_release_arguments.current_file)
|
|
2692
2792
|
build_repository_folder = GeneralUtilities.resolve_relative_path("../..", folder_of_this_file)
|
|
2693
2793
|
repository_folder_name = generic_create_release_arguments.product_name
|
|
@@ -2733,8 +2833,24 @@ class TasksForCommonProjectStructure:
|
|
|
2733
2833
|
self.commandline_arguments = commandline_arguments
|
|
2734
2834
|
self.main_branch_name = "main"
|
|
2735
2835
|
|
|
2836
|
+
@GeneralUtilities.check_arguments
|
|
2837
|
+
def create_changelog_entry(self, repositoryfolder: str, message: str, commit: bool):
|
|
2838
|
+
current_version = self.get_version_of_project(repositoryfolder)
|
|
2839
|
+
changelog_file = os.path.join(repositoryfolder, "Other", "Resources", "Changelog", f"v{current_version}.md")
|
|
2840
|
+
if os.path.isdir(changelog_file):
|
|
2841
|
+
raise ValueError(f"Changelogfile {changelog_file} already exists.")
|
|
2842
|
+
else:
|
|
2843
|
+
GeneralUtilities.ensure_file_exists(changelog_file)
|
|
2844
|
+
GeneralUtilities.write_text_to_file(changelog_file, f"""# Release notes
|
|
2845
|
+
|
|
2846
|
+
## Changes
|
|
2847
|
+
|
|
2848
|
+
- {message}
|
|
2849
|
+
""")
|
|
2850
|
+
|
|
2736
2851
|
@GeneralUtilities.check_arguments
|
|
2737
2852
|
def update_http_documentation(self, update_http_documentation_arguments: UpdateHTTPDocumentationArguments):
|
|
2853
|
+
GeneralUtilities.write_message_to_stdout(f"Update HTTP-documentation for for {update_http_documentation_arguments.product_name}.")
|
|
2738
2854
|
folder_of_this_file = str(os.path.dirname(update_http_documentation_arguments.current_file))
|
|
2739
2855
|
|
|
2740
2856
|
ref_repo = GeneralUtilities.resolve_relative_path(f"../../Submodules/{update_http_documentation_arguments.reference_repository_name}", folder_of_this_file)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ScriptCollection
|
|
3
|
-
Version: 3.5.
|
|
3
|
+
Version: 3.5.33
|
|
4
4
|
Summary: The ScriptCollection is the place for reusable scripts.
|
|
5
5
|
Home-page: https://github.com/anionDev/ScriptCollection
|
|
6
6
|
Author: Marius Göcke
|
|
@@ -22,26 +22,26 @@ Classifier: Topic :: Terminals
|
|
|
22
22
|
Classifier: Topic :: Utilities
|
|
23
23
|
Requires-Python: >=3.10
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
25
|
-
Requires-Dist: build
|
|
26
|
-
Requires-Dist: coverage
|
|
27
|
-
Requires-Dist: cyclonedx-bom
|
|
28
|
-
Requires-Dist: defusedxml
|
|
29
|
-
Requires-Dist: keyboard
|
|
30
|
-
Requires-Dist: lcov-cobertura
|
|
31
|
-
Requires-Dist: lxml
|
|
32
|
-
Requires-Dist: ntplib
|
|
33
|
-
Requires-Dist: Pillow
|
|
34
|
-
Requires-Dist: pycdlib
|
|
35
|
-
Requires-Dist: Pygments
|
|
36
|
-
Requires-Dist: pylint
|
|
37
|
-
Requires-Dist: pyOpenSSL
|
|
38
|
-
Requires-Dist: PyPDF2
|
|
39
|
-
Requires-Dist: pytest
|
|
40
|
-
Requires-Dist: PyYAML
|
|
41
|
-
Requires-Dist: qrcode
|
|
42
|
-
Requires-Dist: send2trash
|
|
43
|
-
Requires-Dist: twine
|
|
44
|
-
Requires-Dist: xmlschema
|
|
25
|
+
Requires-Dist: build>=1.2.2.post1
|
|
26
|
+
Requires-Dist: coverage>=7.6.8
|
|
27
|
+
Requires-Dist: cyclonedx-bom>=5.1.1
|
|
28
|
+
Requires-Dist: defusedxml>=0.7.1
|
|
29
|
+
Requires-Dist: keyboard>=0.13.5
|
|
30
|
+
Requires-Dist: lcov-cobertura>=2.0.2
|
|
31
|
+
Requires-Dist: lxml>=5.3.0
|
|
32
|
+
Requires-Dist: ntplib>=0.4.0
|
|
33
|
+
Requires-Dist: Pillow>=11.0.0
|
|
34
|
+
Requires-Dist: pycdlib>=1.14.0
|
|
35
|
+
Requires-Dist: Pygments>=2.18.0
|
|
36
|
+
Requires-Dist: pylint>=3.3.1
|
|
37
|
+
Requires-Dist: pyOpenSSL>=24.2.1
|
|
38
|
+
Requires-Dist: PyPDF2>=3.0.1
|
|
39
|
+
Requires-Dist: pytest>=8.3.3
|
|
40
|
+
Requires-Dist: PyYAML>=6.0.2
|
|
41
|
+
Requires-Dist: qrcode>=8.0
|
|
42
|
+
Requires-Dist: send2trash>=1.8.3
|
|
43
|
+
Requires-Dist: twine>=5.1.1
|
|
44
|
+
Requires-Dist: xmlschema>=3.4.3
|
|
45
45
|
|
|
46
46
|
# ScriptCollection
|
|
47
47
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
ScriptCollection/Executables.py,sha256=0JitZCU2j3N--HREXpTAckPbf7RQ-Q-DER79lnFidLE,20819
|
|
2
|
+
ScriptCollection/GeneralUtilities.py,sha256=S_JX32I4fMpjwIzIinZT72TZ2r7rM736QNSA-ke-ET8,36347
|
|
3
|
+
ScriptCollection/ProcessesRunner.py,sha256=3mu4ZxzZleQo0Op6o9EYTCFiJfb6kx5ov2YfZfT89mU,1395
|
|
4
|
+
ScriptCollection/ProgramRunnerBase.py,sha256=7QAjoqOz6XPmJH19F2k-Z1fFQB_uZnPFvn-T54IJcHQ,2324
|
|
5
|
+
ScriptCollection/ProgramRunnerEpew.py,sha256=C2Rs3YWOWWWJct7XmKphp5CF1tf0j4Fp-ljV2drLTfs,6349
|
|
6
|
+
ScriptCollection/ProgramRunnerPopen.py,sha256=G3LgQUVCfaq7XjBsGzalElH31Hbr0etttGR2_H87YzA,3512
|
|
7
|
+
ScriptCollection/RPStream.py,sha256=NRRHL3YSP3D9MuAV2jB_--0KUKCsvJGxeKnxgrRZ9kY,1545
|
|
8
|
+
ScriptCollection/ScriptCollectionCore.py,sha256=Ua_HKThGL3Gk3SmsZsVpdbgfyMyVd_694ET9wCr88FA,101810
|
|
9
|
+
ScriptCollection/TasksForCommonProjectStructure.py,sha256=fr95VKSDk_WiqzypEPrNDEo07fvhTY7MNhkhtmN3uBo,201583
|
|
10
|
+
ScriptCollection/UpdateCertificates.py,sha256=Eynbgu7k9jLxApP2D_8Il77B6BFjJap6K7oTeEAZYbk,7790
|
|
11
|
+
ScriptCollection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
+
ScriptCollection-3.5.33.dist-info/METADATA,sha256=nr5rTtr40e-9LQWs68mEDlAnd6zQ670l3sVP1Fd0ZME,7664
|
|
13
|
+
ScriptCollection-3.5.33.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
|
14
|
+
ScriptCollection-3.5.33.dist-info/entry_points.txt,sha256=_O7BmQ81LdDfrj5uOhjshg9Xc-tABHQJIxDOyOGRzzI,2397
|
|
15
|
+
ScriptCollection-3.5.33.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
|
|
16
|
+
ScriptCollection-3.5.33.dist-info/RECORD,,
|
|
@@ -5,6 +5,7 @@ scbuildcodeunitsc = ScriptCollection.Executables:BuildCodeUnitsC
|
|
|
5
5
|
sccalculatebitcoinblockhash = ScriptCollection.Executables:CalculateBitcoinBlockHash
|
|
6
6
|
scchangefileextension = ScriptCollection.Executables:ChangeFileExtensions
|
|
7
7
|
scchangehashofprogram = ScriptCollection.Executables:ChangeHashOfProgram
|
|
8
|
+
sccreatechangelogentry = ScriptCollection.Executables:CreateChangelogEntry
|
|
8
9
|
sccreateemptyfilewithspecificsize = ScriptCollection.Executables:CreateEmptyFileWithSpecificSize
|
|
9
10
|
sccreatehashofallfiles = ScriptCollection.Executables:CreateHashOfAllFiles
|
|
10
11
|
sccreateisofilewithobfuscatedfiles = ScriptCollection.Executables:CreateISOFileWithObfuscatedFiles
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
ScriptCollection/Executables.py,sha256=57f2bopoRUchbyyCZTseBk0ynEyHfXc2u4-LraxI7qg,20161
|
|
2
|
-
ScriptCollection/GeneralUtilities.py,sha256=AElXv2NO30cTw-Qs3qVmO-YCOQ5FvBQM3RZMywuKQ_Y,35121
|
|
3
|
-
ScriptCollection/ProcessesRunner.py,sha256=3mu4ZxzZleQo0Op6o9EYTCFiJfb6kx5ov2YfZfT89mU,1395
|
|
4
|
-
ScriptCollection/ProgramRunnerBase.py,sha256=7QAjoqOz6XPmJH19F2k-Z1fFQB_uZnPFvn-T54IJcHQ,2324
|
|
5
|
-
ScriptCollection/ProgramRunnerEpew.py,sha256=C2Rs3YWOWWWJct7XmKphp5CF1tf0j4Fp-ljV2drLTfs,6349
|
|
6
|
-
ScriptCollection/ProgramRunnerPopen.py,sha256=G3LgQUVCfaq7XjBsGzalElH31Hbr0etttGR2_H87YzA,3512
|
|
7
|
-
ScriptCollection/RPStream.py,sha256=NRRHL3YSP3D9MuAV2jB_--0KUKCsvJGxeKnxgrRZ9kY,1545
|
|
8
|
-
ScriptCollection/ScriptCollectionCore.py,sha256=hJFDTk5gJtTECbWX7m92Q63Ts95ZMN-_dh3tRypLLWs,101921
|
|
9
|
-
ScriptCollection/TasksForCommonProjectStructure.py,sha256=YrCDXbGUIyR_pNH70yq90fRSmIncUia_TCWwFxcY_dc,194282
|
|
10
|
-
ScriptCollection/UpdateCertificates.py,sha256=Eynbgu7k9jLxApP2D_8Il77B6BFjJap6K7oTeEAZYbk,7790
|
|
11
|
-
ScriptCollection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
-
ScriptCollection-3.5.29.dist-info/METADATA,sha256=nYenV-RxLarp4trAzLJVDInmTv-59RNoSvWcOsL5HPE,7684
|
|
13
|
-
ScriptCollection-3.5.29.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
|
|
14
|
-
ScriptCollection-3.5.29.dist-info/entry_points.txt,sha256=yASwR6hWZ_b5d4W49YeX1htD8ngfWbwgjpfQiJdtUAU,2322
|
|
15
|
-
ScriptCollection-3.5.29.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
|
|
16
|
-
ScriptCollection-3.5.29.dist-info/RECORD,,
|
|
File without changes
|