Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
5f94098
fix(pine-go): expose Redis cascade-safety timeouts on redis_connectio…
Liam0205 Jun 23, 2026
42861ba
fix(pine-java): expose Redis cascade-safety timeouts on redis_connect…
Liam0205 Jun 23, 2026
931f8df
fix(pine-cpp): expose Redis cascade-safety timeouts on redis_connecti…
Liam0205 Jun 23, 2026
265bfa9
chore(codegen): regenerate apple_generated/resources.py for Redis tim…
Liam0205 Jun 23, 2026
b2bca14
fix(pine-java): align codegen doc rendering with pine-go (Type case +…
Liam0205 Jun 23, 2026
77b6e18
chore: bump version 0.10.9 → 0.10.10
Liam0205 Jun 23, 2026
2c60f01
fix(pine-cpp): contain Redis Client connect/AUTH failures within conn…
Liam0205 Jun 23, 2026
c7cdee7
fix(redis): pin Java write_timeout policy + surface engine-specific n…
Liam0205 Jun 23, 2026
75ce3c0
refactor(codegen): unify required-first param ordering + close Java/G…
Liam0205 Jun 23, 2026
fa2459f
test(cross-validate): pin Go-Java markdown byte-equal as a 01-codegen…
Liam0205 Jun 23, 2026
6c6478b
feat(pine-cpp): add markdown doc emit; close cross-engine doc parity
Liam0205 Jun 23, 2026
4a3bf3e
feat(redis): per-command observability metrics (latency + outcome)
Liam0205 Jun 23, 2026
10db040
chore(redis): close two minor findings from increment-2 review
Liam0205 Jun 23, 2026
372bdfa
docs(llmdoc): record redis cascade-safety + per-command observability…
Liam0205 Jun 23, 2026
9e7ec28
fix(pine-go): drop redundant metricRecorder selector in test recordin…
Liam0205 Jun 23, 2026
4c34e8d
fix(pine-go): drop context.Canceled from timeout bucket; lands in error
Liam0205 Jun 23, 2026
8a98ad2
chore(pine-java): align write_timeout_ms schema description with Go r…
Liam0205 Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apple/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.10.9"
__version__ = "0.10.10"
46 changes: 23 additions & 23 deletions apple_generated/operators.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,17 +413,17 @@ class TransformByLuaOp(BaseOp):
"""Operator: transform_by_lua"""
_name = "transform_by_lua"
_params_schema = {
"lua_script": {"type": "string", "required": True},
"function_for_common": {"type": "string", "required": False, "default": ""},
"function_for_item": {"type": "string", "required": False, "default": ""},
"lua_script": {"type": "string", "required": True},
}

def __call__(
self,
*,
lua_script: str = ...,
function_for_common: str = "",
function_for_item: str = "",
lua_script: str = ...,
common_input: list[str] | None = None,
common_output: list[str] | None = None,
item_input: list[str] | None = None,
Expand All @@ -435,9 +435,9 @@ def __call__(
name: str | None = None,
) -> "TransformByLuaOp":
_params = {
"lua_script": lua_script,
"function_for_common": function_for_common,
"function_for_item": function_for_item,
"lua_script": lua_script,
}
return self._apply(
params=_params,
Expand All @@ -456,32 +456,32 @@ class TransformByRemotePineappleOp(BaseOp):
"""Operator: transform_by_remote_pineapple"""
_name = "transform_by_remote_pineapple"
_params_schema = {
"host": {"type": "string", "required": True},
"port": {"type": "int64", "required": True},
"allow_private": {"type": "bool", "required": False, "default": False},
"common_request": {"type": "any", "required": False},
"common_response": {"type": "any", "required": False},
"endpoint": {"type": "string", "required": False, "default": "/execute"},
"fail_on_error": {"type": "bool", "required": False, "default": True},
"host": {"type": "string", "required": True},
"item_request": {"type": "any", "required": False},
"item_response": {"type": "any", "required": False},
"max_response_size": {"type": "int64", "required": False, "default": 10485760},
"port": {"type": "int64", "required": True},
"timeout": {"type": "float64", "required": False, "default": 5},
}

def __call__(
self,
*,
host: str = ...,
port: int = ...,
allow_private: bool = False,
common_request: Any = None,
common_response: Any = None,
endpoint: str = "/execute",
fail_on_error: bool = True,
host: str = ...,
item_request: Any = None,
item_response: Any = None,
max_response_size: int = 10485760,
port: int = ...,
timeout: float = 5,
common_input: list[str] | None = None,
common_output: list[str] | None = None,
Expand All @@ -494,12 +494,12 @@ def __call__(
name: str | None = None,
) -> "TransformByRemotePineappleOp":
_params = {
"host": host,
"port": port,
"allow_private": allow_private,
"endpoint": endpoint,
"fail_on_error": fail_on_error,
"host": host,
"max_response_size": max_response_size,
"port": port,
"timeout": timeout,
}
if common_request is not None:
Expand Down Expand Up @@ -635,19 +635,19 @@ class TransformRedisGetOp(BaseOp):
"""Operator: transform_redis_get"""
_name = "transform_redis_get"
_params_schema = {
"data_type": {"type": "string", "required": False, "default": "string"},
"fail_on_error": {"type": "bool", "required": False, "default": False},
"key_prefix": {"type": "string", "required": True, "templatable": True},
"resource_name": {"type": "string", "required": True},
"data_type": {"type": "string", "required": False, "default": "string"},
"fail_on_error": {"type": "bool", "required": False, "default": False},
}

def __call__(
self,
*,
data_type: str = "string",
fail_on_error: bool = False,
key_prefix: str = ...,
resource_name: str = ...,
data_type: str = "string",
fail_on_error: bool = False,
common_input: list[str] | None = None,
common_output: list[str] | None = None,
item_input: list[str] | None = None,
Expand All @@ -659,10 +659,10 @@ def __call__(
name: str | None = None,
) -> "TransformRedisGetOp":
_params = {
"data_type": data_type,
"fail_on_error": fail_on_error,
"key_prefix": key_prefix,
"resource_name": resource_name,
"data_type": data_type,
"fail_on_error": fail_on_error,
}
return self._apply(
params=_params,
Expand All @@ -681,20 +681,20 @@ class TransformRedisSetOp(BaseOp):
"""Operator: transform_redis_set"""
_name = "transform_redis_set"
_params_schema = {
"data_type": {"type": "string", "required": False, "default": "string"},
"fail_on_error": {"type": "bool", "required": False, "default": False},
"key_prefix": {"type": "string", "required": True, "templatable": True},
"resource_name": {"type": "string", "required": True},
"data_type": {"type": "string", "required": False, "default": "string"},
"fail_on_error": {"type": "bool", "required": False, "default": False},
"ttl": {"type": "int", "required": False, "default": 0, "templatable": True},
}

def __call__(
self,
*,
data_type: str = "string",
fail_on_error: bool = False,
key_prefix: str = ...,
resource_name: str = ...,
data_type: str = "string",
fail_on_error: bool = False,
ttl: int = 0,
common_input: list[str] | None = None,
common_output: list[str] | None = None,
Expand All @@ -707,10 +707,10 @@ def __call__(
name: str | None = None,
) -> "TransformRedisSetOp":
_params = {
"data_type": data_type,
"fail_on_error": fail_on_error,
"key_prefix": key_prefix,
"resource_name": resource_name,
"data_type": data_type,
"fail_on_error": fail_on_error,
"ttl": ttl,
}
return self._apply(
Expand All @@ -730,19 +730,19 @@ class TransformResourceLookupOp(BaseOp):
"""Operator: transform_resource_lookup"""
_name = "transform_resource_lookup"
_params_schema = {
"default_value": {"type": "any", "required": False},
"lookup_key": {"type": "string", "required": True},
"output_field": {"type": "string", "required": True},
"resource_name": {"type": "string", "required": True},
"default_value": {"type": "any", "required": False},
}

def __call__(
self,
*,
default_value: Any = None,
lookup_key: str = ...,
output_field: str = ...,
resource_name: str = ...,
default_value: Any = None,
common_input: list[str] | None = None,
common_output: list[str] | None = None,
item_input: list[str] | None = None,
Expand Down
15 changes: 15 additions & 0 deletions apple_generated/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,38 @@ class RedisConnectionResource(BaseResource):
_params_schema = {
"addr": {"type": "string", "required": True},
"db": {"type": "int", "required": False, "default": 0},
"dial_timeout_ms": {"type": "int", "required": False, "default": 2000},
"metrics_name": {"type": "string", "required": False, "default": ""},
"password": {"type": "string", "required": False, "default": ""},
"pool_size": {"type": "int", "required": False, "default": 0},
"pool_timeout_ms": {"type": "int", "required": False, "default": 2000},
"read_timeout_ms": {"type": "int", "required": False, "default": 2000},
"write_timeout_ms": {"type": "int", "required": False, "default": 2000},
}

def __init__(
self,
*,
addr: str = ...,
db: int = 0,
dial_timeout_ms: int = 2000,
metrics_name: str = "",
password: str = "",
pool_size: int = 0,
pool_timeout_ms: int = 2000,
read_timeout_ms: int = 2000,
write_timeout_ms: int = 2000,
interval: int = -1,
):
super().__init__(
interval=interval,
addr=addr,
db=db,
dial_timeout_ms=dial_timeout_ms,
metrics_name=metrics_name,
password=password,
pool_size=pool_size,
pool_timeout_ms=pool_timeout_ms,
read_timeout_ms=read_timeout_ms,
write_timeout_ms=write_timeout_ms,
)
4 changes: 2 additions & 2 deletions doc/operators/transform_by_lua.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ Executes a Lua script for per-item or per-common computation.

| Name | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| lua_script | string | Yes | - | Lua source code defining the function to call. |
| function_for_common | string | No | `""` | Function name to call once for all items. |
| function_for_item | string | No | `""` | Function name to call per item. |
| lua_script | string | Yes | - | Lua source code defining the function to call. |

## Metadata Contract

Expand All @@ -25,9 +25,9 @@ Executes a Lua script for per-item or per-common computation.

```python
flow.transform_by_lua(
lua_script=...,
function_for_common=...,
function_for_item=...,
lua_script=...,
common_input=[...],
item_input=[...],
item_output=[...],
Expand Down
8 changes: 4 additions & 4 deletions doc/operators/transform_by_remote_pineapple.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@ Calls a downstream Pineapple service and maps response fields back to the local

| Name | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| host | string | Yes | - | Downstream service host. |
| port | int64 | Yes | - | Downstream service port. |
| allow_private | bool | No | `False` | Allow connections to private/loopback addresses (dev/internal use). |
| common_request | any | No | - | Downstream common field names, positionally mapped to common_input. |
| common_response | any | No | - | Downstream common response field names, positionally mapped to common_output. |
| endpoint | string | No | `"/execute"` | Downstream endpoint path. |
| fail_on_error | bool | No | `True` | true=fatal on downstream error; false=warning and skip. |
| host | string | Yes | - | Downstream service host. |
| item_request | any | No | - | Downstream item field names, positionally mapped to item_input. |
| item_response | any | No | - | Downstream item response field names, positionally mapped to item_output. |
| max_response_size | int64 | No | `10485760` | Maximum response body size in bytes (default 10 MB). |
| port | int64 | Yes | - | Downstream service port. |
| timeout | float64 | No | `5` | Request timeout in seconds. |

## Metadata Contract
Expand All @@ -33,16 +33,16 @@ Calls a downstream Pineapple service and maps response fields back to the local

```python
flow.transform_by_remote_pineapple(
host=...,
port=...,
allow_private=...,
common_request=...,
common_response=...,
endpoint=...,
fail_on_error=...,
host=...,
item_request=...,
item_response=...,
max_response_size=...,
port=...,
timeout=...,
common_input=[...],
item_input=[...],
Expand Down
8 changes: 4 additions & 4 deletions doc/operators/transform_redis_get.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ Generic Redis read operator. Reads a value by key and outputs the result and a c

| Name | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| data_type | string | No | `"string"` | Redis data type: "set", "string", or "list". |
| fail_on_error | bool | No | `False` | Return fatal error on Redis infrastructure failure instead of treating as cache miss. |
| key_prefix | string | Yes | - | Key prefix prepended to the suffix built from common_input fields. Supports {{field}} interpolation. |
| resource_name | string | Yes | - | Name of a redis_connection resource to borrow the client from. |
| data_type | string | No | `"string"` | Redis data type: "set", "string", or "list". |
| fail_on_error | bool | No | `False` | Return fatal error on Redis infrastructure failure instead of treating as cache miss. |

## Metadata Contract

Expand All @@ -26,10 +26,10 @@ Generic Redis read operator. Reads a value by key and outputs the result and a c

```python
flow.transform_redis_get(
data_type=...,
fail_on_error=...,
key_prefix=...,
resource_name=...,
data_type=...,
fail_on_error=...,
common_input=[...],
item_input=[...],
item_output=[...],
Expand Down
8 changes: 4 additions & 4 deletions doc/operators/transform_redis_set.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ Generic Redis write operator. Writes a value by key with optional TTL.

| Name | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| data_type | string | No | `"string"` | Redis data type: "set", "string", or "list". |
| fail_on_error | bool | No | `False` | Return fatal error on Redis infrastructure failure instead of logging and continuing. |
| key_prefix | string | Yes | - | Key prefix prepended to the suffix built from common_input fields. Supports {{field}} interpolation. |
| resource_name | string | Yes | - | Name of a redis_connection resource to borrow the client from. |
| data_type | string | No | `"string"` | Redis data type: "set", "string", or "list". |
| fail_on_error | bool | No | `False` | Return fatal error on Redis infrastructure failure instead of logging and continuing. |
| ttl | int | No | `0` | TTL in seconds. 0 means no expiry. Supports {{field}} interpolation. |

## Metadata Contract
Expand All @@ -27,10 +27,10 @@ Generic Redis write operator. Writes a value by key with optional TTL.

```python
flow.transform_redis_set(
data_type=...,
fail_on_error=...,
key_prefix=...,
resource_name=...,
data_type=...,
fail_on_error=...,
ttl=...,
common_input=[...],
item_input=[...],
Expand Down
4 changes: 2 additions & 2 deletions doc/operators/transform_resource_lookup.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ Enriches items by looking up values from a named resource.

| Name | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| default_value | any | No | - | Value to use when the key is not found. Missing keys are skipped if unset. |
| lookup_key | string | Yes | - | Item field whose value is used as the lookup key. |
| output_field | string | Yes | - | Item field to write the looked-up value to. |
| resource_name | string | Yes | - | Name of the resource to read. |
| default_value | any | No | - | Value to use when the key is not found. Missing keys are skipped if unset. |

## Metadata Contract

Expand All @@ -26,10 +26,10 @@ Enriches items by looking up values from a named resource.

```python
flow.transform_resource_lookup(
default_value=...,
lookup_key=...,
output_field=...,
resource_name=...,
default_value=...,
common_input=[...],
item_input=[...],
item_output=[...],
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/large_0100_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.9",
"_PINEAPPLE_VERSION": "0.10.10",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/large_0500_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.9",
"_PINEAPPLE_VERSION": "0.10.10",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/large_1000_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.9",
"_PINEAPPLE_VERSION": "0.10.10",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/large_5000_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.9",
"_PINEAPPLE_VERSION": "0.10.10",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/medium_0100_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.9",
"_PINEAPPLE_VERSION": "0.10.10",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
2 changes: 1 addition & 1 deletion fixtures/benchmarks/medium_0500_config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"_PINEAPPLE_VERSION": "0.10.9",
"_PINEAPPLE_VERSION": "0.10.10",
"pipeline_config": {
"operators": {
"recall_a": {
Expand Down
Loading