Coverage for python/lsst/daf/persistence/access.py: 64%

32 statements  

« prev     ^ index     » next       coverage.py v6.4.1, created at 2022-06-23 02:39 -0700

1#!/usr/bin/env python 

2# 

3# LSST Data Management System 

4# Copyright 2016 LSST Corporation. 

5# 

6# This product includes software developed by the 

7# LSST Project (http://www.lsst.org/). 

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 LSST License Statement and 

20# the GNU General Public License along with this program. If not, 

21# see <http://www.lsstcorp.org/LegalNotices/>. 

22# 

23 

24from lsst.daf.persistence import Policy 

25 

26import yaml 

27 

28 

29class AccessCfg(Policy, yaml.YAMLObject): 

30 yaml_tag = u"!AccessCfg" 

31 

32 def __init__(self, cls, storageCfg): 

33 super().__init__({'storageCfg': storageCfg, 'cls': cls}) 

34 

35 

36class Access: 

37 """Implements an butler framework interface for Transport, Storage, and Registry 

38 

39 .. warning:: 

40 

41 Access is 'wet paint' and very likely to change. Use of it in production 

42 code other than via the 'old butler' API is strongly discouraged. 

43 

44 """ 

45 

46 @classmethod 

47 def cfg(cls, storageCfg): 

48 """Helper func to create a properly formatted Policy to configure an Access instance. 

49 

50 :param storageCfg: a cfg to instantiate a storage. 

51 :return: 

52 """ 

53 return AccessCfg(cls=cls, storageCfg=storageCfg) 

54 

55 def __init__(self, cfg): 

56 """Initializer 

57 

58 :param cfg: a Policy that defines the configuration for this class. It is recommended that the cfg be 

59 created by calling Access.cfg() 

60 :return: 

61 """ 

62 self.storage = cfg['storageCfg.cls'](cfg['storageCfg']) 

63 

64 def __repr__(self): 

65 return 'Access(storage=%s)' % self.storage 

66 

67 def mapperClass(self): 

68 """Get the mapper class associated with a repository root. 

69 

70 :return: the mapper class 

71 """ 

72 return self.storage.mapperClass() 

73 

74 def root(self): 

75 """Get the repository root as defined by the Storage class, this refers to the 'top' of a persisted 

76 repository. The exact type of Root can vary based on Storage type. 

77 

78 :return: the root of the persisted repository. 

79 """ 

80 

81 return self.storage.root 

82 

83 def locationWithRoot(self, location): 

84 """Given a location, get a fully qualified handle to location including storage root. 

85 

86 Note; at the time of this writing the only existing storage type is PosixStorage. This returns the 

87 root+location. 

88 :param location: 

89 :return: 

90 """ 

91 return self.storage.locationWithRoot(location) 

92 

93 def setCfg(self, repoCfg): 

94 """Writes the repository configuration to Storage. 

95 

96 :param repoCfg: the Policy cfg to be written 

97 :return: None 

98 """ 

99 self.storage.setCfg(repoCfg) 

100 

101 def loadCfg(self): 

102 """Reads the repository configuration from Storage. 

103 

104 :return: the Policy cfg 

105 """ 

106 return self.storage.loadCfg() 

107 

108 def write(self, butlerLocation, obj): 

109 """Passes an object to Storage to be written into the repository. 

110 

111 :param butlerLocation: the location & formatting for the object to be written. 

112 :param obj: the object to be written. 

113 :return: None 

114 """ 

115 self.storage.write(butlerLocation, obj) 

116 

117 def read(self, butlerLocation): 

118 """Reads an object from storage 

119 

120 :param butlerLocation: describes the location & how to load the object. 

121 :return: 

122 """ 

123 return self.storage.read(butlerLocation=butlerLocation) 

124 

125 def exists(self, location): 

126 """Query if a location exists. 

127 

128 As of this writing the only storage type is PosixStorage, and it works to say that 'location' is a 

129 simple locaiton descriptor. In the case of PosixStorage that's a path. If this needs to become more 

130 complex it could be changed to be a butlerLocation, or something else, as needed. 

131 :param location: a simple location descriptor, type is dependent on Storage. 

132 :return: True if location exists, else False. 

133 """ 

134 return self.storage.exists(location) 

135 

136 def lookup(self, *args, **kwargs): 

137 """Perform a lookup in the registry. 

138 

139 Returns a list of dataId for each valid lookup (right? TODO VERIFY)""" 

140 return self.storage.lookup(*args, **kwargs)