Skip to content

Commit c78c653

Browse files
chore/tidy server codegen (#119)
Why === Preparing to upgrade server to protocol v2 What changed ============ - Generalizing some common functionalities between client and server codegen - Switching from accumulating individual lines and trying to carefully juggle indent levels to `reindent(f"""\ ....` Test plan ========= _Describe what you did to test this change to a level of detail that allows your reviewer to test it_
1 parent f8580f0 commit c78c653

File tree

4 files changed

+289
-189
lines changed

4 files changed

+289
-189
lines changed

replit_river/codegen/client.py

Lines changed: 17 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import json
22
import re
3-
from dataclasses import dataclass
43
from pathlib import Path
5-
from textwrap import dedent, indent
4+
from textwrap import dedent
65
from typing import (
76
Any,
87
Dict,
98
List,
109
Literal,
11-
NewType,
1210
Optional,
1311
OrderedDict,
1412
Sequence,
@@ -21,92 +19,24 @@
2119
import black
2220
from pydantic import BaseModel, Field, RootModel
2321

24-
TypeName = NewType("TypeName", str)
25-
ModuleName = NewType("ModuleName", str)
26-
ClassName = NewType("ClassName", str)
27-
FileContents = NewType("FileContents", str)
28-
HandshakeType = NewType("HandshakeType", str)
29-
30-
RenderedPath = NewType("RenderedPath", str)
31-
32-
33-
@dataclass
34-
class DictTypeExpr:
35-
nested: "TypeExpression"
36-
37-
38-
@dataclass
39-
class ListTypeExpr:
40-
nested: "TypeExpression"
41-
42-
43-
@dataclass
44-
class LiteralTypeExpr:
45-
nested: int | str
46-
47-
48-
@dataclass
49-
class UnionTypeExpr:
50-
nested: list["TypeExpression"]
51-
52-
53-
TypeExpression = (
54-
TypeName | DictTypeExpr | ListTypeExpr | LiteralTypeExpr | UnionTypeExpr
22+
from replit_river.codegen.format import reindent
23+
from replit_river.codegen.typing import (
24+
ClassName,
25+
DictTypeExpr,
26+
FileContents,
27+
HandshakeType,
28+
ListTypeExpr,
29+
LiteralTypeExpr,
30+
ModuleName,
31+
RenderedPath,
32+
TypeExpression,
33+
TypeName,
34+
UnionTypeExpr,
35+
ensure_literal_type,
36+
extract_inner_type,
37+
render_type_expr,
5538
)
5639

57-
58-
def render_type_expr(value: TypeExpression) -> str:
59-
match value:
60-
case DictTypeExpr(nested):
61-
return f"dict[str, {render_type_expr(nested)}]"
62-
case ListTypeExpr(nested):
63-
return f"list[{render_type_expr(nested)}]"
64-
case LiteralTypeExpr(inner):
65-
return f"Literal[{repr(inner)}]"
66-
case UnionTypeExpr(inner):
67-
return " | ".join(render_type_expr(x) for x in inner)
68-
case other:
69-
return other
70-
71-
72-
def extract_inner_type(value: TypeExpression) -> TypeName:
73-
match value:
74-
case DictTypeExpr(nested):
75-
return extract_inner_type(nested)
76-
case ListTypeExpr(nested):
77-
return extract_inner_type(nested)
78-
case LiteralTypeExpr(_):
79-
raise ValueError(f"Unexpected literal type: {value}")
80-
case UnionTypeExpr(_):
81-
raise ValueError(
82-
f"Attempting to extract from a union, currently not possible: {value}"
83-
)
84-
case other:
85-
return other
86-
87-
88-
def ensure_literal_type(value: TypeExpression) -> TypeName:
89-
match value:
90-
case DictTypeExpr(_):
91-
raise ValueError(
92-
f"Unexpected expression when expecting a type name: {value}"
93-
)
94-
case ListTypeExpr(_):
95-
raise ValueError(
96-
f"Unexpected expression when expecting a type name: {value}"
97-
)
98-
case LiteralTypeExpr(_):
99-
raise ValueError(
100-
f"Unexpected expression when expecting a type name: {value}"
101-
)
102-
case UnionTypeExpr(_):
103-
raise ValueError(
104-
f"Unexpected expression when expecting a type name: {value}"
105-
)
106-
case other:
107-
return other
108-
109-
11040
_NON_ALNUM_RE = re.compile(r"[^a-zA-Z0-9_]+")
11141

11242
# Literal is here because HandshakeType can be Literal[None]
@@ -214,14 +144,6 @@ class RiverSchema(BaseModel):
214144
RiverSchemaFile = RootModel[RiverSchema]
215145

216146

217-
def reindent(prefix: str, code: str) -> str:
218-
"""
219-
Take an arbitrarily indented code block, dedent to the lowest common
220-
indent level and then reindent based on the supplied prefix
221-
"""
222-
return indent(dedent(code.rstrip()), prefix)
223-
224-
225147
def is_literal(tpe: RiverType) -> bool:
226148
if isinstance(tpe, RiverUnionType):
227149
return all(is_literal(t) for t in tpe.anyOf)

replit_river/codegen/format.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from textwrap import dedent, indent
2+
3+
4+
def reindent(prefix: str, code: str) -> str:
5+
"""
6+
Take an arbitrarily indented code block, dedent to the lowest common
7+
indent level and then reindent based on the supplied prefix
8+
"""
9+
return indent(dedent(code.rstrip()), prefix)

0 commit comments

Comments
 (0)