Skip to content

Commit 5f60cd7

Browse files
committed
config: Parse V2 config format
1 parent 0f82783 commit 5f60cd7

File tree

8 files changed

+162
-47
lines changed

8 files changed

+162
-47
lines changed

examples/authors/sqlc.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"version": "2",
3+
"sql": [
4+
{
5+
"schema": "schema.sql",
6+
"queries": "query.sql",
7+
"engine": "postgresql",
8+
"gen": {
9+
"go": {
10+
"package": "authors",
11+
"out": "."
12+
}
13+
}
14+
}
15+
]
16+
}

examples/booktest/sqlc.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"name": "booktest",
6+
"path": "postgresql",
7+
"schema": "postgresql/schema.sql",
8+
"queries": "postgresql/query.sql",
9+
"engine": "postgresql"
10+
},
11+
{
12+
"name": "booktest",
13+
"path": "mysql",
14+
"schema": "mysql/schema.sql",
15+
"queries": "mysql/query.sql",
16+
"engine": "mysql"
17+
}
18+
]
19+
}

examples/jets/sqlc.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": ".",
6+
"name": "jets",
7+
"schema": "schema.sql",
8+
"queries": "query-building.sql",
9+
"engine": "postgresql"
10+
}
11+
]
12+
}

examples/ondeck/sqlc.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": ".",
6+
"name": "ondeck",
7+
"schema": "schema",
8+
"queries": "query",
9+
"engine": "postgresql",
10+
"emit_json_tags": true,
11+
"emit_prepared_queries": true,
12+
"emit_interface": true
13+
}
14+
]
15+
}

examples/sqlc.json

Lines changed: 0 additions & 40 deletions
This file was deleted.

internal/cmd/cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ var initCmd = &cobra.Command{
7474
if _, err := os.Stat("sqlc.json"); !os.IsNotExist(err) {
7575
return nil
7676
}
77-
blob, err := json.MarshalIndent(config.Config{Version: "2"}, "", " ")
77+
blob, err := json.MarshalIndent(config.Config{Version: "1"}, "", " ")
7878
if err != nil {
7979
return err
8080
}

internal/config/v_two.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package config
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io"
7+
"path/filepath"
8+
)
9+
10+
func v2ParseConfig(rd io.Reader) (Config, error) {
11+
dec := json.NewDecoder(rd)
12+
dec.DisallowUnknownFields()
13+
var conf Config
14+
if err := dec.Decode(&conf); err != nil {
15+
return conf, err
16+
}
17+
if conf.Version == "" {
18+
return conf, ErrMissingVersion
19+
}
20+
if conf.Version != "2" {
21+
return conf, ErrUnknownVersion
22+
}
23+
if len(conf.SQL) == 0 {
24+
return conf, ErrNoPackages
25+
}
26+
if err := conf.validateGlobalOverrides(); err != nil {
27+
return conf, err
28+
}
29+
if conf.Gen.Go != nil {
30+
for i := range conf.Gen.Go.Overrides {
31+
if err := conf.Gen.Go.Overrides[i].Parse(); err != nil {
32+
return conf, err
33+
}
34+
}
35+
}
36+
for j := range conf.SQL {
37+
if conf.SQL[j].Engine == "" {
38+
return conf, ErrMissingEngine
39+
}
40+
if conf.SQL[j].Gen.Go != nil {
41+
if conf.SQL[j].Gen.Go.Out == "" {
42+
return conf, ErrNoPackagePath
43+
}
44+
if conf.SQL[j].Gen.Go.Package == "" {
45+
conf.SQL[j].Gen.Go.Package = filepath.Base(conf.SQL[j].Gen.Go.Out)
46+
}
47+
for i := range conf.SQL[j].Gen.Go.Overrides {
48+
if err := conf.SQL[j].Gen.Go.Overrides[i].Parse(); err != nil {
49+
return conf, err
50+
}
51+
}
52+
}
53+
}
54+
return conf, nil
55+
}
56+
57+
func (c *Config) validateGlobalOverrides() error {
58+
engines := map[Engine]struct{}{}
59+
for _, pkg := range c.SQL {
60+
if _, ok := engines[pkg.Engine]; !ok {
61+
engines[pkg.Engine] = struct{}{}
62+
}
63+
}
64+
if c.Gen.Go == nil {
65+
return nil
66+
}
67+
usesMultipleEngines := len(engines) > 1
68+
for _, oride := range c.Gen.Go.Overrides {
69+
if usesMultipleEngines && oride.Engine == "" {
70+
return fmt.Errorf(`the "engine" field is required for global type overrides because your configuration uses multiple database engines`)
71+
}
72+
}
73+
return nil
74+
}

internal/endtoend/endtoend_test.go

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,32 @@ import (
1616

1717
func TestExamples(t *testing.T) {
1818
t.Parallel()
19+
examples, err := filepath.Abs(filepath.Join("..", "..", "examples"))
20+
if err != nil {
21+
t.Fatal(err)
22+
}
1923

20-
examples, _ := filepath.Abs(filepath.Join("..", "..", "examples"))
21-
var stderr bytes.Buffer
22-
23-
output, err := cmd.Generate(examples, &stderr)
24+
files, err := ioutil.ReadDir(examples)
2425
if err != nil {
25-
t.Fatalf("%s", stderr.String())
26+
t.Fatal(err)
2627
}
2728

28-
cmpDirectory(t, examples, output)
29+
for _, replay := range files {
30+
if !replay.IsDir() {
31+
continue
32+
}
33+
tc := replay.Name()
34+
t.Run(tc, func(t *testing.T) {
35+
t.Parallel()
36+
path := filepath.Join(examples, tc)
37+
var stderr bytes.Buffer
38+
output, err := cmd.Generate(path, &stderr)
39+
if err != nil {
40+
t.Fatalf("sqlc generate failed: %s", stderr.String())
41+
}
42+
cmpDirectory(t, path, output)
43+
})
44+
}
2945
}
3046

3147
func TestReplay(t *testing.T) {
@@ -37,6 +53,9 @@ func TestReplay(t *testing.T) {
3753
}
3854

3955
for _, replay := range files {
56+
if !replay.IsDir() {
57+
continue
58+
}
4059
tc := replay.Name()
4160
t.Run(tc, func(t *testing.T) {
4261
t.Parallel()

0 commit comments

Comments
 (0)