Coverage for python/lsst/daf/butler/registry/_config.py : 53%

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/>.
22from __future__ import annotations
24__all__ = ("RegistryConfig",)
26from typing import Optional, Type, TYPE_CHECKING, Union
28from lsst.utils import doImport
30from ..core import ConfigSubset
31from ..core.repoRelocation import replaceRoot
32from .connectionString import ConnectionStringFactory
34if TYPE_CHECKING: 34 ↛ 35line 34 didn't jump to line 35, because the condition on line 34 was never true
35 import sqlalchemy
36 from ..core import ButlerURI
37 from .interfaces import Database
40class RegistryConfig(ConfigSubset):
41 component = "registry"
42 requiredKeys = ("db",)
43 defaultConfigFile = "registry.yaml"
45 def getDialect(self) -> str:
46 """Parses the `db` key of the config and returns the database dialect.
48 Returns
49 -------
50 dialect : `str`
51 Dialect found in the connection string.
52 """
53 conStr = ConnectionStringFactory.fromConfig(self)
54 return conStr.get_backend_name()
56 def getDatabaseClass(self) -> Type[Database]:
57 """Returns the `Database` class targeted by configuration values.
59 The appropriate class is determined by parsing the `db` key to extract
60 the dialect, and then looking that up under the `engines` key of the
61 registry config.
62 """
63 dialect = self.getDialect()
64 if dialect not in self["engines"]:
65 raise ValueError(f"Connection string dialect has no known aliases. Received: {dialect}")
66 databaseClass = self["engines", dialect]
67 return doImport(databaseClass)
69 def makeDefaultDatabaseUri(self, root: str) -> Optional[str]:
70 """Return a default 'db' URI for the registry configured here that is
71 appropriate for a new empty repository with the given root.
73 Parameters
74 ----------
75 root : `str`
76 Filesystem path to the root of the data repository.
78 Returns
79 -------
80 uri : `str`
81 URI usable as the 'db' string in a `RegistryConfig`.
82 """
83 DatabaseClass = self.getDatabaseClass()
84 return DatabaseClass.makeDefaultUri(root)
86 def replaceRoot(self, root: Optional[Union[str, ButlerURI]]) -> None:
87 """Replace any occurrences of `BUTLER_ROOT_TAG` in the connection
88 with the given root directory.
90 Parameters
91 ----------
92 root : `str`, `ButlerURI`, or `None`
93 String to substitute for `BUTLER_ROOT_TAG`. Passing `None` here is
94 allowed only as a convenient way to raise an exception
95 (`ValueError`).
97 Raises
98 ------
99 ValueError
100 Raised if ``root`` is not set but a value is required.
101 """
102 self["db"] = replaceRoot(self["db"], root)
104 @property
105 def connectionString(self) -> sqlalchemy.engine.url.URL:
106 """Return the connection string to the underlying database
107 (`sqlalchemy.engine.url.URL`).
108 """
109 return ConnectionStringFactory.fromConfig(self)