metadata.py (2673B)
1 # This Source Code Form is subject to the terms of the Mozilla Public 2 # License, v. 2.0. If a copy of the MPL was not distributed with this 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 """Manages a metadata file.""" 5 6 import datetime 7 import json 8 import os 9 from collections.abc import MutableMapping 10 11 from condprof.util import logger 12 13 METADATA_NAME = "condprofile.json" 14 15 16 class Metadata(MutableMapping): 17 """dict-like class that holds metadata for a profile.""" 18 19 def __init__(self, profile_dir): 20 self.metadata_file = os.path.join(profile_dir, METADATA_NAME) 21 logger.info("Reading existing metadata at %s" % self.metadata_file) 22 if not os.path.exists(self.metadata_file): 23 logger.info("Could not find the metadata file in that profile") 24 self._data = {} 25 else: 26 with open(self.metadata_file) as f: 27 self._data = json.loads(f.read()) 28 29 def __getitem__(self, key): 30 return self._data[self.__keytransform__(key)] 31 32 def __setitem__(self, key, value): 33 self._data[self.__keytransform__(key)] = value 34 35 def __delitem__(self, key): 36 del self._data[self.__keytransform__(key)] 37 38 def __iter__(self): 39 return iter(self._data) 40 41 def __len__(self): 42 return len(self._data) 43 44 def __keytransform__(self, key): 45 return key 46 47 def _days2age(self, days): 48 if days < 7: 49 return "days" 50 if days < 30: 51 return "weeks" 52 if days < 30 * 6: 53 return "months" 54 return "old" # :) 55 56 def _delta(self, created, updated): 57 created = created[:26] 58 updated = updated[:26] 59 # tz.. 60 format = "%Y-%m-%d %H:%M:%S.%f" 61 created = datetime.datetime.strptime(created, format) 62 updated = datetime.datetime.strptime(updated, format) 63 delta = created - updated 64 return delta.days 65 66 def write(self, **extras): 67 # writing metadata 68 logger.info("Creating metadata...") 69 self._data.update(**extras) 70 ts = str(datetime.datetime.now()) 71 if "created" not in self._data: 72 self._data["created"] = ts 73 self._data["updated"] = ts 74 # XXX need android arch version here 75 days = self._delta(self._data["created"], self._data["updated"]) 76 self._data["days"] = days 77 self._data["age"] = self._days2age(days) 78 # adding info about the firefox version 79 # XXX build ID ?? 80 # XXX android ?? 81 logger.info("Saving metadata file in %s" % self.metadata_file) 82 with open(self.metadata_file, "w") as f: 83 f.write(json.dumps(self._data))