[Feature]: expand expression evaluator filter set (upper, lower, length, split, sort, to_json)
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 52/100
Direção de pesquisa
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.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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.
- Linguagem predominante
- Python
- Estrelas
- 140k
- Forks
- 12.6k
- Merge médio
- 1d 5h
- PRs com merge (30d)
- 189
Preparar o ambiente
Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de github/spec-kit
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 75/100
Mantenedores costumam responder em até 1 dia
-
feature-assess feature-go triage-can-wait
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
github/spec-kit#4804 · 6 comentários ·
Mantenedores costumam responder em até 1 dia
-
[Bug]: specify init writes speckit.manifest.json without the speckit-converge skill it just installedTalvez livre de novo Um pull request para esta issue foi fechado sem ser mesclado. Abertabug-assess severity-medium
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
github/spec-kit#4273 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
-
[Bug]: /speckit-implement counts checkbox markers inside fenced code blocks — example checkboxes can falsely block implementationTalvez já em andamento @ntdatt812 assumiu há 33 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
Mantenedores costumam responder em até 1 dia
-
[Extension]: Jira Integration (Sync Engine) v0.5.0 (version update of jira-sync)Talvez já em andamento @github-actions assumiu há 57 dias. Abertaextension-submission validation-passed
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
github/spec-kit#4099 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
Todas as issues de github/spec-kit
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
Mantenedores costumam responder em até 1 dia
-
task
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
danparshall/claude_researcher#87 ·
Mantenedores costumam responder em até 1 dia
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
datajoint/datajoint-python#1586 ·
Mantenedores costumam responder em até 1 dia
-
1D intercept of length 1 is accepted as `fix_params` in population GLM with more than 1 unitTalvez já em andamento @dhvani7014 assumiu hoje. Abertabug good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
flatironinstitute/nemos#642 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Broken links in the docsAberta
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 78/100
uniswap-python/uniswap-python#487 ·