comparison configmix/__init__.py @ 734:50dea7892b62

Prepare calling conventions for a new merge-stragegy for lists: extens instead of replace
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 27 Oct 2023 09:32:27 +0200
parents 450223a8cff2
children 324ae9a56a75
comparison
equal deleted inserted replaced
733:06b6c14bcd61 734:50dea7892b62
387 else: 387 else:
388 result[k] = deepcopy(v) # noqa 388 result[k] = deepcopy(v) # noqa
389 return result 389 return result
390 390
391 391
392 def merge(user, default, filter_comments=True): 392 def merge(user, default, filter_comments=True, extend_lists=False):
393 """Logically merge the configuration in `user` into `default`. 393 """Logically merge the configuration in `user` into `default`.
394 394
395 :param ~configmix.config.Configuration user: 395 :param ~configmix.config.Configuration user:
396 the new configuration that will be logically merged 396 the new configuration that will be logically merged
397 into `default` 397 into `default`
398 :param ~configmix.config.Configuration default: 398 :param ~configmix.config.Configuration default:
399 the base configuration where `user` is logically merged into 399 the base configuration where `user` is logically merged into
400 :param bool filter_comments: flag whether to filter comment keys that 400 :param bool filter_comments: flag whether to filter comment keys that
401 start with any of the items in :data:`.COMMENTS` 401 start with any of the items in :data:`.COMMENTS`
402 :param bool extens_lists: When ``True`` then lists will be extended instead of
403 overwritten by the merge process
402 :returns: `user` with the necessary amendments from `default`. 404 :returns: `user` with the necessary amendments from `default`.
403 If `user` is ``None`` then `default` is returned. 405 If `user` is ``None`` then `default` is returned.
404 406
405 .. note:: The configuration in `user` is augmented/changed 407 .. note:: The configuration in `user` is augmented/changed
406 **inplace**. 408 **inplace**.
433 ukv = user[k] 435 ukv = user[k]
434 if ukv == constants.DEL_VALUE: 436 if ukv == constants.DEL_VALUE:
435 # do not copy 437 # do not copy
436 del user[k] 438 del user[k]
437 else: 439 else:
438 user[k] = _merge(ukv, v, filter_comments) 440 user[k] = _merge(ukv, v, filter_comments, extend_lists)
439 else: 441 else:
440 user[k] = v 442 user[k] = v
441 _filter_deletions(user) 443 _filter_deletions(user)
442 return user 444 return user
443 445
444 446
445 def _merge(user, default, filter_comments): 447 def _merge(user, default, filter_comments, extend_lists):
446 """Recursion helper for :func:`.merge` 448 """Recursion helper for :func:`.merge`
447 449
448 """ 450 """
449 if isinstance(user, dict) and isinstance(default, dict): 451 if isinstance(user, dict) and isinstance(default, dict):
450 for k, v in default.items(): 452 for k, v in default.items():
457 ukv = user[k] 459 ukv = user[k]
458 if ukv == constants.DEL_VALUE: 460 if ukv == constants.DEL_VALUE:
459 # do not copy 461 # do not copy
460 del user[k] 462 del user[k]
461 else: 463 else:
462 user[k] = _merge(ukv, v, filter_comments) 464 user[k] = _merge(ukv, v, filter_comments, extend_lists)
463 else: 465 else:
464 user[k] = v 466 user[k] = v
465 return user 467 return user
466 468
467 469
468 def safe_merge(user, default, filter_comments=True): 470 def safe_merge(user, default, filter_comments=True, extend_lists=False):
469 """A more safe version of :func:`.merge` that makes deep copies of 471 """A more safe version of :func:`.merge` that makes deep copies of
470 the returned container objects. 472 the returned container objects.
471 473
472 Contrary to :func:`.merge` no given argument is ever changed 474 Contrary to :func:`.merge` no given argument is ever changed
473 inplace. Every object from `default` is decoupled from the result 475 inplace. Every object from `default` is decoupled from the result
494 ukv = user[k] 496 ukv = user[k]
495 if ukv == constants.DEL_VALUE: 497 if ukv == constants.DEL_VALUE:
496 # do not copy 498 # do not copy
497 del user[k] 499 del user[k]
498 else: 500 else:
499 user[k] = _safe_merge(ukv, v, filter_comments) 501 user[k] = _safe_merge(ukv, v, filter_comments, extend_lists)
500 else: 502 else:
501 user[k] = copy.deepcopy(v) 503 user[k] = copy.deepcopy(v)
502 _filter_deletions(user) 504 _filter_deletions(user)
503 return user 505 return user
504 506
505 507
506 def _safe_merge(user, default, filter_comments): 508 def _safe_merge(user, default, filter_comments, extend_lists):
507 """Recursion helper for :func:`safe_merge` 509 """Recursion helper for :func:`safe_merge`
508 510
509 """ 511 """
510 if isinstance(user, dict) and isinstance(default, dict): 512 if isinstance(user, dict) and isinstance(default, dict):
511 for k, v in default.items(): 513 for k, v in default.items():
518 ukv = user[k] 520 ukv = user[k]
519 if ukv == constants.DEL_VALUE: 521 if ukv == constants.DEL_VALUE:
520 # do not copy 522 # do not copy
521 del user[k] 523 del user[k]
522 else: 524 else:
523 user[k] = _safe_merge(ukv, v, filter_comments) 525 user[k] = _safe_merge(ukv, v, filter_comments, extend_lists)
524 else: 526 else:
525 user[k] = copy.deepcopy(v) 527 user[k] = copy.deepcopy(v)
526 return user 528 return user
527 529
528 530