dataset.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import os
  2. import re
  3. import json
  4. def parent_path(parent):
  5. chain = [os.path.join(s, '.nova') for s in parent.split('/') if s]
  6. return os.path.join(*chain) if chain else ''
  7. class Dataset(object):
  8. def __init__(self, path, name, parent, owner):
  9. self.path = path
  10. self.name = name
  11. self.parent = parent
  12. self.owner = owner
  13. def commit(self):
  14. path = os.path.join(self.path, parent_path(self.parent), self.name, '.nova')
  15. os.makedirs(path)
  16. with open(os.path.join(path, 'metadata.json'), 'w') as fp:
  17. json.dump(dict(name=self.name, owner=self.owner.uid, parent=self.parent), fp)
  18. # def load_dataset(metadata_path):
  19. class Control(object):
  20. def __init__(self, user_control, path='.'):
  21. self.user_control = user_control
  22. self.path = os.path.abspath(path)
  23. for root, dirs, files in os.walk(self.path):
  24. if '.nova' in dirs:
  25. print root, dirs, files
  26. def find_dataset(self, name, parent):
  27. chain = [os.path.join(s, '.nova') for s in parent.split('/') if s]
  28. chain = os.path.join(*chain) if chain else ''
  29. d = os.path.join(self.path, chain, name, '.nova', 'metadata.json')
  30. # if os.path.exists(d):
  31. # return load_dataset(
  32. # print d
  33. def create_dataset(self, name, parent, owner):
  34. owner_uid = int(owner) if owner.isdigit() else None
  35. owner_name = owner if not owner.isdigit() else None
  36. result = self.user_control.find_user(name=owner_name, uid=owner_uid)
  37. if not result:
  38. raise Exception("Owner {} not found".format(owner))
  39. owner = result[0][1]
  40. # Check if name is valid filename
  41. if not re.match(r'^[A-Za-z0-9\.\[\]\(\)\+]+$', name):
  42. raise Exception("{} is not a valid dataset".format(name))
  43. # Check if dataset already exists
  44. if self.find_dataset(name, parent):
  45. raise Exception("{} already exists".format(name))
  46. dataset = Dataset(self.path, name, parent, owner)
  47. dataset.commit()
  48. # path = os.path.join(self.path, parent, '.nova', name, '.nova')
  49. # print path
  50. # os.makedirs(path)