#!/usr/bin/env python3
"""Script to combine winshl-kb YAML files."""
import argparse
import glob
import os
import sys
import uuid
import yaml
from winshlrc import resources
[docs]
class YAMLOutputWriter:
"""YAML output writer."""
[docs]
def __enter__(self):
"""Make this work with the 'with' statement."""
return self
[docs]
def __exit__(self, exception_type, value, traceback):
"""Make this work with the 'with' statement."""
[docs]
def WriteKnownFolder(self, known_folder_definition):
"""Writes a known folder definition in YAML to stdout.
Args:
known_folder_definition (KnownFolderDefinition): known folder definition.
"""
print("---")
if known_folder_definition.name:
print(f"name: {known_folder_definition.name:s}")
print(f"identifier: {known_folder_definition.identifier:s}")
if known_folder_definition.display_name:
print(f'display_name: "{known_folder_definition.display_name:s}"')
if known_folder_definition.default_path:
default_path = known_folder_definition.default_path.replace("\\", "\\\\")
print(f'default_path: "{default_path:s}"')
if known_folder_definition.csidl:
csidl = ", ".join(known_folder_definition.csidl)
print(f"csidl: [{csidl:s}]")
if known_folder_definition.legacy_display_name:
print(
(
f"legacy_display_name: "
f'"{known_folder_definition.legacy_display_name:s}"'
)
)
if known_folder_definition.legacy_default_path:
legacy_default_path = known_folder_definition.legacy_default_path.replace(
"\\", "\\\\"
)
print(f'legacy_default_path: "{legacy_default_path:s}"')
[docs]
def Main():
"""Entry point of console script to combine winshl-kb YAML files.
Returns:
int: exit code that is provided to sys.exit().
"""
argument_parser = argparse.ArgumentParser(
description=("Merges winshl-kb YAML files.")
)
argument_parser.add_argument(
"source",
nargs="?",
action="store",
metavar="PATH",
default=None,
help="path of a directory with winshl-kb YAML files.",
)
options = argument_parser.parse_args()
if not options.source:
print("Source directory missing.")
print("")
argument_parser.print_help()
print("")
return 1
known_folder_definitions = {}
for path in glob.glob(os.path.join(options.source, "*.yaml")):
with open(path, "r", encoding="utf8") as file_object:
for yaml_definition in yaml.safe_load_all(file_object):
csidl = yaml_definition.get("csidl")
display_name = yaml_definition.get("display_name")
default_path = yaml_definition.get("default_path")
legacy_display_name = yaml_definition.get("legacy_display_name")
legacy_default_path = yaml_definition.get("legacy_default_path")
name = yaml_definition.get("name")
identifier = yaml_definition.get("identifier")
# Test if the identifier is a GUID value.
_ = uuid.UUID(identifier)
known_folder_definition = known_folder_definitions.get(identifier)
if not known_folder_definition:
known_folder_definition = resources.KnownFolderDefinition()
known_folder_definition.identifier = identifier
known_folder_definitions[identifier] = known_folder_definition
if csidl and not known_folder_definition.display_name:
known_folder_definition.csidl = csidl
if display_name and not known_folder_definition.display_name:
known_folder_definition.display_name = display_name
if default_path and not known_folder_definition.default_path:
known_folder_definition.default_path = default_path
if (
legacy_display_name
and not known_folder_definition.legacy_display_name
):
known_folder_definition.legacy_display_name = legacy_display_name
if (
legacy_default_path
and not known_folder_definition.legacy_default_path
):
known_folder_definition.legacy_default_path = legacy_default_path
if name and not known_folder_definition.name:
known_folder_definition.name = name
with YAMLOutputWriter() as yaml_writer:
for known_folder_definition in sorted(
known_folder_definitions.values(),
key=lambda definition: definition.identifier,
):
yaml_writer.WriteKnownFolder(known_folder_definition)
return 0
if __name__ == "__main__":
sys.exit(Main())