[Feature]: expand expression evaluator filter set (upper, lower, length, split, sort, to_json)
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 52/100
Direzione di ricerca
Start in src/specify_cli/workflows/expressions.py, reading the existing filter registration and _apply_filter() implementation around lines 20-26 and 419-484. Then inspect tests/test_workflows.py and the existing filter tests to understand input and error conventions. The work is done when the agreed filter set is registered, implemented, and covered by tests, including the unresolved length semantics and naming decisions.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Problem
The workflow expression evaluator currently supports only 5 filters: default, join, map, contains, and from_json. For a system marketed as "Jinja2-like," common string and collection operations are missing, forcing workflow authors to shell out for basic transformations.
Missing filters that workflow authors frequently need:
- String operations:
upper,lower,trim(whitespace),split(string to list) - Collection operations:
length,first,last,sort,unique - Serialization:
to_json(the reverse of existingfrom_json)
Example of current limitation:
# Cannot do this today — no `length` filter:
- id: check
type: shell
config:
command: "echo 'Found {{ items | length }} files'"
# Cannot do this today — no `split` filter:
- id: list
type: shell
config:
command: "echo '{{ file_list | split(\",\") | length }} files found'"
Proposed Solution
Add a batch of new filters to the expression evaluator, following the existing registration pattern.
String Filters
| Filter | Input | Output | Example |
|---|---|---|---|
upper |
"hello" |
"HELLO" |
{{ name | upper }} |
lower |
"HELLO" |
"hello" |
{{ name | lower }} |
trim |
" hi " |
"hi" |
{{ name | trim }} |
split |
"a,b,c" |
["a","b","c"] |
{{ csv | split(",") }} |
Collection Filters
| Filter | Input | Output | Example |
|---|---|---|---|
length |
["a","b"] |
2 |
{{ items | length }} |
first |
["a","b","c"] |
"a" |
{{ items | first }} |
last |
["a","b","c"] |
"c" |
{{ items | last }} |
sort |
[3,1,2] |
[1,2,3] |
{{ items | sort }} |
unique |
["a","a","b"] |
["a","b"] |
{{ items | unique }} |
Serialization Filter
| Filter | Input | Output | Example |
|---|---|---|---|
to_json |
{"key":"val"} |
"{\"key\":\"val\"}" |
{{ data | to_json }} |
Design Notes
- Follows existing pattern: Each filter is a standalone function registered in
_REGISTERED_FILTERSand dispatched in_apply_filter()(expressions.py lines 20-26, 419-484) - Safe by design: All operations are pure transformations — no arbitrary code execution, no side effects, consistent with the sandboxed evaluator model
lengthenables conditionals: Unlocks{% if items | length > 0 %}patterns that currently require shell workaroundssplitbridges shell output: Shell steps return newline/comma-separated strings;splitconverts them to lists for downstream processingto_jsoncompletes the round-trip:from_jsonexists;to_jsonis its natural pair for passing structured data back to shell commands
Affected Files
src/specify_cli/workflows/expressions.py— filter registration and implementation (lines 20-26, 419-484)tests/test_workflows.py— unit tests for each new filter
Questions
- Are there additional filters you would want in this batch, or should we start with a smaller set?
- Should
lengthwork on both lists and strings (Jinja2 behavior), or only collections? - Any naming preferences (e.g.,
lenvslength,flattenvsunique)?
Happy to implement if this aligns with your plans for the expression engine.
- Lingua principale
- Python
- Stelle
- 138k
- Fork
- 12.4k
- Merge medio
- 3g 4h
- PR unite (30g)
- 154
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di github/spec-kit
-
enhancement needs-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
-
enhancement needs-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
-
enhancement needs-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
-
enhancement needs-triage triage-can-wait
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
Tutte le issue di github/spec-kit
Issue simili
-
essnmx good first issue
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 95/100
-
[Feature] 奇物选择添加优先级 Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
syfoud/Simulated_Scepter#174 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
Giskard-AI/giskard-oss#2840 · 1 commento ·
-
A claim comment carrying the issue number is silently declined while the workflow reports success Apertaarea: repo bug perceived difficulty: 2
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
yeti-platform/yeti#1380 ·