Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

[Feature]: expand expression evaluator filter set (upper, lower, length, split, sort, to_json)

オープン
#4,614 コメント 5 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
52/100
issue の種類
機能追加
明瞭さ
おおむね明確
活発さ
活発
技術スタック
python
領域
tooling

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

説明

feature-assess feature-needs-clarification triage-can-wait

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 existing from_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_FILTERS and 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
  • length enables conditionals: Unlocks {% if items | length > 0 %} patterns that currently require shell workarounds
  • split bridges shell output: Shell steps return newline/comma-separated strings; split converts them to lists for downstream processing
  • to_json completes the round-trip: from_json exists; to_json is 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

  1. Are there additional filters you would want in this batch, or should we start with a smaller set?
  2. Should length work on both lists and strings (Jinja2 behavior), or only collections?
  3. Any naming preferences (e.g., len vs length, flatten vs unique)?

Happy to implement if this aligns with your plans for the expression engine.

主要言語
Python
スター
138k
フォーク
12.4k
平均マージ
3日 6時間
マージ済み PR(30日)
145

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

github/spec-kit のほかの issue

github/spec-kit の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。