From 96b90c059fc98f6e07c11b4e1fccb838325a507a Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Sun, 2 Jun 2019 22:38:58 -0700 Subject: [PATCH] make type generate if not present, make FileObject subclass MDBase --- ui/cli.py | 78 +++++++++++++++++++++---------------------------------- 1 file changed, 29 insertions(+), 49 deletions(-) diff --git a/ui/cli.py b/ui/cli.py index d486163..30f9b87 100644 --- a/ui/cli.py +++ b/ui/cli.py @@ -27,10 +27,13 @@ class MDBase(object): 'uuid': uuid.uuid4, 'modified': datetime.datetime.utcnow } - _common_properties = [ 'type', 'created_by_ref' ] + _common_properties = [ 'created_by_ref' ] def __init__(self, obj): obj = copy.deepcopy(obj) + if 'type' not in obj: + obj['type'] = self._type + for x in self._common_properties: if x not in obj: raise ValueError('common property %s not present' % `x`) @@ -166,62 +169,35 @@ def _hashfile(fname): return '%s:%s' % (_defaulthash, hash.hexdigest()) -class FileObject(object): - def __init__(self, _dir, filename): - self._dir = os.path.realpath(_dir) - self._fname = filename +class FileObject(MDBase): + _type = 'file' - # XXX make sure this is correct - self._id = uuid.uuid5(_NAMESPACE_MEDASHARE_PATH, - '/'.join(os.path.split(self._dir) + ( self._fname, ))) + @classmethod + def from_file(cls, _dir, filename, created_by_ref): + _dir = os.path.realpath(_dir) fname = os.path.join(_dir, filename) s = os.stat(fname) - self._mtime = datetime.datetime.utcfromtimestamp(s.st_mtime) - self._size = s.st_size - self._hashes = ( _hashfile(fname), ) - - @property - def hashes(self): - '''The hashes for this file.''' - - # XXX - should return a frozen dict - return self._hashes - - @property - def mtime(self): - '''The last modified date of the file.''' - - return self._mtime - - @property - def size(self): - '''The length of the file in bytes.''' - - return self._size - @property - def filename(self): - '''The name of the file.''' - - return self._fname - - @property - def dir(self): - '''The directory of the file.''' - - return self._dir + obj = { + 'dir': _dir, + 'created_by_ref': created_by_ref, + 'filename': filename, + 'id': uuid.uuid5(_NAMESPACE_MEDASHARE_PATH, + '/'.join(os.path.split(fname))), + 'mtime': datetime.datetime.utcfromtimestamp(s.st_mtime), + 'size': s.st_size, + 'hashes': ( _hashfile(fname), ), + } - @property - def id(self): - '''The UUID of the path to this file.''' - return self._id + return cls(obj) -def enumeratedir(_dir='.'): +def enumeratedir(_dir, created_by_ref): '''Enumerate all the files and directories (not recursive) in _dir. Returned is a list of FileObjects.''' - return map(lambda x: FileObject(_dir, x), os.listdir(_dir)) + return map(lambda x: FileObject.from_file(_dir, x, created_by_ref), + os.listdir(_dir)) class _TestCases(unittest.TestCase): def setUp(self): @@ -257,10 +233,13 @@ class _TestCases(unittest.TestCase): self.assertEqual(ObjectStore.makehash('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', strict=False), 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855') def test_enumeratedir(self): - files = enumeratedir(self.tempdir) + files = enumeratedir(self.tempdir, '867c7563-79ae-435c-a265-9d8509cefac5') ftest = files[0] fname = 'test.txt' + # make sure that they are of type MDBase + self.assertIsInstance(ftest, MDBase) + oldid = ftest.id self.assertEqual(ftest.filename, fname) self.assertEqual(ftest.dir, self.tempdir) @@ -273,7 +252,8 @@ class _TestCases(unittest.TestCase): self.assertIn('sha512:7d5768d47b6bc27dc4fa7e9732cfa2de506ca262a2749cb108923e5dddffde842bbfee6cb8d692fb43aca0f12946c521cce2633887914ca1f96898478d10ad3f', ftest.hashes) # XXX - make sure works w/ relative dirs - files = enumeratedir(os.path.relpath(self.tempdir)) + files = enumeratedir(os.path.relpath(self.tempdir), + '867c7563-79ae-435c-a265-9d8509cefac5') self.assertEqual(oldid, files[0].id) def test_objectstore(self):