From e844b32ed840e846079321458e5ecff16d27ffd1 Mon Sep 17 00:00:00 2001 From: Philippe Ombredanne Date: Sun, 18 Jul 2021 08:58:55 +0200 Subject: [PATCH] Sort simple expansion by parameter name length #16 parameters are sorted by decreasing length such that we expand first the longest names. Signed-off-by: Philippe Ombredanne --- parameter_expansion/pe.py | 12 +++++++----- parameter_expansion/tests/test_pe.py | 7 +++++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/parameter_expansion/pe.py b/parameter_expansion/pe.py index 0d402a7..b3100a2 100644 --- a/parameter_expansion/pe.py +++ b/parameter_expansion/pe.py @@ -164,11 +164,13 @@ def expand_simple(s, env): Uses the provided environment dict. Similar to ``os.path.expandvars``. """ - # TODO: validate if a plain replace is really what is supposed to happen - # in particular simple expansion may need to happen on tokens rather than - # on the whole string. - # For instance, with foo=bar, abc$fooBAR expands to abc - for name, value in env.items(): + env_by_decreasing_name_length = sorted( + env.items(), + # [0] is the name. minus its length gets the longest first. + key=lambda name_value: -len(name_value[0]), + ) + + for name, value in env_by_decreasing_name_length: s = s.replace(f"${name}", value) name = "{" + name + "}" s = s.replace(f"${name}", value) diff --git a/parameter_expansion/tests/test_pe.py b/parameter_expansion/tests/test_pe.py index be28bb3..8da8fff 100644 --- a/parameter_expansion/tests/test_pe.py +++ b/parameter_expansion/tests/test_pe.py @@ -561,6 +561,13 @@ def test_expand_can_handle_nested_substitution_and_pattern_expand(): assert expanded_var == "alpha19" +def test_expand_simple_expands_longest_param_name_first(): + env = dict(pkg="foo", pkgver="bar") + var = "$pkgver" + expanded_var = pex.expand(var, env=env, strict=True) + assert expanded_var == "bar" + + def test_tokenize_preserves_spaces(): s = " - $parameter/$aa/${bb} - \t- \n ${parameter/ aa / - zz }- " tokens = list(parameter_expansion.pe.tokenize(s))