30JSONType: t.TypeAlias = dict[str,
"JSONType"] | list[
"JSONType"] | str | int | float | bool |
None
118def update_dict(default_dict: MutableMapping[str, t.Any], user_dict: MutableMapping[str, t.Any]):
119 for k, v
in user_dict.items():
120 if isinstance(v, MutableMapping):
121 default_dict[k] =
update_dict(default_dict.get(k, {}), v)
127def update_settings(default_settings: MutableMapping[str, t.Any], user_settings: MutableMapping[str, t.Any]):
131 for k, v
in user_settings.items():
132 if k
not in (
'use_default_settings',
'engines'):
133 if k
in default_settings
and isinstance(v, MutableMapping):
136 default_settings[k] = v
138 categories_as_tabs = user_settings.get(
'categories_as_tabs')
139 if categories_as_tabs:
140 default_settings[
'categories_as_tabs'] = categories_as_tabs
142 plugins = user_settings.get(
'plugins')
143 if plugins
is not None:
144 default_settings[
'plugins'] = plugins
147 remove_engines:
None | list[str] =
None
148 keep_only_engines: list[str] |
None =
None
149 use_default_settings: dict[str, t.Any] |
None = user_settings.get(
'use_default_settings')
150 if isinstance(use_default_settings, dict):
151 remove_engines = use_default_settings.get(
'engines', {}).get(
'remove')
152 keep_only_engines = use_default_settings.get(
'engines', {}).get(
'keep_only')
154 if 'engines' in user_settings
or remove_engines
is not None or keep_only_engines
is not None:
155 engines: list[dict[str, t.Any]] = default_settings[
'engines']
158 if remove_engines
is not None:
159 engines = list(filterfalse(
lambda engine: (engine.get(
'name'))
in remove_engines, engines))
162 if keep_only_engines
is not None:
163 engines = list(filter(
lambda engine: (engine.get(
'name'))
in keep_only_engines, engines))
166 user_engines = user_settings.get(
'engines')
168 engines_dict = dict((definition[
'name'], definition)
for definition
in engines)
169 for user_engine
in user_engines:
170 default_engine: dict[str, t.Any] |
None = engines_dict.get(user_engine[
'name'])
174 engines.append(user_engine)
177 default_settings[
'engines'] = engines
179 return default_settings
194def load_settings(load_user_settings: bool =
True) -> tuple[SettingsType, str]:
195 """Function for loading the settings of the SearXNG application
196 (:ref:`settings.yml <searxng settings.yml>`)."""
198 msg = f
"load the default settings from {DEFAULT_SETTINGS_FILE}"
202 if not load_user_settings
or not cfg_folder:
205 settings_yml = os.environ.get(
"SEARXNG_SETTINGS_PATH")
206 if settings_yml
and Path(settings_yml).is_file():
208 settings_yml = Path(settings_yml).name
211 settings_yml = SETTINGS_YAML
213 cfg_file = cfg_folder / settings_yml
214 if not cfg_file.exists():
217 msg = f
"load the user settings from {cfg_file}"
222 msg = f
"merge the default settings ( {DEFAULT_SETTINGS_FILE} ) and the user settings ( {cfg_file} )"