pc_support/merge_version_files.py (83 lines of code) (raw):
import json
import os
import re
import jsonschema
path_to_json_files = os.path.realpath(os.path.dirname(__file__))
json_file_names = sorted([filename for filename in os.listdir(path_to_json_files)
if filename.endswith('.json') and filename.startswith('os')])
json_schema = {
"$schema": "os_support_schema",
"type": "object",
"properties": {
"versions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"version": {
"type": "string"
},
"os": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"description": {
"type": "string"
}
},
"required": [
"name",
"description"
]
}
}
},
"required": [
"version",
"os"
]
}
}
},
"required": [
"versions"
]
}
def create_merged_dict(files):
prev_dir = os.getcwd()
os.chdir(path_to_json_files)
versions = list()
for file in files:
with open(file, 'r') as infile:
try:
version_dict = dict(
{
'version': re.match("os_(.*).json", file).groups()[0],
'os': json.load(infile)['os']
}
)
versions.append(version_dict)
except AttributeError:
raise Exception("All files should respect the 'os_(.*).json' regex")
merged_dict = dict({'versions': versions})
os.chdir(prev_dir)
return merged_dict
def write_merged_json(merged_dict):
with open(f"{path_to_json_files}/merged_os_support.json", 'w') as output_file:
json.dump(merged_dict, output_file, indent=4)
print(f"Written merged json in {path_to_json_files}/merged_os_support.json")
def validate_json(json_data):
try:
jsonschema.validate(instance=json_data, schema=json_schema)
except jsonschema.exceptions.ValidationError as err:
return False
return True
if __name__ == "__main__":
merged_dictionary = create_merged_dict(json_file_names)
print("Merged JSON data respects the schema" if validate_json(merged_dictionary)
else "Merged JSON data does not respect the schema")
write_merged_json(merged_dictionary)