ScriptCollection 3.5.2__py3-none-any.whl → 3.5.4__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.
@@ -21,6 +21,7 @@ from .GeneralUtilities import GeneralUtilities
21
21
  from .ScriptCollectionCore import ScriptCollectionCore
22
22
  from .ProgramRunnerEpew import ProgramRunnerEpew
23
23
 
24
+
24
25
  class CreateReleaseConfiguration():
25
26
  projectname: str
26
27
  remotename: str
@@ -169,6 +170,7 @@ class TasksForCommonProjectStructure:
169
170
 
170
171
  @GeneralUtilities.check_arguments
171
172
  def check_testcoverage(self, testcoverage_file_in_cobertura_format: str, repository_folder: str, codeunitname: str) -> None:
173
+ GeneralUtilities.write_message_to_stdout("Check testcoverage..")
172
174
  root: etree._ElementTree = etree.parse(testcoverage_file_in_cobertura_format)
173
175
  if len(root.xpath('//coverage/packages/package')) != 1:
174
176
  raise ValueError(f"'{testcoverage_file_in_cobertura_format}' must contain exactly 1 package.")
@@ -204,6 +206,7 @@ class TasksForCommonProjectStructure:
204
206
 
205
207
  @GeneralUtilities.check_arguments
206
208
  def copy_source_files_to_output_directory(self, buildscript_file: str) -> None:
209
+ GeneralUtilities.write_message_to_stdout("Copy sourcecode...")
207
210
  sc = ScriptCollectionCore()
208
211
  folder = os.path.dirname(os.path.realpath(buildscript_file))
209
212
  codeunit_folder = GeneralUtilities.resolve_relative_path("../..", folder)
@@ -230,8 +233,7 @@ class TasksForCommonProjectStructure:
230
233
  for target in targets:
231
234
  GeneralUtilities.write_message_to_stdout(f"Build package {package_name} for target {target}...")
232
235
  sc = ScriptCollectionCore()
233
- sc.program_runner = ProgramRunnerEpew()
234
- sc.run_program("flutter", f"build {target}", src_folder, verbosity)
236
+ self.run_with_epew("flutter", f"build {target}", src_folder, verbosity)
235
237
  if target == "web":
236
238
  web_relase_folder = os.path.join(src_folder, "build/web")
237
239
  web_folder = os.path.join(artifacts_folder, "BuildResult_WebApplication")
@@ -618,6 +620,8 @@ class TasksForCommonProjectStructure:
618
620
 
619
621
  @GeneralUtilities.check_arguments
620
622
  def __standardized_tasks_build_for_dotnet_build(self, csproj_file: str, originaloutputfolder: str, files_to_sign: dict[str, str], commitid: str, verbosity: int, runtimes: list[str], target_environmenttype: str, target_environmenttype_mapping: dict[str, str], copy_license_file_to_target_folder: bool, repository_folder: str, codeunit_name: str, commandline_arguments: list[str]) -> None:
623
+ csproj_filename = os.path.basename(csproj_file)
624
+ GeneralUtilities.write_message_to_stdout(f"Build {csproj_filename}...")
621
625
  dotnet_build_configuration: str = target_environmenttype_mapping[target_environmenttype]
622
626
  verbosity = self.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
623
627
  codeunit_folder = os.path.join(repository_folder, codeunit_name)
@@ -720,6 +724,7 @@ class TasksForCommonProjectStructure:
720
724
 
721
725
  @GeneralUtilities.check_arguments
722
726
  def generate_sbom_for_dotnet_project(self, codeunit_folder: str, verbosity: int, commandline_arguments: list[str]) -> None:
727
+ GeneralUtilities.write_message_to_stdout("Generate SBOM...")
723
728
  codeunit_name = os.path.basename(codeunit_folder)
724
729
  sc = ScriptCollectionCore()
725
730
  bomfile_folder = "Other\\Artifacts\\BOM"
@@ -764,16 +769,19 @@ class TasksForCommonProjectStructure:
764
769
  which contains a test-coverage-report in the cobertura-format exists.
765
770
  This script expectes that the testcoverage-reportfolder is '<repositorybasefolder>/<codeunitname>/Other/Artifacts/TestCoverageReport'.
766
771
  This script expectes that a test-coverage-badges should be added to '<repositorybasefolder>/<codeunitname>/Other/Resources/Badges'."""
772
+ GeneralUtilities.write_message_to_stdout("Generate testcoverage report..")
767
773
  codeunit_version = self.get_version_of_codeunit(os.path.join(repository_folder, codeunitname, f"{codeunitname}.codeunit.xml"))
768
774
  verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
769
775
  if verbosity == 0:
770
776
  verbose_argument_for_reportgenerator = "Off"
771
- if verbosity == 1:
777
+ elif verbosity == 1:
772
778
  verbose_argument_for_reportgenerator = "Error"
773
- if verbosity == 2:
779
+ elif verbosity == 2:
774
780
  verbose_argument_for_reportgenerator = "Info"
775
- if verbosity == 3:
781
+ elif verbosity == 3:
776
782
  verbose_argument_for_reportgenerator = "Verbose"
783
+ else:
784
+ raise ValueError(f"Unknown value for verbosity: {GeneralUtilities.str_none_safe(verbosity)}")
777
785
 
778
786
  # Generating report
779
787
  GeneralUtilities.ensure_directory_does_not_exist(os.path.join(repository_folder, codeunitname, f"{codeunitname}/Other/Artifacts/TestCoverageReport"))
@@ -786,11 +794,8 @@ class TasksForCommonProjectStructure:
786
794
  history_folder_full = os.path.join(repository_folder, history_folder)
787
795
  GeneralUtilities.ensure_directory_exists(history_folder_full)
788
796
  history_argument = f" -historydir:{history_folder}"
789
- argument = (f"-reports:{codeunitname}/Other/Artifacts/TestCoverage/TestCoverage.xml " +
790
- f"-targetdir:{codeunitname}/Other/Artifacts/TestCoverageReport --verbosity:{verbose_argument_for_reportgenerator}{history_argument} " +
791
- f"-title:{codeunitname} -tag:v{codeunit_version}")
792
- self.__sc.run_program("reportgenerator", argument,
793
- repository_folder, verbosity=verbosity)
797
+ argument = f"-reports:{codeunitname}/Other/Artifacts/TestCoverage/TestCoverage.xml -targetdir:{codeunitname}/Other/Artifacts/TestCoverageReport --verbosity:{verbose_argument_for_reportgenerator}{history_argument} -title:{codeunitname} -tag:v{codeunit_version}"
798
+ self.__sc.run_program("reportgenerator", argument, repository_folder, verbosity=verbosity)
794
799
  if not add_testcoverage_history_entry:
795
800
  os.remove(GeneralUtilities.get_direct_files_of_folder(history_folder_full)[-1])
796
801
 
@@ -800,13 +805,11 @@ class TasksForCommonProjectStructure:
800
805
  fulltestcoverageubfolger = os.path.join(repository_folder, codeunitname, testcoverageubfolger)
801
806
  GeneralUtilities.ensure_directory_does_not_exist(fulltestcoverageubfolger)
802
807
  GeneralUtilities.ensure_directory_exists(fulltestcoverageubfolger)
803
- self.__sc.run_program("reportgenerator", "-reports:Other/Artifacts/TestCoverage/TestCoverage.xml " +
804
- f"-targetdir:{testcoverageubfolger} -reporttypes:Badges " +
805
- f"--verbosity:{verbose_argument_for_reportgenerator}", os.path.join(repository_folder, codeunitname),
806
- verbosity=verbosity)
808
+ self.__sc.run_program("reportgenerator", f"-reports:Other/Artifacts/TestCoverage/TestCoverage.xml -targetdir:{testcoverageubfolger} -reporttypes:Badges --verbosity:{verbose_argument_for_reportgenerator}", os.path.join(repository_folder, codeunitname), verbosity=verbosity)
807
809
 
808
810
  @GeneralUtilities.check_arguments
809
- def standardized_tasks_run_testcases_for_dotnet_project(self, runtestcases_file: str, targetenvironmenttype: str, verbosity: int, generate_badges: bool, target_environmenttype_mapping: dict[str, str], commandline_arguments: list[str]) -> None:
811
+ def standardized_tasks_run_testcases_for_dotnet_project(self, runtestcases_file: str, targetenvironmenttype: str, verbosity: int, generate_badges: bool, target_environmenttype_mapping: dict[str, str], commandline_arguments: list[str]) -> None:
812
+ GeneralUtilities.write_message_to_stdout("Run testcases...")
810
813
  dotnet_build_configuration: str = target_environmenttype_mapping[targetenvironmenttype]
811
814
  codeunit_name: str = os.path.basename(str(Path(os.path.dirname(runtestcases_file)).parent.parent.absolute()))
812
815
  verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
@@ -835,8 +838,7 @@ class TasksForCommonProjectStructure:
835
838
  self.run_testcases_common_post_task(repository_folder, codeunit_name, verbosity, generate_badges, targetenvironmenttype, commandline_arguments)
836
839
 
837
840
  @GeneralUtilities.check_arguments
838
- def run_testcases_common_post_task(self, repository_folder: str, codeunit_name: str, verbosity: int, generate_badges: bool,
839
- targetenvironmenttype: str, commandline_arguments: list[str]) -> None:
841
+ def run_testcases_common_post_task(self, repository_folder: str, codeunit_name: str, verbosity: int, generate_badges: bool, targetenvironmenttype: str, commandline_arguments: list[str]) -> None:
840
842
  coverage_file_folder = os.path.join(repository_folder, codeunit_name, "Other/Artifacts/TestCoverage")
841
843
  coveragefiletarget = os.path.join(coverage_file_folder, "TestCoverage.xml")
842
844
  self.update_path_of_source_in_testcoverage_file(repository_folder, codeunit_name)
@@ -846,6 +848,7 @@ class TasksForCommonProjectStructure:
846
848
  @staticmethod
847
849
  @GeneralUtilities.check_arguments
848
850
  def update_path_of_source_in_testcoverage_file(repository_folder: str, codeunitname: str) -> None:
851
+ GeneralUtilities.write_message_to_stdout("Update paths of source files in testcoverage files..")
849
852
  folder = f"{repository_folder}/{codeunitname}/Other/Artifacts/TestCoverage"
850
853
  filename = "TestCoverage.xml"
851
854
  full_file = os.path.join(folder, filename)
@@ -857,8 +860,7 @@ class TasksForCommonProjectStructure:
857
860
  filename = match.group(1)
858
861
  file = os.path.join(source, filename)
859
862
  # GeneralUtilities.assert_condition(os.path.isfile(file),f"File \"{file}\" does not exist.")
860
- GeneralUtilities.assert_condition(file.startswith(codeunit_folder),
861
- f"Unexpected path for coverage-file. File: \"{file}\"; codeunitfolder: \"{codeunit_folder}\"")
863
+ GeneralUtilities.assert_condition(file.startswith(codeunit_folder), f"Unexpected path for coverage-file. File: \"{file}\"; codeunitfolder: \"{codeunit_folder}\"")
862
864
  filename_relative = f".{file[len(codeunit_folder):]}"
863
865
  return f'filename="{filename_relative}"'
864
866
 
@@ -868,15 +870,15 @@ class TasksForCommonProjectStructure:
868
870
  root: etree._ElementTree = etree.parse(testcoveragefile)
869
871
  codeunit_folder = os.path.join(repository_folder, codeunit_name)
870
872
  xpath = f"//coverage/packages/package[@name='{codeunit_name}']/classes/class"
871
- classes = root.xpath(xpath)
873
+ coverage_report_classes = root.xpath(xpath)
872
874
  found_existing_files = False
873
- for clas in classes:
874
- filename = clas.attrib['filename']
875
+ for coverage_report_class in coverage_report_classes:
876
+ filename = coverage_report_class.attrib['filename']
875
877
  file = os.path.join(codeunit_folder, filename)
876
878
  if os.path.isfile(file):
877
879
  found_existing_files = True
878
880
  else:
879
- clas.getparent().remove(clas)
881
+ coverage_report_class.getparent().remove(coverage_report_class)
880
882
  GeneralUtilities.assert_condition(found_existing_files, f"No existing files in testcoderage-report-file \"{testcoveragefile}\".")
881
883
  result = etree.tostring(root).decode("utf-8")
882
884
  GeneralUtilities.write_text_to_file(testcoveragefile, result)
@@ -903,11 +905,12 @@ class TasksForCommonProjectStructure:
903
905
 
904
906
  @GeneralUtilities.check_arguments
905
907
  def standardized_tasks_linting_for_dotnet_project(self, linting_script_file: str, verbosity: int, targetenvironmenttype: str, commandline_arguments: list[str]) -> None:
908
+ GeneralUtilities.write_message_to_stdout("Run linting...")
906
909
  verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
907
910
  # TODO check if there are errors in sarif-file
908
911
 
909
912
  @GeneralUtilities.check_arguments
910
- def __export_codeunit_reference_content_to_reference_repository(self, project_version_identifier: str, replace_existing_content: bool, target_folder_for_reference_repository: str, repository: str, codeunitname: str, projectname: str, codeunit_version: str, public_repository_url: str, branch: str) -> None:
913
+ def __export_codeunit_reference_content_to_reference_repository(self, project_version_identifier: str, replace_existing_content: bool, target_folder_for_reference_repository: str, repository: str, codeunitname: str, projectname: str, codeunit_version: str, public_repository_url: str, branch: str) -> None:
911
914
  codeunit_folder = os.path.join(repository, codeunitname)
912
915
  codeunit_file = os.path.join(codeunit_folder, f"{codeunitname}.codeunit.xml")
913
916
  codeunit_has_testcases = self.codeunit_has_testable_sourcecode(codeunit_file)
@@ -922,8 +925,7 @@ class TasksForCommonProjectStructure:
922
925
  diff_target_folder = os.path.join(target_folder, "DiffReport")
923
926
  GeneralUtilities.ensure_directory_exists(diff_target_folder)
924
927
  diff_target_file = os.path.join(diff_target_folder, "DiffReport.html")
925
- title = (f'Reference of codeunit {codeunitname} {codeunit_version_identifier} (contained in project ' +
926
- f'<a href="{public_repository_url}">{projectname}</a> {project_version_identifier})')
928
+ title = (f'Reference of codeunit {codeunitname} {codeunit_version_identifier} (contained in project <a href="{public_repository_url}">{projectname}</a> {project_version_identifier})')
927
929
  if public_repository_url is None:
928
930
  repo_url_html = ""
929
931
  else:
@@ -1036,7 +1038,7 @@ class TasksForCommonProjectStructure:
1036
1038
  @GeneralUtilities.check_arguments
1037
1039
  def __generate_entire_reference(self, projectname: str, project_version: str, reference_folder: str) -> None:
1038
1040
  all_available_version_identifier_folders_of_reference: list[str] = list(folder for folder in GeneralUtilities.get_direct_folders_of_folder(reference_folder))
1039
- all_available_version_identifier_folders_of_reference = sorted(all_available_version_identifier_folders_of_reference, key=cmp_to_key(TasksForCommonProjectStructure._internal_sort_reference_folder))
1041
+ all_available_version_identifier_folders_of_reference = sorted(all_available_version_identifier_folders_of_reference, key=cmp_to_key(TasksForCommonProjectStructure._internal_sort_reference_folder))
1040
1042
  reference_versions_html_lines = []
1041
1043
  reference_versions_html_lines.append(' <hr/>')
1042
1044
  for all_available_version_identifier_folder_of_reference in all_available_version_identifier_folders_of_reference:
@@ -1100,17 +1102,26 @@ class TasksForCommonProjectStructure:
1100
1102
  raise ValueError(f"Repository '{repository_folder}' has uncommitted changes.")
1101
1103
 
1102
1104
  @GeneralUtilities.check_arguments
1103
- def generate_certificate_for_development_purposes(self, codeunit_folder: str, domain: str = None):
1105
+ def generate_certificate_for_development_purposes_for_external_service(self, service_folder: str, domain: str = None):
1106
+ testservice_name = os.path.basename(service_folder)
1107
+ self.__generate_certificate_for_development_purposes(testservice_name, os.path.join(service_folder, "Resources"), domain)
1108
+
1109
+ @GeneralUtilities.check_arguments
1110
+ def generate_certificate_for_development_purposes_for_codeunit(self, codeunit_folder: str, domain: str = None):
1104
1111
  codeunit_name = os.path.basename(codeunit_folder)
1112
+ self.__generate_certificate_for_development_purposes(codeunit_name, os.path.join(codeunit_folder, "Other", "Resources"), domain)
1113
+
1114
+ @GeneralUtilities.check_arguments
1115
+ def __generate_certificate_for_development_purposes(self, service_name: str, resources_folder: str, domain: str = None):
1105
1116
  if domain is None:
1106
- domain = f"{codeunit_name}.test.local"
1117
+ domain = f"{service_name}.test.local"
1107
1118
  domain = domain.lower()
1108
- resources_folder: str = os.path.join(codeunit_folder, "Other", "Resources")
1109
1119
  resource_name: str = "DevelopmentCertificate"
1110
1120
  certificate_folder: str = os.path.join(resources_folder, resource_name)
1111
- resource_content_filename: str = codeunit_name+resource_name
1121
+
1122
+ resource_content_filename: str = service_name+resource_name
1112
1123
  ca_resource_name: str = f"{resource_name}Authority"
1113
- dev_ca_name = codeunit_name+ca_resource_name
1124
+ dev_ca_name = service_name+ca_resource_name
1114
1125
  ca_folder = os.path.join(resources_folder, ca_resource_name)
1115
1126
  certificate_file = os.path.join(certificate_folder, f"{domain}.crt")
1116
1127
  unsignedcertificate_file = os.path.join(certificate_folder, f"{domain}.unsigned.crt")
@@ -1248,7 +1259,7 @@ class TasksForCommonProjectStructure:
1248
1259
  codeunit_folder = GeneralUtilities.resolve_relative_path("../..", str(os.path.dirname(build_script_file)))
1249
1260
  codeunitname_lower = codeunitname.lower()
1250
1261
  codeunitversion = self.get_version_of_codeunit(os.path.join(codeunit_folder, f"{codeunitname}.codeunit.xml"))
1251
- args = ["image", "build", "--pull", "--force-rm", "--progress=plain", "--build-arg", f"TargetEnvironmentType={target_environment_type}", "--tag", f"{codeunitname_lower}:latest", "--tag", f"{codeunitname_lower}:{codeunitversion}", "--file", f"{codeunitname}/Dockerfile"]
1262
+ args = ["image", "build", "--pull", "--force-rm", "--progress=plain", "--build-arg", f"TargetEnvironmentType={target_environment_type}", "--build-arg", f"Version={codeunitversion}", "--tag", f"{codeunitname_lower}:latest", "--tag", f"{codeunitname_lower}:{codeunitversion}", "--file", f"{codeunitname}/Dockerfile"]
1252
1263
  if not use_cache:
1253
1264
  args.append("--no-cache")
1254
1265
  args.append(".")
@@ -1339,10 +1350,10 @@ class TasksForCommonProjectStructure:
1339
1350
  shutil.copyfile(source_file, target_file)
1340
1351
 
1341
1352
  @GeneralUtilities.check_arguments
1342
- def standardized_tasks_do_common_tasks(self, common_tasks_scripts_file: str, codeunit_version: str, verbosity: int, targetenvironmenttype: str, clear_artifacts_folder: bool, additional_arguments_file: str, assume_dependent_codeunits_are_already_built: bool, commandline_arguments: list[str]) -> None:
1353
+ def standardized_tasks_do_common_tasks(self, common_tasks_scripts_file: str, codeunit_version: str, verbosity: int, targetenvironmenttype: str, clear_artifacts_folder: bool, additional_arguments_file: str, assume_dependent_codeunits_are_already_built: bool, commandline_arguments: list[str]) -> None:
1343
1354
  additional_arguments_file = self.get_additionalargumentsfile_from_commandline_arguments(commandline_arguments, additional_arguments_file)
1344
1355
  target_environmenttype = self.get_targetenvironmenttype_from_commandline_arguments(commandline_arguments, targetenvironmenttype)
1345
- assume_dependent_codeunits_are_already_built = self.get_assume_dependent_codeunits_are_already_built_from_commandline_arguments(commandline_arguments, assume_dependent_codeunits_are_already_built)
1356
+ assume_dependent_codeunits_are_already_built = self.get_assume_dependent_codeunits_are_already_built_from_commandline_arguments(commandline_arguments, assume_dependent_codeunits_are_already_built)
1346
1357
  if commandline_arguments is None:
1347
1358
  raise ValueError('The "commandline_arguments"-parameter is not defined.')
1348
1359
  if len(commandline_arguments) == 0:
@@ -1423,7 +1434,7 @@ class TasksForCommonProjectStructure:
1423
1434
 
1424
1435
  # Get artifacts from dependent codeunits
1425
1436
  if assume_dependent_codeunits_are_already_built:
1426
- self.build_dependent_code_units(repository_folder, codeunit_name, verbosity, target_environmenttype, additional_arguments_file)
1437
+ self.build_dependent_code_units(repository_folder, codeunit_name, verbosity, target_environmenttype, additional_arguments_file, commandline_arguments)
1427
1438
  self.copy_artifacts_from_dependent_code_units(repository_folder, codeunit_name)
1428
1439
 
1429
1440
  # Update codeunit-version
@@ -1493,8 +1504,7 @@ class TasksForCommonProjectStructure:
1493
1504
  # TODO
1494
1505
 
1495
1506
  @GeneralUtilities.check_arguments
1496
- def standardized_tasks_linting_for_angular_codeunit(self, linting_script_file: str, verbosity: int,
1497
- build_environment_target_type: str, commandline_arguments: list[str]) -> None:
1507
+ def standardized_tasks_linting_for_angular_codeunit(self, linting_script_file: str, verbosity: int, build_environment_target_type: str, commandline_arguments: list[str]) -> None:
1498
1508
  verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
1499
1509
  build_script_folder = os.path.dirname(linting_script_file)
1500
1510
  codeunit_folder = GeneralUtilities.resolve_relative_path("../..", build_script_folder)
@@ -1508,15 +1518,13 @@ class TasksForCommonProjectStructure:
1508
1518
  codeunit_name = os.path.basename(codeunit_folder)
1509
1519
  src_folder = GeneralUtilities.resolve_relative_path(package_name, codeunit_folder)
1510
1520
  verbosity = self.get_verbosity_from_commandline_arguments(args, verbosity)
1511
- sc = ScriptCollectionCore()
1512
- sc.program_runner = ProgramRunnerEpew()
1513
- sc.run_program("flutter", "test --coverage", src_folder, verbosity)
1521
+ self.run_with_epew("flutter", "test --coverage", src_folder, verbosity)
1514
1522
  test_coverage_folder_relative = "Other/Artifacts/TestCoverage"
1515
1523
  test_coverage_folder = GeneralUtilities.resolve_relative_path(test_coverage_folder_relative, codeunit_folder)
1516
1524
  GeneralUtilities.ensure_directory_exists(test_coverage_folder)
1517
1525
  coverage_file_relative = f"{test_coverage_folder_relative}/TestCoverage.xml"
1518
1526
  coverage_file = GeneralUtilities.resolve_relative_path(coverage_file_relative, codeunit_folder)
1519
- sc.run_program("lcov_cobertura", f"coverage/lcov.info --base-dir . --excludes test --output ../{coverage_file_relative} --demangle", src_folder, verbosity)
1527
+ self.run_with_epew("lcov_cobertura", f"coverage/lcov.info --base-dir . --excludes test --output ../{coverage_file_relative} --demangle", src_folder, verbosity)
1520
1528
  content = GeneralUtilities.read_text_from_file(coverage_file)
1521
1529
  content = re.sub('<![^<]+>', '', content)
1522
1530
  content = re.sub('\\\\', '/', content)
@@ -1528,19 +1536,57 @@ class TasksForCommonProjectStructure:
1528
1536
 
1529
1537
  @GeneralUtilities.check_arguments
1530
1538
  def standardized_tasks_run_testcases_for_angular_codeunit(self, runtestcases_script_file: str, build_environment_target_type: str, generate_badges: bool, verbosity: int, commandline_arguments: list[str]) -> None:
1539
+ # prepare
1531
1540
  codeunit_name: str = os.path.basename(str(Path(os.path.dirname(runtestcases_script_file)).parent.parent.absolute()))
1532
1541
  verbosity = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
1533
1542
  codeunit_folder = GeneralUtilities.resolve_relative_path("../..", os.path.dirname(runtestcases_script_file))
1534
1543
  repository_folder = os.path.dirname(codeunit_folder)
1535
- self.run_with_epew(
1536
- "ng", "test --watch=false --browsers ChromeHeadless --code-coverage", codeunit_folder, verbosity=verbosity)
1544
+
1545
+ # run testcases
1546
+ self.run_with_epew("ng", "test --watch=false --browsers ChromeHeadless --code-coverage", codeunit_folder, verbosity=verbosity)
1547
+
1548
+ # rename file
1537
1549
  coverage_folder = os.path.join(codeunit_folder, "Other", "Artifacts", "TestCoverage")
1538
1550
  target_file = os.path.join(coverage_folder, "TestCoverage.xml")
1539
1551
  GeneralUtilities.ensure_file_does_not_exist(target_file)
1540
1552
  os.rename(os.path.join(coverage_folder, "cobertura-coverage.xml"), target_file)
1541
1553
  self.__rename_packagename_in_coverage_file(target_file, codeunit_name)
1554
+
1555
+ # adapt backslashs to slashs
1542
1556
  content = GeneralUtilities.read_text_from_file(target_file)
1543
1557
  content = re.sub('\\\\', '/', content)
1558
+ GeneralUtilities.write_text_to_file(target_file, content)
1559
+
1560
+ # aggregate packages in testcoverage-file
1561
+ roottree: etree._ElementTree = etree.parse(target_file)
1562
+ existing_classes = list(roottree.xpath('//coverage/packages/package/classes/class'))
1563
+
1564
+ old_packages_list = roottree.xpath('//coverage/packages/package')
1565
+ for package in old_packages_list:
1566
+ package.getparent().remove(package)
1567
+
1568
+ root = roottree.getroot()
1569
+ packages_element = root.find("packages")
1570
+ package_element = etree.SubElement(packages_element, "package")
1571
+ package_element.attrib['name'] = codeunit_name
1572
+ package_element.attrib['lines-valid'] = root.attrib["lines-valid"]
1573
+ package_element.attrib['lines-covered'] = root.attrib["lines-covered"]
1574
+ package_element.attrib['line-rate'] = root.attrib["line-rate"]
1575
+ package_element.attrib['branches-valid'] = root.attrib["branches-valid"]
1576
+ package_element.attrib['branches-covered'] = root.attrib["branches-covered"]
1577
+ package_element.attrib['branch-rate'] = root.attrib["branch-rate"]
1578
+ package_element.attrib['timestamp'] = root.attrib["timestamp"]
1579
+ package_element.attrib['complexity'] = root.attrib["complexity"]
1580
+
1581
+ classes_element = etree.SubElement(package_element, "classes")
1582
+
1583
+ for existing_class in existing_classes:
1584
+ classes_element.append(existing_class)
1585
+
1586
+ result = etree.tostring(roottree, pretty_print=True).decode("utf-8")
1587
+ GeneralUtilities.write_text_to_file(target_file, result)
1588
+
1589
+ # post tasks
1544
1590
  self.run_testcases_common_post_task(repository_folder, codeunit_name, verbosity, generate_badges, build_environment_target_type, commandline_arguments)
1545
1591
 
1546
1592
  @GeneralUtilities.check_arguments
@@ -1655,7 +1701,7 @@ class TasksForCommonProjectStructure:
1655
1701
  raise ValueError("Too many results found.")
1656
1702
 
1657
1703
  @GeneralUtilities.check_arguments
1658
- def copy_development_certificate_to_default_development_directory(self, codeunit_folder: str, build_environment: str, domain: str = None, certificate_resource_name: str = "DevelopmentCertificate") -> None:
1704
+ def copy_development_certificate_to_default_development_directory(self, codeunit_folder: str, build_environment: str, domain: str = None, certificate_resource_name: str = "DevelopmentCertificate") -> None:
1659
1705
  if build_environment == "Development":
1660
1706
  codeunit_name: str = os.path.basename(codeunit_folder)
1661
1707
  if domain is None:
@@ -1724,15 +1770,17 @@ class TasksForCommonProjectStructure:
1724
1770
 
1725
1771
  @GeneralUtilities.check_arguments
1726
1772
  def generate_openapi_file(self, buildscript_file: str, runtime: str, verbosity: int, commandline_arguments: list[str], swagger_document_name: str = "APISpecification") -> None:
1773
+ GeneralUtilities.write_message_to_stdout("Generate OpenAPI-specification-file...")
1727
1774
  codeunitname = os.path.basename(str(Path(os.path.dirname(buildscript_file)).parent.parent.absolute()))
1728
1775
  repository_folder = str(Path(os.path.dirname(buildscript_file)).parent.parent.parent.absolute())
1729
- artifacts_folder = os.path.join(repository_folder, codeunitname, "Other", "Artifacts")
1776
+ codeunit_folder = os.path.join(repository_folder, codeunitname)
1777
+ artifacts_folder = os.path.join(codeunit_folder, "Other", "Artifacts")
1730
1778
  GeneralUtilities.ensure_directory_exists(os.path.join(artifacts_folder, "APISpecification"))
1731
1779
  verbosity = self.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
1732
- codeunit_version = self.get_version_of_codeunit_folder(os.path.join(repository_folder, codeunitname))
1733
- self.__sc.run_program("swagger", f"tofile --output APISpecification\\{codeunitname}.v{codeunit_version}.api.json" +
1734
- f" BuildResult_DotNet_{runtime}\\{codeunitname}.dll {swagger_document_name}",
1735
- artifacts_folder, verbosity=verbosity)
1780
+ codeunit_version = self.get_version_of_codeunit_folder(codeunit_folder)
1781
+ versioned_api_spec_file = f"APISpecification/{codeunitname}.v{codeunit_version}.api.json"
1782
+ self.__sc.run_program("swagger", f"tofile --output {versioned_api_spec_file} BuildResult_DotNet_{runtime}/{codeunitname}.dll {swagger_document_name}", artifacts_folder, verbosity=verbosity)
1783
+ shutil.copyfile(os.path.join(artifacts_folder, versioned_api_spec_file), os.path.join(artifacts_folder, f"APISpecification/{codeunitname}.latest.api.json"))
1736
1784
 
1737
1785
  @GeneralUtilities.check_arguments
1738
1786
  def replace_version_in_packagejson_file(self, packagejson_file: str, codeunit_version: str) -> None:
@@ -1744,7 +1792,8 @@ class TasksForCommonProjectStructure:
1744
1792
  json.dump(data, f, indent=2)
1745
1793
 
1746
1794
  @GeneralUtilities.check_arguments
1747
- def build_dependent_code_units(self, repo_folder: str, codeunit_name: str, verbosity: int, target_environmenttype: str, additional_arguments_file: str) -> None:
1795
+ def build_dependent_code_units(self, repo_folder: str, codeunit_name: str, verbosity: int, target_environmenttype: str, additional_arguments_file: str, commandlinearguments: list[str]) -> None:
1796
+ verbosity = self.get_verbosity_from_commandline_arguments(commandlinearguments, verbosity)
1748
1797
  codeunit_file = os.path.join(repo_folder, codeunit_name, codeunit_name + ".codeunit.xml")
1749
1798
  dependent_codeunits = self.get_dependent_code_units(codeunit_file)
1750
1799
  dependent_codeunits_folder = os.path.join(repo_folder, codeunit_name, "Other", "Resources", "DependentCodeUnits")
@@ -1752,7 +1801,7 @@ class TasksForCommonProjectStructure:
1752
1801
  if 0 < len(dependent_codeunits):
1753
1802
  GeneralUtilities.write_message_to_stdout(f"Start building dependent codeunits for codeunit {codeunit_name}.")
1754
1803
  for dependent_codeunit in dependent_codeunits:
1755
- self.__build_codeunit(os.path.join(repo_folder, dependent_codeunit), verbosity, target_environmenttype, additional_arguments_file)
1804
+ self.__build_codeunit(os.path.join(repo_folder, dependent_codeunit), verbosity, target_environmenttype, additional_arguments_file, False, False, commandlinearguments)
1756
1805
  if 0 < len(dependent_codeunits):
1757
1806
  GeneralUtilities.write_message_to_stdout(f"Finished building dependent codeunits for codeunit {codeunit_name}.")
1758
1807
 
@@ -1780,8 +1829,7 @@ class TasksForCommonProjectStructure:
1780
1829
  for codeunit in codeunits:
1781
1830
  artifact_files.append(self.__sc.find_file_by_extension(f"{build_artifacts_folder}\\{productname}\\{projectversion}\\{codeunit}", "Productive.Artifacts.zip"))
1782
1831
  changelog_file = os.path.join(repository_folder, "Other", "Resources", "Changelog", f"v{projectversion}.md")
1783
- self.__sc.run_program_argsasarray("gh", ["release", "create", f"v{projectversion}", "--repo", github_repo, "--notes-file", changelog_file,
1784
- "--title", f"Release v{projectversion}"]+artifact_files, verbosity=verbosity)
1832
+ self.__sc.run_program_argsasarray("gh", ["release", "create", f"v{projectversion}", "--repo", github_repo, "--notes-file", changelog_file, "--title", f"Release v{projectversion}"]+artifact_files, verbosity=verbosity)
1785
1833
 
1786
1834
  @GeneralUtilities.check_arguments
1787
1835
  def update_dependencies_of_typical_flutter_codeunit(self, update_script_file: str, verbosity: int, cmd_args: list[str]) -> None:
@@ -1819,6 +1867,9 @@ class TasksForCommonProjectStructure:
1819
1867
  @GeneralUtilities.check_arguments
1820
1868
  def run_local_test_service(self, file: str):
1821
1869
  example_folder = os.path.dirname(file)
1870
+ docker_compose_file = os.path.join(example_folder, "docker-compose.yml")
1871
+ for service in self.__sc.get_services_from_yaml_file(docker_compose_file):
1872
+ self.__sc.kill_docker_container(service)
1822
1873
  example_name = os.path.basename(example_folder)
1823
1874
  title = f"Test{example_name}"
1824
1875
  self.__sc.run_program("docker", f"compose -p {title.lower()} up", example_folder, title=title)
@@ -1904,36 +1955,31 @@ class TasksForCommonProjectStructure:
1904
1955
  raise ValueError(f"Invalid target-environmenttype: '{target_environmenttype}'")
1905
1956
 
1906
1957
  @GeneralUtilities.check_arguments
1907
- def build_codeunit(self, codeunit_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck",
1908
- additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None,
1909
- assume_dependent_codeunits_are_already_built: bool = False) -> None:
1958
+ def build_codeunit(self, codeunit_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None, assume_dependent_codeunits_are_already_built: bool = False, commandlinearguments: list[str] = []) -> None:
1910
1959
  codeunit_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(codeunit_folder)
1911
1960
  codeunit_name = os.path.basename(codeunit_folder)
1912
1961
  repository_folder = os.path.dirname(codeunit_folder)
1913
- self.build_specific_codeunits(repository_folder, [codeunit_name], verbosity, target_environmenttype, additional_arguments_file,
1914
- is_pre_merge, export_target_directory, assume_dependent_codeunits_are_already_built)
1962
+ self.build_specific_codeunits(repository_folder, [codeunit_name], verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, export_target_directory, assume_dependent_codeunits_are_already_built, commandlinearguments)
1915
1963
 
1916
1964
  @GeneralUtilities.check_arguments
1917
- def build_codeunitsC(self, repository_folder: str, image: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None) -> None:
1965
+ def build_codeunitsC(self, repository_folder: str, image: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, commandlinearguments: list[str] = []) -> None:
1918
1966
  if target_environmenttype == "Development":
1919
1967
  raise ValueError(f"build_codeunitsC is not available for target_environmenttype {target_environmenttype}.")
1920
1968
  # TODO handle additional_arguments_file
1921
1969
  # TODO add option to allow building different codeunits in same project with different images due to their demands
1922
1970
  # TODO check if image provides all demands of codeunit
1923
1971
  self.__sc.run_program(
1924
- "docker", f"run --volume {repository_folder}:/Workspace/Repository " +
1925
- f"-e repositoryfolder=/Workspace/Repository -e verbosity={verbosity} -e targetenvironment={target_environmenttype} {image}",
1926
- repository_folder)
1972
+ "docker", f"run --volume {repository_folder}:/Workspace/Repository " + f"-e repositoryfolder=/Workspace/Repository -e verbosity={verbosity} -e targetenvironment={target_environmenttype} {image}", repository_folder)
1927
1973
 
1928
1974
  @GeneralUtilities.check_arguments
1929
- def build_codeunits(self, repository_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None) -> None:
1975
+ def build_codeunits(self, repository_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None, commandline_arguments: list[str] = []) -> None:
1930
1976
  self.__check_target_environmenttype(target_environmenttype)
1931
1977
  repository_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(repository_folder)
1932
1978
  codeunits = self.get_codeunits(repository_folder, False)
1933
- self.build_specific_codeunits(repository_folder, codeunits, verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, export_target_directory)
1979
+ self.build_specific_codeunits(repository_folder, codeunits, verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, export_target_directory, False, commandline_arguments)
1934
1980
 
1935
1981
  @GeneralUtilities.check_arguments
1936
- def build_specific_codeunits(self, repository_folder: str, codeunits: list[str], verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None, assume_dependent_codeunits_are_already_built: bool = True) -> None:
1982
+ def build_specific_codeunits(self, repository_folder: str, codeunits: list[str], verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, export_target_directory: str = None, assume_dependent_codeunits_are_already_built: bool = True, commandline_arguments: list[str] = []) -> None:
1937
1983
  self.__check_target_environmenttype(target_environmenttype)
1938
1984
  repository_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(repository_folder)
1939
1985
  contains_uncommitted_changes = self.__sc.git_repository_has_uncommitted_changes(repository_folder)
@@ -1963,8 +2009,7 @@ class TasksForCommonProjectStructure:
1963
2009
  line = "----------"
1964
2010
  for codeunit in sorted_codeunits:
1965
2011
  GeneralUtilities.write_message_to_stdout(line)
1966
- self.__build_codeunit(os.path.join(repository_folder, codeunit), verbosity, target_environmenttype,
1967
- additional_arguments_file, is_pre_merge, assume_dependent_codeunits_are_already_built)
2012
+ self.__build_codeunit(os.path.join(repository_folder, codeunit), verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, assume_dependent_codeunits_are_already_built, commandline_arguments)
1968
2013
  GeneralUtilities.write_message_to_stdout(line)
1969
2014
  if not contains_uncommitted_changes and self.__sc.git_repository_has_uncommitted_changes(repository_folder) and not is_pre_merge:
1970
2015
  message = f'Due to the build-process the repository "{repository_folder}" has new uncommitted changes.'
@@ -1987,11 +2032,17 @@ class TasksForCommonProjectStructure:
1987
2032
 
1988
2033
  @GeneralUtilities.check_arguments
1989
2034
  def __do_repository_checks(self, repository_folder: str, project_version: str) -> None:
2035
+ self.__check_if_folder_is_git_repository(repository_folder)
1990
2036
  self.__check_if_changelog_exists(repository_folder, project_version)
1991
2037
  self.__check_whether_security_txt_exists(repository_folder)
1992
2038
  self.__check_whether_workspace_file_exists(repository_folder)
1993
2039
  self.__check_for_staged_or_committed_ignored_files(repository_folder)
1994
2040
 
2041
+ @GeneralUtilities.check_arguments
2042
+ def __check_if_folder_is_git_repository(self, repository_folder: str) -> None:
2043
+ if (not self.__sc.is_git_repository(repository_folder)):
2044
+ raise ValueError(f"Folder {repository_folder} is not a git-repository")
2045
+
1995
2046
  @GeneralUtilities.check_arguments
1996
2047
  def __check_if_changelog_exists(self, repository_folder: str, project_version: str) -> None:
1997
2048
  changelog_folder = os.path.join(repository_folder, "Other", "Resources", "Changelog")
@@ -2132,7 +2183,7 @@ class TasksForCommonProjectStructure:
2132
2183
  for file in GeneralUtilities.get_all_files_of_folder(files_folder):
2133
2184
  if file.endswith(".plantuml"):
2134
2185
  argument = ['-jar', f'{plant_uml_folder}/plantuml.jar', os.path.basename(file).replace("\\", "/"), '-tsvg']
2135
- sc.run_program_argsasarray("java", argument, os.path.dirname(file),verbosity=0)
2186
+ sc.run_program_argsasarray("java", argument, os.path.dirname(file), verbosity=0)
2136
2187
 
2137
2188
  @GeneralUtilities.check_arguments
2138
2189
  def load_deb_control_file_content(self, file: str, codeunitname: str, codeunitversion: str, installedsize: int, maintainername: str, maintaineremail: str, description: str,) -> str:
@@ -2210,7 +2261,7 @@ class TasksForCommonProjectStructure:
2210
2261
  GeneralUtilities.write_message_to_stderr(f"Warning: {message}")
2211
2262
 
2212
2263
  @GeneralUtilities.check_arguments
2213
- def __build_codeunit(self, codeunit_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, assume_dependent_codeunits_are_already_built: bool = False) -> None:
2264
+ def __build_codeunit(self, codeunit_folder: str, verbosity: int = 1, target_environmenttype: str = "QualityCheck", additional_arguments_file: str = None, is_pre_merge: bool = False, assume_dependent_codeunits_are_already_built: bool = False, commandline_arguments: list[str] = []) -> None:
2214
2265
  now = datetime.now()
2215
2266
  codeunit_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(codeunit_folder)
2216
2267
  codeunit_name: str = os.path.basename(codeunit_folder)
@@ -2228,7 +2279,7 @@ class TasksForCommonProjectStructure:
2228
2279
  GeneralUtilities.write_message_to_stdout(f"Build-environmenttype: {target_environmenttype}")
2229
2280
  GeneralUtilities.ensure_directory_does_not_exist(artifacts_folder)
2230
2281
 
2231
- verbosity_for_executed_programs = min(2, verbosity)
2282
+ verbosity_for_executed_programs = self.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
2232
2283
 
2233
2284
  other_folder = os.path.join(codeunit_folder, "Other")
2234
2285
  build_folder = os.path.join(other_folder, "Build")
@@ -2273,7 +2324,7 @@ class TasksForCommonProjectStructure:
2273
2324
  c_additionalargumentsfile_argument = f' --overwrite_additionalargumentsfile "{additional_arguments_file}"'
2274
2325
 
2275
2326
  GeneralUtilities.write_message_to_stdout('Run "CommonTasks.py"...')
2276
- self.__sc.run_program("python", f"CommonTasks.py{additional_arguments_c}{general_argument}{c_additionalargumentsfile_argument}", other_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True)
2327
+ self.__sc.run_program("python", f"CommonTasks.py{additional_arguments_c}{general_argument}{c_additionalargumentsfile_argument}", other_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True)
2277
2328
  self.verify_artifact_exists(codeunit_folder, dict[str, bool]({"Changelog": False, "License": True, "DiffReport": True}))
2278
2329
 
2279
2330
  GeneralUtilities.write_message_to_stdout('Run "Build.py"...')
@@ -2326,13 +2377,15 @@ class TasksForCommonProjectStructure:
2326
2377
  def generic_update_dependencies(self, repository_folder: str):
2327
2378
  codeunits = self.get_codeunits(repository_folder)
2328
2379
  updated_dependencies = False
2380
+ verbosity: int = 1 # TODO set value dynamically
2329
2381
  for codeunit in codeunits:
2330
2382
  codeunit_file = os.path.join(repository_folder, codeunit, f"{codeunit}.codeunit.xml")
2331
2383
  codeunit_has_updatable_dependencies = self.codeunit_has_updatable_dependencies(codeunit_file)
2332
2384
  if codeunit_has_updatable_dependencies:
2333
2385
  codeunit_folder = os.path.join(repository_folder, codeunit)
2334
2386
  update_dependencies_script_folder = os.path.join(codeunit_folder, "Other")
2335
- self.__sc.run_program("python", "UpdateDependencies.py", update_dependencies_script_folder)#TODO set verbosity
2387
+ GeneralUtilities.ensure_directory_exists(os.path.join(update_dependencies_script_folder, "Resources", "CodeAnalysisResult"))
2388
+ self.__sc.run_program("python", "UpdateDependencies.py", update_dependencies_script_folder, verbosity)
2336
2389
  if self.__sc.git_repository_has_uncommitted_changes(repository_folder):
2337
2390
  version_of_project = self.get_version_of_project(repository_folder)
2338
2391
  changelog_file = os.path.join(repository_folder, "Other", "Resources", "Changelog", f"v{version_of_project}.md")
@@ -2348,7 +2401,7 @@ class TasksForCommonProjectStructure:
2348
2401
  else:
2349
2402
  GeneralUtilities.write_message_to_stdout(f"There are no dependencies to update in codeunit {codeunit}.")
2350
2403
  if updated_dependencies:
2351
- self.__sc.run_program("scbuildcodeunits", "--targetenvironment QualityCheck", repository_folder)#TODO set verbosity
2404
+ self.__sc.run_program("scbuildcodeunits", "--targetenvironment QualityCheck", repository_folder) # TODO set verbosity
2352
2405
  self.__sc.git_commit(repository_folder, "Updated dependencies")
2353
2406
 
2354
2407
  class GenericPrepareNewReleaseArguments:
@@ -2375,7 +2428,7 @@ class TasksForCommonProjectStructure:
2375
2428
  # prepare
2376
2429
  self.assert_no_uncommitted_changes(repository_folder)
2377
2430
  self.__sc.git_checkout(repository_folder, merge_source_branch)
2378
- if not "--prevent-dependency-update" in generic_prepare_new_release_arguments.commandline_arguments:
2431
+ if "--dependencyupdate" in generic_prepare_new_release_arguments.commandline_arguments:
2379
2432
  self.generic_update_dependencies(repository_folder)
2380
2433
  self.merge_to_main_branch(repository_folder, merge_source_branch, verbosity=verbosity, fast_forward_source_branch=True)
2381
2434
  self.__sc.git_commit(build_repository_folder, "Updated submodule due to merge to main-branch.")
@@ -2387,7 +2440,7 @@ class TasksForCommonProjectStructure:
2387
2440
  artifacts_target_folder: str
2388
2441
  commandline_arguments: list[str]
2389
2442
 
2390
- def __init__(self, current_file: str, product_name: str, common_remote_name: str, artifacts_target_folder: str,commandline_arguments: list[str]):
2443
+ def __init__(self, current_file: str, product_name: str, common_remote_name: str, artifacts_target_folder: str, commandline_arguments: list[str]):
2391
2444
  self.current_file = current_file
2392
2445
  self.product_name = product_name
2393
2446
  self.common_remote_name = common_remote_name
@@ -2395,7 +2448,7 @@ class TasksForCommonProjectStructure:
2395
2448
  self.commandline_arguments = commandline_arguments
2396
2449
 
2397
2450
  @GeneralUtilities.check_arguments
2398
- def generic_create_release(self, generic_create_release_arguments:GenericCreateReleaseArguments) -> str:
2451
+ def generic_create_release(self, generic_create_release_arguments: GenericCreateReleaseArguments) -> str:
2399
2452
  folder_of_this_file = os.path.dirname(generic_create_release_arguments.current_file)
2400
2453
  build_repository_folder = GeneralUtilities.resolve_relative_path("../..", folder_of_this_file)
2401
2454
  repository_folder_name = generic_create_release_arguments.product_name
@@ -2404,10 +2457,18 @@ class TasksForCommonProjectStructure:
2404
2457
  verbosity: int = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(generic_create_release_arguments.commandline_arguments, 1)
2405
2458
  createReleaseConfiguration: CreateReleaseConfiguration = CreateReleaseConfiguration(
2406
2459
  generic_create_release_arguments.product_name, generic_create_release_arguments.common_remote_name, generic_create_release_arguments.artifacts_target_folder, folder_of_this_file, verbosity, repository_folder, additional_arguments_file, repository_folder_name)
2460
+
2461
+ reference_repo: str = os.path.join(build_repository_folder, "Submodules", f"{generic_create_release_arguments.product_name}Reference")
2462
+ self.__sc.git_commit(reference_repo, "Updated reference")
2463
+
2407
2464
  self.__sc.git_commit(build_repository_folder, "Updated submodule")
2408
2465
 
2409
2466
  # create release
2410
2467
  new_version = self.merge_to_stable_branch(generic_create_release_arguments.current_file, createReleaseConfiguration)
2468
+
2469
+ merge_source_branch = "other/next-release"
2470
+ self.__sc.git_checkout(repository_folder, merge_source_branch)
2471
+
2411
2472
  return new_version
2412
2473
 
2413
2474
  class UpdateHTTPDocumentationArguments:
@@ -40,7 +40,7 @@ class CertificateUpdater:
40
40
  print(filenames)
41
41
  numbers = [int(file[len("privkey"):]) for file in filenames]
42
42
  # numbers=[]
43
- #print([os.path.basename(file) for file in filenames])
43
+ # print([os.path.basename(file) for file in filenames])
44
44
  result = max(numbers)
45
45
  return result
46
46
 
@@ -108,7 +108,7 @@ class CertificateUpdater:
108
108
  dockerargument = f"run --name {certbot_container_name} --volume {self.__letsencrypt_folder}:/etc/letsencrypt"
109
109
  dockerargument = dockerargument+f" --volume {self.__log_folder}:/var/log/letsencrypt -p 80:80 certbot/certbot:latest"
110
110
  certbotargument = f"--standalone --email {self.__email} --agree-tos --force-renewal --rsa-key-size 4096 --non-interactive --no-eff-email --domain {domain}"
111
- if(certificate_for_domain_already_exists):
111
+ if (certificate_for_domain_already_exists):
112
112
  self.__sc.run_program("docker", f"{dockerargument} certonly --no-random-sleep-on-renew {certbotargument}", self.__current_folder, throw_exception_if_exitcode_is_not_zero=True)
113
113
  self.__replace_symlinks_by_files(domain)
114
114
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ScriptCollection
3
- Version: 3.5.2
3
+ Version: 3.5.4
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
@@ -33,10 +33,11 @@ Requires-Dist: ntplib >=0.4.0
33
33
  Requires-Dist: Pillow >=10.3.0
34
34
  Requires-Dist: pycdlib >=1.14.0
35
35
  Requires-Dist: Pygments >=2.18.0
36
- Requires-Dist: pylint >=3.1.1
36
+ Requires-Dist: pylint >=3.2.0
37
37
  Requires-Dist: pyOpenSSL >=24.1.0
38
38
  Requires-Dist: PyPDF2 >=3.0.1
39
39
  Requires-Dist: pytest >=8.2.0
40
+ Requires-Dist: PyYAML >=6.0.1
40
41
  Requires-Dist: qrcode >=7.4.2
41
42
  Requires-Dist: send2trash >=1.8.3
42
43
  Requires-Dist: twine >=5.0.0