ScriptCollection 4.2.39__py3-none-any.whl → 4.2.41__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.
@@ -23,7 +23,7 @@ class CultureChooser:
23
23
  GeneralUtilities.assert_condition("en" in supported_languages, "The default language 'en' must be included in the list of supported languages.")
24
24
  for supported_language in supported_languages:
25
25
  GeneralUtilities.assert_condition(self.is_valid_culture(supported_language), f"Invalid language code '{supported_language}'. Supported languages must be in the format 'en' or 'en-US'.")
26
- content = GeneralUtilities._internal_load_resource("CultureChooser/index.html")
26
+ content = GeneralUtilities._internal_load_resource("CultureChooser/CultureChooser.js")
27
27
  content_as_string = content.decode("utf-8")
28
- result=GeneralUtilities.replace_variable("/*","supportedCultures","*/", ",".join([f"\"{supported_language}\"" for supported_language in supported_languages]), content_as_string)
28
+ result=GeneralUtilities.replace_variable("/*","supportedCultures","*/", ", ".join([f"\"{supported_language}\"" for supported_language in supported_languages]), content_as_string)
29
29
  return result
@@ -654,10 +654,12 @@ def Espoc() -> int:
654
654
  time.sleep(1)
655
655
  GeneralUtilities.write_message_to_stdout(f"Process with id {process_id} is not running anymore. Start terminating remaining processes.")
656
656
  if os.path.exists(process_list_file):
657
- for line in GeneralUtilities.read_lines_from_file(process_list_file):
658
- if GeneralUtilities.string_has_content(line):
659
- current_process_id = int(line.strip())
657
+ for line in GeneralUtilities.read_nonempty_lines_from_file(process_list_file):
658
+ current_process_id = int(line.strip())
659
+ try:
660
660
  GeneralUtilities.kill_process(current_process_id, True)
661
+ except Exception as exception:
662
+ GeneralUtilities.write_exception_to_stderr(exception,"Error while terminating process with id "+str(current_process_id))
661
663
  GeneralUtilities.ensure_file_does_not_exist(process_list_file)
662
664
  GeneralUtilities.write_message_to_stdout("All started processes terminated.")
663
665
  else:
@@ -2,7 +2,6 @@ import re
2
2
  import os
3
3
  from os import listdir
4
4
  from os.path import isfile, join, isdir
5
- import codecs
6
5
  import platform
7
6
  import inspect
8
7
  import ctypes
@@ -527,6 +526,7 @@ class GeneralUtilities:
527
526
  @staticmethod
528
527
  @check_arguments
529
528
  def file_ends_with_newline(file: str) -> bool:
529
+ file=GeneralUtilities.normaliza_path(file)
530
530
  with open(file, "rb") as file_object:
531
531
  return GeneralUtilities.ends_with_newline_character(file_object.read())
532
532
 
@@ -559,11 +559,13 @@ class GeneralUtilities:
559
559
  @staticmethod
560
560
  @check_arguments
561
561
  def append_line_to_file(file: str, line: str, encoding: str = "utf-8") -> None:
562
+ file=GeneralUtilities.normaliza_path(file)
562
563
  GeneralUtilities.append_lines_to_file(file, [line], encoding)
563
564
 
564
565
  @staticmethod
565
566
  @check_arguments
566
567
  def append_lines_to_file(file: str, lines: list[str], encoding: str = "utf-8") -> None:
568
+ file=GeneralUtilities.normaliza_path(file)
567
569
  if len(lines) == 0:
568
570
  return
569
571
  is_first_line = True
@@ -586,6 +588,7 @@ class GeneralUtilities:
586
588
  @staticmethod
587
589
  @check_arguments
588
590
  def append_to_file(file: str, content: str, encoding: str = "utf-8") -> None:
591
+ file=GeneralUtilities.normaliza_path(file)
589
592
  GeneralUtilities.assert_condition(not "\n" in content, "Appending multiple lines is not allowed. Use append_lines_to_file instead.")
590
593
  with open(file, "a", encoding=encoding) as fileObject:
591
594
  fileObject.write(content)
@@ -593,12 +596,14 @@ class GeneralUtilities:
593
596
  @staticmethod
594
597
  @check_arguments
595
598
  def ensure_directory_exists(path: str) -> None:
599
+ path=GeneralUtilities.normaliza_path(path)
596
600
  if not os.path.isdir(path):
597
601
  os.makedirs(path)
598
602
 
599
603
  @staticmethod
600
604
  @check_arguments
601
605
  def ensure_file_exists(path: str) -> None:
606
+ path=GeneralUtilities.normaliza_path(path)
602
607
  if (not os.path.isfile(path)):
603
608
  with open(path, "a+", encoding="utf-8"):
604
609
  pass
@@ -662,10 +667,10 @@ class GeneralUtilities:
662
667
  @staticmethod
663
668
  @check_arguments
664
669
  def format_xml_file_with_encoding(filepath: str, encoding: str) -> None:
665
- with codecs.open(filepath, 'r', encoding=encoding) as file:
670
+ with open(filepath, 'r', encoding=encoding) as file:
666
671
  text = file.read()
667
672
  text = parse(text).toprettyxml()
668
- with codecs.open(filepath, 'w', encoding=encoding) as file:
673
+ with open(filepath, 'w', encoding=encoding) as file:
669
674
  file.write(text)
670
675
 
671
676
  @staticmethod
@@ -765,6 +770,7 @@ class GeneralUtilities:
765
770
  @staticmethod
766
771
  @check_arguments
767
772
  def read_binary_from_file(file: str) -> bytes:
773
+ file=GeneralUtilities.normaliza_path(file)
768
774
  with open(file, "rb") as file_object:
769
775
  return file_object.read()
770
776
 
@@ -1330,32 +1336,35 @@ class GeneralUtilities:
1330
1336
  """For each log file in this folder this function looks for log-rotation-files and merges them together again into one file."""
1331
1337
  all_files=GeneralUtilities.get_direct_files_of_folder(folder)
1332
1338
  for log_file in all_files:
1339
+ if "AutoRename" in log_file:
1340
+ continue
1333
1341
  filename=os.path.basename(log_file)
1334
1342
  filename_without_extension=Path(log_file).stem
1335
-
1336
- #merge with rotated logs
1337
- if filename.endswith(".log") and not ".archive." in filename:
1338
- rotated_log_files=sorted([f for f in all_files if f.startswith(filename_without_extension+".archive.")], key=GeneralUtilities.__extract_log_file_number)
1339
- result=GeneralUtilities.empty_string
1340
- if len(rotated_log_files)>0:
1341
- for rotated_log_file in rotated_log_files:
1343
+ if not ".archive." in filename:
1344
+
1345
+ #merge with rotated logs
1346
+ if filename.endswith(".log") and not ".archive." in filename:
1347
+ rotated_log_files=sorted([f for f in all_files if os.path.basename(f).startswith(filename_without_extension+".archive.")], key=GeneralUtilities._internal_extract_log_file_number)
1348
+ result=GeneralUtilities.empty_string
1349
+ if 0<len(rotated_log_files):
1350
+ for rotated_log_file in rotated_log_files:
1351
+ result+="\n"+GeneralUtilities.read_text_from_file(rotated_log_file)
1342
1352
  result+="\n"+GeneralUtilities.read_text_from_file(log_file)
1343
- result+="\n"+GeneralUtilities.read_text_from_file(log_file)
1344
- GeneralUtilities.write_text_to_file(log_file, result)
1345
- for rotated_log_file in rotated_log_files:
1346
- GeneralUtilities.ensure_file_does_not_exist(rotated_log_file)
1347
-
1348
- #normalize
1349
- logs=GeneralUtilities.read_text_from_file(logs)
1350
- logs=logs.replace("\r\n", "\n")
1351
- logs=logs.replace("\r", GeneralUtilities.empty_string)
1352
- logs=re.sub(r"\n+", "\n", logs)
1353
- logs=GeneralUtilities.trim_newlines(logs)
1354
- GeneralUtilities.write_text_to_file(log_file, logs)
1355
-
1356
- @staticmethod
1357
- @check_arguments
1358
- def __extract_log_file_number(filename: str) -> int:
1353
+ GeneralUtilities.write_text_to_file(log_file, result)
1354
+ for rotated_log_file in rotated_log_files:
1355
+ GeneralUtilities.ensure_file_does_not_exist(rotated_log_file)
1356
+
1357
+ #normalize
1358
+ logs=GeneralUtilities.read_text_from_file(log_file)
1359
+ logs=logs.replace("\r\n", "\n")
1360
+ logs=logs.replace("\r", GeneralUtilities.empty_string)
1361
+ logs=re.sub(r"\n+", "\n", logs)
1362
+ logs=GeneralUtilities.trim_newlines(logs)
1363
+ GeneralUtilities.write_text_to_file(log_file, logs)
1364
+
1365
+ @staticmethod
1366
+ @check_arguments
1367
+ def _internal_extract_log_file_number(filename: str) -> int:
1359
1368
  m = re.search(r"\.archive\.(\d+)\.log$", filename)
1360
1369
  if m:
1361
1370
  return int(m.group(1))
@@ -1,23 +1,29 @@
1
1
  function getBrowserCulture() {
2
+ //returns a culture in the format "en", "fr" and "fr-FR".
2
3
  let lang = navigator.language || navigator.userLanguage || "en";
3
4
  const match = lang.match(/^[a-zA-Z]{2}(?:-[a-zA-Z]{2})?/);
4
5
  return match ? match[0] : "en";
5
6
  }
6
- function redirectToCulture() {
7
- const supportedCultures = [
8
- /*__supportedCultures__*/
9
- ];
10
7
 
8
+ function getCultureToRedirect() {
9
+ const supportedCultures = [/*__supportedCultures__*/];//contains values like "en", "fr" and "fr-FR".
11
10
  let culture = getBrowserCulture();
12
11
  if (supportedCultures.includes(culture)) {
13
- window.location.replace(`./${culture}/`);
14
- return;
15
- }
16
- const baseLang = culture.split("-")[0];
17
- if (supportedCultures.includes(baseLang)) {
18
- window.location.replace(`./${baseLang}/`);
19
- return;
12
+ window.location.replace(`/${culture}/index.html`);
13
+ } else {
14
+ if (0 < culture.indexOf('-')) {
15
+ languageOnly = culture.split('-')[0];
16
+ if (supportedCultures.includes(languageOnly)) {
17
+ return languageOnly;
18
+ }
19
+ }
20
20
  }
21
- window.location.replace("./en/");
21
+ return "en";
22
+ }
23
+
24
+ function redirectToCulture() {
25
+ const culture = getCultureToRedirect();
26
+ window.location.replace(`/${culture}/index.html`);
22
27
  }
28
+
23
29
  redirectToCulture();
@@ -1,3 +1,4 @@
1
+ <!DOCTYPE html>
1
2
  <html>
2
3
 
3
4
  <head>
@@ -6,7 +7,9 @@
6
7
  </head>
7
8
 
8
9
  <body>
10
+ <h1><!--__title__--></h1>
9
11
  <script src="./CultureChooser.js"></script>
12
+ If you are not redirected, click <a href="/en/index.html">here</a>.
10
13
  </body>
11
14
 
12
15
  </html>
@@ -35,7 +35,7 @@ from .ProgramRunnerBase import ProgramRunnerBase
35
35
  from .ProgramRunnerPopen import ProgramRunnerPopen
36
36
  from .SCLog import SCLog, LogLevel
37
37
 
38
- version = "4.2.39"
38
+ version = "4.2.41"
39
39
  __version__ = version
40
40
 
41
41
 
@@ -2783,3 +2783,16 @@ OCR-content:
2783
2783
  #TODO add cli-script to call this function
2784
2784
  if network_name in self.get_docker_networks():
2785
2785
  self.run_program("docker",f"network rm {network_name}")
2786
+
2787
+ @GeneralUtilities.check_arguments
2788
+ def get_available_cultures_for_angular_app(self,angular_json_file:str)->list[str]:
2789
+ languages = ["en"]
2790
+ with open(angular_json_file, "r", encoding="utf-8") as f:
2791
+ data = json.load(f)
2792
+ for project in data.get("projects", {}).values():
2793
+ i18n = project.get("i18n", {})
2794
+ locales = i18n.get("locales", {})
2795
+ languages.extend(locales.keys())
2796
+
2797
+ languages=list(languages)
2798
+ return languages
@@ -184,7 +184,7 @@ class TFCPS_CodeUnitSpecific_DotNet_Functions(TFCPS_CodeUnitSpecific_Base):
184
184
  self._protected_sc.log.log("Generate SBOM...")
185
185
  codeunit_name = os.path.basename(codeunit_folder)
186
186
  bomfile_folder = "Other\\Artifacts\\BOM"
187
- self._protected_sc.run_program_argsasarray("dotnet", ["CycloneDX", f"{codeunit_name}\\{codeunit_name}.csproj", "-o", bomfile_folder, "--disable-github-licenses"], codeunit_folder)
187
+ self._protected_sc.run_program_argsasarray("dotnet", ["CycloneDX", f"{codeunit_name}\\{codeunit_name}.csproj", "-o", bomfile_folder], codeunit_folder)
188
188
  codeunitversion = self.tfcps_Tools_General.get_version_of_codeunit(os.path.join(codeunit_folder, f"{codeunit_name}.codeunit.xml"))
189
189
  target = f"{codeunit_folder}\\{bomfile_folder}\\{codeunit_name}.{codeunitversion}.sbom.xml"
190
190
  GeneralUtilities.ensure_file_does_not_exist(target)
@@ -124,8 +124,9 @@ class TFCPS_CodeUnitSpecific_NodeJS_Functions(TFCPS_CodeUnitSpecific_Base):
124
124
 
125
125
  @GeneralUtilities.check_arguments
126
126
  def add_culture_chooser(self,site_title:str,supported_cultures:list[str])->None:
127
+ output_folder=self.get_codeunit_folder()+"/Other/Artifacts/BuildResult_WebApplication/browser"
128
+ GeneralUtilities.assert_folder_exists(output_folder)
127
129
  cc:CultureChooser=CultureChooser()
128
- output_folder=self.get_codeunit_folder()+"/Other/Artifacts/Build_WebApplication"
129
130
 
130
131
  index_html_file=output_folder+"/index.html"
131
132
  GeneralUtilities.ensure_file_exists(index_html_file)
@@ -137,8 +138,12 @@ class TFCPS_CodeUnitSpecific_NodeJS_Functions(TFCPS_CodeUnitSpecific_Base):
137
138
  cc_script_content=cc.get_culture_chooser_script(supported_cultures)
138
139
  GeneralUtilities.write_text_to_file(cc_script_file, cc_script_content)
139
140
 
141
+ @GeneralUtilities.check_arguments
142
+ def get_available_cultures_for_angular_app(self)->None:
143
+ return self._protected_sc.get_available_cultures_for_angular_app(self.get_codeunit_folder()+"/angular.json")
144
+
140
145
  class TFCPS_CodeUnitSpecific_NodeJS_CLI:
141
-
146
+
142
147
  @staticmethod
143
148
  @GeneralUtilities.check_arguments
144
149
  def parse(file:str)->TFCPS_CodeUnitSpecific_NodeJS_Functions:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ScriptCollection
3
- Version: 4.2.39
3
+ Version: 4.2.41
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.4.0
26
- Requires-Dist: coverage>=7.13.3
26
+ Requires-Dist: coverage>=7.13.4
27
27
  Requires-Dist: cyclonedx-bom>=7.1.0
28
28
  Requires-Dist: defusedxml>=0.7.1
29
29
  Requires-Dist: keyboard>=0.13.5
@@ -34,9 +34,9 @@ Requires-Dist: Pillow>=11.3.0
34
34
  Requires-Dist: psutil>=7.2.2
35
35
  Requires-Dist: pycdlib>=1.14.0
36
36
  Requires-Dist: Pygments>=2.19.2
37
- Requires-Dist: pylint>=4.0.4
37
+ Requires-Dist: pylint>=4.0.5
38
38
  Requires-Dist: pyOpenSSL>=25.3.0
39
- Requires-Dist: PyPDF>=6.6.2
39
+ Requires-Dist: PyPDF>=6.7.2
40
40
  Requires-Dist: pytest>=8.4.2
41
41
  Requires-Dist: PyYAML>=6.0.3
42
42
  Requires-Dist: qrcode>=8.2.0
@@ -1,8 +1,8 @@
1
1
  ScriptCollection/AnionBuildPlatform.py,sha256=Sw35p6gKZ4qjvaDWtrnWW3iCHdUpHSUjtq5tc2iL_AI,11522
2
2
  ScriptCollection/CertificateUpdater.py,sha256=aCBF-bym5renP5joL32ev7WZW8HHh6hNm_mz6_hQKLc,9617
3
- ScriptCollection/CultureChooser.py,sha256=pCA2Ar825TSTIF3ar1mvxY-H-nbbdK4wPdY_Kut496I,1645
4
- ScriptCollection/Executables.py,sha256=Xlz80hW7HxF0JUoRsAgNc1txSFOE88JCiGMPry90BRs,43234
5
- ScriptCollection/GeneralUtilities.py,sha256=ymXpj4eb2WUjMlG8O3sJP_09x0qQYReS-IKqFvMI57U,58081
3
+ ScriptCollection/CultureChooser.py,sha256=TX5DdFzu5645ir9SI80rkRHDtf3cQ9zeZrpYj3HJLZs,1653
4
+ ScriptCollection/Executables.py,sha256=zP8EUkcl5q31AwHdYrADQRru2Wxwv2m67O-3m6PoGbs,43378
5
+ ScriptCollection/GeneralUtilities.py,sha256=g0oBL8aFbvoIFwcAW93z2s5BAjJbrsFEMTQwLJesmZM,58667
6
6
  ScriptCollection/ImageUpdater.py,sha256=fxyz3oZkKlqyieYiyj0Yi1dQjOJEuHhu0WvL_JHsB90,38905
7
7
  ScriptCollection/ProcessesRunner.py,sha256=o5raxIt3lknNPoPrjNzJ2bprRPJ3SnL0rrR7crraD7E,1523
8
8
  ScriptCollection/ProgramRunnerBase.py,sha256=4A2eQgSg_rRgQcgSi-LYtUlM-uSQEpS7qFWn0tWt4uo,2171
@@ -10,7 +10,7 @@ ScriptCollection/ProgramRunnerMock.py,sha256=uTu-aFle1W_oKjeQEmuPsFPQpvo0kRf2FrR
10
10
  ScriptCollection/ProgramRunnerPopen.py,sha256=BPY7-ZMIlqT7JOKz8qlB5c0laF2Js-ijzqk09GxZC48,3821
11
11
  ScriptCollection/ProgramRunnerSudo.py,sha256=_khC3xuTdrPoLluBJZWfldltmmuKltABJPcbjZSFW-4,4835
12
12
  ScriptCollection/SCLog.py,sha256=8TRy1LeYMsPOIuWUcnUNNbO5pd-cNBS-3cn-kdzP8FU,4768
13
- ScriptCollection/ScriptCollectionCore.py,sha256=MKwHzCwhKWJ24edTSNcxEpykTQStKOZniJ2841kUKPg,156254
13
+ ScriptCollection/ScriptCollectionCore.py,sha256=5q1jImWNzVG5Q5EUboBvSrXTBJQF_VgOs3Ufe1GpZoM,156757
14
14
  ScriptCollection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  ScriptCollection/OCIImages/AbstractImageHandler.py,sha256=Pa72cRybzBroy-OzzxZqKpFB58iY2kcf5yFfIAIPfXk,1627
16
16
  ScriptCollection/OCIImages/OCIImageManager.py,sha256=xTYnj68CRDkTjJiibSov1HSI0djmmcY6mwP6_fD0kCM,7141
@@ -20,8 +20,8 @@ ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerDebianSlim.py,sha25
20
20
  ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerGeneric.py,sha256=xyE4wYK6s17NrBJiat1ohMKlTjygC402QIUwvFNf0ao,604
21
21
  ScriptCollection/OCIImages/ConcreteImageHandlers/ImageHandlerGenericV.py,sha256=T5vMwIDFEpm6JzSJVS2oRnc2Z7QbPWonld0LEUpHoMg,605
22
22
  ScriptCollection/OCIImages/ConcreteImageHandlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- ScriptCollection/Resources/CultureChooser/CultureChooser.js,sha256=Yp1GnWDjOGFl7hPeJ-GYi0co8g2Hqhdad7hon2dyUAE,689
24
- ScriptCollection/Resources/CultureChooser/index.html,sha256=HXjcH_ffV25GCcy6j7iV5FvzeWUtltXDibQNZOdpgbc,158
23
+ ScriptCollection/Resources/CultureChooser/CultureChooser.js,sha256=5-4pwGDq5j1UnpTZy850ZMoxlM9tYPeu781QpZBtCWM,951
24
+ ScriptCollection/Resources/CultureChooser/index.html,sha256=gxQzbrSp4WU52TqN-gcBEtz2gJXmmM14OwTSFtFVRvw,276
25
25
  ScriptCollection/TFCPS/TFCPS_CodeUnitSpecific_Base.py,sha256=xpt-Z_jztEaKgpT1DDSX7wezWX0VKS5LQb7IKAzvi4U,27860
26
26
  ScriptCollection/TFCPS/TFCPS_CodeUnit_BuildCodeUnit.py,sha256=vnNrwvNePvW2dQhnSusBjgvOssI3a1P3g94bNxNIr3o,8069
27
27
  ScriptCollection/TFCPS/TFCPS_CodeUnit_BuildCodeUnits.py,sha256=YfyO1aSBnlKOpzEkqya0rLXQmZ3gw-mdwUqSXVQBbRE,14918
@@ -37,18 +37,18 @@ ScriptCollection/TFCPS/Docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
37
37
  ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationBase.py,sha256=bT6Gd5pQpZCw4OQz6HWkPCSn5z__eUUEisABLDSxd0o,200
38
38
  ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationGenerate.py,sha256=QyjOfMY22JWCvKjMelHiDWbJiWqotOfebpJpgDUaoO4,237
39
39
  ScriptCollection/TFCPS/DotNet/CertificateGeneratorInformationNoGenerate.py,sha256=i0zEGehj0sttxjjZtoq2KFSKp_ulxVyWp_ZgAhIY_So,241
40
- ScriptCollection/TFCPS/DotNet/TFCPS_CodeUnitSpecific_DotNet.py,sha256=-qCFjX5fPYtFxZk40YxFI10r-FCjZR7xOIymsIG7Mtw,31987
40
+ ScriptCollection/TFCPS/DotNet/TFCPS_CodeUnitSpecific_DotNet.py,sha256=0_IRUZE9YzIpSKaj-JRXjHS1pshqYSICNKLXzVbYK_w,31958
41
41
  ScriptCollection/TFCPS/DotNet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
42
  ScriptCollection/TFCPS/Flutter/TFCPS_CodeUnitSpecific_Flutter.py,sha256=U8oBAOLR2vJpVfc9631Rhb8a04nrnjUMMX-U7pvXjok,7342
43
43
  ScriptCollection/TFCPS/Flutter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
44
  ScriptCollection/TFCPS/Go/TFCPS_CodeUnitSpecific_Go.py,sha256=kyx26AnT1-LySFA46wfJ9yZUKYdMWTD0U2XZfSQbuB0,3497
45
45
  ScriptCollection/TFCPS/Go/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- ScriptCollection/TFCPS/NodeJS/TFCPS_CodeUnitSpecific_NodeJS.py,sha256=y028-yM3D1B9zZAnt2wUzzvGRpU1_nXuQTV4FaaP524,7982
46
+ ScriptCollection/TFCPS/NodeJS/TFCPS_CodeUnitSpecific_NodeJS.py,sha256=5YNFOBY54IjTNFW52GaryYq5c1MDjhjxNUcjM3TAqLk,8281
47
47
  ScriptCollection/TFCPS/NodeJS/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
48
  ScriptCollection/TFCPS/Python/TFCPS_CodeUnitSpecific_Python.py,sha256=nLw_eSUd_56jjgfcAvtUyzecSZ14mYmNJl0iu-1YNVk,13496
49
49
  ScriptCollection/TFCPS/Python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
- scriptcollection-4.2.39.dist-info/METADATA,sha256=i-bDq9V6uy8-tnwiXn4S4bWTXldedh-d9ESHK38_6IU,7690
51
- scriptcollection-4.2.39.dist-info/WHEEL,sha256=YCfwYGOYMi5Jhw2fU4yNgwErybb2IX5PEwBKV4ZbdBo,91
52
- scriptcollection-4.2.39.dist-info/entry_points.txt,sha256=m_HqkdaPXThWnd2chMMhs8dA5aRJu1ifrcwUnvw5SBE,4572
53
- scriptcollection-4.2.39.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
54
- scriptcollection-4.2.39.dist-info/RECORD,,
50
+ scriptcollection-4.2.41.dist-info/METADATA,sha256=XpDhiRL0yE3myjIEC4HyYUQJwdY4PQG1-Jb-qcc9Phg,7690
51
+ scriptcollection-4.2.41.dist-info/WHEEL,sha256=YCfwYGOYMi5Jhw2fU4yNgwErybb2IX5PEwBKV4ZbdBo,91
52
+ scriptcollection-4.2.41.dist-info/entry_points.txt,sha256=m_HqkdaPXThWnd2chMMhs8dA5aRJu1ifrcwUnvw5SBE,4572
53
+ scriptcollection-4.2.41.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
54
+ scriptcollection-4.2.41.dist-info/RECORD,,