runwayml 2.2.0__tar.gz → 2.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- runwayml-2.2.2/.release-please-manifest.json +3 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/CHANGELOG.md +22 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/PKG-INFO +1 -1
- {runwayml-2.2.0 → runwayml-2.2.2}/pyproject.toml +1 -1
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_models.py +7 -1
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_utils/_sync.py +17 -2
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_utils/_transform.py +11 -1
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_version.py +1 -1
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_client.py +30 -16
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_transform.py +10 -1
- runwayml-2.2.0/.release-please-manifest.json +0 -3
- {runwayml-2.2.0 → runwayml-2.2.2}/.gitignore +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/CONTRIBUTING.md +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/LICENSE +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/README.md +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/SECURITY.md +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/api.md +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/bin/check-release-environment +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/bin/publish-pypi +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/examples/.keep +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/mypy.ini +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/noxfile.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/release-please-config.json +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/requirements-dev.lock +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/requirements.lock +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/__init__.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_base_client.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_client.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_compat.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_constants.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_exceptions.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_files.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_qs.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_resource.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_response.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_streaming.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_types.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_utils/__init__.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_utils/_logs.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_utils/_proxy.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_utils/_reflection.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_utils/_streams.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_utils/_typing.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/_utils/_utils.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/lib/.keep +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/py.typed +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/resources/__init__.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/resources/image_to_video.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/resources/tasks.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/types/__init__.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/types/image_to_video_create_params.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/types/image_to_video_create_response.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/src/runwayml/types/task_retrieve_response.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/__init__.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/api_resources/__init__.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/api_resources/test_image_to_video.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/api_resources/test_tasks.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/conftest.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/sample_file.txt +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_deepcopy.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_extract_files.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_files.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_models.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_qs.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_required_args.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_response.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_streaming.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_utils/test_proxy.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/test_utils/test_typing.py +0 -0
- {runwayml-2.2.0 → runwayml-2.2.2}/tests/utils.py +0 -0
@@ -1,5 +1,27 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 2.2.2 (2025-02-14)
|
4
|
+
|
5
|
+
Full Changelog: [v2.2.1...v2.2.2](https://github.com/runwayml/sdk-python/compare/v2.2.1...v2.2.2)
|
6
|
+
|
7
|
+
### Bug Fixes
|
8
|
+
|
9
|
+
* asyncify on non-asyncio runtimes ([#96](https://github.com/runwayml/sdk-python/issues/96)) ([c478bc7](https://github.com/runwayml/sdk-python/commit/c478bc7b5115c637a31cb7a0a60a35265500120a))
|
10
|
+
|
11
|
+
|
12
|
+
### Chores
|
13
|
+
|
14
|
+
* **internal:** update client tests ([#94](https://github.com/runwayml/sdk-python/issues/94)) ([d8892cd](https://github.com/runwayml/sdk-python/commit/d8892cd6e439347c04fb7ba1e97abb421803f379))
|
15
|
+
|
16
|
+
## 2.2.1 (2025-02-07)
|
17
|
+
|
18
|
+
Full Changelog: [v2.2.0...v2.2.1](https://github.com/runwayml/sdk-python/compare/v2.2.0...v2.2.1)
|
19
|
+
|
20
|
+
### Chores
|
21
|
+
|
22
|
+
* **internal:** fix type traversing dictionary params ([#90](https://github.com/runwayml/sdk-python/issues/90)) ([49d44b9](https://github.com/runwayml/sdk-python/commit/49d44b9b3f234f9aa5c69e3694f1774a8a0a4581))
|
23
|
+
* **internal:** minor type handling changes ([#92](https://github.com/runwayml/sdk-python/issues/92)) ([f4f122f](https://github.com/runwayml/sdk-python/commit/f4f122f97e7bd10d51250bdcca67f55cb8a76e4a))
|
24
|
+
|
3
25
|
## 2.2.0 (2025-02-06)
|
4
26
|
|
5
27
|
Full Changelog: [v2.1.11...v2.2.0](https://github.com/runwayml/sdk-python/compare/v2.1.11...v2.2.0)
|
@@ -426,10 +426,16 @@ def construct_type(*, value: object, type_: object) -> object:
|
|
426
426
|
|
427
427
|
If the given value does not match the expected type then it is returned as-is.
|
428
428
|
"""
|
429
|
+
|
430
|
+
# store a reference to the original type we were given before we extract any inner
|
431
|
+
# types so that we can properly resolve forward references in `TypeAliasType` annotations
|
432
|
+
original_type = None
|
433
|
+
|
429
434
|
# we allow `object` as the input type because otherwise, passing things like
|
430
435
|
# `Literal['value']` will be reported as a type error by type checkers
|
431
436
|
type_ = cast("type[object]", type_)
|
432
437
|
if is_type_alias_type(type_):
|
438
|
+
original_type = type_ # type: ignore[unreachable]
|
433
439
|
type_ = type_.__value__ # type: ignore[unreachable]
|
434
440
|
|
435
441
|
# unwrap `Annotated[T, ...]` -> `T`
|
@@ -446,7 +452,7 @@ def construct_type(*, value: object, type_: object) -> object:
|
|
446
452
|
|
447
453
|
if is_union(origin):
|
448
454
|
try:
|
449
|
-
return validate_type(type_=cast("type[object]", type_), value=value)
|
455
|
+
return validate_type(type_=cast("type[object]", original_type or type_), value=value)
|
450
456
|
except Exception:
|
451
457
|
pass
|
452
458
|
|
@@ -7,16 +7,20 @@ import contextvars
|
|
7
7
|
from typing import Any, TypeVar, Callable, Awaitable
|
8
8
|
from typing_extensions import ParamSpec
|
9
9
|
|
10
|
+
import anyio
|
11
|
+
import sniffio
|
12
|
+
import anyio.to_thread
|
13
|
+
|
10
14
|
T_Retval = TypeVar("T_Retval")
|
11
15
|
T_ParamSpec = ParamSpec("T_ParamSpec")
|
12
16
|
|
13
17
|
|
14
18
|
if sys.version_info >= (3, 9):
|
15
|
-
|
19
|
+
_asyncio_to_thread = asyncio.to_thread
|
16
20
|
else:
|
17
21
|
# backport of https://docs.python.org/3/library/asyncio-task.html#asyncio.to_thread
|
18
22
|
# for Python 3.8 support
|
19
|
-
async def
|
23
|
+
async def _asyncio_to_thread(
|
20
24
|
func: Callable[T_ParamSpec, T_Retval], /, *args: T_ParamSpec.args, **kwargs: T_ParamSpec.kwargs
|
21
25
|
) -> Any:
|
22
26
|
"""Asynchronously run function *func* in a separate thread.
|
@@ -34,6 +38,17 @@ else:
|
|
34
38
|
return await loop.run_in_executor(None, func_call)
|
35
39
|
|
36
40
|
|
41
|
+
async def to_thread(
|
42
|
+
func: Callable[T_ParamSpec, T_Retval], /, *args: T_ParamSpec.args, **kwargs: T_ParamSpec.kwargs
|
43
|
+
) -> T_Retval:
|
44
|
+
if sniffio.current_async_library() == "asyncio":
|
45
|
+
return await _asyncio_to_thread(func, *args, **kwargs)
|
46
|
+
|
47
|
+
return await anyio.to_thread.run_sync(
|
48
|
+
functools.partial(func, *args, **kwargs),
|
49
|
+
)
|
50
|
+
|
51
|
+
|
37
52
|
# inspired by `asyncer`, https://github.com/tiangolo/asyncer
|
38
53
|
def asyncify(function: Callable[T_ParamSpec, T_Retval]) -> Callable[T_ParamSpec, Awaitable[T_Retval]]:
|
39
54
|
"""
|
@@ -25,7 +25,7 @@ from ._typing import (
|
|
25
25
|
is_annotated_type,
|
26
26
|
strip_annotated_type,
|
27
27
|
)
|
28
|
-
from .._compat import model_dump, is_typeddict
|
28
|
+
from .._compat import get_origin, model_dump, is_typeddict
|
29
29
|
|
30
30
|
_T = TypeVar("_T")
|
31
31
|
|
@@ -164,9 +164,14 @@ def _transform_recursive(
|
|
164
164
|
inner_type = annotation
|
165
165
|
|
166
166
|
stripped_type = strip_annotated_type(inner_type)
|
167
|
+
origin = get_origin(stripped_type) or stripped_type
|
167
168
|
if is_typeddict(stripped_type) and is_mapping(data):
|
168
169
|
return _transform_typeddict(data, stripped_type)
|
169
170
|
|
171
|
+
if origin == dict and is_mapping(data):
|
172
|
+
items_type = get_args(stripped_type)[1]
|
173
|
+
return {key: _transform_recursive(value, annotation=items_type) for key, value in data.items()}
|
174
|
+
|
170
175
|
if (
|
171
176
|
# List[T]
|
172
177
|
(is_list_type(stripped_type) and is_list(data))
|
@@ -307,9 +312,14 @@ async def _async_transform_recursive(
|
|
307
312
|
inner_type = annotation
|
308
313
|
|
309
314
|
stripped_type = strip_annotated_type(inner_type)
|
315
|
+
origin = get_origin(stripped_type) or stripped_type
|
310
316
|
if is_typeddict(stripped_type) and is_mapping(data):
|
311
317
|
return await _async_transform_typeddict(data, stripped_type)
|
312
318
|
|
319
|
+
if origin == dict and is_mapping(data):
|
320
|
+
items_type = get_args(stripped_type)[1]
|
321
|
+
return {key: _transform_recursive(value, annotation=items_type) for key, value in data.items()}
|
322
|
+
|
313
323
|
if (
|
314
324
|
# List[T]
|
315
325
|
(is_list_type(stripped_type) and is_list(data))
|
@@ -23,6 +23,7 @@ from pydantic import ValidationError
|
|
23
23
|
|
24
24
|
from runwayml import RunwayML, AsyncRunwayML, APIResponseValidationError
|
25
25
|
from runwayml._types import Omit
|
26
|
+
from runwayml._utils import maybe_transform
|
26
27
|
from runwayml._models import BaseModel, FinalRequestOptions
|
27
28
|
from runwayml._constants import RAW_RESPONSE_HEADER
|
28
29
|
from runwayml._exceptions import RunwayMLError, APIStatusError, APITimeoutError, APIResponseValidationError
|
@@ -32,6 +33,7 @@ from runwayml._base_client import (
|
|
32
33
|
BaseClient,
|
33
34
|
make_request_options,
|
34
35
|
)
|
36
|
+
from runwayml.types.image_to_video_create_params import ImageToVideoCreateParams
|
35
37
|
|
36
38
|
from .utils import update_env
|
37
39
|
|
@@ -719,10 +721,13 @@ class TestRunwayML:
|
|
719
721
|
"/v1/image_to_video",
|
720
722
|
body=cast(
|
721
723
|
object,
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
724
|
+
maybe_transform(
|
725
|
+
dict(
|
726
|
+
model="gen3a_turbo",
|
727
|
+
prompt_image="https://example.com/assets/bunny.jpg",
|
728
|
+
prompt_text="The bunny is eating a carrot",
|
729
|
+
),
|
730
|
+
ImageToVideoCreateParams,
|
726
731
|
),
|
727
732
|
),
|
728
733
|
cast_to=httpx.Response,
|
@@ -741,10 +746,13 @@ class TestRunwayML:
|
|
741
746
|
"/v1/image_to_video",
|
742
747
|
body=cast(
|
743
748
|
object,
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
749
|
+
maybe_transform(
|
750
|
+
dict(
|
751
|
+
model="gen3a_turbo",
|
752
|
+
prompt_image="https://example.com/assets/bunny.jpg",
|
753
|
+
prompt_text="The bunny is eating a carrot",
|
754
|
+
),
|
755
|
+
ImageToVideoCreateParams,
|
748
756
|
),
|
749
757
|
),
|
750
758
|
cast_to=httpx.Response,
|
@@ -1515,10 +1523,13 @@ class TestAsyncRunwayML:
|
|
1515
1523
|
"/v1/image_to_video",
|
1516
1524
|
body=cast(
|
1517
1525
|
object,
|
1518
|
-
|
1519
|
-
|
1520
|
-
|
1521
|
-
|
1526
|
+
maybe_transform(
|
1527
|
+
dict(
|
1528
|
+
model="gen3a_turbo",
|
1529
|
+
prompt_image="https://example.com/assets/bunny.jpg",
|
1530
|
+
prompt_text="The bunny is eating a carrot",
|
1531
|
+
),
|
1532
|
+
ImageToVideoCreateParams,
|
1522
1533
|
),
|
1523
1534
|
),
|
1524
1535
|
cast_to=httpx.Response,
|
@@ -1537,10 +1548,13 @@ class TestAsyncRunwayML:
|
|
1537
1548
|
"/v1/image_to_video",
|
1538
1549
|
body=cast(
|
1539
1550
|
object,
|
1540
|
-
|
1541
|
-
|
1542
|
-
|
1543
|
-
|
1551
|
+
maybe_transform(
|
1552
|
+
dict(
|
1553
|
+
model="gen3a_turbo",
|
1554
|
+
prompt_image="https://example.com/assets/bunny.jpg",
|
1555
|
+
prompt_text="The bunny is eating a carrot",
|
1556
|
+
),
|
1557
|
+
ImageToVideoCreateParams,
|
1544
1558
|
),
|
1545
1559
|
),
|
1546
1560
|
cast_to=httpx.Response,
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
import io
|
4
4
|
import pathlib
|
5
|
-
from typing import Any, List, Union, TypeVar, Iterable, Optional, cast
|
5
|
+
from typing import Any, Dict, List, Union, TypeVar, Iterable, Optional, cast
|
6
6
|
from datetime import date, datetime
|
7
7
|
from typing_extensions import Required, Annotated, TypedDict
|
8
8
|
|
@@ -388,6 +388,15 @@ async def test_iterable_of_dictionaries(use_async: bool) -> None:
|
|
388
388
|
}
|
389
389
|
|
390
390
|
|
391
|
+
@parametrize
|
392
|
+
@pytest.mark.asyncio
|
393
|
+
async def test_dictionary_items(use_async: bool) -> None:
|
394
|
+
class DictItems(TypedDict):
|
395
|
+
foo_baz: Annotated[str, PropertyInfo(alias="fooBaz")]
|
396
|
+
|
397
|
+
assert await transform({"foo": {"foo_baz": "bar"}}, Dict[str, DictItems], use_async) == {"foo": {"fooBaz": "bar"}}
|
398
|
+
|
399
|
+
|
391
400
|
class TypedDictIterableUnionStr(TypedDict):
|
392
401
|
foo: Annotated[Union[str, Iterable[Baz8]], PropertyInfo(alias="FOO")]
|
393
402
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|