Mercurial > hgrepos > Python > libs > ConfigMix
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 |
