scriptcollection 4.2.81__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.
Files changed (62) hide show
  1. ScriptCollection/AnionBuildPlatform.py +199 -0
  2. ScriptCollection/CertificateUpdater.py +149 -0
  3. ScriptCollection/Executables.py +921 -0
  4. ScriptCollection/GeneralUtilities.py +1589 -0
  5. ScriptCollection/HTTPMaintenanceOverheadHelper.py +36 -0
  6. ScriptCollection/OCIImages/AbstractImageHandler.py +38 -0
  7. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerDebian.py +20 -0
  8. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerDebianSlim.py +20 -0
  9. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerGeneric.py +20 -0
  10. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerGenericV.py +20 -0
  11. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerGitlabCE.py +20 -0
  12. ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerGitlabEE.py +20 -0
  13. ScriptCollection/OCIImages/ConcreteImageHandlers/__init__.py +0 -0
  14. ScriptCollection/OCIImages/OCIImageManager.py +190 -0
  15. ScriptCollection/OCIImages/__init__.py +0 -0
  16. ScriptCollection/ProcessesRunner.py +43 -0
  17. ScriptCollection/ProgramRunnerBase.py +47 -0
  18. ScriptCollection/ProgramRunnerMock.py +2 -0
  19. ScriptCollection/ProgramRunnerPopen.py +57 -0
  20. ScriptCollection/ProgramRunnerSudo.py +108 -0
  21. ScriptCollection/Resources/CultureChooser/CultureChooser.js +29 -0
  22. ScriptCollection/Resources/CultureChooser/index.html +15 -0
  23. ScriptCollection/Resources/MaintenanceSite/MaintenanceSite.html +15 -0
  24. ScriptCollection/SCLog.py +115 -0
  25. ScriptCollection/ScriptCollectionCore.py +3485 -0
  26. ScriptCollection/TFCPS/Docker/TFCPS_CodeUnitSpecific_Docker.py +192 -0
  27. ScriptCollection/TFCPS/Docker/__init__.py +0 -0
  28. ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationBase.py +8 -0
  29. ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationGenerate.py +6 -0
  30. ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationNoGenerate.py +7 -0
  31. ScriptCollection/TFCPS/DotNet/TFCPS_CodeUnitSpecific_DotNet.py +547 -0
  32. ScriptCollection/TFCPS/DotNet/__init__.py +0 -0
  33. ScriptCollection/TFCPS/Flutter/TFCPS_CodeUnitSpecific_Flutter.py +137 -0
  34. ScriptCollection/TFCPS/Flutter/__init__.py +0 -0
  35. ScriptCollection/TFCPS/Go/TFCPS_CodeUnitSpecific_Go.py +72 -0
  36. ScriptCollection/TFCPS/Go/__init__.py +0 -0
  37. ScriptCollection/TFCPS/Maven/TFCPS_CodeUnitSpecific_Maven.py +42 -0
  38. ScriptCollection/TFCPS/Maven/__init__.py +0 -0
  39. ScriptCollection/TFCPS/NodeJS/TFCPS_CodeUnitSpecific_NodeJS.py +232 -0
  40. ScriptCollection/TFCPS/NodeJS/__init__.py +0 -0
  41. ScriptCollection/TFCPS/Python/TFCPS_CodeUnitSpecific_Python.py +239 -0
  42. ScriptCollection/TFCPS/Python/__init__.py +0 -0
  43. ScriptCollection/TFCPS/Rust/TFCPS_CodeUnitSpecific_Rust.py +42 -0
  44. ScriptCollection/TFCPS/Rust/__init__.py +0 -0
  45. ScriptCollection/TFCPS/TFCPS_CodeUnitSpecific_Base.py +433 -0
  46. ScriptCollection/TFCPS/TFCPS_CodeUnit_BuildCodeUnit.py +135 -0
  47. ScriptCollection/TFCPS/TFCPS_CodeUnit_BuildCodeUnits.py +301 -0
  48. ScriptCollection/TFCPS/TFCPS_CreateRelease.py +98 -0
  49. ScriptCollection/TFCPS/TFCPS_Generic.py +44 -0
  50. ScriptCollection/TFCPS/TFCPS_MergeToMain.py +128 -0
  51. ScriptCollection/TFCPS/TFCPS_MergeToStable.py +356 -0
  52. ScriptCollection/TFCPS/TFCPS_PreBuildCodeunitsScript.py +48 -0
  53. ScriptCollection/TFCPS/TFCPS_Tools_General.py +1565 -0
  54. ScriptCollection/TFCPS/__init__.py +0 -0
  55. ScriptCollection/__init__.py +0 -0
  56. ScriptCollection/__pycache__/GeneralUtilities.cpython-311.pyc +0 -0
  57. ScriptCollection/__pycache__/__init__.cpython-311.pyc +0 -0
  58. scriptcollection-4.2.81.dist-info/METADATA +169 -0
  59. scriptcollection-4.2.81.dist-info/RECORD +62 -0
  60. scriptcollection-4.2.81.dist-info/WHEEL +5 -0
  61. scriptcollection-4.2.81.dist-info/entry_points.txt +67 -0
  62. scriptcollection-4.2.81.dist-info/top_level.txt +1 -0
@@ -0,0 +1,239 @@
1
+ import os
2
+ import re
3
+ from ...GeneralUtilities import GeneralUtilities,Dependency
4
+ from ...SCLog import LogLevel
5
+ from ..TFCPS_CodeUnitSpecific_Base import TFCPS_CodeUnitSpecific_Base,TFCPS_CodeUnitSpecific_Base_CLI
6
+
7
+ class TFCPS_CodeUnitSpecific_Python_Functions(TFCPS_CodeUnitSpecific_Base):
8
+
9
+ def __init__(self,current_file:str,verbosity:LogLevel,targetenvironmenttype:str,use_cache:bool,is_pre_merge:bool):
10
+ super().__init__(current_file, verbosity,targetenvironmenttype,use_cache,is_pre_merge)
11
+
12
+
13
+ @GeneralUtilities.check_arguments
14
+ def build(self) -> None:
15
+ codeunit_folder = self.get_codeunit_folder()
16
+ target_directory = GeneralUtilities.resolve_relative_path("../Artifacts/BuildResult_Wheel", os.path.join(self.get_artifacts_folder()))
17
+ GeneralUtilities.ensure_directory_exists(target_directory)
18
+ self._protected_sc.run_program(GeneralUtilities.get_python_executable(), f"-m build --wheel --outdir {target_directory}", codeunit_folder,print_live_output=self.get_verbosity()==LogLevel.Debug)
19
+ self.generate_bom_for_python_project( )
20
+ self.copy_source_files_to_output_directory()
21
+
22
+ @GeneralUtilities.check_arguments
23
+ def generate_bom_for_python_project(self) -> None:
24
+ codeunit_folder: str=self.get_codeunit_folder()
25
+ codeunitname: str=self.get_codeunit_name()
26
+ repository_folder = os.path.dirname(codeunit_folder)
27
+ codeunitversion = self.tfcps_Tools_General.get_version_of_codeunit(self.get_codeunit_file())
28
+ bom_folder = "Other/Artifacts/BOM"
29
+ bom_folder_full = os.path.join(codeunit_folder, bom_folder)
30
+ GeneralUtilities.ensure_directory_exists(bom_folder_full)
31
+ if not os.path.isfile(os.path.join(codeunit_folder, "requirements.txt")):
32
+ raise ValueError(f"Codeunit {codeunitname} does not have a 'requirements.txt'-file.")
33
+ # TODO check that all values from setup.cfg are contained in requirements.txt
34
+ result = self._protected_sc.run_program("cyclonedx-py", "requirements", codeunit_folder)
35
+ bom_file_relative_json = f"{bom_folder}/{codeunitname}.{codeunitversion}.bom.json"
36
+ bom_file_relative_xml = f"{bom_folder}/{codeunitname}.{codeunitversion}.bom.xml"
37
+ bom_file_json = os.path.join(codeunit_folder, bom_file_relative_json)
38
+ bom_file_xml = os.path.join(codeunit_folder, bom_file_relative_xml)
39
+
40
+ enabled:bool=False
41
+ if enabled:#TODO cyclonedx must be available for all platforms in the global sc-cache-folder
42
+ GeneralUtilities.ensure_file_exists(bom_file_json)
43
+ GeneralUtilities.write_text_to_file(bom_file_json, result[1])
44
+ cyclonedx_exe=self.tfcps_Tools_General.ensure_cyclonedxcli_is_available(not self.use_cache())
45
+ self._protected_sc.run_program(cyclonedx_exe, f"convert --input-file ./{codeunitname}/{bom_file_relative_json} --input-format json --output-file ./{codeunitname}/{bom_file_relative_xml} --output-format xml", repository_folder)
46
+ self._protected_sc.format_xml_file(bom_file_xml)
47
+ GeneralUtilities.ensure_file_does_not_exist(bom_file_json)
48
+
49
+ @GeneralUtilities.check_arguments
50
+ def linting(self) -> None:
51
+ codeunitname: str = self.get_codeunit_name()
52
+
53
+ repository_folder: str = self.get_repository_folder()
54
+ errors_found = False
55
+ self._protected_sc.log.log(f"Check for linting-issues in codeunit {codeunitname}.")
56
+ src_folder = os.path.join(repository_folder, codeunitname, codeunitname)
57
+ tests_folder = src_folder+"Tests"
58
+ # TODO check if there are errors in sarif-file
59
+ for file in GeneralUtilities.get_all_files_of_folder(src_folder)+GeneralUtilities.get_all_files_of_folder(tests_folder):
60
+ relative_file_path_in_repository = os.path.relpath(file, repository_folder)
61
+ if file.endswith(".py") and os.path.getsize(file) > 0 and not self._protected_sc.file_is_git_ignored(relative_file_path_in_repository, repository_folder):
62
+ self._protected_sc.log.log(f"Check for linting-issues in {os.path.relpath(file, os.path.join(repository_folder, codeunitname))}.")
63
+ linting_result = self._protected_sc.python_file_has_errors(file, repository_folder)
64
+ if (linting_result[0]):
65
+ errors_found = True
66
+ for error in linting_result[1]:
67
+ self._protected_sc.log.log(error, LogLevel.Warning)
68
+ if errors_found:
69
+ raise ValueError("Linting-issues occurred.")
70
+ else:
71
+ self._protected_sc.log.log("No linting-issues found.")
72
+
73
+ @GeneralUtilities.check_arguments
74
+ def do_common_tasks(self,current_codeunit_version:str )-> None:
75
+ self.do_common_tasks_base(current_codeunit_version)
76
+ codeunitname =self.get_codeunit_name()
77
+ codeunit_version = self.tfcps_Tools_General.get_version_of_project(self.get_repository_folder())
78
+ self._protected_sc.replace_version_in_ini_file(GeneralUtilities.resolve_relative_path("./setup.cfg", self.get_codeunit_folder()), codeunit_version)
79
+ self._protected_sc.replace_version_in_python_file(GeneralUtilities.resolve_relative_path(f"./{codeunitname}/{codeunitname}Core.py", self.get_codeunit_folder()), codeunit_version)
80
+
81
+ @GeneralUtilities.check_arguments
82
+ def generate_reference(self) -> None:
83
+ self.generate_reference_using_docfx()
84
+
85
+ @GeneralUtilities.check_arguments
86
+ def run_testcases(self) -> None:
87
+ codeunitname: str =self.get_codeunit_name()
88
+ repository_folder: str = self.get_repository_folder()
89
+ codeunit_folder = os.path.join(repository_folder, codeunitname)
90
+ self._protected_sc.run_program("coverage", f"run -m pytest -s ./{codeunitname}Tests", codeunit_folder)
91
+ self._protected_sc.run_program("coverage", "xml", codeunit_folder)
92
+ coveragefolder = os.path.join(repository_folder, codeunitname, "Other/Artifacts/TestCoverage")
93
+ GeneralUtilities.ensure_directory_exists(coveragefolder)
94
+ coveragefile = os.path.join(coveragefolder, "TestCoverage.xml")
95
+ GeneralUtilities.ensure_file_does_not_exist(coveragefile)
96
+ os.rename(os.path.join(repository_folder, codeunitname, "coverage.xml"), coveragefile)
97
+ self.tfcps_Tools_General.merge_packages(coveragefile,codeunitname)
98
+ self.run_testcases_common_post_task(repository_folder, codeunitname, True, self.get_type_environment_type())
99
+
100
+ @GeneralUtilities.check_arguments
101
+ def get_dependencies(self)->dict[str,set[str]]:
102
+ return GeneralUtilities.merge_dependency_lists([
103
+ self.get_dependencies_from_setupcfg(),
104
+ self.get_dependencies_from_requirementstxt(),
105
+ self.get_dependencies_from_otherrequirementstxt()
106
+ ])
107
+
108
+ @GeneralUtilities.check_arguments
109
+ def get_dependencies_from_setupcfg(self)->list[Dependency]:
110
+ setupcfg_file=os.path.join(self.get_codeunit_folder(),"setup.cfg")
111
+ lines = GeneralUtilities.read_lines_from_file(setupcfg_file)
112
+ result:list[Dependency]=[]
113
+ is_in_dependency_section=False
114
+ for line in lines:
115
+ if line=="install_requires =":
116
+ is_in_dependency_section=True
117
+ elif line.startswith(" "):
118
+ if is_in_dependency_section:
119
+ match = re.match(r"^\s*([A-Za-z0-9_\-]+)\s*([<>=!~]+)?\s*(.*)?$", line)
120
+ if match:
121
+ dep_name = match.group(1)
122
+ dep_operator = match.group(2) or None#pylint:disable=unused-variable
123
+ dep_version = match.group(3) or None
124
+ dep=Dependency(dep_name,dep_version)
125
+ result.append(dep)
126
+ else:
127
+ raise ValueError(f"Unparsable dependency-definition-line: \"{line}\"")
128
+ else:
129
+ is_in_dependency_section=False
130
+ return result
131
+
132
+ @GeneralUtilities.check_arguments
133
+ def get_dependencies_from_requirementstxt(self)->list[Dependency]:
134
+ return self.get_dependencies_from_requirementsfile(os.path.join(self.get_codeunit_folder(),"requirements.txt"))
135
+
136
+ @GeneralUtilities.check_arguments
137
+ def get_dependencies_from_otherrequirementstxt(self)->list[Dependency]:
138
+ rfile=os.path.join(self.get_codeunit_folder(),"Other","requirements.txt")
139
+ if os.path.isfile(rfile):
140
+ return self.get_dependencies_from_requirementsfile(rfile)
141
+ else:
142
+ return []
143
+
144
+ @GeneralUtilities.check_arguments
145
+ def get_dependencies_from_requirementsfile(self,file:str)->list[Dependency]:
146
+ lines = GeneralUtilities.read_lines_from_file(file)
147
+ result:list[Dependency]=[]
148
+ for line in lines:
149
+ match = re.match(r"^([A-Za-z0-9_\-]+)\s*([<>=!~]+)?\s*(.*)?$", line)
150
+ if match:
151
+ dep_name = match.group(1)
152
+ dep_operator = match.group(2) or None#pylint:disable=unused-variable
153
+ dep_version = match.group(3) or None
154
+ dep=Dependency(dep_name,dep_version)
155
+ result.append(dep)
156
+
157
+ return result
158
+
159
+ @GeneralUtilities.check_arguments
160
+ def get_available_versions(self,dependencyname:str)->list[str]:
161
+ result=self._protected_sc.run_program("pip3",f"index versions {dependencyname}")
162
+ available_versions_line:str=[line for line in GeneralUtilities.string_to_lines(result[1]) if line.startswith("Available versions: ")][0]
163
+ available_versions=[version_str.strip() for version_str in available_versions_line[len("Available versions: "):].split(",")]
164
+ result=[]
165
+ for v in available_versions:
166
+ if re.match(r"^(\d+)\.(\d+)\.(\d+)$", v) is not None:
167
+ result.append(v)
168
+ elif re.match(r"^(\d+)\.(\d+)$", v) is not None:
169
+ result.append(v+".0")
170
+ elif re.match(r"^(\d+)$", v) is not None:
171
+ result.append(v+".0.0")
172
+ return result
173
+
174
+ @GeneralUtilities.check_arguments
175
+ def set_dependency_version(self,name:str,new_version:str)->None:
176
+ self.__set_dependency_version_in_setupcfg(name,new_version)
177
+ self.__set_dependency_version_in_requirementstxt(name,new_version)
178
+ self.__set_dependency_version_in_otherrequirementstxt(name,new_version)
179
+
180
+ @GeneralUtilities.check_arguments
181
+ def __set_dependency_version_in_setupcfg(self,name:str,new_version:str)->None:
182
+ setupcfg_file=os.path.join(self.get_codeunit_folder(),"setup.cfg")
183
+ lines=GeneralUtilities.read_lines_from_file(setupcfg_file)
184
+ new_lines:list[str]=[]
185
+ for line in lines:
186
+ match = re.match("^(\\s*)("+re.escape(name)+")\\s*([<>=!~]+)?\\s*(.*)?$", line)
187
+ if match:
188
+ whitespace = match.group(1)
189
+ dep_name = match.group(2)#pylint:disable=unused-variable
190
+ dep_operator = match.group(3) or None
191
+ dep_version = match.group(4) or None#pylint:disable=unused-variable
192
+ new_line=whitespace+name
193
+ if dep_operator is None:
194
+ dep_operator=">="
195
+ new_line=new_line+dep_operator+new_version
196
+ new_lines.append(new_line)
197
+ else:
198
+ new_lines.append(line)
199
+ GeneralUtilities.write_lines_to_file(setupcfg_file,new_lines)
200
+
201
+ @GeneralUtilities.check_arguments
202
+ def __set_dependency_version_in_requirementstxt(self,name:str,new_version:str)->None:
203
+ self.__set_dependency_version_in_requirements(name,new_version,os.path.join(self.get_codeunit_folder(),"requirements.txt"))
204
+
205
+ @GeneralUtilities.check_arguments
206
+ def __set_dependency_version_in_otherrequirementstxt(self,name:str,new_version:str)->None:
207
+ rfile=os.path.join(self.get_codeunit_folder(),"Other","requirements.txt")
208
+ if os.path.isfile(rfile):
209
+ self.__set_dependency_version_in_requirements(name,new_version,rfile)
210
+
211
+ @GeneralUtilities.check_arguments
212
+ def __set_dependency_version_in_requirements(self,name:str,new_version:str,requirementsfile:str)->None:
213
+ lines=GeneralUtilities.read_lines_from_file(requirementsfile)
214
+ new_lines:list[str]=[]
215
+ for line in lines:
216
+ match = re.match("^("+re.escape(name)+")\\s*([<>=!~]+)?\\s*(.*)?$", line)
217
+ if match:
218
+ dep_name = match.group(1)#pylint:disable=unused-variable
219
+ dep_operator = match.group(2) or None
220
+ dep_version = match.group(3) or None#pylint:disable=unused-variable
221
+ new_line=name
222
+ if dep_operator is None:
223
+ dep_operator=">="
224
+ new_line=new_line+dep_operator+new_version
225
+ new_lines.append(new_line)
226
+ else:
227
+ new_lines.append(line)
228
+ GeneralUtilities.write_lines_to_file(requirementsfile,new_lines)
229
+
230
+ class TFCPS_CodeUnitSpecific_Python_CLI:
231
+
232
+ @staticmethod
233
+ @GeneralUtilities.check_arguments
234
+ def parse(file:str)->TFCPS_CodeUnitSpecific_Python_Functions:
235
+ parser=TFCPS_CodeUnitSpecific_Base_CLI.get_base_parser()
236
+ #add custom parameter if desired
237
+ args=parser.parse_args()
238
+ result:TFCPS_CodeUnitSpecific_Python_Functions=TFCPS_CodeUnitSpecific_Python_Functions(file,LogLevel(int(args.verbosity)),args.targetenvironmenttype,not args.nocache,args.ispremerge)
239
+ return result
File without changes
@@ -0,0 +1,42 @@
1
+ from ...GeneralUtilities import GeneralUtilities
2
+ from ...SCLog import LogLevel
3
+ from ..TFCPS_CodeUnitSpecific_Base import TFCPS_CodeUnitSpecific_Base, TFCPS_CodeUnitSpecific_Base_CLI
4
+
5
+ class TFCPS_CodeUnitSpecific_Rust_Functions(TFCPS_CodeUnitSpecific_Base):
6
+
7
+ def __init__(self, current_file: str, verbosity: LogLevel, targetenvironmenttype: str, use_cache: bool, is_pre_merge: bool):
8
+ super().__init__(current_file, verbosity, targetenvironmenttype, use_cache, is_pre_merge)
9
+
10
+ @GeneralUtilities.check_arguments
11
+ def build(self) -> None:
12
+ pass#TODO
13
+
14
+ @GeneralUtilities.check_arguments
15
+ def linting(self) -> None:
16
+ pass#TODO
17
+
18
+ @GeneralUtilities.check_arguments
19
+ def run_testcases(self) -> None:
20
+ pass#TODO
21
+
22
+ def get_dependencies(self) -> dict[str, set[str]]:
23
+ return dict[str, set[str]]()#TODO
24
+
25
+ @GeneralUtilities.check_arguments
26
+ def get_available_versions(self, dependencyname: str) -> list[str]:
27
+ return []#TODO
28
+
29
+ @GeneralUtilities.check_arguments
30
+ def set_dependency_version(self, name: str, new_version: str) -> None:
31
+ raise ValueError("Operation is not implemented.")
32
+
33
+ class TFCPS_CodeUnitSpecific_Rust_CLI:
34
+
35
+ @staticmethod
36
+ @GeneralUtilities.check_arguments
37
+ def parse(file: str) -> TFCPS_CodeUnitSpecific_Rust_Functions:
38
+ parser = TFCPS_CodeUnitSpecific_Base_CLI.get_base_parser()
39
+ #add custom parameter if desired
40
+ args = parser.parse_args()
41
+ result: TFCPS_CodeUnitSpecific_Rust_Functions = TFCPS_CodeUnitSpecific_Rust_Functions(file, LogLevel(int(args.verbosity)), args.targetenvironmenttype, not args.nocache, args.ispremerge)
42
+ return result
File without changes