| @@ -27,10 +27,13 @@ class MDBase(object): | |||||
| 'uuid': uuid.uuid4, | 'uuid': uuid.uuid4, | ||||
| 'modified': datetime.datetime.utcnow | 'modified': datetime.datetime.utcnow | ||||
| } | } | ||||
| _common_properties = [ 'type', 'created_by_ref' ] | |||||
| _common_properties = [ 'created_by_ref' ] | |||||
| def __init__(self, obj): | def __init__(self, obj): | ||||
| obj = copy.deepcopy(obj) | obj = copy.deepcopy(obj) | ||||
| if 'type' not in obj: | |||||
| obj['type'] = self._type | |||||
| for x in self._common_properties: | for x in self._common_properties: | ||||
| if x not in obj: | if x not in obj: | ||||
| raise ValueError('common property %s not present' % `x`) | raise ValueError('common property %s not present' % `x`) | ||||
| @@ -166,62 +169,35 @@ def _hashfile(fname): | |||||
| return '%s:%s' % (_defaulthash, hash.hexdigest()) | 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) | fname = os.path.join(_dir, filename) | ||||
| s = os.stat(fname) | 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. | '''Enumerate all the files and directories (not recursive) in _dir. | ||||
| Returned is a list of FileObjects.''' | 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): | class _TestCases(unittest.TestCase): | ||||
| def setUp(self): | def setUp(self): | ||||
| @@ -257,10 +233,13 @@ class _TestCases(unittest.TestCase): | |||||
| self.assertEqual(ObjectStore.makehash('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', strict=False), 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855') | self.assertEqual(ObjectStore.makehash('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', strict=False), 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855') | ||||
| def test_enumeratedir(self): | def test_enumeratedir(self): | ||||
| files = enumeratedir(self.tempdir) | |||||
| files = enumeratedir(self.tempdir, '867c7563-79ae-435c-a265-9d8509cefac5') | |||||
| ftest = files[0] | ftest = files[0] | ||||
| fname = 'test.txt' | fname = 'test.txt' | ||||
| # make sure that they are of type MDBase | |||||
| self.assertIsInstance(ftest, MDBase) | |||||
| oldid = ftest.id | oldid = ftest.id | ||||
| self.assertEqual(ftest.filename, fname) | self.assertEqual(ftest.filename, fname) | ||||
| self.assertEqual(ftest.dir, self.tempdir) | self.assertEqual(ftest.dir, self.tempdir) | ||||
| @@ -273,7 +252,8 @@ class _TestCases(unittest.TestCase): | |||||
| self.assertIn('sha512:7d5768d47b6bc27dc4fa7e9732cfa2de506ca262a2749cb108923e5dddffde842bbfee6cb8d692fb43aca0f12946c521cce2633887914ca1f96898478d10ad3f', ftest.hashes) | self.assertIn('sha512:7d5768d47b6bc27dc4fa7e9732cfa2de506ca262a2749cb108923e5dddffde842bbfee6cb8d692fb43aca0f12946c521cce2633887914ca1f96898478d10ad3f', ftest.hashes) | ||||
| # XXX - make sure works w/ relative dirs | # 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) | self.assertEqual(oldid, files[0].id) | ||||
| def test_objectstore(self): | def test_objectstore(self): | ||||