Skip to content

Commit 86a9e4e

Browse files
committed
fail for unknown yaml fields
1 parent 0a9dcb7 commit 86a9e4e

File tree

17 files changed

+108
-20
lines changed

17 files changed

+108
-20
lines changed

internal/config.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package python
22

3+
import (
4+
"bytes"
5+
json "encoding/json"
6+
"fmt"
7+
"strings"
8+
)
9+
310
type OverrideColumn struct {
411
Column string `json:"column"`
512
DbType string `json:"db_type"`
@@ -20,3 +27,19 @@ type Config struct {
2027
InflectionExcludeTableNames []string `json:"inflection_exclude_table_names"`
2128
Overrides []OverrideColumn `json:"overrides"`
2229
}
30+
31+
func parseConfig(raw []byte) (Config, error) {
32+
var conf Config
33+
if len(raw) == 0 {
34+
return conf, nil
35+
}
36+
37+
dec := json.NewDecoder(bytes.NewReader(raw))
38+
dec.DisallowUnknownFields()
39+
if err := dec.Decode(&conf); err != nil {
40+
msg := strings.TrimPrefix(err.Error(), "json: ")
41+
return Config{}, fmt.Errorf("invalid plugin options: %s", msg)
42+
}
43+
44+
return conf, nil
45+
}

internal/config_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package python
2+
3+
import (
4+
"strings"
5+
"testing"
6+
)
7+
8+
func TestParseConfigDisallowUnknownFields(t *testing.T) {
9+
_, err := parseConfig([]byte(`{"emit_sync_querier":true,"db_typ":"jsonb"}`))
10+
if err == nil {
11+
t.Fatal("expected unknown field error, got nil")
12+
}
13+
if !strings.Contains(err.Error(), "invalid plugin options") {
14+
t.Fatalf("expected error to reference plugin options, got: %v", err)
15+
}
16+
if !strings.Contains(err.Error(), `unknown field "db_typ"`) {
17+
t.Fatalf("expected unknown field in error, got: %v", err)
18+
}
19+
}
20+
21+
func TestParseConfigValid(t *testing.T) {
22+
conf, err := parseConfig([]byte(`{"emit_sync_querier":true,"overrides":[{"db_type":"jsonb","py_type":"str"}]}`))
23+
if err != nil {
24+
t.Fatalf("unexpected error: %v", err)
25+
}
26+
if !conf.EmitSyncQuerier {
27+
t.Fatal("expected emit_sync_querier to be true")
28+
}
29+
if len(conf.Overrides) != 1 || conf.Overrides[0].DbType != "jsonb" || conf.Overrides[0].PyType != "str" {
30+
t.Fatal("unexpected parsed overrides")
31+
}
32+
}

internal/endtoend/testdata/dataclasses_with_reserved_keywords/sqlc.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins:
33
- name: py
44
wasm:
55
url: file://../../../../bin/sqlc-gen-python.wasm
6-
sha256: "77e9665cec6efe4e1871218c27a09143eb0f23fb509855c881757022383813e0"
6+
sha256: "a5d1ad0ead1ecadb0608684d7c7a04327762299b769e6cca9c8f838c5df89788"
77
sql:
88
- schema: schema.sql
99
queries: query.sql

internal/endtoend/testdata/emit_pydantic_models/sqlc.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins:
33
- name: py
44
wasm:
55
url: file://../../../../bin/sqlc-gen-python.wasm
6-
sha256: "77e9665cec6efe4e1871218c27a09143eb0f23fb509855c881757022383813e0"
6+
sha256: "a5d1ad0ead1ecadb0608684d7c7a04327762299b769e6cca9c8f838c5df89788"
77
sql:
88
- schema: schema.sql
99
queries: query.sql

internal/endtoend/testdata/emit_pydantic_models_with_reserved_keywords/sqlc.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins:
33
- name: py
44
wasm:
55
url: file://../../../../bin/sqlc-gen-python.wasm
6-
sha256: "77e9665cec6efe4e1871218c27a09143eb0f23fb509855c881757022383813e0"
6+
sha256: "a5d1ad0ead1ecadb0608684d7c7a04327762299b769e6cca9c8f838c5df89788"
77
sql:
88
- schema: schema.sql
99
queries: query.sql

internal/endtoend/testdata/emit_str_enum/sqlc.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins:
33
- name: py
44
wasm:
55
url: file://../../../../bin/sqlc-gen-python.wasm
6-
sha256: "77e9665cec6efe4e1871218c27a09143eb0f23fb509855c881757022383813e0"
6+
sha256: "a5d1ad0ead1ecadb0608684d7c7a04327762299b769e6cca9c8f838c5df89788"
77
sql:
88
- schema: schema.sql
99
queries: query.sql

internal/endtoend/testdata/emit_type_overrides/db/query.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@
3737
"""
3838

3939

40+
SEARCH_BOOKS = """-- name: search_books \\:many
41+
SELECT id, title, status, payload, metadata FROM books
42+
WHERE payload @> COALESCE(:p1\\:\\:jsonb, '{}'\\:\\:jsonb)
43+
ORDER BY title
44+
"""
45+
46+
4047
class Querier:
4148
def __init__(self, conn: sqlalchemy.engine.Connection):
4249
self._conn = conn
@@ -84,6 +91,17 @@ def list_books(self) -> Iterator[models.Book]:
8491
metadata=row[4],
8592
)
8693

94+
def search_books(self, *, payload_filter: Optional[my_lib.models.JsonValue]) -> Iterator[models.Book]:
95+
result = self._conn.execute(sqlalchemy.text(SEARCH_BOOKS), {"p1": payload_filter})
96+
for row in result:
97+
yield models.Book(
98+
id=row[0],
99+
title=row[1],
100+
status=row[2],
101+
payload=row[3],
102+
metadata=row[4],
103+
)
104+
87105

88106
class AsyncQuerier:
89107
def __init__(self, conn: sqlalchemy.ext.asyncio.AsyncConnection):
@@ -131,3 +149,14 @@ async def list_books(self) -> AsyncIterator[models.Book]:
131149
payload=row[3],
132150
metadata=row[4],
133151
)
152+
153+
async def search_books(self, *, payload_filter: Optional[my_lib.models.JsonValue]) -> AsyncIterator[models.Book]:
154+
result = await self._conn.stream(sqlalchemy.text(SEARCH_BOOKS), {"p1": payload_filter})
155+
async for row in result:
156+
yield models.Book(
157+
id=row[0],
158+
title=row[1],
159+
status=row[2],
160+
payload=row[3],
161+
metadata=row[4],
162+
)

internal/endtoend/testdata/emit_type_overrides/query.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,8 @@ INSERT INTO books (
1616
-- name: DeleteBook :exec
1717
DELETE FROM books
1818
WHERE id = $1;
19+
20+
-- name: SearchBooks :many
21+
SELECT * FROM books
22+
WHERE payload @> COALESCE(sqlc.narg('payload_filter')::jsonb, '{}'::jsonb)
23+
ORDER BY title;

internal/endtoend/testdata/emit_type_overrides/sqlc.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins:
33
- name: py
44
wasm:
55
url: file://../../../../bin/sqlc-gen-python.wasm
6-
sha256: "77e9665cec6efe4e1871218c27a09143eb0f23fb509855c881757022383813e0"
6+
sha256: "a5d1ad0ead1ecadb0608684d7c7a04327762299b769e6cca9c8f838c5df89788"
77
sql:
88
- schema: schema.sql
99
queries: query.sql

internal/endtoend/testdata/exec_result/sqlc.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins:
33
- name: py
44
wasm:
55
url: file://../../../../bin/sqlc-gen-python.wasm
6-
sha256: "77e9665cec6efe4e1871218c27a09143eb0f23fb509855c881757022383813e0"
6+
sha256: "a5d1ad0ead1ecadb0608684d7c7a04327762299b769e6cca9c8f838c5df89788"
77
sql:
88
- schema: schema.sql
99
queries: query.sql

0 commit comments

Comments
 (0)