|
30 | 30 | ListTypeExpr, |
31 | 31 | LiteralTypeExpr, |
32 | 32 | ModuleName, |
| 33 | + OpenUnionTypeExpr, |
33 | 34 | RenderedPath, |
34 | 35 | TypeExpression, |
35 | 36 | TypeName, |
36 | 37 | UnionTypeExpr, |
37 | | - UnknownTypeExpr, |
38 | 38 | ensure_literal_type, |
39 | 39 | extract_inner_type, |
40 | 40 | render_type_expr, |
|
83 | 83 | Literal, |
84 | 84 | Optional, |
85 | 85 | Mapping, |
86 | | - NewType, |
87 | 86 | NotRequired, |
88 | 87 | Union, |
89 | 88 | Tuple, |
90 | 89 | TypedDict, |
91 | 90 | ) |
| 91 | +from typing_extensions import Annotated |
92 | 92 |
|
93 | | -from pydantic import BaseModel, Field, TypeAdapter |
| 93 | +from pydantic import BaseModel, Field, TypeAdapter, WrapValidator |
94 | 94 | from replit_river.error_schema import RiverError |
| 95 | +from replit_river.client import RiverUnknownValue, translate_unknown_value |
95 | 96 |
|
96 | 97 | import replit_river as river |
97 | 98 |
|
@@ -311,19 +312,12 @@ def flatten_union(tpe: RiverType) -> list[RiverType]: |
311 | 312 | else |
312 | 313 | """, |
313 | 314 | ) |
| 315 | + union: TypeExpression |
314 | 316 | if permit_unknown_members: |
315 | | - unknown_name = TypeName(f"{prefix}AnyOf__Unknown") |
316 | | - chunks.append( |
317 | | - FileContents( |
318 | | - f"{unknown_name} = NewType({repr(unknown_name)}, object)" |
319 | | - ) |
320 | | - ) |
321 | | - one_of.append(UnknownTypeExpr(unknown_name)) |
322 | | - chunks.append( |
323 | | - FileContents( |
324 | | - f"{prefix} = {render_type_expr(UnionTypeExpr(one_of))}" |
325 | | - ) |
326 | | - ) |
| 317 | + union = OpenUnionTypeExpr(UnionTypeExpr(one_of)) |
| 318 | + else: |
| 319 | + union = UnionTypeExpr(one_of) |
| 320 | + chunks.append(FileContents(f"{prefix} = {render_type_expr(union)}")) |
327 | 321 | chunks.append(FileContents("")) |
328 | 322 |
|
329 | 323 | if base_model == "TypedDict": |
@@ -386,16 +380,12 @@ def flatten_union(tpe: RiverType) -> list[RiverType]: |
386 | 380 | f"encode_{ensure_literal_type(other)}(x)" |
387 | 381 | ) |
388 | 382 | if permit_unknown_members: |
389 | | - unknown_name = TypeName(f"{prefix}AnyOf__Unknown") |
390 | | - chunks.append( |
391 | | - FileContents(f"{unknown_name} = NewType({repr(unknown_name)}, object)") |
392 | | - ) |
393 | | - any_of.append(UnknownTypeExpr(unknown_name)) |
| 383 | + union = OpenUnionTypeExpr(UnionTypeExpr(any_of)) |
| 384 | + else: |
| 385 | + union = UnionTypeExpr(any_of) |
394 | 386 | if is_literal(type): |
395 | 387 | typeddict_encoder = ["x"] |
396 | | - chunks.append( |
397 | | - FileContents(f"{prefix} = {render_type_expr(UnionTypeExpr(any_of))}") |
398 | | - ) |
| 388 | + chunks.append(FileContents(f"{prefix} = {render_type_expr(union)}")) |
399 | 389 | if base_model == "TypedDict": |
400 | 390 | encoder_name = TypeName(f"encode_{prefix}") |
401 | 391 | encoder_names.add(encoder_name) |
|
0 commit comments