Coverage for python/lsst/dax/apdb/apdbConfigFreezer.py: 34%

24 statements  

« prev     ^ index     » next       coverage.py v7.5.0, created at 2024-04-30 02:54 -0700

1# This file is part of dax_apdb. 

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__ = ["ApdbConfigFreezer"] 

25 

26import json 

27from collections.abc import Iterable 

28from typing import Generic, TypeVar 

29 

30from .apdb import ApdbConfig 

31 

32_Config = TypeVar("_Config", bound=ApdbConfig) 

33 

34 

35class ApdbConfigFreezer(Generic[_Config]): 

36 """Class that handles freezing of the configuration parameters, this is 

37 an implementation detail for use in Apdb subclasses. 

38 

39 Parameters 

40 ---------- 

41 field_names : `~collections.abc.Iterable` [`str`] 

42 Names of configuration fields to be frozen. 

43 """ 

44 

45 def __init__(self, field_names: Iterable[str]): 

46 self._field_names = list(field_names) 

47 

48 def to_json(self, config: ApdbConfig) -> str: 

49 """Convert part of the configuration object to JSON string. 

50 

51 Parameters 

52 ---------- 

53 config : `ApdbConfig` 

54 Configuration object. 

55 

56 Returns 

57 ------- 

58 json_str : `str` 

59 JSON representation of the frozen part of the config. 

60 """ 

61 config_dict = config.toDict() 

62 json_dict = {name: config_dict[name] for name in self._field_names} 

63 return json.dumps(json_dict) 

64 

65 def update(self, config: _Config, json_str: str) -> _Config: 

66 """Update configuration field values from a JSON string. 

67 

68 Parameters 

69 ---------- 

70 config : `ApdbConfig` 

71 Configuration object. 

72 json_str : str 

73 String containing JSON representation of configuration. 

74 

75 Returns 

76 ------- 

77 updated : `ApdbConfig` 

78 Copy of the ``config`` with some fields updated from JSON object. 

79 

80 Raises 

81 ------ 

82 TypeError 

83 Raised if JSON string does not represent JSON object. 

84 ValueError 

85 Raised if JSON object contains key which is not present in 

86 ``field_names``. 

87 """ 

88 data = json.loads(json_str) 

89 if not isinstance(data, dict): 

90 raise TypeError(f"JSON string must be convertible to object: {json_str!r}") 

91 

92 new_config = type(config)(**config.toDict()) 

93 for key, value in data.items(): 

94 if key not in self._field_names: 

95 raise ValueError(f"JSON object contains unknown key: {key}") 

96 setattr(new_config, key, value) 

97 

98 return new_config