(conf, preconf=None, ignore_keys=None, prefix=None,
all_keys=None, old_keys=None)
| 230 | |
| 231 | |
| 232 | def detect_settings(conf, preconf=None, ignore_keys=None, prefix=None, |
| 233 | all_keys=None, old_keys=None): |
| 234 | preconf = {} if not preconf else preconf |
| 235 | ignore_keys = set() if not ignore_keys else ignore_keys |
| 236 | all_keys = SETTING_KEYS if not all_keys else all_keys |
| 237 | old_keys = _OLD_SETTING_KEYS if not old_keys else old_keys |
| 238 | |
| 239 | source = conf |
| 240 | if conf is None: |
| 241 | source, conf = preconf, {} |
| 242 | have = set(source.keys()) - ignore_keys |
| 243 | is_in_new = have.intersection(all_keys) |
| 244 | is_in_old = have.intersection(old_keys) |
| 245 | |
| 246 | info = None |
| 247 | if is_in_new: |
| 248 | # have new setting names |
| 249 | info, left = _settings_info, is_in_old |
| 250 | if is_in_old and len(is_in_old) > len(is_in_new): |
| 251 | # Majority of the settings are old. |
| 252 | info, left = _old_settings_info, is_in_new |
| 253 | if is_in_old: |
| 254 | # have old setting names, or a majority of the names are old. |
| 255 | if not info: |
| 256 | info, left = _old_settings_info, is_in_new |
| 257 | if is_in_new and len(is_in_new) > len(is_in_old): |
| 258 | # Majority of the settings are new |
| 259 | info, left = _settings_info, is_in_old |
| 260 | else: |
| 261 | # no settings, just use new format. |
| 262 | info, left = _settings_info, is_in_old |
| 263 | |
| 264 | if prefix: |
| 265 | # always use new format if prefix is used. |
| 266 | info, left = _settings_info, set() |
| 267 | |
| 268 | # only raise error for keys that the user didn't provide two keys |
| 269 | # for (e.g., both ``result_expires`` and ``CELERY_TASK_RESULT_EXPIRES``). |
| 270 | really_left = {key for key in left if info.convert[key] not in have} |
| 271 | if really_left: |
| 272 | # user is mixing old/new, or new/old settings, give renaming |
| 273 | # suggestions. |
| 274 | raise ImproperlyConfigured(info.mix_error.format(renames='\n'.join( |
| 275 | FMT_REPLACE_SETTING.format(replace=key, with_=info.convert[key]) |
| 276 | for key in sorted(really_left) |
| 277 | ))) |
| 278 | |
| 279 | preconf = {info.convert.get(k, k): v for k, v in preconf.items()} |
| 280 | defaults = dict(deepcopy(info.defaults), **preconf) |
| 281 | return Settings( |
| 282 | preconf, [conf, defaults], |
| 283 | (_old_key_to_new, _new_key_to_old), |
| 284 | deprecated_settings=is_in_old, |
| 285 | prefix=prefix, |
| 286 | ) |
| 287 | |
| 288 | |
| 289 | class AppPickler: |
no test coverage detected