ScriptCollection 3.5.102__py3-none-any.whl → 3.5.103__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.
@@ -33,7 +33,7 @@ from .ProgramRunnerBase import ProgramRunnerBase
33
33
  from .ProgramRunnerPopen import ProgramRunnerPopen
34
34
  from .ProgramRunnerEpew import ProgramRunnerEpew, CustomEpewArgument
35
35
 
36
- version = "3.5.102"
36
+ version = "3.5.103"
37
37
  __version__ = version
38
38
 
39
39
 
@@ -292,7 +292,7 @@ class ScriptCollectionCore:
292
292
 
293
293
  @GeneralUtilities.check_arguments
294
294
  def git_push_with_retry(self, folder: str, remotename: str, localbranchname: str, remotebranchname: str, forcepush: bool = False, pushalltags: bool = True, verbosity: int = 0, amount_of_attempts: int = 5) -> None:
295
- GeneralUtilities.retry_action(lambda: self.git_push(folder, remotename, localbranchname, remotebranchname, forcepush, pushalltags,verbosity), amount_of_attempts)
295
+ GeneralUtilities.retry_action(lambda: self.git_push(folder, remotename, localbranchname, remotebranchname, forcepush, pushalltags, verbosity), amount_of_attempts)
296
296
 
297
297
  @GeneralUtilities.check_arguments
298
298
  def git_push(self, folder: str, remotename: str, localbranchname: str, remotebranchname: str, forcepush: bool = False, pushalltags: bool = True, verbosity: int = 0) -> None:
@@ -770,6 +770,74 @@ class ScriptCollectionCore:
770
770
  if exit_code != 0:
771
771
  raise ValueError(f"Fatal error occurrs while copying '{source}' to '{target}'. StdErr: '{stderr}'")
772
772
 
773
+ @GeneralUtilities.check_arguments
774
+ def create_file(self, path: str, error_if_already_exists: bool, create_necessary_folder: bool) -> None:
775
+ """This function works platform-independent also for non-local-executions if the ScriptCollection commandline-commands are available as global command on the target-system."""
776
+ if self.program_runner.will_be_executed_locally():
777
+ if not os.path.isabs(path):
778
+ path = os.path.join(os.getcwd(), path)
779
+
780
+ if os.path.isfile(path) and error_if_already_exists:
781
+ raise ValueError(f"File '{path}' already exists.")
782
+
783
+ # TODO maybe it should be checked if there is a folder with the same path which already exists.
784
+
785
+ folder = os.path.dirname(path)
786
+
787
+ if not os.path.isdir(folder):
788
+ if create_necessary_folder:
789
+ GeneralUtilities.ensure_directory_exists(folder) # TODO check if this also create nested folders if required
790
+ else:
791
+ raise ValueError(f"Folder '{folder}' does not exist.")
792
+
793
+ GeneralUtilities.ensure_file_exists(path)
794
+ else:
795
+ arguments = ["--path", path]
796
+
797
+ if error_if_already_exists:
798
+ arguments = arguments+["--errorwhenexists"]
799
+
800
+ if create_necessary_folder:
801
+ arguments = arguments+["--createnecessaryfolder"]
802
+
803
+ exit_code, _, stderr, _ = self.run_program_argsasarray("sccreatefile", arguments, throw_exception_if_exitcode_is_not_zero=False) # works platform-indepent
804
+ if exit_code != 0:
805
+ raise ValueError(f"Fatal error occurrs while create file '{path}'. StdErr: '{stderr}'")
806
+
807
+ @GeneralUtilities.check_arguments
808
+ def create_folder(self, path: str, error_if_already_exists: bool, create_necessary_folder: bool) -> None:
809
+ """This function works platform-independent also for non-local-executions if the ScriptCollection commandline-commands are available as global command on the target-system."""
810
+ if self.program_runner.will_be_executed_locally():
811
+ if not os.path.isabs(path):
812
+ path = os.path.join(os.getcwd(), path)
813
+
814
+ if os.path.isdir(path) and error_if_already_exists:
815
+ raise ValueError(f"Folder '{path}' already exists.")
816
+
817
+ # TODO maybe it should be checked if there is a file with the same path which already exists.
818
+
819
+ folder = os.path.dirname(path)
820
+
821
+ if not os.path.isdir(folder):
822
+ if create_necessary_folder:
823
+ GeneralUtilities.ensure_directory_exists(folder) # TODO check if this also create nested folders if required
824
+ else:
825
+ raise ValueError(f"Folder '{folder}' does not exist.")
826
+
827
+ GeneralUtilities.ensure_directory_exists(path)
828
+ else:
829
+ arguments = ["--path", path]
830
+
831
+ if error_if_already_exists:
832
+ arguments = arguments+["--errorwhenexists"]
833
+
834
+ if create_necessary_folder:
835
+ arguments = arguments+["--createnecessaryfolder"]
836
+
837
+ exit_code, _, stderr, _ = self.run_program_argsasarray("sccreatefolder", arguments, throw_exception_if_exitcode_is_not_zero=False) # works platform-indepent
838
+ if exit_code != 0:
839
+ raise ValueError(f"Fatal error occurrs while create folder '{path}'. StdErr: '{stderr}'")
840
+
773
841
  @GeneralUtilities.check_arguments
774
842
  def __sort_fmd(self, line: str):
775
843
  splitted: list = line.split(";")
@@ -2203,46 +2271,6 @@ TXDX
2203
2271
  def create_local_docker_network(self, network_name: str) -> None:
2204
2272
  self.run_program("docker", f"network create {network_name}")
2205
2273
 
2206
- @GeneralUtilities.check_arguments
2207
- def create_file(self, path: str, error_if_already_exists: bool, create_necessary_folder: bool) -> None:
2208
- if not os.path.isabs(path):
2209
- path = os.path.join(os.getcwd(), path)
2210
-
2211
- if os.path.isfile(path) and error_if_already_exists:
2212
- raise ValueError(f"File '{path}' already exists.")
2213
-
2214
- # TODO maybe it should be checked if there is a folder with the same path which already exists.
2215
-
2216
- folder = os.path.dirname(path)
2217
-
2218
- if not os.path.isdir(folder):
2219
- if create_necessary_folder:
2220
- GeneralUtilities.ensure_directory_exists(folder) # TODO check if this also create nested folders if required
2221
- else:
2222
- raise ValueError(f"Folder '{folder}' does not exist.")
2223
-
2224
- GeneralUtilities.ensure_file_exists(path)
2225
-
2226
- @GeneralUtilities.check_arguments
2227
- def create_folder(self, path: str, error_if_already_exists: bool, create_necessary_folder: bool) -> None:
2228
- if not os.path.isabs(path):
2229
- path = os.path.join(os.getcwd(), path)
2230
-
2231
- if os.path.isdir(path) and error_if_already_exists:
2232
- raise ValueError(f"Folder '{path}' already exists.")
2233
-
2234
- # TODO maybe it should be checked if there is a file with the same path which already exists.
2235
-
2236
- folder = os.path.dirname(path)
2237
-
2238
- if not os.path.isdir(folder):
2239
- if create_necessary_folder:
2240
- GeneralUtilities.ensure_directory_exists(folder) # TODO check if this also create nested folders if required
2241
- else:
2242
- raise ValueError(f"Folder '{folder}' does not exist.")
2243
-
2244
- GeneralUtilities.ensure_directory_exists(path)
2245
-
2246
2274
  @GeneralUtilities.check_arguments
2247
2275
  def format_xml_file(self, file: str) -> None:
2248
2276
  encoding = "utf-8"
@@ -1237,18 +1237,17 @@ class TasksForCommonProjectStructure:
1237
1237
 
1238
1238
  @GeneralUtilities.check_arguments
1239
1239
  def get_codeunits(self, repository_folder: str, ignore_disabled_codeunits: bool = True) -> list[str]:
1240
- self.__sc.assert_is_git_repository(repository_folder)
1241
- result: list[str] = []
1242
- for direct_subfolder in GeneralUtilities.get_direct_folders_of_folder(repository_folder):
1243
- subfoldername = os.path.basename(direct_subfolder)
1244
- codeunit_file = os.path.join(direct_subfolder, f"{subfoldername}.codeunit.xml")
1245
- if os.path.isfile(codeunit_file):
1246
- if (ignore_disabled_codeunits):
1247
- if (self.codeunit_is_enabled(codeunit_file)):
1248
- result.append(subfoldername)
1249
- else:
1250
- result.append(subfoldername)
1251
- return result
1240
+ codeunits_with_dependent_codeunits: dict[str, set[str]] = dict[str, set[str]]()
1241
+ subfolders = GeneralUtilities.get_direct_folders_of_folder(repository_folder)
1242
+ for subfolder in subfolders:
1243
+ codeunit_name: str = os.path.basename(subfolder)
1244
+ codeunit_file = os.path.join(subfolder, f"{codeunit_name}.codeunit.xml")
1245
+ if os.path.exists(codeunit_file):
1246
+ if ignore_disabled_codeunits and not self.codeunit_is_enabled(codeunit_file):
1247
+ continue
1248
+ codeunits_with_dependent_codeunits[codeunit_name] = self.get_dependent_code_units(codeunit_file)
1249
+ sorted_codeunits = self._internal_get_sorted_codeunits_by_dict(codeunits_with_dependent_codeunits)
1250
+ return sorted_codeunits
1252
1251
 
1253
1252
  @GeneralUtilities.check_arguments
1254
1253
  def codeunit_is_enabled(self, codeunit_file: str) -> bool:
@@ -2456,18 +2455,6 @@ class TasksForCommonProjectStructure:
2456
2455
  GeneralUtilities.ensure_directory_exists(ca_target_folder)
2457
2456
  GeneralUtilities.copy_content_of_folder(ca_source_folder, ca_target_folder)
2458
2457
 
2459
- @GeneralUtilities.check_arguments
2460
- def get_sorted_codeunits(self, repository_folder: str) -> list[str]:
2461
- codeunits_with_dependent_codeunits: dict[str, set[str]] = dict[str, set[str]]()
2462
- subfolders = GeneralUtilities.get_direct_folders_of_folder(repository_folder)
2463
- for subfolder in subfolders:
2464
- codeunit_name: str = os.path.basename(subfolder)
2465
- codeunit_file = os.path.join(subfolder, f"{codeunit_name}.codeunit.xml")
2466
- if os.path.exists(codeunit_file):
2467
- codeunits_with_dependent_codeunits[codeunit_name] = self.get_dependent_code_units(codeunit_file)
2468
- sorted_codeunits = self._internal_get_sorted_codeunits_by_dict(codeunits_with_dependent_codeunits)
2469
- return sorted_codeunits
2470
-
2471
2458
  @GeneralUtilities.check_arguments
2472
2459
  def _internal_get_sorted_codeunits_by_dict(self, codeunits=dict[str, set[str]]) -> list[str]:
2473
2460
  result_typed = list(TopologicalSorter(codeunits).static_order())
@@ -2525,7 +2512,7 @@ class TasksForCommonProjectStructure:
2525
2512
  PrepareBuildCodeunits_script_name = "PrepareBuildCodeunits.py"
2526
2513
  prepare_build_codeunits_scripts = os.path.join(project_resources_folder, PrepareBuildCodeunits_script_name)
2527
2514
 
2528
- if do_git_clean_when_no_changes:
2515
+ if do_git_clean_when_no_changes and not self.__sc.git_repository_has_uncommitted_changes(repository_folder):
2529
2516
  self.__sc.run_program("git", "clean -dfx", repository_folder)
2530
2517
  if os.path.isfile(prepare_build_codeunits_scripts):
2531
2518
  GeneralUtilities.write_message_to_stdout(f'Run "{PrepareBuildCodeunits_script_name}"')
@@ -2557,7 +2544,7 @@ class TasksForCommonProjectStructure:
2557
2544
  codeunit_file = os.path.join(subfolder, f"{codeunit_name}.codeunit.xml")
2558
2545
  GeneralUtilities.assert_condition(os.path.exists(codeunit_file), f"Codeunit-file '{codeunit_file}' does nost exist.")
2559
2546
  codeunits_with_dependent_codeunits[codeunit_name] = self.get_dependent_code_units(codeunit_file)
2560
- sorted_codeunits = self.get_sorted_codeunits(repository_folder)
2547
+ sorted_codeunits = self.get_codeunits(repository_folder)
2561
2548
  sorted_codeunits = [codeunit for codeunit in sorted_codeunits if codeunit in codeunits]
2562
2549
  project_version = self.get_version_of_project(repository_folder)
2563
2550
 
@@ -2959,6 +2946,7 @@ class TasksForCommonProjectStructure:
2959
2946
  self.assert_is_codeunit_folder(codeunit_folder)
2960
2947
  now = datetime.now()
2961
2948
  codeunit_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(codeunit_folder)
2949
+ repository_folder = GeneralUtilities.resolve_relative_path("..", codeunit_folder)
2962
2950
  codeunit_name: str = os.path.basename(codeunit_folder)
2963
2951
  if verbosity > 2:
2964
2952
  GeneralUtilities.write_message_to_stdout(f"Start building codeunit {codeunit_name}")
@@ -2973,7 +2961,8 @@ class TasksForCommonProjectStructure:
2973
2961
 
2974
2962
  GeneralUtilities.write_message_to_stdout(f"Start building codeunit {codeunit_name}.")
2975
2963
  GeneralUtilities.write_message_to_stdout(f"Build-environmenttype: {target_environmenttype}")
2976
- self.__sc.run_program("git", "clean -dfx", codeunit_folder)
2964
+ if not self.__sc.git_repository_has_uncommitted_changes(repository_folder):
2965
+ self.__sc.run_program("git", "clean -dfx", codeunit_folder)
2977
2966
 
2978
2967
  verbosity_for_executed_programs = self.get_verbosity_from_commandline_arguments(commandline_arguments, verbosity)
2979
2968
 
@@ -3079,7 +3068,7 @@ class TasksForCommonProjectStructure:
3079
3068
  # Prepare
3080
3069
  GeneralUtilities.write_message_to_stdout("Update dependencies...")
3081
3070
  self.__sc.assert_is_git_repository(repository_folder)
3082
- codeunits = self.get_sorted_codeunits(repository_folder)
3071
+ codeunits = self.get_codeunits(repository_folder)
3083
3072
  update_dependencies_script_filename = "UpdateDependencies.py"
3084
3073
  target_environmenttype = "QualityCheck"
3085
3074
  self.build_codeunits(repository_folder, target_environmenttype=target_environmenttype, do_git_clean_when_no_changes=True, note="Prepare dependency-update") # Required because update dependencies is not always possible for not-buildet codeunits (depends on the programming language or package manager)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: ScriptCollection
3
- Version: 3.5.102
3
+ Version: 3.5.103
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
@@ -23,7 +23,7 @@ Classifier: Topic :: Utilities
23
23
  Requires-Python: >=3.10
24
24
  Description-Content-Type: text/markdown
25
25
  Requires-Dist: build>=1.2.2.post1
26
- Requires-Dist: coverage>=7.7.0
26
+ Requires-Dist: coverage>=7.7.1
27
27
  Requires-Dist: cyclonedx-bom>=5.3.0
28
28
  Requires-Dist: defusedxml>=0.7.1
29
29
  Requires-Dist: keyboard>=0.13.5
@@ -33,7 +33,7 @@ Requires-Dist: ntplib>=0.4.0
33
33
  Requires-Dist: Pillow>=11.1.0
34
34
  Requires-Dist: pycdlib>=1.14.0
35
35
  Requires-Dist: Pygments>=2.19.1
36
- Requires-Dist: pylint>=3.3.5
36
+ Requires-Dist: pylint>=3.3.6
37
37
  Requires-Dist: pyOpenSSL>=25.0.0
38
38
  Requires-Dist: PyPDF>=5.4.0
39
39
  Requires-Dist: pytest>=8.3.5
@@ -41,7 +41,7 @@ Requires-Dist: PyYAML>=6.0.2
41
41
  Requires-Dist: qrcode>=8.0
42
42
  Requires-Dist: send2trash>=1.8.3
43
43
  Requires-Dist: twine>=6.1.0
44
- Requires-Dist: xmlschema>=3.4.4
44
+ Requires-Dist: xmlschema>=3.4.5
45
45
 
46
46
  # ScriptCollection
47
47
 
@@ -6,12 +6,12 @@ ScriptCollection/ProgramRunnerEpew.py,sha256=4pjEd0r9Fcz3TTDv0MdTSd5KkigYXcWUVI1
6
6
  ScriptCollection/ProgramRunnerPopen.py,sha256=BPY7-ZMIlqT7JOKz8qlB5c0laF2Js-ijzqk09GxZC48,3821
7
7
  ScriptCollection/RPStream.py,sha256=NRRHL3YSP3D9MuAV2jB_--0KUKCsvJGxeKnxgrRZ9kY,1545
8
8
  ScriptCollection/SCLog.py,sha256=l4aekBiGoNkKGtvO_Er3NY_K7ts4ZWtIGlhq07I-4LY,30
9
- ScriptCollection/ScriptCollectionCore.py,sha256=7ZBvCfF2lM_s8XoPur8TiVvUysD1kadcWVfrW0ioELg,123984
10
- ScriptCollection/TasksForCommonProjectStructure.py,sha256=3k8IT1ny-C9eVbZzk7VQrOaeRNrG3l0OmOZ_o03ushQ,230181
9
+ ScriptCollection/ScriptCollectionCore.py,sha256=p9ofnNkzI-3_QsJwbh4auBAGSh-IkWKGlrLSh0eZyBE,125705
10
+ ScriptCollection/TasksForCommonProjectStructure.py,sha256=MpyvFNyJG7njRYvV9KULJmbn7WonR18YDeS7oI_O3UU,229780
11
11
  ScriptCollection/UpdateCertificates.py,sha256=Eynbgu7k9jLxApP2D_8Il77B6BFjJap6K7oTeEAZYbk,7790
12
12
  ScriptCollection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- scriptcollection-3.5.102.dist-info/METADATA,sha256=9AayQS3GIEdZw4dpGWfhXOR11tGd59K3Ek9e0YEYieE,7664
14
- scriptcollection-3.5.102.dist-info/WHEEL,sha256=beeZ86-EfXScwlR_HKu4SllMC9wUEj_8Z_4FJ3egI2w,91
15
- scriptcollection-3.5.102.dist-info/entry_points.txt,sha256=fYCGWGNGijBQHhFe6UAO-BEpfEOxLyNJemukt5ElSzs,3644
16
- scriptcollection-3.5.102.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
17
- scriptcollection-3.5.102.dist-info/RECORD,,
13
+ scriptcollection-3.5.103.dist-info/METADATA,sha256=q07vsHzykcNIo0Vixjx1YEAUj21qm1UVbgW70afB0O8,7664
14
+ scriptcollection-3.5.103.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
15
+ scriptcollection-3.5.103.dist-info/entry_points.txt,sha256=fYCGWGNGijBQHhFe6UAO-BEpfEOxLyNJemukt5ElSzs,3644
16
+ scriptcollection-3.5.103.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
17
+ scriptcollection-3.5.103.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.1.0)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5