check.py : Refactor utility functions.

This commit is contained in:
Philippe Groarke 2018-01-09 14:05:23 -05:00
parent 07006fccbc
commit 9fb744430f

177
check.py
View file

@ -13,8 +13,8 @@ import argparse
import csv import csv
import re import re
FILE_HEADER = "# Game Controller DB for SDL in 2.0.6 format\n\ FILE_HEADER = "# Game Controller DB for SDL in 2.0.6 format\n" \
# Source: https://github.com/gabomdq/SDL_GameControllerDB\n" "# Source: https://github.com/gabomdq/SDL_GameControllerDB\n"
mappings_dict = { mappings_dict = {
"Windows": {}, "Windows": {},
@ -32,7 +32,7 @@ class Mapping:
"h": re.compile(r"^[0-9]+\.(0|1|2|4|8|3|6|12|9)$"), "h": re.compile(r"^[0-9]+\.(0|1|2|4|8|3|6|12|9)$"),
} }
def __init__(self, mappingstring, linenumber): def __init__(self, mappingstring, linenumber, add_missing_platform = False):
self.guid = "" self.guid = ""
self.name = "" self.name = ""
self.platform = "" self.platform = ""
@ -77,7 +77,7 @@ class Mapping:
mapping.pop(0) mapping.pop(0)
self.set_name(mapping[0]) self.set_name(mapping[0])
mapping.pop(0) mapping.pop(0)
self.set_platform(mapping) self.set_platform(mapping, add_missing_platform)
self.set_keys(mapping) self.set_keys(mapping)
# Remove empty mappings. # Remove empty mappings.
@ -104,17 +104,36 @@ class Mapping:
self.name = name self.name = name
def set_platform(self, mapping): def __get_missing_platform(self):
if self.guid[20:32] == "504944564944":
print("Adding 'platform:Windows' to %s" % (self.name))
return ("platform:Windows")
elif self.guid[4:16] == "000000000000" \
and self.guid[20:32] == "000000000000":
print("Adding 'platform:Mac OS X' to %s" % (self.name))
return ("platform:Mac OS X")
else:
raise ValueError("Add missing platform : Cannot determine platform"\
" confidently.")
def set_platform(self, mapping, add_missing_platform):
remove_field_from_mapping = True
platform_kv = next((x for x in mapping if "platform:" in x), None) platform_kv = next((x for x in mapping if "platform:" in x), None)
if platform_kv == None: if platform_kv == None:
raise ValueError("Required 'platform' field not found.") if add_missing_platform:
platform_kv = self.__get_missing_platform()
remove_field_from_mapping = False
else:
raise ValueError("Required 'platform' field not found.")
platform = platform_kv.split(':')[1] platform = platform_kv.split(':')[1]
if platform not in mappings_dict.keys(): if platform not in mappings_dict.keys():
raise ValueError("Invalid platform.", platform) raise ValueError("Invalid platform.", platform)
self.platform = platform self.platform = platform
if not remove_field_from_mapping:
return
index = mapping.index(platform_kv) index = mapping.index(platform_kv)
mapping.pop(index) mapping.pop(index)
@ -161,6 +180,7 @@ class Mapping:
ret += " }\n}" ret += " }\n}"
return ret return ret
def serialize(self): def serialize(self):
ret = "%s,%s," % (self.guid, self.name) ret = "%s,%s," % (self.guid, self.name)
sorted_keys = sorted(self.__keys.items()) sorted_keys = sorted(self.__keys.items())
@ -169,114 +189,60 @@ class Mapping:
ret += "platform:%s," % (self.platform) ret += "platform:%s," % (self.platform)
return ret return ret
# https://hg.libsdl.org/SDL/rev/20855a38e048
def convert_guids(filename): # https://hg.libsdl.org/SDL/rev/20855a38e048
global current_line def convert_guid(self):
global current_lineno if self.platform == "Windows":
input_file = open(filename, 'r') if self.guid[20:32] != "504944564944":
out_file = open("gamecontrollerdb_converted.txt", 'w') return
for lineno, line in enumerate(input_file):
current_line = line guid = self.guid
current_lineno = lineno + 1
if line.startswith('#') or line == '\n':
out_file.write(line)
continue
splitted = line[:-1].split(',', 2)
guid = splitted[0]
if get_platform(splitted[2]) == "Windows":
if guid[20:32] != "504944564944":
out_file.write(line)
continue
guid = guid[:20] + "000000000000" guid = guid[:20] + "000000000000"
guid = guid[:16] + guid[4:8] + guid[20:] guid = guid[:16] + guid[4:8] + guid[20:]
guid = guid[:8] + guid[:4] + guid[12:] guid = guid[:8] + guid[:4] + guid[12:]
guid = "03000000" + guid[8:] guid = "03000000" + guid[8:]
guid = guid.lower() guid = guid.lower()
elif get_platform(splitted[2]) == "Mac OS X": print("Converted %s GUID. From %s to %s" % (self.name, self.guid,
if guid[4:16] != "000000000000" or guid[20:32] != "000000000000": guid))
out_file.write(line) self.guid = guid
continue
elif self.platform == "Mac OS X":
if self.guid[4:16] != "000000000000" \
or self.guid[20:32] != "000000000000":
return
guid = self.guid
guid = guid[:20] + "000000000000" guid = guid[:20] + "000000000000"
guid = guid[:8] + guid[:4] + guid[12:] guid = guid[:8] + guid[:4] + guid[12:]
guid = "03000000" + guid[8:] guid = "03000000" + guid[8:]
guid = guid.lower() guid = guid.lower()
else: print("Converted %s GUID. From %s to %s" % (self.name, self.guid,
out_file.write(line) guid))
continue self.guid = guid
out = line.replace(splitted[0], guid)
out_file.write(out)
print("\nConverted :\t" + splitted[0] + "\nTo :\t\t" + guid)
out_file.close()
input_file.close()
shutil.copyfile(input_file.name, ".bak." + input_file.name)
shutil.move("gamecontrollerdb_converted.txt", "gamecontrollerdb.txt")
def add_missing_platforms(filename):
global current_line
global current_lineno
input_file = open(filename, 'r')
out_file = open("gamecontrollerdb_platforms.txt", 'w')
for lineno, line in enumerate(input_file):
current_line = line
current_lineno = lineno + 1
if line.startswith('#') or line == '\n':
out_file.write(line)
continue
splitted = line[:-1].split(',', 2)
guid = splitted[0]
platform = get_platform(splitted[2])
if platform:
out_file.write(line)
continue
out = line[0:-1]
if guid[20:32] == "504944564944":
print("Adding Windows platform to #" + str(lineno) + " :\n" + line)
out += "platform:Windows,"
elif guid[4:16] == "000000000000" and guid[20:32] == "000000000000":
print("Adding Mac OS X platform to #" + str(lineno) + " :\n" + line)
out += "platform:Mac OS X,"
else:
print("Adding Linux platform to #" + str(lineno) + " :\n" + line)
out += "platform:Linux,"
out += "\n"
out_file.write(out)
out_file.close()
input_file.close()
shutil.copyfile(input_file.name, ".bak." + input_file.name)
shutil.move("gamecontrollerdb_platforms.txt", "gamecontrollerdb.txt")
def main(): def main():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("input_file", help="database file to check, \ parser.add_argument("input_file", help="database file to check, " \
ex. gamecontrollerdb.txt") "ex. gamecontrollerdb.txt")
parser.add_argument("--format", help="sorts, formats and removes duplicates", parser.add_argument("--format", help="sorts, formats and removes duplicates",
action="store_true") action="store_true")
parser.add_argument("--convert_guids", help="convert Windows and macOS " \
# Disable misc tools until refactor "GUIDs to the newer SDL 2.0.5 format.",
# parser.add_argument("--convert_guids", help="convert Windows and macOS \ action="store_true")
# GUIDs to the newer SDL 2.0.5 format. Skips checks!", parser.add_argument("--add_missing_platform", help="adds a platform "\
# action="store_true") "field if it is missing on Windows and Mac OS X 2.0.4 entries.",
# parser.add_argument("--add_missing_platform", help="adds a platform \ action="store_true")
# field if it is missing (on older pre 2.0.5 entries). Skips checks!",
# action="store_true")
args = parser.parse_args() args = parser.parse_args()
# Misc tools. if args.add_missing_platform:
# if args.convert_guids: print("Will try to add missing platforms. Requires SDL 2.0.4 GUID.")
# print("Converting GUIDs to SDL 2.0.5 format.") if not args.format:
# convert_guids(args.input_file) print("Use --format option to save database. Running in debug "\
# return "output mode...")
#
# if args.add_missing_platform:
# print("Adding missing platforms.")
# add_missing_platforms(args.input_file)
# return
# Tests. # Tests.
print("Applying checks.") print("\nApplying checks.")
global mappings_dict # { "platform": { "guid": Mapping }} global mappings_dict # { "platform": { "guid": Mapping }}
success = True success = True
input_file = open(args.input_file, mode="r") input_file = open(args.input_file, mode="r")
@ -285,11 +251,11 @@ def main():
if line.startswith('#') or line == '\n': if line.startswith('#') or line == '\n':
continue continue
try: try:
mapping = Mapping(line, lineno + 1) mapping = Mapping(line, lineno + 1, args.add_missing_platform)
except ValueError as e: except ValueError as e:
print("Error at line #" + str(lineno + 1)) print("\nError at line #" + str(lineno + 1))
print(e.args) print(e.args)
print("\nIn mapping") print("In mapping")
print(line) print(line)
success = False success = False
continue continue
@ -298,7 +264,7 @@ def main():
print("Duplicate detected at line #" + str(lineno + 1)) print("Duplicate detected at line #" + str(lineno + 1))
prev_mapping = mappings_dict[mapping.platform][mapping.guid] prev_mapping = mappings_dict[mapping.platform][mapping.guid]
print("Previous mapping at line #" + str(prev_mapping.linenumber)) print("Previous mapping at line #" + str(prev_mapping.linenumber))
print("\nIn mapping") print("In mapping")
print(line) print(line)
success = False success = False
continue continue
@ -311,6 +277,17 @@ def main():
else: else:
sys.exit(1) sys.exit(1)
# Misc tools.
if args.convert_guids:
print("Converting GUIDs to SDL 2.0.5+ format.")
if not args.format:
print("Use --format option to save database. Running in debug " \
"output mode...")
for platform,p_dict in mappings_dict.items():
for guid,mapping in p_dict.items():
mapping.convert_guid()
if args.format: if args.format:
print("\nFormatting db.") print("\nFormatting db.")
out_filename = path.splitext(input_file.name)[0] + "_format.txt" out_filename = path.splitext(input_file.name)[0] + "_format.txt"