Skip to content

Commit ccc521b

Browse files
MartinNeupauerfa-assistant
authored andcommitted
Allow positional arguments in dictsort (#4132)
* Allow positional arguments in dictsort to maintain a parity with Jinja * fix the test * fix the test 2 GitOrigin-RevId: 1f9e3c00eb0e0613a29f18126e9babaef31c98da
1 parent d6aac6a commit ccc521b

File tree

4 files changed

+37
-7
lines changed

4 files changed

+37
-7
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
kind: Fixes
2+
body: Allow positional arguments in dictsort
3+
time: 2025-06-25T09:25:24.679392309-07:00

crates/dbt-jinja/minijinja/src/filters.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -441,24 +441,34 @@ mod builtins {
441441
/// * `by`: set to `"value"` to sort by value. Defaults to `"key"`.
442442
/// * `reverse`: set to `true` to sort in reverse.
443443
#[cfg_attr(docsrs, doc(cfg(feature = "builtins")))]
444-
pub fn dictsort(v: &Value, kwargs: Kwargs) -> Result<Value, Error> {
444+
pub fn dictsort(
445+
v: &Value,
446+
case_sensitive: Option<bool>,
447+
by_value: Option<Cow<'_, str>>,
448+
reverse: Option<bool>,
449+
kwargs: Kwargs,
450+
) -> Result<Value, Error> {
445451
if v.kind() != ValueKind::Map {
446452
return Err(Error::new(
447453
ErrorKind::InvalidOperation,
448454
"cannot convert value into pair list",
449455
));
450456
}
451457

452-
let by_value = matches!(ok!(kwargs.get("by")), Some("value"));
453-
let case_sensitive = ok!(kwargs.get::<Option<bool>>("case_sensitive")).unwrap_or(false);
458+
let by_value = matches!(
459+
ok!(kwargs.get::<Option<&str>>("by")).unwrap_or(by_value.as_deref().unwrap_or("key")),
460+
"value"
461+
);
462+
let case_sensitive = ok!(kwargs.get::<Option<bool>>("case_sensitive"))
463+
.unwrap_or(case_sensitive.unwrap_or(false));
454464
let mut rv: Vec<_> = ok!(v.try_iter())
455465
.map(|key| (key.clone(), v.get_item(&key).unwrap_or(Value::UNDEFINED)))
456466
.collect();
457467
rv.sort_by(|a, b| {
458468
let (a, b) = if by_value { (&a.1, &b.1) } else { (&a.0, &b.0) };
459469
cmp_helper(a, b, case_sensitive)
460470
});
461-
if let Some(true) = ok!(kwargs.get("reverse")) {
471+
if ok!(kwargs.get::<Option<bool>>("reverse")).unwrap_or(reverse.unwrap_or(false)) {
462472
rv.reverse();
463473
}
464474
kwargs.assert_all_used()?;

crates/dbt-jinja/minijinja/tests/inputs/loop_dictsort.txt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,12 @@ reverse:
2626
case_sensitive:
2727
{%- for key, value in map|dictsort(case_sensitive=true) %}
2828
* {{ key }}: {{ value }}
29-
{%- endfor %}
29+
{%- endfor %}
30+
case_sensitive_positional:
31+
{%- for key, value in map|dictsort(true) %}
32+
* {{ key }}: {{ value }}
33+
{%- endfor %}
34+
case_sensitive_by_value_positional:
35+
{%- for key, value in map|dictsort(true, 'value') %}
36+
* {{ key }}: {{ value }}
37+
{%- endfor %}

crates/dbt-jinja/minijinja/tests/snapshots/test_templates__vm@loop_dictsort.txt.snap

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
source: minijinja/tests/test_templates.rs
3-
description: "key implied:\n{%- for key, value in map|dictsort %}\n* {{ key }}: {{ value }}\n{%- endfor %}\nkey explicit:\n{%- for key, value in map|dictsort(by=\"key\") %}\n* {{ key }}: {{ value }}\n{%- endfor %}\nvalue:\n{%- for key, value in map|dictsort(by=\"value\") %}\n* {{ key }}: {{ value }}\n{%- endfor %}\nreverse:\n{%- for key, value in map|dictsort(reverse=true) %}\n* {{ key }}: {{ value }}\n{%- endfor %}\ncase_sensitive:\n{%- for key, value in map|dictsort(case_sensitive=true) %}\n* {{ key }}: {{ value }}\n{%- endfor %}"
3+
description: "key implied:\n{%- for key, value in map|dictsort %}\n* {{ key }}: {{ value }}\n{%- endfor %}\nkey explicit:\n{%- for key, value in map|dictsort(by=\"key\") %}\n* {{ key }}: {{ value }}\n{%- endfor %}\nvalue:\n{%- for key, value in map|dictsort(by=\"value\") %}\n* {{ key }}: {{ value }}\n{%- endfor %}\nreverse:\n{%- for key, value in map|dictsort(reverse=true) %}\n* {{ key }}: {{ value }}\n{%- endfor %}\ncase_sensitive:\n{%- for key, value in map|dictsort(case_sensitive=true) %}\n* {{ key }}: {{ value }}\n{%- endfor %}\ncase_sensitive_positional:\n{%- for key, value in map|dictsort(true) %}\n* {{ key }}: {{ value }}\n{%- endfor %}\ncase_sensitive_by_value_positional:\n{%- for key, value in map|dictsort(true, 'value') %}\n* {{ key }}: {{ value }}\n{%- endfor %}"
44
info:
55
map:
66
Blafasel: aha
@@ -34,4 +34,13 @@ case_sensitive:
3434
* bar: 2
3535
* baz: 100
3636
* foo: 1
37-
37+
case_sensitive_positional:
38+
* Blafasel: aha
39+
* bar: 2
40+
* baz: 100
41+
* foo: 1
42+
case_sensitive_by_value_positional:
43+
* foo: 1
44+
* bar: 2
45+
* baz: 100
46+
* Blafasel: aha

0 commit comments

Comments
 (0)