* update code.gitea.io/sdk/gitea v0.13.1 -> v0.13.2 * update github.com/go-swagger/go-swagger v0.25.0 -> v0.26.0 * update github.com/google/uuid v1.1.2 -> v1.2.0 * update github.com/klauspost/compress v1.11.3 -> v1.11.7 * update github.com/lib/pq 083382b7e6fc -> v1.9.0 * update github.com/markbates/goth v1.65.0 -> v1.66.1 * update github.com/mattn/go-sqlite3 v1.14.4 -> v1.14.6 * update github.com/mgechev/revive 246eac737dc7 -> v1.0.3 * update github.com/minio/minio-go/v7 v7.0.6 -> v7.0.7 * update github.com/niklasfasching/go-org v1.3.2 -> v1.4.0 * update github.com/olivere/elastic/v7 v7.0.21 -> v7.0.22 * update github.com/pquerna/otp v1.2.0 -> v1.3.0 * update github.com/xanzy/go-gitlab v0.39.0 -> v0.42.0 * update github.com/yuin/goldmark v1.2.1 -> v1.3.1tags/v1.15.0-dev
@@ -4,7 +4,7 @@ go 1.14 | |||
require ( | |||
code.gitea.io/gitea-vet v0.2.1 | |||
code.gitea.io/sdk/gitea v0.13.1 | |||
code.gitea.io/sdk/gitea v0.13.2 | |||
gitea.com/go-chi/binding v0.0.0-20210113025129-03f1d313373c | |||
gitea.com/go-chi/cache v0.0.0-20210110083709-82c4c9ce2d5e | |||
gitea.com/go-chi/captcha v0.0.0-20210110083842-e7696c336a1e | |||
@@ -17,6 +17,7 @@ require ( | |||
github.com/andybalholm/brotli v1.0.1 // indirect | |||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect | |||
github.com/blevesearch/bleve/v2 v2.0.1 | |||
github.com/boombuler/barcode v1.0.1 // indirect | |||
github.com/caddyserver/certmagic v0.12.0 | |||
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect | |||
github.com/denisenkom/go-mssqldb v0.9.0 | |||
@@ -36,14 +37,14 @@ require ( | |||
github.com/go-ldap/ldap/v3 v3.2.4 | |||
github.com/go-redis/redis/v7 v7.4.0 | |||
github.com/go-sql-driver/mysql v1.5.0 | |||
github.com/go-swagger/go-swagger v0.25.0 | |||
github.com/go-swagger/go-swagger v0.26.0 | |||
github.com/go-testfixtures/testfixtures/v3 v3.4.1 | |||
github.com/gobwas/glob v0.2.3 | |||
github.com/gogs/chardet v0.0.0-20191104214054-4b6791f73a28 | |||
github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14 | |||
github.com/gogs/go-gogs-client v0.0.0-20200905025246-8bb8a50cb355 | |||
github.com/google/go-github/v32 v32.1.0 | |||
github.com/google/uuid v1.1.2 | |||
github.com/google/uuid v1.2.0 | |||
github.com/gorilla/context v1.1.1 | |||
github.com/hashicorp/go-retryablehttp v0.6.8 // indirect | |||
github.com/hashicorp/go-version v1.2.1 | |||
@@ -54,37 +55,37 @@ require ( | |||
github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7 | |||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 | |||
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4 | |||
github.com/klauspost/compress v1.11.3 | |||
github.com/klauspost/compress v1.11.7 | |||
github.com/klauspost/pgzip v1.2.5 // indirect | |||
github.com/lafriks/xormstore v1.3.2 | |||
github.com/lib/pq v1.8.1-0.20200908161135-083382b7e6fc | |||
github.com/lib/pq v1.9.0 | |||
github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96 | |||
github.com/markbates/goth v1.65.0 | |||
github.com/mattn/go-colorable v0.1.7 // indirect | |||
github.com/markbates/goth v1.66.1 | |||
github.com/mattn/go-isatty v0.0.12 | |||
github.com/mattn/go-runewidth v0.0.9 // indirect | |||
github.com/mattn/go-sqlite3 v1.14.4 | |||
github.com/mattn/go-runewidth v0.0.10 // indirect | |||
github.com/mattn/go-sqlite3 v1.14.6 | |||
github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 | |||
github.com/mgechev/revive v1.0.3-0.20200921231451-246eac737dc7 | |||
github.com/mgechev/revive v1.0.3 | |||
github.com/mholt/archiver/v3 v3.5.0 | |||
github.com/microcosm-cc/bluemonday v1.0.4 | |||
github.com/minio/minio-go/v7 v7.0.6 | |||
github.com/minio/md5-simd v1.1.1 // indirect | |||
github.com/minio/minio-go/v7 v7.0.7 | |||
github.com/mitchellh/go-homedir v1.1.0 | |||
github.com/msteinert/pam v0.0.0-20200810204841-913b8f8cdf8b | |||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 | |||
github.com/niklasfasching/go-org v1.3.2 | |||
github.com/niklasfasching/go-org v1.4.0 | |||
github.com/oliamb/cutter v0.2.2 | |||
github.com/olivere/elastic/v7 v7.0.21 | |||
github.com/olivere/elastic/v7 v7.0.22 | |||
github.com/pelletier/go-toml v1.8.1 | |||
github.com/pierrec/lz4/v4 v4.1.1 // indirect | |||
github.com/pkg/errors v0.9.1 | |||
github.com/pquerna/otp v1.2.0 | |||
github.com/pquerna/otp v1.3.0 | |||
github.com/prometheus/client_golang v1.8.0 | |||
github.com/quasoft/websspi v1.0.0 | |||
github.com/rivo/uniseg v0.2.0 // indirect | |||
github.com/sergi/go-diff v1.1.0 | |||
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect | |||
github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 | |||
github.com/spf13/viper v1.7.1 // indirect | |||
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect | |||
github.com/stretchr/testify v1.7.0 | |||
github.com/syndtr/goleveldb v1.0.0 | |||
@@ -97,24 +98,24 @@ require ( | |||
github.com/unrolled/render v1.0.3 | |||
github.com/urfave/cli v1.22.5 | |||
github.com/willf/bitset v1.1.11 // indirect | |||
github.com/xanzy/go-gitlab v0.39.0 | |||
github.com/xanzy/go-gitlab v0.42.0 | |||
github.com/yohcop/openid-go v1.0.0 | |||
github.com/yuin/goldmark v1.2.1 | |||
github.com/yuin/goldmark v1.3.1 | |||
github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691 | |||
github.com/yuin/goldmark-meta v1.0.0 | |||
go.jolheiser.com/hcaptcha v0.0.4 | |||
go.jolheiser.com/pwn v0.0.3 | |||
golang.org/x/crypto v0.0.0-20201217014255-9d1352758620 | |||
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102 | |||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 | |||
golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 | |||
golang.org/x/text v0.3.4 | |||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect | |||
golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9 | |||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad | |||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 | |||
golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 | |||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c | |||
golang.org/x/text v0.3.5 | |||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect | |||
golang.org/x/tools v0.1.0 | |||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect | |||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df | |||
gopkg.in/ini.v1 v1.62.0 | |||
gopkg.in/yaml.v2 v2.3.0 | |||
gopkg.in/yaml.v2 v2.4.0 | |||
mvdan.cc/xurls/v2 v2.2.0 | |||
strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 | |||
xorm.io/builder v0.3.7 | |||
@@ -37,8 +37,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX | |||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= | |||
code.gitea.io/gitea-vet v0.2.1 h1:b30by7+3SkmiftK0RjuXqFvZg2q4p68uoPGuxhzBN0s= | |||
code.gitea.io/gitea-vet v0.2.1/go.mod h1:zcNbT/aJEmivCAhfmkHOlT645KNOf9W2KnkLgFjGGfE= | |||
code.gitea.io/sdk/gitea v0.13.1 h1:Y7bpH2iO6Q0KhhMJfjP/LZ0AmiYITeRQlCD8b0oYqhk= | |||
code.gitea.io/sdk/gitea v0.13.1/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= | |||
code.gitea.io/sdk/gitea v0.13.2 h1:wAnT/J7Z62q3fJXbgnecoaOBh8CM1Qq0/DakWxiv4yA= | |||
code.gitea.io/sdk/gitea v0.13.2/go.mod h1:lee2y8LeV3kQb2iK+hHlMqoadL4bp27QOkOV/hawLKg= | |||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= | |||
gitea.com/go-chi/binding v0.0.0-20210113025129-03f1d313373c h1:NTtrGYjR40WUdkCdn26Y5LGFT52rIkFPkjmtgCAyiTs= | |||
gitea.com/go-chi/binding v0.0.0-20210113025129-03f1d313373c/go.mod h1:9bGA9dIsrz+wVQKH1DzvxuAvrudHaQ8Wx8hLme/GVGQ= | |||
@@ -82,6 +82,7 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX | |||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= | |||
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= | |||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= | |||
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= | |||
github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= | |||
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= | |||
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= | |||
@@ -103,6 +104,7 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy | |||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= | |||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= | |||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= | |||
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= | |||
github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= | |||
github.com/andybalholm/brotli v1.0.1 h1:KqhlKozYbRtJvsPrrEeXcO+N2l6NYT5A2QAFmSULpEc= | |||
github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= | |||
@@ -126,9 +128,12 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l | |||
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= | |||
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= | |||
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= | |||
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef h1:46PFijGLmAjMPwCCCo7Jf0W6f9slllCkkv7vyc1yOSg= | |||
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= | |||
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= | |||
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= | |||
github.com/aws/aws-sdk-go v1.34.13/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= | |||
github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= | |||
github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= | |||
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= | |||
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= | |||
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= | |||
@@ -167,6 +172,8 @@ github.com/blevesearch/zapx/v15 v15.1.10 h1:kZR3b9jO9l6s2B5UHI+1N1llLzJ4nYikkXQT | |||
github.com/blevesearch/zapx/v15 v15.1.10/go.mod h1:4ypq25bwtSQKzwEF1UERyIhmGTbMT3brY/n4NC5gRnM= | |||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= | |||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= | |||
github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= | |||
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= | |||
github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668 h1:U/lr3Dgy4WK+hNk4tyD+nuGjpVLPEHuJSFXMw11/HPA= | |||
github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= | |||
github.com/caddyserver/certmagic v0.12.0 h1:1f7kxykaJkOVVpXJ8ZrC6RAO5F6+kKm9U7dBFbLNeug= | |||
@@ -270,8 +277,12 @@ github.com/ethantkoenig/rupture v1.0.0/go.mod h1:GyE9QabHfxA6ch0NZgwsHopRbOLcYjU | |||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= | |||
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= | |||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= | |||
github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= | |||
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= | |||
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= | |||
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= | |||
github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= | |||
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= | |||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= | |||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= | |||
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= | |||
@@ -331,12 +342,18 @@ github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9sn | |||
github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= | |||
github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE= | |||
github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= | |||
github.com/go-openapi/analysis v0.19.16 h1:Ub9e++M8sDwtHD+S587TYi+6ANBG1NRYGZDihqk0SaY= | |||
github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk= | |||
github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= | |||
github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= | |||
github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= | |||
github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= | |||
github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys= | |||
github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.9 h1:9SnKdGhiPZHF3ttwFMiCBEb8jQ4IDdrK+5+a0oTygA4= | |||
github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= | |||
github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= | |||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= | |||
@@ -344,12 +361,14 @@ github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwds | |||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= | |||
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= | |||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= | |||
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= | |||
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= | |||
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= | |||
github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= | |||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= | |||
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= | |||
github.com/go-openapi/jsonreference v0.19.4 h1:3Vw+rh13uq2JFNxgnMTGE1rnoieU9FmyE1gvnyylsYg= | |||
github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= | |||
github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= | |||
github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= | |||
github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | |||
github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | |||
github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | |||
@@ -357,12 +376,18 @@ github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix | |||
github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= | |||
github.com/go-openapi/loads v0.19.5 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls= | |||
github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= | |||
github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= | |||
github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= | |||
github.com/go-openapi/loads v0.20.0 h1:Pymw1O8zDmWeNv4kVsHd0W3cvgdp8juRa4U/U/8D/Pk= | |||
github.com/go-openapi/loads v0.20.0/go.mod h1:2LhKquiE513rN5xC6Aan6lYOSddlL8Mp20AW9kpviM4= | |||
github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= | |||
github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= | |||
github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= | |||
github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= | |||
github.com/go-openapi/runtime v0.19.20 h1:J/t+QIjbcoq8WJvjGxRKiFBhqUE8slS9SbmD0Oi/raQ= | |||
github.com/go-openapi/runtime v0.19.20/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= | |||
github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= | |||
github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= | |||
github.com/go-openapi/runtime v0.19.26 h1:K/6PoVNj5WJXUnMk+VEbELeXjtBkCS1UxTDa04tdXE0= | |||
github.com/go-openapi/runtime v0.19.26/go.mod h1:BvrQtn6iVb2QmiVXRsFAm6ZCAZBpbVKFfN6QWCp582M= | |||
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= | |||
github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= | |||
github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= | |||
@@ -370,6 +395,10 @@ github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8 | |||
github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | |||
github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= | |||
github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | |||
github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= | |||
github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= | |||
github.com/go-openapi/spec v0.20.1 h1:5WNKTzPguDN+79wbJw2UE2q+eX+gUmEFsIKSvnSQJlc= | |||
github.com/go-openapi/spec v0.20.1/go.mod h1:93x7oh+d+FQsmsieroS4cmR3u0p/ywH649a3qwC9OsQ= | |||
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | |||
github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | |||
github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= | |||
@@ -378,6 +407,9 @@ github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6 | |||
github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= | |||
github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= | |||
github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= | |||
github.com/go-openapi/strfmt v0.19.11/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= | |||
github.com/go-openapi/strfmt v0.20.0 h1:l2omNtmNbMc39IGptl9BuXBEKcZfS8zjrTsPKTiJiDM= | |||
github.com/go-openapi/strfmt v0.20.0/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= | |||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= | |||
github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= | |||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= | |||
@@ -385,11 +417,18 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh | |||
github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= | |||
github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE= | |||
github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= | |||
github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= | |||
github.com/go-openapi/swag v0.19.13 h1:233UVgMy1DlmCYYfOiFpta6e2urloh+sEs5id6lyzog= | |||
github.com/go-openapi/swag v0.19.13/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= | |||
github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= | |||
github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= | |||
github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= | |||
github.com/go-openapi/validate v0.19.10 h1:tG3SZ5DC5KF4cyt7nqLVcQXGj5A7mpaYkAcNPlDK+Yk= | |||
github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= | |||
github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= | |||
github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= | |||
github.com/go-openapi/validate v0.20.1 h1:QGQ5CvK74E28t3DkegGweKR+auemUi5IdpMc4x3UW6s= | |||
github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= | |||
github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4= | |||
github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= | |||
github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= | |||
@@ -401,8 +440,8 @@ github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gG | |||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= | |||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= | |||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= | |||
github.com/go-swagger/go-swagger v0.25.0 h1:FxhyrWWV8V/A9P6GtI5szWordAdbb6Y0nqdY/y9So2w= | |||
github.com/go-swagger/go-swagger v0.25.0/go.mod h1:9639ioXrPX9E6BbnbaDklGXjNz7upAXoNBwL4Ok11Vk= | |||
github.com/go-swagger/go-swagger v0.26.0 h1:LM5XTbeRbDdjHRqdA0jchK5Qs3DB2F0R5QmXs1pd/L0= | |||
github.com/go-swagger/go-swagger v0.26.0/go.mod h1:kSAA+pziAr5x68on6TxcxWoIl9GOo1mLsHmfMV2rrCo= | |||
github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013 h1:l9rI6sNaZgNC0LnF3MiE+qTmyBA/tZAg1rtyrGbUMK0= | |||
github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0= | |||
github.com/go-testfixtures/testfixtures/v3 v3.4.1 h1:Qz9y0wUOXPHzKhK6C79A/menChtEu/xd0Dn5ngVyMD0= | |||
@@ -511,8 +550,8 @@ github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hf | |||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | |||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= | |||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= | |||
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= | |||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= | |||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | |||
@@ -525,8 +564,8 @@ github.com/gorilla/csrf v1.6.0/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAk | |||
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= | |||
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= | |||
github.com/gorilla/handlers v1.4.1/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= | |||
github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= | |||
github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= | |||
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= | |||
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= | |||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= | |||
github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= | |||
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= | |||
@@ -637,7 +676,8 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i | |||
github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= | |||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= | |||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= | |||
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= | |||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= | |||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= | |||
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= | |||
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | |||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= | |||
@@ -670,8 +710,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o | |||
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |||
github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | |||
github.com/klauspost/compress v1.11.3 h1:dB4Bn0tN3wdCzQxnS8r06kV74qN/TAfaIS0bVE8h3jc= | |||
github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | |||
github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= | |||
github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | |||
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | |||
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | |||
github.com/klauspost/cpuid v1.2.5/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= | |||
@@ -687,8 +727,8 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv | |||
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= | |||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= | |||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | |||
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= | |||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= | |||
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= | |||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= | |||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | |||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= | |||
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= | |||
@@ -703,8 +743,8 @@ github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | |||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | |||
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | |||
github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | |||
github.com/lib/pq v1.8.1-0.20200908161135-083382b7e6fc h1:ERSU1OvZ6MdWhHieo2oT7xwR/HCksqKdgK6iYPU5pHI= | |||
github.com/lib/pq v1.8.1-0.20200908161135-083382b7e6fc/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | |||
github.com/lib/pq v1.9.0 h1:L8nSXQQzAYByakOFMTwpjRoHsMJklur4Gi59b6VivR8= | |||
github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | |||
github.com/libdns/libdns v0.1.0 h1:0ctCOrVJsVzj53mop1angHp/pE3hmAhP7KiHvR0HD04= | |||
github.com/libdns/libdns v0.1.0/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40= | |||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= | |||
@@ -719,6 +759,8 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q | |||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= | |||
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= | |||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= | |||
github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= | |||
github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= | |||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
@@ -727,8 +769,8 @@ github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7 | |||
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= | |||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= | |||
github.com/markbates/going v1.0.0/go.mod h1:I6mnB4BPnEeqo85ynXIx1ZFLLbtiLHNXVgWeFO9OGOA= | |||
github.com/markbates/goth v1.65.0 h1:IbXpMneUhqbxgJ8JP1Ghl8ghlAaVX66jWDAapU1KxqU= | |||
github.com/markbates/goth v1.65.0/go.mod h1:65frybxoeSCfORin51KOKqAKbIh7wREIDvdCkdWj//4= | |||
github.com/markbates/goth v1.66.1 h1:8YIkRxRxiUxhYhHdvriKiJ+mk2itt2ezjf/ABR8U+JI= | |||
github.com/markbates/goth v1.66.1/go.mod h1:57wf4mNb/fy/Cizm8xe4komsQRKPuelTMrm/wGcw3v8= | |||
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= | |||
github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= | |||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | |||
@@ -736,8 +778,8 @@ github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcncea | |||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | |||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | |||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= | |||
github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= | |||
github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= | |||
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= | |||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= | |||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= | |||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= | |||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | |||
@@ -750,19 +792,19 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky | |||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= | |||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= | |||
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= | |||
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= | |||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= | |||
github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= | |||
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= | |||
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= | |||
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= | |||
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= | |||
github.com/mattn/go-sqlite3 v1.14.4 h1:4rQjbDxdu9fSgI/r3KN72G3c2goxknAqHHgPWWs8UlI= | |||
github.com/mattn/go-sqlite3 v1.14.4/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= | |||
github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= | |||
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= | |||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= | |||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= | |||
github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 h1:QASJXOGm2RZ5Ardbc86qNFvby9AqkLDibfChMtAg5QM= | |||
github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= | |||
github.com/mgechev/revive v1.0.3-0.20200921231451-246eac737dc7 h1:ydVkpU/M4/c45yT3e5lzMeguKJm9GxGgsawx4/XlwK0= | |||
github.com/mgechev/revive v1.0.3-0.20200921231451-246eac737dc7/go.mod h1:no/hfevHbndpXR5CaJahkYCfM/FFpmM/dSOwFGU7Z1o= | |||
github.com/mgechev/revive v1.0.3 h1:z3FL6IFFN3JKzHYHD8O1ExH9g/4lAGJ5x1+9rPZgsFg= | |||
github.com/mgechev/revive v1.0.3/go.mod h1:POGGZagSo/0frdr7VeAifzS5Uka0d0GPiM35MsTO8nE= | |||
github.com/mholt/acmez v0.1.1 h1:KQODCqk+hBn3O7qfCRPj6L96uG65T5BSS95FKNEqtdA= | |||
github.com/mholt/acmez v0.1.1/go.mod h1:8qnn8QA/Ewx8E3ZSsmscqsIjhhpxuy9vqdgbX2ceceM= | |||
github.com/mholt/archiver/v3 v3.5.0 h1:nE8gZIrw66cu4osS/U7UW7YDuGMHssxKutU8IfWxwWE= | |||
@@ -772,10 +814,13 @@ github.com/miekg/dns v1.1.30 h1:Qww6FseFn8PRfw07jueqIXqodm0JKiiKuK0DeXSqfyo= | |||
github.com/miekg/dns v1.1.30/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= | |||
github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4= | |||
github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= | |||
github.com/minio/minio-go/v7 v7.0.6 h1:9czXaG0LEZ9s74smSqy0rm034MxngQoP6HTTuSc5GEs= | |||
github.com/minio/minio-go/v7 v7.0.6/go.mod h1:HcIuq+11d/3MfavIPZiswSzfQ1VJ2Lwxp/XLtW46IWQ= | |||
github.com/minio/md5-simd v1.1.1 h1:9ojcLbuZ4gXbB2sX53MKn8JUZ0sB/2wfwsEcRw+I08U= | |||
github.com/minio/md5-simd v1.1.1/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= | |||
github.com/minio/minio-go/v7 v7.0.7 h1:Qld/xb8C1Pwbu0jU46xAceyn9xXKCMW+3XfNbpmTB70= | |||
github.com/minio/minio-go/v7 v7.0.7/go.mod h1:pEZBUa+L2m9oECoIA6IcSK8bv/qggtQVLovjeKK5jYc= | |||
github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= | |||
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= | |||
github.com/minio/sio v0.2.1/go.mod h1:8b0yPp2avGThviy/+OCJBI6OMpvxoUuiLvE6F1lebhw= | |||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= | |||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= | |||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= | |||
@@ -787,6 +832,10 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F | |||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= | |||
github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= | |||
github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | |||
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | |||
github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | |||
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= | |||
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | |||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | |||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= | |||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | |||
@@ -814,8 +863,8 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6 | |||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= | |||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= | |||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= | |||
github.com/niklasfasching/go-org v1.3.2 h1:ZKTSd+GdJYkoZl1pBXLR/k7DRiRXnmB96TRiHmHdzwI= | |||
github.com/niklasfasching/go-org v1.3.2/go.mod h1:AsLD6X7djzRIz4/RFZu8vwRL0VGjUvGZCCH1Nz0VdrU= | |||
github.com/niklasfasching/go-org v1.4.0 h1:qPy4VEdX55f5QcLiaD3X7N/tY5XOgk4y2uEyQa02i7A= | |||
github.com/niklasfasching/go-org v1.4.0/go.mod h1:4FWT4U/Anir9ewjwNpbZIzMjG5RaXFafkyWZNEPRdk8= | |||
github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= | |||
github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ= | |||
github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= | |||
@@ -829,8 +878,8 @@ github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn | |||
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= | |||
github.com/oliamb/cutter v0.2.2 h1:Lfwkya0HHNU1YLnGv2hTkzHfasrSMkgv4Dn+5rmlk3k= | |||
github.com/oliamb/cutter v0.2.2/go.mod h1:4BenG2/4GuRBDbVm/OPahDVqbrOemzpPiG5mi1iryBU= | |||
github.com/olivere/elastic/v7 v7.0.21 h1:58a2pMlLketCsLyKg8kJNJG+OZIFKrSQXX6gJBpqqlg= | |||
github.com/olivere/elastic/v7 v7.0.21/go.mod h1:Kh7iIsXIBl5qRQOBFoylCsXVTtye3keQU2Y/YbR7HD8= | |||
github.com/olivere/elastic/v7 v7.0.22 h1:esBA6JJwvYgfms0EVlH7Z+9J4oQ/WUADF2y/nCNDw7s= | |||
github.com/olivere/elastic/v7 v7.0.22/go.mod h1:VDexNy9NjmtAkrjNoI7tImv7FR4tf5zUA3ickqu5Pc8= | |||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | |||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | |||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | |||
@@ -860,7 +909,7 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI | |||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= | |||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= | |||
github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= | |||
github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= | |||
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= | |||
github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= | |||
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= | |||
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= | |||
@@ -882,9 +931,9 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ | |||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | |||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | |||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= | |||
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= | |||
github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok= | |||
github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= | |||
github.com/pquerna/cachecontrol v0.0.0-20200921180117-858c6e7e6b7e/go.mod h1:hoLfEwdY11HjRfKFH6KqnPsfxlo3BP6bJehpDv8t6sQ= | |||
github.com/pquerna/otp v1.3.0 h1:oJV/SkzR33anKXwQU3Of42rL4wbrffP4uvUf1SvS5Xs= | |||
github.com/pquerna/otp v1.3.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= | |||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= | |||
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= | |||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= | |||
@@ -921,6 +970,10 @@ github.com/quasoft/websspi v1.0.0 h1:5nDgdM5xSur9s+B5w2xQ5kxf5nUGqgFgU4W0aDLZ8Mw | |||
github.com/quasoft/websspi v1.0.0/go.mod h1:HmVdl939dQ0WIXZhyik+ARdI03M6bQzaSEKcgpFmewk= | |||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= | |||
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= | |||
github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= | |||
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= | |||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= | |||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= | |||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= | |||
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | |||
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | |||
@@ -975,8 +1028,8 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k | |||
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= | |||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | |||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= | |||
github.com/spf13/afero v1.3.2 h1:GDarE4TJQI52kYSbSAmLiId1Elfj+xgSDqrUZxFhxlU= | |||
github.com/spf13/afero v1.3.2/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= | |||
github.com/spf13/afero v1.4.1 h1:asw9sl74539yqavKaglDM5hFpdJVK0Y5Dr/JOgQ89nQ= | |||
github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= | |||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | |||
github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= | |||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | |||
@@ -990,7 +1043,6 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn | |||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= | |||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | |||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= | |||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= | |||
github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= | |||
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= | |||
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo= | |||
@@ -1046,11 +1098,12 @@ github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU= | |||
github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= | |||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= | |||
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= | |||
github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= | |||
github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= | |||
github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= | |||
github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= | |||
github.com/xanzy/go-gitlab v0.39.0 h1:7aiZ03fJfCdqoHFhsZq/SoVYp2lR91hfYWmiXLOU5Qo= | |||
github.com/xanzy/go-gitlab v0.39.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= | |||
github.com/xanzy/go-gitlab v0.42.0 h1:daNdMFnw2FG+lDRBcX+YLnKbqIKMdefVyVztMHwsFhk= | |||
github.com/xanzy/go-gitlab v0.42.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= | |||
github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= | |||
github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= | |||
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= | |||
@@ -1067,6 +1120,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de | |||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | |||
github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM= | |||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | |||
github.com/yuin/goldmark v1.3.1 h1:eVwehsLsZlCJCwXyGLgg+Q4iFWE/eTIMG0e8waCmm/I= | |||
github.com/yuin/goldmark v1.3.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= | |||
github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691 h1:VWSxtAiQNh3zgHJpdpkpVYjTPqRE3P6UZCOPa1nRDio= | |||
github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691/go.mod h1:YLF3kDffRfUH/bTxOxHhV6lxwIB3Vfj91rEwNMS9MXo= | |||
github.com/yuin/goldmark-meta v1.0.0 h1:ScsatUIT2gFS6azqzLGUjgOnELsBOxMXerM3ogdJhAM= | |||
@@ -1086,8 +1141,9 @@ go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qL | |||
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | |||
go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | |||
go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | |||
go.mongodb.org/mongo-driver v1.3.5 h1:S0ZOruh4YGHjD7JoN7mIsTrNjnQbOjrmgrx6l6pZN7I= | |||
go.mongodb.org/mongo-driver v1.3.5/go.mod h1:Ual6Gkco7ZGQw8wE1t4tLnvBsf6yVSM60qW6TgOeJ5c= | |||
go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= | |||
go.mongodb.org/mongo-driver v1.4.4 h1:bsPHfODES+/yx2PCWzUYMH8xj6PVniPI8DQrsJuSXSs= | |||
go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= | |||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= | |||
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= | |||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | |||
@@ -1095,6 +1151,7 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | |||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | |||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | |||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | |||
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= | |||
go.opentelemetry.io/otel v0.14.0/go.mod h1:vH5xEuwy7Rts0GNtsCW3HYQoZDY+OmBJ6t1bFGGlxgw= | |||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | |||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | |||
@@ -1122,6 +1179,7 @@ golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACk | |||
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= | |||
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= | |||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
@@ -1136,8 +1194,9 @@ golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPh | |||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
golang.org/x/crypto v0.0.0-20201217014255-9d1352758620 h1:3wPMTskHO3+O6jqTEXyFcsnuxMQOqYSaHsDxcbUXpqA= | |||
golang.org/x/crypto v0.0.0-20201217014255-9d1352758620/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | |||
golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | |||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= | |||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | |||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | |||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | |||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= | |||
@@ -1217,8 +1276,12 @@ golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81R | |||
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | |||
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102 h1:42cLlJJdEh+ySyeUUbEQ5bsTiq8voBeTuweGVkY6Puw= | |||
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b h1:iFwSg7t5GZmB/Q5TjiEAsdoLDrdJRC1RiF2WhuV29Qw= | |||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= | |||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | |||
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | |||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | |||
@@ -1227,6 +1290,10 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr | |||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | |||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc= | |||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | |||
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58 h1:Mj83v+wSRNEar42a/MQgxk9X42TdEmrOl9i+y8WbxLo= | |||
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | |||
golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013 h1:55H5j7lotzuFCEOKDsMch+fRNUQ9DgtyHOUP31FNqKc= | |||
golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | |||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
@@ -1300,10 +1367,16 @@ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7w | |||
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 h1:nVuTkr9L6Bq62qpUqKo/RnZCFfzDBL0bYo6w9OJUqZY= | |||
golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k= | |||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= | |||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM= | |||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= | |||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= | |||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | |||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |||
@@ -1311,17 +1384,20 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | |||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |||
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= | |||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |||
golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= | |||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= | |||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= | |||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | |||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |||
@@ -1372,16 +1448,18 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY | |||
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | |||
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | |||
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | |||
golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | |||
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | |||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | |||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | |||
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= | |||
golang.org/x/tools v0.0.0-20200921210052-fa0125251cc4/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= | |||
golang.org/x/tools v0.0.0-20200928182047-19e03678916f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= | |||
golang.org/x/tools v0.0.0-20200929161345-d7fc70abf50f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= | |||
golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9 h1:sEvmEcJVKBNUvgCUClbUQeHOAa9U0I2Ce1BooMvVCY4= | |||
golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | |||
golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b h1:Lq5JUTFhiybGVf28jB6QRpqd13/JPOaCnET17PVzYJE= | |||
golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | |||
golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= | |||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= | |||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | |||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | |||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | |||
@@ -1518,6 +1596,8 @@ gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= | |||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= | |||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | |||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= | |||
@@ -25,7 +25,7 @@ type ListCronTaskOptions struct { | |||
// ListCronTasks list available cron tasks | |||
func (c *Client) ListCronTasks(opt ListCronTaskOptions) ([]*CronTask, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.13.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | |||
return nil, nil, err | |||
} | |||
opt.setDefaults() | |||
@@ -36,7 +36,7 @@ func (c *Client) ListCronTasks(opt ListCronTaskOptions) ([]*CronTask, *Response, | |||
// RunCronTasks run a cron task | |||
func (c *Client) RunCronTasks(task string) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.13.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | |||
return nil, err | |||
} | |||
_, resp, err := c.getResponse("POST", fmt.Sprintf("/admin/cron/%s", task), jsonHeader, nil) | |||
@@ -56,7 +56,7 @@ func NewClient(url string, options ...func(*Client)) (*Client, error) { | |||
for _, opt := range options { | |||
opt(client) | |||
} | |||
if err := client.CheckServerVersionConstraint(">=1.10"); err != nil { | |||
if err := client.checkServerVersionGreaterThanOrEqual(version1_10_0); err != nil { | |||
return nil, err | |||
} | |||
return client, nil | |||
@@ -3,6 +3,6 @@ module code.gitea.io/sdk/gitea | |||
go 1.12 | |||
require ( | |||
github.com/hashicorp/go-version v1.2.0 | |||
github.com/hashicorp/go-version v1.2.1 | |||
github.com/stretchr/testify v1.4.0 | |||
) |
@@ -121,7 +121,7 @@ func (c *Client) ListIssues(opt ListIssueOption) ([]*Issue, *Response, error) { | |||
link, _ := url.Parse("/repos/issues/search") | |||
link.RawQuery = opt.QueryEncode() | |||
resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, &issues) | |||
if e := c.CheckServerVersionConstraint(">=1.12.0"); e != nil { | |||
if e := c.checkServerVersionGreaterThanOrEqual(version1_12_0); e != nil { | |||
for i := 0; i < len(issues); i++ { | |||
if issues[i].Repository != nil { | |||
issues[i].Repository.Owner = strings.Split(issues[i].Repository.FullName, "/")[0] | |||
@@ -139,7 +139,7 @@ func (c *Client) ListRepoIssues(owner, repo string, opt ListIssueOption) ([]*Iss | |||
link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/issues", owner, repo)) | |||
link.RawQuery = opt.QueryEncode() | |||
resp, err := c.getParsedResponse("GET", link.String(), jsonHeader, nil, &issues) | |||
if e := c.CheckServerVersionConstraint(">=1.12.0"); e != nil { | |||
if e := c.checkServerVersionGreaterThanOrEqual(version1_12_0); e != nil { | |||
for i := 0; i < len(issues); i++ { | |||
if issues[i].Repository != nil { | |||
issues[i].Repository.Owner = strings.Split(issues[i].Repository.FullName, "/")[0] | |||
@@ -153,7 +153,7 @@ func (c *Client) ListRepoIssues(owner, repo string, opt ListIssueOption) ([]*Iss | |||
func (c *Client) GetIssue(owner, repo string, index int64) (*Issue, *Response, error) { | |||
issue := new(Issue) | |||
resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/%d", owner, repo, index), nil, nil, issue) | |||
if e := c.CheckServerVersionConstraint(">=1.12.0"); e != nil && issue.Repository != nil { | |||
if e := c.checkServerVersionGreaterThanOrEqual(version1_12_0); e != nil && issue.Repository != nil { | |||
issue.Repository.Owner = strings.Split(issue.Repository.FullName, "/")[0] | |||
} | |||
return issue, resp, err | |||
@@ -68,7 +68,7 @@ func (c *Client) ListRepoIssueComments(owner, repo string, opt ListIssueCommentO | |||
// GetIssueComment get a comment for a given repo by id. | |||
func (c *Client) GetIssueComment(owner, repo string, id int64) (*Comment, *Response, error) { | |||
comment := new(Comment) | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return comment, nil, err | |||
} | |||
resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/issues/comments/%d", owner, repo, id), nil, nil, &comment) | |||
@@ -71,7 +71,7 @@ func (c *Client) CreateLabel(owner, repo string, opt CreateLabelOption) (*Label, | |||
return nil, nil, err | |||
} | |||
if len(opt.Color) == 6 { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
opt.Color = "#" + opt.Color | |||
} | |||
} | |||
@@ -20,7 +20,7 @@ type Reaction struct { | |||
// GetIssueReactions get a list reactions of an issue | |||
func (c *Client) GetIssueReactions(owner, repo string, index int64) ([]*Reaction, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, nil, err | |||
} | |||
reactions := make([]*Reaction, 0, 10) | |||
@@ -30,7 +30,7 @@ func (c *Client) GetIssueReactions(owner, repo string, index int64) ([]*Reaction | |||
// GetIssueCommentReactions get a list of reactions from a comment of an issue | |||
func (c *Client) GetIssueCommentReactions(owner, repo string, commentID int64) ([]*Reaction, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, nil, err | |||
} | |||
reactions := make([]*Reaction, 0, 10) | |||
@@ -45,7 +45,7 @@ type editReactionOption struct { | |||
// PostIssueReaction add a reaction to an issue | |||
func (c *Client) PostIssueReaction(owner, repo string, index int64, reaction string) (*Reaction, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, nil, err | |||
} | |||
reactionResponse := new(Reaction) | |||
@@ -61,7 +61,7 @@ func (c *Client) PostIssueReaction(owner, repo string, index int64, reaction str | |||
// DeleteIssueReaction remove a reaction from an issue | |||
func (c *Client) DeleteIssueReaction(owner, repo string, index int64, reaction string) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, err | |||
} | |||
body, err := json.Marshal(&editReactionOption{Reaction: reaction}) | |||
@@ -74,7 +74,7 @@ func (c *Client) DeleteIssueReaction(owner, repo string, index int64, reaction s | |||
// PostIssueCommentReaction add a reaction to a comment of an issue | |||
func (c *Client) PostIssueCommentReaction(owner, repo string, commentID int64, reaction string) (*Reaction, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, nil, err | |||
} | |||
reactionResponse := new(Reaction) | |||
@@ -90,7 +90,7 @@ func (c *Client) PostIssueCommentReaction(owner, repo string, commentID int64, r | |||
// DeleteIssueCommentReaction remove a reaction from a comment of an issue | |||
func (c *Client) DeleteIssueCommentReaction(owner, repo string, commentID int64, reaction string) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, err | |||
} | |||
body, err := json.Marshal(&editReactionOption{Reaction: reaction}) | |||
@@ -11,7 +11,7 @@ import ( | |||
// GetIssueSubscribers get list of users who subscribed on an issue | |||
func (c *Client) GetIssueSubscribers(owner, repo string, index int64) ([]*User, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, nil, err | |||
} | |||
subscribers := make([]*User, 0, 10) | |||
@@ -21,7 +21,7 @@ func (c *Client) GetIssueSubscribers(owner, repo string, index int64) ([]*User, | |||
// AddIssueSubscription Subscribe user to issue | |||
func (c *Client) AddIssueSubscription(owner, repo string, index int64, user string) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, err | |||
} | |||
status, resp, err := c.getStatusCode("PUT", fmt.Sprintf("/repos/%s/%s/issues/%d/subscriptions/%s", owner, repo, index, user), nil, nil) | |||
@@ -39,7 +39,7 @@ func (c *Client) AddIssueSubscription(owner, repo string, index int64, user stri | |||
// DeleteIssueSubscription unsubscribe user from issue | |||
func (c *Client) DeleteIssueSubscription(owner, repo string, index int64, user string) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, err | |||
} | |||
status, resp, err := c.getStatusCode("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/subscriptions/%s", owner, repo, index, user), nil, nil) | |||
@@ -57,7 +57,7 @@ func (c *Client) DeleteIssueSubscription(owner, repo string, index int64, user s | |||
// CheckIssueSubscription check if current user is subscribed to an issue | |||
func (c *Client) CheckIssueSubscription(owner, repo string, index int64) (*WatchInfo, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
wi := new(WatchInfo) | |||
@@ -27,7 +27,7 @@ type TrackedTime struct { | |||
// GetUserTrackedTimes list tracked times of a user | |||
func (c *Client) GetUserTrackedTimes(owner, repo, user string) ([]*TrackedTime, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, nil, err | |||
} | |||
times := make([]*TrackedTime, 0, 10) | |||
@@ -37,7 +37,7 @@ func (c *Client) GetUserTrackedTimes(owner, repo, user string) ([]*TrackedTime, | |||
// GetRepoTrackedTimes list tracked times of a repository | |||
func (c *Client) GetRepoTrackedTimes(owner, repo string) ([]*TrackedTime, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, nil, err | |||
} | |||
times := make([]*TrackedTime, 0, 10) | |||
@@ -47,7 +47,7 @@ func (c *Client) GetRepoTrackedTimes(owner, repo string) ([]*TrackedTime, *Respo | |||
// GetMyTrackedTimes list tracked times of the current user | |||
func (c *Client) GetMyTrackedTimes() ([]*TrackedTime, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, nil, err | |||
} | |||
times := make([]*TrackedTime, 0, 10) | |||
@@ -75,7 +75,7 @@ func (opt AddTimeOption) Validate() error { | |||
// AddTime adds time to issue with the given index | |||
func (c *Client) AddTime(owner, repo string, index int64, opt AddTimeOption) (*TrackedTime, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, nil, err | |||
} | |||
if err := opt.Validate(); err != nil { | |||
@@ -99,7 +99,7 @@ type ListTrackedTimesOptions struct { | |||
// ListTrackedTimes list tracked times of a single issue for a given repository | |||
func (c *Client) ListTrackedTimes(owner, repo string, index int64, opt ListTrackedTimesOptions) ([]*TrackedTime, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, nil, err | |||
} | |||
opt.setDefaults() | |||
@@ -110,7 +110,7 @@ func (c *Client) ListTrackedTimes(owner, repo string, index int64, opt ListTrack | |||
// ResetIssueTime reset tracked time of a single issue for a given repository | |||
func (c *Client) ResetIssueTime(owner, repo string, index int64) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, err | |||
} | |||
_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/times", owner, repo, index), nil, nil) | |||
@@ -119,7 +119,7 @@ func (c *Client) ResetIssueTime(owner, repo string, index int64) (*Response, err | |||
// DeleteTime delete a specific tracked time by id of a single issue for a given repository | |||
func (c *Client) DeleteTime(owner, repo string, index, timeID int64) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.11.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_11_0); err != nil { | |||
return nil, err | |||
} | |||
_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/issues/%d/times/%d", owner, repo, index, timeID), nil, nil) | |||
@@ -8,6 +8,12 @@ import ( | |||
"fmt" | |||
"net/url" | |||
"time" | |||
"github.com/hashicorp/go-version" | |||
) | |||
var ( | |||
version1_12_3, _ = version.NewVersion("1.12.3") | |||
) | |||
// NotificationThread expose Notification on API | |||
@@ -75,7 +81,7 @@ func (opt *ListNotificationOptions) QueryEncode() string { | |||
// Validate the CreateUserOption struct | |||
func (opt ListNotificationOptions) Validate(c *Client) error { | |||
if len(opt.Status) != 0 { | |||
return c.CheckServerVersionConstraint(">=1.12.3") | |||
return c.checkServerVersionGreaterThanOrEqual(version1_12_3) | |||
} | |||
return nil | |||
} | |||
@@ -98,14 +104,14 @@ func (opt *MarkNotificationOptions) QueryEncode() string { | |||
// Validate the CreateUserOption struct | |||
func (opt MarkNotificationOptions) Validate(c *Client) error { | |||
if len(opt.Status) != 0 || len(opt.ToStatus) != 0 { | |||
return c.CheckServerVersionConstraint(">=1.12.3") | |||
return c.checkServerVersionGreaterThanOrEqual(version1_12_3) | |||
} | |||
return nil | |||
} | |||
// CheckNotifications list users's notification threads | |||
func (c *Client) CheckNotifications() (int64, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return 0, nil, err | |||
} | |||
new := struct { | |||
@@ -118,7 +124,7 @@ func (c *Client) CheckNotifications() (int64, *Response, error) { | |||
// GetNotification get notification thread by ID | |||
func (c *Client) GetNotification(id int64) (*NotificationThread, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
thread := new(NotificationThread) | |||
@@ -129,7 +135,7 @@ func (c *Client) GetNotification(id int64) (*NotificationThread, *Response, erro | |||
// ReadNotification mark notification thread as read by ID | |||
// It optionally takes a second argument if status has to be set other than 'read' | |||
func (c *Client) ReadNotification(id int64, status ...NotifyStatus) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, err | |||
} | |||
link := fmt.Sprintf("/notifications/threads/%d", id) | |||
@@ -142,7 +148,7 @@ func (c *Client) ReadNotification(id int64, status ...NotifyStatus) (*Response, | |||
// ListNotifications list users's notification threads | |||
func (c *Client) ListNotifications(opt ListNotificationOptions) ([]*NotificationThread, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
if err := opt.Validate(c); err != nil { | |||
@@ -157,7 +163,7 @@ func (c *Client) ListNotifications(opt ListNotificationOptions) ([]*Notification | |||
// ReadNotifications mark notification threads as read | |||
func (c *Client) ReadNotifications(opt MarkNotificationOptions) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, err | |||
} | |||
if err := opt.Validate(c); err != nil { | |||
@@ -171,7 +177,7 @@ func (c *Client) ReadNotifications(opt MarkNotificationOptions) (*Response, erro | |||
// ListRepoNotifications list users's notification threads on a specific repo | |||
func (c *Client) ListRepoNotifications(owner, reponame string, opt ListNotificationOptions) ([]*NotificationThread, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
if err := opt.Validate(c); err != nil { | |||
@@ -186,7 +192,7 @@ func (c *Client) ListRepoNotifications(owner, reponame string, opt ListNotificat | |||
// ReadRepoNotifications mark notification threads as read on a specific repo | |||
func (c *Client) ReadRepoNotifications(owner, reponame string, opt MarkNotificationOptions) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, err | |||
} | |||
if err := opt.Validate(c); err != nil { | |||
@@ -34,7 +34,7 @@ type CreateOauth2Option struct { | |||
// CreateOauth2 create an Oauth2 Application and returns a completed Oauth2 object. | |||
func (c *Client) CreateOauth2(opt CreateOauth2Option) (*Oauth2, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
body, err := json.Marshal(&opt) | |||
@@ -48,7 +48,7 @@ func (c *Client) CreateOauth2(opt CreateOauth2Option) (*Oauth2, *Response, error | |||
// UpdateOauth2 a specific Oauth2 Application by ID and return a completed Oauth2 object. | |||
func (c *Client) UpdateOauth2(oauth2id int64, opt CreateOauth2Option) (*Oauth2, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
body, err := json.Marshal(&opt) | |||
@@ -62,7 +62,7 @@ func (c *Client) UpdateOauth2(oauth2id int64, opt CreateOauth2Option) (*Oauth2, | |||
// GetOauth2 a specific Oauth2 Application by ID. | |||
func (c *Client) GetOauth2(oauth2id int64) (*Oauth2, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
oauth2s := &Oauth2{} | |||
@@ -72,7 +72,7 @@ func (c *Client) GetOauth2(oauth2id int64) (*Oauth2, *Response, error) { | |||
// ListOauth2 all of your Oauth2 Applications. | |||
func (c *Client) ListOauth2(opt ListOauth2Option) ([]*Oauth2, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
opt.setDefaults() | |||
@@ -83,7 +83,7 @@ func (c *Client) ListOauth2(opt ListOauth2Option) ([]*Oauth2, *Response, error) | |||
// DeleteOauth2 delete an Oauth2 application by ID | |||
func (c *Client) DeleteOauth2(oauth2id int64) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, err | |||
} | |||
_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/user/applications/oauth2/%d", oauth2id), nil, nil) | |||
@@ -160,7 +160,7 @@ func (opt EditPullRequestOption) Validate(c *Client) error { | |||
return fmt.Errorf("title is empty") | |||
} | |||
if len(opt.Base) != 0 { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return fmt.Errorf("can not change base gitea to old") | |||
} | |||
} | |||
@@ -229,7 +229,7 @@ func (c *Client) IsPullRequestMerged(owner, repo string, index int64) (bool, *Re | |||
// getPullRequestDiffOrPatch gets the patch or diff file as bytes for a PR | |||
func (c *Client) getPullRequestDiffOrPatch(owner, repo, kind string, index int64) ([]byte, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.13.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | |||
r, _, err2 := c.GetRepo(owner, repo) | |||
if err2 != nil { | |||
return nil, nil, err | |||
@@ -132,7 +132,7 @@ func (opt CreatePullReviewComment) Validate() error { | |||
// ListPullReviews lists all reviews of a pull request | |||
func (c *Client) ListPullReviews(owner, repo string, index int64, opt ListPullReviewsOptions) ([]*PullReview, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
opt.setDefaults() | |||
@@ -147,7 +147,7 @@ func (c *Client) ListPullReviews(owner, repo string, index int64, opt ListPullRe | |||
// GetPullReview gets a specific review of a pull request | |||
func (c *Client) GetPullReview(owner, repo string, index, id int64) (*PullReview, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
@@ -158,7 +158,7 @@ func (c *Client) GetPullReview(owner, repo string, index, id int64) (*PullReview | |||
// ListPullReviewComments lists all comments of a pull request review | |||
func (c *Client) ListPullReviewComments(owner, repo string, index, id int64) ([]*PullReviewComment, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
rcl := make([]*PullReviewComment, 0, 4) | |||
@@ -170,7 +170,7 @@ func (c *Client) ListPullReviewComments(owner, repo string, index, id int64) ([] | |||
// DeletePullReview delete a specific review from a pull request | |||
func (c *Client) DeletePullReview(owner, repo string, index, id int64) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, err | |||
} | |||
@@ -180,7 +180,7 @@ func (c *Client) DeletePullReview(owner, repo string, index, id int64) (*Respons | |||
// CreatePullReview create a review to an pull request | |||
func (c *Client) CreatePullReview(owner, repo string, index int64, opt CreatePullReviewOptions) (*PullReview, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
if err := opt.Validate(); err != nil { | |||
@@ -200,7 +200,7 @@ func (c *Client) CreatePullReview(owner, repo string, index int64, opt CreatePul | |||
// SubmitPullReview submit a pending review to an pull request | |||
func (c *Client) SubmitPullReview(owner, repo string, index, id int64, opt SubmitPullReviewOptions) (*PullReview, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
if err := opt.Validate(); err != nil { | |||
@@ -57,7 +57,7 @@ func (c *Client) GetRelease(user, repo string, id int64) (*Release, *Response, e | |||
// GetReleaseByTag get a release of a repository by tag | |||
func (c *Client) GetReleaseByTag(user, repo string, tag string) (*Release, *Response, error) { | |||
if c.CheckServerVersionConstraint(">=1.13.0") != nil { | |||
if c.checkServerVersionGreaterThanOrEqual(version1_13_0) != nil { | |||
return c.fallbackGetReleaseByTag(user, repo, tag) | |||
} | |||
r := new(Release) | |||
@@ -73,6 +73,20 @@ const ( | |||
RepoTypeMirror RepoType = "mirror" | |||
) | |||
// TrustModel represent how git signatures are handled in a repository | |||
type TrustModel string | |||
const ( | |||
// TrustModelDefault use TM set by global config | |||
TrustModelDefault TrustModel = "default" | |||
// TrustModelCollaborator gpg signature has to be owned by a repo collaborator | |||
TrustModelCollaborator TrustModel = "collaborator" | |||
// TrustModelCommitter gpg signature has to match committer | |||
TrustModelCommitter TrustModel = "committer" | |||
// TrustModelCollaboratorCommitter gpg signature has to match committer and owned by a repo collaborator | |||
TrustModelCollaboratorCommitter TrustModel = "collaboratorcommitter" | |||
) | |||
// ListReposOptions options for listing repositories | |||
type ListReposOptions struct { | |||
ListOptions | |||
@@ -224,7 +238,7 @@ func (c *Client) SearchRepos(opt SearchRepoOptions) ([]*Repository, *Response, e | |||
} else { | |||
link.RawQuery = opt.QueryEncode() | |||
// IsPrivate only works on gitea >= 1.12.0 | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil && opt.IsPrivate != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil && opt.IsPrivate != nil { | |||
if *opt.IsPrivate { | |||
// private repos only not supported on gitea <= 1.11.x | |||
return nil, nil, err | |||
@@ -249,6 +263,8 @@ type CreateRepoOption struct { | |||
IssueLabels string `json:"issue_labels"` | |||
// Whether the repository should be auto-intialized? | |||
AutoInit bool `json:"auto_init"` | |||
// Whether the repository is template | |||
Template bool `json:"template"` | |||
// Gitignores to use | |||
Gitignores string `json:"gitignores"` | |||
// License to use | |||
@@ -257,19 +273,35 @@ type CreateRepoOption struct { | |||
Readme string `json:"readme"` | |||
// DefaultBranch of the repository (used when initializes and in template) | |||
DefaultBranch string `json:"default_branch"` | |||
// TrustModel of the repository | |||
TrustModel TrustModel `json:"trust_model"` | |||
} | |||
// Validate the CreateRepoOption struct | |||
func (opt CreateRepoOption) Validate() error { | |||
func (opt CreateRepoOption) Validate(c *Client) error { | |||
if len(strings.TrimSpace(opt.Name)) == 0 { | |||
return fmt.Errorf("name is empty") | |||
} | |||
if len(opt.Name) > 100 { | |||
return fmt.Errorf("name has more than 100 chars") | |||
} | |||
if len(opt.Description) > 255 { | |||
return fmt.Errorf("name has more than 255 chars") | |||
} | |||
if len(opt.DefaultBranch) > 100 { | |||
return fmt.Errorf("name has more than 100 chars") | |||
} | |||
if len(opt.TrustModel) != 0 { | |||
if err := c.CheckServerVersionConstraint(">=1.13.0"); err != nil { | |||
return err | |||
} | |||
} | |||
return nil | |||
} | |||
// CreateRepo creates a repository for authenticated user. | |||
func (c *Client) CreateRepo(opt CreateRepoOption) (*Repository, *Response, error) { | |||
if err := opt.Validate(); err != nil { | |||
if err := opt.Validate(c); err != nil { | |||
return nil, nil, err | |||
} | |||
body, err := json.Marshal(&opt) | |||
@@ -283,7 +315,7 @@ func (c *Client) CreateRepo(opt CreateRepoOption) (*Repository, *Response, error | |||
// CreateOrgRepo creates an organization repository for authenticated user. | |||
func (c *Client) CreateOrgRepo(org string, opt CreateRepoOption) (*Repository, *Response, error) { | |||
if err := opt.Validate(); err != nil { | |||
if err := opt.Validate(c); err != nil { | |||
return nil, nil, err | |||
} | |||
body, err := json.Marshal(&opt) | |||
@@ -84,7 +84,7 @@ func (c *Client) GetRepoBranch(user, repo, branch string) (*Branch, *Response, e | |||
// DeleteRepoBranch delete a branch in a repository | |||
func (c *Client) DeleteRepoBranch(user, repo, branch string) (bool, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return false, nil, err | |||
} | |||
status, resp, err := c.getStatusCode("DELETE", fmt.Sprintf("/repos/%s/%s/branches/%s", user, repo, branch), nil, nil) | |||
@@ -118,7 +118,7 @@ func (opt CreateBranchOption) Validate() error { | |||
// CreateBranch creates a branch for a user's repository | |||
func (c *Client) CreateBranch(owner, repo string, opt CreateBranchOption) (*Branch, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.13.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | |||
return nil, nil, err | |||
} | |||
if err := opt.Validate(); err != nil { | |||
@@ -92,7 +92,7 @@ type ListBranchProtectionsOptions struct { | |||
// ListBranchProtections list branch protections for a repo | |||
func (c *Client) ListBranchProtections(owner, repo string, opt ListBranchProtectionsOptions) ([]*BranchProtection, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
bps := make([]*BranchProtection, 0, opt.PageSize) | |||
@@ -104,7 +104,7 @@ func (c *Client) ListBranchProtections(owner, repo string, opt ListBranchProtect | |||
// GetBranchProtection gets a branch protection | |||
func (c *Client) GetBranchProtection(owner, repo, name string) (*BranchProtection, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
bp := new(BranchProtection) | |||
@@ -114,7 +114,7 @@ func (c *Client) GetBranchProtection(owner, repo, name string) (*BranchProtectio | |||
// CreateBranchProtection creates a branch protection for a repo | |||
func (c *Client) CreateBranchProtection(owner, repo string, opt CreateBranchProtectionOption) (*BranchProtection, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
bp := new(BranchProtection) | |||
@@ -128,7 +128,7 @@ func (c *Client) CreateBranchProtection(owner, repo string, opt CreateBranchProt | |||
// EditBranchProtection edits a branch protection for a repo | |||
func (c *Client) EditBranchProtection(owner, repo, name string, opt EditBranchProtectionOption) (*BranchProtection, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
bp := new(BranchProtection) | |||
@@ -142,7 +142,7 @@ func (c *Client) EditBranchProtection(owner, repo, name string, opt EditBranchPr | |||
// DeleteBranchProtection deletes a branch protection for a repo | |||
func (c *Client) DeleteBranchProtection(owner, repo, name string) (*Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, err | |||
} | |||
_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/branch_protections/%s", owner, repo, name), jsonHeader, nil) | |||
@@ -19,8 +19,9 @@ type Identity struct { | |||
// CommitMeta contains meta information of a commit in terms of API. | |||
type CommitMeta struct { | |||
URL string `json:"url"` | |||
SHA string `json:"sha"` | |||
URL string `json:"url"` | |||
SHA string `json:"sha"` | |||
Created time.Time `json:"created"` | |||
} | |||
// CommitUser contains information of a user in the context of a commit. | |||
@@ -182,7 +182,7 @@ func (c *Client) DeleteFile(owner, repo, filepath string, opt DeleteFileOptions) | |||
func (c *Client) setDefaultBranchForOldVersions(owner, repo, branch string) (string, error) { | |||
if len(branch) == 0 { | |||
// Gitea >= 1.12.0 Use DefaultBranch on "", mimic this for older versions | |||
if c.CheckServerVersionConstraint(">=1.12.0") != nil { | |||
if c.checkServerVersionGreaterThanOrEqual(version1_12_0) != nil { | |||
r, _, err := c.GetRepo(owner, repo) | |||
if err != nil { | |||
return "", err | |||
@@ -20,10 +20,10 @@ const ( | |||
GitServiceGithub GitServiceType = "github" | |||
// GitServiceGitlab represents a gitlab service | |||
GitServiceGitlab GitServiceType = "gitlab" | |||
// GitServiceGitea represents a gitea service | |||
GitServiceGitea GitServiceType = "gitea" | |||
// Not supported jet | |||
// // GitServiceGitea represents a gitea service | |||
// GitServiceGitea GitServiceType = "gitea" | |||
// // GitServiceGogs represents a gogs service | |||
// GitServiceGogs GitServiceType = "gogs" | |||
) | |||
@@ -51,7 +51,7 @@ type MigrateRepoOption struct { | |||
} | |||
// Validate the MigrateRepoOption struct | |||
func (opt *MigrateRepoOption) Validate() error { | |||
func (opt *MigrateRepoOption) Validate(c *Client) error { | |||
// check user options | |||
if len(opt.CloneAddr) == 0 { | |||
return fmt.Errorf("CloneAddr required") | |||
@@ -69,6 +69,15 @@ func (opt *MigrateRepoOption) Validate() error { | |||
if len(opt.AuthToken) == 0 { | |||
return fmt.Errorf("github require token authentication") | |||
} | |||
case GitServiceGitlab, GitServiceGitea: | |||
if len(opt.AuthToken) == 0 { | |||
return fmt.Errorf("%s require token authentication", opt.Service) | |||
} | |||
// Gitlab is supported since 1.12.0 but api cant handle it until 1.13.0 | |||
// https://github.com/go-gitea/gitea/pull/12672 | |||
if c.checkServerVersionGreaterThanOrEqual(version1_13_0) != nil { | |||
return fmt.Errorf("migrate from service %s need gitea >= 1.13.0", opt.Service) | |||
} | |||
} | |||
return nil | |||
} | |||
@@ -78,11 +87,11 @@ func (opt *MigrateRepoOption) Validate() error { | |||
// To migrate a repository for a organization, the authenticated user must be a | |||
// owner of the specified organization. | |||
func (c *Client) MigrateRepo(opt MigrateRepoOption) (*Repository, *Response, error) { | |||
if err := opt.Validate(); err != nil { | |||
if err := opt.Validate(c); err != nil { | |||
return nil, nil, err | |||
} | |||
if err := c.CheckServerVersionConstraint(">=1.13.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | |||
if len(opt.AuthToken) != 0 { | |||
// gitea <= 1.12 dont understand AuthToken | |||
opt.AuthUsername = opt.AuthToken | |||
@@ -20,7 +20,7 @@ type TransferRepoOption struct { | |||
// TransferRepo transfers the ownership of a repository | |||
func (c *Client) TransferRepo(owner, reponame string, opt TransferRepoOption) (*Repository, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.12.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_12_0); err != nil { | |||
return nil, nil, err | |||
} | |||
body, err := json.Marshal(&opt) | |||
@@ -33,7 +33,7 @@ type GlobalAttachmentSettings struct { | |||
// GetGlobalUISettings get global ui settings witch are exposed by API | |||
func (c *Client) GetGlobalUISettings() (*GlobalUISettings, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.13.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | |||
return nil, nil, err | |||
} | |||
conf := new(GlobalUISettings) | |||
@@ -43,7 +43,7 @@ func (c *Client) GetGlobalUISettings() (*GlobalUISettings, *Response, error) { | |||
// GetGlobalRepoSettings get global repository settings witch are exposed by API | |||
func (c *Client) GetGlobalRepoSettings() (*GlobalRepoSettings, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.13.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | |||
return nil, nil, err | |||
} | |||
conf := new(GlobalRepoSettings) | |||
@@ -53,7 +53,7 @@ func (c *Client) GetGlobalRepoSettings() (*GlobalRepoSettings, *Response, error) | |||
// GetGlobalAPISettings get global api settings witch are exposed by it | |||
func (c *Client) GetGlobalAPISettings() (*GlobalAPISettings, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.13.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | |||
return nil, nil, err | |||
} | |||
conf := new(GlobalAPISettings) | |||
@@ -63,7 +63,7 @@ func (c *Client) GetGlobalAPISettings() (*GlobalAPISettings, *Response, error) { | |||
// GetGlobalAttachmentSettings get global repository settings witch are exposed by API | |||
func (c *Client) GetGlobalAttachmentSettings() (*GlobalAttachmentSettings, *Response, error) { | |||
if err := c.CheckServerVersionConstraint(">=1.13.0"); err != nil { | |||
if err := c.checkServerVersionGreaterThanOrEqual(version1_13_0); err != nil { | |||
return nil, nil, err | |||
} | |||
conf := new(GlobalAttachmentSettings) | |||
@@ -42,6 +42,32 @@ func (c *Client) CheckServerVersionConstraint(constraint string) error { | |||
return nil | |||
} | |||
// predefined versions only have to be parsed by library once | |||
var ( | |||
version1_10_0, _ = version.NewVersion("1.10.0") | |||
version1_11_0, _ = version.NewVersion("1.11.0") | |||
version1_12_0, _ = version.NewVersion("1.12.0") | |||
version1_13_0, _ = version.NewVersion("1.13.0") | |||
) | |||
// checkServerVersionGreaterThanOrEqual is internally used to speed up things and ignore issues with prerelease | |||
func (c *Client) checkServerVersionGreaterThanOrEqual(v *version.Version) error { | |||
c.versionLock.RLock() | |||
if c.serverVersion == nil { | |||
c.versionLock.RUnlock() | |||
if err := c.loadClientServerVersion(); err != nil { | |||
return err | |||
} | |||
} else { | |||
c.versionLock.RUnlock() | |||
} | |||
if !c.serverVersion.GreaterThanOrEqual(v) { | |||
return fmt.Errorf("gitea server at %s is older than %s", c.url, v.Original()) | |||
} | |||
return nil | |||
} | |||
// loadClientServerVersion init the serverVersion variable | |||
func (c *Client) loadClientServerVersion() error { | |||
c.versionLock.Lock() | |||
@@ -1,18 +1,12 @@ | |||
dist: bionic | |||
language: go | |||
env: GO111MODULE=on GOFLAGS='-mod vendor' | |||
install: true | |||
email: false | |||
dist: xenial | |||
go: | |||
- 1.10 | |||
- 1.11 | |||
- 1.12 | |||
- 1.13 | |||
- tip | |||
- '1.10' | |||
- '1.11' | |||
- '1.12' | |||
- '1.13' | |||
- 'tip' | |||
before_script: | |||
- go install github.com/golangci/golangci-lint/cmd/golangci-lint | |||
script: | |||
- golangci-lint run # run a bunch of code checkers/linters in parallel | |||
- go test -v -race ./... # Run all the tests with the race detector enabled | |||
- go test -coverpkg=./... -coverprofile=coverage.info -timeout=5s | |||
- bash <(curl -s https://codecov.io/bash) |
@@ -0,0 +1,43 @@ | |||
# Contributor Code of Conduct | |||
This project adheres to [The Code Manifesto](http://codemanifesto.com) | |||
as its guidelines for contributor interactions. | |||
## The Code Manifesto | |||
We want to work in an ecosystem that empowers developers to reach their | |||
potential — one that encourages growth and effective collaboration. A space | |||
that is safe for all. | |||
A space such as this benefits everyone that participates in it. It encourages | |||
new developers to enter our field. It is through discussion and collaboration | |||
that we grow, and through growth that we improve. | |||
In the effort to create such a place, we hold to these values: | |||
1. **Discrimination limits us.** This includes discrimination on the basis of | |||
race, gender, sexual orientation, gender identity, age, nationality, | |||
technology and any other arbitrary exclusion of a group of people. | |||
2. **Boundaries honor us.** Your comfort levels are not everyone’s comfort | |||
levels. Remember that, and if brought to your attention, heed it. | |||
3. **We are our biggest assets.** None of us were born masters of our trade. | |||
Each of us has been helped along the way. Return that favor, when and where | |||
you can. | |||
4. **We are resources for the future.** As an extension of #3, share what you | |||
know. Make yourself a resource to help those that come after you. | |||
5. **Respect defines us.** Treat others as you wish to be treated. Make your | |||
discussions, criticisms and debates from a position of respectfulness. Ask | |||
yourself, is it true? Is it necessary? Is it constructive? Anything less is | |||
unacceptable. | |||
6. **Reactions require grace.** Angry responses are valid, but abusive language | |||
and vindictive actions are toxic. When something happens that offends you, | |||
handle it assertively, but be respectful. Escalate reasonably, and try to | |||
allow the offender an opportunity to explain themselves, and possibly | |||
correct the issue. | |||
7. **Opinions are just that: opinions.** Each and every one of us, due to our | |||
background and upbringing, have varying opinions. That is perfectly | |||
acceptable. Remember this: if you respect your own opinions, you should | |||
respect the opinions of others. | |||
8. **To err is human.** You might not intend it, but mistakes do happen and | |||
contribute to build experience. Tolerate honest mistakes, and don't | |||
hesitate to apologize if you make one yourself. |
@@ -1,6 +1,6 @@ | |||
The MIT License (MIT) | |||
Copyright (c) 2014 Alex Saskevich | |||
Copyright (c) 2014-2020 Alex Saskevich | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
@@ -1,7 +1,8 @@ | |||
govalidator | |||
=========== | |||
[](https://gitter.im/asaskevich/govalidator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [](https://godoc.org/github.com/asaskevich/govalidator) [](https://coveralls.io/r/asaskevich/govalidator?branch=master) [](https://app.wercker.com/project/bykey/1ec990b09ea86c910d5f08b0e02c6043) | |||
[](https://travis-ci.org/asaskevich/govalidator) [](https://goreportcard.com/report/github.com/asaskevich/govalidator) [](http://go-search.org/view?id=github.com%2Fasaskevich%2Fgovalidator) [](#backers) [](#sponsors) [](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_shield) | |||
[](https://gitter.im/asaskevich/govalidator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [](https://godoc.org/github.com/asaskevich/govalidator) | |||
[](https://travis-ci.org/asaskevich/govalidator) | |||
[](https://codecov.io/gh/asaskevich/govalidator) [](https://goreportcard.com/report/github.com/asaskevich/govalidator) [](http://go-search.org/view?id=github.com%2Fasaskevich%2Fgovalidator) [](#backers) [](#sponsors) [](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_shield) | |||
A package of validators and sanitizers for strings, structs and collections. Based on [validator.js](https://github.com/chriso/validator.js). | |||
@@ -279,7 +280,7 @@ type User struct { | |||
Age int `valid:"type(int)"` | |||
Meta interface{} `valid:"type(string)"` | |||
} | |||
result, err := govalidator.ValidateStruct(user{"Bob", 20, "meta"}) | |||
result, err := govalidator.ValidateStruct(User{"Bob", 20, "meta"}) | |||
if err != nil { | |||
println("error: " + err.Error()) | |||
} | |||
@@ -392,6 +393,8 @@ Validators with parameters | |||
"matches(pattern)": StringMatches, | |||
"in(string1|string2|...|stringN)": IsIn, | |||
"rsapub(keylength)" : IsRsaPub, | |||
"minstringlength(int): MinStringLength, | |||
"maxstringlength(int): MaxStringLength, | |||
``` | |||
Validators with parameters for any type | |||
@@ -9,6 +9,35 @@ type ResultIterator func(interface{}, int) interface{} | |||
// ConditionIterator is the function that accepts element of slice/array and its index and returns boolean | |||
type ConditionIterator func(interface{}, int) bool | |||
// ReduceIterator is the function that accepts two element of slice/array and returns result of merging those values | |||
type ReduceIterator func(interface{}, interface{}) interface{} | |||
// Some validates that any item of array corresponds to ConditionIterator. Returns boolean. | |||
func Some(array []interface{}, iterator ConditionIterator) bool { | |||
res := false | |||
for index, data := range array { | |||
res = res || iterator(data, index) | |||
} | |||
return res | |||
} | |||
// Every validates that every item of array corresponds to ConditionIterator. Returns boolean. | |||
func Every(array []interface{}, iterator ConditionIterator) bool { | |||
res := true | |||
for index, data := range array { | |||
res = res && iterator(data, index) | |||
} | |||
return res | |||
} | |||
// Reduce boils down a list of values into a single value by ReduceIterator | |||
func Reduce(array []interface{}, iterator ReduceIterator, initialValue interface{}) interface{} { | |||
for _, data := range array { | |||
initialValue = iterator(initialValue, data) | |||
} | |||
return initialValue | |||
} | |||
// Each iterates over the slice and apply Iterator to every item | |||
func Each(array []interface{}, iterator Iterator) { | |||
for index, data := range array { | |||
@@ -10,7 +10,7 @@ import ( | |||
// ToString convert the input to a string. | |||
func ToString(obj interface{}) string { | |||
res := fmt.Sprintf("%v", obj) | |||
return string(res) | |||
return res | |||
} | |||
// ToJSON convert the input to a valid JSON string | |||
@@ -23,12 +23,27 @@ func ToJSON(obj interface{}) (string, error) { | |||
} | |||
// ToFloat convert the input string to a float, or 0.0 if the input is not a float. | |||
func ToFloat(str string) (float64, error) { | |||
res, err := strconv.ParseFloat(str, 64) | |||
if err != nil { | |||
res = 0.0 | |||
func ToFloat(value interface{}) (res float64, err error) { | |||
val := reflect.ValueOf(value) | |||
switch value.(type) { | |||
case int, int8, int16, int32, int64: | |||
res = float64(val.Int()) | |||
case uint, uint8, uint16, uint32, uint64: | |||
res = float64(val.Uint()) | |||
case float32, float64: | |||
res = val.Float() | |||
case string: | |||
res, err = strconv.ParseFloat(val.String(), 64) | |||
if err != nil { | |||
res = 0 | |||
} | |||
default: | |||
err = fmt.Errorf("ToInt: unknown interface type %T", value) | |||
res = 0 | |||
} | |||
return res, err | |||
return | |||
} | |||
// ToInt convert the input string or any int type to an integer type 64, or 0 if the input is not an integer. | |||
@@ -40,6 +55,8 @@ func ToInt(value interface{}) (res int64, err error) { | |||
res = val.Int() | |||
case uint, uint8, uint16, uint32, uint64: | |||
res = int64(val.Uint()) | |||
case float32, float64: | |||
res = int64(val.Float()) | |||
case string: | |||
if IsInt(val.String()) { | |||
res, err = strconv.ParseInt(val.String(), 0, 64) | |||
@@ -47,11 +64,11 @@ func ToInt(value interface{}) (res int64, err error) { | |||
res = 0 | |||
} | |||
} else { | |||
err = fmt.Errorf("math: square root of negative number %g", value) | |||
err = fmt.Errorf("ToInt: invalid numeric format %g", value) | |||
res = 0 | |||
} | |||
default: | |||
err = fmt.Errorf("math: square root of negative number %g", value) | |||
err = fmt.Errorf("ToInt: unknown interface type %T", value) | |||
res = 0 | |||
} | |||
@@ -1,3 +1,3 @@ | |||
module github.com/asaskevich/govalidator | |||
go 1.12 | |||
go 1.13 |
@@ -2,7 +2,6 @@ package govalidator | |||
import ( | |||
"math" | |||
"reflect" | |||
) | |||
// Abs returns absolute value of number | |||
@@ -41,7 +40,7 @@ func IsNonPositive(value float64) bool { | |||
return value <= 0 | |||
} | |||
// InRange returns true if value lies between left and right border | |||
// InRangeInt returns true if value lies between left and right border | |||
func InRangeInt(value, left, right interface{}) bool { | |||
value64, _ := ToInt(value) | |||
left64, _ := ToInt(left) | |||
@@ -52,7 +51,7 @@ func InRangeInt(value, left, right interface{}) bool { | |||
return value64 >= left64 && value64 <= right64 | |||
} | |||
// InRange returns true if value lies between left and right border | |||
// InRangeFloat32 returns true if value lies between left and right border | |||
func InRangeFloat32(value, left, right float32) bool { | |||
if left > right { | |||
left, right = right, left | |||
@@ -60,7 +59,7 @@ func InRangeFloat32(value, left, right float32) bool { | |||
return value >= left && value <= right | |||
} | |||
// InRange returns true if value lies between left and right border | |||
// InRangeFloat64 returns true if value lies between left and right border | |||
func InRangeFloat64(value, left, right float64) bool { | |||
if left > right { | |||
left, right = right, left | |||
@@ -68,20 +67,24 @@ func InRangeFloat64(value, left, right float64) bool { | |||
return value >= left && value <= right | |||
} | |||
// InRange returns true if value lies between left and right border, generic type to handle int, float32 or float64, all types must the same type | |||
// InRange returns true if value lies between left and right border, generic type to handle int, float32, float64 and string. | |||
// All types must the same type. | |||
// False if value doesn't lie in range or if it incompatible or not comparable | |||
func InRange(value interface{}, left interface{}, right interface{}) bool { | |||
reflectValue := reflect.TypeOf(value).Kind() | |||
reflectLeft := reflect.TypeOf(left).Kind() | |||
reflectRight := reflect.TypeOf(right).Kind() | |||
if reflectValue == reflect.Int && reflectLeft == reflect.Int && reflectRight == reflect.Int { | |||
return InRangeInt(value.(int), left.(int), right.(int)) | |||
} else if reflectValue == reflect.Float32 && reflectLeft == reflect.Float32 && reflectRight == reflect.Float32 { | |||
return InRangeFloat32(value.(float32), left.(float32), right.(float32)) | |||
} else if reflectValue == reflect.Float64 && reflectLeft == reflect.Float64 && reflectRight == reflect.Float64 { | |||
return InRangeFloat64(value.(float64), left.(float64), right.(float64)) | |||
} else { | |||
switch value.(type) { | |||
case int: | |||
intValue, _ := ToInt(value) | |||
intLeft, _ := ToInt(left) | |||
intRight, _ := ToInt(right) | |||
return InRangeInt(intValue, intLeft, intRight) | |||
case float32, float64: | |||
intValue, _ := ToFloat(value) | |||
intLeft, _ := ToFloat(left) | |||
intRight, _ := ToFloat(right) | |||
return InRangeFloat64(intValue, intLeft, intRight) | |||
case string: | |||
return value.(string) >= left.(string) && value.(string) <= right.(string) | |||
default: | |||
return false | |||
} | |||
} | |||
@@ -38,7 +38,7 @@ const ( | |||
URLPort string = `(:(\d{1,5}))` | |||
URLIP string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3]|24\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-5]))` | |||
URLSubdomain string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))` | |||
URL string = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$` | |||
URL = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$` | |||
SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` | |||
WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` | |||
UnixPath string = `^(/[^/\x00]*)+/?$` | |||
@@ -49,6 +49,7 @@ const ( | |||
hasWhitespace string = ".*[[:space:]]" | |||
hasWhitespaceOnly string = "^[[:space:]]+$" | |||
IMEI string = "^[0-9a-f]{14}$|^\\d{15}$|^\\d{18}$" | |||
IMSI string = "^\\d{14,15}$" | |||
) | |||
// Used by IsFilePath func | |||
@@ -102,4 +103,5 @@ var ( | |||
rxHasWhitespace = regexp.MustCompile(hasWhitespace) | |||
rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly) | |||
rxIMEI = regexp.MustCompile(IMEI) | |||
rxIMSI = regexp.MustCompile(IMSI) | |||
) |
@@ -14,8 +14,10 @@ type Validator func(str string) bool | |||
// The second parameter should be the context (in the case of validating a struct: the whole object being validated). | |||
type CustomTypeValidator func(i interface{}, o interface{}) bool | |||
// ParamValidator is a wrapper for validator functions that accepts additional parameters. | |||
// ParamValidator is a wrapper for validator functions that accept additional parameters. | |||
type ParamValidator func(str string, params ...string) bool | |||
// InterfaceParamValidator is a wrapper for functions that accept variants parameters for an interface value | |||
type InterfaceParamValidator func(in interface{}, params ...string) bool | |||
type tagOptionsMap map[string]tagOption | |||
@@ -72,13 +74,13 @@ var ParamTagMap = map[string]ParamValidator{ | |||
// ParamTagRegexMap maps param tags to their respective regexes. | |||
var ParamTagRegexMap = map[string]*regexp.Regexp{ | |||
"range": regexp.MustCompile("^range\\((\\d+)\\|(\\d+)\\)$"), | |||
"length": regexp.MustCompile("^length\\((\\d+)\\|(\\d+)\\)$"), | |||
"runelength": regexp.MustCompile("^runelength\\((\\d+)\\|(\\d+)\\)$"), | |||
"stringlength": regexp.MustCompile("^stringlength\\((\\d+)\\|(\\d+)\\)$"), | |||
"in": regexp.MustCompile(`^in\((.*)\)`), | |||
"matches": regexp.MustCompile(`^matches\((.+)\)$`), | |||
"rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"), | |||
"range": regexp.MustCompile("^range\\((\\d+)\\|(\\d+)\\)$"), | |||
"length": regexp.MustCompile("^length\\((\\d+)\\|(\\d+)\\)$"), | |||
"runelength": regexp.MustCompile("^runelength\\((\\d+)\\|(\\d+)\\)$"), | |||
"stringlength": regexp.MustCompile("^stringlength\\((\\d+)\\|(\\d+)\\)$"), | |||
"in": regexp.MustCompile(`^in\((.*)\)`), | |||
"matches": regexp.MustCompile(`^matches\((.+)\)$`), | |||
"rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"), | |||
"minstringlength": regexp.MustCompile("^minstringlength\\((\\d+)\\)$"), | |||
"maxstringlength": regexp.MustCompile("^maxstringlength\\((\\d+)\\)$"), | |||
} | |||
@@ -447,10 +449,10 @@ var ISO4217List = []string{ | |||
"PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", | |||
"QAR", | |||
"RON", "RSD", "RUB", "RWF", | |||
"SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STD", "SVC", "SYP", "SZL", | |||
"SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STD", "STN", "SVC", "SYP", "SZL", | |||
"THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", | |||
"UAH", "UGX", "USD", "USN", "UYI", "UYU", "UZS", | |||
"VEF", "VND", "VUV", | |||
"UAH", "UGX", "USD", "USN", "UYI", "UYU", "UYW", "UZS", | |||
"VEF", "VES", "VND", "VUV", | |||
"WST", | |||
"XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR", "XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "XXX", | |||
"YER", | |||
@@ -32,7 +32,7 @@ var ( | |||
const maxURLRuneCount = 2083 | |||
const minURLRuneCount = 3 | |||
const RF3339WithoutZone = "2006-01-02T15:04:05" | |||
const rfc3339WithoutZone = "2006-01-02T15:04:05" | |||
// SetFieldsRequiredByDefault causes validation to fail when struct fields | |||
// do not include validations or are not explicitly marked as exempt (using `valid:"-"` or `valid:"email,optional"`). | |||
@@ -63,13 +63,13 @@ func SetNilPtrAllowedByRequired(value bool) { | |||
nilPtrAllowedByRequired = value | |||
} | |||
// IsEmail check if the string is an email. | |||
// IsEmail checks if the string is an email. | |||
func IsEmail(str string) bool { | |||
// TODO uppercase letters are not supported | |||
return rxEmail.MatchString(str) | |||
} | |||
// IsExistingEmail check if the string is an email of existing domain | |||
// IsExistingEmail checks if the string is an email of existing domain | |||
func IsExistingEmail(email string) bool { | |||
if len(email) < 6 || len(email) > 254 { | |||
@@ -84,13 +84,13 @@ func IsExistingEmail(email string) bool { | |||
if len(user) > 64 { | |||
return false | |||
} | |||
if userDotRegexp.MatchString(user) || !userRegexp.MatchString(user) || !hostRegexp.MatchString(host) { | |||
return false | |||
} | |||
switch host { | |||
case "localhost", "example.com": | |||
return true | |||
} | |||
if userDotRegexp.MatchString(user) || !userRegexp.MatchString(user) || !hostRegexp.MatchString(host) { | |||
return false | |||
} | |||
if _, err := net.LookupMX(host); err != nil { | |||
if _, err := net.LookupIP(host); err != nil { | |||
return false | |||
@@ -100,7 +100,7 @@ func IsExistingEmail(email string) bool { | |||
return true | |||
} | |||
// IsURL check if the string is an URL. | |||
// IsURL checks if the string is an URL. | |||
func IsURL(str string) bool { | |||
if str == "" || utf8.RuneCountInString(str) >= maxURLRuneCount || len(str) <= minURLRuneCount || strings.HasPrefix(str, ".") { | |||
return false | |||
@@ -124,7 +124,7 @@ func IsURL(str string) bool { | |||
return rxURL.MatchString(str) | |||
} | |||
// IsRequestURL check if the string rawurl, assuming | |||
// IsRequestURL checks if the string rawurl, assuming | |||
// it was received in an HTTP request, is a valid | |||
// URL confirm to RFC 3986 | |||
func IsRequestURL(rawurl string) bool { | |||
@@ -138,7 +138,7 @@ func IsRequestURL(rawurl string) bool { | |||
return true | |||
} | |||
// IsRequestURI check if the string rawurl, assuming | |||
// IsRequestURI checks if the string rawurl, assuming | |||
// it was received in an HTTP request, is an | |||
// absolute URI or an absolute path. | |||
func IsRequestURI(rawurl string) bool { | |||
@@ -146,7 +146,7 @@ func IsRequestURI(rawurl string) bool { | |||
return err == nil | |||
} | |||
// IsAlpha check if the string contains only letters (a-zA-Z). Empty string is valid. | |||
// IsAlpha checks if the string contains only letters (a-zA-Z). Empty string is valid. | |||
func IsAlpha(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -154,7 +154,7 @@ func IsAlpha(str string) bool { | |||
return rxAlpha.MatchString(str) | |||
} | |||
//IsUTFLetter check if the string contains only unicode letter characters. | |||
//IsUTFLetter checks if the string contains only unicode letter characters. | |||
//Similar to IsAlpha but for all languages. Empty string is valid. | |||
func IsUTFLetter(str string) bool { | |||
if IsNull(str) { | |||
@@ -170,7 +170,7 @@ func IsUTFLetter(str string) bool { | |||
} | |||
// IsAlphanumeric check if the string contains only letters and numbers. Empty string is valid. | |||
// IsAlphanumeric checks if the string contains only letters and numbers. Empty string is valid. | |||
func IsAlphanumeric(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -178,7 +178,7 @@ func IsAlphanumeric(str string) bool { | |||
return rxAlphanumeric.MatchString(str) | |||
} | |||
// IsUTFLetterNumeric check if the string contains only unicode letters and numbers. Empty string is valid. | |||
// IsUTFLetterNumeric checks if the string contains only unicode letters and numbers. Empty string is valid. | |||
func IsUTFLetterNumeric(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -192,7 +192,7 @@ func IsUTFLetterNumeric(str string) bool { | |||
} | |||
// IsNumeric check if the string contains only numbers. Empty string is valid. | |||
// IsNumeric checks if the string contains only numbers. Empty string is valid. | |||
func IsNumeric(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -200,7 +200,7 @@ func IsNumeric(str string) bool { | |||
return rxNumeric.MatchString(str) | |||
} | |||
// IsUTFNumeric check if the string contains only unicode numbers of any kind. | |||
// IsUTFNumeric checks if the string contains only unicode numbers of any kind. | |||
// Numbers can be 0-9 but also Fractions ¾,Roman Ⅸ and Hangzhou 〩. Empty string is valid. | |||
func IsUTFNumeric(str string) bool { | |||
if IsNull(str) { | |||
@@ -222,7 +222,7 @@ func IsUTFNumeric(str string) bool { | |||
} | |||
// IsUTFDigit check if the string contains only unicode radix-10 decimal digits. Empty string is valid. | |||
// IsUTFDigit checks if the string contains only unicode radix-10 decimal digits. Empty string is valid. | |||
func IsUTFDigit(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -243,22 +243,22 @@ func IsUTFDigit(str string) bool { | |||
} | |||
// IsHexadecimal check if the string is a hexadecimal number. | |||
// IsHexadecimal checks if the string is a hexadecimal number. | |||
func IsHexadecimal(str string) bool { | |||
return rxHexadecimal.MatchString(str) | |||
} | |||
// IsHexcolor check if the string is a hexadecimal color. | |||
// IsHexcolor checks if the string is a hexadecimal color. | |||
func IsHexcolor(str string) bool { | |||
return rxHexcolor.MatchString(str) | |||
} | |||
// IsRGBcolor check if the string is a valid RGB color in form rgb(RRR, GGG, BBB). | |||
// IsRGBcolor checks if the string is a valid RGB color in form rgb(RRR, GGG, BBB). | |||
func IsRGBcolor(str string) bool { | |||
return rxRGBcolor.MatchString(str) | |||
} | |||
// IsLowerCase check if the string is lowercase. Empty string is valid. | |||
// IsLowerCase checks if the string is lowercase. Empty string is valid. | |||
func IsLowerCase(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -266,7 +266,7 @@ func IsLowerCase(str string) bool { | |||
return str == strings.ToLower(str) | |||
} | |||
// IsUpperCase check if the string is uppercase. Empty string is valid. | |||
// IsUpperCase checks if the string is uppercase. Empty string is valid. | |||
func IsUpperCase(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -274,7 +274,7 @@ func IsUpperCase(str string) bool { | |||
return str == strings.ToUpper(str) | |||
} | |||
// HasLowerCase check if the string contains at least 1 lowercase. Empty string is valid. | |||
// HasLowerCase checks if the string contains at least 1 lowercase. Empty string is valid. | |||
func HasLowerCase(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -282,7 +282,7 @@ func HasLowerCase(str string) bool { | |||
return rxHasLowerCase.MatchString(str) | |||
} | |||
// HasUpperCase check if the string contains as least 1 uppercase. Empty string is valid. | |||
// HasUpperCase checks if the string contains as least 1 uppercase. Empty string is valid. | |||
func HasUpperCase(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -290,7 +290,7 @@ func HasUpperCase(str string) bool { | |||
return rxHasUpperCase.MatchString(str) | |||
} | |||
// IsInt check if the string is an integer. Empty string is valid. | |||
// IsInt checks if the string is an integer. Empty string is valid. | |||
func IsInt(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -298,12 +298,12 @@ func IsInt(str string) bool { | |||
return rxInt.MatchString(str) | |||
} | |||
// IsFloat check if the string is a float. | |||
// IsFloat checks if the string is a float. | |||
func IsFloat(str string) bool { | |||
return str != "" && rxFloat.MatchString(str) | |||
} | |||
// IsDivisibleBy check if the string is a number that's divisible by another. | |||
// IsDivisibleBy checks if the string is a number that's divisible by another. | |||
// If second argument is not valid integer or zero, it's return false. | |||
// Otherwise, if first argument is not valid integer or zero, it's return true (Invalid string converts to zero). | |||
func IsDivisibleBy(str, num string) bool { | |||
@@ -316,12 +316,12 @@ func IsDivisibleBy(str, num string) bool { | |||
return (p == 0) || (p%q == 0) | |||
} | |||
// IsNull check if the string is null. | |||
// IsNull checks if the string is null. | |||
func IsNull(str string) bool { | |||
return len(str) == 0 | |||
} | |||
// IsNotNull check if the string is not null. | |||
// IsNotNull checks if the string is not null. | |||
func IsNotNull(str string) bool { | |||
return !IsNull(str) | |||
} | |||
@@ -336,32 +336,32 @@ func HasWhitespace(str string) bool { | |||
return len(str) > 0 && rxHasWhitespace.MatchString(str) | |||
} | |||
// IsByteLength check if the string's length (in bytes) falls in a range. | |||
// IsByteLength checks if the string's length (in bytes) falls in a range. | |||
func IsByteLength(str string, min, max int) bool { | |||
return len(str) >= min && len(str) <= max | |||
} | |||
// IsUUIDv3 check if the string is a UUID version 3. | |||
// IsUUIDv3 checks if the string is a UUID version 3. | |||
func IsUUIDv3(str string) bool { | |||
return rxUUID3.MatchString(str) | |||
} | |||
// IsUUIDv4 check if the string is a UUID version 4. | |||
// IsUUIDv4 checks if the string is a UUID version 4. | |||
func IsUUIDv4(str string) bool { | |||
return rxUUID4.MatchString(str) | |||
} | |||
// IsUUIDv5 check if the string is a UUID version 5. | |||
// IsUUIDv5 checks if the string is a UUID version 5. | |||
func IsUUIDv5(str string) bool { | |||
return rxUUID5.MatchString(str) | |||
} | |||
// IsUUID check if the string is a UUID (version 3, 4 or 5). | |||
// IsUUID checks if the string is a UUID (version 3, 4 or 5). | |||
func IsUUID(str string) bool { | |||
return rxUUID.MatchString(str) | |||
} | |||
// IsCreditCard check if the string is a credit card. | |||
// IsCreditCard checks if the string is a credit card. | |||
func IsCreditCard(str string) bool { | |||
sanitized := notNumberRegexp.ReplaceAllString(str, "") | |||
if !rxCreditCard.MatchString(sanitized) { | |||
@@ -377,7 +377,7 @@ func IsCreditCard(str string) bool { | |||
if shouldDouble { | |||
tmpNum *= 2 | |||
if tmpNum >= 10 { | |||
sum += ((tmpNum % 10) + 1) | |||
sum += (tmpNum % 10) + 1 | |||
} else { | |||
sum += tmpNum | |||
} | |||
@@ -390,18 +390,18 @@ func IsCreditCard(str string) bool { | |||
return sum%10 == 0 | |||
} | |||
// IsISBN10 check if the string is an ISBN version 10. | |||
// IsISBN10 checks if the string is an ISBN version 10. | |||
func IsISBN10(str string) bool { | |||
return IsISBN(str, 10) | |||
} | |||
// IsISBN13 check if the string is an ISBN version 13. | |||
// IsISBN13 checks if the string is an ISBN version 13. | |||
func IsISBN13(str string) bool { | |||
return IsISBN(str, 13) | |||
} | |||
// IsISBN check if the string is an ISBN (version 10 or 13). | |||
// If version value is not equal to 10 or 13, it will be check both variants. | |||
// IsISBN checks if the string is an ISBN (version 10 or 13). | |||
// If version value is not equal to 10 or 13, it will be checks both variants. | |||
func IsISBN(str string, version int) bool { | |||
sanitized := whiteSpacesAndMinus.ReplaceAllString(str, "") | |||
var checksum int32 | |||
@@ -435,13 +435,13 @@ func IsISBN(str string, version int) bool { | |||
return IsISBN(str, 10) || IsISBN(str, 13) | |||
} | |||
// IsJSON check if the string is valid JSON (note: uses json.Unmarshal). | |||
// IsJSON checks if the string is valid JSON (note: uses json.Unmarshal). | |||
func IsJSON(str string) bool { | |||
var js json.RawMessage | |||
return json.Unmarshal([]byte(str), &js) == nil | |||
} | |||
// IsMultibyte check if the string contains one or more multibyte chars. Empty string is valid. | |||
// IsMultibyte checks if the string contains one or more multibyte chars. Empty string is valid. | |||
func IsMultibyte(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -449,7 +449,7 @@ func IsMultibyte(str string) bool { | |||
return rxMultibyte.MatchString(str) | |||
} | |||
// IsASCII check if the string contains ASCII chars only. Empty string is valid. | |||
// IsASCII checks if the string contains ASCII chars only. Empty string is valid. | |||
func IsASCII(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -457,7 +457,7 @@ func IsASCII(str string) bool { | |||
return rxASCII.MatchString(str) | |||
} | |||
// IsPrintableASCII check if the string contains printable ASCII chars only. Empty string is valid. | |||
// IsPrintableASCII checks if the string contains printable ASCII chars only. Empty string is valid. | |||
func IsPrintableASCII(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -465,7 +465,7 @@ func IsPrintableASCII(str string) bool { | |||
return rxPrintableASCII.MatchString(str) | |||
} | |||
// IsFullWidth check if the string contains any full-width chars. Empty string is valid. | |||
// IsFullWidth checks if the string contains any full-width chars. Empty string is valid. | |||
func IsFullWidth(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -473,7 +473,7 @@ func IsFullWidth(str string) bool { | |||
return rxFullWidth.MatchString(str) | |||
} | |||
// IsHalfWidth check if the string contains any half-width chars. Empty string is valid. | |||
// IsHalfWidth checks if the string contains any half-width chars. Empty string is valid. | |||
func IsHalfWidth(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -481,7 +481,7 @@ func IsHalfWidth(str string) bool { | |||
return rxHalfWidth.MatchString(str) | |||
} | |||
// IsVariableWidth check if the string contains a mixture of full and half-width chars. Empty string is valid. | |||
// IsVariableWidth checks if the string contains a mixture of full and half-width chars. Empty string is valid. | |||
func IsVariableWidth(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -489,12 +489,12 @@ func IsVariableWidth(str string) bool { | |||
return rxHalfWidth.MatchString(str) && rxFullWidth.MatchString(str) | |||
} | |||
// IsBase64 check if a string is base64 encoded. | |||
// IsBase64 checks if a string is base64 encoded. | |||
func IsBase64(str string) bool { | |||
return rxBase64.MatchString(str) | |||
} | |||
// IsFilePath check is a string is Win or Unix file path and returns it's type. | |||
// IsFilePath checks is a string is Win or Unix file path and returns it's type. | |||
func IsFilePath(str string) (bool, int) { | |||
if rxWinPath.MatchString(str) { | |||
//check windows path limit see: | |||
@@ -686,25 +686,25 @@ func IsPort(str string) bool { | |||
return false | |||
} | |||
// IsIPv4 check if the string is an IP version 4. | |||
// IsIPv4 checks if the string is an IP version 4. | |||
func IsIPv4(str string) bool { | |||
ip := net.ParseIP(str) | |||
return ip != nil && strings.Contains(str, ".") | |||
} | |||
// IsIPv6 check if the string is an IP version 6. | |||
// IsIPv6 checks if the string is an IP version 6. | |||
func IsIPv6(str string) bool { | |||
ip := net.ParseIP(str) | |||
return ip != nil && strings.Contains(str, ":") | |||
} | |||
// IsCIDR check if the string is an valid CIDR notiation (IPV4 & IPV6) | |||
// IsCIDR checks if the string is an valid CIDR notiation (IPV4 & IPV6) | |||
func IsCIDR(str string) bool { | |||
_, _, err := net.ParseCIDR(str) | |||
return err == nil | |||
} | |||
// IsMAC check if a string is valid MAC address. | |||
// IsMAC checks if a string is valid MAC address. | |||
// Possible MAC formats: | |||
// 01:23:45:67:89:ab | |||
// 01:23:45:67:89:ab:cd:ef | |||
@@ -722,27 +722,70 @@ func IsHost(str string) bool { | |||
return IsIP(str) || IsDNSName(str) | |||
} | |||
// IsMongoID check if the string is a valid hex-encoded representation of a MongoDB ObjectId. | |||
// IsMongoID checks if the string is a valid hex-encoded representation of a MongoDB ObjectId. | |||
func IsMongoID(str string) bool { | |||
return rxHexadecimal.MatchString(str) && (len(str) == 24) | |||
} | |||
// IsLatitude check if a string is valid latitude. | |||
// IsLatitude checks if a string is valid latitude. | |||
func IsLatitude(str string) bool { | |||
return rxLatitude.MatchString(str) | |||
} | |||
// IsLongitude check if a string is valid longitude. | |||
// IsLongitude checks if a string is valid longitude. | |||
func IsLongitude(str string) bool { | |||
return rxLongitude.MatchString(str) | |||
} | |||
// IsIMEI check if a string is valid IMEI | |||
// IsIMEI checks if a string is valid IMEI | |||
func IsIMEI(str string) bool { | |||
return rxIMEI.MatchString(str) | |||
} | |||
// IsRsaPublicKey check if a string is valid public key with provided length | |||
// IsIMSI checks if a string is valid IMSI | |||
func IsIMSI(str string) bool { | |||
if !rxIMSI.MatchString(str) { | |||
return false | |||
} | |||
mcc, err := strconv.ParseInt(str[0:3], 10, 32) | |||
if err != nil { | |||
return false | |||
} | |||
switch mcc { | |||
case 202, 204, 206, 208, 212, 213, 214, 216, 218, 219: | |||
case 220, 221, 222, 226, 228, 230, 231, 232, 234, 235: | |||
case 238, 240, 242, 244, 246, 247, 248, 250, 255, 257: | |||
case 259, 260, 262, 266, 268, 270, 272, 274, 276, 278: | |||
case 280, 282, 283, 284, 286, 288, 289, 290, 292, 293: | |||
case 294, 295, 297, 302, 308, 310, 311, 312, 313, 314: | |||
case 315, 316, 330, 332, 334, 338, 340, 342, 344, 346: | |||
case 348, 350, 352, 354, 356, 358, 360, 362, 363, 364: | |||
case 365, 366, 368, 370, 372, 374, 376, 400, 401, 402: | |||
case 404, 405, 406, 410, 412, 413, 414, 415, 416, 417: | |||
case 418, 419, 420, 421, 422, 424, 425, 426, 427, 428: | |||
case 429, 430, 431, 432, 434, 436, 437, 438, 440, 441: | |||
case 450, 452, 454, 455, 456, 457, 460, 461, 466, 467: | |||
case 470, 472, 502, 505, 510, 514, 515, 520, 525, 528: | |||
case 530, 536, 537, 539, 540, 541, 542, 543, 544, 545: | |||
case 546, 547, 548, 549, 550, 551, 552, 553, 554, 555: | |||
case 602, 603, 604, 605, 606, 607, 608, 609, 610, 611: | |||
case 612, 613, 614, 615, 616, 617, 618, 619, 620, 621: | |||
case 622, 623, 624, 625, 626, 627, 628, 629, 630, 631: | |||
case 632, 633, 634, 635, 636, 637, 638, 639, 640, 641: | |||
case 642, 643, 645, 646, 647, 648, 649, 650, 651, 652: | |||
case 653, 654, 655, 657, 658, 659, 702, 704, 706, 708: | |||
case 710, 712, 714, 716, 722, 724, 730, 732, 734, 736: | |||
case 738, 740, 742, 744, 746, 748, 750, 995: | |||
return true | |||
default: | |||
return false | |||
} | |||
return true | |||
} | |||
// IsRsaPublicKey checks if a string is valid public key with provided length | |||
func IsRsaPublicKey(str string, keylen int) bool { | |||
bb := bytes.NewBufferString(str) | |||
pemBytes, err := ioutil.ReadAll(bb) | |||
@@ -796,7 +839,7 @@ func toJSONName(tag string) string { | |||
return name | |||
} | |||
func PrependPathToErrors(err error, path string) error { | |||
func prependPathToErrors(err error, path string) error { | |||
switch err2 := err.(type) { | |||
case Error: | |||
err2.Path = append([]string{path}, err2.Path...) | |||
@@ -804,13 +847,18 @@ func PrependPathToErrors(err error, path string) error { | |||
case Errors: | |||
errors := err2.Errors() | |||
for i, err3 := range errors { | |||
errors[i] = PrependPathToErrors(err3, path) | |||
errors[i] = prependPathToErrors(err3, path) | |||
} | |||
return err2 | |||
} | |||
return err | |||
} | |||
// ValidateArray performs validation according to condition iterator that validates every element of the array | |||
func ValidateArray(array []interface{}, iterator ConditionIterator) bool { | |||
return Every(array, iterator) | |||
} | |||
// ValidateMap use validation map for fields. | |||
// result will be equal to `false` if there are any errors. | |||
// s is the map containing the data to be validated. | |||
@@ -832,7 +880,7 @@ func ValidateMap(s map[string]interface{}, m map[string]interface{}) (bool, erro | |||
presentResult = false | |||
var err error | |||
err = fmt.Errorf("all map keys has to be present in the validation map; got %s", key) | |||
err = PrependPathToErrors(err, key) | |||
err = prependPathToErrors(err, key) | |||
errs = append(errs, err) | |||
} | |||
valueField := reflect.ValueOf(value) | |||
@@ -846,13 +894,13 @@ func ValidateMap(s map[string]interface{}, m map[string]interface{}) (bool, erro | |||
if v, ok := value.(map[string]interface{}); !ok { | |||
mapResult = false | |||
err = fmt.Errorf("map validator has to be for the map type only; got %s", valueField.Type().String()) | |||
err = PrependPathToErrors(err, key) | |||
err = prependPathToErrors(err, key) | |||
errs = append(errs, err) | |||
} else { | |||
mapResult, err = ValidateMap(v, subValidator) | |||
if err != nil { | |||
mapResult = false | |||
err = PrependPathToErrors(err, key) | |||
err = prependPathToErrors(err, key) | |||
errs = append(errs, err) | |||
} | |||
} | |||
@@ -863,7 +911,7 @@ func ValidateMap(s map[string]interface{}, m map[string]interface{}) (bool, erro | |||
var err error | |||
structResult, err = ValidateStruct(valueField.Interface()) | |||
if err != nil { | |||
err = PrependPathToErrors(err, key) | |||
err = prependPathToErrors(err, key) | |||
errs = append(errs, err) | |||
} | |||
} | |||
@@ -884,13 +932,13 @@ func ValidateMap(s map[string]interface{}, m map[string]interface{}) (bool, erro | |||
default: | |||
typeResult = false | |||
err = fmt.Errorf("map validator has to be either map[string]interface{} or string; got %s", valueField.Type().String()) | |||
err = PrependPathToErrors(err, key) | |||
err = prependPathToErrors(err, key) | |||
errs = append(errs, err) | |||
} | |||
result = result && presentResult && typeResult && resultField && structResult && mapResult | |||
index++ | |||
} | |||
// check required keys | |||
// checks required keys | |||
requiredResult := true | |||
for key, value := range m { | |||
if schema, ok := value.(string); ok { | |||
@@ -949,7 +997,7 @@ func ValidateStruct(s interface{}) (bool, error) { | |||
var err error | |||
structResult, err = ValidateStruct(valueField.Interface()) | |||
if err != nil { | |||
err = PrependPathToErrors(err, typeField.Name) | |||
err = prependPathToErrors(err, typeField.Name) | |||
errs = append(errs, err) | |||
} | |||
} | |||
@@ -986,6 +1034,42 @@ func ValidateStruct(s interface{}) (bool, error) { | |||
return result, err | |||
} | |||
// ValidateStructAsync performs async validation of the struct and returns results through the channels | |||
func ValidateStructAsync(s interface{}) (<-chan bool, <-chan error) { | |||
res := make(chan bool) | |||
errors := make(chan error) | |||
go func() { | |||
defer close(res) | |||
defer close(errors) | |||
isValid, isFailed := ValidateStruct(s) | |||
res <- isValid | |||
errors <- isFailed | |||
}() | |||
return res, errors | |||
} | |||
// ValidateMapAsync performs async validation of the map and returns results through the channels | |||
func ValidateMapAsync(s map[string]interface{}, m map[string]interface{}) (<-chan bool, <-chan error) { | |||
res := make(chan bool) | |||
errors := make(chan error) | |||
go func() { | |||
defer close(res) | |||
defer close(errors) | |||
isValid, isFailed := ValidateMap(s, m) | |||
res <- isValid | |||
errors <- isFailed | |||
}() | |||
return res, errors | |||
} | |||
// parseTagIntoMap parses a struct tag `valid:required~Some error message,length(2|3)` into map[string]string{"required": "Some error message", "length(2|3)": ""} | |||
func parseTagIntoMap(tag string) tagOptionsMap { | |||
optionsMap := make(tagOptionsMap) | |||
@@ -1034,12 +1118,12 @@ func IsSSN(str string) bool { | |||
return rxSSN.MatchString(str) | |||
} | |||
// IsSemver check if string is valid semantic version | |||
// IsSemver checks if string is valid semantic version | |||
func IsSemver(str string) bool { | |||
return rxSemver.MatchString(str) | |||
} | |||
// IsType check if interface is of some type | |||
// IsType checks if interface is of some type | |||
func IsType(v interface{}, params ...string) bool { | |||
if len(params) == 1 { | |||
typ := params[0] | |||
@@ -1048,13 +1132,13 @@ func IsType(v interface{}, params ...string) bool { | |||
return false | |||
} | |||
// IsTime check if string is valid according to given format | |||
// IsTime checks if string is valid according to given format | |||
func IsTime(str string, format string) bool { | |||
_, err := time.Parse(format, str) | |||
return err == nil | |||
} | |||
// IsUnixTime check if string is valid unix timestamp value | |||
// IsUnixTime checks if string is valid unix timestamp value | |||
func IsUnixTime(str string) bool { | |||
if _, err := strconv.Atoi(str); err == nil { | |||
return true | |||
@@ -1062,17 +1146,17 @@ func IsUnixTime(str string) bool { | |||
return false | |||
} | |||
// IsRFC3339 check if string is valid timestamp value according to RFC3339 | |||
// IsRFC3339 checks if string is valid timestamp value according to RFC3339 | |||
func IsRFC3339(str string) bool { | |||
return IsTime(str, time.RFC3339) | |||
} | |||
// IsRFC3339WithoutZone check if string is valid timestamp value according to RFC3339 which excludes the timezone. | |||
// IsRFC3339WithoutZone checks if string is valid timestamp value according to RFC3339 which excludes the timezone. | |||
func IsRFC3339WithoutZone(str string) bool { | |||
return IsTime(str, RF3339WithoutZone) | |||
return IsTime(str, rfc3339WithoutZone) | |||
} | |||
// IsISO4217 check if string is valid ISO currency code | |||
// IsISO4217 checks if string is valid ISO currency code | |||
func IsISO4217(str string) bool { | |||
for _, currency := range ISO4217List { | |||
if str == currency { | |||
@@ -1083,7 +1167,7 @@ func IsISO4217(str string) bool { | |||
return false | |||
} | |||
// ByteLength check string's length | |||
// ByteLength checks string's length | |||
func ByteLength(str string, params ...string) bool { | |||
if len(params) == 2 { | |||
min, _ := ToInt(params[0]) | |||
@@ -1094,13 +1178,13 @@ func ByteLength(str string, params ...string) bool { | |||
return false | |||
} | |||
// RuneLength check string's length | |||
// RuneLength checks string's length | |||
// Alias for StringLength | |||
func RuneLength(str string, params ...string) bool { | |||
return StringLength(str, params...) | |||
} | |||
// IsRsaPub check whether string is valid RSA key | |||
// IsRsaPub checks whether string is valid RSA key | |||
// Alias for IsRsaPublicKey | |||
func IsRsaPub(str string, params ...string) bool { | |||
if len(params) == 1 { | |||
@@ -1120,7 +1204,7 @@ func StringMatches(s string, params ...string) bool { | |||
return false | |||
} | |||
// StringLength check string's length (including multi byte strings) | |||
// StringLength checks string's length (including multi byte strings) | |||
func StringLength(str string, params ...string) bool { | |||
if len(params) == 2 { | |||
@@ -1133,7 +1217,7 @@ func StringLength(str string, params ...string) bool { | |||
return false | |||
} | |||
// MinStringLength check string's minimum length (including multi byte strings) | |||
// MinStringLength checks string's minimum length (including multi byte strings) | |||
func MinStringLength(str string, params ...string) bool { | |||
if len(params) == 1 { | |||
@@ -1145,7 +1229,7 @@ func MinStringLength(str string, params ...string) bool { | |||
return false | |||
} | |||
// MaxStringLength check string's maximum length (including multi byte strings) | |||
// MaxStringLength checks string's maximum length (including multi byte strings) | |||
func MaxStringLength(str string, params ...string) bool { | |||
if len(params) == 1 { | |||
@@ -1157,7 +1241,7 @@ func MaxStringLength(str string, params ...string) bool { | |||
return false | |||
} | |||
// Range check string's length | |||
// Range checks string's length | |||
func Range(str string, params ...string) bool { | |||
if len(params) == 2 { | |||
value, _ := ToFloat(str) | |||
@@ -1169,6 +1253,7 @@ func Range(str string, params ...string) bool { | |||
return false | |||
} | |||
// IsInRaw checks if string is in list of allowed values | |||
func IsInRaw(str string, params ...string) bool { | |||
if len(params) == 1 { | |||
rawParams := params[0] | |||
@@ -1181,7 +1266,7 @@ func IsInRaw(str string, params ...string) bool { | |||
return false | |||
} | |||
// IsIn check if string str is a member of the set of strings params | |||
// IsIn checks if string str is a member of the set of strings params | |||
func IsIn(str string, params ...string) bool { | |||
for _, param := range params { | |||
if str == param { | |||
@@ -1219,7 +1304,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options | |||
tag := t.Tag.Get(tagName) | |||
// Check if the field should be ignored | |||
// checks if the field should be ignored | |||
switch tag { | |||
case "": | |||
if v.Kind() != reflect.Slice && v.Kind() != reflect.Map { | |||
@@ -1238,8 +1323,8 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options | |||
options = parseTagIntoMap(tag) | |||
} | |||
if !isFieldSet(v) { | |||
// an empty value is not validated, check only required | |||
if isEmptyValue(v) { | |||
// an empty value is not validated, checks only required | |||
isValid, resultErr = checkRequired(v, t, options) | |||
for key := range options { | |||
delete(options, key) | |||
@@ -1292,13 +1377,13 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options | |||
validator := validatorSpec | |||
customMsgExists := len(validatorStruct.customErrorMessage) > 0 | |||
// Check whether the tag looks like '!something' or 'something' | |||
// checks whether the tag looks like '!something' or 'something' | |||
if validator[0] == '!' { | |||
validator = validator[1:] | |||
negate = true | |||
} | |||
// Check for interface param validators | |||
// checks for interface param validators | |||
for key, value := range InterfaceParamTagRegexMap { | |||
ps := value.FindStringSubmatch(validator) | |||
if len(ps) == 0 { | |||
@@ -1331,20 +1416,20 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options | |||
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, | |||
reflect.Float32, reflect.Float64, | |||
reflect.String: | |||
// for each tag option check the map of validator functions | |||
// for each tag option checks the map of validator functions | |||
for _, validatorSpec := range optionsOrder { | |||
validatorStruct := options[validatorSpec] | |||
var negate bool | |||
validator := validatorSpec | |||
customMsgExists := len(validatorStruct.customErrorMessage) > 0 | |||
// Check whether the tag looks like '!something' or 'something' | |||
// checks whether the tag looks like '!something' or 'something' | |||
if validator[0] == '!' { | |||
validator = validator[1:] | |||
negate = true | |||
} | |||
// Check for param validators | |||
// checks for param validators | |||
for key, value := range ParamTagRegexMap { | |||
ps := value.FindStringSubmatch(validator) | |||
if len(ps) == 0 { | |||
@@ -1425,7 +1510,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options | |||
} else { | |||
resultItem, err = ValidateStruct(v.MapIndex(k).Interface()) | |||
if err != nil { | |||
err = PrependPathToErrors(err, t.Name+"."+sv[i].Interface().(string)) | |||
err = prependPathToErrors(err, t.Name+"."+sv[i].Interface().(string)) | |||
return false, err | |||
} | |||
} | |||
@@ -1445,7 +1530,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options | |||
} else { | |||
resultItem, err = ValidateStruct(v.Index(i).Interface()) | |||
if err != nil { | |||
err = PrependPathToErrors(err, t.Name+"."+strconv.Itoa(i)) | |||
err = prependPathToErrors(err, t.Name+"."+strconv.Itoa(i)) | |||
return false, err | |||
} | |||
} | |||
@@ -1459,7 +1544,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options | |||
} | |||
return ValidateStruct(v.Interface()) | |||
case reflect.Ptr: | |||
// If the value is a pointer then check its element | |||
// If the value is a pointer then checks its element | |||
if v.IsNil() { | |||
return true, nil | |||
} | |||
@@ -1475,14 +1560,26 @@ func stripParams(validatorString string) string { | |||
return paramsRegexp.ReplaceAllString(validatorString, "") | |||
} | |||
// isFieldSet returns false for nil pointers, interfaces, maps, and slices. For all other values, it returns true. | |||
func isFieldSet(v reflect.Value) bool { | |||
// isEmptyValue checks whether value empty or not | |||
func isEmptyValue(v reflect.Value) bool { | |||
switch v.Kind() { | |||
case reflect.Map, reflect.Slice, reflect.Interface, reflect.Ptr: | |||
return !v.IsNil() | |||
} | |||
return true | |||
case reflect.String, reflect.Array: | |||
return v.Len() == 0 | |||
case reflect.Map, reflect.Slice: | |||
return v.Len() == 0 || v.IsNil() | |||
case reflect.Bool: | |||
return !v.Bool() | |||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | |||
return v.Int() == 0 | |||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: | |||
return v.Uint() == 0 | |||
case reflect.Float32, reflect.Float64: | |||
return v.Float() == 0 | |||
case reflect.Interface, reflect.Ptr: | |||
return v.IsNil() | |||
} | |||
return reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface()) | |||
} | |||
// ErrorByField returns error for specified field of the struct | |||
@@ -1,20 +1,11 @@ | |||
# Archived project. No maintenance. | |||
This project is not maintained anymore and is archived. Feel free to fork and | |||
make your own changes if needed. For more detail read my blog post: [Taking an indefinite sabbatical from my projects](https://arslan.io/2018/10/09/taking-an-indefinite-sabbatical-from-my-projects/) | |||
Thanks to everyone for their valuable feedback and contributions. | |||
# Color [](https://godoc.org/github.com/fatih/color) | |||
# color [](https://github.com/fatih/color/actions) [](https://pkg.go.dev/github.com/fatih/color) | |||
Color lets you use colorized outputs in terms of [ANSI Escape | |||
Codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) in Go (Golang). It | |||
has support for Windows too! The API can be used in several ways, pick one that | |||
suits you. | |||
 | |||
 | |||
## Install | |||
@@ -3,6 +3,6 @@ module github.com/fatih/color | |||
go 1.13 | |||
require ( | |||
github.com/mattn/go-colorable v0.1.4 | |||
github.com/mattn/go-isatty v0.0.11 | |||
github.com/mattn/go-colorable v0.1.8 | |||
github.com/mattn/go-isatty v0.0.12 | |||
) |
@@ -1,8 +1,7 @@ | |||
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= | |||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | |||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | |||
github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= | |||
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= | |||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= | |||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= | |||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= | |||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= | |||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | |||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= | |||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
@@ -0,0 +1,6 @@ | |||
language: go | |||
go: | |||
- 1.6 | |||
- 1.7 | |||
- 1.8 |
@@ -0,0 +1,19 @@ | |||
Copyright (c) 2016 Felix Geisendörfer (felix@debuggable.com) | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. |
@@ -0,0 +1,10 @@ | |||
.PHONY: ci generate clean | |||
ci: clean generate | |||
go test -v ./... | |||
generate: | |||
go generate . | |||
clean: | |||
rm -rf *_generated*.go |
@@ -0,0 +1,94 @@ | |||
# httpsnoop | |||
Package httpsnoop provides an easy way to capture http related metrics (i.e. | |||
response time, bytes written, and http status code) from your application's | |||
http.Handlers. | |||
Doing this requires non-trivial wrapping of the http.ResponseWriter interface, | |||
which is also exposed for users interested in a more low-level API. | |||
[](https://godoc.org/github.com/felixge/httpsnoop) | |||
[](https://travis-ci.org/felixge/httpsnoop) | |||
## Usage Example | |||
```go | |||
// myH is your app's http handler, perhaps a http.ServeMux or similar. | |||
var myH http.Handler | |||
// wrappedH wraps myH in order to log every request. | |||
wrappedH := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | |||
m := httpsnoop.CaptureMetrics(myH, w, r) | |||
log.Printf( | |||
"%s %s (code=%d dt=%s written=%d)", | |||
r.Method, | |||
r.URL, | |||
m.Code, | |||
m.Duration, | |||
m.Written, | |||
) | |||
}) | |||
http.ListenAndServe(":8080", wrappedH) | |||
``` | |||
## Why this package exists | |||
Instrumenting an application's http.Handler is surprisingly difficult. | |||
However if you google for e.g. "capture ResponseWriter status code" you'll find | |||
lots of advise and code examples that suggest it to be a fairly trivial | |||
undertaking. Unfortunately everything I've seen so far has a high chance of | |||
breaking your application. | |||
The main problem is that a `http.ResponseWriter` often implements additional | |||
interfaces such as `http.Flusher`, `http.CloseNotifier`, `http.Hijacker`, `http.Pusher`, and | |||
`io.ReaderFrom`. So the naive approach of just wrapping `http.ResponseWriter` | |||
in your own struct that also implements the `http.ResponseWriter` interface | |||
will hide the additional interfaces mentioned above. This has a high change of | |||
introducing subtle bugs into any non-trivial application. | |||
Another approach I've seen people take is to return a struct that implements | |||
all of the interfaces above. However, that's also problematic, because it's | |||
difficult to fake some of these interfaces behaviors when the underlying | |||
`http.ResponseWriter` doesn't have an implementation. It's also dangerous, | |||
because an application may choose to operate differently, merely because it | |||
detects the presence of these additional interfaces. | |||
This package solves this problem by checking which additional interfaces a | |||
`http.ResponseWriter` implements, returning a wrapped version implementing the | |||
exact same set of interfaces. | |||
Additionally this package properly handles edge cases such as `WriteHeader` not | |||
being called, or called more than once, as well as concurrent calls to | |||
`http.ResponseWriter` methods, and even calls happening after the wrapped | |||
`ServeHTTP` has already returned. | |||
Unfortunately this package is not perfect either. It's possible that it is | |||
still missing some interfaces provided by the go core (let me know if you find | |||
one), and it won't work for applications adding their own interfaces into the | |||
mix. | |||
However, hopefully the explanation above has sufficiently scared you of rolling | |||
your own solution to this problem. httpsnoop may still break your application, | |||
but at least it tries to avoid it as much as possible. | |||
Anyway, the real problem here is that smuggling additional interfaces inside | |||
`http.ResponseWriter` is a problematic design choice, but it probably goes as | |||
deep as the Go language specification itself. But that's okay, I still prefer | |||
Go over the alternatives ;). | |||
## Performance | |||
``` | |||
BenchmarkBaseline-8 20000 94912 ns/op | |||
BenchmarkCaptureMetrics-8 20000 95461 ns/op | |||
``` | |||
As you can see, using `CaptureMetrics` on a vanilla http.Handler introduces an | |||
overhead of ~500 ns per http request on my machine. However, the margin of | |||
error appears to be larger than that, therefor it should be reasonable to | |||
assume that the overhead introduced by `CaptureMetrics` is absolutely | |||
negligible. | |||
## License | |||
MIT |
@@ -0,0 +1,84 @@ | |||
package httpsnoop | |||
import ( | |||
"io" | |||
"net/http" | |||
"sync" | |||
"time" | |||
) | |||
// Metrics holds metrics captured from CaptureMetrics. | |||
type Metrics struct { | |||
// Code is the first http response code passed to the WriteHeader func of | |||
// the ResponseWriter. If no such call is made, a default code of 200 is | |||
// assumed instead. | |||
Code int | |||
// Duration is the time it took to execute the handler. | |||
Duration time.Duration | |||
// Written is the number of bytes successfully written by the Write or | |||
// ReadFrom function of the ResponseWriter. ResponseWriters may also write | |||
// data to their underlaying connection directly (e.g. headers), but those | |||
// are not tracked. Therefor the number of Written bytes will usually match | |||
// the size of the response body. | |||
Written int64 | |||
} | |||
// CaptureMetrics wraps the given hnd, executes it with the given w and r, and | |||
// returns the metrics it captured from it. | |||
func CaptureMetrics(hnd http.Handler, w http.ResponseWriter, r *http.Request) Metrics { | |||
return CaptureMetricsFn(w, func(ww http.ResponseWriter) { | |||
hnd.ServeHTTP(ww, r) | |||
}) | |||
} | |||
// CaptureMetricsFn wraps w and calls fn with the wrapped w and returns the | |||
// resulting metrics. This is very similar to CaptureMetrics (which is just | |||
// sugar on top of this func), but is a more usable interface if your | |||
// application doesn't use the Go http.Handler interface. | |||
func CaptureMetricsFn(w http.ResponseWriter, fn func(http.ResponseWriter)) Metrics { | |||
var ( | |||
start = time.Now() | |||
m = Metrics{Code: http.StatusOK} | |||
headerWritten bool | |||
lock sync.Mutex | |||
hooks = Hooks{ | |||
WriteHeader: func(next WriteHeaderFunc) WriteHeaderFunc { | |||
return func(code int) { | |||
next(code) | |||
lock.Lock() | |||
defer lock.Unlock() | |||
if !headerWritten { | |||
m.Code = code | |||
headerWritten = true | |||
} | |||
} | |||
}, | |||
Write: func(next WriteFunc) WriteFunc { | |||
return func(p []byte) (int, error) { | |||
n, err := next(p) | |||
lock.Lock() | |||
defer lock.Unlock() | |||
m.Written += int64(n) | |||
headerWritten = true | |||
return n, err | |||
} | |||
}, | |||
ReadFrom: func(next ReadFromFunc) ReadFromFunc { | |||
return func(src io.Reader) (int64, error) { | |||
n, err := next(src) | |||
lock.Lock() | |||
defer lock.Unlock() | |||
headerWritten = true | |||
m.Written += n | |||
return n, err | |||
} | |||
}, | |||
} | |||
) | |||
fn(Wrap(w, hooks)) | |||
m.Duration = time.Since(start) | |||
return m | |||
} |
@@ -0,0 +1,10 @@ | |||
// Package httpsnoop provides an easy way to capture http related metrics (i.e. | |||
// response time, bytes written, and http status code) from your application's | |||
// http.Handlers. | |||
// | |||
// Doing this requires non-trivial wrapping of the http.ResponseWriter | |||
// interface, which is also exposed for users interested in a more low-level | |||
// API. | |||
package httpsnoop | |||
//go:generate go run codegen/main.go |
@@ -0,0 +1,3 @@ | |||
module github.com/felixge/httpsnoop | |||
go 1.13 |
@@ -0,0 +1,385 @@ | |||
// +build go1.8 | |||
// Code generated by "httpsnoop/codegen"; DO NOT EDIT | |||
package httpsnoop | |||
import ( | |||
"bufio" | |||
"io" | |||
"net" | |||
"net/http" | |||
) | |||
// HeaderFunc is part of the http.ResponseWriter interface. | |||
type HeaderFunc func() http.Header | |||
// WriteHeaderFunc is part of the http.ResponseWriter interface. | |||
type WriteHeaderFunc func(code int) | |||
// WriteFunc is part of the http.ResponseWriter interface. | |||
type WriteFunc func(b []byte) (int, error) | |||
// FlushFunc is part of the http.Flusher interface. | |||
type FlushFunc func() | |||
// CloseNotifyFunc is part of the http.CloseNotifier interface. | |||
type CloseNotifyFunc func() <-chan bool | |||
// HijackFunc is part of the http.Hijacker interface. | |||
type HijackFunc func() (net.Conn, *bufio.ReadWriter, error) | |||
// ReadFromFunc is part of the io.ReaderFrom interface. | |||
type ReadFromFunc func(src io.Reader) (int64, error) | |||
// PushFunc is part of the http.Pusher interface. | |||
type PushFunc func(target string, opts *http.PushOptions) error | |||
// Hooks defines a set of method interceptors for methods included in | |||
// http.ResponseWriter as well as some others. You can think of them as | |||
// middleware for the function calls they target. See Wrap for more details. | |||
type Hooks struct { | |||
Header func(HeaderFunc) HeaderFunc | |||
WriteHeader func(WriteHeaderFunc) WriteHeaderFunc | |||
Write func(WriteFunc) WriteFunc | |||
Flush func(FlushFunc) FlushFunc | |||
CloseNotify func(CloseNotifyFunc) CloseNotifyFunc | |||
Hijack func(HijackFunc) HijackFunc | |||
ReadFrom func(ReadFromFunc) ReadFromFunc | |||
Push func(PushFunc) PushFunc | |||
} | |||
// Wrap returns a wrapped version of w that provides the exact same interface | |||
// as w. Specifically if w implements any combination of: | |||
// | |||
// - http.Flusher | |||
// - http.CloseNotifier | |||
// - http.Hijacker | |||
// - io.ReaderFrom | |||
// - http.Pusher | |||
// | |||
// The wrapped version will implement the exact same combination. If no hooks | |||
// are set, the wrapped version also behaves exactly as w. Hooks targeting | |||
// methods not supported by w are ignored. Any other hooks will intercept the | |||
// method they target and may modify the call's arguments and/or return values. | |||
// The CaptureMetrics implementation serves as a working example for how the | |||
// hooks can be used. | |||
func Wrap(w http.ResponseWriter, hooks Hooks) http.ResponseWriter { | |||
rw := &rw{w: w, h: hooks} | |||
_, i0 := w.(http.Flusher) | |||
_, i1 := w.(http.CloseNotifier) | |||
_, i2 := w.(http.Hijacker) | |||
_, i3 := w.(io.ReaderFrom) | |||
_, i4 := w.(http.Pusher) | |||
switch { | |||
// combination 1/32 | |||
case !i0 && !i1 && !i2 && !i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
}{rw} | |||
// combination 2/32 | |||
case !i0 && !i1 && !i2 && !i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Pusher | |||
}{rw, rw} | |||
// combination 3/32 | |||
case !i0 && !i1 && !i2 && i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
io.ReaderFrom | |||
}{rw, rw} | |||
// combination 4/32 | |||
case !i0 && !i1 && !i2 && i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
io.ReaderFrom | |||
http.Pusher | |||
}{rw, rw, rw} | |||
// combination 5/32 | |||
case !i0 && !i1 && i2 && !i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Hijacker | |||
}{rw, rw} | |||
// combination 6/32 | |||
case !i0 && !i1 && i2 && !i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Hijacker | |||
http.Pusher | |||
}{rw, rw, rw} | |||
// combination 7/32 | |||
case !i0 && !i1 && i2 && i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Hijacker | |||
io.ReaderFrom | |||
}{rw, rw, rw} | |||
// combination 8/32 | |||
case !i0 && !i1 && i2 && i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Hijacker | |||
io.ReaderFrom | |||
http.Pusher | |||
}{rw, rw, rw, rw} | |||
// combination 9/32 | |||
case !i0 && i1 && !i2 && !i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
}{rw, rw} | |||
// combination 10/32 | |||
case !i0 && i1 && !i2 && !i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
http.Pusher | |||
}{rw, rw, rw} | |||
// combination 11/32 | |||
case !i0 && i1 && !i2 && i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
io.ReaderFrom | |||
}{rw, rw, rw} | |||
// combination 12/32 | |||
case !i0 && i1 && !i2 && i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
io.ReaderFrom | |||
http.Pusher | |||
}{rw, rw, rw, rw} | |||
// combination 13/32 | |||
case !i0 && i1 && i2 && !i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
http.Hijacker | |||
}{rw, rw, rw} | |||
// combination 14/32 | |||
case !i0 && i1 && i2 && !i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
http.Hijacker | |||
http.Pusher | |||
}{rw, rw, rw, rw} | |||
// combination 15/32 | |||
case !i0 && i1 && i2 && i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
http.Hijacker | |||
io.ReaderFrom | |||
}{rw, rw, rw, rw} | |||
// combination 16/32 | |||
case !i0 && i1 && i2 && i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
http.Hijacker | |||
io.ReaderFrom | |||
http.Pusher | |||
}{rw, rw, rw, rw, rw} | |||
// combination 17/32 | |||
case i0 && !i1 && !i2 && !i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
}{rw, rw} | |||
// combination 18/32 | |||
case i0 && !i1 && !i2 && !i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.Pusher | |||
}{rw, rw, rw} | |||
// combination 19/32 | |||
case i0 && !i1 && !i2 && i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
io.ReaderFrom | |||
}{rw, rw, rw} | |||
// combination 20/32 | |||
case i0 && !i1 && !i2 && i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
io.ReaderFrom | |||
http.Pusher | |||
}{rw, rw, rw, rw} | |||
// combination 21/32 | |||
case i0 && !i1 && i2 && !i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.Hijacker | |||
}{rw, rw, rw} | |||
// combination 22/32 | |||
case i0 && !i1 && i2 && !i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.Hijacker | |||
http.Pusher | |||
}{rw, rw, rw, rw} | |||
// combination 23/32 | |||
case i0 && !i1 && i2 && i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.Hijacker | |||
io.ReaderFrom | |||
}{rw, rw, rw, rw} | |||
// combination 24/32 | |||
case i0 && !i1 && i2 && i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.Hijacker | |||
io.ReaderFrom | |||
http.Pusher | |||
}{rw, rw, rw, rw, rw} | |||
// combination 25/32 | |||
case i0 && i1 && !i2 && !i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
}{rw, rw, rw} | |||
// combination 26/32 | |||
case i0 && i1 && !i2 && !i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
http.Pusher | |||
}{rw, rw, rw, rw} | |||
// combination 27/32 | |||
case i0 && i1 && !i2 && i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
io.ReaderFrom | |||
}{rw, rw, rw, rw} | |||
// combination 28/32 | |||
case i0 && i1 && !i2 && i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
io.ReaderFrom | |||
http.Pusher | |||
}{rw, rw, rw, rw, rw} | |||
// combination 29/32 | |||
case i0 && i1 && i2 && !i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
http.Hijacker | |||
}{rw, rw, rw, rw} | |||
// combination 30/32 | |||
case i0 && i1 && i2 && !i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
http.Hijacker | |||
http.Pusher | |||
}{rw, rw, rw, rw, rw} | |||
// combination 31/32 | |||
case i0 && i1 && i2 && i3 && !i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
http.Hijacker | |||
io.ReaderFrom | |||
}{rw, rw, rw, rw, rw} | |||
// combination 32/32 | |||
case i0 && i1 && i2 && i3 && i4: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
http.Hijacker | |||
io.ReaderFrom | |||
http.Pusher | |||
}{rw, rw, rw, rw, rw, rw} | |||
} | |||
panic("unreachable") | |||
} | |||
type rw struct { | |||
w http.ResponseWriter | |||
h Hooks | |||
} | |||
func (w *rw) Header() http.Header { | |||
f := w.w.(http.ResponseWriter).Header | |||
if w.h.Header != nil { | |||
f = w.h.Header(f) | |||
} | |||
return f() | |||
} | |||
func (w *rw) WriteHeader(code int) { | |||
f := w.w.(http.ResponseWriter).WriteHeader | |||
if w.h.WriteHeader != nil { | |||
f = w.h.WriteHeader(f) | |||
} | |||
f(code) | |||
} | |||
func (w *rw) Write(b []byte) (int, error) { | |||
f := w.w.(http.ResponseWriter).Write | |||
if w.h.Write != nil { | |||
f = w.h.Write(f) | |||
} | |||
return f(b) | |||
} | |||
func (w *rw) Flush() { | |||
f := w.w.(http.Flusher).Flush | |||
if w.h.Flush != nil { | |||
f = w.h.Flush(f) | |||
} | |||
f() | |||
} | |||
func (w *rw) CloseNotify() <-chan bool { | |||
f := w.w.(http.CloseNotifier).CloseNotify | |||
if w.h.CloseNotify != nil { | |||
f = w.h.CloseNotify(f) | |||
} | |||
return f() | |||
} | |||
func (w *rw) Hijack() (net.Conn, *bufio.ReadWriter, error) { | |||
f := w.w.(http.Hijacker).Hijack | |||
if w.h.Hijack != nil { | |||
f = w.h.Hijack(f) | |||
} | |||
return f() | |||
} | |||
func (w *rw) ReadFrom(src io.Reader) (int64, error) { | |||
f := w.w.(io.ReaderFrom).ReadFrom | |||
if w.h.ReadFrom != nil { | |||
f = w.h.ReadFrom(f) | |||
} | |||
return f(src) | |||
} | |||
func (w *rw) Push(target string, opts *http.PushOptions) error { | |||
f := w.w.(http.Pusher).Push | |||
if w.h.Push != nil { | |||
f = w.h.Push(f) | |||
} | |||
return f(target, opts) | |||
} |
@@ -0,0 +1,243 @@ | |||
// +build !go1.8 | |||
// Code generated by "httpsnoop/codegen"; DO NOT EDIT | |||
package httpsnoop | |||
import ( | |||
"bufio" | |||
"io" | |||
"net" | |||
"net/http" | |||
) | |||
// HeaderFunc is part of the http.ResponseWriter interface. | |||
type HeaderFunc func() http.Header | |||
// WriteHeaderFunc is part of the http.ResponseWriter interface. | |||
type WriteHeaderFunc func(code int) | |||
// WriteFunc is part of the http.ResponseWriter interface. | |||
type WriteFunc func(b []byte) (int, error) | |||
// FlushFunc is part of the http.Flusher interface. | |||
type FlushFunc func() | |||
// CloseNotifyFunc is part of the http.CloseNotifier interface. | |||
type CloseNotifyFunc func() <-chan bool | |||
// HijackFunc is part of the http.Hijacker interface. | |||
type HijackFunc func() (net.Conn, *bufio.ReadWriter, error) | |||
// ReadFromFunc is part of the io.ReaderFrom interface. | |||
type ReadFromFunc func(src io.Reader) (int64, error) | |||
// Hooks defines a set of method interceptors for methods included in | |||
// http.ResponseWriter as well as some others. You can think of them as | |||
// middleware for the function calls they target. See Wrap for more details. | |||
type Hooks struct { | |||
Header func(HeaderFunc) HeaderFunc | |||
WriteHeader func(WriteHeaderFunc) WriteHeaderFunc | |||
Write func(WriteFunc) WriteFunc | |||
Flush func(FlushFunc) FlushFunc | |||
CloseNotify func(CloseNotifyFunc) CloseNotifyFunc | |||
Hijack func(HijackFunc) HijackFunc | |||
ReadFrom func(ReadFromFunc) ReadFromFunc | |||
} | |||
// Wrap returns a wrapped version of w that provides the exact same interface | |||
// as w. Specifically if w implements any combination of: | |||
// | |||
// - http.Flusher | |||
// - http.CloseNotifier | |||
// - http.Hijacker | |||
// - io.ReaderFrom | |||
// | |||
// The wrapped version will implement the exact same combination. If no hooks | |||
// are set, the wrapped version also behaves exactly as w. Hooks targeting | |||
// methods not supported by w are ignored. Any other hooks will intercept the | |||
// method they target and may modify the call's arguments and/or return values. | |||
// The CaptureMetrics implementation serves as a working example for how the | |||
// hooks can be used. | |||
func Wrap(w http.ResponseWriter, hooks Hooks) http.ResponseWriter { | |||
rw := &rw{w: w, h: hooks} | |||
_, i0 := w.(http.Flusher) | |||
_, i1 := w.(http.CloseNotifier) | |||
_, i2 := w.(http.Hijacker) | |||
_, i3 := w.(io.ReaderFrom) | |||
switch { | |||
// combination 1/16 | |||
case !i0 && !i1 && !i2 && !i3: | |||
return struct { | |||
http.ResponseWriter | |||
}{rw} | |||
// combination 2/16 | |||
case !i0 && !i1 && !i2 && i3: | |||
return struct { | |||
http.ResponseWriter | |||
io.ReaderFrom | |||
}{rw, rw} | |||
// combination 3/16 | |||
case !i0 && !i1 && i2 && !i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.Hijacker | |||
}{rw, rw} | |||
// combination 4/16 | |||
case !i0 && !i1 && i2 && i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.Hijacker | |||
io.ReaderFrom | |||
}{rw, rw, rw} | |||
// combination 5/16 | |||
case !i0 && i1 && !i2 && !i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
}{rw, rw} | |||
// combination 6/16 | |||
case !i0 && i1 && !i2 && i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
io.ReaderFrom | |||
}{rw, rw, rw} | |||
// combination 7/16 | |||
case !i0 && i1 && i2 && !i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
http.Hijacker | |||
}{rw, rw, rw} | |||
// combination 8/16 | |||
case !i0 && i1 && i2 && i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.CloseNotifier | |||
http.Hijacker | |||
io.ReaderFrom | |||
}{rw, rw, rw, rw} | |||
// combination 9/16 | |||
case i0 && !i1 && !i2 && !i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
}{rw, rw} | |||
// combination 10/16 | |||
case i0 && !i1 && !i2 && i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
io.ReaderFrom | |||
}{rw, rw, rw} | |||
// combination 11/16 | |||
case i0 && !i1 && i2 && !i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.Hijacker | |||
}{rw, rw, rw} | |||
// combination 12/16 | |||
case i0 && !i1 && i2 && i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.Hijacker | |||
io.ReaderFrom | |||
}{rw, rw, rw, rw} | |||
// combination 13/16 | |||
case i0 && i1 && !i2 && !i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
}{rw, rw, rw} | |||
// combination 14/16 | |||
case i0 && i1 && !i2 && i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
io.ReaderFrom | |||
}{rw, rw, rw, rw} | |||
// combination 15/16 | |||
case i0 && i1 && i2 && !i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
http.Hijacker | |||
}{rw, rw, rw, rw} | |||
// combination 16/16 | |||
case i0 && i1 && i2 && i3: | |||
return struct { | |||
http.ResponseWriter | |||
http.Flusher | |||
http.CloseNotifier | |||
http.Hijacker | |||
io.ReaderFrom | |||
}{rw, rw, rw, rw, rw} | |||
} | |||
panic("unreachable") | |||
} | |||
type rw struct { | |||
w http.ResponseWriter | |||
h Hooks | |||
} | |||
func (w *rw) Header() http.Header { | |||
f := w.w.(http.ResponseWriter).Header | |||
if w.h.Header != nil { | |||
f = w.h.Header(f) | |||
} | |||
return f() | |||
} | |||
func (w *rw) WriteHeader(code int) { | |||
f := w.w.(http.ResponseWriter).WriteHeader | |||
if w.h.WriteHeader != nil { | |||
f = w.h.WriteHeader(f) | |||
} | |||
f(code) | |||
} | |||
func (w *rw) Write(b []byte) (int, error) { | |||
f := w.w.(http.ResponseWriter).Write | |||
if w.h.Write != nil { | |||
f = w.h.Write(f) | |||
} | |||
return f(b) | |||
} | |||
func (w *rw) Flush() { | |||
f := w.w.(http.Flusher).Flush | |||
if w.h.Flush != nil { | |||
f = w.h.Flush(f) | |||
} | |||
f() | |||
} | |||
func (w *rw) CloseNotify() <-chan bool { | |||
f := w.w.(http.CloseNotifier).CloseNotify | |||
if w.h.CloseNotify != nil { | |||
f = w.h.CloseNotify(f) | |||
} | |||
return f() | |||
} | |||
func (w *rw) Hijack() (net.Conn, *bufio.ReadWriter, error) { | |||
f := w.w.(http.Hijacker).Hijack | |||
if w.h.Hijack != nil { | |||
f = w.h.Hijack(f) | |||
} | |||
return f() | |||
} | |||
func (w *rw) ReadFrom(src io.Reader) (int64, error) { | |||
f := w.w.(io.ReaderFrom).ReadFrom | |||
if w.h.ReadFrom != nil { | |||
f = w.h.ReadFrom(f) | |||
} | |||
return f(src) | |||
} |
@@ -8,7 +8,7 @@ linters-settings: | |||
maligned: | |||
suggest-new: true | |||
dupl: | |||
threshold: 100 | |||
threshold: 150 | |||
goconst: | |||
min-len: 2 | |||
min-occurrences: 4 | |||
@@ -30,3 +30,16 @@ linters: | |||
- whitespace | |||
- wsl | |||
- funlen | |||
- testpackage | |||
- wrapcheck | |||
- nlreturn | |||
- gomnd | |||
- goerr113 | |||
- exhaustivestruct | |||
- errorlint | |||
- nestif | |||
- gofumpt | |||
- godot | |||
- gci | |||
- dogsled | |||
- paralleltest |
@@ -1,8 +1,11 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.13.x | |||
- 1.14.x | |||
- 1.x | |||
arch: | |||
- amd64 | |||
- ppc64le | |||
install: | |||
- go get -u gotest.tools/gotestsum | |||
language: go | |||
@@ -212,7 +212,7 @@ func (s *Spec) initialize() { | |||
} | |||
} | |||
for path, pathItem := range s.AllPaths() { | |||
s.analyzeOperations(path, &pathItem) | |||
s.analyzeOperations(path, &pathItem) //#nosec | |||
} | |||
for name, parameter := range s.spec.Parameters { | |||
@@ -277,7 +277,7 @@ func (s *Spec) analyzeOperations(path string, pi *spec.PathItem) { | |||
for i, param := range op.Parameters { | |||
refPref := slashpath.Join("/paths", jsonpointer.Escape(path), "parameters", strconv.Itoa(i)) | |||
if param.Ref.String() != "" { | |||
s.references.addParamRef(refPref, ¶m) | |||
s.references.addParamRef(refPref, ¶m) //#nosec | |||
} | |||
if param.Pattern != "" { | |||
s.patterns.addParameterPattern(refPref, param.Pattern) | |||
@@ -335,7 +335,7 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { | |||
for i, param := range op.Parameters { | |||
refPref := slashpath.Join(prefix, "parameters", strconv.Itoa(i)) | |||
if param.Ref.String() != "" { | |||
s.references.addParamRef(refPref, ¶m) | |||
s.references.addParamRef(refPref, ¶m) //#nosec | |||
} | |||
if param.Pattern != "" { | |||
s.patterns.addParameterPattern(refPref, param.Pattern) | |||
@@ -368,7 +368,7 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { | |||
for k, res := range op.Responses.StatusCodeResponses { | |||
refPref := slashpath.Join(prefix, "responses", strconv.Itoa(k)) | |||
if res.Ref.String() != "" { | |||
s.references.addResponseRef(refPref, &res) | |||
s.references.addResponseRef(refPref, &res) //#nosec | |||
} | |||
for k, v := range res.Headers { | |||
hRefPref := slashpath.Join(refPref, "headers", k) | |||
@@ -665,25 +665,25 @@ func (s *Spec) SafeParametersFor(operationID string, callmeOnError ErrorOnParamF | |||
} | |||
for _, pi := range s.spec.Paths.Paths { | |||
if pi.Get != nil && pi.Get.ID == operationID { | |||
return gatherParams(&pi, pi.Get) | |||
return gatherParams(&pi, pi.Get) //#nosec | |||
} | |||
if pi.Head != nil && pi.Head.ID == operationID { | |||
return gatherParams(&pi, pi.Head) | |||
return gatherParams(&pi, pi.Head) //#nosec | |||
} | |||
if pi.Options != nil && pi.Options.ID == operationID { | |||
return gatherParams(&pi, pi.Options) | |||
return gatherParams(&pi, pi.Options) //#nosec | |||
} | |||
if pi.Post != nil && pi.Post.ID == operationID { | |||
return gatherParams(&pi, pi.Post) | |||
return gatherParams(&pi, pi.Post) //#nosec | |||
} | |||
if pi.Patch != nil && pi.Patch.ID == operationID { | |||
return gatherParams(&pi, pi.Patch) | |||
return gatherParams(&pi, pi.Patch) //#nosec | |||
} | |||
if pi.Put != nil && pi.Put.ID == operationID { | |||
return gatherParams(&pi, pi.Put) | |||
return gatherParams(&pi, pi.Put) //#nosec | |||
} | |||
if pi.Delete != nil && pi.Delete.ID == operationID { | |||
return gatherParams(&pi, pi.Delete) | |||
return gatherParams(&pi, pi.Delete) //#nosec | |||
} | |||
} | |||
return nil | |||
@@ -17,7 +17,8 @@ environment: | |||
stack: go 1.12 | |||
test_script: | |||
- go test -v -timeout 20m ./... | |||
- echo "test disabled for now" | |||
#- go test -v -timeout 20m ./... | |||
#artifacts: | |||
# - path: '%GOPATH%\bin\*.exe' | |||
deploy: off | |||
@@ -50,7 +50,7 @@ func FixEmptyResponseDescriptions(s *spec.Swagger) { | |||
} | |||
} | |||
for k, v := range s.Responses { | |||
FixEmptyDesc(&v) | |||
FixEmptyDesc(&v) //#nosec | |||
s.Responses[k] = v | |||
} | |||
} | |||
@@ -60,7 +60,7 @@ func FixEmptyResponseDescriptions(s *spec.Swagger) { | |||
func FixEmptyDescs(rs *spec.Responses) { | |||
FixEmptyDesc(rs.Default) | |||
for k, v := range rs.StatusCodeResponses { | |||
FixEmptyDesc(&v) | |||
FixEmptyDesc(&v) //#nosec | |||
rs.StatusCodeResponses[k] = v | |||
} | |||
} | |||
@@ -156,6 +156,8 @@ func Flatten(opts FlattenOpts) error { | |||
return err | |||
} | |||
opts.Spec.reload() // re-analyze | |||
// strip current file from $ref's, so we can recognize them as proper definitions | |||
// In particular, this works around for issue go-openapi/spec#76: leading absolute file in $ref is stripped | |||
if err := normalizeRef(&opts); err != nil { | |||
@@ -778,6 +780,9 @@ func rewriteParentRef(spec *swspec.Swagger, key string, ref swspec.Ref) error { | |||
} | |||
container.Schemas[idx] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} | |||
case swspec.SchemaProperties: | |||
container[entry] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} | |||
// NOTE: can't have case *swspec.SchemaOrBool = parent in this case is *Schema | |||
default: | |||
@@ -1038,7 +1043,7 @@ func nameFromRef(ref swspec.Ref) string { | |||
return swag.ToJSONName(bn) | |||
} | |||
} | |||
return swag.ToJSONName(strings.Replace(u.Host, ".", " ", -1)) | |||
return swag.ToJSONName(strings.ReplaceAll(u.Host, ".", " ")) | |||
} | |||
func saveSchema(spec *swspec.Swagger, name string, schema *swspec.Schema) { | |||
@@ -1155,6 +1160,9 @@ func updateRef(spec interface{}, key string, ref swspec.Ref) error { | |||
} | |||
container.Schemas[idx] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} | |||
case swspec.SchemaProperties: | |||
container[entry] = swspec.Schema{SchemaProps: swspec.SchemaProps{Ref: ref}} | |||
// NOTE: can't have case *swspec.SchemaOrBool = parent in this case is *Schema | |||
default: | |||
@@ -1206,6 +1214,9 @@ func updateRefWithSchema(spec *swspec.Swagger, key string, sch *swspec.Schema) e | |||
} | |||
container.Schemas[idx] = *sch | |||
case swspec.SchemaProperties: | |||
container[entry] = *sch | |||
// NOTE: can't have case *swspec.SchemaOrBool = parent in this case is *Schema | |||
default: | |||
@@ -1741,17 +1752,21 @@ DOWNREF: | |||
// leading absolute file in $ref is stripped | |||
func normalizeRef(opts *FlattenOpts) error { | |||
debugLog("normalizeRef") | |||
opts.Spec.reload() // re-analyze | |||
altered := false | |||
for k, w := range opts.Spec.references.allRefs { | |||
if strings.HasPrefix(w.String(), opts.BasePath+definitionsPath) { // may be a mix of / and \, depending on OS | |||
// strip base path from definition | |||
debugLog("stripping absolute path for: %s", w.String()) | |||
if err := updateRef(opts.Swagger(), k, | |||
swspec.MustCreateRef(slashpath.Join(definitionsPath, slashpath.Base(w.String())))); err != nil { | |||
return err | |||
} | |||
if !strings.HasPrefix(w.String(), opts.BasePath+definitionsPath) { // may be a mix of / and \, depending on OS | |||
continue | |||
} | |||
altered = true | |||
// strip base path from definition | |||
debugLog("stripping absolute path for: %s", w.String()) | |||
if err := updateRef(opts.Swagger(), k, | |||
swspec.MustCreateRef(slashpath.Join(definitionsPath, slashpath.Base(w.String())))); err != nil { | |||
return err | |||
} | |||
} | |||
opts.Spec.reload() // re-analyze | |||
if altered { | |||
opts.Spec.reload() // re-analyze | |||
} | |||
return nil | |||
} |
@@ -1,23 +1,14 @@ | |||
module github.com/go-openapi/analysis | |||
require ( | |||
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 // indirect | |||
github.com/go-openapi/errors v0.19.3 // indirect | |||
github.com/go-openapi/jsonpointer v0.19.3 | |||
github.com/go-openapi/jsonreference v0.19.3 // indirect | |||
github.com/go-openapi/loads v0.19.0 | |||
github.com/go-openapi/spec v0.19.6 | |||
github.com/go-openapi/strfmt v0.19.4 | |||
github.com/go-openapi/swag v0.19.7 | |||
github.com/kr/pty v1.1.5 // indirect | |||
github.com/mailru/easyjson v0.7.1 // indirect | |||
github.com/stretchr/testify v1.3.0 | |||
go.mongodb.org/mongo-driver v1.3.0 // indirect | |||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect | |||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b // indirect | |||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f // indirect | |||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59 // indirect | |||
gopkg.in/yaml.v2 v2.2.8 // indirect | |||
github.com/go-openapi/errors v0.19.9 // indirect | |||
github.com/go-openapi/jsonpointer v0.19.5 | |||
github.com/go-openapi/loads v0.19.6 | |||
github.com/go-openapi/spec v0.19.15 | |||
github.com/go-openapi/strfmt v0.19.11 | |||
github.com/go-openapi/swag v0.19.12 | |||
github.com/mitchellh/mapstructure v1.4.0 // indirect | |||
github.com/stretchr/testify v1.6.1 | |||
) | |||
go 1.13 |
@@ -4,52 +4,114 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN | |||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= | |||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= | |||
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= | |||
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= | |||
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= | |||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= | |||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= | |||
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0= | |||
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= | |||
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= | |||
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= | |||
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef h1:46PFijGLmAjMPwCCCo7Jf0W6f9slllCkkv7vyc1yOSg= | |||
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= | |||
github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= | |||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= | |||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | |||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |||
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= | |||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= | |||
github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= | |||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= | |||
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= | |||
github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= | |||
github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= | |||
github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= | |||
github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= | |||
github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= | |||
github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= | |||
github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= | |||
github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= | |||
github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= | |||
github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= | |||
github.com/go-openapi/errors v0.19.3 h1:7MGZI1ibQDLasvAz8HuhvYk9eNJbJkCOXWsSjjMS+Zc= | |||
github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= | |||
github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.8 h1:doM+tQdZbUm9gydV9yR+iQNmztbjj7I3sW4sIcAwIzc= | |||
github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.9 h1:9SnKdGhiPZHF3ttwFMiCBEb8jQ4IDdrK+5+a0oTygA4= | |||
github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= | |||
github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= | |||
github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= | |||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= | |||
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= | |||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= | |||
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= | |||
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= | |||
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= | |||
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= | |||
github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= | |||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= | |||
github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= | |||
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= | |||
github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= | |||
github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= | |||
github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | |||
github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | |||
github.com/go-openapi/loads v0.19.0 h1:wCOBNscACI8L93tt5tvB2zOMkJ098XCw3fP0BY2ybDA= | |||
github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | |||
github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= | |||
github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= | |||
github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= | |||
github.com/go-openapi/loads v0.19.6 h1:6IAtnx22MNSjPocZZ2sV7EjgF6wW5rDC9r6ZkNxjiN8= | |||
github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= | |||
github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= | |||
github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= | |||
github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= | |||
github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= | |||
github.com/go-openapi/runtime v0.19.16 h1:tQMAY5s5BfmmCC31+ufDCsGrr8iO1A8UIdYfDo5ADvs= | |||
github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= | |||
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= | |||
github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= | |||
github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= | |||
github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= | |||
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= | |||
github.com/go-openapi/spec v0.19.6 h1:rMMMj8cV38KVXK7SFc+I2MWClbEfbK705+j+dyqun5g= | |||
github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | |||
github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | |||
github.com/go-openapi/spec v0.19.15 h1:uxh8miNJEfMm8l8ekpY7i39LcORm1xSRtoipEGl1JPk= | |||
github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= | |||
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | |||
github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | |||
github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= | |||
github.com/go-openapi/strfmt v0.19.2 h1:clPGfBnJohokno0e+d7hs6Yocrzjlgz6EsQSDncCRnE= | |||
github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= | |||
github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= | |||
github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= | |||
github.com/go-openapi/strfmt v0.19.4 h1:eRvaqAhpL0IL6Trh5fDsGnGhiXndzHFuA05w6sXH6/g= | |||
github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= | |||
github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= | |||
github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= | |||
github.com/go-openapi/strfmt v0.19.11 h1:0+YvbNh05rmBkgztd6zHp4OCFn7Mtu30bn46NQo2ZRw= | |||
github.com/go-openapi/strfmt v0.19.11/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= | |||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= | |||
github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= | |||
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= | |||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= | |||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= | |||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= | |||
github.com/go-openapi/swag v0.19.7 h1:VRuXN2EnMSsZdauzdss6JBC29YotDqG59BZ+tdlIL1s= | |||
github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= | |||
github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= | |||
github.com/go-openapi/swag v0.19.12 h1:Bc0bnY2c3AoF7Gc+IMIAQQsD8fLHjHpc19wXvYuayQI= | |||
github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= | |||
github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= | |||
github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= | |||
github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= | |||
github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= | |||
github.com/go-openapi/validate v0.19.12 h1:mPLM/bfbd00PGOCJlU0yJL7IulkZ+q9VjPv7U11RMQQ= | |||
github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= | |||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= | |||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= | |||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= | |||
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= | |||
@@ -80,11 +142,17 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW | |||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | |||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= | |||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | |||
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= | |||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | |||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= | |||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= | |||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= | |||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= | |||
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | |||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= | |||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= | |||
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= | |||
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= | |||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= | |||
@@ -97,27 +165,43 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | |||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= | |||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | |||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | |||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | |||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | |||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= | |||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= | |||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= | |||
github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= | |||
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= | |||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= | |||
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= | |||
github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= | |||
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= | |||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= | |||
github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= | |||
github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | |||
github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8= | |||
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | |||
github.com/mitchellh/mapstructure v1.4.0 h1:7ks8ZkOP5/ujthUsT07rNv+nkLXCQWKNHuwzOAesEks= | |||
github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | |||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= | |||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= | |||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= | |||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= | |||
github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= | |||
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= | |||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | |||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | |||
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | |||
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | |||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | |||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= | |||
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= | |||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= | |||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= | |||
@@ -129,8 +213,12 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH | |||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | |||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= | |||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | |||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | |||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= | |||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | |||
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= | |||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= | |||
github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= | |||
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= | |||
github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= | |||
go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= | |||
@@ -139,44 +227,69 @@ go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOc | |||
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | |||
go.mongodb.org/mongo-driver v1.3.0 h1:ew6uUIeJOo+qdUUv7LxFCUhtWmVv7ZV/Xuy4FAUsw2E= | |||
go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | |||
go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE= | |||
go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | |||
go.mongodb.org/mongo-driver v1.4.3 h1:moga+uhicpVshTyaqY9L23E6QqwcHRUv1sqyOsoyOO8= | |||
go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= | |||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | |||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | |||
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | |||
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= | |||
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |||
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= | |||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= | |||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= | |||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= | |||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= | |||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= | |||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | |||
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= | |||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |||
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= | |||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |||
golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |||
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |||
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |||
golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= | |||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | |||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= | |||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= | |||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | |||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= | |||
@@ -184,3 +297,12 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= | |||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= | |||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= | |||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | |||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= | |||
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
@@ -218,7 +218,7 @@ func (a *AnalyzedSchema) initializeFlags() { | |||
(a.schema.Items.Schema != nil || len(a.schema.Items.Schemas) > 0) | |||
a.hasAdditionalProps = a.schema.AdditionalProperties != nil && | |||
(a.schema.AdditionalProperties != nil || a.schema.AdditionalProperties.Allows) | |||
(a.schema.AdditionalProperties.Schema != nil || a.schema.AdditionalProperties.Allows) | |||
a.hasAdditionalItems = a.schema.AdditionalItems != nil && | |||
(a.schema.AdditionalItems.Schema != nil || a.schema.AdditionalItems.Allows) | |||
@@ -18,3 +18,24 @@ linters: | |||
- maligned | |||
- lll | |||
- gochecknoglobals | |||
- godox | |||
- gocognit | |||
- whitespace | |||
- wsl | |||
- funlen | |||
- gochecknoglobals | |||
- gochecknoinits | |||
- scopelint | |||
- wrapcheck | |||
- exhaustivestruct | |||
- exhaustive | |||
- nlreturn | |||
- testpackage | |||
- gci | |||
- gofumpt | |||
- goerr113 | |||
- gomnd | |||
- tparallel | |||
- nestif | |||
- godot | |||
- errorlint |
@@ -1,8 +1,25 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.13.x | |||
- 1.14.x | |||
- 1.x | |||
arch: | |||
- amd64 | |||
jobs: | |||
include: | |||
# only run fast tests on ppc64le | |||
- go: 1.x | |||
arch: ppc64le | |||
script: | |||
- gotestsum -f short-verbose -- ./... | |||
# include linting job, but only for latest go version and amd64 arch | |||
- go: 1.x | |||
arch: amd64 | |||
install: | |||
go get github.com/golangci/golangci-lint/cmd/golangci-lint | |||
script: | |||
- golangci-lint run --new-from-rev master | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
language: go | |||
@@ -25,6 +25,7 @@ const ( | |||
typeFailWithData = "%s in %s must be of type %s: %q" | |||
typeFailWithError = "%s in %s must be of type %s, because: %s" | |||
requiredFail = "%s in %s is required" | |||
readOnlyFail = "%s in %s is readOnly" | |||
tooLongMessage = "%s in %s should be at most %d chars long" | |||
tooShortMessage = "%s in %s should be at least %d chars long" | |||
patternFail = "%s in %s should match '%s'" | |||
@@ -41,6 +42,7 @@ const ( | |||
typeFailWithDataNoIn = "%s must be of type %s: %q" | |||
typeFailWithErrorNoIn = "%s must be of type %s, because: %s" | |||
requiredFailNoIn = "%s is required" | |||
readOnlyFailNoIn = "%s is readOnly" | |||
tooLongMessageNoIn = "%s should be at most %d chars long" | |||
tooShortMessageNoIn = "%s should be at least %d chars long" | |||
patternFailNoIn = "%s should match '%s'" | |||
@@ -91,6 +93,7 @@ const ( | |||
UnallowedPropertyCode | |||
FailedAllPatternPropsCode | |||
MultipleOfMustBePositiveCode | |||
ReadOnlyFailCode | |||
) | |||
// CompositeError is an error that groups several errors together | |||
@@ -501,6 +504,23 @@ func Required(name, in string, value interface{}) *Validation { | |||
} | |||
} | |||
// ReadOnly error for when a value is present in request | |||
func ReadOnly(name, in string, value interface{}) *Validation { | |||
var msg string | |||
if in == "" { | |||
msg = fmt.Sprintf(readOnlyFailNoIn, name) | |||
} else { | |||
msg = fmt.Sprintf(readOnlyFail, name, in) | |||
} | |||
return &Validation{ | |||
code: ReadOnlyFailCode, | |||
Name: name, | |||
In: in, | |||
Value: value, | |||
message: msg, | |||
} | |||
} | |||
// TooLong error for when a string is too long | |||
func TooLong(name, in string, max int64, value interface{}) *Validation { | |||
var msg string | |||
@@ -1,8 +1,8 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.11.x | |||
- 1.12.x | |||
- 1.14.x | |||
- 1.15.x | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
env: | |||
@@ -114,16 +114,16 @@ func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.Nam | |||
rValue := reflect.Indirect(reflect.ValueOf(node)) | |||
kind := rValue.Kind() | |||
switch kind { | |||
if rValue.Type().Implements(jsonPointableType) { | |||
r, err := node.(JSONPointable).JSONLookup(decodedToken) | |||
if err != nil { | |||
return nil, kind, err | |||
} | |||
return r, kind, nil | |||
} | |||
switch kind { | |||
case reflect.Struct: | |||
if rValue.Type().Implements(jsonPointableType) { | |||
r, err := node.(JSONPointable).JSONLookup(decodedToken) | |||
if err != nil { | |||
return nil, kind, err | |||
} | |||
return r, kind, nil | |||
} | |||
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) | |||
if !ok { | |||
return nil, kind, fmt.Errorf("object has no field %q", decodedToken) | |||
@@ -161,17 +161,17 @@ func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.Nam | |||
func setSingleImpl(node, data interface{}, decodedToken string, nameProvider *swag.NameProvider) error { | |||
rValue := reflect.Indirect(reflect.ValueOf(node)) | |||
switch rValue.Kind() { | |||
case reflect.Struct: | |||
if ns, ok := node.(JSONSetable); ok { // pointer impl | |||
return ns.JSONSet(decodedToken, data) | |||
} | |||
if ns, ok := node.(JSONSetable); ok { // pointer impl | |||
return ns.JSONSet(decodedToken, data) | |||
} | |||
if rValue.Type().Implements(jsonSetableType) { | |||
return node.(JSONSetable).JSONSet(decodedToken, data) | |||
} | |||
if rValue.Type().Implements(jsonSetableType) { | |||
return node.(JSONSetable).JSONSet(decodedToken, data) | |||
} | |||
switch rValue.Kind() { | |||
case reflect.Struct: | |||
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) | |||
if !ok { | |||
return fmt.Errorf("object has no field %q", decodedToken) | |||
@@ -270,22 +270,22 @@ func (p *Pointer) set(node, data interface{}, nameProvider *swag.NameProvider) e | |||
rValue := reflect.Indirect(reflect.ValueOf(node)) | |||
kind := rValue.Kind() | |||
switch kind { | |||
case reflect.Struct: | |||
if rValue.Type().Implements(jsonPointableType) { | |||
r, err := node.(JSONPointable).JSONLookup(decodedToken) | |||
if err != nil { | |||
return err | |||
} | |||
fld := reflect.ValueOf(r) | |||
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { | |||
node = fld.Addr().Interface() | |||
continue | |||
} | |||
node = r | |||
if rValue.Type().Implements(jsonPointableType) { | |||
r, err := node.(JSONPointable).JSONLookup(decodedToken) | |||
if err != nil { | |||
return err | |||
} | |||
fld := reflect.ValueOf(r) | |||
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { | |||
node = fld.Addr().Interface() | |||
continue | |||
} | |||
node = r | |||
continue | |||
} | |||
switch kind { | |||
case reflect.Struct: | |||
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) | |||
if !ok { | |||
return fmt.Errorf("object has no field %q", decodedToken) | |||
@@ -0,0 +1,41 @@ | |||
linters-settings: | |||
govet: | |||
check-shadowing: true | |||
golint: | |||
min-confidence: 0 | |||
gocyclo: | |||
min-complexity: 30 | |||
maligned: | |||
suggest-new: true | |||
dupl: | |||
threshold: 100 | |||
goconst: | |||
min-len: 2 | |||
min-occurrences: 4 | |||
linters: | |||
enable-all: true | |||
disable: | |||
- maligned | |||
- lll | |||
- gochecknoglobals | |||
- godox | |||
- gocognit | |||
- whitespace | |||
- wsl | |||
- funlen | |||
- gochecknoglobals | |||
- gochecknoinits | |||
- scopelint | |||
- wrapcheck | |||
- exhaustivestruct | |||
- exhaustive | |||
- nlreturn | |||
- testpackage | |||
- gci | |||
- gofumpt | |||
- goerr113 | |||
- gomnd | |||
- tparallel | |||
- nestif | |||
- godot | |||
- errorlint |
@@ -1,10 +1,19 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.11.x | |||
- 1.12.x | |||
- 1.14.x | |||
- 1.x | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
- go get gotest.tools/gotestsum | |||
jobs: | |||
include: | |||
# include linting job, but only for latest go version and amd64 arch | |||
- go: 1.x | |||
arch: amd64 | |||
install: | |||
go get github.com/golangci/golangci-lint/cmd/golangci-lint | |||
script: | |||
- golangci-lint run --new-from-rev master | |||
env: | |||
- GO111MODULE=on | |||
language: go | |||
@@ -20,3 +20,25 @@ linters: | |||
- lll | |||
- gochecknoglobals | |||
- gochecknoinits | |||
- godox | |||
- gocognit | |||
- whitespace | |||
- wsl | |||
- funlen | |||
- gochecknoglobals | |||
- gochecknoinits | |||
- scopelint | |||
- wrapcheck | |||
- exhaustivestruct | |||
- exhaustive | |||
- nlreturn | |||
- testpackage | |||
- gci | |||
- gofumpt | |||
- goerr113 | |||
- gomnd | |||
- tparallel | |||
- nestif | |||
- godot | |||
- errorlint | |||
- paralleltest |
@@ -1,11 +1,20 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.13.x | |||
- 1.14.x | |||
- 1.x | |||
install: | |||
- go get -u gotest.tools/gotestsum | |||
- go get gotest.tools/gotestsum | |||
language: go | |||
jobs: | |||
include: | |||
# include linting job, but only for latest go version and amd64 arch | |||
- go: 1.x | |||
arch: amd64 | |||
install: | |||
go get github.com/golangci/golangci-lint/cmd/golangci-lint | |||
script: | |||
- golangci-lint run --new-from-rev master | |||
notifications: | |||
slack: | |||
secure: OxkPwVp35qBTUilgWC8xykSj+sGMcj0h8IIOKD+Rflx2schZVlFfdYdyVBM+s9OqeOfvtuvnR9v1Ye2rPKAvcjWdC4LpRGUsgmItZaI6Um8Aj6+K9udCw5qrtZVfOVmRu8LieH//XznWWKdOultUuniW0MLqw5+II87Gd00RWbCGi0hk0PykHe7uK+PDA2BEbqyZ2WKKYCvfB3j+0nrFOHScXqnh0V05l2E83J4+Sgy1fsPy+1WdX58ZlNBG333ibaC1FS79XvKSmTgKRkx3+YBo97u6ZtUmJa5WZjf2OdLG3KIckGWAv6R5xgxeU31N0Ng8L332w/Edpp2O/M2bZwdnKJ8hJQikXIAQbICbr+lTDzsoNzMdEIYcHpJ5hjPbiUl3Bmd+Jnsjf5McgAZDiWIfpCKZ29tPCEkVwRsOCqkyPRMNMzHHmoja495P5jR+ODS7+J8RFg5xgcnOgpP9D4Wlhztlf5WyZMpkLxTUD+bZq2SRf50HfHFXTkfq22zPl3d1eq0yrLwh/Z/fWKkfb6SyysROL8y6s8u3dpFX1YHSg0BR6i913h4aoZw9B2BG27cafLLTwKYsp2dFo1PWl4O6u9giFJIeqwloZHLKKrwh0cBFhB7RH0I58asxkZpCH6uWjJierahmHe7iS+E6i+9oCHkOZ59hmCYNimIs3hM= | |||
@@ -1,7 +1,6 @@ | |||
# Loads OAI specs [](https://travis-ci.org/go-openapi/loads) [](https://codecov.io/gh/go-openapi/loads) [](https://slackin.goswagger.io) | |||
[](https://raw.githubusercontent.com/go-openapi/loads/master/LICENSE) [](http://godoc.org/github.com/go-openapi/loads) | |||
[](https://golangci.com) | |||
[](https://goreportcard.com/report/github.com/go-openapi/loads) | |||
Loading of OAI specification documents from local or remote locations. Supports JSON and YAML documents. |
@@ -1,11 +1,15 @@ | |||
module github.com/go-openapi/loads | |||
require ( | |||
github.com/go-openapi/analysis v0.19.10 | |||
github.com/go-openapi/spec v0.19.6 | |||
github.com/go-openapi/swag v0.19.7 | |||
github.com/stretchr/testify v1.3.0 | |||
gopkg.in/yaml.v2 v2.2.8 | |||
github.com/go-openapi/analysis v0.19.16 | |||
github.com/go-openapi/spec v0.20.0 | |||
github.com/go-openapi/strfmt v0.19.11 | |||
github.com/go-openapi/swag v0.19.12 | |||
github.com/go-openapi/validate v0.19.15 | |||
github.com/stretchr/testify v1.6.1 | |||
go.mongodb.org/mongo-driver v1.4.4 // indirect | |||
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb // indirect | |||
gopkg.in/yaml.v2 v2.4.0 | |||
) | |||
go 1.13 |
@@ -4,47 +4,121 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN | |||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= | |||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= | |||
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= | |||
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= | |||
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= | |||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= | |||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= | |||
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0= | |||
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= | |||
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= | |||
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= | |||
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef h1:46PFijGLmAjMPwCCCo7Jf0W6f9slllCkkv7vyc1yOSg= | |||
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= | |||
github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= | |||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= | |||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | |||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |||
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= | |||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= | |||
github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= | |||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= | |||
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= | |||
github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= | |||
github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= | |||
github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= | |||
github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= | |||
github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= | |||
github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE= | |||
github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= | |||
github.com/go-openapi/analysis v0.19.16 h1:Ub9e++M8sDwtHD+S587TYi+6ANBG1NRYGZDihqk0SaY= | |||
github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk= | |||
github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= | |||
github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= | |||
github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= | |||
github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= | |||
github.com/go-openapi/errors v0.19.3 h1:7MGZI1ibQDLasvAz8HuhvYk9eNJbJkCOXWsSjjMS+Zc= | |||
github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= | |||
github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.7 h1:Lcq+o0mSwCLKACMxZhreVHigB9ebghJ/lrmeaqASbjo= | |||
github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.8 h1:doM+tQdZbUm9gydV9yR+iQNmztbjj7I3sW4sIcAwIzc= | |||
github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.9 h1:9SnKdGhiPZHF3ttwFMiCBEb8jQ4IDdrK+5+a0oTygA4= | |||
github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= | |||
github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= | |||
github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= | |||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= | |||
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= | |||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= | |||
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= | |||
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= | |||
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= | |||
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= | |||
github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= | |||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= | |||
github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= | |||
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= | |||
github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= | |||
github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= | |||
github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | |||
github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | |||
github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | |||
github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= | |||
github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= | |||
github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= | |||
github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= | |||
github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= | |||
github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= | |||
github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= | |||
github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= | |||
github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= | |||
github.com/go-openapi/runtime v0.19.16 h1:tQMAY5s5BfmmCC31+ufDCsGrr8iO1A8UIdYfDo5ADvs= | |||
github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= | |||
github.com/go-openapi/runtime v0.19.24 h1:TqagMVlRAOTwllE/7hNKx6rQ10O6T8ZzeJdMjSTKaD4= | |||
github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= | |||
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= | |||
github.com/go-openapi/spec v0.19.6 h1:rMMMj8cV38KVXK7SFc+I2MWClbEfbK705+j+dyqun5g= | |||
github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= | |||
github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= | |||
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= | |||
github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | |||
github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | |||
github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= | |||
github.com/go-openapi/spec v0.20.0 h1:HGLc8AJ7ynOxwv0Lq4TsnwLsWMawHAYiJIFzbcML86I= | |||
github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= | |||
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | |||
github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | |||
github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= | |||
github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= | |||
github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= | |||
github.com/go-openapi/strfmt v0.19.4 h1:eRvaqAhpL0IL6Trh5fDsGnGhiXndzHFuA05w6sXH6/g= | |||
github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= | |||
github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= | |||
github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= | |||
github.com/go-openapi/strfmt v0.19.11 h1:0+YvbNh05rmBkgztd6zHp4OCFn7Mtu30bn46NQo2ZRw= | |||
github.com/go-openapi/strfmt v0.19.11/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= | |||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= | |||
github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= | |||
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= | |||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= | |||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= | |||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= | |||
github.com/go-openapi/swag v0.19.7 h1:VRuXN2EnMSsZdauzdss6JBC29YotDqG59BZ+tdlIL1s= | |||
github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= | |||
github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE= | |||
github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= | |||
github.com/go-openapi/swag v0.19.12 h1:Bc0bnY2c3AoF7Gc+IMIAQQsD8fLHjHpc19wXvYuayQI= | |||
github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= | |||
github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= | |||
github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= | |||
github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= | |||
github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= | |||
github.com/go-openapi/validate v0.19.12 h1:mPLM/bfbd00PGOCJlU0yJL7IulkZ+q9VjPv7U11RMQQ= | |||
github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= | |||
github.com/go-openapi/validate v0.19.15 h1:oUHZO8jD7p5oRLANlXF0U8ic9ePBUkDQyRZdN0EhL6M= | |||
github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= | |||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= | |||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= | |||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= | |||
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= | |||
@@ -75,11 +149,17 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW | |||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | |||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= | |||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | |||
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= | |||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | |||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= | |||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= | |||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= | |||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= | |||
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | |||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= | |||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= | |||
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= | |||
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= | |||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= | |||
@@ -92,27 +172,43 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | |||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= | |||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | |||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | |||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | |||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | |||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= | |||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= | |||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= | |||
github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= | |||
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= | |||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= | |||
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= | |||
github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= | |||
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= | |||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= | |||
github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= | |||
github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | |||
github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8= | |||
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | |||
github.com/mitchellh/mapstructure v1.4.0 h1:7ks8ZkOP5/ujthUsT07rNv+nkLXCQWKNHuwzOAesEks= | |||
github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= | |||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= | |||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= | |||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= | |||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= | |||
github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= | |||
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= | |||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | |||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | |||
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | |||
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | |||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | |||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= | |||
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= | |||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= | |||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= | |||
@@ -120,56 +216,91 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3 | |||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | |||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | |||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | |||
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= | |||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= | |||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | |||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= | |||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | |||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | |||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= | |||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | |||
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= | |||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= | |||
github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= | |||
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= | |||
github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= | |||
go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= | |||
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | |||
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | |||
go.mongodb.org/mongo-driver v1.3.0 h1:ew6uUIeJOo+qdUUv7LxFCUhtWmVv7ZV/Xuy4FAUsw2E= | |||
go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | |||
go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE= | |||
go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | |||
go.mongodb.org/mongo-driver v1.4.3 h1:moga+uhicpVshTyaqY9L23E6QqwcHRUv1sqyOsoyOO8= | |||
go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= | |||
go.mongodb.org/mongo-driver v1.4.4 h1:bsPHfODES+/yx2PCWzUYMH8xj6PVniPI8DQrsJuSXSs= | |||
go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= | |||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | |||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | |||
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | |||
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= | |||
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |||
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= | |||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= | |||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= | |||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= | |||
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= | |||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= | |||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= | |||
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= | |||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | |||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |||
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= | |||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |||
golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |||
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |||
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |||
golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= | |||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | |||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= | |||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= | |||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | |||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= | |||
@@ -178,3 +309,12 @@ gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= | |||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= | |||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= | |||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= | |||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | |||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= | |||
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
@@ -0,0 +1,137 @@ | |||
package loads | |||
import ( | |||
"encoding/json" | |||
"errors" | |||
"net/url" | |||
"github.com/go-openapi/spec" | |||
"github.com/go-openapi/swag" | |||
) | |||
var ( | |||
// Default chain of loaders, defined at the package level. | |||
// | |||
// By default this matches json and yaml documents. | |||
// | |||
// May be altered with AddLoader(). | |||
loaders *loader | |||
// Default loader. This expects json documents over local or http/https (no matching). | |||
defaultLoader *loader | |||
defaultMatcher DocMatcher | |||
) | |||
func init() { | |||
defaultMatcher = func(_ string) bool { return true } | |||
defaultLoader = &loader{ | |||
DocLoaderWithMatch: DocLoaderWithMatch{ | |||
Match: defaultMatcher, | |||
Fn: JSONDoc, | |||
}, | |||
} | |||
loaders = defaultLoader | |||
AddLoader(swag.YAMLMatcher, swag.YAMLDoc) | |||
// sets the global default loader for go-openapi/spec | |||
spec.PathLoader = loaders.Load | |||
} | |||
// DocLoader represents a doc loader type | |||
type DocLoader func(string) (json.RawMessage, error) | |||
// DocMatcher represents a predicate to check if a loader matches | |||
type DocMatcher func(string) bool | |||
// DocLoaderWithMatch describes a loading function for a given extension match. | |||
type DocLoaderWithMatch struct { | |||
Fn DocLoader | |||
Match DocMatcher | |||
} | |||
// NewDocLoaderWithMatch builds a DocLoaderWithMatch to be used in load options | |||
func NewDocLoaderWithMatch(fn DocLoader, matcher DocMatcher) DocLoaderWithMatch { | |||
return DocLoaderWithMatch{ | |||
Fn: fn, | |||
Match: matcher, | |||
} | |||
} | |||
type loader struct { | |||
DocLoaderWithMatch | |||
Next *loader | |||
} | |||
// WithHead adds a loader at the head of the current stack | |||
func (l *loader) WithHead(head *loader) *loader { | |||
if head == nil { | |||
return l | |||
} | |||
head.Next = l | |||
return head | |||
} | |||
// WithNext adds a loader at the trail of the current stack | |||
func (l *loader) WithNext(next *loader) *loader { | |||
l.Next = next | |||
return next | |||
} | |||
// Load the raw document from path | |||
func (l *loader) Load(path string) (json.RawMessage, error) { | |||
specURL, erp := url.Parse(path) | |||
if erp != nil { | |||
return nil, erp | |||
} | |||
var lastErr error = errors.New("no loader matched") // default error if no match was found | |||
for ldr := l; ldr != nil; ldr = ldr.Next { | |||
if ldr.Match != nil && !ldr.Match(specURL.Path) { | |||
continue | |||
} | |||
// try then move to next one if there is an error | |||
b, err := ldr.Fn(path) | |||
if err == nil { | |||
return b, nil | |||
} | |||
lastErr = err | |||
} | |||
return nil, lastErr | |||
} | |||
// JSONDoc loads a json document from either a file or a remote url | |||
func JSONDoc(path string) (json.RawMessage, error) { | |||
data, err := swag.LoadFromFileOrHTTP(path) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return json.RawMessage(data), nil | |||
} | |||
// AddLoader for a document, executed before other previously set loaders. | |||
// | |||
// This sets the configuration at the package level. | |||
// | |||
// The default initial loader at the package level assumes a JSON document. | |||
// | |||
// NOTE: | |||
// * this updates the default loader used by github.com/go-openapi/spec | |||
// * since this sets package level globals, you shouln't call this concurrently | |||
// | |||
func AddLoader(predicate DocMatcher, load DocLoader) { | |||
loaders = loaders.WithHead(&loader{ | |||
DocLoaderWithMatch: DocLoaderWithMatch{ | |||
Match: predicate, | |||
Fn: load, | |||
}, | |||
}) | |||
// sets the global default loader for go-openapi/spec | |||
spec.PathLoader = loaders.Load | |||
} |
@@ -0,0 +1,60 @@ | |||
package loads | |||
type options struct { | |||
loader *loader | |||
} | |||
func defaultOptions() *options { | |||
return &options{ | |||
loader: loaders, | |||
} | |||
} | |||
func loaderFromOptions(options []LoaderOption) *loader { | |||
opts := defaultOptions() | |||
for _, apply := range options { | |||
apply(opts) | |||
} | |||
return opts.loader | |||
} | |||
// LoaderOption allows to fine-tune the spec loader behavior | |||
type LoaderOption func(*options) | |||
// WithDocLoader sets a custom loader for loading specs | |||
func WithDocLoader(l DocLoader) LoaderOption { | |||
return func(opt *options) { | |||
if l == nil { | |||
return | |||
} | |||
opt.loader = &loader{ | |||
DocLoaderWithMatch: DocLoaderWithMatch{ | |||
Fn: l, | |||
}, | |||
} | |||
} | |||
} | |||
// WithDocLoaderMatches sets a chain of custom loaders for loading specs | |||
// for different extension matches. | |||
// | |||
// Loaders are executed in the order of provided DocLoaderWithMatch'es. | |||
func WithDocLoaderMatches(l ...DocLoaderWithMatch) LoaderOption { | |||
return func(opt *options) { | |||
var final, prev *loader | |||
for _, ldr := range l { | |||
if ldr.Fn == nil { | |||
continue | |||
} | |||
if prev == nil { | |||
final = &loader{DocLoaderWithMatch: ldr} | |||
prev = final | |||
continue | |||
} | |||
prev = prev.WithNext(&loader{DocLoaderWithMatch: ldr}) | |||
} | |||
opt.loader = final | |||
} | |||
} |
@@ -19,69 +19,16 @@ import ( | |||
"encoding/gob" | |||
"encoding/json" | |||
"fmt" | |||
"net/url" | |||
"github.com/go-openapi/analysis" | |||
"github.com/go-openapi/spec" | |||
"github.com/go-openapi/swag" | |||
) | |||
// JSONDoc loads a json document from either a file or a remote url | |||
func JSONDoc(path string) (json.RawMessage, error) { | |||
data, err := swag.LoadFromFileOrHTTP(path) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return json.RawMessage(data), nil | |||
} | |||
// DocLoader represents a doc loader type | |||
type DocLoader func(string) (json.RawMessage, error) | |||
// DocMatcher represents a predicate to check if a loader matches | |||
type DocMatcher func(string) bool | |||
var ( | |||
loaders *loader | |||
defaultLoader *loader | |||
) | |||
func init() { | |||
defaultLoader = &loader{Match: func(_ string) bool { return true }, Fn: JSONDoc} | |||
loaders = defaultLoader | |||
spec.PathLoader = loaders.Fn | |||
AddLoader(swag.YAMLMatcher, swag.YAMLDoc) | |||
gob.Register(map[string]interface{}{}) | |||
gob.Register([]interface{}{}) | |||
//gob.Register(spec.Refable{}) | |||
} | |||
// AddLoader for a document | |||
func AddLoader(predicate DocMatcher, load DocLoader) { | |||
prev := loaders | |||
loaders = &loader{ | |||
Match: predicate, | |||
Fn: load, | |||
Next: prev, | |||
} | |||
spec.PathLoader = loaders.Fn | |||
} | |||
type loader struct { | |||
Fn DocLoader | |||
Match DocMatcher | |||
Next *loader | |||
} | |||
// JSONSpec loads a spec from a json document | |||
func JSONSpec(path string) (*Document, error) { | |||
data, err := JSONDoc(path) | |||
if err != nil { | |||
return nil, err | |||
} | |||
// convert to json | |||
return Analyzed(data, "") | |||
// gob.Register(spec.Refable{}) | |||
} | |||
// Document represents a swagger spec document | |||
@@ -93,10 +40,21 @@ type Document struct { | |||
origSpec *spec.Swagger | |||
schema *spec.Schema | |||
raw json.RawMessage | |||
pathLoader *loader | |||
} | |||
// JSONSpec loads a spec from a json document | |||
func JSONSpec(path string, options ...LoaderOption) (*Document, error) { | |||
data, err := JSONDoc(path) | |||
if err != nil { | |||
return nil, err | |||
} | |||
// convert to json | |||
return Analyzed(data, "", options...) | |||
} | |||
// Embedded returns a Document based on embedded specs. No analysis is required | |||
func Embedded(orig, flat json.RawMessage) (*Document, error) { | |||
func Embedded(orig, flat json.RawMessage, options ...LoaderOption) (*Document, error) { | |||
var origSpec, flatSpec spec.Swagger | |||
if err := json.Unmarshal(orig, &origSpec); err != nil { | |||
return nil, err | |||
@@ -105,45 +63,26 @@ func Embedded(orig, flat json.RawMessage) (*Document, error) { | |||
return nil, err | |||
} | |||
return &Document{ | |||
raw: orig, | |||
origSpec: &origSpec, | |||
spec: &flatSpec, | |||
raw: orig, | |||
origSpec: &origSpec, | |||
spec: &flatSpec, | |||
pathLoader: loaderFromOptions(options), | |||
}, nil | |||
} | |||
// Spec loads a new spec document | |||
func Spec(path string) (*Document, error) { | |||
specURL, err := url.Parse(path) | |||
// Spec loads a new spec document from a local or remote path | |||
func Spec(path string, options ...LoaderOption) (*Document, error) { | |||
b, err := loaderFromOptions(options).Load(path) | |||
if err != nil { | |||
return nil, err | |||
} | |||
var lastErr error | |||
for l := loaders.Next; l != nil; l = l.Next { | |||
if loaders.Match(specURL.Path) { | |||
b, err2 := loaders.Fn(path) | |||
if err2 != nil { | |||
lastErr = err2 | |||
continue | |||
} | |||
doc, err3 := Analyzed(b, "") | |||
if err3 != nil { | |||
return nil, err3 | |||
} | |||
if doc != nil { | |||
doc.specFilePath = path | |||
} | |||
return doc, nil | |||
} | |||
} | |||
if lastErr != nil { | |||
return nil, lastErr | |||
} | |||
b, err := defaultLoader.Fn(path) | |||
document, err := Analyzed(b, "", options...) | |||
if err != nil { | |||
return nil, err | |||
} | |||
document, err := Analyzed(b, "") | |||
if document != nil { | |||
document.specFilePath = path | |||
} | |||
@@ -151,8 +90,8 @@ func Spec(path string) (*Document, error) { | |||
return document, err | |||
} | |||
// Analyzed creates a new analyzed spec document | |||
func Analyzed(data json.RawMessage, version string) (*Document, error) { | |||
// Analyzed creates a new analyzed spec document for a root json.RawMessage. | |||
func Analyzed(data json.RawMessage, version string, options ...LoaderOption) (*Document, error) { | |||
if version == "" { | |||
version = "2.0" | |||
} | |||
@@ -160,24 +99,13 @@ func Analyzed(data json.RawMessage, version string) (*Document, error) { | |||
return nil, fmt.Errorf("spec version %q is not supported", version) | |||
} | |||
raw := data | |||
trimmed := bytes.TrimSpace(data) | |||
if len(trimmed) > 0 { | |||
if trimmed[0] != '{' && trimmed[0] != '[' { | |||
yml, err := swag.BytesToYAMLDoc(trimmed) | |||
if err != nil { | |||
return nil, fmt.Errorf("analyzed: %v", err) | |||
} | |||
d, err := swag.YAMLToJSON(yml) | |||
if err != nil { | |||
return nil, fmt.Errorf("analyzed: %v", err) | |||
} | |||
raw = d | |||
} | |||
raw, err := trimData(data) // trim blanks, then convert yaml docs into json | |||
if err != nil { | |||
return nil, err | |||
} | |||
swspec := new(spec.Swagger) | |||
if err := json.Unmarshal(raw, swspec); err != nil { | |||
if err = json.Unmarshal(raw, swspec); err != nil { | |||
return nil, err | |||
} | |||
@@ -187,12 +115,38 @@ func Analyzed(data json.RawMessage, version string) (*Document, error) { | |||
} | |||
d := &Document{ | |||
Analyzer: analysis.New(swspec), | |||
schema: spec.MustLoadSwagger20Schema(), | |||
spec: swspec, | |||
raw: raw, | |||
origSpec: origsqspec, | |||
Analyzer: analysis.New(swspec), | |||
schema: spec.MustLoadSwagger20Schema(), | |||
spec: swspec, | |||
raw: raw, | |||
origSpec: origsqspec, | |||
pathLoader: loaderFromOptions(options), | |||
} | |||
return d, nil | |||
} | |||
func trimData(in json.RawMessage) (json.RawMessage, error) { | |||
trimmed := bytes.TrimSpace(in) | |||
if len(trimmed) == 0 { | |||
return in, nil | |||
} | |||
if trimmed[0] == '{' || trimmed[0] == '[' { | |||
return trimmed, nil | |||
} | |||
// assume yaml doc: convert it to json | |||
yml, err := swag.BytesToYAMLDoc(trimmed) | |||
if err != nil { | |||
return nil, fmt.Errorf("analyzed: %v", err) | |||
} | |||
d, err := swag.YAMLToJSON(yml) | |||
if err != nil { | |||
return nil, fmt.Errorf("analyzed: %v", err) | |||
} | |||
return d, nil | |||
} | |||
@@ -212,6 +166,16 @@ func (d *Document) Expanded(options ...*spec.ExpandOptions) (*Document, error) { | |||
} | |||
} | |||
if expandOptions.PathLoader == nil { | |||
if d.pathLoader != nil { | |||
// use loader from Document options | |||
expandOptions.PathLoader = d.pathLoader.Load | |||
} else { | |||
// use package level loader | |||
expandOptions.PathLoader = loaders.Load | |||
} | |||
} | |||
if err := spec.ExpandSpec(swspec, expandOptions); err != nil { | |||
return nil, err | |||
} | |||
@@ -262,7 +226,7 @@ func (d *Document) OrigSpec() *spec.Swagger { | |||
return d.origSpec | |||
} | |||
// ResetDefinitions gives a shallow copy with the models reset | |||
// ResetDefinitions gives a shallow copy with the models reset to the original spec | |||
func (d *Document) ResetDefinitions() *Document { | |||
defs := make(map[string]spec.Schema, len(d.origSpec.Definitions)) | |||
for k, v := range d.origSpec.Definitions { | |||
@@ -0,0 +1,42 @@ | |||
linters-settings: | |||
govet: | |||
check-shadowing: true | |||
golint: | |||
min-confidence: 0 | |||
gocyclo: | |||
min-complexity: 30 | |||
maligned: | |||
suggest-new: true | |||
dupl: | |||
threshold: 100 | |||
goconst: | |||
min-len: 2 | |||
min-occurrences: 4 | |||
linters: | |||
enable-all: true | |||
disable: | |||
- maligned | |||
- lll | |||
- gochecknoglobals | |||
- godox | |||
- gocognit | |||
- whitespace | |||
- wsl | |||
- funlen | |||
- gochecknoglobals | |||
- gochecknoinits | |||
- scopelint | |||
- wrapcheck | |||
- exhaustivestruct | |||
- exhaustive | |||
- nlreturn | |||
- testpackage | |||
- gci | |||
- gofumpt | |||
- goerr113 | |||
- gomnd | |||
- tparallel | |||
- nestif | |||
- godot | |||
- errorlint | |||
- noctx |
@@ -1,10 +1,19 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.13.x | |||
- 1.14.x | |||
- 1.x | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
jobs: | |||
include: | |||
# include linting job, but only for latest go version and amd64 arch | |||
- go: 1.x | |||
arch: amd64 | |||
install: | |||
go get github.com/golangci/golangci-lint/cmd/golangci-lint | |||
script: | |||
- golangci-lint run --new-from-rev master | |||
language: go | |||
notifications: | |||
slack: | |||
@@ -101,3 +101,53 @@ func (n *namedReadCloser) Read(p []byte) (int, error) { | |||
func (n *namedReadCloser) Name() string { | |||
return n.name | |||
} | |||
type TestClientRequest struct { | |||
Headers http.Header | |||
Body interface{} | |||
} | |||
func (t *TestClientRequest) SetHeaderParam(name string, values ...string) error { | |||
if t.Headers == nil { | |||
t.Headers = make(http.Header) | |||
} | |||
t.Headers.Set(name, values[0]) | |||
return nil | |||
} | |||
func (t *TestClientRequest) SetQueryParam(_ string, _ ...string) error { return nil } | |||
func (t *TestClientRequest) SetFormParam(_ string, _ ...string) error { return nil } | |||
func (t *TestClientRequest) SetPathParam(_ string, _ string) error { return nil } | |||
func (t *TestClientRequest) SetFileParam(_ string, _ ...NamedReadCloser) error { return nil } | |||
func (t *TestClientRequest) SetBodyParam(body interface{}) error { | |||
t.Body = body | |||
return nil | |||
} | |||
func (t *TestClientRequest) SetTimeout(time.Duration) error { | |||
return nil | |||
} | |||
func (t *TestClientRequest) GetQueryParams() url.Values { return nil } | |||
func (t *TestClientRequest) GetMethod() string { return "" } | |||
func (t *TestClientRequest) GetPath() string { return "" } | |||
func (t *TestClientRequest) GetBody() []byte { return nil } | |||
func (t *TestClientRequest) GetBodyParam() interface{} { | |||
return t.Body | |||
} | |||
func (t *TestClientRequest) GetFileParam() map[string][]NamedReadCloser { | |||
return nil | |||
} | |||
func (t *TestClientRequest) GetHeaderParams() http.Header { | |||
return t.Headers | |||
} |
@@ -9,6 +9,7 @@ require ( | |||
github.com/go-openapi/strfmt v0.19.5 | |||
github.com/go-openapi/swag v0.19.9 | |||
github.com/go-openapi/validate v0.19.10 | |||
github.com/opentracing/opentracing-go v1.2.0 | |||
github.com/stretchr/testify v1.6.1 | |||
gopkg.in/yaml.v2 v2.3.0 | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect | |||
@@ -168,6 +168,8 @@ github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR | |||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= | |||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= | |||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= | |||
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= | |||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= | |||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= | |||
github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= | |||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
@@ -15,6 +15,7 @@ | |||
package runtime | |||
import ( | |||
"context" | |||
"io" | |||
"net/http" | |||
@@ -101,3 +102,11 @@ type Authorizer interface { | |||
type Validatable interface { | |||
Validate(strfmt.Registry) error | |||
} | |||
// ContextValidatable types implementing this interface allow customizing their validation | |||
// this will be used instead of the reflective validation based on the spec document. | |||
// the implementations are assumed to have been generated by the swagger tool so they should | |||
// contain all the context validations obtained from the spec | |||
type ContextValidatable interface { | |||
ContextValidate(context.Context, strfmt.Registry) error | |||
} |
@@ -435,6 +435,10 @@ func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (interfa | |||
} | |||
if route.Authorizer != nil { | |||
if err := route.Authorizer.Authorize(request, usr); err != nil { | |||
if _, ok := err.(errors.Error); ok { | |||
return nil, nil, err | |||
} | |||
return nil, nil, errors.New(http.StatusForbidden, err.Error()) | |||
} | |||
} | |||
@@ -20,6 +20,9 @@ const ( | |||
// SeparatorCharacter separates path segments. | |||
SeparatorCharacter = '/' | |||
// PathParamCharacter indicates a RESTCONF path param | |||
PathParamCharacter = '=' | |||
// MaxSize is max size of records and internal slice. | |||
MaxSize = (1 << 22) - 1 | |||
) | |||
@@ -426,8 +429,9 @@ func makeRecords(srcs []Record) (statics, params []*record) { | |||
termChar := string(TerminationCharacter) | |||
paramPrefix := string(SeparatorCharacter) + string(ParamCharacter) | |||
wildcardPrefix := string(SeparatorCharacter) + string(WildcardCharacter) | |||
restconfPrefix := string(PathParamCharacter) + string(ParamCharacter) | |||
for _, r := range srcs { | |||
if strings.Contains(r.Key, paramPrefix) || strings.Contains(r.Key, wildcardPrefix) { | |||
if strings.Contains(r.Key, paramPrefix) || strings.Contains(r.Key, wildcardPrefix) ||strings.Contains(r.Key, restconfPrefix){ | |||
r.Key += termChar | |||
params = append(params, &record{Record: r}) | |||
} else { | |||
@@ -0,0 +1,90 @@ | |||
package middleware | |||
import ( | |||
"bytes" | |||
"fmt" | |||
"html/template" | |||
"net/http" | |||
"path" | |||
) | |||
// RapiDocOpts configures the RapiDoc middlewares | |||
type RapiDocOpts struct { | |||
// BasePath for the UI path, defaults to: / | |||
BasePath string | |||
// Path combines with BasePath for the full UI path, defaults to: docs | |||
Path string | |||
// SpecURL the url to find the spec for | |||
SpecURL string | |||
// RapiDocURL for the js that generates the rapidoc site, defaults to: https://cdn.jsdelivr.net/npm/rapidoc/bundles/rapidoc.standalone.js | |||
RapiDocURL string | |||
// Title for the documentation site, default to: API documentation | |||
Title string | |||
} | |||
// EnsureDefaults in case some options are missing | |||
func (r *RapiDocOpts) EnsureDefaults() { | |||
if r.BasePath == "" { | |||
r.BasePath = "/" | |||
} | |||
if r.Path == "" { | |||
r.Path = "docs" | |||
} | |||
if r.SpecURL == "" { | |||
r.SpecURL = "/swagger.json" | |||
} | |||
if r.RapiDocURL == "" { | |||
r.RapiDocURL = rapidocLatest | |||
} | |||
if r.Title == "" { | |||
r.Title = "API documentation" | |||
} | |||
} | |||
// RapiDoc creates a middleware to serve a documentation site for a swagger spec. | |||
// This allows for altering the spec before starting the http listener. | |||
// | |||
func RapiDoc(opts RapiDocOpts, next http.Handler) http.Handler { | |||
opts.EnsureDefaults() | |||
pth := path.Join(opts.BasePath, opts.Path) | |||
tmpl := template.Must(template.New("rapidoc").Parse(rapidocTemplate)) | |||
buf := bytes.NewBuffer(nil) | |||
_ = tmpl.Execute(buf, opts) | |||
b := buf.Bytes() | |||
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { | |||
if r.URL.Path == pth { | |||
rw.Header().Set("Content-Type", "text/html; charset=utf-8") | |||
rw.WriteHeader(http.StatusOK) | |||
_, _ = rw.Write(b) | |||
return | |||
} | |||
if next == nil { | |||
rw.Header().Set("Content-Type", "text/plain") | |||
rw.WriteHeader(http.StatusNotFound) | |||
_, _ = rw.Write([]byte(fmt.Sprintf("%q not found", pth))) | |||
return | |||
} | |||
next.ServeHTTP(rw, r) | |||
}) | |||
} | |||
const ( | |||
rapidocLatest = "https://unpkg.com/rapidoc/dist/rapidoc-min.js" | |||
rapidocTemplate = `<!doctype html> | |||
<html> | |||
<head> | |||
<title>{{ .Title }}</title> | |||
<meta charset="utf-8"> <!-- Important: rapi-doc uses utf8 charecters --> | |||
<script type="module" src="{{ .RapiDocURL }}"></script> | |||
</head> | |||
<body> | |||
<rapi-doc spec-url="{{ .SpecURL }}"></rapi-doc> | |||
</body> | |||
</html> | |||
` | |||
) |
@@ -22,6 +22,7 @@ import ( | |||
"strings" | |||
"github.com/go-openapi/runtime/security" | |||
"github.com/go-openapi/swag" | |||
"github.com/go-openapi/analysis" | |||
"github.com/go-openapi/errors" | |||
@@ -418,6 +419,15 @@ func (d *defaultRouteBuilder) AddRoute(method, path string, operation *spec.Oper | |||
produces := d.analyzer.ProducesFor(operation) | |||
parameters := d.analyzer.ParamsFor(method, strings.TrimPrefix(path, bp)) | |||
// add API defaults if not part of the spec | |||
if defConsumes := d.api.DefaultConsumes(); defConsumes != "" && !swag.ContainsStringsCI(consumes, defConsumes) { | |||
consumes = append(consumes, defConsumes) | |||
} | |||
if defProduces := d.api.DefaultProduces(); defProduces != "" && !swag.ContainsStringsCI(produces, defProduces) { | |||
produces = append(produces, defProduces) | |||
} | |||
record := denco.NewRecord(pathConverter.ReplaceAllString(path, ":$1"), &routeEntry{ | |||
BasePath: bp, | |||
PathPattern: path, | |||
@@ -26,3 +26,14 @@ linters: | |||
- gocognit | |||
- whitespace | |||
- wsl | |||
- wrapcheck | |||
- testpackage | |||
- nlreturn | |||
- gomnd | |||
- exhaustivestruct | |||
- goerr113 | |||
- errorlint | |||
- nestif | |||
- godot | |||
- gofumpt | |||
- paralleltest |
@@ -1,8 +1,26 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.13.x | |||
- 1.14.x | |||
- 1.x | |||
arch: | |||
- amd64 | |||
jobs: | |||
include: | |||
# only run fast tests on ppc64le | |||
- go: 1.x | |||
arch: ppc64le | |||
script: | |||
- gotestsum -f short-verbose -- ./... | |||
# include linting job, but only for latest go version and amd64 arch | |||
- go: 1.x | |||
arch: amd64 | |||
install: | |||
go get github.com/golangci/golangci-lint/cmd/golangci-lint | |||
script: | |||
- golangci-lint run --new-from-rev master | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
language: go | |||
@@ -2,9 +2,29 @@ | |||
[](https://raw.githubusercontent.com/go-openapi/spec/master/LICENSE) | |||
[](http://godoc.org/github.com/go-openapi/spec) | |||
[](https://golangci.com) | |||
[](https://goreportcard.com/report/github.com/go-openapi/spec) | |||
The object model for OpenAPI specification documents. | |||
Currently supports Swagger 2.0. | |||
### FAQ | |||
* What does this do? | |||
> 1. This package knows how to marshal and unmarshal Swagger API specifications into a golang object model | |||
> 2. It knows how to resolve $ref and expand them to make a single root documment | |||
* How does it play with the rest of the go-openapi packages ? | |||
> 1. This package is at the core of the go-openapi suite of packages and [code generator](https://github.com/go-swagger/go-swagger) | |||
> 2. There is a [spec loading package](https://github.com/go-openapi/loads) to fetch specs as JSON or YAML from local or remote locations | |||
> 3. There is a [spec validation package](https://github.com/go-openapi/validate) built on top of it | |||
> 4. There is a [spec analysis package](https://github.com/go-openapi/analysis) built on top of it, to analyze, flatten, fix and merge spec documents | |||
* Does this library support OpenAPI 3? | |||
> No. | |||
> This package currently only supports OpenAPI 2.0 (aka Swagger 2.0). | |||
> There is no plan to make it evolve toward supporting OpenAPI 3.x. | |||
> This [discussion thread](https://github.com/go-openapi/spec/issues/21) relates the full story. | |||
> | |||
> An early attempt to support Swagger 3 may be found at: https://github.com/go-openapi/spec3 |
@@ -0,0 +1,34 @@ | |||
version: "0.1.{build}" | |||
clone_folder: C:\go-openapi\spec | |||
shallow_clone: true # for startup speed | |||
pull_requests: | |||
do_not_increment_build_number: true | |||
#skip_tags: true | |||
#skip_branch_with_pr: true | |||
# appveyor.yml | |||
build: off | |||
environment: | |||
GOPATH: c:\gopath | |||
stack: go 1.12 | |||
test_script: | |||
- echo "test disabled for now" | |||
#- go test -v -timeout 20m ./... | |||
#artifacts: | |||
# - path: '%GOPATH%\bin\*.exe' | |||
deploy: off | |||
notifications: | |||
- provider: Slack | |||
incoming_webhook: https://hooks.slack.com/services/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 | |||
auth_token: | |||
secure: Sf7kZf7ZGbnwWUMpffHwMu5A0cHkLK2MYY32LNTPj4+/3qC3Ghl7+9v4TSLOqOlCwdRNjOGblAq7s+GDJed6/xgRQl1JtCi1klzZNrYX4q01pgTPvvGcwbBkIYgeMaPeIRcK9OZnud7sRXdttozgTOpytps2U6Js32ip7uj5mHSg2ub0FwoSJwlS6dbezZ8+eDhoha0F/guY99BEwx8Bd+zROrT2TFGsSGOFGN6wFc7moCqTHO/YkWib13a2QNXqOxCCVBy/lt76Wp+JkeFppjHlzs/2lP3EAk13RIUAaesdEUHvIHrzCyNJEd3/+KO2DzsWOYfpktd+KBCvgaYOsoo7ubdT3IROeAegZdCgo/6xgCEsmFc9ZcqCfN5yNx2A+BZ2Vwmpws+bQ1E1+B5HDzzaiLcYfG4X2O210QVGVDLWsv1jqD+uPYeHY2WRfh5ZsIUFvaqgUEnwHwrK44/8REAhQavt1QAj5uJpsRd7CkRVPWRNK+yIky+wgbVUFEchRNmS55E7QWf+W4+4QZkQi7vUTMc9nbTUu2Es9NfvfudOpM2wZbn98fjpb/qq/nRv6Bk+ca+7XD5/IgNLMbWp2ouDdzbiHLCOfDUiHiDJhLfFZx9Bwo7ZwfzeOlbrQX66bx7xRKYmOe4DLrXhNcpbsMa8qbfxlZRCmYbubB/Y8h4= | |||
channel: bots | |||
on_build_success: false | |||
on_build_failure: true | |||
on_build_status_changed: true |
@@ -247,9 +247,9 @@ type bintree struct { | |||
} | |||
var _bintree = &bintree{nil, map[string]*bintree{ | |||
"jsonschema-draft-04.json": &bintree{jsonschemaDraft04Json, map[string]*bintree{}}, | |||
"v2": &bintree{nil, map[string]*bintree{ | |||
"schema.json": &bintree{v2SchemaJson, map[string]*bintree{}}, | |||
"jsonschema-draft-04.json": {jsonschemaDraft04Json, map[string]*bintree{}}, | |||
"v2": {nil, map[string]*bintree{ | |||
"schema.json": {v2SchemaJson, map[string]*bintree{}}, | |||
}}, | |||
}} | |||
@@ -14,7 +14,9 @@ | |||
package spec | |||
import "sync" | |||
import ( | |||
"sync" | |||
) | |||
// ResolutionCache a cache for resolving urls | |||
type ResolutionCache interface { | |||
@@ -27,12 +29,23 @@ type simpleCache struct { | |||
store map[string]interface{} | |||
} | |||
func (s *simpleCache) ShallowClone() ResolutionCache { | |||
store := make(map[string]interface{}, len(s.store)) | |||
s.lock.RLock() | |||
for k, v := range s.store { | |||
store[k] = v | |||
} | |||
s.lock.RUnlock() | |||
return &simpleCache{ | |||
store: store, | |||
} | |||
} | |||
// Get retrieves a cached URI | |||
func (s *simpleCache) Get(uri string) (interface{}, bool) { | |||
debugLog("getting %q from resolution cache", uri) | |||
s.lock.RLock() | |||
v, ok := s.store[uri] | |||
debugLog("got %q from resolution cache: %t", uri, ok) | |||
s.lock.RUnlock() | |||
return v, ok | |||
@@ -45,16 +58,41 @@ func (s *simpleCache) Set(uri string, data interface{}) { | |||
s.lock.Unlock() | |||
} | |||
var resCache ResolutionCache | |||
var ( | |||
// resCache is a package level cache for $ref resolution and expansion. | |||
// It is initialized lazily by methods that have the need for it: no | |||
// memory is allocated unless some expander methods are called. | |||
// | |||
// It is initialized with JSON schema and swagger schema, | |||
// which do not mutate during normal operations. | |||
// | |||
// All subsequent utilizations of this cache are produced from a shallow | |||
// clone of this initial version. | |||
resCache *simpleCache | |||
onceCache sync.Once | |||
func init() { | |||
resCache = initResolutionCache() | |||
_ ResolutionCache = &simpleCache{} | |||
) | |||
// initResolutionCache initializes the URI resolution cache. To be wrapped in a sync.Once.Do call. | |||
func initResolutionCache() { | |||
resCache = defaultResolutionCache() | |||
} | |||
// initResolutionCache initializes the URI resolution cache | |||
func initResolutionCache() ResolutionCache { | |||
func defaultResolutionCache() *simpleCache { | |||
return &simpleCache{store: map[string]interface{}{ | |||
"http://swagger.io/v2/schema.json": MustLoadSwagger20Schema(), | |||
"http://json-schema.org/draft-04/schema": MustLoadJSONSchemaDraft04(), | |||
}} | |||
} | |||
func cacheOrDefault(cache ResolutionCache) ResolutionCache { | |||
onceCache.Do(initResolutionCache) | |||
if cache != nil { | |||
return cache | |||
} | |||
// get a shallow clone of the base cache with swagger and json schema | |||
return resCache.ShallowClone() | |||
} |
@@ -28,12 +28,14 @@ type ContactInfo struct { | |||
VendorExtensible | |||
} | |||
// ContactInfoProps hold the properties of a ContactInfo object | |||
type ContactInfoProps struct { | |||
Name string `json:"name,omitempty"` | |||
URL string `json:"url,omitempty"` | |||
Email string `json:"email,omitempty"` | |||
} | |||
// UnmarshalJSON hydrates ContactInfo from json | |||
func (c *ContactInfo) UnmarshalJSON(data []byte) error { | |||
if err := json.Unmarshal(data, &c.ContactInfoProps); err != nil { | |||
return err | |||
@@ -41,6 +43,7 @@ func (c *ContactInfo) UnmarshalJSON(data []byte) error { | |||
return json.Unmarshal(data, &c.VendorExtensible) | |||
} | |||
// MarshalJSON produces ContactInfo as json | |||
func (c ContactInfo) MarshalJSON() ([]byte, error) { | |||
b1, err := json.Marshal(c.ContactInfoProps) | |||
if err != nil { | |||
@@ -0,0 +1,18 @@ | |||
package spec | |||
import "errors" | |||
var ( | |||
// ErrUnknownTypeForReference indicates that a resolved reference was found in an unsupported container type | |||
ErrUnknownTypeForReference = errors.New("unknown type for the resolved reference") | |||
// ErrResolveRefNeedsAPointer indicates that a $ref target must be a valid JSON pointer | |||
ErrResolveRefNeedsAPointer = errors.New("resolve ref: target needs to be a pointer") | |||
// ErrDerefUnsupportedType indicates that a resolved reference was found in an unsupported container type. | |||
// At the moment, $ref are supported only inside: schemas, parameters, responses, path items | |||
ErrDerefUnsupportedType = errors.New("deref: unsupported type") | |||
// ErrExpandUnsupportedType indicates that $ref expansion is attempted on some invalid type | |||
ErrExpandUnsupportedType = errors.New("expand: unsupported type. Input should be of type *Parameter or *Response") | |||
) |
@@ -17,140 +17,21 @@ package spec | |||
import ( | |||
"encoding/json" | |||
"fmt" | |||
"strings" | |||
) | |||
// ExpandOptions provides options for spec expand | |||
// ExpandOptions provides options for the spec expander. | |||
type ExpandOptions struct { | |||
RelativeBase string | |||
SkipSchemas bool | |||
ContinueOnError bool | |||
AbsoluteCircularRef bool | |||
} | |||
RelativeBase string | |||
SkipSchemas bool | |||
ContinueOnError bool | |||
PathLoader func(string) (json.RawMessage, error) `json:"-"` | |||
// ResolveRefWithBase resolves a reference against a context root with preservation of base path | |||
func ResolveRefWithBase(root interface{}, ref *Ref, opts *ExpandOptions) (*Schema, error) { | |||
resolver, err := defaultSchemaLoader(root, opts, nil, nil) | |||
if err != nil { | |||
return nil, err | |||
} | |||
specBasePath := "" | |||
if opts != nil && opts.RelativeBase != "" { | |||
specBasePath, _ = absPath(opts.RelativeBase) | |||
} | |||
result := new(Schema) | |||
if err := resolver.Resolve(ref, result, specBasePath); err != nil { | |||
return nil, err | |||
} | |||
return result, nil | |||
} | |||
// ResolveRef resolves a reference against a context root | |||
// ref is guaranteed to be in root (no need to go to external files) | |||
// ResolveRef is ONLY called from the code generation module | |||
func ResolveRef(root interface{}, ref *Ref) (*Schema, error) { | |||
res, _, err := ref.GetPointer().Get(root) | |||
if err != nil { | |||
panic(err) | |||
} | |||
switch sch := res.(type) { | |||
case Schema: | |||
return &sch, nil | |||
case *Schema: | |||
return sch, nil | |||
case map[string]interface{}: | |||
b, _ := json.Marshal(sch) | |||
newSch := new(Schema) | |||
_ = json.Unmarshal(b, newSch) | |||
return newSch, nil | |||
default: | |||
return nil, fmt.Errorf("unknown type for the resolved reference") | |||
} | |||
} | |||
// ResolveParameter resolves a parameter reference against a context root | |||
func ResolveParameter(root interface{}, ref Ref) (*Parameter, error) { | |||
return ResolveParameterWithBase(root, ref, nil) | |||
} | |||
// ResolveParameterWithBase resolves a parameter reference against a context root and base path | |||
func ResolveParameterWithBase(root interface{}, ref Ref, opts *ExpandOptions) (*Parameter, error) { | |||
resolver, err := defaultSchemaLoader(root, opts, nil, nil) | |||
if err != nil { | |||
return nil, err | |||
} | |||
result := new(Parameter) | |||
if err := resolver.Resolve(&ref, result, ""); err != nil { | |||
return nil, err | |||
} | |||
return result, nil | |||
} | |||
// ResolveResponse resolves response a reference against a context root | |||
func ResolveResponse(root interface{}, ref Ref) (*Response, error) { | |||
return ResolveResponseWithBase(root, ref, nil) | |||
} | |||
// ResolveResponseWithBase resolves response a reference against a context root and base path | |||
func ResolveResponseWithBase(root interface{}, ref Ref, opts *ExpandOptions) (*Response, error) { | |||
resolver, err := defaultSchemaLoader(root, opts, nil, nil) | |||
if err != nil { | |||
return nil, err | |||
} | |||
result := new(Response) | |||
if err := resolver.Resolve(&ref, result, ""); err != nil { | |||
return nil, err | |||
} | |||
return result, nil | |||
} | |||
// ResolveItems resolves parameter items reference against a context root and base path. | |||
// | |||
// NOTE: stricly speaking, this construct is not supported by Swagger 2.0. | |||
// Similarly, $ref are forbidden in response headers. | |||
func ResolveItems(root interface{}, ref Ref, opts *ExpandOptions) (*Items, error) { | |||
resolver, err := defaultSchemaLoader(root, opts, nil, nil) | |||
if err != nil { | |||
return nil, err | |||
} | |||
basePath := "" | |||
if opts.RelativeBase != "" { | |||
basePath = opts.RelativeBase | |||
} | |||
result := new(Items) | |||
if err := resolver.Resolve(&ref, result, basePath); err != nil { | |||
return nil, err | |||
} | |||
return result, nil | |||
} | |||
// ResolvePathItem resolves response a path item against a context root and base path | |||
func ResolvePathItem(root interface{}, ref Ref, opts *ExpandOptions) (*PathItem, error) { | |||
resolver, err := defaultSchemaLoader(root, opts, nil, nil) | |||
if err != nil { | |||
return nil, err | |||
} | |||
basePath := "" | |||
if opts.RelativeBase != "" { | |||
basePath = opts.RelativeBase | |||
} | |||
result := new(PathItem) | |||
if err := resolver.Resolve(&ref, result, basePath); err != nil { | |||
return nil, err | |||
} | |||
return result, nil | |||
AbsoluteCircularRef bool | |||
} | |||
// ExpandSpec expands the references in a swagger spec | |||
func ExpandSpec(spec *Swagger, options *ExpandOptions) error { | |||
resolver, err := defaultSchemaLoader(spec, options, nil, nil) | |||
// Just in case this ever returns an error. | |||
if resolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
resolver := defaultSchemaLoader(spec, options, nil, nil) | |||
// getting the base path of the spec to adjust all subsequent reference resolutions | |||
specBasePath := "" | |||
@@ -160,9 +41,10 @@ func ExpandSpec(spec *Swagger, options *ExpandOptions) error { | |||
if options == nil || !options.SkipSchemas { | |||
for key, definition := range spec.Definitions { | |||
var def *Schema | |||
var err error | |||
if def, err = expandSchema(definition, []string{fmt.Sprintf("#/definitions/%s", key)}, resolver, specBasePath); resolver.shouldStopOnError(err) { | |||
parentRefs := make([]string, 0, 10) | |||
parentRefs = append(parentRefs, fmt.Sprintf("#/definitions/%s", key)) | |||
def, err := expandSchema(definition, parentRefs, resolver, specBasePath) | |||
if resolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
if def != nil { | |||
@@ -189,157 +71,140 @@ func ExpandSpec(spec *Swagger, options *ExpandOptions) error { | |||
if spec.Paths != nil { | |||
for key := range spec.Paths.Paths { | |||
path := spec.Paths.Paths[key] | |||
if err := expandPathItem(&path, resolver, specBasePath); resolver.shouldStopOnError(err) { | |||
pth := spec.Paths.Paths[key] | |||
if err := expandPathItem(&pth, resolver, specBasePath); resolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
spec.Paths.Paths[key] = path | |||
spec.Paths.Paths[key] = pth | |||
} | |||
} | |||
return nil | |||
} | |||
const rootBase = "root" | |||
// baseForRoot loads in the cache the root document and produces a fake "root" base path entry | |||
const rootBase = ".root" | |||
// baseForRoot loads in the cache the root document and produces a fake ".root" base path entry | |||
// for further $ref resolution | |||
// | |||
// Setting the cache is optional and this parameter may safely be left to nil. | |||
func baseForRoot(root interface{}, cache ResolutionCache) string { | |||
// cache the root document to resolve $ref's | |||
if root != nil { | |||
base, _ := absPath(rootBase) | |||
normalizedBase := normalizeAbsPath(base) | |||
debugLog("setting root doc in cache at: %s", normalizedBase) | |||
if cache == nil { | |||
cache = resCache | |||
} | |||
cache.Set(normalizedBase, root) | |||
return rootBase | |||
if root == nil { | |||
return "" | |||
} | |||
return "" | |||
// cache the root document to resolve $ref's | |||
base, _ := absPath(rootBase) | |||
normalizedBase := normalizeAbsPath(base) | |||
cache.Set(normalizedBase, root) | |||
return normalizedBase | |||
} | |||
// ExpandSchema expands the refs in the schema object with reference to the root object | |||
// go-openapi/validate uses this function | |||
// notice that it is impossible to reference a json schema in a different file other than root | |||
// ExpandSchema expands the refs in the schema object with reference to the root object. | |||
// | |||
// go-openapi/validate uses this function. | |||
// | |||
// Notice that it is impossible to reference a json schema in a different document other than root | |||
// (use ExpandSchemaWithBasePath to resolve external references). | |||
// | |||
// Setting the cache is optional and this parameter may safely be left to nil. | |||
func ExpandSchema(schema *Schema, root interface{}, cache ResolutionCache) error { | |||
cache = cacheOrDefault(cache) | |||
if root == nil { | |||
root = schema | |||
} | |||
opts := &ExpandOptions{ | |||
// when a root is specified, cache the root as an in-memory document for $ref retrieval | |||
RelativeBase: baseForRoot(root, cache), | |||
SkipSchemas: false, | |||
ContinueOnError: false, | |||
// when no base path is specified, remaining $ref (circular) are rendered with an absolute path | |||
AbsoluteCircularRef: true, | |||
} | |||
return ExpandSchemaWithBasePath(schema, cache, opts) | |||
} | |||
// ExpandSchemaWithBasePath expands the refs in the schema object, base path configured through expand options | |||
// ExpandSchemaWithBasePath expands the refs in the schema object, base path configured through expand options. | |||
// | |||
// Setting the cache is optional and this parameter may safely be left to nil. | |||
func ExpandSchemaWithBasePath(schema *Schema, cache ResolutionCache, opts *ExpandOptions) error { | |||
if schema == nil { | |||
return nil | |||
} | |||
cache = cacheOrDefault(cache) | |||
var basePath string | |||
if opts.RelativeBase != "" { | |||
basePath, _ = absPath(opts.RelativeBase) | |||
} | |||
resolver, err := defaultSchemaLoader(nil, opts, cache, nil) | |||
resolver := defaultSchemaLoader(nil, opts, cache, nil) | |||
parentRefs := make([]string, 0, 10) | |||
s, err := expandSchema(*schema, parentRefs, resolver, basePath) | |||
if err != nil { | |||
return err | |||
} | |||
refs := []string{""} | |||
var s *Schema | |||
if s, err = expandSchema(*schema, refs, resolver, basePath); err != nil { | |||
return err | |||
if s != nil { | |||
// guard for when continuing on error | |||
*schema = *s | |||
} | |||
*schema = *s | |||
return nil | |||
} | |||
func expandItems(target Schema, parentRefs []string, resolver *schemaLoader, basePath string) (*Schema, error) { | |||
if target.Items != nil { | |||
if target.Items.Schema != nil { | |||
t, err := expandSchema(*target.Items.Schema, parentRefs, resolver, basePath) | |||
if err != nil { | |||
return nil, err | |||
} | |||
*target.Items.Schema = *t | |||
if target.Items == nil { | |||
return &target, nil | |||
} | |||
// array | |||
if target.Items.Schema != nil { | |||
t, err := expandSchema(*target.Items.Schema, parentRefs, resolver, basePath) | |||
if err != nil { | |||
return nil, err | |||
} | |||
for i := range target.Items.Schemas { | |||
t, err := expandSchema(target.Items.Schemas[i], parentRefs, resolver, basePath) | |||
if err != nil { | |||
return nil, err | |||
} | |||
target.Items.Schemas[i] = *t | |||
*target.Items.Schema = *t | |||
} | |||
// tuple | |||
for i := range target.Items.Schemas { | |||
t, err := expandSchema(target.Items.Schemas[i], parentRefs, resolver, basePath) | |||
if err != nil { | |||
return nil, err | |||
} | |||
target.Items.Schemas[i] = *t | |||
} | |||
return &target, nil | |||
} | |||
func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, basePath string) (*Schema, error) { | |||
if target.Ref.String() == "" && target.Ref.IsRoot() { | |||
// normalizing is important | |||
newRef := normalizeFileRef(&target.Ref, basePath) | |||
target.Ref = *newRef | |||
return &target, nil | |||
} | |||
// change the base path of resolution when an ID is encountered | |||
// otherwise the basePath should inherit the parent's | |||
// important: ID can be relative path | |||
if target.ID != "" { | |||
debugLog("schema has ID: %s", target.ID) | |||
// handling the case when id is a folder | |||
// remember that basePath has to be a file | |||
refPath := target.ID | |||
if strings.HasSuffix(target.ID, "/") { | |||
// path.Clean here would not work correctly if basepath is http | |||
refPath = fmt.Sprintf("%s%s", refPath, "placeholder.json") | |||
} | |||
basePath = normalizePaths(refPath, basePath) | |||
basePath, _ = resolver.setSchemaID(target, target.ID, basePath) | |||
} | |||
var t *Schema | |||
// if Ref is found, everything else doesn't matter | |||
// Ref also changes the resolution scope of children expandSchema | |||
if target.Ref.String() != "" { | |||
// here the resolution scope is changed because a $ref was encountered | |||
normalizedRef := normalizeFileRef(&target.Ref, basePath) | |||
normalizedBasePath := normalizedRef.RemoteURI() | |||
if resolver.isCircular(normalizedRef, basePath, parentRefs...) { | |||
// this means there is a cycle in the recursion tree: return the Ref | |||
// - circular refs cannot be expanded. We leave them as ref. | |||
// - denormalization means that a new local file ref is set relative to the original basePath | |||
debugLog("shortcut circular ref: basePath: %s, normalizedPath: %s, normalized ref: %s", | |||
basePath, normalizedBasePath, normalizedRef.String()) | |||
if !resolver.options.AbsoluteCircularRef { | |||
target.Ref = *denormalizeFileRef(normalizedRef, normalizedBasePath, resolver.context.basePath) | |||
} else { | |||
target.Ref = *normalizedRef | |||
} | |||
return &target, nil | |||
} | |||
return expandSchemaRef(target, parentRefs, resolver, basePath) | |||
} | |||
debugLog("basePath: %s: calling Resolve with target: %#v", basePath, target) | |||
if err := resolver.Resolve(&target.Ref, &t, basePath); resolver.shouldStopOnError(err) { | |||
return nil, err | |||
for k := range target.Definitions { | |||
tt, err := expandSchema(target.Definitions[k], parentRefs, resolver, basePath) | |||
if resolver.shouldStopOnError(err) { | |||
return &target, err | |||
} | |||
if t != nil { | |||
parentRefs = append(parentRefs, normalizedRef.String()) | |||
var err error | |||
transitiveResolver, err := resolver.transitiveResolver(basePath, target.Ref) | |||
if transitiveResolver.shouldStopOnError(err) { | |||
return nil, err | |||
} | |||
basePath = resolver.updateBasePath(transitiveResolver, normalizedBasePath) | |||
return expandSchema(*t, parentRefs, transitiveResolver, basePath) | |||
if tt != nil { | |||
target.Definitions[k] = *tt | |||
} | |||
} | |||
@@ -356,15 +221,21 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba | |||
if resolver.shouldStopOnError(err) { | |||
return &target, err | |||
} | |||
target.AllOf[i] = *t | |||
if t != nil { | |||
target.AllOf[i] = *t | |||
} | |||
} | |||
for i := range target.AnyOf { | |||
t, err := expandSchema(target.AnyOf[i], parentRefs, resolver, basePath) | |||
if resolver.shouldStopOnError(err) { | |||
return &target, err | |||
} | |||
target.AnyOf[i] = *t | |||
if t != nil { | |||
target.AnyOf[i] = *t | |||
} | |||
} | |||
for i := range target.OneOf { | |||
t, err := expandSchema(target.OneOf[i], parentRefs, resolver, basePath) | |||
if resolver.shouldStopOnError(err) { | |||
@@ -374,6 +245,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba | |||
target.OneOf[i] = *t | |||
} | |||
} | |||
if target.Not != nil { | |||
t, err := expandSchema(*target.Not, parentRefs, resolver, basePath) | |||
if resolver.shouldStopOnError(err) { | |||
@@ -383,6 +255,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba | |||
*target.Not = *t | |||
} | |||
} | |||
for k := range target.Properties { | |||
t, err := expandSchema(target.Properties[k], parentRefs, resolver, basePath) | |||
if resolver.shouldStopOnError(err) { | |||
@@ -392,6 +265,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba | |||
target.Properties[k] = *t | |||
} | |||
} | |||
if target.AdditionalProperties != nil && target.AdditionalProperties.Schema != nil { | |||
t, err := expandSchema(*target.AdditionalProperties.Schema, parentRefs, resolver, basePath) | |||
if resolver.shouldStopOnError(err) { | |||
@@ -401,6 +275,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba | |||
*target.AdditionalProperties.Schema = *t | |||
} | |||
} | |||
for k := range target.PatternProperties { | |||
t, err := expandSchema(target.PatternProperties[k], parentRefs, resolver, basePath) | |||
if resolver.shouldStopOnError(err) { | |||
@@ -410,6 +285,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba | |||
target.PatternProperties[k] = *t | |||
} | |||
} | |||
for k := range target.Dependencies { | |||
if target.Dependencies[k].Schema != nil { | |||
t, err := expandSchema(*target.Dependencies[k].Schema, parentRefs, resolver, basePath) | |||
@@ -421,6 +297,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba | |||
} | |||
} | |||
} | |||
if target.AdditionalItems != nil && target.AdditionalItems.Schema != nil { | |||
t, err := expandSchema(*target.AdditionalItems.Schema, parentRefs, resolver, basePath) | |||
if resolver.shouldStopOnError(err) { | |||
@@ -430,16 +307,48 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba | |||
*target.AdditionalItems.Schema = *t | |||
} | |||
} | |||
for k := range target.Definitions { | |||
t, err := expandSchema(target.Definitions[k], parentRefs, resolver, basePath) | |||
if resolver.shouldStopOnError(err) { | |||
return &target, err | |||
} | |||
if t != nil { | |||
target.Definitions[k] = *t | |||
return &target, nil | |||
} | |||
func expandSchemaRef(target Schema, parentRefs []string, resolver *schemaLoader, basePath string) (*Schema, error) { | |||
// if a Ref is found, all sibling fields are skipped | |||
// Ref also changes the resolution scope of children expandSchema | |||
// here the resolution scope is changed because a $ref was encountered | |||
normalizedRef := normalizeFileRef(&target.Ref, basePath) | |||
normalizedBasePath := normalizedRef.RemoteURI() | |||
if resolver.isCircular(normalizedRef, basePath, parentRefs...) { | |||
// this means there is a cycle in the recursion tree: return the Ref | |||
// - circular refs cannot be expanded. We leave them as ref. | |||
// - denormalization means that a new local file ref is set relative to the original basePath | |||
debugLog("short circuit circular ref: basePath: %s, normalizedPath: %s, normalized ref: %s", | |||
basePath, normalizedBasePath, normalizedRef.String()) | |||
if !resolver.options.AbsoluteCircularRef { | |||
target.Ref = *denormalizeFileRef(normalizedRef, normalizedBasePath, resolver.context.basePath) | |||
} else { | |||
target.Ref = *normalizedRef | |||
} | |||
return &target, nil | |||
} | |||
return &target, nil | |||
var t *Schema | |||
err := resolver.Resolve(&target.Ref, &t, basePath) | |||
if resolver.shouldStopOnError(err) { | |||
return nil, err | |||
} | |||
if t == nil { | |||
// guard for when continuing on error | |||
return &target, nil | |||
} | |||
parentRefs = append(parentRefs, normalizedRef.String()) | |||
transitiveResolver := resolver.transitiveResolver(basePath, target.Ref) | |||
basePath = resolver.updateBasePath(transitiveResolver, normalizedBasePath) | |||
return expandSchema(*t, parentRefs, transitiveResolver, basePath) | |||
} | |||
func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) error { | |||
@@ -447,25 +356,24 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) | |||
return nil | |||
} | |||
parentRefs := []string{} | |||
parentRefs := make([]string, 0, 10) | |||
if err := resolver.deref(pathItem, parentRefs, basePath); resolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
if pathItem.Ref.String() != "" { | |||
transitiveResolver, err := resolver.transitiveResolver(basePath, pathItem.Ref) | |||
if transitiveResolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
transitiveResolver := resolver.transitiveResolver(basePath, pathItem.Ref) | |||
basePath = transitiveResolver.updateBasePath(resolver, basePath) | |||
resolver = transitiveResolver | |||
} | |||
pathItem.Ref = Ref{} | |||
for idx := range pathItem.Parameters { | |||
if err := expandParameterOrResponse(&(pathItem.Parameters[idx]), resolver, basePath); resolver.shouldStopOnError(err) { | |||
pathItem.Ref = Ref{} | |||
for i := range pathItem.Parameters { | |||
if err := expandParameterOrResponse(&(pathItem.Parameters[i]), resolver, basePath); resolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
} | |||
ops := []*Operation{ | |||
pathItem.Get, | |||
pathItem.Head, | |||
@@ -480,6 +388,7 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) | |||
return err | |||
} | |||
} | |||
return nil | |||
} | |||
@@ -496,42 +405,47 @@ func expandOperation(op *Operation, resolver *schemaLoader, basePath string) err | |||
op.Parameters[i] = param | |||
} | |||
if op.Responses != nil { | |||
responses := op.Responses | |||
if err := expandParameterOrResponse(responses.Default, resolver, basePath); resolver.shouldStopOnError(err) { | |||
if op.Responses == nil { | |||
return nil | |||
} | |||
responses := op.Responses | |||
if err := expandParameterOrResponse(responses.Default, resolver, basePath); resolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
for code := range responses.StatusCodeResponses { | |||
response := responses.StatusCodeResponses[code] | |||
if err := expandParameterOrResponse(&response, resolver, basePath); resolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
for code := range responses.StatusCodeResponses { | |||
response := responses.StatusCodeResponses[code] | |||
if err := expandParameterOrResponse(&response, resolver, basePath); resolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
responses.StatusCodeResponses[code] = response | |||
} | |||
responses.StatusCodeResponses[code] = response | |||
} | |||
return nil | |||
} | |||
// ExpandResponseWithRoot expands a response based on a root document, not a fetchable document | |||
// | |||
// Notice that it is impossible to reference a json schema in a different document other than root | |||
// (use ExpandResponse to resolve external references). | |||
// | |||
// Setting the cache is optional and this parameter may safely be left to nil. | |||
func ExpandResponseWithRoot(response *Response, root interface{}, cache ResolutionCache) error { | |||
cache = cacheOrDefault(cache) | |||
opts := &ExpandOptions{ | |||
RelativeBase: baseForRoot(root, cache), | |||
SkipSchemas: false, | |||
ContinueOnError: false, | |||
// when no base path is specified, remaining $ref (circular) are rendered with an absolute path | |||
AbsoluteCircularRef: true, | |||
} | |||
resolver, err := defaultSchemaLoader(root, opts, nil, nil) | |||
if err != nil { | |||
return err | |||
} | |||
resolver := defaultSchemaLoader(root, opts, cache, nil) | |||
return expandParameterOrResponse(response, resolver, opts.RelativeBase) | |||
} | |||
// ExpandResponse expands a response based on a basepath | |||
// This is the exported version of expandResponse | |||
// all refs inside response will be resolved relative to basePath | |||
// | |||
// All refs inside response will be resolved relative to basePath | |||
func ExpandResponse(response *Response, basePath string) error { | |||
var specBasePath string | |||
if basePath != "" { | |||
@@ -540,27 +454,23 @@ func ExpandResponse(response *Response, basePath string) error { | |||
opts := &ExpandOptions{ | |||
RelativeBase: specBasePath, | |||
} | |||
resolver, err := defaultSchemaLoader(nil, opts, nil, nil) | |||
if err != nil { | |||
return err | |||
} | |||
resolver := defaultSchemaLoader(nil, opts, nil, nil) | |||
return expandParameterOrResponse(response, resolver, opts.RelativeBase) | |||
} | |||
// ExpandParameterWithRoot expands a parameter based on a root document, not a fetchable document | |||
// ExpandParameterWithRoot expands a parameter based on a root document, not a fetchable document. | |||
// | |||
// Notice that it is impossible to reference a json schema in a different document other than root | |||
// (use ExpandParameter to resolve external references). | |||
func ExpandParameterWithRoot(parameter *Parameter, root interface{}, cache ResolutionCache) error { | |||
cache = cacheOrDefault(cache) | |||
opts := &ExpandOptions{ | |||
RelativeBase: baseForRoot(root, cache), | |||
SkipSchemas: false, | |||
ContinueOnError: false, | |||
// when no base path is specified, remaining $ref (circular) are rendered with an absolute path | |||
AbsoluteCircularRef: true, | |||
} | |||
resolver, err := defaultSchemaLoader(root, opts, nil, nil) | |||
if err != nil { | |||
return err | |||
} | |||
resolver := defaultSchemaLoader(root, opts, cache, nil) | |||
return expandParameterOrResponse(parameter, resolver, opts.RelativeBase) | |||
} | |||
@@ -576,17 +486,17 @@ func ExpandParameter(parameter *Parameter, basePath string) error { | |||
opts := &ExpandOptions{ | |||
RelativeBase: specBasePath, | |||
} | |||
resolver, err := defaultSchemaLoader(nil, opts, nil, nil) | |||
if err != nil { | |||
return err | |||
} | |||
resolver := defaultSchemaLoader(nil, opts, nil, nil) | |||
return expandParameterOrResponse(parameter, resolver, opts.RelativeBase) | |||
} | |||
func getRefAndSchema(input interface{}) (*Ref, *Schema, error) { | |||
var ref *Ref | |||
var sch *Schema | |||
var ( | |||
ref *Ref | |||
sch *Schema | |||
) | |||
switch refable := input.(type) { | |||
case *Parameter: | |||
if refable == nil { | |||
@@ -601,8 +511,9 @@ func getRefAndSchema(input interface{}) (*Ref, *Schema, error) { | |||
ref = &refable.Ref | |||
sch = refable.Schema | |||
default: | |||
return nil, nil, fmt.Errorf("expand: unsupported type %T. Input should be of type *Parameter or *Response", input) | |||
return nil, nil, fmt.Errorf("unsupported type: %T: %w", input, ErrExpandUnsupportedType) | |||
} | |||
return ref, sch, nil | |||
} | |||
@@ -611,41 +522,70 @@ func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePa | |||
if err != nil { | |||
return err | |||
} | |||
if ref == nil { | |||
return nil | |||
} | |||
parentRefs := []string{} | |||
if err := resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) { | |||
parentRefs := make([]string, 0, 10) | |||
if err = resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
ref, sch, _ := getRefAndSchema(input) | |||
if ref.String() != "" { | |||
transitiveResolver, err := resolver.transitiveResolver(basePath, *ref) | |||
if transitiveResolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
transitiveResolver := resolver.transitiveResolver(basePath, *ref) | |||
basePath = resolver.updateBasePath(transitiveResolver, basePath) | |||
resolver = transitiveResolver | |||
} | |||
if sch != nil && sch.Ref.String() != "" { | |||
// schema expanded to a $ref in another root | |||
var ern error | |||
sch.Ref, ern = NewRef(normalizePaths(sch.Ref.String(), ref.RemoteURI())) | |||
if sch == nil { | |||
// nothing to be expanded | |||
if ref != nil { | |||
*ref = Ref{} | |||
} | |||
return nil | |||
} | |||
if sch.Ref.String() != "" { | |||
rebasedRef, ern := NewRef(normalizePaths(sch.Ref.String(), basePath)) | |||
if ern != nil { | |||
return ern | |||
} | |||
switch { | |||
case resolver.isCircular(&rebasedRef, basePath, parentRefs...): | |||
// this is a circular $ref: stop expansion | |||
if !resolver.options.AbsoluteCircularRef { | |||
sch.Ref = *denormalizeFileRef(&rebasedRef, basePath, resolver.context.basePath) | |||
} else { | |||
sch.Ref = rebasedRef | |||
} | |||
case !resolver.options.SkipSchemas: | |||
// schema expanded to a $ref in another root | |||
sch.Ref = rebasedRef | |||
default: | |||
// skip schema expansion but rebase $ref to schema | |||
sch.Ref = *denormalizeFileRef(&rebasedRef, basePath, resolver.context.basePath) | |||
} | |||
} | |||
if ref != nil { | |||
*ref = Ref{} | |||
} | |||
if !resolver.options.SkipSchemas && sch != nil { | |||
// expand schema | |||
if !resolver.options.SkipSchemas { | |||
s, err := expandSchema(*sch, parentRefs, resolver, basePath) | |||
if resolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
if s == nil { | |||
// guard for when continuing on error | |||
return nil | |||
} | |||
*sch = *s | |||
} | |||
return nil | |||
} |
@@ -1,12 +1,13 @@ | |||
module github.com/go-openapi/spec | |||
require ( | |||
github.com/go-openapi/jsonpointer v0.19.3 | |||
github.com/go-openapi/jsonreference v0.19.2 | |||
github.com/go-openapi/swag v0.19.5 | |||
github.com/stretchr/testify v1.3.0 | |||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect | |||
gopkg.in/yaml.v2 v2.2.4 | |||
github.com/go-openapi/jsonpointer v0.19.5 | |||
github.com/go-openapi/jsonreference v0.19.5 | |||
github.com/go-openapi/swag v0.19.12 | |||
github.com/stretchr/testify v1.6.1 | |||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b // indirect | |||
golang.org/x/text v0.3.4 // indirect | |||
gopkg.in/yaml.v2 v2.4.0 | |||
) | |||
go 1.13 |
@@ -2,48 +2,71 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN | |||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= | |||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= | |||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= | |||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | |||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |||
github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= | |||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= | |||
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= | |||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= | |||
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= | |||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= | |||
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= | |||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= | |||
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= | |||
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= | |||
github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= | |||
github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= | |||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= | |||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= | |||
github.com/go-openapi/swag v0.19.12 h1:Bc0bnY2c3AoF7Gc+IMIAQQsD8fLHjHpc19wXvYuayQI= | |||
github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= | |||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= | |||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= | |||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= | |||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | |||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | |||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | |||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | |||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | |||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | |||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= | |||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= | |||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= | |||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= | |||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= | |||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= | |||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | |||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | |||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | |||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= | |||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | |||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= | |||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | |||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | |||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= | |||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= | |||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b h1:iFwSg7t5GZmB/Q5TjiEAsdoLDrdJRC1RiF2WhuV29Qw= | |||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | |||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= | |||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= | |||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | |||
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= | |||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |||
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= | |||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= | |||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= | |||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= | |||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= | |||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= | |||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= | |||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | |||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= | |||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
@@ -141,6 +141,12 @@ func (h *Header) AllowDuplicates() *Header { | |||
return h | |||
} | |||
// WithValidations is a fluent method to set header validations | |||
func (h *Header) WithValidations(val CommonValidations) *Header { | |||
h.SetValidations(SchemaValidations{CommonValidations: val}) | |||
return h | |||
} | |||
// MarshalJSON marshal this to JSON | |||
func (h Header) MarshalJSON() ([]byte, error) { | |||
b1, err := json.Marshal(h.CommonValidations) | |||
@@ -53,22 +53,6 @@ func (s *SimpleSchema) ItemsTypeName() string { | |||
return s.Items.TypeName() | |||
} | |||
// CommonValidations describe common JSON-schema validations | |||
type CommonValidations struct { | |||
Maximum *float64 `json:"maximum,omitempty"` | |||
ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` | |||
Minimum *float64 `json:"minimum,omitempty"` | |||
ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` | |||
MaxLength *int64 `json:"maxLength,omitempty"` | |||
MinLength *int64 `json:"minLength,omitempty"` | |||
Pattern string `json:"pattern,omitempty"` | |||
MaxItems *int64 `json:"maxItems,omitempty"` | |||
MinItems *int64 `json:"minItems,omitempty"` | |||
UniqueItems bool `json:"uniqueItems,omitempty"` | |||
MultipleOf *float64 `json:"multipleOf,omitempty"` | |||
Enum []interface{} `json:"enum,omitempty"` | |||
} | |||
// Items a limited subset of JSON-Schema's items object. | |||
// It is used by parameter definitions that are not located in "body". | |||
// | |||
@@ -180,6 +164,12 @@ func (i *Items) AllowDuplicates() *Items { | |||
return i | |||
} | |||
// WithValidations is a fluent method to set Items validations | |||
func (i *Items) WithValidations(val CommonValidations) *Items { | |||
i.SetValidations(SchemaValidations{CommonValidations: val}) | |||
return i | |||
} | |||
// UnmarshalJSON hydrates this items instance with the data from JSON | |||
func (i *Items) UnmarshalJSON(data []byte) error { | |||
var validations CommonValidations | |||
@@ -28,11 +28,13 @@ type License struct { | |||
VendorExtensible | |||
} | |||
// LicenseProps holds the properties of a License object | |||
type LicenseProps struct { | |||
Name string `json:"name,omitempty"` | |||
URL string `json:"url,omitempty"` | |||
} | |||
// UnmarshalJSON hydrates License from json | |||
func (l *License) UnmarshalJSON(data []byte) error { | |||
if err := json.Unmarshal(data, &l.LicenseProps); err != nil { | |||
return err | |||
@@ -40,6 +42,7 @@ func (l *License) UnmarshalJSON(data []byte) error { | |||
return json.Unmarshal(data, &l.VendorExtensible) | |||
} | |||
// MarshalJSON produces License as json | |||
func (l License) MarshalJSON() ([]byte, error) { | |||
b1, err := json.Marshal(l.LicenseProps) | |||
if err != nil { | |||
@@ -20,9 +20,12 @@ import ( | |||
"os" | |||
"path" | |||
"path/filepath" | |||
"runtime" | |||
"strings" | |||
) | |||
const windowsOS = "windows" | |||
// normalize absolute path for cache. | |||
// on Windows, drive letters should be converted to lower as scheme in net/url.URL | |||
func normalizeAbsPath(path string) string { | |||
@@ -71,27 +74,51 @@ func normalizePaths(refPath, base string) string { | |||
return baseURL.String() | |||
} | |||
// isRoot is a temporary hack to discern windows file ref for ref.IsRoot(). | |||
// TODO: a more thorough change is needed to handle windows file refs. | |||
func isRoot(ref *Ref) bool { | |||
if runtime.GOOS != windowsOS { | |||
return ref.IsRoot() | |||
} | |||
return !filepath.IsAbs(ref.String()) | |||
} | |||
// isAbs is a temporary hack to discern windows file ref for url IsAbs(). | |||
// TODO: a more thorough change is needed to handle windows file refs. | |||
func isAbs(u *url.URL) bool { | |||
if runtime.GOOS != windowsOS { | |||
return u.IsAbs() | |||
} | |||
if len(u.Scheme) <= 1 { | |||
// drive letter got caught as URI scheme | |||
return false | |||
} | |||
return u.IsAbs() | |||
} | |||
// denormalizePaths returns to simplest notation on file $ref, | |||
// i.e. strips the absolute path and sets a path relative to the base path. | |||
// | |||
// This is currently used when we rewrite ref after a circular ref has been detected | |||
func denormalizeFileRef(ref *Ref, relativeBase, originalRelativeBase string) *Ref { | |||
debugLog("denormalizeFileRef for: %s", ref.String()) | |||
debugLog("denormalizeFileRef for: %s (relative: %s, original: %s)", ref.String(), | |||
relativeBase, originalRelativeBase) | |||
if ref.String() == "" || ref.IsRoot() || ref.HasFragmentOnly { | |||
// log.Printf("denormalize: %s, IsRoot: %t,HasFragmentOnly: %t, HasFullURL: %t", ref.String(), ref.IsRoot(), ref.HasFragmentOnly, ref.HasFullURL) | |||
if ref.String() == "" || isRoot(ref) || ref.HasFragmentOnly { | |||
return ref | |||
} | |||
// strip relativeBase from URI | |||
relativeBaseURL, _ := url.Parse(relativeBase) | |||
relativeBaseURL.Fragment = "" | |||
if relativeBaseURL.IsAbs() && strings.HasPrefix(ref.String(), relativeBase) { | |||
if isAbs(relativeBaseURL) && strings.HasPrefix(ref.String(), relativeBase) { | |||
// this should work for absolute URI (e.g. http://...): we have an exact match, just trim prefix | |||
r, _ := NewRef(strings.TrimPrefix(ref.String(), relativeBase)) | |||
return &r | |||
} | |||
if relativeBaseURL.IsAbs() { | |||
if isAbs(relativeBaseURL) { | |||
// other absolute URL get unchanged (i.e. with a non-empty scheme) | |||
return ref | |||
} | |||
@@ -111,7 +138,7 @@ func denormalizeFileRef(ref *Ref, relativeBase, originalRelativeBase string) *Re | |||
// my normalized ref points to: /mypath/item.json#/target | |||
// expected result: item.json#/target | |||
parts := strings.Split(ref.String(), "#") | |||
relativePath, err := filepath.Rel(path.Dir(originalRelativeBaseURL.String()), parts[0]) | |||
relativePath, err := filepath.Rel(filepath.Dir(originalRelativeBaseURL.String()), parts[0]) | |||
if err != nil { | |||
// there is no common ancestor (e.g. different drives on windows) | |||
// leaves the ref unchanged | |||
@@ -132,8 +159,6 @@ func normalizeFileRef(ref *Ref, relativeBase string) *Ref { | |||
return &r | |||
} | |||
debugLog("normalizing %s against %s", ref.String(), relativeBase) | |||
s := normalizePaths(ref.String(), relativeBase) | |||
r, _ := NewRef(s) | |||
return &r | |||
@@ -148,5 +173,5 @@ func absPath(fname string) (string, error) { | |||
return fname, nil | |||
} | |||
wd, err := os.Getwd() | |||
return filepath.Join(wd, fname), err | |||
return normalizeAbsPath(filepath.Join(wd, fname)), err | |||
} |
@@ -25,7 +25,6 @@ import ( | |||
) | |||
func init() { | |||
//gob.Register(map[string][]interface{}{}) | |||
gob.Register(map[string]interface{}{}) | |||
gob.Register([]interface{}{}) | |||
} | |||
@@ -39,8 +39,7 @@ func PathParam(name string) *Parameter { | |||
// BodyParam creates a body parameter | |||
func BodyParam(name string, schema *Schema) *Parameter { | |||
return &Parameter{ParamProps: ParamProps{Name: name, In: "body", Schema: schema}, | |||
SimpleSchema: SimpleSchema{Type: "object"}} | |||
return &Parameter{ParamProps: ParamProps{Name: name, In: "body", Schema: schema}} | |||
} | |||
// FormDataParam creates a body parameter | |||
@@ -58,7 +57,7 @@ func FileParam(name string) *Parameter { | |||
func SimpleArrayParam(name, tpe, fmt string) *Parameter { | |||
return &Parameter{ParamProps: ParamProps{Name: name}, | |||
SimpleSchema: SimpleSchema{Type: jsonArray, CollectionFormat: "csv", | |||
Items: &Items{SimpleSchema: SimpleSchema{Type: "string", Format: fmt}}}} | |||
Items: &Items{SimpleSchema: SimpleSchema{Type: tpe, Format: fmt}}}} | |||
} | |||
// ParamRef creates a parameter that's a json reference | |||
@@ -278,6 +277,12 @@ func (p *Parameter) AllowDuplicates() *Parameter { | |||
return p | |||
} | |||
// WithValidations is a fluent method to set parameter validations | |||
func (p *Parameter) WithValidations(val CommonValidations) *Parameter { | |||
p.SetValidations(SchemaValidations{CommonValidations: val}) | |||
return p | |||
} | |||
// UnmarshalJSON hydrates this items instance with the data from JSON | |||
func (p *Parameter) UnmarshalJSON(data []byte) error { | |||
if err := json.Unmarshal(data, &p.CommonValidations); err != nil { | |||