| @@ -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): | |||