From 8b10940b5102aa5efd00d8de0a3690e2f33cd9ab Mon Sep 17 00:00:00 2001 From: Giorgio Ravera Date: Fri, 23 Oct 2020 20:10:34 +0200 Subject: [PATCH] used class inside resources.py --- const.py | 1 - mercedes_me_api.py | 12 ++-- resources.py | 167 ++++++++++++++++++++++++++++----------------- 3 files changed, 111 insertions(+), 69 deletions(-) diff --git a/const.py b/const.py index 4c549f9..8dfc776 100644 --- a/const.py +++ b/const.py @@ -6,7 +6,6 @@ Author: G. Ravera For more details about this component, please refer to the documentation at https://github.com/xraver/mercedes_me_api/ """ - # Software Parameters NAME = "Mercedes Me API" DOMAIN = "mercedesmeapi" diff --git a/mercedes_me_api.py b/mercedes_me_api.py index 48d326b..f40e7ff 100644 --- a/mercedes_me_api.py +++ b/mercedes_me_api.py @@ -11,7 +11,7 @@ import logging import sys from config import MercedesMeConfig -from resources import MercedesMeResources +from resources import MercedesMeResourcesDB # Logger logger = logging.getLogger(__name__) @@ -21,7 +21,7 @@ class MercedesMeData: # Configuration Data self.config = MercedesMeConfig() # Resource Data - self.resources = MercedesMeResources(self.config) + self.resourcesDB = MercedesMeResourcesDB(self.config) ######################## # Parse Input @@ -55,7 +55,7 @@ if __name__ == "__main__": logger.error ("Error initializing configuration") exit (1) - if not data.resources.ReadResources(): + if not data.resourcesDB.ReadResources(): logger.error ("Error initializing resources") exit (1) @@ -70,8 +70,8 @@ if __name__ == "__main__": exit (1) if (args.resources): - data.resources.PrintAvailableResources() + data.resourcesDB.PrintAvailableResources() if (args.status == True): - data.resources.UpdateResourcesStatus() - data.resources.PrintResourcesStatus() + data.resourcesDB.UpdateResourcesStatus() + data.resourcesDB.PrintResourcesStatus() diff --git a/resources.py b/resources.py index 327befa..b3caf0e 100644 --- a/resources.py +++ b/resources.py @@ -16,9 +16,28 @@ from query import GetResource # Logger logger = logging.getLogger(__name__) -class MercedesMeResources: +class MercedesMeResource: + def __init__( self, name, version, href, status=None, timestamp=None, valid=False ): + self.name = name + self.version = version + self.href = href + self.status = status + self.timestamp = timestamp + self.valid = valid - resources = None + def getJson(self): + return ({ + "name" : self.name, + "version" : self.version, + "href" : self.href, + "status" : self.status, + "timestamp" : self.timestamp, + "valid" : self.valid, + }) + +class MercedesMeResourcesDB: + + database = { } config = None ######################## @@ -26,107 +45,131 @@ class MercedesMeResources: ######################## def __init__(self, config): self.config = config - + ######################## # Read Resources ######################## def ReadResources(self): - # Get Resources List + + found = False + resources = None + if not os.path.isfile(self.config.resources_file): + # Resources File not present - Retriving new one from server logger.error ("Resource File missing - Creating a new one.") - if (self.CreateResourcesFile() == False): - logger.error ("Error creating resources file.") - return None + found = False else: with open(self.config.resources_file, 'r') as file: try: - self.resources = json.load(file) + resources = json.load(file) + if (not self.CheckResources(resources)): + raise ValueError + else: + found = True except ValueError: - resources = None - if not self.CheckResources(): - logger.error ("Resource File not correct - Creating a new one.") - if (self.CreateResourcesFile() == False): - logger.error ("Error creating resources file.") - return None - return True + logger.error ("Error reading resource file - Creating a new one.") + found = False - ######################## - # Init Resources - ######################## - def InitResources(self): - # Create Empty Status - for res in self.resources: - res["status"] = "" - res["timestamp"] = 0 - res["valid"] = False - - ######################## - # Write Resources File - ######################## - def WriteResourcesFile(self): - with open(self.config.resources_file, 'w') as file: - json.dump(self.resources, file) + if ( not found ): + # Not valid or file missing + resources = self.RetriveResourcesList() + if( resources == None ): + # Not found or wrong + logger.error ("Error retriving resource list.") + return False + else: + # import and write + self.ImportResourcesList(resources) + self.WriteResourcesFile() + return True + else: + # Valid: just import + self.ImportResourcesList(resources) + return True ######################## # Check Resources ######################## - def CheckResources(self): - if "error" in self.resources: - if "error_description" in self.resources: - logger.error ("Error retriving resources: " + self.resources["error_description"]) + def CheckResources(self, resources): + if "reason" in resources: + logger.error ("Error retriving available resources - " + resources["reason"] + " (" + str(resources["code"]) + ")") + return False + if "error" in resources: + if "error_description" in resources: + logger.error ("Error retriving resources: " + resources["error_description"]) else: - logger.error ("Error retriving resources: " + self.resources["error"]) + logger.error ("Error retriving resources: " + resources["error"]) return False - if len(self.resources) == 0: + if len(resources) == 0: logger.error ("Empty resources found.") return False return True ######################## - # Create Resources File + # Retrive Resources List ######################## - def CreateResourcesFile(self): + def RetriveResourcesList(self): resName = "resources" resURL = self.config.res_url_prefix + "/vehicles/" + self.config.vin + "/" + resName - self.resources = GetResource(resName, resURL, self.config) - if "reason" in self.resources: - logger.error ("Error retriving available resources - " + self.resources["reason"] + " (" + str(self.resources["code"]) + ")") - return False + resources = GetResource(resName, resURL, self.config) + if not self.CheckResources(resources): + logger.error ("Error retriving available resources") + return None else: - self.InitResources() - self.WriteResourcesFile() - return True + return resources + + ######################## + # Import Resources List + ######################## + def ImportResourcesList(self, resources): + for res in resources: + if("status" in res): + self.database[res["name"]] = MercedesMeResource (res["name"], res["version"], res["href"], res["status"], res["timestamp"], res["valid"]) + else: + self.database[res["name"]] = MercedesMeResource (res["name"], res["version"], res["href"]) + + ######################## + # Write Resources File + ######################## + def WriteResourcesFile(self): + output = [] + # Extract List + for res in self.database: + output.append( self.database[res].getJson() ) + # Write File + with open(self.config.resources_file, 'w') as file: + json.dump(output, file) ######################## # Print Available Resources ######################## def PrintAvailableResources(self): - print ("Found %d resources" % len(self.resources) + ":") - for res in self.resources: - print (res["name"] + ": " + self.config.res_url_prefix + res["href"]) + print ("Found %d resources" % len(self.database) + ":") + for res in self.database: + print (self.database[res].name + ": " + self.config.res_url_prefix + self.database[res].href) ######################## # Print Resources Status ######################## def PrintResourcesStatus(self, valid = True): - for res in self.resources: - if((not valid) | res["valid"]): - print (res["name"] + ":") - print ("\tvalid: " + str(res["valid"])) - print ("\tstatus: " + res["status"]) - print ("\ttimestamp: " + str(res["timestamp"])) + for res in self.database: + if((not valid) | self.database[res].valid): + print (self.database[res].name + ":") + print ("\tvalid: " + str(self.database[res].valid)) + print ("\tstatus: " + self.database[res].status) + print ("\ttimestamp: " + str(self.database[res].timestamp)) ######################## # Update Resources Status ######################## def UpdateResourcesStatus(self): - for res in self.resources: - resName = res["name"] - resURL = self.config.res_url_prefix + res["href"] + for res in self.database: + resName = self.database[res].name + resURL = self.config.res_url_prefix + self.database[res].href result = GetResource(resName, resURL, self.config) if not "reason" in result: - res["valid"] = True - res["timestamp"] = result[resName]["timestamp"] - res["status"] = result[resName]["value"] + self.database[res].valid = True + self.database[res].timestamp = result[resName]["timestamp"] + self.database[res].status = result[resName]["value"] # Write Resource File - self.WriteResourcesFile() \ No newline at end of file + self.WriteResourcesFile() -- 2.47.3