ScriptCollection 3.5.64__py3-none-any.whl → 3.5.66__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.
@@ -31,7 +31,7 @@ from .ProgramRunnerBase import ProgramRunnerBase
31
31
  from .ProgramRunnerPopen import ProgramRunnerPopen
32
32
  from .ProgramRunnerEpew import ProgramRunnerEpew, CustomEpewArgument
33
33
 
34
- version = "3.5.64"
34
+ version = "3.5.66"
35
35
  __version__ = version
36
36
 
37
37
 
@@ -267,6 +267,10 @@ class ScriptCollectionCore:
267
267
  result = datetime.strptime(date_as_string, '%Y-%m-%d %H:%M:%S %z')
268
268
  return result
269
269
 
270
+ @GeneralUtilities.check_arguments
271
+ def git_fetch_with_retry(self, folder: str, remotename: str = "--all", amount_of_attempts: int = 5) -> None:
272
+ GeneralUtilities.retry_action(lambda: self.git_fetch(folder, remotename), amount_of_attempts)
273
+
270
274
  @GeneralUtilities.check_arguments
271
275
  def git_fetch(self, folder: str, remotename: str = "--all") -> None:
272
276
  self.run_program_argsasarray("git", ["fetch", remotename, "--tags", "--prune"], folder, throw_exception_if_exitcode_is_not_zero=True, verbosity=0)
@@ -280,8 +284,8 @@ class ScriptCollectionCore:
280
284
  self.run_program("git", f"branch -D {branchname}", folder, throw_exception_if_exitcode_is_not_zero=True, verbosity=0)
281
285
 
282
286
  @GeneralUtilities.check_arguments
283
- 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_amounts: int = 5) -> None:
284
- GeneralUtilities.retry_action(lambda: self.git_push(folder, remotename, localbranchname, remotebranchname, forcepush, pushalltags), amount_of_amounts)
287
+ 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:
288
+ GeneralUtilities.retry_action(lambda: self.git_push(folder, remotename, localbranchname, remotebranchname, forcepush, pushalltags), amount_of_attempts)
285
289
 
286
290
  @GeneralUtilities.check_arguments
287
291
  def git_push(self, folder: str, remotename: str, localbranchname: str, remotebranchname: str, forcepush: bool = False, pushalltags: bool = True, verbosity: int = 0) -> None:
@@ -293,6 +297,10 @@ class ScriptCollectionCore:
293
297
  result: tuple[int, str, str, int] = self.run_program_argsasarray("git", argument, folder, throw_exception_if_exitcode_is_not_zero=True, verbosity=verbosity, print_errors_as_information=True)
294
298
  return result[1].replace('\r', '').replace('\n', '')
295
299
 
300
+ @GeneralUtilities.check_arguments
301
+ def git_pull_with_retry(self, folder: str, remote: str, localbranchname: str, remotebranchname: str, force: bool = False, amount_of_attempts: int = 5) -> None:
302
+ GeneralUtilities.retry_action(lambda: self.git_pull_with_retry(folder, remote,localbranchname,remotebranchname), amount_of_attempts)
303
+
296
304
  @GeneralUtilities.check_arguments
297
305
  def git_pull(self, folder: str, remote: str, localbranchname: str, remotebranchname: str, force: bool = False) -> None:
298
306
  argument = f"pull {remote} {remotebranchname}:{localbranchname}"
@@ -1340,8 +1348,10 @@ class ScriptCollectionCore:
1340
1348
  if arguments_for_log is None:
1341
1349
  arguments_for_log = arguments_as_array
1342
1350
 
1343
- arguments_for_log_as_string: str = ' '.join(arguments_for_log)
1344
- cmd = f'{working_directory}>{program} {arguments_for_log_as_string}'
1351
+ cmd = f'{working_directory}>{program}'
1352
+ if 0 < len(arguments_for_log):
1353
+ arguments_for_log_as_string: str = ' '.join([f'"{argument_for_log}"' for argument_for_log in arguments_for_log])
1354
+ cmd = f'{cmd} {arguments_for_log_as_string}'
1345
1355
 
1346
1356
  if GeneralUtilities.string_is_none_or_whitespace(title):
1347
1357
  info_for_log = cmd
@@ -1019,7 +1019,7 @@ class TasksForCommonProjectStructure:
1019
1019
  target_folder_base = os.path.join(information.artifacts_folder, information.projectname, project_version)
1020
1020
  GeneralUtilities.ensure_directory_exists(target_folder_base)
1021
1021
 
1022
- self.build_codeunits(information.repository, information.verbosity, information.target_environmenttype_for_productive, information.additional_arguments_file, False, information.export_target, [], True)
1022
+ self.build_codeunits(information.repository, information.verbosity, information.target_environmenttype_for_productive, information.additional_arguments_file, False, information.export_target, [], True, "Productive build")
1023
1023
 
1024
1024
  reference_folder = os.path.join(information.reference_repository, "ReferenceContent")
1025
1025
 
@@ -1251,7 +1251,7 @@ class TasksForCommonProjectStructure:
1251
1251
  raise ValueError(f"Can not merge because the source-branch and the target-branch are on the same commit (commit-id: {src_branch_commit_id})")
1252
1252
 
1253
1253
  self.__sc.git_checkout(repository_folder, source_branch)
1254
- self.build_codeunits(repository_folder, verbosity, TasksForCommonProjectStructure.get_qualitycheck_environment_name(), additional_arguments_file, True, None, [], True)
1254
+ self.build_codeunits(repository_folder, verbosity, TasksForCommonProjectStructure.get_qualitycheck_environment_name(), additional_arguments_file, True, None, [], True, "Check if product is buildable")
1255
1255
  self.__sc.git_merge(repository_folder, source_branch, target_branch, False, False, None)
1256
1256
  self.__sc.git_commit(repository_folder, f'Merge branch {source_branch} into {target_branch}', stage_all_changes=True, no_changes_behavior=1)
1257
1257
  self.__sc.git_checkout(repository_folder, target_branch)
@@ -1312,7 +1312,7 @@ class TasksForCommonProjectStructure:
1312
1312
  self.__sc.run_program("git", "clean -dfx", information.repository, verbosity=information.verbosity, throw_exception_if_exitcode_is_not_zero=True)
1313
1313
  project_version = self.__sc.get_semver_version_from_gitversion(information.repository)
1314
1314
 
1315
- self.build_codeunits(information.repository, information.verbosity, information.target_environmenttype_for_qualitycheck, information.additional_arguments_file, False, information.export_target, [], True)
1315
+ self.build_codeunits(information.repository, information.verbosity, information.target_environmenttype_for_qualitycheck, information.additional_arguments_file, False, information.export_target, [], True, "Productive build")
1316
1316
 
1317
1317
  self.assert_no_uncommitted_changes(information.repository)
1318
1318
 
@@ -2430,7 +2430,7 @@ class TasksForCommonProjectStructure:
2430
2430
  self.__sc.run_program("docker", f"run --volume {repository_folder}:/Workspace/Repository " + f"-e repositoryfolder=/Workspace/Repository -e verbosity={verbosity} -e targetenvironment={target_environmenttype} {image}", repository_folder)
2431
2431
 
2432
2432
  @GeneralUtilities.check_arguments
2433
- 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] = [], do_git_clean_when_no_changes: bool = False) -> None:
2433
+ 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] = [], do_git_clean_when_no_changes: bool = False, note: str = None) -> None:
2434
2434
  self.__check_target_environmenttype(target_environmenttype)
2435
2435
  self.__sc.assert_is_git_repository(repository_folder)
2436
2436
  repository_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(repository_folder)
@@ -2438,12 +2438,13 @@ class TasksForCommonProjectStructure:
2438
2438
  self.build_specific_codeunits(repository_folder, codeunits, verbosity, target_environmenttype, additional_arguments_file, is_pre_merge, export_target_directory, False, commandline_arguments, do_git_clean_when_no_changes)
2439
2439
 
2440
2440
  @GeneralUtilities.check_arguments
2441
- 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] = [], do_git_clean_when_no_changes: bool = False) -> None:
2441
+ 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] = [], do_git_clean_when_no_changes: bool = False, note: str = None) -> None:
2442
2442
  self.__sc.assert_is_git_repository(repository_folder)
2443
2443
  self.__check_target_environmenttype(target_environmenttype)
2444
2444
  repository_folder = GeneralUtilities.resolve_relative_path_from_current_working_directory(repository_folder)
2445
- contains_uncommitted_changes = self.__sc.git_repository_has_uncommitted_changes(repository_folder)
2446
- if contains_uncommitted_changes:
2445
+ repository_name = os.path.dirname(repository_folder)
2446
+ contains_uncommitted_changes_at_begin = self.__sc.git_repository_has_uncommitted_changes(repository_folder)
2447
+ if contains_uncommitted_changes_at_begin:
2447
2448
  if is_pre_merge:
2448
2449
  raise ValueError(f'Repository "{repository_folder}" has uncommitted changes.')
2449
2450
  else:
@@ -2457,7 +2458,7 @@ class TasksForCommonProjectStructure:
2457
2458
  prepare_build_codeunits_scripts = os.path.join(project_resources_folder, PrepareBuildCodeunits_script_name)
2458
2459
  if os.path.isfile(prepare_build_codeunits_scripts):
2459
2460
  GeneralUtilities.write_message_to_stdout(f'Run "{PrepareBuildCodeunits_script_name}"')
2460
- self.__sc.run_program("python", f"{PrepareBuildCodeunits_script_name}", project_resources_folder,print_live_output=1<verbosity)
2461
+ self.__sc.run_program("python", f"{PrepareBuildCodeunits_script_name}", project_resources_folder, print_live_output=1 < verbosity)
2461
2462
 
2462
2463
  for subfolder in subfolders:
2463
2464
  codeunit_name: str = os.path.basename(subfolder)
@@ -2470,6 +2471,11 @@ class TasksForCommonProjectStructure:
2470
2471
  project_version = self.get_version_of_project(repository_folder)
2471
2472
 
2472
2473
  now = datetime.now()
2474
+ message = f"Build codeunits in product {repository_name}..."
2475
+ if note is not None:
2476
+ message = f"{message} ({note})"
2477
+ GeneralUtilities.write_message_to_stdout(message)
2478
+
2473
2479
  if not self.__suport_information_exists(repository_folder, project_version):
2474
2480
  support_time = timedelta(days=365*2+30*3+1) # TODO make this configurable
2475
2481
  until = now + support_time
@@ -2491,12 +2497,16 @@ class TasksForCommonProjectStructure:
2491
2497
  GeneralUtilities.write_message_to_stdout(line)
2492
2498
  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)
2493
2499
  GeneralUtilities.write_message_to_stdout(line)
2494
- if not contains_uncommitted_changes and self.__sc.git_repository_has_uncommitted_changes(repository_folder) and not is_pre_merge:
2495
- message = f'Due to the build-process the repository "{repository_folder}" has new uncommitted changes.'
2496
- if target_environmenttype == "Development":
2497
- GeneralUtilities.write_message_to_stdout(message)
2500
+ contains_uncommitted_changes_at_end = self.__sc.git_repository_has_uncommitted_changes(repository_folder)
2501
+ if contains_uncommitted_changes_at_end and not is_pre_merge:
2502
+ if contains_uncommitted_changes_at_begin:
2503
+ GeneralUtilities.write_message_to_stdout(f'There are still uncommitted changes in the repository "{repository_folder}".')
2498
2504
  else:
2499
- raise ValueError(message)
2505
+ message = f'Due to the build-process the repository "{repository_folder}" has new uncommitted changes.'
2506
+ if target_environmenttype == "Development":
2507
+ GeneralUtilities.write_message_to_stderr(f"Warning: {message}")
2508
+ else:
2509
+ raise ValueError(message)
2500
2510
  if export_target_directory is not None:
2501
2511
  project_name = self.get_project_name(repository_folder)
2502
2512
  for codeunit in sorted_codeunits:
@@ -2809,11 +2819,11 @@ class TasksForCommonProjectStructure:
2809
2819
  c_additionalargumentsfile_argument = f' --overwrite_additionalargumentsfile "{additional_arguments_file}"'
2810
2820
 
2811
2821
  GeneralUtilities.write_message_to_stdout('Run "CommonTasks.py"...')
2812
- 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,print_live_output=1<verbosity)
2822
+ 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, print_live_output=2 < verbosity)
2813
2823
  self.verify_artifact_exists(codeunit_folder, dict[str, bool]({"Changelog": False, "License": True, "DiffReport": True}))
2814
2824
 
2815
2825
  GeneralUtilities.write_message_to_stdout('Run "Build.py"...')
2816
- self.__sc.run_program("python", f"Build.py{additional_arguments_b}{general_argument}", build_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True,print_live_output=1<verbosity)
2826
+ self.__sc.run_program("python", f"Build.py{additional_arguments_b}{general_argument}", build_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True, print_live_output=2 < verbosity)
2817
2827
 
2818
2828
  artifacts = {"BuildResult_.+": True, "BOM": False, "SourceCode": True}
2819
2829
  if self.codeunit_has_testable_sourcecode(codeunit_file):
@@ -2823,20 +2833,20 @@ class TasksForCommonProjectStructure:
2823
2833
  codeunit_hast_testable_sourcecode = self.codeunit_has_testable_sourcecode(codeunit_file)
2824
2834
  if codeunit_hast_testable_sourcecode:
2825
2835
  GeneralUtilities.write_message_to_stdout('Run "RunTestcases.py"...')
2826
- self.__sc.run_program("python", f"RunTestcases.py{additional_arguments_r}{general_argument}", quality_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True,print_live_output=1<verbosity)
2836
+ self.__sc.run_program("python", f"RunTestcases.py{additional_arguments_r}{general_argument}", quality_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True, print_live_output=2 < verbosity)
2827
2837
  self.verify_artifact_exists(codeunit_folder, dict[str, bool]({"TestCoverage": True, "TestCoverageReport": False}))
2828
2838
 
2829
2839
  GeneralUtilities.write_message_to_stdout('Run "Linting.py"...')
2830
- self.__sc.run_program("python", f"Linting.py{additional_arguments_l}{general_argument}", quality_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True,print_live_output=1<verbosity)
2840
+ self.__sc.run_program("python", f"Linting.py{additional_arguments_l}{general_argument}", quality_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True, print_live_output=2 < verbosity)
2831
2841
  self.verify_artifact_exists(codeunit_folder, dict[str, bool]())
2832
2842
 
2833
2843
  GeneralUtilities.write_message_to_stdout('Run "GenerateReference.py"...')
2834
- self.__sc.run_program("python", f"GenerateReference.py{additional_arguments_g}{general_argument}", reference_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True,print_live_output=1<verbosity)
2844
+ self.__sc.run_program("python", f"GenerateReference.py{additional_arguments_g}{general_argument}", reference_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True, print_live_output=2 < verbosity)
2835
2845
  self.verify_artifact_exists(codeunit_folder, dict[str, bool]({"Reference": True}))
2836
2846
 
2837
2847
  if os.path.isfile(os.path.join(other_folder, "OnBuildingFinished.py")):
2838
2848
  GeneralUtilities.write_message_to_stdout('Run "OnBuildingFinished.py"...')
2839
- self.__sc.run_program("python", f"OnBuildingFinished.py{additional_arguments_f}{general_argument}", other_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True,print_live_output=1<verbosity)
2849
+ self.__sc.run_program("python", f"OnBuildingFinished.py{additional_arguments_f}{general_argument}", other_folder, verbosity=verbosity_for_executed_programs, throw_exception_if_exitcode_is_not_zero=True, print_live_output=2 < verbosity)
2840
2850
 
2841
2851
  artifactsinformation_file = os.path.join(artifacts_folder, f"{codeunit_name}.artifactsinformation.xml")
2842
2852
  codeunit_version = self.get_version_of_codeunit(codeunit_file)
@@ -2867,9 +2877,8 @@ class TasksForCommonProjectStructure:
2867
2877
  # Prepare
2868
2878
  self.__sc.assert_is_git_repository(repository_folder)
2869
2879
  codeunits = self.get_codeunits(repository_folder)
2870
- updated_dependencies = False
2871
2880
  update_dependencies_script_filename = "UpdateDependencies.py"
2872
- self.__sc.run_program("scbuildcodeunits", "", repository_folder) # Required because update dependencies is not always possible for not-buildet codeunits (depends on the programming language or package manager)
2881
+ self.build_codeunits(repository_folder, target_environmenttype="QualityCheck", 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)
2873
2882
 
2874
2883
  # update dependencies of resources
2875
2884
  global_scripts_folder = os.path.join(repository_folder, "Other", "Scripts")
@@ -2886,7 +2895,6 @@ class TasksForCommonProjectStructure:
2886
2895
  GeneralUtilities.ensure_directory_exists(os.path.join(update_dependencies_script_folder, "Resources", "CodeAnalysisResult"))
2887
2896
  self.__sc.run_program("python", update_dependencies_script_filename, update_dependencies_script_folder, verbosity)
2888
2897
  if self.__sc.git_repository_has_uncommitted_changes(repository_folder):
2889
- updated_dependencies = True
2890
2898
  version_of_project = self.get_version_of_project(repository_folder)
2891
2899
  changelog_file = os.path.join(repository_folder, "Other", "Resources", "Changelog", f"v{version_of_project}.md")
2892
2900
  if not os.path.isfile(changelog_file):
@@ -2899,9 +2907,8 @@ class TasksForCommonProjectStructure:
2899
2907
  GeneralUtilities.write_message_to_stdout(f"Updated dependencies in codeunit {codeunit}.")
2900
2908
  else:
2901
2909
  GeneralUtilities.write_message_to_stdout(f"There are no dependencies to update in codeunit {codeunit}.")
2902
- if updated_dependencies:
2903
- self.__sc.run_program("scbuildcodeunits", "--targetenvironment QualityCheck --removeuncommittedfiles", repository_folder, verbosity=verbosity) # TODO set timeout
2904
- self.__sc.git_commit(repository_folder, "Updated dependencies")
2910
+ self.build_codeunits(repository_folder, target_environmenttype="QualityCheck", do_git_clean_when_no_changes=True, note="Check if product is buildable after dependency-update")
2911
+ self.__sc.git_commit(repository_folder, "Updated dependencies")
2905
2912
 
2906
2913
  class GenericPrepareNewReleaseArguments:
2907
2914
  current_file: str
@@ -2928,8 +2935,8 @@ class TasksForCommonProjectStructure:
2928
2935
  self.__sc.assert_is_git_repository(reference_folder)
2929
2936
  verbosity: int = TasksForCommonProjectStructure.get_verbosity_from_commandline_arguments(generic_prepare_new_release_arguments.commandline_arguments, 1)
2930
2937
 
2931
- merge_source_branch = "other/next-release" # TODO make this configurable
2932
- main_branch = "main" # TODO make this configurable
2938
+ merge_source_branch = "other/next-release" # maybe this should be configurable
2939
+ main_branch = "main" # maybe this should be configurable
2933
2940
 
2934
2941
  # prepare
2935
2942
  self.assert_no_uncommitted_changes(repository_folder)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ScriptCollection
3
- Version: 3.5.64
3
+ Version: 3.5.66
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
@@ -5,12 +5,12 @@ ScriptCollection/ProgramRunnerBase.py,sha256=2kMIAqdc65UjBAddOZkzy_aFx9h5roZ5a4b
5
5
  ScriptCollection/ProgramRunnerEpew.py,sha256=4pjEd0r9Fcz3TTDv0MdTSd5KkigYXcWUVI1X43regfU,6477
6
6
  ScriptCollection/ProgramRunnerPopen.py,sha256=BPY7-ZMIlqT7JOKz8qlB5c0laF2Js-ijzqk09GxZC48,3821
7
7
  ScriptCollection/RPStream.py,sha256=NRRHL3YSP3D9MuAV2jB_--0KUKCsvJGxeKnxgrRZ9kY,1545
8
- ScriptCollection/ScriptCollectionCore.py,sha256=9ya2ztbPuuQxQEk4FOqhA7XL-Cwh7osTjEN0GPKHpDM,111127
9
- ScriptCollection/TasksForCommonProjectStructure.py,sha256=byU3N2MdcVCScm2DGuRLFuIomjFL8cjOI7k1sBVVCX8,213300
8
+ ScriptCollection/ScriptCollectionCore.py,sha256=1mOEvi_s9UGBfwWaaBZpbCxj-MaNefvHqrGpNvoX3JA,111855
9
+ ScriptCollection/TasksForCommonProjectStructure.py,sha256=A5L4MujKd7RRHZGdnQtPBYvy7KqjS30wmhPHYU9g2iw,213981
10
10
  ScriptCollection/UpdateCertificates.py,sha256=Eynbgu7k9jLxApP2D_8Il77B6BFjJap6K7oTeEAZYbk,7790
11
11
  ScriptCollection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- ScriptCollection-3.5.64.dist-info/METADATA,sha256=8d92Y7ZmlIECWchsTA4hSaU5dqjlw8ffQSE6Pl5QHIo,7664
13
- ScriptCollection-3.5.64.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
14
- ScriptCollection-3.5.64.dist-info/entry_points.txt,sha256=wspYVXWH8kon-wRQTAFEO11JoLJ0fEnOIG7tE7R-xtQ,3502
15
- ScriptCollection-3.5.64.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
16
- ScriptCollection-3.5.64.dist-info/RECORD,,
12
+ ScriptCollection-3.5.66.dist-info/METADATA,sha256=XdmGidFR142BYPXQR4Che0TJchPlG9tct8Vs9iSyJtU,7664
13
+ ScriptCollection-3.5.66.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
14
+ ScriptCollection-3.5.66.dist-info/entry_points.txt,sha256=wspYVXWH8kon-wRQTAFEO11JoLJ0fEnOIG7tE7R-xtQ,3502
15
+ ScriptCollection-3.5.66.dist-info/top_level.txt,sha256=hY2hOVH0V0Ce51WB76zKkIWTUNwMUdHo4XDkR2vYVwg,17
16
+ ScriptCollection-3.5.66.dist-info/RECORD,,