Skip to content

Commit 7bc5fa3

Browse files
Merging from main
1 parent aa87f55 commit 7bc5fa3

4 files changed

Lines changed: 47 additions & 25 deletions

File tree

CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,28 @@
11
# Changelog
22

3+
## 3.0.0
4+
5+
### Breaking Changes
6+
7+
- **Added `runtime: datacustomcode.runtime.function.Runtime` to function contract for codeType `function`.
8+
9+
Function now mandates runtime as arguments.
10+
11+
**Why:** `runTime` allows access to resources ( llm_gateway / file ) available during function execution.
12+
13+
**Migration:** use function(request: dict, runTime: Runtime) instead od function(request: dict)
14+
15+
```python
16+
# Before
17+
def function(request: dict):
18+
pass
19+
20+
# After
21+
def function(request: dict, runTime: Runtime):
22+
pass
23+
```
24+
25+
326
## 2.0.0
427

528
### Breaking Changes

src/datacustomcode/io/reader/query_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ def read_dlo(
197197
self, "_sf_cli_reader", None
198198
)
199199
if sf_cli_reader is not None:
200-
return sf_cli_reader.read_dlo(name, schema) # type: ignore[no-any-return]
200+
return sf_cli_reader.read_dlo(name, schema) # type: ignore[no-any-return]
201201

202202
query = self._build_query(name)
203203

@@ -230,7 +230,7 @@ def read_dmo(
230230
self, "_sf_cli_reader", None
231231
)
232232
if sf_cli_reader is not None:
233-
return sf_cli_reader.read_dmo(name, schema) # type: ignore[no-any-return]
233+
return sf_cli_reader.read_dmo(name, schema) # type: ignore[no-any-return]
234234

235235
query = self._build_query(name)
236236

tests/test_llm_gateway.py

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
from __future__ import annotations
22

3-
import pytest
43
from pydantic import ValidationError
4+
import pytest
55

66
from datacustomcode.llm_gateway.base import LLMGateway
77
from datacustomcode.llm_gateway.default import DefaultLLMGateway
88
from datacustomcode.llm_gateway.types.generate_text_request import GenerateTextRequest
9-
from datacustomcode.llm_gateway.types.generate_text_request_builder import GenerateTextRequestBuilder
9+
from datacustomcode.llm_gateway.types.generate_text_request_builder import (
10+
GenerateTextRequestBuilder,
11+
)
1012
from datacustomcode.llm_gateway.types.generate_text_response import GenerateTextResponse
11-
from datacustomcode.llm_gateway.types.generate_text_response_builder import GenerateTextResponseBuilder
13+
from datacustomcode.llm_gateway.types.generate_text_response_builder import (
14+
GenerateTextResponseBuilder,
15+
)
1216

1317

1418
class TestGenerateTextRequest:
@@ -86,19 +90,16 @@ def test_builder_with_locale_string(self):
8690
# Verify the localization structure
8791
assert request.localization is not None
8892
assert request.localization["defaultLocale"] == "en-US"
89-
assert request.localization["inputLocales"] == [{"locale": "en-US", "probability": 1.0}]
93+
assert request.localization["inputLocales"] == [
94+
{"locale": "en-US", "probability": 1.0}
95+
]
9096
assert request.localization["expectedLocales"] == ["en-US"]
9197

9298
def test_builder_with_tags(self):
9399
"""Test builder with tags."""
94100
builder = GenerateTextRequestBuilder()
95101
tags = {"user": "test", "session": "123"}
96-
request = (
97-
builder.set_prompt("Hello")
98-
.set_model("gpt-4")
99-
.set_tags(tags)
100-
.build()
101-
)
102+
request = builder.set_prompt("Hello").set_model("gpt-4").set_tags(tags).build()
102103
assert request.tags == tags
103104

104105
def test_builder_validates_on_build(self):
@@ -139,8 +140,7 @@ def test_is_success_false_for_non_200(self):
139140
def test_text_property_success(self):
140141
"""Test text property extracts generated text on success."""
141142
response = GenerateTextResponse(
142-
status_code=200,
143-
data={"generation": {"generatedText": "Hello world"}}
143+
status_code=200, data={"generation": {"generatedText": "Hello world"}}
144144
)
145145
assert response.text == "Hello world"
146146

@@ -162,15 +162,14 @@ def test_text_property_handles_missing_nested_fields(self):
162162
def test_error_code_property(self):
163163
"""Test error_code property extracts error code on error."""
164164
response = GenerateTextResponse(
165-
status_code=400,
166-
data={"errorCode": "INVALID_REQUEST"}
165+
status_code=400, data={"errorCode": "INVALID_REQUEST"}
167166
)
168167
assert response.error_code == "INVALID_REQUEST"
169168

170169
def test_error_code_falls_back_to_status_code(self):
171170
"""Test error_code falls back to status_code if no errorCode in data."""
172171
response = GenerateTextResponse(status_code=500, data={"message": "error"})
173-
assert response.error_code == '500'
172+
assert response.error_code == "500"
174173

175174
def test_error_code_returns_empty_on_success(self):
176175
"""Test error_code returns empty string on success."""
@@ -192,7 +191,7 @@ def test_builder_build_from_dict(self):
192191
response_dict = {
193192
"version": "v1",
194193
"status_code": 200,
195-
"data": {"generation": {"generatedText": "Hello world"}}
194+
"data": {"generation": {"generatedText": "Hello world"}},
196195
}
197196
response = GenerateTextResponseBuilder.build(response_dict)
198197
assert isinstance(response, GenerateTextResponse)
@@ -235,4 +234,4 @@ def test_generate_text_success_response(self):
235234
response = gateway.generate_text(request)
236235
assert response.is_success is True
237236
assert response.status_code == 200
238-
assert len(response.text) > 0
237+
assert len(response.text) > 0

tests/test_runtime.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from __future__ import annotations
22

33
import threading
4+
45
import pytest
56

6-
from datacustomcode.runtime.base import BaseRuntime
7-
from datacustomcode.runtime.function import Runtime
8-
from datacustomcode.llm_gateway.default import DefaultLLMGateway
97
from datacustomcode.file.path.default import DefaultFindFilePath
8+
from datacustomcode.llm_gateway.default import DefaultLLMGateway
9+
from datacustomcode.runtime.function import Runtime
1010

1111

1212
class TestRuntimeSingleton:
@@ -70,12 +70,12 @@ def setup_method(self):
7070

7171
def test_runtime_has_llm_gateway(self):
7272
"""Test Runtime has llm_gateway property."""
73-
assert hasattr(self.runtime, 'llm_gateway')
73+
assert hasattr(self.runtime, "llm_gateway")
7474
assert isinstance(self.runtime.llm_gateway, DefaultLLMGateway)
7575

7676
def test_runtime_has_file(self):
7777
"""Test Runtime has file property."""
78-
assert hasattr(self.runtime, 'file')
78+
assert hasattr(self.runtime, "file")
7979
assert isinstance(self.runtime.file, DefaultFindFilePath)
8080

8181
def test_runtime_initializes_only_once(self):
@@ -88,4 +88,4 @@ def test_runtime_initializes_only_once(self):
8888

8989
# Should still be the same instances
9090
llm_gateway_after = self.runtime.llm_gateway
91-
assert llm_gateway_before is llm_gateway_after
91+
assert llm_gateway_before is llm_gateway_after

0 commit comments

Comments
 (0)