Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1# This file is part of daf_butler. 

2# 

3# Developed for the LSST Data Management System. 

4# This product includes software developed by the LSST Project 

5# (http://www.lsst.org). 

6# See the COPYRIGHT file at the top-level directory of this distribution 

7# for details of code ownership. 

8# 

9# This program is free software: you can redistribute it and/or modify 

10# it under the terms of the GNU General Public License as published by 

11# the Free Software Foundation, either version 3 of the License, or 

12# (at your option) any later version. 

13# 

14# This program is distributed in the hope that it will be useful, 

15# but WITHOUT ANY WARRANTY; without even the implied warranty of 

16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

17# GNU General Public License for more details. 

18# 

19# You should have received a copy of the GNU General Public License 

20# along with this program. If not, see <http://www.gnu.org/licenses/>. 

21 

22__all__ = ("StoredFileInfo", "StoredDatastoreItemInfo") 

23 

24import inspect 

25from dataclasses import dataclass 

26from typing import Optional 

27 

28from .formatter import Formatter 

29from .storageClass import StorageClass 

30 

31 

32class StoredDatastoreItemInfo: 

33 """Internal information associated with a stored dataset in a `Datastore`. 

34 

35 This is an empty base class. Datastore implementations are expected to 

36 write their own subclasses. 

37 """ 

38 __slots__ = () 

39 

40 

41@dataclass 

42class StoredFileInfo(StoredDatastoreItemInfo): 

43 """Datastore-private metadata associated with a file stored in a Datastore. 

44 """ 

45 __slots__ = {"formatter", "path", "storageClass", "component", 

46 "checksum", "file_size"} 

47 

48 formatter: str 

49 """Fully-qualified name of Formatter.""" 

50 

51 path: str 

52 """Path to dataset within Datastore.""" 

53 

54 storageClass: StorageClass 

55 """StorageClass associated with Dataset.""" 

56 

57 component: Optional[str] 

58 """Component associated with this file. Can be None if the file does 

59 not refer to a component of a composite.""" 

60 

61 checksum: Optional[str] 

62 """Checksum of the serialized dataset.""" 

63 

64 file_size: int 

65 """Size of the serialized dataset in bytes.""" 

66 

67 def __post_init__(self): 

68 # This modification prevents the data class from being frozen. 

69 if isinstance(self.formatter, str): 

70 # We trust that this string refers to a Formatter 

71 pass 

72 elif isinstance(self.formatter, Formatter) or \ 

73 (inspect.isclass(self.formatter) and issubclass(self.formatter, Formatter)): 

74 self.formatter = self.formatter.name() 

75 else: 

76 raise TypeError(f"Supplied formatter '{self.formatter}' is not a Formatter")