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 

22from __future__ import annotations 

23 

24__all__ = ("RegistryConfig",) 

25 

26from typing import Optional, Type, TYPE_CHECKING, Union 

27 

28import sqlalchemy 

29 

30from lsst.utils import doImport 

31 

32from ..core import ConfigSubset 

33from ..core.repoRelocation import replaceRoot 

34from .connectionString import ConnectionStringFactory 

35 

36if TYPE_CHECKING: 36 ↛ 37line 36 didn't jump to line 37, because the condition on line 36 was never true

37 from ..core import ButlerURI 

38 from .interfaces import Database 

39 

40 

41class RegistryConfig(ConfigSubset): 

42 component = "registry" 

43 requiredKeys = ("db",) 

44 defaultConfigFile = "registry.yaml" 

45 

46 def getDialect(self) -> str: 

47 """Parses the `db` key of the config and returns the database dialect. 

48 

49 Returns 

50 ------- 

51 dialect : `str` 

52 Dialect found in the connection string. 

53 """ 

54 conStr = ConnectionStringFactory.fromConfig(self) 

55 return conStr.get_backend_name() 

56 

57 def getDatabaseClass(self) -> Type[Database]: 

58 """Returns the `Database` class targeted by configuration values. 

59 

60 The appropriate class is determined by parsing the `db` key to extract 

61 the dialect, and then looking that up under the `engines` key of the 

62 registry config. 

63 """ 

64 dialect = self.getDialect() 

65 if dialect not in self["engines"]: 

66 raise ValueError(f"Connection string dialect has no known aliases. Received: {dialect}") 

67 databaseClass = self["engines", dialect] 

68 return doImport(databaseClass) 

69 

70 def makeDefaultDatabaseUri(self, root: str) -> Optional[str]: 

71 """Return a default 'db' URI for the registry configured here that is 

72 appropriate for a new empty repository with the given root. 

73 

74 Parameters 

75 ---------- 

76 root : `str` 

77 Filesystem path to the root of the data repository. 

78 

79 Returns 

80 ------- 

81 uri : `str` 

82 URI usable as the 'db' string in a `RegistryConfig`. 

83 """ 

84 DatabaseClass = self.getDatabaseClass() 

85 return DatabaseClass.makeDefaultUri(root) 

86 

87 def replaceRoot(self, root: Optional[Union[str, ButlerURI]]) -> None: 

88 """Replace any occurrences of `BUTLER_ROOT_TAG` in the connection 

89 with the given root directory. 

90 

91 Parameters 

92 ---------- 

93 root : `str`, `ButlerURI`, or `None` 

94 String to substitute for `BUTLER_ROOT_TAG`. Passing `None` here is 

95 allowed only as a convenient way to raise an exception 

96 (`ValueError`). 

97 

98 Raises 

99 ------ 

100 ValueError 

101 Raised if ``root`` is not set but a value is required. 

102 """ 

103 self["db"] = replaceRoot(self["db"], root) 

104 

105 @property 

106 def connectionString(self) -> sqlalchemy.engine.url.URL: 

107 """Return the connection string to the underlying database 

108 (`sqlalchemy.engine.url.URL`). 

109 """ 

110 return ConnectionStringFactory.fromConfig(self)