Skip to content

Commit 6940313

Browse files
authored
fix: Fix type name clashing & nullability issues (#39)
Blocked by: * invopop/jsonschema#109 * invopop/jsonschema#110
1 parent b537cc6 commit 6940313

File tree

6 files changed

+214
-5
lines changed

6 files changed

+214
-5
lines changed

go.mod

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,38 @@ require (
1010
github.com/google/go-cmp v0.5.9
1111
github.com/invopop/jsonschema v0.11.0
1212
github.com/jpillora/longestcommon v0.0.0-20161227235612-adb9d91ee629
13+
github.com/stretchr/testify v1.8.4
1314
golang.org/x/exp v0.0.0-20230905200255-921286631fa9
1415
)
1516

17+
// https://github.com/invopop/jsonschema/pull/106
18+
replace github.com/invopop/jsonschema => github.com/cloudquery/jsonschema v0.0.0-20231006094144-b42fc04b92bb
19+
1620
require (
1721
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.2 // indirect
1822
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect
23+
github.com/apache/arrow/go/v14 v14.0.0-20230929201650-00efb06dc0de // indirect
1924
github.com/bahlo/generic-list-go v0.2.0 // indirect
2025
github.com/buger/jsonparser v1.1.1 // indirect
21-
github.com/kr/text v0.2.0 // indirect
26+
github.com/davecgh/go-spew v1.1.1 // indirect
27+
github.com/goccy/go-json v0.10.2 // indirect
28+
github.com/google/flatbuffers v23.5.26+incompatible // indirect
29+
github.com/google/uuid v1.3.1 // indirect
30+
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
2231
github.com/mailru/easyjson v0.7.7 // indirect
32+
github.com/mattn/go-colorable v0.1.13 // indirect
33+
github.com/mattn/go-isatty v0.0.19 // indirect
34+
github.com/pmezard/go-difflib v1.0.0 // indirect
35+
github.com/rs/zerolog v1.29.1 // indirect
36+
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect
37+
github.com/thoas/go-funk v0.9.3 // indirect
2338
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
39+
github.com/zeebo/xxh3 v1.0.2 // indirect
40+
golang.org/x/mod v0.12.0 // indirect
2441
golang.org/x/net v0.15.0 // indirect
42+
golang.org/x/sys v0.12.0 // indirect
2543
golang.org/x/text v0.13.0 // indirect
44+
golang.org/x/tools v0.13.0 // indirect
45+
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
2646
gopkg.in/yaml.v3 v3.0.1 // indirect
2747
)

go.sum

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,38 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/solutions/armmanagedapplic
1212
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/solutions/armmanagedapplications v1.1.1/go.mod h1:AA8RASHl5shSrLLA0/IpBbLNsoSJkjIm68X9EGDQRgo=
1313
github.com/AzureAD/microsoft-authentication-library-for-go v0.9.0 h1:UE9n9rkJF62ArLb1F3DEjRt8O3jLwMWdSoypKV4f3MU=
1414
github.com/AzureAD/microsoft-authentication-library-for-go v0.9.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o=
15+
github.com/apache/arrow/go/v14 v14.0.0-20230929201650-00efb06dc0de h1:+lnt1xsPwGBrp+23yUQySdsuELYpEUdcco4fWlYffi4=
16+
github.com/apache/arrow/go/v14 v14.0.0-20230929201650-00efb06dc0de/go.mod h1:/SqmdO2dsWqFHqQQeupnsr0ollL8C91n3x0I72rArY8=
1517
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
1618
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
1719
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
1820
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
21+
github.com/cloudquery/jsonschema v0.0.0-20231006094144-b42fc04b92bb h1:W3y1G8XTh5NrFloojJqv8oFfAPbzdWlt5i0ik3rU2Pk=
22+
github.com/cloudquery/jsonschema v0.0.0-20231006094144-b42fc04b92bb/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
1923
github.com/cloudquery/plugin-sdk/v4 v4.12.3 h1:Gp7FtVhdh+5Ypv81r+j7Ph/2WyNje/4cv3+KraY0SQI=
2024
github.com/cloudquery/plugin-sdk/v4 v4.12.3/go.mod h1:62pXdBEQQB/M13G0Jp6lDNtmgbnuzPy38LoDgVPx0ns=
21-
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
25+
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
26+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2227
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2328
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
29+
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
30+
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
31+
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
2432
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
2533
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
34+
github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg=
35+
github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
2636
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
2737
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
2838
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
2939
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
30-
github.com/invopop/jsonschema v0.11.0 h1:tdAVvos5ttrsYLyEuVymkVVK31EFpwnTu5hWiyYLGWA=
31-
github.com/invopop/jsonschema v0.11.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
3240
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
3341
github.com/jpillora/longestcommon v0.0.0-20161227235612-adb9d91ee629 h1:1dSBUfGlorLAua2CRx0zFN7kQsTpE2DQSmr7rrTNgY8=
3442
github.com/jpillora/longestcommon v0.0.0-20161227235612-adb9d91ee629/go.mod h1:mb5nS4uRANwOJSZj8rlCWAfAcGi72GGMIXx+xGOjA7M=
43+
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
44+
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
45+
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
46+
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
3547
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
3648
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
3749
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -40,28 +52,67 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0
4052
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
4153
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
4254
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
55+
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
56+
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
57+
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
58+
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
59+
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
60+
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
61+
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
62+
github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
63+
github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
4364
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
4465
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
66+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
4567
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
4668
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
4769
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
4870
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
71+
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
72+
github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc=
73+
github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU=
74+
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4=
75+
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY=
76+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
77+
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
4978
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
5079
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
80+
github.com/thoas/go-funk v0.9.3 h1:7+nAEx3kn5ZJcnDm2Bh23N2yOtweO14bi//dvRtgLpw=
81+
github.com/thoas/go-funk v0.9.3/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q=
5182
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
5283
github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
84+
github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
85+
github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
86+
github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
87+
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
5388
golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck=
5489
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
5590
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
5691
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
92+
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
93+
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
5794
golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
5895
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
96+
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
97+
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
98+
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
99+
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
100+
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
101+
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
102+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
59103
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
60104
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
61105
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
62106
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
107+
golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ=
108+
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
109+
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
110+
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
111+
gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o=
112+
gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=
63113
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
64114
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
65115
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
116+
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
66117
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
67118
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

jsonschema/jsonschema.go renamed to jsonschema/generate.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ import (
1212
// Generate returns a formatted JSON schema for the input struct, according to the tags
1313
// defined by https://github.com/invopop/jsonschema
1414
func Generate(a any) ([]byte, error) {
15-
sc := (&jsonschema.Reflector{RequiredFromJSONSchemaTags: true}).Reflect(a)
15+
sc := (&jsonschema.Reflector{RequiredFromJSONSchemaTags: true, NullableFromType: true}).Reflect(a)
16+
if err := Sanitize(sc); err != nil {
17+
return nil, err
18+
}
19+
1620
return json.MarshalIndent(sc, "", " ")
1721
}
1822

jsonschema/sanitize.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package jsonschema
2+
3+
import (
4+
"encoding/json"
5+
"net/url"
6+
"strings"
7+
8+
"github.com/invopop/jsonschema"
9+
)
10+
11+
func Sanitize(sc *jsonschema.Schema) error {
12+
data, err := json.MarshalIndent(sc, "", " ")
13+
if err != nil {
14+
return err
15+
}
16+
17+
refs := make(map[string]bool)
18+
for _, line := range strings.Split(string(data), "\n") {
19+
line = strings.TrimSpace(line)
20+
const refPfx = `"$ref": `
21+
if strings.HasPrefix(line, refPfx) {
22+
refs[unescapeRef(strings.Trim(strings.TrimSuffix(strings.TrimPrefix(line, refPfx), ","), `"`))] = true
23+
}
24+
}
25+
26+
for key := range sc.Definitions {
27+
if _, ok := refs[key]; !ok {
28+
delete(sc.Definitions, key)
29+
}
30+
}
31+
32+
for p := sc.Properties.Oldest(); p != nil; p = p.Next() {
33+
if err := Sanitize(p.Value); err != nil {
34+
return err
35+
}
36+
}
37+
for _, def := range sc.Definitions {
38+
if err := Sanitize(def); err != nil {
39+
return err
40+
}
41+
}
42+
43+
return nil
44+
}
45+
func unescapeRef(ref string) string {
46+
ref = strings.TrimPrefix(ref, "#/$defs/")
47+
48+
var err error
49+
ref, err = url.PathUnescape(ref)
50+
if err != nil {
51+
panic(err)
52+
}
53+
54+
ref = strings.ReplaceAll(ref, "~1", "/")
55+
ref = strings.ReplaceAll(ref, "~0", "~")
56+
return ref
57+
}

jsonschema/sanitize_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package jsonschema
2+
3+
import (
4+
"testing"
5+
6+
"github.com/invopop/jsonschema"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestSanitize(t *testing.T) {
11+
sc := &jsonschema.Schema{
12+
Properties: jsonschema.NewProperties(),
13+
}
14+
15+
sc.Definitions = jsonschema.Definitions{
16+
"key": new(jsonschema.Schema),
17+
}
18+
19+
require.NoError(t, Sanitize(sc))
20+
require.Empty(t, sc.Definitions)
21+
}

jsonschema/testing.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package jsonschema
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
7+
"github.com/cloudquery/plugin-sdk/v4/plugin"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
type TestCase struct {
12+
Name string
13+
Spec string
14+
Err bool
15+
}
16+
17+
func TestJSONSchema(t *testing.T, schema string, cases []TestCase) {
18+
t.Helper()
19+
20+
validator, err := plugin.JSONSchemaValidator(schema)
21+
require.NoError(t, err)
22+
23+
for _, tc := range cases {
24+
t.Run(tc.Name, func(t *testing.T) {
25+
var v any
26+
require.NoErrorf(t, json.Unmarshal([]byte(tc.Spec), &v), "failed input:\n%s\n", tc.Spec)
27+
err := validator.Validate(v)
28+
if tc.Err {
29+
require.Errorf(t, err, "failed input:\n%s\n", tc.Spec)
30+
} else {
31+
require.NoErrorf(t, err, "failed input:\n%s\n", tc.Spec)
32+
}
33+
})
34+
}
35+
}
36+
37+
func WithRemovedKeys(t *testing.T, val any, keys ...string) string {
38+
data, err := json.Marshal(val)
39+
require.NoError(t, err)
40+
41+
var m any
42+
require.NoError(t, json.Unmarshal(data, &m))
43+
44+
switch m := m.(type) {
45+
case map[string]any:
46+
for _, k := range keys {
47+
delete(m, k)
48+
}
49+
default:
50+
t.Fatalf("failed to remove JSON keys from value of type %T", m)
51+
}
52+
53+
data, err = json.MarshalIndent(m, "", " ")
54+
require.NoError(t, err)
55+
return string(data)
56+
}

0 commit comments

Comments
 (0)