ScriptCollection 4.0.43__py3-none-any.whl → 4.0.45__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.
@@ -37,7 +37,7 @@ from .ProgramRunnerPopen import ProgramRunnerPopen
37
37
  from .ProgramRunnerEpew import ProgramRunnerEpew, CustomEpewArgument
38
38
  from .SCLog import SCLog, LogLevel
39
39
 
40
- version = "4.0.43"
40
+ version = "4.0.45"
41
41
  __version__ = version
42
42
 
43
43
 
@@ -2473,7 +2473,7 @@ OCR-content:
2473
2473
  def get_lines_of_code(self, repository: str, excluded_pattern: list[str]) -> int:
2474
2474
  self.assert_is_git_repository(repository)
2475
2475
  result: int = 0
2476
- self.log.log(f"Calculate lines of code in repository '{repository}' with excluded patterns: {', '.join(excluded_pattern)}")
2476
+ self.log.log(f"Calculate lines of code in repository '{repository}' with excluded patterns: {', '.join(excluded_pattern)}",LogLevel.Debug)
2477
2477
  git_response = self.run_program("git", "ls-files", repository)
2478
2478
  files: list[str] = GeneralUtilities.string_to_lines(git_response[1])
2479
2479
  for file in files:
@@ -427,11 +427,11 @@ class TFCPS_CodeUnitSpecific_DotNet_Functions(TFCPS_CodeUnitSpecific_Base):
427
427
  GeneralUtilities.ensure_directory_exists(temp_folder)
428
428
  runsettings_file = "runsettings.xml"
429
429
  codeunit_folder = f"{repository_folder}/{codeunit_name}"
430
- arg = f"test . -c {dotnet_build_configuration} -o {temp_folder}"
430
+ arg = f"test . -c {dotnet_build_configuration}"
431
431
  if os.path.isfile(os.path.join(codeunit_folder, runsettings_file)):
432
432
  arg = f"{arg} --settings {runsettings_file}"
433
433
  arg = f"{arg} /p:CollectCoverage=true /p:CoverletOutput=../Other/Artifacts/TestCoverage/Testcoverage /p:CoverletOutputFormat=cobertura"
434
- self._protected_sc.run_program("dotnet", arg, codeunit_folder, print_live_output=True)
434
+ test_run_result=self._protected_sc.run_program("dotnet", arg, codeunit_folder, print_live_output=True)#pylint:disable=unused-variable
435
435
  target_file = os.path.join(coverage_file_folder, "TestCoverage.xml")
436
436
  GeneralUtilities.ensure_file_does_not_exist(target_file)
437
437
  os.rename(os.path.join(coverage_file_folder, "Testcoverage.cobertura.xml"), target_file)
@@ -28,6 +28,21 @@ class TFCPS_CodeUnit_BuildCodeUnits:
28
28
  self.additionalargumentsfile=additionalargumentsfile
29
29
  self.__is_pre_merge=is_pre_merge
30
30
 
31
+ @GeneralUtilities.check_arguments
32
+ def __save_lines_of_code(self, repository_folder: str, project_version: str) -> None:
33
+ loc = self.sc.get_lines_of_code_with_default_excluded_patterns(repository_folder)
34
+ loc_metric_folder = os.path.join(repository_folder, "Other", "Metrics")
35
+ GeneralUtilities.ensure_directory_exists(loc_metric_folder)
36
+ loc_metric_file = os.path.join(loc_metric_folder, "LinesOfCode.csv")
37
+ GeneralUtilities.ensure_file_exists(loc_metric_file)
38
+ old_lines = GeneralUtilities.read_lines_from_file(loc_metric_file)
39
+ new_lines = []
40
+ for line in old_lines:
41
+ if not line.startswith(f"v{project_version};"):
42
+ new_lines.append(line)
43
+ new_lines.append(f"v{project_version};{loc}")
44
+ GeneralUtilities.write_lines_to_file(loc_metric_file, new_lines)
45
+
31
46
  @GeneralUtilities.check_arguments
32
47
  def build_codeunits(self) -> None:
33
48
  self.sc.log.log(GeneralUtilities.get_line())
@@ -61,9 +76,6 @@ class TFCPS_CodeUnit_BuildCodeUnits:
61
76
  from_day = datetime(now.year, now.month, now.day, 0, 0, 0)
62
77
  self.tFCPS_Other.mark_current_version_as_supported(self.repository,project_version,from_day,until_day)
63
78
 
64
- #TODO search for secrets using TruffleHog
65
- #TODO run static code analysis tool to search for vulnerabilities
66
-
67
79
  codeunits:list[str]=self.tFCPS_Other.get_codeunits(self.repository)
68
80
  self.sc.log.log("Codeunits will be built in the following order:")
69
81
  for codeunit_name in codeunits:
@@ -72,10 +84,34 @@ class TFCPS_CodeUnit_BuildCodeUnits:
72
84
  tFCPS_CodeUnit_BuildCodeUnit:TFCPS_CodeUnit_BuildCodeUnit = TFCPS_CodeUnit_BuildCodeUnit(os.path.join(self.repository,codeunit_name),self.sc.log.loglevel,self.target_environment_type,self.additionalargumentsfile,self.use_cache(),self.is_pre_merge())
73
85
  self.sc.log.log(GeneralUtilities.get_line())
74
86
  tFCPS_CodeUnit_BuildCodeUnit.build_codeunit()
87
+
88
+ #TODO run static code analysis tool to search for vulnerabilities
89
+ self.__search_for_secrets()
90
+ self.__save_lines_of_code(self.repository,self.tFCPS_Other.get_version_of_project(self.repository))
91
+
75
92
  self.sc.log.log(GeneralUtilities.get_line())
76
93
  self.sc.log.log("Finished building codeunits.")
77
94
  self.sc.log.log(GeneralUtilities.get_line())
78
95
 
96
+ def __search_for_secrets(self):
97
+ exe_paths=self.tFCPS_Other.ensure_trufflehog_is_available()
98
+ exe_path:str=None
99
+ if GeneralUtilities.current_system_is_windows():
100
+ exe_path=exe_paths["Windows"]
101
+ elif GeneralUtilities.current_system_is_linux():
102
+ exe_path=exe_paths["Linux"]
103
+ else:
104
+ raise ValueError("unsupported")#TODO check for macos
105
+ result=self.sc.run_program(exe_path,"filesystem . --json",self.repository)
106
+
107
+ enabled:bool=False
108
+ if enabled:
109
+ self.sc.log.log("Secret-scan-result:")#TODO replace this by real analysis
110
+ for line in GeneralUtilities.string_to_lines(result[1]):
111
+ self.sc.log.log(line)
112
+ for line in GeneralUtilities.string_to_lines(result[2]):
113
+ self.sc.log.log(line,LogLevel.Error)
114
+
79
115
  @GeneralUtilities.check_arguments
80
116
  def use_cache(self) -> bool:
81
117
  return self.__use_cache
@@ -5,6 +5,7 @@ from pathlib import Path
5
5
  import shutil
6
6
  import zipfile
7
7
  import tarfile
8
+ import time
8
9
  import re
9
10
  import sys
10
11
  import json
@@ -61,15 +62,18 @@ class TFCPS_Tools_General:
61
62
  if not file_exists:
62
63
  self.__sc.log.log(f"Download Asset \"{githubuser}/{githubprojectname}: {resource_name}\" from GitHub to global cache...", LogLevel.Information)
63
64
  GeneralUtilities.ensure_folder_exists_and_is_empty(resource_folder)
64
- headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.96 Safari/537.36'}
65
+ headers = { 'User-Agent': 'Mozilla/5.0'}
65
66
  self.__add_github_api_key_if_available(headers)
66
67
  url = f"https://api.github.com/repos/{githubuser}/{githubprojectname}/releases/latest"
67
68
  self.__sc.log.log(f"Download \"{url}\"...", LogLevel.Debug)
69
+ time.sleep(2)
68
70
  response = requests.get(url, headers=headers, allow_redirects=True, timeout=(10, 10))
69
- latest_version = response.json()["tag_name"]
71
+ response_json=response.json()
72
+ latest_version = response_json["tag_name"]
70
73
  filename_on_github = get_filename_on_github(latest_version)
71
74
  link = f"https://github.com/{githubuser}/{githubprojectname}/releases/download/{latest_version}/{filename_on_github}"
72
- with requests.get(link, headers=headers, stream=True, allow_redirects=True, timeout=(5, 300)) as r:
75
+ time.sleep(2)
76
+ with requests.get(link, headers=headers, stream=True, allow_redirects=True, timeout=(5, 600)) as r:
73
77
  r.raise_for_status()
74
78
  total_size = int(r.headers.get("Content-Length", 0))
75
79
  downloaded = 0
@@ -84,7 +88,7 @@ class TFCPS_Tools_General:
84
88
  sys.stdout.write(f"\rDownload: {percent:.2f}%")
85
89
  sys.stdout.flush()
86
90
  self.__sc.log.log(f"Downloaded \"{url}\".", LogLevel.Diagnostic)
87
- GeneralUtilities.assert_file_exists(file)
91
+ GeneralUtilities.assert_file_exists(file)
88
92
  return file
89
93
 
90
94
  def __add_github_api_key_if_available(self, headers: dict):
@@ -555,6 +559,38 @@ class TFCPS_Tools_General:
555
559
  lines.append("@enduml")
556
560
 
557
561
  GeneralUtilities.write_lines_to_file(target_file, lines)
562
+
563
+ @GeneralUtilities.check_arguments
564
+ def ensure_trufflehog_is_available(self,enforce_update:bool=False) -> dict[str,str]:
565
+ def download_and_extract(osname: str, osname_in_github_asset: str, extension: str):
566
+ resource_name: str = f"TruffleHog_{osname}"
567
+ zip_filename: str = f"{resource_name}.{extension}"
568
+ target_folder_unextracted = os.path.join(self.get_global_cache_folder(),"Tools",resource_name+"_Unextracted")
569
+ target_folder_extracted = os.path.join(self.get_global_cache_folder(),"Tools",resource_name)
570
+ update:bool=not os.path.isdir(target_folder_extracted) or GeneralUtilities.folder_is_empty(target_folder_extracted) or enforce_update
571
+ if update:
572
+ downloaded_file=self.ensure_file_from_github_assets_is_available_with_retry(target_folder_unextracted, "trufflesecurity", "trufflehog", resource_name+"_Unextracted", zip_filename, lambda latest_version: f"trufflehog_{latest_version[1:]}_{osname_in_github_asset}_amd64.tar.gz",enforce_update=enforce_update)
573
+ #TODO add option to also download arm-version
574
+ local_zip_file: str = downloaded_file
575
+ GeneralUtilities.ensure_folder_exists_and_is_empty(target_folder_extracted)
576
+ if extension == "zip":
577
+ with zipfile.ZipFile(local_zip_file, 'r') as zip_ref:
578
+ zip_ref.extractall(target_folder_extracted)
579
+ elif extension == "tar.gz":
580
+ with tarfile.open(local_zip_file, "r:gz") as tar:
581
+ tar.extractall(path=target_folder_extracted)
582
+ else:
583
+ raise ValueError(f"Unknown extension: \"{extension}\"")
584
+ GeneralUtilities.ensure_directory_does_not_exist(target_folder_unextracted)
585
+ GeneralUtilities.assert_folder_exists(target_folder_extracted)
586
+ executable=[f for f in GeneralUtilities.get_all_files_of_folder(target_folder_extracted) if os.path.basename(f).startswith("trufflehog")][0]
587
+ return executable
588
+
589
+ result=dict[str,str]()
590
+ result["Windows"]=download_and_extract("Windows", "windows", "tar.gz")
591
+ result["Linux"]=download_and_extract("Linux", "linux", "tar.gz")
592
+ result["MacOS"]=download_and_extract("MacOS", "darwin", "tar.gz")
593
+ return result
558
594
 
559
595
  @GeneralUtilities.check_arguments
560
596
  def generate_tasksfile_from_workspace_file(self, repository_folder: str, append_cli_args_at_end: bool = False) -> None:
@@ -671,9 +707,9 @@ class TFCPS_Tools_General:
671
707
  if repository_subname is not None:
672
708
  target_folder = f"{resrepo_data_folder}/{repository_subname}"
673
709
 
674
- update:bool=GeneralUtilities.folder_is_empty(target_folder) or not use_cache
710
+ update:bool=not os.path.isdir(target_folder) or GeneralUtilities.folder_is_empty(target_folder) or not use_cache
675
711
  if update:
676
- self.__sc.run_program(f"Clone {remote_repository_link} as resource", LogLevel.Information)
712
+ self.__sc.log.log(f"Clone {remote_repository_link} as resource...", LogLevel.Information)
677
713
  GeneralUtilities.ensure_folder_exists_and_is_empty(target_folder)
678
714
  self.__sc.run_program("git", f"clone --recurse-submodules {remote_repository_link} {target_folder}")
679
715
  self.__sc.run_program("git", f"checkout {latest_version}", target_folder)
@@ -755,7 +791,7 @@ class TFCPS_Tools_General:
755
791
  @GeneralUtilities.check_arguments
756
792
  def do_npm_install(self, package_json_folder: str, npm_force: bool,use_cache:bool) -> None:
757
793
  target_folder:str=os.path.join(package_json_folder,"node_modules")
758
- update:bool=GeneralUtilities.folder_is_empty(target_folder) or GeneralUtilities.folder_is_empty(target_folder) or not use_cache
794
+ update:bool=not os.path.isdir(target_folder) or GeneralUtilities.folder_is_empty(target_folder) or not use_cache
759
795
  if update:
760
796
  self.__sc.log.log("Do npm-install...")
761
797
  argument1 = "install"
@@ -966,7 +1002,7 @@ class TFCPS_Tools_General:
966
1002
  @GeneralUtilities.check_arguments
967
1003
  def ensure_openapigenerator_is_available(self, codeunit_folder: str,use_cache:bool) -> None:
968
1004
  self.assert_is_codeunit_folder(codeunit_folder)
969
- openapigenerator_folder = os.path.join(codeunit_folder, "Other", "Resources", "OpenAPIGenerator")
1005
+ openapigenerator_folder = os.path.join(self.get_global_cache_folder(), "Tools", "OpenAPIGenerator")
970
1006
  filename = "open-api-generator.jar"
971
1007
  jar_file = f"{openapigenerator_folder}/{filename}"
972
1008
  jar_file_exists = os.path.isfile(jar_file)
@@ -979,6 +1015,8 @@ class TFCPS_Tools_General:
979
1015
  GeneralUtilities.ensure_directory_does_not_exist(openapigenerator_folder)
980
1016
  GeneralUtilities.ensure_directory_exists(openapigenerator_folder)
981
1017
  urllib.request.urlretrieve(download_link, jar_file)
1018
+ GeneralUtilities.assert_file_exists(jar_file)
1019
+ return jar_file
982
1020
 
983
1021
  @GeneralUtilities.check_arguments
984
1022
  def standardized_tasks_update_version_in_docker_examples(self, codeunit_folder:str, codeunit_version:str) -> None:
@@ -1159,3 +1197,14 @@ class TFCPS_Tools_General:
1159
1197
  self.generate_tasksfile_from_workspace_file(repository_folder)
1160
1198
  self.generate_codeunits_overview_diagram(repository_folder)
1161
1199
  self.generate_svg_files_from_plantuml_files_for_repository(repository_folder,use_cache)
1200
+
1201
+ @GeneralUtilities.check_arguments
1202
+ def copy_product_resource_to_codeunit_resource_folder(self, codeunit_folder: str, resourcename: str) -> None:
1203
+ repository_folder = GeneralUtilities.resolve_relative_path(f"..", codeunit_folder)
1204
+ self.__sc.assert_is_git_repository(repository_folder)
1205
+ src_folder = GeneralUtilities.resolve_relative_path(f"Other/Resources/{resourcename}", repository_folder)
1206
+ GeneralUtilities.assert_condition(os.path.isdir(src_folder), f"Required product-resource {resourcename} does not exist. Expected folder: {src_folder}")
1207
+ trg_folder = GeneralUtilities.resolve_relative_path(f"Other/Resources/{resourcename}", codeunit_folder)
1208
+ GeneralUtilities.ensure_directory_does_not_exist(trg_folder)
1209
+ GeneralUtilities.ensure_directory_exists(trg_folder)
1210
+ GeneralUtilities.copy_content_of_folder(src_folder, trg_folder)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ScriptCollection
3
- Version: 4.0.43
3
+ Version: 4.0.45
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
@@ -9,25 +9,25 @@ ScriptCollection/ProgramRunnerEpew.py,sha256=TJdDx9zIMSiCaXh8X-ekrMlbXfGtmd0Mmyx
9
9
  ScriptCollection/ProgramRunnerMock.py,sha256=uTu-aFle1W_oKjeQEmuPsFPQpvo0kRf2FrRjAPIwT5Y,37
10
10
  ScriptCollection/ProgramRunnerPopen.py,sha256=BPY7-ZMIlqT7JOKz8qlB5c0laF2Js-ijzqk09GxZC48,3821
11
11
  ScriptCollection/SCLog.py,sha256=dxGOI4E9lG5v9jk_LajXCkM5nghliCDV8YB8Ihn160s,4541
12
- ScriptCollection/ScriptCollectionCore.py,sha256=hzraZbT2qQrny90RSK55aVMmrQPMPIiHAiB35Coj8U4,142098
12
+ ScriptCollection/ScriptCollectionCore.py,sha256=_qwjaWj7vuU1BSkTgn94r2hw5I4G0Ox0WY58-8k3a5A,142113
13
13
  ScriptCollection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  ScriptCollection/TFCPS/TFCPS_CodeUnitSpecific_Base.py,sha256=2Ng-GyKWQ6FfTUmogd7g-xF6_XeTMxvkeJddagxFR5o,25853
15
15
  ScriptCollection/TFCPS/TFCPS_CodeUnit_BuildCodeUnit.py,sha256=4rYKgTAga11NiDx8YUqz3K_Q4eX_n3kC6lvNdXEa24s,7389
16
- ScriptCollection/TFCPS/TFCPS_CodeUnit_BuildCodeUnits.py,sha256=h3PWj7SgJF9huMognPpfNwGb9E9Y9HQ0Ym72yvvJwwg,5676
16
+ ScriptCollection/TFCPS/TFCPS_CodeUnit_BuildCodeUnits.py,sha256=EH5yV33emYfbYqdikrPgW9UdF7UYV6rpBS1JGHNxA6M,7483
17
17
  ScriptCollection/TFCPS/TFCPS_CreateRelease.py,sha256=bcJlfI062Eoq7MOIhun-_iNG7SdO1ZIuC_cylaoLI1s,6332
18
18
  ScriptCollection/TFCPS/TFCPS_Generic.py,sha256=O-0guM_LJCcZmPZJhMgTvXD2RXUJEBWWv6Bt6hDFhvM,1943
19
19
  ScriptCollection/TFCPS/TFCPS_MergeToMain.py,sha256=41g219jaBRZ2VQCrWM4-Trvervrt8b5oATPwIIGNpag,7244
20
20
  ScriptCollection/TFCPS/TFCPS_MergeToStable.py,sha256=ifB1K6A903vvfH0LvtiFbZgYSgR94thfEI-jjf40LpU,21653
21
21
  ScriptCollection/TFCPS/TFCPS_PreBuildCodeunitsScript.py,sha256=CxdwUklhZVuJGp0vcokoH_KMXFzmlUlZwj77xFYijho,2242
22
22
  ScriptCollection/TFCPS/TFCPS_Tools_Dependencies.py,sha256=o7HI3ki3WWqlAiUsrh3Lky_w6UhYh9hdjYPGOhubQGA,414
23
- ScriptCollection/TFCPS/TFCPS_Tools_General.py,sha256=S_uQX8kmjntIe8b_3FVh7ABgPCBcLCCpmewMv2gVvD4,73160
23
+ ScriptCollection/TFCPS/TFCPS_Tools_General.py,sha256=wqF_szXoB_EMMvpdYdow20v2A2E5jT3P3Op-tgT0y-s,76517
24
24
  ScriptCollection/TFCPS/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  ScriptCollection/TFCPS/Docker/TFCPS_CodeUnitSpecific_Docker.py,sha256=-g8h2gCf9rh0KJXUBeQD5d0qLJgBU3Q8DNZXM1UXC04,5259
26
26
  ScriptCollection/TFCPS/Docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationBase.py,sha256=bT6Gd5pQpZCw4OQz6HWkPCSn5z__eUUEisABLDSxd0o,200
28
28
  ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationGenerate.py,sha256=QyjOfMY22JWCvKjMelHiDWbJiWqotOfebpJpgDUaoO4,237
29
29
  ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationNoGenerate.py,sha256=i0zEGehj0sttxjjZtoq2KFSKp_ulxVyWp_ZgAhIY_So,241
30
- ScriptCollection/TFCPS/DotNet/TFCPS_CodeUnitSpecific_DotNet.py,sha256=myR8hG2RMGg59S6Rf0Ts7R7df2IIVFDkazu4XSmSvrA,31001
30
+ ScriptCollection/TFCPS/DotNet/TFCPS_CodeUnitSpecific_DotNet.py,sha256=ufeWuqtNOPAtEyHayxHGPdjiJsT0lxYR2gAWle9p7T4,31031
31
31
  ScriptCollection/TFCPS/DotNet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  ScriptCollection/TFCPS/Flutter/TFCPS_CodeUnitSpecific_Flutter.py,sha256=TIR95f6TVOnW25ieX9q4RUi1FogbYEfrlZOcZ1aE014,6969
33
33
  ScriptCollection/TFCPS/Flutter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -35,8 +35,8 @@ ScriptCollection/TFCPS/NodeJS/TFCPS_CodeUnitSpecific_NodeJS.py,sha256=dnuDlQXThF
35
35
  ScriptCollection/TFCPS/NodeJS/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  ScriptCollection/TFCPS/Python/TFCPS_CodeUnitSpecific_Python.py,sha256=q7msAxCb5VIZ-xhFg1MfzUvWomQRKYldqmW42KFhyMU,6868
37
37
  ScriptCollection/TFCPS/Python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- scriptcollection-4.0.43.dist-info/METADATA,sha256=gUEW02jG627c1YV8_WeShyqVa8XFVr8NWTiyn1UMfYc,7688
39
- scriptcollection-4.0.43.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
- scriptcollection-4.0.43.dist-info/entry_points.txt,sha256=NeU26D6q7d8n2cmKQiOvHK21w1C7D2kxoNRJaKiyZ5w,4295
41
- scriptcollection-4.0.43.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
42
- scriptcollection-4.0.43.dist-info/RECORD,,
38
+ scriptcollection-4.0.45.dist-info/METADATA,sha256=qzrk27G_cN2Gw5hfAfffblykLWFYU0CH1TiOtRVaDDs,7688
39
+ scriptcollection-4.0.45.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
+ scriptcollection-4.0.45.dist-info/entry_points.txt,sha256=RhfJxpWvSMIkdQ_1Pan1uXPTgYCTD1EcP0ZshkA2vtA,4366
41
+ scriptcollection-4.0.45.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
42
+ scriptcollection-4.0.45.dist-info/RECORD,,
@@ -56,6 +56,7 @@ scsetcontentoffile = ScriptCollection.Executables:SetContentOfFile
56
56
  scshow2faasqrcode = ScriptCollection.Executables:Show2FAAsQRCode
57
57
  scshowmissingfiles = ScriptCollection.Executables:ShowMissingFiles
58
58
  scsigncertificate = ScriptCollection.Executables:SignCertificate
59
+ scupdatedependencies = ScriptCollection.Executables:UpdateDependencies
59
60
  scupdateimagesindockercomposefile = ScriptCollection.Executables:UpdateImagesInDockerComposeFile
60
61
  scupdatenugetpackagesincsharpproject = ScriptCollection.Executables:UpdateNugetpackagesInCsharpProject
61
62
  scupdatetimestampinfile = ScriptCollection.Executables:UpdateTimestampInFile