Coverage for python/lsst/daf/persistence/access.py: 59%
32 statements
« prev ^ index » next coverage.py v6.5.0, created at 2022-10-12 02:38 -0700
« prev ^ index » next coverage.py v6.5.0, created at 2022-10-12 02:38 -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#
24from lsst.daf.persistence import Policy
26import yaml
29class AccessCfg(Policy, yaml.YAMLObject):
30 yaml_tag = u"!AccessCfg"
32 def __init__(self, cls, storageCfg):
33 super().__init__({'storageCfg': storageCfg, 'cls': cls})
36class Access:
37 """Implements an butler framework interface for Transport, Storage, and Registry
39 .. warning::
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.
44 """
46 @classmethod
47 def cfg(cls, storageCfg):
48 """Helper func to create a properly formatted Policy to configure an Access instance.
50 :param storageCfg: a cfg to instantiate a storage.
51 :return:
52 """
53 return AccessCfg(cls=cls, storageCfg=storageCfg)
55 def __init__(self, cfg):
56 """Initializer
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'])
64 def __repr__(self):
65 return 'Access(storage=%s)' % self.storage
67 def mapperClass(self):
68 """Get the mapper class associated with a repository root.
70 :return: the mapper class
71 """
72 return self.storage.mapperClass()
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.
78 :return: the root of the persisted repository.
79 """
81 return self.storage.root
83 def locationWithRoot(self, location):
84 """Given a location, get a fully qualified handle to location including storage root.
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)
93 def setCfg(self, repoCfg):
94 """Writes the repository configuration to Storage.
96 :param repoCfg: the Policy cfg to be written
97 :return: None
98 """
99 self.storage.setCfg(repoCfg)
101 def loadCfg(self):
102 """Reads the repository configuration from Storage.
104 :return: the Policy cfg
105 """
106 return self.storage.loadCfg()
108 def write(self, butlerLocation, obj):
109 """Passes an object to Storage to be written into the repository.
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)
117 def read(self, butlerLocation):
118 """Reads an object from storage
120 :param butlerLocation: describes the location & how to load the object.
121 :return:
122 """
123 return self.storage.read(butlerLocation=butlerLocation)
125 def exists(self, location):
126 """Query if a location exists.
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)
136 def lookup(self, *args, **kwargs):
137 """Perform a lookup in the registry.
139 Returns a list of dataId for each valid lookup (right? TODO VERIFY)"""
140 return self.storage.lookup(*args, **kwargs)