* Update go-swagger * vendortags/v1.13.0-rc1
@@ -3,7 +3,6 @@ module code.gitea.io/gitea | |||
go 1.14 | |||
require ( | |||
cloud.google.com/go v0.45.0 // indirect | |||
code.gitea.io/gitea-vet v0.2.1 | |||
gitea.com/lunny/levelqueue v0.3.0 | |||
gitea.com/macaron/binding v0.0.0-20190822013154-a5f53841ed2b | |||
@@ -21,7 +20,6 @@ require ( | |||
github.com/PuerkitoBio/goquery v1.5.1 | |||
github.com/RoaringBitmap/roaring v0.4.23 // indirect | |||
github.com/alecthomas/chroma v0.8.0 | |||
github.com/bgentry/speakeasy v0.1.0 // indirect | |||
github.com/blevesearch/bleve v1.0.7 | |||
github.com/couchbase/gomemcached v0.0.0-20191004160342-7b5da2ec40b2 // indirect | |||
github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d // indirect | |||
@@ -41,15 +39,13 @@ require ( | |||
github.com/go-enry/go-enry/v2 v2.5.2 | |||
github.com/go-git/go-billy/v5 v5.0.0 | |||
github.com/go-git/go-git/v5 v5.1.0 | |||
github.com/go-openapi/jsonreference v0.19.3 // indirect | |||
github.com/go-redis/redis v6.15.2+incompatible | |||
github.com/go-sql-driver/mysql v1.5.0 | |||
github.com/go-swagger/go-swagger v0.21.0 | |||
github.com/go-swagger/go-swagger v0.25.0 | |||
github.com/go-testfixtures/testfixtures/v3 v3.4.0 | |||
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/golang/protobuf v1.4.1 // indirect | |||
github.com/google/go-github/v32 v32.1.0 | |||
github.com/google/uuid v1.1.1 | |||
github.com/gorilla/context v1.1.1 | |||
@@ -65,7 +61,6 @@ require ( | |||
github.com/lafriks/xormstore v1.3.2 | |||
github.com/lib/pq v1.7.0 | |||
github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96 | |||
github.com/mailru/easyjson v0.7.0 // indirect | |||
github.com/markbates/goth v1.61.2 | |||
github.com/mattn/go-isatty v0.0.12 | |||
github.com/mattn/go-sqlite3 v1.14.0 | |||
@@ -84,14 +79,13 @@ require ( | |||
github.com/pkg/errors v0.9.1 | |||
github.com/pquerna/otp v1.2.0 | |||
github.com/prometheus/client_golang v1.1.0 | |||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 // indirect | |||
github.com/prometheus/procfs v0.0.4 // indirect | |||
github.com/quasoft/websspi v1.0.0 | |||
github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 // indirect | |||
github.com/sergi/go-diff v1.1.0 | |||
github.com/shurcooL/httpfs v0.0.0-20190527155220-6a4d4a70508b // indirect | |||
github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd | |||
github.com/stretchr/testify v1.5.1 | |||
github.com/stretchr/testify v1.6.1 | |||
github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 // indirect | |||
github.com/tinylib/msgp v1.1.2 // indirect | |||
github.com/tstranex/u2f v1.0.0 | |||
@@ -111,7 +105,6 @@ require ( | |||
golang.org/x/text v0.3.3 | |||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect | |||
golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d | |||
google.golang.org/appengine v1.6.5 // indirect | |||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect | |||
gopkg.in/asn1-ber.v1 v1.0.0-20150924051756-4e86f4367175 // indirect | |||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df |
@@ -5,12 +5,17 @@ cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7h | |||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= | |||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= | |||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= | |||
cloud.google.com/go v0.45.0 h1:bALuGBSgE+BD4rxsopAYlqjcwqcQtye6pWG4bC3N/k0= | |||
cloud.google.com/go v0.45.0/go.mod h1:452BcPOeI9AZfbvDw0Tbo7D32wA+WX9WME8AZwMEDZU= | |||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= | |||
cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= | |||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= | |||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= | |||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= | |||
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= | |||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= | |||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= | |||
code.gitea.io/gitea-vet v0.2.1 h1:b30by7+3SkmiftK0RjuXqFvZg2q4p68uoPGuxhzBN0s= | |||
code.gitea.io/gitea-vet v0.2.1/go.mod h1:zcNbT/aJEmivCAhfmkHOlT645KNOf9W2KnkLgFjGGfE= | |||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= | |||
gitea.com/lunny/levelqueue v0.3.0 h1:MHn1GuSZkxvVEDMyAPqlc7A3cOW+q8RcGhRgH/xtm6I= | |||
gitea.com/lunny/levelqueue v0.3.0/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU= | |||
gitea.com/macaron/binding v0.0.0-20190822013154-a5f53841ed2b h1:vXt85uYV17KURaUlhU7v4GbCShkqRZDSfo0TkC0YCjQ= | |||
@@ -88,12 +93,18 @@ github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9Pq | |||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= | |||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= | |||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= | |||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= | |||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= | |||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= | |||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= | |||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= | |||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= | |||
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/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/aws/aws-sdk-go v1.25.25/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= | |||
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= | |||
@@ -103,6 +114,7 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= | |||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= | |||
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= | |||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= | |||
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= | |||
github.com/blevesearch/bleve v1.0.7 h1:4PspZE7XABMSKcVpzAKp0E05Yer1PIYmTWk+1ngNr/c= | |||
github.com/blevesearch/bleve v1.0.7/go.mod h1:3xvmBtaw12Y4C9iA1RTzwWCof5j5HjydjCTiDE2TeE0= | |||
github.com/blevesearch/blevex v0.0.0-20190916190636-152f0fe5c040 h1:SjYVcfJVZoCfBlg+fkaq2eoZHTf5HaJfaTeTkOtyfHQ= | |||
@@ -123,19 +135,20 @@ github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8 | |||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | |||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= | |||
github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= | |||
github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= | |||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | |||
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= | |||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= | |||
github.com/corbym/gocrest v1.0.3 h1:gwEdq6RkTmq+09CTuM29DfKOCtZ7G7bcyxs3IZ6EVdU= | |||
github.com/corbym/gocrest v1.0.3/go.mod h1:maVFL5lbdS2PgfOQgGRWDYTeunSWQeiEgoNdTABShCs= | |||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= | |||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= | |||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= | |||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= | |||
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= | |||
github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= | |||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= | |||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= | |||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | |||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | |||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | |||
@@ -197,6 +210,8 @@ github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= | |||
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= | |||
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= | |||
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= | |||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | |||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | |||
github.com/ethantkoenig/rupture v0.0.0-20180203182544-0a76f03a811a h1:M1bRpaZAn4GSsqu3hdK2R8H0AH9O6vqCTCbm2oAFGfE= | |||
github.com/ethantkoenig/rupture v0.0.0-20180203182544-0a76f03a811a/go.mod h1:MkKY/CB98aVE4VxO63X5vTQKUgcn+3XP15LMASe3lYs= | |||
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= | |||
@@ -205,6 +220,7 @@ github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojt | |||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= | |||
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y= | |||
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= | |||
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/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= | |||
@@ -215,6 +231,8 @@ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8 | |||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= | |||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= | |||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | |||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= | |||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= | |||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | |||
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= | |||
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= | |||
@@ -237,6 +255,7 @@ github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp | |||
github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= | |||
github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk= | |||
github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= | |||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= | |||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= | |||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= | |||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= | |||
@@ -248,10 +267,15 @@ github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9sn | |||
github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= | |||
github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= | |||
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/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/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/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= | |||
@@ -264,37 +288,53 @@ github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo | |||
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.4 h1:3Vw+rh13uq2JFNxgnMTGE1rnoieU9FmyE1gvnyylsYg= | |||
github.com/go-openapi/jsonreference v0.19.4/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 h1:jwIoahqCmaA5OBoc/B+1+Mu2L0Gr8xYQnbeyQEo/7b0= | |||
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/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.5 h1:h4Zk7oTfB3ZYM2oMNliQvL+3BrDstTIX8lqP7yaYCuI= | |||
github.com/go-openapi/runtime v0.19.5/go.mod h1:WIH6IYPXOrtgTClTV8xzdrD20jBlrK25D0aQbdSlqp8= | |||
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/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= | |||
github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= | |||
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 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= | |||
github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | |||
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 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= | |||
github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= | |||
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/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= | |||
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/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/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 h1:PAH/2DylwWcIU1s0Y7k3yNmeAgWOcKrNE2Q7Ww/kCg4= | |||
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-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-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= | |||
@@ -303,14 +343,38 @@ 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.21.0 h1:AX9mdfzp6eJtUe92nFrWmbK7ocRgkCDPJs0FsSSTDlA= | |||
github.com/go-swagger/go-swagger v0.21.0/go.mod h1:tDb8PdDVFcaE8EPXkMOsuxpL3UEPiwu1UDZar9Z/1RY= | |||
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/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.0 h1:cny44xqH4ctXRld/COxFGPC7XDyOU8KNnwmfCxEEqoQ= | |||
github.com/go-testfixtures/testfixtures/v3 v3.4.0/go.mod h1:P4L3WxgOsCLbAeUC50qX5rdj1ULZfUMqgCbqah3OH5U= | |||
github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y= | |||
github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM= | |||
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= | |||
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= | |||
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= | |||
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | |||
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | |||
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= | |||
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | |||
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | |||
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= | |||
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= | |||
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= | |||
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= | |||
github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= | |||
github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= | |||
github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= | |||
github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= | |||
github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= | |||
github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | |||
github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | |||
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | |||
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | |||
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= | |||
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= | |||
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= | |||
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= | |||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= | |||
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= | |||
@@ -342,6 +406,8 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W | |||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= | |||
github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= | |||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= | |||
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= | |||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | |||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | |||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= | |||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | |||
@@ -352,6 +418,8 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw | |||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | |||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= | |||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | |||
github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= | |||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | |||
github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II= | |||
github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= | |||
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= | |||
@@ -360,6 +428,7 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ | |||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= | |||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= | |||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= | |||
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 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= | |||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
@@ -389,21 +458,37 @@ github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+ | |||
github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= | |||
github.com/gorilla/sessions v1.2.0 h1:S7P+1Hm5V/AT9cjEcUD5uDaQSX0OE577aCXgoaKpYbQ= | |||
github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= | |||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | |||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= | |||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= | |||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= | |||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= | |||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= | |||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= | |||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | |||
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= | |||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= | |||
github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= | |||
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= | |||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= | |||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= | |||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= | |||
github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= | |||
github.com/hashicorp/go-retryablehttp v0.6.6 h1:HJunrbHTDDbBb/ay4kxa1n+dLmttUlnP3V9oNE4hmsM= | |||
github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= | |||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= | |||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= | |||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= | |||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= | |||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= | |||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= | |||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= | |||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= | |||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= | |||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= | |||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= | |||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= | |||
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= | |||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= | |||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= | |||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | |||
github.com/huandu/xstrings v1.3.0 h1:gvV6jG9dTgFEncxo+AF7PH6MZXi/vZl25owA/8Dg8Wo= | |||
@@ -479,6 +564,8 @@ github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVY | |||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= | |||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= | |||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= | |||
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/kballard/go-shellquote v0.0.0-20170619183022-cd60e84ee657 h1:vE7J1m7cCpiRVEIr1B5ccDxRpbPsWT5JU3if2Di5nE4= | |||
github.com/kballard/go-shellquote v0.0.0-20170619183022-cd60e84ee657/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= | |||
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= | |||
@@ -486,9 +573,11 @@ github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT | |||
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4 h1:cTxwSmnaqLoo+4tLukHoB9iqHOu3LmLhRmgUxZo6Vp4= | |||
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M= | |||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= | |||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= | |||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= | |||
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |||
github.com/klauspost/compress v1.9.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |||
github.com/klauspost/compress v1.10.11 h1:K9z59aO18Aywg2b/WSgBaUX99mHy2BES18Cr5lBKZHk= | |||
github.com/klauspost/compress v1.10.11/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | |||
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | |||
@@ -502,9 +591,12 @@ github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfEN | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
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 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= | |||
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/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= | |||
@@ -533,11 +625,13 @@ github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN | |||
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= | |||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= | |||
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= | |||
github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= | |||
github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= | |||
github.com/markbates/going v1.0.0/go.mod h1:I6mnB4BPnEeqo85ynXIx1ZFLLbtiLHNXVgWeFO9OGOA= | |||
github.com/markbates/goth v1.61.2 h1:jDowrUH5qw8KGuQdKwFhLzkXkTYCIPfz3LHADJsiPIs= | |||
github.com/markbates/goth v1.61.2/go.mod h1:qh2QfwZoWRucQ+DR5KVKC6dUGkNCToWh4vS45GIzFsY= | |||
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= | |||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= | |||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | |||
@@ -545,6 +639,7 @@ github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaa | |||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | |||
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= | |||
github.com/mattn/go-colorable v0.1.6/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= | |||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | |||
@@ -572,22 +667,32 @@ github.com/mholt/archiver/v3 v3.3.0 h1:vWjhY8SQp5yzM9P6OJ/eZEkmi3UAbRrxCq48MxjAz | |||
github.com/mholt/archiver/v3 v3.3.0/go.mod h1:YnQtqsp+94Rwd0D/rk5cnLrxusUBUXg+08Ebtr1Mqao= | |||
github.com/microcosm-cc/bluemonday v1.0.3-0.20191119130333-0a75d7616912 h1:hJde9rA24hlTcAYSwJoXpDUyGtfKQ/jsofw+WaDqGrI= | |||
github.com/microcosm-cc/bluemonday v1.0.3-0.20191119130333-0a75d7616912/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= | |||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= | |||
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.4 h1:M9glnGclD87VfttesWzURw7SHqq1XDIYGrfTykBTI50= | |||
github.com/minio/minio-go/v7 v7.0.4/go.mod h1:CSt2ETZNs+bIIhWTse0mcZKZWMGrFU7Er7RR0TmkDYk= | |||
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/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= | |||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= | |||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= | |||
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= | |||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= | |||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= | |||
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/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= | |||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | |||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= | |||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | |||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= | |||
github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c h1:3wkDRdxK92dF+c1ke2dtj7ZzemFWBHB9plnJOtlwdFA= | |||
github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM= | |||
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= | |||
@@ -621,10 +726,13 @@ github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= | |||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | |||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | |||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= | |||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= | |||
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 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg= | |||
github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= | |||
github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw= | |||
github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= | |||
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= | |||
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= | |||
github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= | |||
@@ -633,8 +741,10 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE | |||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | |||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= | |||
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= | |||
@@ -670,12 +780,17 @@ github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqn | |||
github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 h1:YDeskXpkNDhPdWN3REluVa46HQOVuVkjkd2sWnrABNQ= | |||
github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= | |||
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= | |||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | |||
github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= | |||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= | |||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= | |||
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= | |||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= | |||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= | |||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= | |||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= | |||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= | |||
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= | |||
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= | |||
@@ -691,6 +806,7 @@ github.com/siddontang/go-snappy v0.0.0-20140704025258-d8f7bb82a96d/go.mod h1:vq0 | |||
github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= | |||
github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= | |||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= | |||
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= | |||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= | |||
@@ -703,13 +819,18 @@ github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:X | |||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | |||
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= | |||
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | |||
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= | |||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | |||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= | |||
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.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= | |||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= | |||
github.com/spf13/afero v1.3.2 h1:GDarE4TJQI52kYSbSAmLiId1Elfj+xgSDqrUZxFhxlU= | |||
github.com/spf13/afero v1.3.2/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= | |||
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= | |||
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= | |||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | |||
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= | |||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= | |||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= | |||
@@ -718,8 +839,8 @@ 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.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= | |||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= | |||
github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= | |||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= | |||
github.com/steveyen/gtreap v0.1.0 h1:CjhzTa274PyJLJuMZwIzCO1PfC00oRa8d1Kc78bFXJM= | |||
github.com/steveyen/gtreap v0.1.0/go.mod h1:kl/5J7XbrOmlIbYIXdRHDDE5QxHqpk0cmkT7Z4dM9/Y= | |||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | |||
@@ -731,6 +852,10 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy | |||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | |||
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= | |||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | |||
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/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= | |||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= | |||
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= | |||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= | |||
github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 h1:HOxvxvnntLiPn123Fk+twfUhCQdMDaqmb0cclArW0T0= | |||
@@ -745,7 +870,6 @@ github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9r | |||
github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= | |||
github.com/tstranex/u2f v1.0.0 h1:HhJkSzDDlVSVIVt7pDJwCHQj67k7A5EeBgPmeD+pVsQ= | |||
github.com/tstranex/u2f v1.0.0/go.mod h1:eahSLaqAS0zsIEv80+vXT7WanXs7MQQDg3j3wGBSayo= | |||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= | |||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= | |||
github.com/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8= | |||
github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= | |||
@@ -766,6 +890,8 @@ github.com/xanzy/go-gitlab v0.31.0 h1:+nHztQuCXGSMluKe5Q9IRaPdz6tO8O0gMkQ0vqGpiB | |||
github.com/xanzy/go-gitlab v0.31.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= | |||
github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= | |||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= | |||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= | |||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= | |||
@@ -791,6 +917,10 @@ go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= | |||
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | |||
go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= | |||
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.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= | |||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | |||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | |||
@@ -801,18 +931,21 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ | |||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | |||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | |||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | |||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | |||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | |||
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/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-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | |||
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-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= | |||
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190907121410-71b5226ff739/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
@@ -822,14 +955,23 @@ golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPh | |||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= | |||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
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= | |||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= | |||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= | |||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= | |||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= | |||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | |||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= | |||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | |||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | |||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | |||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | |||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | |||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= | |||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= | |||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= | |||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= | |||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= | |||
golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= | |||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | |||
@@ -840,8 +982,10 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r | |||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
@@ -862,6 +1006,7 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL | |||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= | |||
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= | |||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | |||
golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= | |||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | |||
@@ -876,12 +1021,15 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ | |||
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= | |||
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/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
@@ -895,9 +1043,11 @@ golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7w | |||
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-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
@@ -905,7 +1055,7 @@ golang.org/x/sys v0.0.0-20190730183949-1393eb018365/go.mod h1:h1NjWce9XRLGQEsW7w | |||
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190907184412-d223b2b6db03/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
@@ -930,25 +1080,36 @@ golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxb | |||
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-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= | |||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | |||
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-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | |||
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | |||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | |||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | |||
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/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/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |||
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |||
golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |||
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |||
golang.org/x/tools v0.0.0-20200225230052-807dcd883420/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | |||
golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224 h1:azwY/v0y0K4mFHVsg5+UrTgchqALYWpqVo6vL5OmkmI= | |||
golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= | |||
golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | |||
golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d h1:XZxUC4/ZNKTjrT4/Oc9gCgIYnzPW3/CefdPjsndrVWM= | |||
golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | |||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | |||
@@ -962,6 +1123,7 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt | |||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= | |||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= | |||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= | |||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= | |||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | |||
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | |||
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | |||
@@ -969,10 +1131,9 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 | |||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | |||
google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | |||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= | |||
google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= | |||
google.golang.org/appengine v1.6.4/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= | |||
google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= | |||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | |||
google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= | |||
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | |||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | |||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | |||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | |||
@@ -981,11 +1142,15 @@ google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRn | |||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | |||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | |||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | |||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= | |||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= | |||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= | |||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= | |||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | |||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= | |||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= | |||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= | |||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | |||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= | |||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | |||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | |||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | |||
@@ -993,6 +1158,10 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE | |||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= | |||
google.golang.org/protobuf v1.22.0 h1:cJv5/xdbk1NnMPR1VP9+HU6gupuG9MLBoH1r6RHZ2MY= | |||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | |||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | |||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | |||
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= | |||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= | |||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= | |||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= | |||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= | |||
@@ -1003,6 +1172,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 | |||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/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/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= | |||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | |||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= | |||
@@ -1012,6 +1182,7 @@ gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | |||
gopkg.in/ini.v1 v1.44.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | |||
gopkg.in/ini.v1 v1.44.2/go.mod h1:M3Cogqpuv0QCi3ExAY5V4uOt4qb/R3xZubo9m8lK5wg= | |||
gopkg.in/ini.v1 v1.46.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | |||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | |||
gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= | |||
gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | |||
gopkg.in/ini.v1 v1.60.1 h1:P5y5shSkb0CFe44qEeMBgn8JLow09MP17jlJHanke5g= | |||
@@ -1021,7 +1192,7 @@ gopkg.in/ini.v1 v1.60.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= | |||
gopkg.in/ldap.v3 v3.0.2 h1:R6RBtabK6e1GO0eQKtkyOFbAHO73QesLzI2w2DZ6b9w= | |||
gopkg.in/ldap.v3 v3.0.2/go.mod h1:oxD7NyBuxchC+SgJDE1Q5Od05eGt29SDQVBmV+HYbzw= | |||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= | |||
gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= | |||
gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= | |||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= | |||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= | |||
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= | |||
@@ -1034,10 +1205,16 @@ 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.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= | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= | |||
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= | |||
mvdan.cc/xurls/v2 v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA= | |||
mvdan.cc/xurls/v2 v2.1.0/go.mod h1:5GrSd9rOnKOpZaji1OZLYL/yeAAtGDlo/cFe+8K5n8E= |
@@ -0,0 +1,12 @@ | |||
{ | |||
"name": "metadata", | |||
"name_pretty": "Google Compute Engine Metadata API", | |||
"product_documentation": "https://cloud.google.com/compute/docs/storing-retrieving-metadata", | |||
"client_documentation": "https://godoc.org/cloud.google.com/go/compute/metadata", | |||
"release_level": "ga", | |||
"language": "go", | |||
"repo": "googleapis/google-cloud-go", | |||
"distribution_name": "cloud.google.com/go/compute/metadata", | |||
"api_id": "compute:metadata", | |||
"requires_billing": false | |||
} |
@@ -0,0 +1,15 @@ | |||
bin/ | |||
.idea/ | |||
# Binaries for programs and plugins | |||
*.exe | |||
*.exe~ | |||
*.dll | |||
*.so | |||
*.dylib | |||
# Test binary, built with `go test -c` | |||
*.test | |||
# Output of the go coverage tool, specifically when used with LiteIDE | |||
*.out | |||
@@ -1,14 +1,18 @@ | |||
dist: bionic | |||
language: go | |||
env: GO111MODULE=on GOFLAGS='-mod vendor' | |||
install: true | |||
email: false | |||
go: | |||
- 1.1 | |||
- 1.2 | |||
- 1.3 | |||
- 1.4 | |||
- 1.5 | |||
- 1.6 | |||
- 1.10 | |||
- 1.11 | |||
- 1.12 | |||
- 1.13 | |||
- tip | |||
notifications: | |||
email: | |||
- bwatas@gmail.com | |||
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 |
@@ -11,7 +11,7 @@ If you don't know what to do, there are some features and functions that need to | |||
- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions) | |||
- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new | |||
- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc | |||
- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) | |||
- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) | |||
- [ ] Implement fuzzing testing | |||
- [ ] Implement some struct/map/array utilities | |||
- [ ] Implement map/array validation | |||
@@ -37,7 +37,7 @@ Anyone can file an expense. If the expense makes sense for the development of th | |||
### Contributors | |||
Thank you to all the people who have already contributed to govalidator! | |||
<a href="graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a> | |||
<a href="https://github.com/asaskevich/govalidator/graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a> | |||
### Backers |
@@ -13,7 +13,7 @@ Type the following command in your terminal: | |||
or you can get specified release of the package with `gopkg.in`: | |||
go get gopkg.in/asaskevich/govalidator.v4 | |||
go get gopkg.in/asaskevich/govalidator.v10 | |||
After it the package is ready to use. | |||
@@ -83,14 +83,14 @@ This was changed to prevent data races when accessing custom validators. | |||
import "github.com/asaskevich/govalidator" | |||
// before | |||
govalidator.CustomTypeTagMap["customByteArrayValidator"] = CustomTypeValidator(func(i interface{}, o interface{}) bool { | |||
govalidator.CustomTypeTagMap["customByteArrayValidator"] = func(i interface{}, o interface{}) bool { | |||
// ... | |||
}) | |||
} | |||
// after | |||
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(func(i interface{}, o interface{}) bool { | |||
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, o interface{}) bool { | |||
// ... | |||
})) | |||
}) | |||
``` | |||
#### List of functions: | |||
@@ -108,23 +108,34 @@ func Filter(array []interface{}, iterator ConditionIterator) []interface{} | |||
func Find(array []interface{}, iterator ConditionIterator) interface{} | |||
func GetLine(s string, index int) (string, error) | |||
func GetLines(s string) []string | |||
func InRange(value, left, right float64) bool | |||
func HasLowerCase(str string) bool | |||
func HasUpperCase(str string) bool | |||
func HasWhitespace(str string) bool | |||
func HasWhitespaceOnly(str string) bool | |||
func InRange(value interface{}, left interface{}, right interface{}) bool | |||
func InRangeFloat32(value, left, right float32) bool | |||
func InRangeFloat64(value, left, right float64) bool | |||
func InRangeInt(value, left, right interface{}) bool | |||
func IsASCII(str string) bool | |||
func IsAlpha(str string) bool | |||
func IsAlphanumeric(str string) bool | |||
func IsBase64(str string) bool | |||
func IsByteLength(str string, min, max int) bool | |||
func IsCIDR(str string) bool | |||
func IsCRC32(str string) bool | |||
func IsCRC32b(str string) bool | |||
func IsCreditCard(str string) bool | |||
func IsDNSName(str string) bool | |||
func IsDataURI(str string) bool | |||
func IsDialString(str string) bool | |||
func IsDivisibleBy(str, num string) bool | |||
func IsEmail(str string) bool | |||
func IsExistingEmail(email string) bool | |||
func IsFilePath(str string) (bool, int) | |||
func IsFloat(str string) bool | |||
func IsFullWidth(str string) bool | |||
func IsHalfWidth(str string) bool | |||
func IsHash(str string, algorithm string) bool | |||
func IsHexadecimal(str string) bool | |||
func IsHexcolor(str string) bool | |||
func IsHost(str string) bool | |||
@@ -136,22 +147,27 @@ func IsISBN10(str string) bool | |||
func IsISBN13(str string) bool | |||
func IsISO3166Alpha2(str string) bool | |||
func IsISO3166Alpha3(str string) bool | |||
func IsISO4217(str string) bool | |||
func IsISO693Alpha2(str string) bool | |||
func IsISO693Alpha3b(str string) bool | |||
func IsISO4217(str string) bool | |||
func IsIn(str string, params ...string) bool | |||
func IsInRaw(str string, params ...string) bool | |||
func IsInt(str string) bool | |||
func IsJSON(str string) bool | |||
func IsLatitude(str string) bool | |||
func IsLongitude(str string) bool | |||
func IsLowerCase(str string) bool | |||
func IsMAC(str string) bool | |||
func IsMD4(str string) bool | |||
func IsMD5(str string) bool | |||
func IsMagnetURI(str string) bool | |||
func IsMongoID(str string) bool | |||
func IsMultibyte(str string) bool | |||
func IsNatural(value float64) bool | |||
func IsNegative(value float64) bool | |||
func IsNonNegative(value float64) bool | |||
func IsNonPositive(value float64) bool | |||
func IsNotNull(str string) bool | |||
func IsNull(str string) bool | |||
func IsNumeric(str string) bool | |||
func IsPort(str string) bool | |||
@@ -162,9 +178,21 @@ func IsRFC3339WithoutZone(str string) bool | |||
func IsRGBcolor(str string) bool | |||
func IsRequestURI(rawurl string) bool | |||
func IsRequestURL(rawurl string) bool | |||
func IsRipeMD128(str string) bool | |||
func IsRipeMD160(str string) bool | |||
func IsRsaPub(str string, params ...string) bool | |||
func IsRsaPublicKey(str string, keylen int) bool | |||
func IsSHA1(str string) bool | |||
func IsSHA256(str string) bool | |||
func IsSHA384(str string) bool | |||
func IsSHA512(str string) bool | |||
func IsSSN(str string) bool | |||
func IsSemver(str string) bool | |||
func IsTiger128(str string) bool | |||
func IsTiger160(str string) bool | |||
func IsTiger192(str string) bool | |||
func IsTime(str string, format string) bool | |||
func IsType(v interface{}, params ...string) bool | |||
func IsURL(str string) bool | |||
func IsUTFDigit(str string) bool | |||
func IsUTFLetter(str string) bool | |||
@@ -174,16 +202,20 @@ func IsUUID(str string) bool | |||
func IsUUIDv3(str string) bool | |||
func IsUUIDv4(str string) bool | |||
func IsUUIDv5(str string) bool | |||
func IsUnixTime(str string) bool | |||
func IsUpperCase(str string) bool | |||
func IsVariableWidth(str string) bool | |||
func IsWhole(value float64) bool | |||
func LeftTrim(str, chars string) string | |||
func Map(array []interface{}, iterator ResultIterator) []interface{} | |||
func Matches(str, pattern string) bool | |||
func MaxStringLength(str string, params ...string) bool | |||
func MinStringLength(str string, params ...string) bool | |||
func NormalizeEmail(str string) (string, error) | |||
func PadBoth(str string, padStr string, padLen int) string | |||
func PadLeft(str string, padStr string, padLen int) string | |||
func PadRight(str string, padStr string, padLen int) string | |||
func PrependPathToErrors(err error, path string) error | |||
func Range(str string, params ...string) bool | |||
func RemoveTags(s string) string | |||
func ReplacePattern(str, pattern, replace string) string | |||
@@ -192,18 +224,21 @@ func RightTrim(str, chars string) string | |||
func RuneLength(str string, params ...string) bool | |||
func SafeFileName(str string) string | |||
func SetFieldsRequiredByDefault(value bool) | |||
func SetNilPtrAllowedByRequired(value bool) | |||
func Sign(value float64) float64 | |||
func StringLength(str string, params ...string) bool | |||
func StringMatches(s string, params ...string) bool | |||
func StripLow(str string, keepNewLines bool) string | |||
func ToBoolean(str string) (bool, error) | |||
func ToFloat(str string) (float64, error) | |||
func ToInt(str string) (int64, error) | |||
func ToInt(value interface{}) (res int64, err error) | |||
func ToJSON(obj interface{}) (string, error) | |||
func ToString(obj interface{}) string | |||
func Trim(str, chars string) string | |||
func Truncate(str string, length int, ending string) string | |||
func TruncatingErrorf(str string, args ...interface{}) error | |||
func UnderscoreToCamelCase(s string) string | |||
func ValidateMap(inputMap map[string]interface{}, validationMap map[string]interface{}) (bool, error) | |||
func ValidateStruct(s interface{}) (bool, error) | |||
func WhiteList(str, chars string) string | |||
type ConditionIterator | |||
@@ -214,6 +249,8 @@ type Errors | |||
func (es Errors) Error() string | |||
func (es Errors) Errors() []error | |||
type ISO3166Entry | |||
type ISO693Entry | |||
type InterfaceParamValidator | |||
type Iterator | |||
type ParamValidator | |||
type ResultIterator | |||
@@ -227,6 +264,27 @@ type Validator | |||
```go | |||
println(govalidator.IsURL(`http://user@pass:domain.com/path/page`)) | |||
``` | |||
###### IsType | |||
```go | |||
println(govalidator.IsType("Bob", "string")) | |||
println(govalidator.IsType(1, "int")) | |||
i := 1 | |||
println(govalidator.IsType(&i, "*int")) | |||
``` | |||
IsType can be used through the tag `type` which is essential for map validation: | |||
```go | |||
type User struct { | |||
Name string `valid:"type(string)"` | |||
Age int `valid:"type(int)"` | |||
Meta interface{} `valid:"type(string)"` | |||
} | |||
result, err := govalidator.ValidateStruct(user{"Bob", 20, "meta"}) | |||
if err != nil { | |||
println("error: " + err.Error()) | |||
} | |||
println(result) | |||
``` | |||
###### ToString | |||
```go | |||
type User struct { | |||
@@ -335,6 +393,11 @@ Validators with parameters | |||
"in(string1|string2|...|stringN)": IsIn, | |||
"rsapub(keylength)" : IsRsaPub, | |||
``` | |||
Validators with parameters for any type | |||
```go | |||
"type(type)": IsType, | |||
``` | |||
And here is small example of usage: | |||
```go | |||
@@ -370,6 +433,41 @@ if err != nil { | |||
} | |||
println(result) | |||
``` | |||
###### ValidateMap [#2](https://github.com/asaskevich/govalidator/pull/338) | |||
If you want to validate maps, you can use the map to be validated and a validation map that contain the same tags used in ValidateStruct, both maps have to be in the form `map[string]interface{}` | |||
So here is small example of usage: | |||
```go | |||
var mapTemplate = map[string]interface{}{ | |||
"name":"required,alpha", | |||
"family":"required,alpha", | |||
"email":"required,email", | |||
"cell-phone":"numeric", | |||
"address":map[string]interface{}{ | |||
"line1":"required,alphanum", | |||
"line2":"alphanum", | |||
"postal-code":"numeric", | |||
}, | |||
} | |||
var inputMap = map[string]interface{}{ | |||
"name":"Bob", | |||
"family":"Smith", | |||
"email":"foo@bar.baz", | |||
"address":map[string]interface{}{ | |||
"line1":"", | |||
"line2":"", | |||
"postal-code":"", | |||
}, | |||
} | |||
result, err := govalidator.ValidateMap(inputMap, mapTemplate) | |||
if err != nil { | |||
println("error: " + err.Error()) | |||
} | |||
println(result) | |||
``` | |||
###### WhiteList | |||
```go | |||
// Remove all characters from string ignoring characters between "a" and "z" | |||
@@ -389,7 +487,7 @@ type StructWithCustomByteArray struct { | |||
CustomMinLength int `valid:"-"` | |||
} | |||
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(func(i interface{}, context interface{}) bool { | |||
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, context interface{}) bool { | |||
switch v := context.(type) { // you can type switch on the context interface being validated | |||
case StructWithCustomByteArray: | |||
// you can check and validate against some other field in the context, | |||
@@ -409,14 +507,25 @@ govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator | |||
} | |||
} | |||
return false | |||
})) | |||
govalidator.CustomTypeTagMap.Set("customMinLengthValidator", CustomTypeValidator(func(i interface{}, context interface{}) bool { | |||
}) | |||
govalidator.CustomTypeTagMap.Set("customMinLengthValidator", func(i interface{}, context interface{}) bool { | |||
switch v := context.(type) { // this validates a field against the value in another field, i.e. dependent validation | |||
case StructWithCustomByteArray: | |||
return len(v.ID) >= v.CustomMinLength | |||
} | |||
return false | |||
})) | |||
}) | |||
``` | |||
###### Loop over Error() | |||
By default .Error() returns all errors in a single String. To access each error you can do this: | |||
```go | |||
if err != nil { | |||
errs := err.(govalidator.Errors).Errors() | |||
for _, e := range errs { | |||
fmt.Println(e.Error()) | |||
} | |||
} | |||
``` | |||
###### Custom error messages | |||
@@ -445,7 +554,7 @@ If you don't know what to do, there are some features and functions that need to | |||
- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions) | |||
- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new | |||
- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc | |||
- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) | |||
- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) | |||
- [ ] Implement fuzzing testing | |||
- [ ] Implement some struct/map/array utilities | |||
- [ ] Implement map/array validation | |||
@@ -475,7 +584,7 @@ This project exists thanks to all the people who contribute. [[Contribute](CONTR | |||
* [Matt Sanford](https://github.com/mzsanford) | |||
* [Simon ccl1115](https://github.com/ccl1115) | |||
<a href="graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a> | |||
<a href="https://github.com/asaskevich/govalidator/graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a> | |||
### Backers | |||
@@ -504,4 +613,4 @@ Support this project by becoming a sponsor. Your logo will show up here with a l | |||
## License | |||
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large) | |||
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large) |
@@ -0,0 +1,3 @@ | |||
package govalidator | |||
// A package of validators and sanitizers for strings, structures and collections. |
@@ -1,6 +1,9 @@ | |||
package govalidator | |||
import "strings" | |||
import ( | |||
"sort" | |||
"strings" | |||
) | |||
// Errors is an array of multiple errors and conforms to the error interface. | |||
type Errors []error | |||
@@ -15,6 +18,7 @@ func (es Errors) Error() string { | |||
for _, e := range es { | |||
errs = append(errs, e.Error()) | |||
} | |||
sort.Strings(errs) | |||
return strings.Join(errs, ";") | |||
} | |||
@@ -0,0 +1,3 @@ | |||
module github.com/asaskevich/govalidator | |||
go 1.12 |
@@ -4,49 +4,51 @@ import "regexp" | |||
// Basic regular expressions for validating strings | |||
const ( | |||
Email string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$" | |||
CreditCard string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$" | |||
ISBN10 string = "^(?:[0-9]{9}X|[0-9]{10})$" | |||
ISBN13 string = "^(?:[0-9]{13})$" | |||
UUID3 string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$" | |||
UUID4 string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" | |||
UUID5 string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" | |||
UUID string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" | |||
Alpha string = "^[a-zA-Z]+$" | |||
Alphanumeric string = "^[a-zA-Z0-9]+$" | |||
Numeric string = "^[0-9]+$" | |||
Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$" | |||
Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$" | |||
Hexadecimal string = "^[0-9a-fA-F]+$" | |||
Hexcolor string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" | |||
RGBcolor string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$" | |||
ASCII string = "^[\x00-\x7F]+$" | |||
Multibyte string = "[^\x00-\x7F]" | |||
FullWidth string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" | |||
HalfWidth string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" | |||
Base64 string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$" | |||
PrintableASCII string = "^[\x20-\x7E]+$" | |||
DataURI string = "^data:.+\\/(.+);base64$" | |||
Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$" | |||
Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$" | |||
DNSName string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$` | |||
IP string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))` | |||
URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)` | |||
URLUsername string = `(\S+(:\S*)?@)` | |||
URLPath string = `((\/|\?|#)[^\s]*)` | |||
URLPort string = `(:(\d{1,5}))` | |||
URLIP string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))` | |||
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 + `?$` | |||
SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` | |||
WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` | |||
UnixPath string = `^(/[^/\x00]*)+/?$` | |||
Semver string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$" | |||
tagName string = "valid" | |||
hasLowerCase string = ".*[[:lower:]]" | |||
hasUpperCase string = ".*[[:upper:]]" | |||
hasWhitespace string = ".*[[:space:]]" | |||
hasWhitespaceOnly string = "^[[:space:]]+$" | |||
Email string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$" | |||
CreditCard string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$" | |||
ISBN10 string = "^(?:[0-9]{9}X|[0-9]{10})$" | |||
ISBN13 string = "^(?:[0-9]{13})$" | |||
UUID3 string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$" | |||
UUID4 string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" | |||
UUID5 string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" | |||
UUID string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" | |||
Alpha string = "^[a-zA-Z]+$" | |||
Alphanumeric string = "^[a-zA-Z0-9]+$" | |||
Numeric string = "^[0-9]+$" | |||
Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$" | |||
Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$" | |||
Hexadecimal string = "^[0-9a-fA-F]+$" | |||
Hexcolor string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" | |||
RGBcolor string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$" | |||
ASCII string = "^[\x00-\x7F]+$" | |||
Multibyte string = "[^\x00-\x7F]" | |||
FullWidth string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" | |||
HalfWidth string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" | |||
Base64 string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$" | |||
PrintableASCII string = "^[\x20-\x7E]+$" | |||
DataURI string = "^data:.+\\/(.+);base64$" | |||
MagnetURI string = "^magnet:\\?xt=urn:[a-zA-Z0-9]+:[a-zA-Z0-9]{32,40}&dn=.+&tr=.+$" | |||
Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$" | |||
Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$" | |||
DNSName string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$` | |||
IP string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))` | |||
URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)` | |||
URLUsername string = `(\S+(:\S*)?@)` | |||
URLPath string = `((\/|\?|#)[^\s]*)` | |||
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 + `?$` | |||
SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` | |||
WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` | |||
UnixPath string = `^(/[^/\x00]*)+/?$` | |||
Semver string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$" | |||
tagName string = "valid" | |||
hasLowerCase string = ".*[[:lower:]]" | |||
hasUpperCase string = ".*[[:upper:]]" | |||
hasWhitespace string = ".*[[:space:]]" | |||
hasWhitespaceOnly string = "^[[:space:]]+$" | |||
IMEI string = "^[0-9a-f]{14}$|^\\d{15}$|^\\d{18}$" | |||
) | |||
// Used by IsFilePath func | |||
@@ -60,42 +62,44 @@ const ( | |||
) | |||
var ( | |||
userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$") | |||
hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$") | |||
userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})") | |||
rxEmail = regexp.MustCompile(Email) | |||
rxCreditCard = regexp.MustCompile(CreditCard) | |||
rxISBN10 = regexp.MustCompile(ISBN10) | |||
rxISBN13 = regexp.MustCompile(ISBN13) | |||
rxUUID3 = regexp.MustCompile(UUID3) | |||
rxUUID4 = regexp.MustCompile(UUID4) | |||
rxUUID5 = regexp.MustCompile(UUID5) | |||
rxUUID = regexp.MustCompile(UUID) | |||
rxAlpha = regexp.MustCompile(Alpha) | |||
rxAlphanumeric = regexp.MustCompile(Alphanumeric) | |||
rxNumeric = regexp.MustCompile(Numeric) | |||
rxInt = regexp.MustCompile(Int) | |||
rxFloat = regexp.MustCompile(Float) | |||
rxHexadecimal = regexp.MustCompile(Hexadecimal) | |||
rxHexcolor = regexp.MustCompile(Hexcolor) | |||
rxRGBcolor = regexp.MustCompile(RGBcolor) | |||
rxASCII = regexp.MustCompile(ASCII) | |||
rxPrintableASCII = regexp.MustCompile(PrintableASCII) | |||
rxMultibyte = regexp.MustCompile(Multibyte) | |||
rxFullWidth = regexp.MustCompile(FullWidth) | |||
rxHalfWidth = regexp.MustCompile(HalfWidth) | |||
rxBase64 = regexp.MustCompile(Base64) | |||
rxDataURI = regexp.MustCompile(DataURI) | |||
rxLatitude = regexp.MustCompile(Latitude) | |||
rxLongitude = regexp.MustCompile(Longitude) | |||
rxDNSName = regexp.MustCompile(DNSName) | |||
rxURL = regexp.MustCompile(URL) | |||
rxSSN = regexp.MustCompile(SSN) | |||
rxWinPath = regexp.MustCompile(WinPath) | |||
rxUnixPath = regexp.MustCompile(UnixPath) | |||
rxSemver = regexp.MustCompile(Semver) | |||
rxHasLowerCase = regexp.MustCompile(hasLowerCase) | |||
rxHasUpperCase = regexp.MustCompile(hasUpperCase) | |||
rxHasWhitespace = regexp.MustCompile(hasWhitespace) | |||
rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly) | |||
userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$") | |||
hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$") | |||
userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})") | |||
rxEmail = regexp.MustCompile(Email) | |||
rxCreditCard = regexp.MustCompile(CreditCard) | |||
rxISBN10 = regexp.MustCompile(ISBN10) | |||
rxISBN13 = regexp.MustCompile(ISBN13) | |||
rxUUID3 = regexp.MustCompile(UUID3) | |||
rxUUID4 = regexp.MustCompile(UUID4) | |||
rxUUID5 = regexp.MustCompile(UUID5) | |||
rxUUID = regexp.MustCompile(UUID) | |||
rxAlpha = regexp.MustCompile(Alpha) | |||
rxAlphanumeric = regexp.MustCompile(Alphanumeric) | |||
rxNumeric = regexp.MustCompile(Numeric) | |||
rxInt = regexp.MustCompile(Int) | |||
rxFloat = regexp.MustCompile(Float) | |||
rxHexadecimal = regexp.MustCompile(Hexadecimal) | |||
rxHexcolor = regexp.MustCompile(Hexcolor) | |||
rxRGBcolor = regexp.MustCompile(RGBcolor) | |||
rxASCII = regexp.MustCompile(ASCII) | |||
rxPrintableASCII = regexp.MustCompile(PrintableASCII) | |||
rxMultibyte = regexp.MustCompile(Multibyte) | |||
rxFullWidth = regexp.MustCompile(FullWidth) | |||
rxHalfWidth = regexp.MustCompile(HalfWidth) | |||
rxBase64 = regexp.MustCompile(Base64) | |||
rxDataURI = regexp.MustCompile(DataURI) | |||
rxMagnetURI = regexp.MustCompile(MagnetURI) | |||
rxLatitude = regexp.MustCompile(Latitude) | |||
rxLongitude = regexp.MustCompile(Longitude) | |||
rxDNSName = regexp.MustCompile(DNSName) | |||
rxURL = regexp.MustCompile(URL) | |||
rxSSN = regexp.MustCompile(SSN) | |||
rxWinPath = regexp.MustCompile(WinPath) | |||
rxUnixPath = regexp.MustCompile(UnixPath) | |||
rxSemver = regexp.MustCompile(Semver) | |||
rxHasLowerCase = regexp.MustCompile(hasLowerCase) | |||
rxHasUpperCase = regexp.MustCompile(hasUpperCase) | |||
rxHasWhitespace = regexp.MustCompile(hasWhitespace) | |||
rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly) | |||
rxIMEI = regexp.MustCompile(IMEI) | |||
) |
@@ -16,6 +16,7 @@ type CustomTypeValidator func(i interface{}, o interface{}) bool | |||
// ParamValidator is a wrapper for validator functions that accepts additional parameters. | |||
type ParamValidator func(str string, params ...string) bool | |||
type InterfaceParamValidator func(in interface{}, params ...string) bool | |||
type tagOptionsMap map[string]tagOption | |||
func (t tagOptionsMap) orderedKeys() []string { | |||
@@ -46,15 +47,27 @@ type UnsupportedTypeError struct { | |||
// It implements the methods to sort by string. | |||
type stringValues []reflect.Value | |||
// InterfaceParamTagMap is a map of functions accept variants parameters for an interface value | |||
var InterfaceParamTagMap = map[string]InterfaceParamValidator{ | |||
"type": IsType, | |||
} | |||
// InterfaceParamTagRegexMap maps interface param tags to their respective regexes. | |||
var InterfaceParamTagRegexMap = map[string]*regexp.Regexp{ | |||
"type": regexp.MustCompile(`^type\((.*)\)$`), | |||
} | |||
// ParamTagMap is a map of functions accept variants parameters | |||
var ParamTagMap = map[string]ParamValidator{ | |||
"length": ByteLength, | |||
"range": Range, | |||
"runelength": RuneLength, | |||
"stringlength": StringLength, | |||
"matches": StringMatches, | |||
"in": isInRaw, | |||
"rsapub": IsRsaPub, | |||
"length": ByteLength, | |||
"range": Range, | |||
"runelength": RuneLength, | |||
"stringlength": StringLength, | |||
"matches": StringMatches, | |||
"in": IsInRaw, | |||
"rsapub": IsRsaPub, | |||
"minstringlength": MinStringLength, | |||
"maxstringlength": MaxStringLength, | |||
} | |||
// ParamTagRegexMap maps param tags to their respective regexes. | |||
@@ -66,6 +79,8 @@ var ParamTagRegexMap = map[string]*regexp.Regexp{ | |||
"in": regexp.MustCompile(`^in\((.*)\)`), | |||
"matches": regexp.MustCompile(`^matches\((.+)\)$`), | |||
"rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"), | |||
"minstringlength": regexp.MustCompile("^minstringlength\\((\\d+)\\)$"), | |||
"maxstringlength": regexp.MustCompile("^maxstringlength\\((\\d+)\\)$"), | |||
} | |||
type customTypeTagMap struct { | |||
@@ -114,6 +129,7 @@ var TagMap = map[string]Validator{ | |||
"int": IsInt, | |||
"float": IsFloat, | |||
"null": IsNull, | |||
"notnull": IsNotNull, | |||
"uuid": IsUUID, | |||
"uuidv3": IsUUIDv3, | |||
"uuidv4": IsUUIDv4, | |||
@@ -146,6 +162,7 @@ var TagMap = map[string]Validator{ | |||
"ISO3166Alpha2": IsISO3166Alpha2, | |||
"ISO3166Alpha3": IsISO3166Alpha3, | |||
"ISO4217": IsISO4217, | |||
"IMEI": IsIMEI, | |||
} | |||
// ISO3166Entry stores country codes |
@@ -12,20 +12,20 @@ import ( | |||
"unicode/utf8" | |||
) | |||
// Contains check if the string contains the substring. | |||
// Contains checks if the string contains the substring. | |||
func Contains(str, substring string) bool { | |||
return strings.Contains(str, substring) | |||
} | |||
// Matches check if string matches the pattern (pattern is regular expression) | |||
// Matches checks if string matches the pattern (pattern is regular expression) | |||
// In case of error return false | |||
func Matches(str, pattern string) bool { | |||
match, _ := regexp.MatchString(pattern, str) | |||
return match | |||
} | |||
// LeftTrim trim characters from the left-side of the input. | |||
// If second argument is empty, it's will be remove leading spaces. | |||
// LeftTrim trims characters from the left side of the input. | |||
// If second argument is empty, it will remove leading spaces. | |||
func LeftTrim(str, chars string) string { | |||
if chars == "" { | |||
return strings.TrimLeftFunc(str, unicode.IsSpace) | |||
@@ -34,8 +34,8 @@ func LeftTrim(str, chars string) string { | |||
return r.ReplaceAllString(str, "") | |||
} | |||
// RightTrim trim characters from the right-side of the input. | |||
// If second argument is empty, it's will be remove spaces. | |||
// RightTrim trims characters from the right side of the input. | |||
// If second argument is empty, it will remove trailing spaces. | |||
func RightTrim(str, chars string) string { | |||
if chars == "" { | |||
return strings.TrimRightFunc(str, unicode.IsSpace) | |||
@@ -44,27 +44,27 @@ func RightTrim(str, chars string) string { | |||
return r.ReplaceAllString(str, "") | |||
} | |||
// Trim trim characters from both sides of the input. | |||
// If second argument is empty, it's will be remove spaces. | |||
// Trim trims characters from both sides of the input. | |||
// If second argument is empty, it will remove spaces. | |||
func Trim(str, chars string) string { | |||
return LeftTrim(RightTrim(str, chars), chars) | |||
} | |||
// WhiteList remove characters that do not appear in the whitelist. | |||
// WhiteList removes characters that do not appear in the whitelist. | |||
func WhiteList(str, chars string) string { | |||
pattern := "[^" + chars + "]+" | |||
r, _ := regexp.Compile(pattern) | |||
return r.ReplaceAllString(str, "") | |||
} | |||
// BlackList remove characters that appear in the blacklist. | |||
// BlackList removes characters that appear in the blacklist. | |||
func BlackList(str, chars string) string { | |||
pattern := "[" + chars + "]+" | |||
r, _ := regexp.Compile(pattern) | |||
return r.ReplaceAllString(str, "") | |||
} | |||
// StripLow remove characters with a numerical value < 32 and 127, mostly control characters. | |||
// StripLow removes characters with a numerical value < 32 and 127, mostly control characters. | |||
// If keep_new_lines is true, newline characters are preserved (\n and \r, hex 0xA and 0xD). | |||
func StripLow(str string, keepNewLines bool) string { | |||
chars := "" | |||
@@ -76,13 +76,13 @@ func StripLow(str string, keepNewLines bool) string { | |||
return BlackList(str, chars) | |||
} | |||
// ReplacePattern replace regular expression pattern in string | |||
// ReplacePattern replaces regular expression pattern in string | |||
func ReplacePattern(str, pattern, replace string) string { | |||
r, _ := regexp.Compile(pattern) | |||
return r.ReplaceAllString(str, replace) | |||
} | |||
// Escape replace <, >, & and " with HTML entities. | |||
// Escape replaces <, >, & and " with HTML entities. | |||
var Escape = html.EscapeString | |||
func addSegment(inrune, segment []rune) []rune { | |||
@@ -120,7 +120,7 @@ func CamelCaseToUnderscore(str string) string { | |||
return string(output) | |||
} | |||
// Reverse return reversed string | |||
// Reverse returns reversed string | |||
func Reverse(s string) string { | |||
r := []rune(s) | |||
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 { | |||
@@ -129,12 +129,12 @@ func Reverse(s string) string { | |||
return string(r) | |||
} | |||
// GetLines split string by "\n" and return array of lines | |||
// GetLines splits string by "\n" and return array of lines | |||
func GetLines(s string) []string { | |||
return strings.Split(s, "\n") | |||
} | |||
// GetLine return specified line of multiline string | |||
// GetLine returns specified line of multiline string | |||
func GetLine(s string, index int) (string, error) { | |||
lines := GetLines(s) | |||
if index < 0 || index >= len(lines) { | |||
@@ -143,12 +143,12 @@ func GetLine(s string, index int) (string, error) { | |||
return lines[index], nil | |||
} | |||
// RemoveTags remove all tags from HTML string | |||
// RemoveTags removes all tags from HTML string | |||
func RemoveTags(s string) string { | |||
return ReplacePattern(s, "<[^>]*>", "") | |||
} | |||
// SafeFileName return safe string that can be used in file names | |||
// SafeFileName returns safe string that can be used in file names | |||
func SafeFileName(str string) string { | |||
name := strings.ToLower(str) | |||
name = path.Clean(path.Base(name)) | |||
@@ -210,23 +210,23 @@ func Truncate(str string, length int, ending string) string { | |||
return str | |||
} | |||
// PadLeft pad left side of string if size of string is less then indicated pad length | |||
// PadLeft pads left side of a string if size of string is less then indicated pad length | |||
func PadLeft(str string, padStr string, padLen int) string { | |||
return buildPadStr(str, padStr, padLen, true, false) | |||
} | |||
// PadRight pad right side of string if size of string is less then indicated pad length | |||
// PadRight pads right side of a string if size of string is less then indicated pad length | |||
func PadRight(str string, padStr string, padLen int) string { | |||
return buildPadStr(str, padStr, padLen, false, true) | |||
} | |||
// PadBoth pad sides of string if size of string is less then indicated pad length | |||
// PadBoth pads both sides of a string if size of string is less then indicated pad length | |||
func PadBoth(str string, padStr string, padLen int) string { | |||
return buildPadStr(str, padStr, padLen, true, true) | |||
} | |||
// PadString either left, right or both sides, not the padding string can be unicode and more then one | |||
// character | |||
// PadString either left, right or both sides. | |||
// Note that padding string can be unicode and more then one character | |||
func buildPadStr(str string, padStr string, padLen int, padLeft bool, padRight bool) string { | |||
// When padded length is less then the current string size |
@@ -282,7 +282,7 @@ func HasLowerCase(str string) bool { | |||
return rxHasLowerCase.MatchString(str) | |||
} | |||
// HasUpperCase check if the string contians as least 1 uppercase. Empty string is valid. | |||
// HasUpperCase check if the string contains as least 1 uppercase. Empty string is valid. | |||
func HasUpperCase(str string) bool { | |||
if IsNull(str) { | |||
return true | |||
@@ -321,14 +321,19 @@ func IsNull(str string) bool { | |||
return len(str) == 0 | |||
} | |||
// IsNotNull check if the string is not null. | |||
func IsNotNull(str string) bool { | |||
return !IsNull(str) | |||
} | |||
// HasWhitespaceOnly checks the string only contains whitespace | |||
func HasWhitespaceOnly(str string) bool { | |||
return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str) | |||
return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str) | |||
} | |||
// HasWhitespace checks if the string contains any whitespace | |||
func HasWhitespace(str string) bool { | |||
return len(str) > 0 && rxHasWhitespace.MatchString(str) | |||
return len(str) > 0 && rxHasWhitespace.MatchString(str) | |||
} | |||
// IsByteLength check if the string's length (in bytes) falls in a range. | |||
@@ -513,6 +518,11 @@ func IsDataURI(str string) bool { | |||
return IsBase64(dataURI[1]) | |||
} | |||
// IsMagnetURI checks if a string is valid magnet URI | |||
func IsMagnetURI(str string) bool { | |||
return rxMagnetURI.MatchString(str) | |||
} | |||
// IsISO3166Alpha2 checks if a string is valid two-letter country code | |||
func IsISO3166Alpha2(str string) bool { | |||
for _, entry := range ISO3166List { | |||
@@ -565,7 +575,7 @@ func IsDNSName(str string) bool { | |||
// IsHash checks if a string is a hash of type algorithm. | |||
// Algorithm is one of ['md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'tiger128', 'tiger160', 'tiger192', 'crc32', 'crc32b'] | |||
func IsHash(str string, algorithm string) bool { | |||
len := "0" | |||
var len string | |||
algo := strings.ToLower(algorithm) | |||
if algo == "crc32" || algo == "crc32b" { | |||
@@ -589,9 +599,73 @@ func IsHash(str string, algorithm string) bool { | |||
return Matches(str, "^[a-f0-9]{"+len+"}$") | |||
} | |||
// IsSHA512 checks is a string is a SHA512 hash. Alias for `IsHash(str, "sha512")` | |||
func IsSHA512(str string) bool { | |||
return IsHash(str, "sha512") | |||
} | |||
// IsSHA384 checks is a string is a SHA384 hash. Alias for `IsHash(str, "sha384")` | |||
func IsSHA384(str string) bool { | |||
return IsHash(str, "sha384") | |||
} | |||
// IsSHA256 checks is a string is a SHA256 hash. Alias for `IsHash(str, "sha256")` | |||
func IsSHA256(str string) bool { | |||
return IsHash(str, "sha256") | |||
} | |||
// IsTiger192 checks is a string is a Tiger192 hash. Alias for `IsHash(str, "tiger192")` | |||
func IsTiger192(str string) bool { | |||
return IsHash(str, "tiger192") | |||
} | |||
// IsTiger160 checks is a string is a Tiger160 hash. Alias for `IsHash(str, "tiger160")` | |||
func IsTiger160(str string) bool { | |||
return IsHash(str, "tiger160") | |||
} | |||
// IsRipeMD160 checks is a string is a RipeMD160 hash. Alias for `IsHash(str, "ripemd160")` | |||
func IsRipeMD160(str string) bool { | |||
return IsHash(str, "ripemd160") | |||
} | |||
// IsSHA1 checks is a string is a SHA-1 hash. Alias for `IsHash(str, "sha1")` | |||
func IsSHA1(str string) bool { | |||
return IsHash(str, "sha1") | |||
} | |||
// IsTiger128 checks is a string is a Tiger128 hash. Alias for `IsHash(str, "tiger128")` | |||
func IsTiger128(str string) bool { | |||
return IsHash(str, "tiger128") | |||
} | |||
// IsRipeMD128 checks is a string is a RipeMD128 hash. Alias for `IsHash(str, "ripemd128")` | |||
func IsRipeMD128(str string) bool { | |||
return IsHash(str, "ripemd128") | |||
} | |||
// IsCRC32 checks is a string is a CRC32 hash. Alias for `IsHash(str, "crc32")` | |||
func IsCRC32(str string) bool { | |||
return IsHash(str, "crc32") | |||
} | |||
// IsCRC32b checks is a string is a CRC32b hash. Alias for `IsHash(str, "crc32b")` | |||
func IsCRC32b(str string) bool { | |||
return IsHash(str, "crc32b") | |||
} | |||
// IsMD5 checks is a string is a MD5 hash. Alias for `IsHash(str, "md5")` | |||
func IsMD5(str string) bool { | |||
return IsHash(str, "md5") | |||
} | |||
// IsMD4 checks is a string is a MD4 hash. Alias for `IsHash(str, "md4")` | |||
func IsMD4(str string) bool { | |||
return IsHash(str, "md4") | |||
} | |||
// IsDialString validates the given string for usage with the various Dial() functions | |||
func IsDialString(str string) bool { | |||
if h, p, err := net.SplitHostPort(str); err == nil && h != "" && p != "" && (IsDNSName(h) || IsIP(h)) && IsPort(p) { | |||
return true | |||
} | |||
@@ -599,7 +673,7 @@ func IsDialString(str string) bool { | |||
return false | |||
} | |||
// IsIP checks if a string is either IP version 4 or 6. | |||
// IsIP checks if a string is either IP version 4 or 6. Alias for `net.ParseIP` | |||
func IsIP(str string) bool { | |||
return net.ParseIP(str) != nil | |||
} | |||
@@ -663,6 +737,11 @@ func IsLongitude(str string) bool { | |||
return rxLongitude.MatchString(str) | |||
} | |||
// IsIMEI check 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 | |||
func IsRsaPublicKey(str string, keylen int) bool { | |||
bb := bytes.NewBufferString(str) | |||
@@ -729,12 +808,116 @@ func PrependPathToErrors(err error, path string) error { | |||
} | |||
return err2 | |||
} | |||
fmt.Println(err) | |||
return err | |||
} | |||
// 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. | |||
// m is the validation map in the form: | |||
// map[string]interface{}{"name":"required,alpha","address":map[string]interface{}{"line1":"required,alphanum"}} | |||
func ValidateMap(s map[string]interface{}, m map[string]interface{}) (bool, error) { | |||
if s == nil { | |||
return true, nil | |||
} | |||
result := true | |||
var err error | |||
var errs Errors | |||
var index int | |||
val := reflect.ValueOf(s) | |||
for key, value := range s { | |||
presentResult := true | |||
validator, ok := m[key] | |||
if !ok { | |||
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) | |||
errs = append(errs, err) | |||
} | |||
valueField := reflect.ValueOf(value) | |||
mapResult := true | |||
typeResult := true | |||
structResult := true | |||
resultField := true | |||
switch subValidator := validator.(type) { | |||
case map[string]interface{}: | |||
var err error | |||
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) | |||
errs = append(errs, err) | |||
} else { | |||
mapResult, err = ValidateMap(v, subValidator) | |||
if err != nil { | |||
mapResult = false | |||
err = PrependPathToErrors(err, key) | |||
errs = append(errs, err) | |||
} | |||
} | |||
case string: | |||
if (valueField.Kind() == reflect.Struct || | |||
(valueField.Kind() == reflect.Ptr && valueField.Elem().Kind() == reflect.Struct)) && | |||
subValidator != "-" { | |||
var err error | |||
structResult, err = ValidateStruct(valueField.Interface()) | |||
if err != nil { | |||
err = PrependPathToErrors(err, key) | |||
errs = append(errs, err) | |||
} | |||
} | |||
resultField, err = typeCheck(valueField, reflect.StructField{ | |||
Name: key, | |||
PkgPath: "", | |||
Type: val.Type(), | |||
Tag: reflect.StructTag(fmt.Sprintf("%s:%q", tagName, subValidator)), | |||
Offset: 0, | |||
Index: []int{index}, | |||
Anonymous: false, | |||
}, val, nil) | |||
if err != nil { | |||
errs = append(errs, err) | |||
} | |||
case nil: | |||
// already handlerd when checked before | |||
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) | |||
errs = append(errs, err) | |||
} | |||
result = result && presentResult && typeResult && resultField && structResult && mapResult | |||
index++ | |||
} | |||
// check required keys | |||
requiredResult := true | |||
for key, value := range m { | |||
if schema, ok := value.(string); ok { | |||
tags := parseTagIntoMap(schema) | |||
if required, ok := tags["required"]; ok { | |||
if _, ok := s[key]; !ok { | |||
requiredResult = false | |||
if required.customErrorMessage != "" { | |||
err = Error{key, fmt.Errorf(required.customErrorMessage), true, "required", []string{}} | |||
} else { | |||
err = Error{key, fmt.Errorf("required field missing"), false, "required", []string{}} | |||
} | |||
errs = append(errs, err) | |||
} | |||
} | |||
} | |||
} | |||
if len(errs) > 0 { | |||
err = errs | |||
} | |||
return result && requiredResult, err | |||
} | |||
// ValidateStruct use tags for fields. | |||
// result will be equal to `false` if there are any errors. | |||
// todo currently there is no guarantee that errors will be returned in predictable order (tests may to fail) | |||
func ValidateStruct(s interface{}) (bool, error) { | |||
if s == nil { | |||
return true, nil | |||
@@ -856,12 +1039,29 @@ func IsSemver(str string) bool { | |||
return rxSemver.MatchString(str) | |||
} | |||
// IsType check if interface is of some type | |||
func IsType(v interface{}, params ...string) bool { | |||
if len(params) == 1 { | |||
typ := params[0] | |||
return strings.Replace(reflect.TypeOf(v).String(), " ", "", -1) == strings.Replace(typ, " ", "", -1) | |||
} | |||
return false | |||
} | |||
// IsTime check 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 | |||
func IsUnixTime(str string) bool { | |||
if _, err := strconv.Atoi(str); err == nil { | |||
return true | |||
} | |||
return false | |||
} | |||
// IsRFC3339 check if string is valid timestamp value according to RFC3339 | |||
func IsRFC3339(str string) bool { | |||
return IsTime(str, time.RFC3339) | |||
@@ -933,6 +1133,30 @@ func StringLength(str string, params ...string) bool { | |||
return false | |||
} | |||
// MinStringLength check string's minimum length (including multi byte strings) | |||
func MinStringLength(str string, params ...string) bool { | |||
if len(params) == 1 { | |||
strLength := utf8.RuneCountInString(str) | |||
min, _ := ToInt(params[0]) | |||
return strLength >= int(min) | |||
} | |||
return false | |||
} | |||
// MaxStringLength check string's maximum length (including multi byte strings) | |||
func MaxStringLength(str string, params ...string) bool { | |||
if len(params) == 1 { | |||
strLength := utf8.RuneCountInString(str) | |||
max, _ := ToInt(params[0]) | |||
return strLength <= int(max) | |||
} | |||
return false | |||
} | |||
// Range check string's length | |||
func Range(str string, params ...string) bool { | |||
if len(params) == 2 { | |||
@@ -945,7 +1169,7 @@ func Range(str string, params ...string) bool { | |||
return false | |||
} | |||
func isInRaw(str string, params ...string) bool { | |||
func IsInRaw(str string, params ...string) bool { | |||
if len(params) == 1 { | |||
rawParams := params[0] | |||
@@ -1014,7 +1238,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options | |||
options = parseTagIntoMap(tag) | |||
} | |||
if isEmptyValue(v) { | |||
if !isFieldSet(v) { | |||
// an empty value is not validated, check only required | |||
isValid, resultErr = checkRequired(v, t, options) | |||
for key := range options { | |||
@@ -1062,6 +1286,45 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options | |||
}() | |||
} | |||
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' | |||
if validator[0] == '!' { | |||
validator = validator[1:] | |||
negate = true | |||
} | |||
// Check for interface param validators | |||
for key, value := range InterfaceParamTagRegexMap { | |||
ps := value.FindStringSubmatch(validator) | |||
if len(ps) == 0 { | |||
continue | |||
} | |||
validatefunc, ok := InterfaceParamTagMap[key] | |||
if !ok { | |||
continue | |||
} | |||
delete(options, validatorSpec) | |||
field := fmt.Sprint(v) | |||
if result := validatefunc(v.Interface(), ps[1:]...); (!result && !negate) || (result && negate) { | |||
if customMsgExists { | |||
return false, Error{t.Name, TruncatingErrorf(validatorStruct.customErrorMessage, field, validator), customMsgExists, stripParams(validatorSpec), []string{}} | |||
} | |||
if negate { | |||
return false, Error{t.Name, fmt.Errorf("%s does validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} | |||
} | |||
return false, Error{t.Name, fmt.Errorf("%s does not validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} | |||
} | |||
} | |||
} | |||
switch v.Kind() { | |||
case reflect.Bool, | |||
reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, | |||
@@ -1121,10 +1384,10 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options | |||
delete(options, validatorSpec) | |||
switch v.Kind() { | |||
case reflect.String, | |||
reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, | |||
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, | |||
reflect.Float32, reflect.Float64: | |||
case reflect.String, | |||
reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, | |||
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, | |||
reflect.Float32, reflect.Float64: | |||
field := fmt.Sprint(v) // make value into string, then validate with regex | |||
if result := validatefunc(field); !result && !negate || result && negate { | |||
if customMsgExists { | |||
@@ -1202,7 +1465,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options | |||
} | |||
return typeCheck(v.Elem(), t, o, options) | |||
case reflect.Struct: | |||
return ValidateStruct(v.Interface()) | |||
return true, nil | |||
default: | |||
return false, &UnsupportedTypeError{v.Type()} | |||
} | |||
@@ -1212,25 +1475,14 @@ func stripParams(validatorString string) string { | |||
return paramsRegexp.ReplaceAllString(validatorString, "") | |||
} | |||
func isEmptyValue(v reflect.Value) bool { | |||
// isFieldSet returns false for nil pointers, interfaces, maps, and slices. For all other values, it returns true. | |||
func isFieldSet(v reflect.Value) bool { | |||
switch v.Kind() { | |||
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() | |||
case reflect.Map, reflect.Slice, reflect.Interface, reflect.Ptr: | |||
return !v.IsNil() | |||
} | |||
return reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface()) | |||
return true | |||
} | |||
// ErrorByField returns error for specified field of the struct | |||
@@ -1252,11 +1504,11 @@ func ErrorsByField(e error) map[string]string { | |||
} | |||
// prototype for ValidateStruct | |||
switch e.(type) { | |||
switch e := e.(type) { | |||
case Error: | |||
m[e.(Error).Name] = e.(Error).Err.Error() | |||
m[e.Name] = e.Err.Error() | |||
case Errors: | |||
for _, item := range e.(Errors).Errors() { | |||
for _, item := range e.Errors() { | |||
n := ErrorsByField(item) | |||
for k, v := range n { | |||
m[k] = v |
@@ -12,4 +12,4 @@ build: | |||
- script: | |||
name: go test | |||
code: | | |||
go test -race ./... | |||
go test -race -v ./... |
@@ -1,5 +1,12 @@ | |||
root = true | |||
[*] | |||
[*.go] | |||
indent_style = tab | |||
indent_size = 4 | |||
insert_final_newline = true | |||
[*.{yml,yaml}] | |||
indent_style = space | |||
indent_size = 2 | |||
insert_final_newline = true | |||
trim_trailing_whitespace = true |
@@ -0,0 +1 @@ | |||
go.sum linguist-generated |
@@ -2,29 +2,35 @@ sudo: false | |||
language: go | |||
go: | |||
- 1.8.x | |||
- 1.9.x | |||
- tip | |||
- "stable" | |||
- "1.11.x" | |||
- "1.10.x" | |||
- "1.9.x" | |||
matrix: | |||
include: | |||
- go: "stable" | |||
env: GOLINT=true | |||
allow_failures: | |||
- go: tip | |||
fast_finish: true | |||
before_script: | |||
- go get -u github.com/golang/lint/golint | |||
before_install: | |||
- if [ ! -z "${GOLINT}" ]; then go get -u golang.org/x/lint/golint; fi | |||
script: | |||
- go test -v --race ./... | |||
- go test --race ./... | |||
after_script: | |||
- test -z "$(gofmt -s -l -w . | tee /dev/stderr)" | |||
- test -z "$(golint ./... | tee /dev/stderr)" | |||
- if [ ! -z "${GOLINT}" ]; then echo running golint; golint --set_exit_status ./...; else echo skipping golint; fi | |||
- go vet ./... | |||
os: | |||
- linux | |||
- osx | |||
- windows | |||
notifications: | |||
email: false |
@@ -1,5 +1,5 @@ | |||
Copyright (c) 2012 The Go Authors. All rights reserved. | |||
Copyright (c) 2012 fsnotify Authors. All rights reserved. | |||
Copyright (c) 2012-2019 fsnotify Authors. All rights reserved. | |||
Redistribution and use in source and binary forms, with or without | |||
modification, are permitted provided that the following conditions are |
@@ -10,16 +10,16 @@ go get -u golang.org/x/sys/... | |||
Cross platform: Windows, Linux, BSD and macOS. | |||
|Adapter |OS |Status | | |||
|----------|----------|----------| | |||
|inotify |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| | |||
|kqueue |BSD, macOS, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| | |||
|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)| | |||
|FSEvents |macOS |[Planned](https://github.com/fsnotify/fsnotify/issues/11)| | |||
|FEN |Solaris 11 |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)| | |||
|fanotify |Linux 2.6.37+ | | | |||
|USN Journals |Windows |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)| | |||
|Polling |*All* |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)| | |||
| Adapter | OS | Status | | |||
| --------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | |||
| inotify | Linux 2.6.27 or later, Android\* | Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify) | | |||
| kqueue | BSD, macOS, iOS\* | Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify) | | |||
| ReadDirectoryChangesW | Windows | Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify) | | |||
| FSEvents | macOS | [Planned](https://github.com/fsnotify/fsnotify/issues/11) | | |||
| FEN | Solaris 11 | [In Progress](https://github.com/fsnotify/fsnotify/issues/12) | | |||
| fanotify | Linux 2.6.37+ | [Planned](https://github.com/fsnotify/fsnotify/issues/114) | | |||
| USN Journals | Windows | [Maybe](https://github.com/fsnotify/fsnotify/issues/53) | | |||
| Polling | *All* | [Maybe](https://github.com/fsnotify/fsnotify/issues/9) | | |||
\* Android and iOS are untested. | |||
@@ -33,6 +33,53 @@ All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based o | |||
Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`. | |||
## Usage | |||
```go | |||
package main | |||
import ( | |||
"log" | |||
"github.com/fsnotify/fsnotify" | |||
) | |||
func main() { | |||
watcher, err := fsnotify.NewWatcher() | |||
if err != nil { | |||
log.Fatal(err) | |||
} | |||
defer watcher.Close() | |||
done := make(chan bool) | |||
go func() { | |||
for { | |||
select { | |||
case event, ok := <-watcher.Events: | |||
if !ok { | |||
return | |||
} | |||
log.Println("event:", event) | |||
if event.Op&fsnotify.Write == fsnotify.Write { | |||
log.Println("modified file:", event.Name) | |||
} | |||
case err, ok := <-watcher.Errors: | |||
if !ok { | |||
return | |||
} | |||
log.Println("error:", err) | |||
} | |||
} | |||
}() | |||
err = watcher.Add("/tmp/foo") | |||
if err != nil { | |||
log.Fatal(err) | |||
} | |||
<-done | |||
} | |||
``` | |||
## Contributing | |||
Please refer to [CONTRIBUTING][] before opening an issue or pull request. | |||
@@ -65,6 +112,10 @@ There are OS-specific limits as to how many watches can be created: | |||
* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error. | |||
* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error. | |||
**Why don't notifications work with NFS filesystems or filesystem in userspace (FUSE)?** | |||
fsnotify requires support from underlying OS to work. The current NFS protocol does not provide network level support for file notifications. | |||
[#62]: https://github.com/howeyc/fsnotify/issues/62 | |||
[#18]: https://github.com/fsnotify/fsnotify/issues/18 | |||
[#11]: https://github.com/fsnotify/fsnotify/issues/11 |
@@ -63,4 +63,6 @@ func (e Event) String() string { | |||
} | |||
// Common errors that can be reported by a watcher | |||
var ErrEventOverflow = errors.New("fsnotify queue overflow") | |||
var ( | |||
ErrEventOverflow = errors.New("fsnotify queue overflow") | |||
) |
@@ -0,0 +1,5 @@ | |||
module github.com/fsnotify/fsnotify | |||
go 1.13 | |||
require golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9 |
@@ -0,0 +1,2 @@ | |||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9 h1:L2auWcuQIvxz9xSEqzESnV/QN/gNRXNApHi3fYwl2w0= | |||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
@@ -40,12 +40,12 @@ func newFdPoller(fd int) (*fdPoller, error) { | |||
poller.fd = fd | |||
// Create epoll fd | |||
poller.epfd, errno = unix.EpollCreate1(0) | |||
poller.epfd, errno = unix.EpollCreate1(unix.EPOLL_CLOEXEC) | |||
if poller.epfd == -1 { | |||
return nil, errno | |||
} | |||
// Create pipe; pipe[0] is the read end, pipe[1] the write end. | |||
errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK) | |||
errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK|unix.O_CLOEXEC) | |||
if errno != nil { | |||
return nil, errno | |||
} |
@@ -8,4 +8,4 @@ package fsnotify | |||
import "golang.org/x/sys/unix" | |||
const openMode = unix.O_NONBLOCK | unix.O_RDONLY | |||
const openMode = unix.O_NONBLOCK | unix.O_RDONLY | unix.O_CLOEXEC |
@@ -9,4 +9,4 @@ package fsnotify | |||
import "golang.org/x/sys/unix" | |||
// note: this constant is not defined on BSD | |||
const openMode = unix.O_EVTONLY | |||
const openMode = unix.O_EVTONLY | unix.O_CLOEXEC |
@@ -25,3 +25,8 @@ linters: | |||
# linter rather than changing code that works. | |||
# see: https://github.com/kyoh86/scopelint/issues/4 | |||
- scopelint | |||
- godox | |||
- gocognit | |||
- whitespace | |||
- wsl | |||
- funlen |
@@ -1,12 +1,10 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.11.x | |||
- 1.12.x | |||
- 1.13.x | |||
- 1.14.x | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
env: | |||
- GO111MODULE=on | |||
- go get -u gotest.tools/gotestsum | |||
language: go | |||
notifications: | |||
slack: |
@@ -221,7 +221,7 @@ func (s *Spec) initialize() { | |||
s.analyzeItems("items", parameter.Items, refPref, "parameter") | |||
} | |||
if parameter.In == "body" && parameter.Schema != nil { | |||
s.analyzeSchema("schema", *parameter.Schema, refPref) | |||
s.analyzeSchema("schema", parameter.Schema, refPref) | |||
} | |||
if parameter.Pattern != "" { | |||
s.patterns.addParameterPattern(refPref, parameter.Pattern) | |||
@@ -246,12 +246,13 @@ func (s *Spec) initialize() { | |||
} | |||
} | |||
if response.Schema != nil { | |||
s.analyzeSchema("schema", *response.Schema, refPref) | |||
s.analyzeSchema("schema", response.Schema, refPref) | |||
} | |||
} | |||
for name, schema := range s.spec.Definitions { | |||
s.analyzeSchema(name, schema, "/definitions") | |||
for name := range s.spec.Definitions { | |||
schema := s.spec.Definitions[name] | |||
s.analyzeSchema(name, &schema, "/definitions") | |||
} | |||
// TODO: after analyzing all things and flattening schemas etc | |||
// resolve all the collected references to their final representations | |||
@@ -288,7 +289,7 @@ func (s *Spec) analyzeOperations(path string, pi *spec.PathItem) { | |||
s.analyzeItems("items", param.Items, refPref, "parameter") | |||
} | |||
if param.Schema != nil { | |||
s.analyzeSchema("schema", *param.Schema, refPref) | |||
s.analyzeSchema("schema", param.Schema, refPref) | |||
} | |||
} | |||
} | |||
@@ -344,7 +345,7 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { | |||
} | |||
s.analyzeItems("items", param.Items, refPref, "parameter") | |||
if param.In == "body" && param.Schema != nil { | |||
s.analyzeSchema("schema", *param.Schema, refPref) | |||
s.analyzeSchema("schema", param.Schema, refPref) | |||
} | |||
} | |||
if op.Responses != nil { | |||
@@ -361,7 +362,7 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { | |||
} | |||
} | |||
if op.Responses.Default.Schema != nil { | |||
s.analyzeSchema("schema", *op.Responses.Default.Schema, refPref) | |||
s.analyzeSchema("schema", op.Responses.Default.Schema, refPref) | |||
} | |||
} | |||
for k, res := range op.Responses.StatusCodeResponses { | |||
@@ -380,17 +381,17 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { | |||
} | |||
} | |||
if res.Schema != nil { | |||
s.analyzeSchema("schema", *res.Schema, refPref) | |||
s.analyzeSchema("schema", res.Schema, refPref) | |||
} | |||
} | |||
} | |||
} | |||
func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) { | |||
func (s *Spec) analyzeSchema(name string, schema *spec.Schema, prefix string) { | |||
refURI := slashpath.Join(prefix, jsonpointer.Escape(name)) | |||
schRef := SchemaRef{ | |||
Name: name, | |||
Schema: &schema, | |||
Schema: schema, | |||
Ref: spec.MustCreateRef("#" + refURI), | |||
TopLevel: prefix == "/definitions", | |||
} | |||
@@ -408,28 +409,34 @@ func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) { | |||
} | |||
for k, v := range schema.Definitions { | |||
s.analyzeSchema(k, v, slashpath.Join(refURI, "definitions")) | |||
v := v | |||
s.analyzeSchema(k, &v, slashpath.Join(refURI, "definitions")) | |||
} | |||
for k, v := range schema.Properties { | |||
s.analyzeSchema(k, v, slashpath.Join(refURI, "properties")) | |||
v := v | |||
s.analyzeSchema(k, &v, slashpath.Join(refURI, "properties")) | |||
} | |||
for k, v := range schema.PatternProperties { | |||
v := v | |||
// NOTE: swagger 2.0 does not support PatternProperties. | |||
// However it is possible to analyze this in a schema | |||
s.analyzeSchema(k, v, slashpath.Join(refURI, "patternProperties")) | |||
s.analyzeSchema(k, &v, slashpath.Join(refURI, "patternProperties")) | |||
} | |||
for i, v := range schema.AllOf { | |||
for i := range schema.AllOf { | |||
v := &schema.AllOf[i] | |||
s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "allOf")) | |||
} | |||
if len(schema.AllOf) > 0 { | |||
s.allOfs["#"+refURI] = schRef | |||
} | |||
for i, v := range schema.AnyOf { | |||
for i := range schema.AnyOf { | |||
v := &schema.AnyOf[i] | |||
// NOTE: swagger 2.0 does not support anyOf constructs. | |||
// However it is possible to analyze this in a schema | |||
s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "anyOf")) | |||
} | |||
for i, v := range schema.OneOf { | |||
for i := range schema.OneOf { | |||
v := &schema.OneOf[i] | |||
// NOTE: swagger 2.0 does not support oneOf constructs. | |||
// However it is possible to analyze this in a schema | |||
s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "oneOf")) | |||
@@ -437,21 +444,22 @@ func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) { | |||
if schema.Not != nil { | |||
// NOTE: swagger 2.0 does not support "not" constructs. | |||
// However it is possible to analyze this in a schema | |||
s.analyzeSchema("not", *schema.Not, refURI) | |||
s.analyzeSchema("not", schema.Not, refURI) | |||
} | |||
if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil { | |||
s.analyzeSchema("additionalProperties", *schema.AdditionalProperties.Schema, refURI) | |||
s.analyzeSchema("additionalProperties", schema.AdditionalProperties.Schema, refURI) | |||
} | |||
if schema.AdditionalItems != nil && schema.AdditionalItems.Schema != nil { | |||
// NOTE: swagger 2.0 does not support AdditionalItems. | |||
// However it is possible to analyze this in a schema | |||
s.analyzeSchema("additionalItems", *schema.AdditionalItems.Schema, refURI) | |||
s.analyzeSchema("additionalItems", schema.AdditionalItems.Schema, refURI) | |||
} | |||
if schema.Items != nil { | |||
if schema.Items.Schema != nil { | |||
s.analyzeSchema("items", *schema.Items.Schema, refURI) | |||
s.analyzeSchema("items", schema.Items.Schema, refURI) | |||
} | |||
for i, sch := range schema.Items.Schemas { | |||
for i := range schema.Items.Schemas { | |||
sch := &schema.Items.Schemas[i] | |||
s.analyzeSchema(strconv.Itoa(i), sch, slashpath.Join(refURI, "items")) | |||
} | |||
} |
@@ -41,10 +41,11 @@ type FlattenOpts struct { | |||
BasePath string | |||
// Flattening options | |||
Expand bool // If Expand is true, we skip flattening the spec and expand it instead | |||
Minimal bool | |||
Verbose bool | |||
RemoveUnused bool | |||
Expand bool // If Expand is true, we skip flattening the spec and expand it instead | |||
Minimal bool | |||
Verbose bool | |||
RemoveUnused bool | |||
ContinueOnError bool // Continues when facing some issues | |||
/* Extra keys */ | |||
_ struct{} // require keys | |||
@@ -135,6 +136,7 @@ func newContext() *context { | |||
// - ... | |||
// | |||
func Flatten(opts FlattenOpts) error { | |||
debugLog("FlattenOpts: %#v", opts) | |||
// Make sure opts.BasePath is an absolute path | |||
if !filepath.IsAbs(opts.BasePath) { | |||
cwd, _ := os.Getwd() | |||
@@ -148,7 +150,9 @@ func Flatten(opts FlattenOpts) error { | |||
// recursively expand responses, parameters, path items and items in simple schemas. | |||
// This simplifies the spec and leaves $ref only into schema objects. | |||
if err := swspec.ExpandSpec(opts.Swagger(), opts.ExpandOpts(!opts.Expand)); err != nil { | |||
expandOpts := opts.ExpandOpts(!opts.Expand) | |||
expandOpts.ContinueOnError = opts.ContinueOnError | |||
if err := swspec.ExpandSpec(opts.Swagger(), expandOpts); err != nil { | |||
return err | |||
} | |||
@@ -846,7 +850,7 @@ func importExternalReferences(opts *FlattenOpts) (bool, error) { | |||
enums: enumAnalysis{}, | |||
} | |||
partialAnalyzer.reset() | |||
partialAnalyzer.analyzeSchema("", *sch, "/") | |||
partialAnalyzer.analyzeSchema("", sch, "/") | |||
// now rewrite those refs with rebase | |||
for key, ref := range partialAnalyzer.references.allRefs { | |||
@@ -874,6 +878,7 @@ func importExternalReferences(opts *FlattenOpts) (bool, error) { | |||
if _, ok := opts.flattenContext.newRefs[key]; ok { | |||
resolved = opts.flattenContext.newRefs[key].resolved | |||
} | |||
debugLog("keeping track of ref: %s (%s), resolved: %t", key, newName, resolved) | |||
opts.flattenContext.newRefs[key] = &newRef{ | |||
key: key, | |||
newName: newName, | |||
@@ -1308,16 +1313,55 @@ func stripPointersAndOAIGen(opts *FlattenOpts) error { | |||
return err | |||
} | |||
// restrip | |||
// restrip and re-analyze | |||
if hasIntroducedPointerOrInline, ers = stripOAIGen(opts); ers != nil { | |||
return ers | |||
} | |||
opts.Spec.reload() // re-analyze | |||
} | |||
return nil | |||
} | |||
func updateRefParents(opts *FlattenOpts, r *newRef) { | |||
if !r.isOAIGen || r.resolved { // bail on already resolved entries (avoid looping) | |||
return | |||
} | |||
for k, v := range opts.Spec.references.allRefs { | |||
if r.path != v.String() { | |||
continue | |||
} | |||
found := false | |||
for _, p := range r.parents { | |||
if p == k { | |||
found = true | |||
break | |||
} | |||
} | |||
if !found { | |||
r.parents = append(r.parents, k) | |||
} | |||
} | |||
} | |||
// topMostRefs is able to sort refs by hierarchical then lexicographic order, | |||
// yielding refs ordered breadth-first. | |||
type topmostRefs []string | |||
func (k topmostRefs) Len() int { return len(k) } | |||
func (k topmostRefs) Swap(i, j int) { k[i], k[j] = k[j], k[i] } | |||
func (k topmostRefs) Less(i, j int) bool { | |||
li, lj := len(strings.Split(k[i], "/")), len(strings.Split(k[j], "/")) | |||
if li == lj { | |||
return k[i] < k[j] | |||
} | |||
return li < lj | |||
} | |||
func topmostFirst(refs []string) []string { | |||
res := topmostRefs(refs) | |||
sort.Sort(res) | |||
return res | |||
} | |||
// stripOAIGen strips the spec from unnecessary OAIGen constructs, initially created to dedupe flattened definitions. | |||
// | |||
// A dedupe is deemed unnecessary whenever: | |||
@@ -1325,44 +1369,25 @@ func stripPointersAndOAIGen(opts *FlattenOpts) error { | |||
// - there is a conflict with multiple parents: merge OAIGen in first parent, the rewrite other parents to point to | |||
// the first parent. | |||
// | |||
// This function returns a true bool whenever it re-inlined a complex schema, so the caller may chose to iterate | |||
// This function returns true whenever it re-inlined a complex schema, so the caller may chose to iterate | |||
// pointer and name resolution again. | |||
func stripOAIGen(opts *FlattenOpts) (bool, error) { | |||
debugLog("stripOAIGen") | |||
replacedWithComplex := false | |||
// figure out referers of OAIGen definitions | |||
// figure out referers of OAIGen definitions (doing it before the ref start mutating) | |||
for _, r := range opts.flattenContext.newRefs { | |||
if !r.isOAIGen || r.resolved { // bail on already resolved entries (avoid looping) | |||
continue | |||
} | |||
for k, v := range opts.Spec.references.allRefs { | |||
if r.path != v.String() { | |||
continue | |||
} | |||
found := false | |||
for _, p := range r.parents { | |||
if p == k { | |||
found = true | |||
break | |||
} | |||
} | |||
if !found { | |||
r.parents = append(r.parents, k) | |||
} | |||
} | |||
updateRefParents(opts, r) | |||
} | |||
for k := range opts.flattenContext.newRefs { | |||
r := opts.flattenContext.newRefs[k] | |||
//debugLog("newRefs[%s]: isOAIGen: %t, resolved: %t, name: %s, path:%s, #parents: %d, parents: %v, ref: %s", | |||
// k, r.isOAIGen, r.resolved, r.newName, r.path, len(r.parents), r.parents, r.schema.Ref.String()) | |||
debugLog("newRefs[%s]: isOAIGen: %t, resolved: %t, name: %s, path:%s, #parents: %d, parents: %v, ref: %s", | |||
k, r.isOAIGen, r.resolved, r.newName, r.path, len(r.parents), r.parents, r.schema.Ref.String()) | |||
if r.isOAIGen && len(r.parents) >= 1 { | |||
pr := r.parents | |||
sort.Strings(pr) | |||
pr := topmostFirst(r.parents) | |||
// rewrite first parent schema in lexicographical order | |||
debugLog("rewrite first parent in lex order %s with schema", pr[0]) | |||
// rewrite first parent schema in hierarchical then lexicographical order | |||
debugLog("rewrite first parent %s with schema", pr[0]) | |||
if err := updateRefWithSchema(opts.Swagger(), pr[0], r.schema); err != nil { | |||
return false, err | |||
} |
@@ -1,13 +1,23 @@ | |||
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.3 | |||
github.com/go-openapi/strfmt v0.19.3 | |||
github.com/go-openapi/swag v0.19.5 | |||
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.1.1 // indirect | |||
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 | |||
) | |||
go 1.13 |
@@ -1,3 +1,4 @@ | |||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | |||
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= | |||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
@@ -6,6 +7,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko | |||
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/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= | |||
@@ -14,6 +17,8 @@ github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70t | |||
github.com/go-openapi/errors v0.17.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/jsonpointer v0.17.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= | |||
@@ -22,28 +27,70 @@ github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34 | |||
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.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/loads v0.19.0 h1:wCOBNscACI8L93tt5tvB2zOMkJ098XCw3fP0BY2ybDA= | |||
github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | |||
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.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/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | |||
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/swag v0.17.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-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= | |||
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= | |||
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= | |||
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | |||
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | |||
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= | |||
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | |||
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | |||
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= | |||
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= | |||
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= | |||
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= | |||
github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= | |||
github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= | |||
github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= | |||
github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= | |||
github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= | |||
github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | |||
github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | |||
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | |||
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | |||
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= | |||
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= | |||
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= | |||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | |||
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/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/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | |||
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= | |||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
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= | |||
@@ -55,23 +102,47 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB | |||
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/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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= | |||
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= | |||
github.com/pkg/errors v0.8.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/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= | |||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | |||
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/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/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= | |||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= | |||
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 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= | |||
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= | |||
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-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/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |||
@@ -80,18 +151,36 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowK | |||
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-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= | |||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
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/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-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/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/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-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= | |||
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/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= | |||
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= |
@@ -332,6 +332,9 @@ func mergeSwaggerProps(primary *spec.Swagger, m *spec.Swagger) []string { | |||
if primary.Info.Contact == nil { | |||
primary.Info.Contact = m.Info.Contact | |||
} else if m.Info.Contact != nil { | |||
var csk []string | |||
primary.Info.Contact.Extensions, csk = mergeExtensions(primary.Info.Contact.Extensions, m.Info.Contact.Extensions) | |||
skipped = append(skipped, csk...) | |||
if primary.Info.Contact.Name == "" { | |||
primary.Info.Contact.Name = m.Info.Contact.Name | |||
} | |||
@@ -346,6 +349,9 @@ func mergeSwaggerProps(primary *spec.Swagger, m *spec.Swagger) []string { | |||
if primary.Info.License == nil { | |||
primary.Info.License = m.Info.License | |||
} else if m.Info.License != nil { | |||
var lsk []string | |||
primary.Info.License.Extensions, lsk = mergeExtensions(primary.Info.License.Extensions, m.Info.License.Extensions) | |||
skipped = append(skipped, lsk...) | |||
if primary.Info.License.Name == "" { | |||
primary.Info.License.Name = m.Info.License.Name | |||
} |
@@ -1,12 +1,10 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.11.x | |||
- 1.12.x | |||
- 1.13.x | |||
- 1.14.x | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
env: | |||
- GO111MODULE=on | |||
language: go | |||
notifications: | |||
slack: |
@@ -1,6 +1,12 @@ | |||
module github.com/go-openapi/errors | |||
go 1.14 | |||
require ( | |||
github.com/stretchr/objx v0.2.0 // indirect | |||
github.com/stretchr/testify v1.3.0 | |||
github.com/davecgh/go-spew v1.1.1 // indirect | |||
github.com/kr/text v0.2.0 // indirect | |||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect | |||
github.com/stretchr/testify v1.6.1 | |||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect | |||
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c // indirect | |||
) |
@@ -1,9 +1,26 @@ | |||
github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= | |||
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/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= | |||
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/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/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= | |||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= | |||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | |||
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= | |||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= | |||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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.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-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= | |||
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
@@ -16,7 +16,7 @@ package errors | |||
import "fmt" | |||
// ParseError respresents a parsing error | |||
// ParseError represents a parsing error | |||
type ParseError struct { | |||
code int32 | |||
Name string |
@@ -268,7 +268,7 @@ func DuplicateItems(name, in string) *Validation { | |||
} | |||
// TooManyItems error for when an array contains too many items | |||
func TooManyItems(name, in string, max int64) *Validation { | |||
func TooManyItems(name, in string, max int64, value interface{}) *Validation { | |||
msg := fmt.Sprintf(maxItemsFail, name, in, max) | |||
if in == "" { | |||
msg = fmt.Sprintf(maxItemsFailNoIn, name, max) | |||
@@ -278,12 +278,13 @@ func TooManyItems(name, in string, max int64) *Validation { | |||
code: MaxItemsFailCode, | |||
Name: name, | |||
In: in, | |||
Value: value, | |||
message: msg, | |||
} | |||
} | |||
// TooFewItems error for when an array contains too few items | |||
func TooFewItems(name, in string, min int64) *Validation { | |||
func TooFewItems(name, in string, min int64, value interface{}) *Validation { | |||
msg := fmt.Sprintf(minItemsFail, name, in, min) | |||
if in == "" { | |||
msg = fmt.Sprintf(minItemsFailNoIn, name, min) | |||
@@ -292,12 +293,13 @@ func TooFewItems(name, in string, min int64) *Validation { | |||
code: MinItemsFailCode, | |||
Name: name, | |||
In: in, | |||
Value: value, | |||
message: msg, | |||
} | |||
} | |||
// ExceedsMaximumInt error for when maxinum validation fails | |||
func ExceedsMaximumInt(name, in string, max int64, exclusive bool) *Validation { | |||
// ExceedsMaximumInt error for when maximum validation fails | |||
func ExceedsMaximumInt(name, in string, max int64, exclusive bool, value interface{}) *Validation { | |||
var message string | |||
if in == "" { | |||
m := maxIncFailNoIn | |||
@@ -316,13 +318,13 @@ func ExceedsMaximumInt(name, in string, max int64, exclusive bool) *Validation { | |||
code: MaxFailCode, | |||
Name: name, | |||
In: in, | |||
Value: max, | |||
Value: value, | |||
message: message, | |||
} | |||
} | |||
// ExceedsMaximumUint error for when maxinum validation fails | |||
func ExceedsMaximumUint(name, in string, max uint64, exclusive bool) *Validation { | |||
// ExceedsMaximumUint error for when maximum validation fails | |||
func ExceedsMaximumUint(name, in string, max uint64, exclusive bool, value interface{}) *Validation { | |||
var message string | |||
if in == "" { | |||
m := maxIncFailNoIn | |||
@@ -341,13 +343,13 @@ func ExceedsMaximumUint(name, in string, max uint64, exclusive bool) *Validation | |||
code: MaxFailCode, | |||
Name: name, | |||
In: in, | |||
Value: max, | |||
Value: value, | |||
message: message, | |||
} | |||
} | |||
// ExceedsMaximum error for when maxinum validation fails | |||
func ExceedsMaximum(name, in string, max float64, exclusive bool) *Validation { | |||
// ExceedsMaximum error for when maximum validation fails | |||
func ExceedsMaximum(name, in string, max float64, exclusive bool, value interface{}) *Validation { | |||
var message string | |||
if in == "" { | |||
m := maxIncFailNoIn | |||
@@ -366,13 +368,13 @@ func ExceedsMaximum(name, in string, max float64, exclusive bool) *Validation { | |||
code: MaxFailCode, | |||
Name: name, | |||
In: in, | |||
Value: max, | |||
Value: value, | |||
message: message, | |||
} | |||
} | |||
// ExceedsMinimumInt error for when maxinum validation fails | |||
func ExceedsMinimumInt(name, in string, min int64, exclusive bool) *Validation { | |||
// ExceedsMinimumInt error for when minimum validation fails | |||
func ExceedsMinimumInt(name, in string, min int64, exclusive bool, value interface{}) *Validation { | |||
var message string | |||
if in == "" { | |||
m := minIncFailNoIn | |||
@@ -391,13 +393,13 @@ func ExceedsMinimumInt(name, in string, min int64, exclusive bool) *Validation { | |||
code: MinFailCode, | |||
Name: name, | |||
In: in, | |||
Value: min, | |||
Value: value, | |||
message: message, | |||
} | |||
} | |||
// ExceedsMinimumUint error for when maxinum validation fails | |||
func ExceedsMinimumUint(name, in string, min uint64, exclusive bool) *Validation { | |||
// ExceedsMinimumUint error for when minimum validation fails | |||
func ExceedsMinimumUint(name, in string, min uint64, exclusive bool, value interface{}) *Validation { | |||
var message string | |||
if in == "" { | |||
m := minIncFailNoIn | |||
@@ -416,13 +418,13 @@ func ExceedsMinimumUint(name, in string, min uint64, exclusive bool) *Validation | |||
code: MinFailCode, | |||
Name: name, | |||
In: in, | |||
Value: min, | |||
Value: value, | |||
message: message, | |||
} | |||
} | |||
// ExceedsMinimum error for when maxinum validation fails | |||
func ExceedsMinimum(name, in string, min float64, exclusive bool) *Validation { | |||
// ExceedsMinimum error for when minimum validation fails | |||
func ExceedsMinimum(name, in string, min float64, exclusive bool, value interface{}) *Validation { | |||
var message string | |||
if in == "" { | |||
m := minIncFailNoIn | |||
@@ -441,13 +443,13 @@ func ExceedsMinimum(name, in string, min float64, exclusive bool) *Validation { | |||
code: MinFailCode, | |||
Name: name, | |||
In: in, | |||
Value: min, | |||
Value: value, | |||
message: message, | |||
} | |||
} | |||
// NotMultipleOf error for when multiple of validation fails | |||
func NotMultipleOf(name, in string, multiple interface{}) *Validation { | |||
func NotMultipleOf(name, in string, multiple, value interface{}) *Validation { | |||
var msg string | |||
if in == "" { | |||
msg = fmt.Sprintf(multipleOfFailNoIn, name, multiple) | |||
@@ -458,7 +460,7 @@ func NotMultipleOf(name, in string, multiple interface{}) *Validation { | |||
code: MultipleOfFailCode, | |||
Name: name, | |||
In: in, | |||
Value: multiple, | |||
Value: value, | |||
message: msg, | |||
} | |||
} | |||
@@ -483,7 +485,7 @@ func EnumFail(name, in string, value interface{}, values []interface{}) *Validat | |||
} | |||
// Required error for when a value is missing | |||
func Required(name, in string) *Validation { | |||
func Required(name, in string, value interface{}) *Validation { | |||
var msg string | |||
if in == "" { | |||
msg = fmt.Sprintf(requiredFailNoIn, name) | |||
@@ -494,12 +496,13 @@ func Required(name, in string) *Validation { | |||
code: RequiredFailCode, | |||
Name: name, | |||
In: in, | |||
Value: value, | |||
message: msg, | |||
} | |||
} | |||
// TooLong error for when a string is too long | |||
func TooLong(name, in string, max int64) *Validation { | |||
func TooLong(name, in string, max int64, value interface{}) *Validation { | |||
var msg string | |||
if in == "" { | |||
msg = fmt.Sprintf(tooLongMessageNoIn, name, max) | |||
@@ -510,12 +513,13 @@ func TooLong(name, in string, max int64) *Validation { | |||
code: TooLongFailCode, | |||
Name: name, | |||
In: in, | |||
Value: value, | |||
message: msg, | |||
} | |||
} | |||
// TooShort error for when a string is too short | |||
func TooShort(name, in string, min int64) *Validation { | |||
func TooShort(name, in string, min int64, value interface{}) *Validation { | |||
var msg string | |||
if in == "" { | |||
msg = fmt.Sprintf(tooShortMessageNoIn, name, min) | |||
@@ -527,13 +531,14 @@ func TooShort(name, in string, min int64) *Validation { | |||
code: TooShortFailCode, | |||
Name: name, | |||
In: in, | |||
Value: value, | |||
message: msg, | |||
} | |||
} | |||
// FailedPattern error for when a string fails a regex pattern match | |||
// the pattern that is returned is the ECMA syntax version of the pattern not the golang version. | |||
func FailedPattern(name, in, pattern string) *Validation { | |||
func FailedPattern(name, in, pattern string, value interface{}) *Validation { | |||
var msg string | |||
if in == "" { | |||
msg = fmt.Sprintf(patternFailNoIn, name, pattern) | |||
@@ -545,6 +550,7 @@ func FailedPattern(name, in, pattern string) *Validation { | |||
code: PatternFailCode, | |||
Name: name, | |||
In: in, | |||
Value: value, | |||
message: msg, | |||
} | |||
} |
@@ -4,7 +4,7 @@ | |||
An implementation of JSON Reference - Go language | |||
## Status | |||
Work in progress ( 90% done ) | |||
Feature complete. Stable API | |||
## Dependencies | |||
https://github.com/go-openapi/jsonpointer |
@@ -6,7 +6,7 @@ require ( | |||
github.com/go-openapi/jsonpointer v0.19.3 | |||
github.com/stretchr/testify v1.3.0 | |||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect | |||
golang.org/x/text v0.3.2 // indirect | |||
golang.org/x/text v0.3.3 // indirect | |||
) | |||
go 1.13 |
@@ -5,12 +5,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko | |||
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/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/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= | |||
@@ -28,14 +24,12 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ | |||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= | |||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | |||
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/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
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/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= |
@@ -1,12 +1,10 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.11.x | |||
- 1.12.x | |||
- 1.13.x | |||
- 1.14.x | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
env: | |||
- GO111MODULE=on | |||
- go get -u gotest.tools/gotestsum | |||
language: go | |||
notifications: | |||
slack: |
@@ -1,11 +1,11 @@ | |||
module github.com/go-openapi/loads | |||
require ( | |||
github.com/go-openapi/analysis v0.19.5 | |||
github.com/go-openapi/spec v0.19.3 | |||
github.com/go-openapi/swag v0.19.5 | |||
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.2 | |||
gopkg.in/yaml.v2 v2.2.8 | |||
) | |||
go 1.13 |
@@ -1,3 +1,4 @@ | |||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | |||
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= | |||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
@@ -6,16 +7,20 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko | |||
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/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/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/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.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= | |||
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/errors v0.17.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/jsonpointer v0.17.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= | |||
@@ -24,25 +29,63 @@ github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34 | |||
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.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/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= | |||
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.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/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | |||
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/swag v0.17.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-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= | |||
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= | |||
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= | |||
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | |||
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | |||
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= | |||
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | |||
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | |||
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= | |||
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= | |||
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= | |||
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= | |||
github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= | |||
github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= | |||
github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= | |||
github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= | |||
github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= | |||
github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | |||
github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | |||
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | |||
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | |||
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= | |||
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= | |||
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= | |||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | |||
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/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/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | |||
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= | |||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
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= | |||
@@ -54,23 +97,45 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB | |||
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/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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= | |||
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= | |||
github.com/pkg/errors v0.8.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/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= | |||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | |||
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/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/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= | |||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= | |||
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 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= | |||
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= | |||
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-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/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | |||
@@ -79,18 +144,37 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowK | |||
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-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= | |||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | |||
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/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-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/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/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-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= | |||
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/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= | |||
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.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= | |||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= |
@@ -1,12 +1,10 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.11.x | |||
- 1.12.x | |||
- 1.13.x | |||
- 1.14.x | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
env: | |||
- GO111MODULE=on | |||
language: go | |||
notifications: | |||
slack: |
@@ -41,7 +41,7 @@ type ClientRequestWriter interface { | |||
// add information to a swagger client request | |||
type ClientRequest interface { | |||
SetHeaderParam(string, ...string) error | |||
GetHeaderParams() http.Header | |||
SetQueryParam(string, ...string) error |
@@ -17,6 +17,8 @@ package runtime | |||
import ( | |||
"fmt" | |||
"io" | |||
"encoding/json" | |||
) | |||
// A ClientResponse represents a client response | |||
@@ -59,5 +61,10 @@ type APIError struct { | |||
} | |||
func (a *APIError) Error() string { | |||
return fmt.Sprintf("%s (status %d): %+v ", a.OperationName, a.Code, a.Response) | |||
resp, _ := json.Marshal(a.Response) | |||
return fmt.Sprintf("%s (status %d): %s", a.OperationName, a.Code, resp) | |||
} | |||
func (a *APIError) String() string { | |||
return a.Error() | |||
} |
@@ -2,15 +2,16 @@ module github.com/go-openapi/runtime | |||
require ( | |||
github.com/docker/go-units v0.4.0 | |||
github.com/go-openapi/analysis v0.19.5 | |||
github.com/go-openapi/errors v0.19.2 | |||
github.com/go-openapi/loads v0.19.3 | |||
github.com/go-openapi/spec v0.19.3 | |||
github.com/go-openapi/strfmt v0.19.3 | |||
github.com/go-openapi/swag v0.19.5 | |||
github.com/go-openapi/validate v0.19.3 | |||
github.com/stretchr/testify v1.4.0 | |||
gopkg.in/yaml.v2 v2.2.2 | |||
github.com/go-openapi/analysis v0.19.10 | |||
github.com/go-openapi/errors v0.19.6 | |||
github.com/go-openapi/loads v0.19.5 | |||
github.com/go-openapi/spec v0.19.8 | |||
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/stretchr/testify v1.6.1 | |||
gopkg.in/yaml.v2 v2.3.0 | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect | |||
) | |||
go 1.13 |
@@ -1,3 +1,4 @@ | |||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | |||
github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= | |||
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= | |||
@@ -8,6 +9,10 @@ github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf h1:eg0MeVzs | |||
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/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/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= | |||
@@ -26,10 +31,15 @@ github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9sn | |||
github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= | |||
github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= | |||
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/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/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/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= | |||
@@ -40,6 +50,8 @@ github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo | |||
github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= | |||
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/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= | |||
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= | |||
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= | |||
@@ -47,15 +59,21 @@ github.com/go-openapi/loads v0.19.2 h1:rf5ArTHmIJxyV5Oiks+Su0mUens1+AjpkPoWr5xFR | |||
github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= | |||
github.com/go-openapi/loads v0.19.3 h1:jwIoahqCmaA5OBoc/B+1+Mu2L0Gr8xYQnbeyQEo/7b0= | |||
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/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/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 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= | |||
github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= | |||
github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= | |||
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 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= | |||
github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | |||
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 h1:0Dn9qy1G9+UJfRU7TR8bmdGxb4uifB7HNrJjOnV0yPk= | |||
@@ -63,30 +81,74 @@ github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+Z | |||
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/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/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/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/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= | |||
github.com/go-openapi/validate v0.19.2 h1:ky5l57HjyVRrsJfd2+Ro5Z9PjGuKbsmftwyMtk8H7js= | |||
github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= | |||
github.com/go-openapi/validate v0.19.3 h1:PAH/2DylwWcIU1s0Y7k3yNmeAgWOcKrNE2Q7Ww/kCg4= | |||
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-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= | |||
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= | |||
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= | |||
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | |||
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | |||
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= | |||
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | |||
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | |||
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= | |||
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= | |||
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= | |||
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= | |||
github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= | |||
github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= | |||
github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= | |||
github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= | |||
github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= | |||
github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | |||
github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | |||
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | |||
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | |||
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= | |||
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= | |||
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= | |||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | |||
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/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/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | |||
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= | |||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
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/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 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= | |||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe h1:W/GaMY0y69G4cFlmsC6B9sbuo2fP8OFP1ABjt4kPz+w= | |||
@@ -95,11 +157,31 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB | |||
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/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/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/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pkg/errors v0.8.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/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= | |||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | |||
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/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= | |||
@@ -109,13 +191,23 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 | |||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | |||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= | |||
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/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/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | |||
go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= | |||
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 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE= | |||
go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | |||
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/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
@@ -127,21 +219,50 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowK | |||
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-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/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/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/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/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-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= | |||
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= | |||
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.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.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= |
@@ -8,5 +8,13 @@ type Logger interface { | |||
} | |||
func DebugEnabled() bool { | |||
return os.Getenv("SWAGGER_DEBUG") != "" || os.Getenv("DEBUG") != "" | |||
d := os.Getenv("SWAGGER_DEBUG") | |||
if d != "" && d != "false" && d != "0" { | |||
return true | |||
} | |||
d = os.Getenv("DEBUG") | |||
if d != "" && d != "false" && d != "0" { | |||
return true | |||
} | |||
return false | |||
} |
@@ -21,16 +21,16 @@ import ( | |||
"strings" | |||
"sync" | |||
"github.com/go-openapi/runtime/security" | |||
"github.com/go-openapi/analysis" | |||
"github.com/go-openapi/errors" | |||
"github.com/go-openapi/loads" | |||
"github.com/go-openapi/spec" | |||
"github.com/go-openapi/strfmt" | |||
"github.com/go-openapi/runtime" | |||
"github.com/go-openapi/runtime/logger" | |||
"github.com/go-openapi/runtime/middleware/untyped" | |||
"github.com/go-openapi/spec" | |||
"github.com/go-openapi/strfmt" | |||
"github.com/go-openapi/runtime/security" | |||
) | |||
// Debug when true turns on verbose logging | |||
@@ -280,8 +280,8 @@ func (c *Context) RequiredProduces() []string { | |||
// if the request is not valid an error will be returned | |||
func (c *Context) BindValidRequest(request *http.Request, route *MatchedRoute, binder RequestBinder) error { | |||
var res []error | |||
var requestContentType string | |||
requestContentType := "*/*" | |||
// check and validate content type, select consumer | |||
if runtime.HasBody(request) { | |||
ct, _, err := runtime.ContentType(request.Header) | |||
@@ -304,7 +304,13 @@ func (c *Context) BindValidRequest(request *http.Request, route *MatchedRoute, b | |||
} | |||
// check and validate the response format | |||
if len(res) == 0 && runtime.HasBody(request) { | |||
if len(res) == 0 { | |||
// if the route does not provide Produces and a default contentType could not be identified | |||
// based on a body, typical for GET and DELETE requests, then default contentType to. | |||
if len(route.Produces) == 0 && requestContentType == "" { | |||
requestContentType = "*/*" | |||
} | |||
if str := NegotiateContentType(request, route.Produces, requestContentType); str == "" { | |||
res = append(res, errors.InvalidResponseFormat(request.Header.Get(runtime.HeaderAccept), route.Produces)) | |||
} | |||
@@ -433,6 +439,8 @@ func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (interfa | |||
} | |||
} | |||
rCtx = request.Context() | |||
rCtx = stdContext.WithValue(rCtx, ctxSecurityPrincipal, usr) | |||
rCtx = stdContext.WithValue(rCtx, ctxSecurityScopes, route.Authenticator.AllScopes()) | |||
return usr, request.WithContext(rCtx), nil | |||
@@ -559,6 +567,26 @@ func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []st | |||
c.api.ServeErrorFor(route.Operation.ID)(rw, r, errors.New(http.StatusInternalServerError, "can't produce response")) | |||
} | |||
func (c *Context) APIHandlerSwaggerUI(builder Builder) http.Handler { | |||
b := builder | |||
if b == nil { | |||
b = PassthroughBuilder | |||
} | |||
var title string | |||
sp := c.spec.Spec() | |||
if sp != nil && sp.Info != nil && sp.Info.Title != "" { | |||
title = sp.Info.Title | |||
} | |||
swaggerUIOpts := SwaggerUIOpts{ | |||
BasePath: c.BasePath(), | |||
Title: title, | |||
} | |||
return Spec("", c.spec.Raw(), SwaggerUI(swaggerUIOpts, c.RoutesHandler(b))) | |||
} | |||
// APIHandler returns a handler to serve the API, this includes a swagger spec, router and the contract defined in the swagger spec | |||
func (c *Context) APIHandler(builder Builder) http.Handler { | |||
b := builder |
@@ -17,6 +17,9 @@ const ( | |||
// TerminationCharacter is a special character for end of path. | |||
TerminationCharacter = '#' | |||
// SeparatorCharacter separates path segments. | |||
SeparatorCharacter = '/' | |||
// MaxSize is max size of records and internal slice. | |||
MaxSize = (1 << 22) - 1 | |||
) | |||
@@ -420,10 +423,11 @@ type record struct { | |||
// makeRecords returns the records that use to build Double-Arrays. | |||
func makeRecords(srcs []Record) (statics, params []*record) { | |||
spChars := string([]byte{ParamCharacter, WildcardCharacter}) | |||
termChar := string(TerminationCharacter) | |||
paramPrefix := string(SeparatorCharacter) + string(ParamCharacter) | |||
wildcardPrefix := string(SeparatorCharacter) + string(WildcardCharacter) | |||
for _, r := range srcs { | |||
if strings.ContainsAny(r.Key, spChars) { | |||
if strings.Contains(r.Key, paramPrefix) || strings.Contains(r.Key, wildcardPrefix) { | |||
r.Key += termChar | |||
params = append(params, &record{Record: r}) | |||
} else { |
@@ -38,11 +38,30 @@ func (e *errorResp) WriteResponse(rw http.ResponseWriter, producer runtime.Produ | |||
rw.WriteHeader(http.StatusInternalServerError) | |||
} | |||
if err := producer.Produce(rw, e.response); err != nil { | |||
panic(err) | |||
Logger.Printf("failed to write error response: %v", err) | |||
} | |||
} | |||
// NotImplemented the error response when the response is not implemented | |||
func NotImplemented(message string) Responder { | |||
return &errorResp{http.StatusNotImplemented, message, make(http.Header)} | |||
return Error(http.StatusNotImplemented, message) | |||
} | |||
// Error creates a generic responder for returning errors, the data will be serialized | |||
// with the matching producer for the request | |||
func Error(code int, data interface{}, headers ...http.Header) Responder { | |||
var hdr http.Header | |||
for _, h := range headers { | |||
for k, v := range h { | |||
if hdr == nil { | |||
hdr = make(http.Header) | |||
} | |||
hdr[k] = v | |||
} | |||
} | |||
return &errorResp{ | |||
code: code, | |||
response: data, | |||
headers: hdr, | |||
} | |||
} |
@@ -24,11 +24,12 @@ import ( | |||
"strconv" | |||
"github.com/go-openapi/errors" | |||
"github.com/go-openapi/runtime" | |||
"github.com/go-openapi/spec" | |||
"github.com/go-openapi/strfmt" | |||
"github.com/go-openapi/swag" | |||
"github.com/go-openapi/validate" | |||
"github.com/go-openapi/runtime" | |||
) | |||
const defaultMaxMemory = 32 << 20 | |||
@@ -275,7 +276,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in | |||
} | |||
if (!hasKey || (!p.parameter.AllowEmptyValue && data == "")) && p.parameter.Required && p.parameter.Default == nil { | |||
return errors.Required(p.Name, p.parameter.In) | |||
return errors.Required(p.Name, p.parameter.In, data) | |||
} | |||
ok, err := p.tryUnmarshaler(target, defaultValue, data) | |||
@@ -450,7 +451,7 @@ func (p *untypedParamBinder) readFormattedSliceFieldValue(data string, target re | |||
func (p *untypedParamBinder) setSliceFieldValue(target reflect.Value, defaultValue interface{}, data []string, hasKey bool) error { | |||
sz := len(data) | |||
if (!hasKey || (!p.parameter.AllowEmptyValue && (sz == 0 || (sz == 1 && data[0] == "")))) && p.parameter.Required && defaultValue == nil { | |||
return errors.Required(p.Name, p.parameter.In) | |||
return errors.Required(p.Name, p.parameter.In, data) | |||
} | |||
defVal := reflect.Zero(target.Type()) |
@@ -16,7 +16,7 @@ type RedocOpts struct { | |||
Path string | |||
// SpecURL the url to find the spec for | |||
SpecURL string | |||
// RedocURL for the js that generates the redoc site, defaults to: https://rebilly.github.io/ReDoc/releases/latest/redoc.min.js | |||
// RedocURL for the js that generates the redoc site, defaults to: https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js | |||
RedocURL string | |||
// Title for the documentation site, default to: API documentation | |||
Title string | |||
@@ -74,13 +74,15 @@ func Redoc(opts RedocOpts, next http.Handler) http.Handler { | |||
} | |||
const ( | |||
redocLatest = "https://rebilly.github.io/ReDoc/releases/latest/redoc.min.js" | |||
redocLatest = "https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js" | |||
redocTemplate = `<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<title>{{ .Title }}</title> | |||
<!-- needed for adaptive design --> | |||
<meta name="viewport" content="width=device-width, initial-scale=1"> | |||
<!-- needed for adaptive design --> | |||
<meta charset="utf-8"/> | |||
<meta name="viewport" content="width=device-width, initial-scale=1"> | |||
<link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet"> | |||
<!-- | |||
ReDoc doesn't change outer page styles |
@@ -19,26 +19,27 @@ import ( | |||
"reflect" | |||
"github.com/go-openapi/errors" | |||
"github.com/go-openapi/runtime" | |||
"github.com/go-openapi/spec" | |||
"github.com/go-openapi/strfmt" | |||
"github.com/go-openapi/runtime" | |||
) | |||
// RequestBinder binds and validates the data from a http request | |||
type untypedRequestBinder struct { | |||
// UntypedRequestBinder binds and validates the data from a http request | |||
type UntypedRequestBinder struct { | |||
Spec *spec.Swagger | |||
Parameters map[string]spec.Parameter | |||
Formats strfmt.Registry | |||
paramBinders map[string]*untypedParamBinder | |||
} | |||
// NewRequestBinder creates a new binder for reading a request. | |||
func newUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Swagger, formats strfmt.Registry) *untypedRequestBinder { | |||
// NewUntypedRequestBinder creates a new binder for reading a request. | |||
func NewUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Swagger, formats strfmt.Registry) *UntypedRequestBinder { | |||
binders := make(map[string]*untypedParamBinder) | |||
for fieldName, param := range parameters { | |||
binders[fieldName] = newUntypedParamBinder(param, spec, formats) | |||
} | |||
return &untypedRequestBinder{ | |||
return &UntypedRequestBinder{ | |||
Parameters: parameters, | |||
paramBinders: binders, | |||
Spec: spec, | |||
@@ -47,7 +48,7 @@ func newUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Sw | |||
} | |||
// Bind perform the databinding and validation | |||
func (o *untypedRequestBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data interface{}) error { | |||
func (o *UntypedRequestBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data interface{}) error { | |||
val := reflect.Indirect(reflect.ValueOf(data)) | |||
isMap := val.Kind() == reflect.Map | |||
var result []error | |||
@@ -71,7 +72,6 @@ func (o *untypedRequestBinder) Bind(request *http.Request, routeParams RoutePara | |||
} | |||
} | |||
target = reflect.Indirect(reflect.New(tpe)) | |||
} | |||
if !target.IsValid() { |
@@ -26,10 +26,11 @@ import ( | |||
"github.com/go-openapi/analysis" | |||
"github.com/go-openapi/errors" | |||
"github.com/go-openapi/loads" | |||
"github.com/go-openapi/runtime" | |||
"github.com/go-openapi/runtime/middleware/denco" | |||
"github.com/go-openapi/spec" | |||
"github.com/go-openapi/strfmt" | |||
"github.com/go-openapi/runtime" | |||
"github.com/go-openapi/runtime/middleware/denco" | |||
) | |||
// RouteParam is a object to capture route params in a framework agnostic way. | |||
@@ -290,7 +291,7 @@ type routeEntry struct { | |||
Parameters map[string]spec.Parameter | |||
Handler http.Handler | |||
Formats strfmt.Registry | |||
Binder *untypedRequestBinder | |||
Binder *UntypedRequestBinder | |||
Authenticators RouteAuthenticators | |||
Authorizer runtime.Authorizer | |||
} | |||
@@ -428,7 +429,7 @@ func (d *defaultRouteBuilder) AddRoute(method, path string, operation *spec.Oper | |||
Producers: d.api.ProducersFor(normalizeOffers(produces)), | |||
Parameters: parameters, | |||
Formats: d.api.Formats(), | |||
Binder: newUntypedRequestBinder(parameters, d.spec.Spec(), d.api.Formats()), | |||
Binder: NewUntypedRequestBinder(parameters, d.spec.Spec(), d.api.Formats()), | |||
Authenticators: d.buildAuthenticators(operation), | |||
Authorizer: d.api.Authorizer(), | |||
}) |
@@ -0,0 +1,162 @@ | |||
package middleware | |||
import ( | |||
"bytes" | |||
"fmt" | |||
"html/template" | |||
"net/http" | |||
"path" | |||
) | |||
// SwaggerUIOpts configures the Swaggerui middlewares | |||
type SwaggerUIOpts 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 | |||
// The three components needed to embed swagger-ui | |||
SwaggerURL string | |||
SwaggerPresetURL string | |||
SwaggerStylesURL string | |||
Favicon32 string | |||
Favicon16 string | |||
// Title for the documentation site, default to: API documentation | |||
Title string | |||
} | |||
// EnsureDefaults in case some options are missing | |||
func (r *SwaggerUIOpts) EnsureDefaults() { | |||
if r.BasePath == "" { | |||
r.BasePath = "/" | |||
} | |||
if r.Path == "" { | |||
r.Path = "docs" | |||
} | |||
if r.SpecURL == "" { | |||
r.SpecURL = "/swagger.json" | |||
} | |||
if r.SwaggerURL == "" { | |||
r.SwaggerURL = swaggerLatest | |||
} | |||
if r.SwaggerPresetURL == "" { | |||
r.SwaggerPresetURL = swaggerPresetLatest | |||
} | |||
if r.SwaggerStylesURL == "" { | |||
r.SwaggerStylesURL = swaggerStylesLatest | |||
} | |||
if r.Favicon16 == "" { | |||
r.Favicon16 = swaggerFavicon16Latest | |||
} | |||
if r.Favicon32 == "" { | |||
r.Favicon32 = swaggerFavicon32Latest | |||
} | |||
if r.Title == "" { | |||
r.Title = "API documentation" | |||
} | |||
} | |||
// SwaggerUI creates a middleware to serve a documentation site for a swagger spec. | |||
// This allows for altering the spec before starting the http listener. | |||
func SwaggerUI(opts SwaggerUIOpts, next http.Handler) http.Handler { | |||
opts.EnsureDefaults() | |||
pth := path.Join(opts.BasePath, opts.Path) | |||
tmpl := template.Must(template.New("swaggerui").Parse(swaggeruiTemplate)) | |||
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 ( | |||
swaggerLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js" | |||
swaggerPresetLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui-standalone-preset.js" | |||
swaggerStylesLatest = "https://unpkg.com/swagger-ui-dist/swagger-ui.css" | |||
swaggerFavicon32Latest = "https://unpkg.com/swagger-ui-dist/favicon-32x32.png" | |||
swaggerFavicon16Latest = "https://unpkg.com/swagger-ui-dist/favicon-16x16.png" | |||
swaggeruiTemplate = ` | |||
<!DOCTYPE html> | |||
<html lang="en"> | |||
<head> | |||
<meta charset="UTF-8"> | |||
<title>{{ .Title }}</title> | |||
<link rel="stylesheet" type="text/css" href="{{ .SwaggerStylesURL }}" > | |||
<link rel="icon" type="image/png" href="{{ .Favicon32 }}" sizes="32x32" /> | |||
<link rel="icon" type="image/png" href="{{ .Favicon16 }}" sizes="16x16" /> | |||
<style> | |||
html | |||
{ | |||
box-sizing: border-box; | |||
overflow: -moz-scrollbars-vertical; | |||
overflow-y: scroll; | |||
} | |||
*, | |||
*:before, | |||
*:after | |||
{ | |||
box-sizing: inherit; | |||
} | |||
body | |||
{ | |||
margin:0; | |||
background: #fafafa; | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<div id="swagger-ui"></div> | |||
<script src="{{ .SwaggerURL }}"> </script> | |||
<script src="{{ .SwaggerPresetURL }}"> </script> | |||
<script> | |||
window.onload = function() { | |||
// Begin Swagger UI call region | |||
const ui = SwaggerUIBundle({ | |||
url: '{{ .SpecURL }}', | |||
dom_id: '#swagger-ui', | |||
deepLinking: true, | |||
presets: [ | |||
SwaggerUIBundle.presets.apis, | |||
SwaggerUIStandalonePreset | |||
], | |||
plugins: [ | |||
SwaggerUIBundle.plugins.DownloadUrl | |||
], | |||
layout: "StandaloneLayout" | |||
}) | |||
// End Swagger UI call region | |||
window.ui = ui | |||
} | |||
</script> | |||
</body> | |||
</html> | |||
` | |||
) |
@@ -23,9 +23,10 @@ import ( | |||
"github.com/go-openapi/analysis" | |||
"github.com/go-openapi/errors" | |||
"github.com/go-openapi/loads" | |||
"github.com/go-openapi/runtime" | |||
"github.com/go-openapi/spec" | |||
"github.com/go-openapi/strfmt" | |||
"github.com/go-openapi/runtime" | |||
) | |||
// NewAPI creates the default untyped API | |||
@@ -244,7 +245,6 @@ func (d *API) validate() error { | |||
} | |||
func (d *API) verify(name string, registrations []string, expectations []string) error { | |||
sort.Strings(registrations) | |||
sort.Strings(expectations) | |||
@@ -20,8 +20,9 @@ import ( | |||
"strings" | |||
"github.com/go-openapi/errors" | |||
"github.com/go-openapi/runtime" | |||
"github.com/go-openapi/swag" | |||
"github.com/go-openapi/runtime" | |||
) | |||
type validation struct { | |||
@@ -115,7 +116,10 @@ func (v *validation) contentType() { | |||
} | |||
func (v *validation) responseFormat() { | |||
if str, rCtx := v.context.ResponseFormat(v.request, v.route.Produces); str == "" && runtime.HasBody(v.request) { | |||
// if the route provides values for Produces and no format could be identify then return an error. | |||
// if the route does not specify values for Produces then treat request as valid since the API designer | |||
// choose not to specify the format for responses. | |||
if str, rCtx := v.context.ResponseFormat(v.request, v.route.Produces); str == "" && len(v.route.Produces) > 0 { | |||
v.request = rCtx | |||
v.result = append(v.result, errors.InvalidResponseFormat(v.request.Header.Get(runtime.HeaderAccept), v.route.Produces)) | |||
} |
@@ -20,6 +20,7 @@ import ( | |||
"strings" | |||
"github.com/go-openapi/errors" | |||
"github.com/go-openapi/runtime" | |||
) | |||
@@ -21,3 +21,8 @@ linters: | |||
- lll | |||
- gochecknoinits | |||
- gochecknoglobals | |||
- funlen | |||
- godox | |||
- gocognit | |||
- whitespace | |||
- wsl |
@@ -1,12 +1,10 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.11.x | |||
- 1.12.x | |||
- 1.13.x | |||
- 1.14.x | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
env: | |||
- GO111MODULE=on | |||
language: go | |||
notifications: | |||
slack: |
@@ -14,11 +14,41 @@ | |||
package spec | |||
import ( | |||
"encoding/json" | |||
"github.com/go-openapi/swag" | |||
) | |||
// ContactInfo contact information for the exposed API. | |||
// | |||
// For more information: http://goo.gl/8us55a#contactObject | |||
type ContactInfo struct { | |||
ContactInfoProps | |||
VendorExtensible | |||
} | |||
type ContactInfoProps struct { | |||
Name string `json:"name,omitempty"` | |||
URL string `json:"url,omitempty"` | |||
Email string `json:"email,omitempty"` | |||
} | |||
func (c *ContactInfo) UnmarshalJSON(data []byte) error { | |||
if err := json.Unmarshal(data, &c.ContactInfoProps); err != nil { | |||
return err | |||
} | |||
return json.Unmarshal(data, &c.VendorExtensible) | |||
} | |||
func (c ContactInfo) MarshalJSON() ([]byte, error) { | |||
b1, err := json.Marshal(c.ContactInfoProps) | |||
if err != nil { | |||
return nil, err | |||
} | |||
b2, err := json.Marshal(c.VendorExtensible) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return swag.ConcatJSON(b1, b2), nil | |||
} |
@@ -200,11 +200,11 @@ func ExpandSpec(spec *Swagger, options *ExpandOptions) error { | |||
return nil | |||
} | |||
const rootBase = "root" | |||
// baseForRoot loads in the cache the root document and produces a fake "root" base path entry | |||
// for further $ref resolution | |||
func baseForRoot(root interface{}, cache ResolutionCache) string { | |||
// cache the root document to resolve $ref's | |||
const rootBase = "root" | |||
if root != nil { | |||
base, _ := absPath(rootBase) | |||
normalizedBase := normalizeAbsPath(base) | |||
@@ -452,11 +452,12 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) | |||
return err | |||
} | |||
if pathItem.Ref.String() != "" { | |||
var err error | |||
resolver, err = resolver.transitiveResolver(basePath, pathItem.Ref) | |||
if resolver.shouldStopOnError(err) { | |||
transitiveResolver, err := resolver.transitiveResolver(basePath, pathItem.Ref) | |||
if transitiveResolver.shouldStopOnError(err) { | |||
return err | |||
} | |||
basePath = transitiveResolver.updateBasePath(resolver, basePath) | |||
resolver = transitiveResolver | |||
} | |||
pathItem.Ref = Ref{} | |||
@@ -4,14 +4,9 @@ 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/kr/pty v1.1.5 // indirect | |||
github.com/stretchr/objx v0.2.0 // indirect | |||
github.com/stretchr/testify v1.3.0 | |||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect | |||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // 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.2 | |||
gopkg.in/yaml.v2 v2.2.4 | |||
) | |||
go 1.13 |
@@ -1,5 +1,3 @@ | |||
github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= | |||
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= | |||
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= | |||
@@ -7,20 +5,12 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko | |||
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.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0= | |||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= | |||
github.com/go-openapi/jsonpointer v0.19.0 h1:FTUMcX77w5rQkClIzDtTxvn6Bsa894CcrzNj2MMfeg8= | |||
github.com/go-openapi/jsonpointer v0.19.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/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk= | |||
github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= | |||
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.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880= | |||
github.com/go-openapi/swag v0.17.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= | |||
@@ -28,11 +18,8 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh | |||
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/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/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic= | |||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/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= | |||
@@ -40,35 +27,23 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN | |||
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/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= | |||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= | |||
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= | |||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | |||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58 h1:otZG8yDCO4LVps5+9bxOeNiCvgmOyt96J3roHTYs7oE= | |||
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-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/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | |||
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/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= | |||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||
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= |
@@ -14,10 +14,40 @@ | |||
package spec | |||
import ( | |||
"encoding/json" | |||
"github.com/go-openapi/swag" | |||
) | |||
// License information for the exposed API. | |||
// | |||
// For more information: http://goo.gl/8us55a#licenseObject | |||
type License struct { | |||
LicenseProps | |||
VendorExtensible | |||
} | |||
type LicenseProps struct { | |||
Name string `json:"name,omitempty"` | |||
URL string `json:"url,omitempty"` | |||
} | |||
func (l *License) UnmarshalJSON(data []byte) error { | |||
if err := json.Unmarshal(data, &l.LicenseProps); err != nil { | |||
return err | |||
} | |||
return json.Unmarshal(data, &l.VendorExtensible) | |||
} | |||
func (l License) MarshalJSON() ([]byte, error) { | |||
b1, err := json.Marshal(l.LicenseProps) | |||
if err != nil { | |||
return nil, err | |||
} | |||
b2, err := json.Marshal(l.VendorExtensible) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return swag.ConcatJSON(b1, b2), nil | |||
} |
@@ -68,10 +68,12 @@ func (r *Ref) IsValidURI(basepaths ...string) bool { | |||
} | |||
if r.HasFullURL { | |||
//#nosec | |||
rr, err := http.Get(v) | |||
if err != nil { | |||
return false | |||
} | |||
defer rr.Body.Close() | |||
return rr.StatusCode/100 == 2 | |||
} |
@@ -86,12 +86,7 @@ func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) (*schemaLoad | |||
newOptions := r.options | |||
newOptions.RelativeBase = rootURL.String() | |||
debugLog("setting new root: %s", newOptions.RelativeBase) | |||
resolver, err := defaultSchemaLoader(root, newOptions, r.cache, r.context) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return resolver, nil | |||
return defaultSchemaLoader(root, newOptions, r.cache, r.context) | |||
} | |||
func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string) string { | |||
@@ -154,7 +149,15 @@ func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error) | |||
toFetch := *refURL | |||
toFetch.Fragment = "" | |||
normalized := normalizeAbsPath(toFetch.String()) | |||
var err error | |||
path := toFetch.String() | |||
if path == rootBase { | |||
path, err = absPath(rootBase) | |||
if err != nil { | |||
return nil, url.URL{}, false, err | |||
} | |||
} | |||
normalized := normalizeAbsPath(path) | |||
data, fromCache := r.cache.Get(normalized) | |||
if !fromCache { |
@@ -20,6 +20,11 @@ linters: | |||
- lll | |||
- gochecknoinits | |||
- gochecknoglobals | |||
- godox | |||
- gocognit | |||
- whitespace | |||
- wsl | |||
- funlen | |||
issues: | |||
exclude-rules: | |||
@@ -27,4 +32,5 @@ issues: | |||
text: "should be .*ObjectID" | |||
linters: | |||
- golint | |||
- stylecheck | |||
@@ -43,6 +43,19 @@ It also provides convenient extensions to go-openapi users. | |||
> It does not provide validation for numerical values with swagger format extension for JSON types "number" or | |||
> "integer" (e.g. float, double, int32...). | |||
## Type conversion | |||
All types defined here are stringers and may be converted to strings with `.String()`. | |||
Note that most types defined by this package may be converted directly to string like `string(Email{})`. | |||
`Date` and `DateTime` may be converted directly to `time.Time` like `time.Time(Time{})`. | |||
Similarly, you can convert `Duration` to `time.Duration` as in `time.Duration(Duration{})` | |||
## Using pointers | |||
The `conv` subpackage provides helpers to convert the types to and from pointers, just like `go-openapi/swag` does | |||
with primitive types. | |||
## Format types | |||
Types defined in strfmt expose marshaling and validation capabilities. | |||
@@ -151,3 +151,32 @@ func (d *Date) DeepCopy() *Date { | |||
d.DeepCopyInto(out) | |||
return out | |||
} | |||
// GobEncode implements the gob.GobEncoder interface. | |||
func (d Date) GobEncode() ([]byte, error) { | |||
return d.MarshalBinary() | |||
} | |||
// GobDecode implements the gob.GobDecoder interface. | |||
func (d *Date) GobDecode(data []byte) error { | |||
return d.UnmarshalBinary(data) | |||
} | |||
// MarshalBinary implements the encoding.BinaryMarshaler interface. | |||
func (d Date) MarshalBinary() ([]byte, error) { | |||
return time.Time(d).MarshalBinary() | |||
} | |||
// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. | |||
func (d *Date) UnmarshalBinary(data []byte) error { | |||
var original time.Time | |||
err := original.UnmarshalBinary(data) | |||
if err != nil { | |||
return err | |||
} | |||
*d = Date(original) | |||
return nil | |||
} |
@@ -11,3 +11,5 @@ require ( | |||
github.com/tidwall/pretty v1.0.0 // indirect | |||
go.mongodb.org/mongo-driver v1.0.3 | |||
) | |||
go 1.13 |
@@ -4,7 +4,7 @@ | |||
// you may not use this file except in compliance with the License. | |||
// You may obtain a copy of the License at | |||
// | |||
// http://www.apache.org/licenses/LICENSE-2.0 | |||
// http://www.apache.org/licenses/LICENSE-2.0 | |||
// | |||
// Unless required by applicable law or agreed to in writing, software | |||
// distributed under the License is distributed on an "AS IS" BASIS, | |||
@@ -16,14 +16,16 @@ package strfmt | |||
import ( | |||
"database/sql/driver" | |||
"encoding/binary" | |||
"encoding/json" | |||
"errors" | |||
"fmt" | |||
"regexp" | |||
"strings" | |||
"time" | |||
"go.mongodb.org/mongo-driver/bson" | |||
"go.mongodb.org/mongo-driver/bson/bsontype" | |||
) | |||
func init() { | |||
@@ -57,12 +59,16 @@ const ( | |||
RFC3339Micro = "2006-01-02T15:04:05.000000Z07:00" | |||
// ISO8601LocalTime represents a ISO8601 format to ISO8601 in local time (no timezone) | |||
ISO8601LocalTime = "2006-01-02T15:04:05" | |||
// ISO8601TimeWithReducedPrecision represents a ISO8601 format with reduced precision (dropped secs) | |||
ISO8601TimeWithReducedPrecision = "2006-01-02T15:04Z" | |||
// ISO8601TimeWithReducedPrecision represents a ISO8601 format with reduced precision and no timezone (dropped seconds + no timezone) | |||
ISO8601TimeWithReducedPrecisionLocaltime = "2006-01-02T15:04" | |||
// DateTimePattern pattern to match for the date-time format from http://tools.ietf.org/html/rfc3339#section-5.6 | |||
DateTimePattern = `^([0-9]{2}):([0-9]{2}):([0-9]{2})(.[0-9]+)?(z|([+-][0-9]{2}:[0-9]{2}))$` | |||
) | |||
var ( | |||
dateTimeFormats = []string{RFC3339Micro, RFC3339Millis, time.RFC3339, time.RFC3339Nano, ISO8601LocalTime} | |||
dateTimeFormats = []string{RFC3339Micro, RFC3339Millis, time.RFC3339, time.RFC3339Nano, ISO8601LocalTime, ISO8601TimeWithReducedPrecision, ISO8601TimeWithReducedPrecisionLocaltime} | |||
rxDateTime = regexp.MustCompile(DateTimePattern) | |||
// MarshalFormat sets the time resolution format used for marshaling time (set to milliseconds) | |||
MarshalFormat = RFC3339Millis | |||
@@ -165,26 +171,51 @@ func (t *DateTime) UnmarshalJSON(data []byte) error { | |||
return nil | |||
} | |||
// MarshalBSON renders the DateTime as a BSON document | |||
func (t DateTime) MarshalBSON() ([]byte, error) { | |||
return bson.Marshal(bson.M{"data": t.String()}) | |||
return bson.Marshal(bson.M{"data": t}) | |||
} | |||
// UnmarshalBSON reads the DateTime from a BSON document | |||
func (t *DateTime) UnmarshalBSON(data []byte) error { | |||
var m bson.M | |||
if err := bson.Unmarshal(data, &m); err != nil { | |||
return err | |||
var obj struct { | |||
Data DateTime | |||
} | |||
if data, ok := m["data"].(string); ok { | |||
rd, err := ParseDateTime(data) | |||
if err != nil { | |||
return err | |||
} | |||
*t = rd | |||
return nil | |||
if err := bson.Unmarshal(data, &obj); err != nil { | |||
return err | |||
} | |||
return errors.New("couldn't unmarshal bson bytes value as Date") | |||
*t = obj.Data | |||
return nil | |||
} | |||
// MarshalBSONValue is an interface implemented by types that can marshal themselves | |||
// into a BSON document represented as bytes. The bytes returned must be a valid | |||
// BSON document if the error is nil. | |||
// Marshals a DateTime as a bsontype.DateTime, an int64 representing | |||
// milliseconds since epoch. | |||
func (t DateTime) MarshalBSONValue() (bsontype.Type, []byte, error) { | |||
// UnixNano cannot be used, the result of calling UnixNano on the zero | |||
// Time is undefined. | |||
i64 := time.Time(t).Unix() * 1000 | |||
buf := make([]byte, 8) | |||
binary.LittleEndian.PutUint64(buf, uint64(i64)) | |||
return bsontype.DateTime, buf, nil | |||
} | |||
// UnmarshalBSONValue is an interface implemented by types that can unmarshal a | |||
// BSON value representation of themselves. The BSON bytes and type can be | |||
// assumed to be valid. UnmarshalBSONValue must copy the BSON value bytes if it | |||
// wishes to retain the data after returning. | |||
func (t *DateTime) UnmarshalBSONValue(tpe bsontype.Type, data []byte) error { | |||
i64 := int64(binary.LittleEndian.Uint64(data)) | |||
// TODO: Use bsonprim.DateTime.Time() method | |||
*t = DateTime(time.Unix(i64/1000, i64%1000*1000000)) | |||
return nil | |||
} | |||
// DeepCopyInto copies the receiver and writes its value into out. | |||
@@ -201,3 +232,32 @@ func (t *DateTime) DeepCopy() *DateTime { | |||
t.DeepCopyInto(out) | |||
return out | |||
} | |||
// GobEncode implements the gob.GobEncoder interface. | |||
func (t DateTime) GobEncode() ([]byte, error) { | |||
return t.MarshalBinary() | |||
} | |||
// GobDecode implements the gob.GobDecoder interface. | |||
func (t *DateTime) GobDecode(data []byte) error { | |||
return t.UnmarshalBinary(data) | |||
} | |||
// MarshalBinary implements the encoding.BinaryMarshaler interface. | |||
func (t DateTime) MarshalBinary() ([]byte, error) { | |||
return time.Time(t).MarshalBinary() | |||
} | |||
// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. | |||
func (t *DateTime) UnmarshalBinary(data []byte) error { | |||
var original time.Time | |||
err := original.UnmarshalBinary(data) | |||
if err != nil { | |||
return err | |||
} | |||
*t = DateTime(original) | |||
return nil | |||
} |
@@ -1,12 +1,10 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.11.x | |||
- 1.12.x | |||
- 1.13.x | |||
- 1.14.x | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
env: | |||
- GO111MODULE=on | |||
language: go | |||
notifications: | |||
slack: |
@@ -88,7 +88,7 @@ func ConvertFloat64(str string) (float64, error) { | |||
return strconv.ParseFloat(str, 64) | |||
} | |||
// ConvertInt8 turn a string into int8 boolean | |||
// ConvertInt8 turn a string into an int8 | |||
func ConvertInt8(str string) (int8, error) { | |||
i, err := strconv.ParseInt(str, 10, 8) | |||
if err != nil { | |||
@@ -97,7 +97,7 @@ func ConvertInt8(str string) (int8, error) { | |||
return int8(i), nil | |||
} | |||
// ConvertInt16 turn a string into a int16 | |||
// ConvertInt16 turn a string into an int16 | |||
func ConvertInt16(str string) (int16, error) { | |||
i, err := strconv.ParseInt(str, 10, 16) | |||
if err != nil { | |||
@@ -106,7 +106,7 @@ func ConvertInt16(str string) (int16, error) { | |||
return int16(i), nil | |||
} | |||
// ConvertInt32 turn a string into a int32 | |||
// ConvertInt32 turn a string into an int32 | |||
func ConvertInt32(str string) (int32, error) { | |||
i, err := strconv.ParseInt(str, 10, 32) | |||
if err != nil { | |||
@@ -115,12 +115,12 @@ func ConvertInt32(str string) (int32, error) { | |||
return int32(i), nil | |||
} | |||
// ConvertInt64 turn a string into a int64 | |||
// ConvertInt64 turn a string into an int64 | |||
func ConvertInt64(str string) (int64, error) { | |||
return strconv.ParseInt(str, 10, 64) | |||
} | |||
// ConvertUint8 turn a string into a uint8 | |||
// ConvertUint8 turn a string into an uint8 | |||
func ConvertUint8(str string) (uint8, error) { | |||
i, err := strconv.ParseUint(str, 10, 8) | |||
if err != nil { | |||
@@ -129,7 +129,7 @@ func ConvertUint8(str string) (uint8, error) { | |||
return uint8(i), nil | |||
} | |||
// ConvertUint16 turn a string into a uint16 | |||
// ConvertUint16 turn a string into an uint16 | |||
func ConvertUint16(str string) (uint16, error) { | |||
i, err := strconv.ParseUint(str, 10, 16) | |||
if err != nil { | |||
@@ -138,7 +138,7 @@ func ConvertUint16(str string) (uint16, error) { | |||
return uint16(i), nil | |||
} | |||
// ConvertUint32 turn a string into a uint32 | |||
// ConvertUint32 turn a string into an uint32 | |||
func ConvertUint32(str string) (uint32, error) { | |||
i, err := strconv.ParseUint(str, 10, 32) | |||
if err != nil { | |||
@@ -147,7 +147,7 @@ func ConvertUint32(str string) (uint32, error) { | |||
return uint32(i), nil | |||
} | |||
// ConvertUint64 turn a string into a uint64 | |||
// ConvertUint64 turn a string into an uint64 | |||
func ConvertUint64(str string) (uint64, error) { | |||
return strconv.ParseUint(str, 10, 64) | |||
} |
@@ -181,12 +181,12 @@ func IntValueMap(src map[string]*int) map[string]int { | |||
return dst | |||
} | |||
// Int32 returns a pointer to of the int64 value passed in. | |||
// Int32 returns a pointer to of the int32 value passed in. | |||
func Int32(v int32) *int32 { | |||
return &v | |||
} | |||
// Int32Value returns the value of the int64 pointer passed in or | |||
// Int32Value returns the value of the int32 pointer passed in or | |||
// 0 if the pointer is nil. | |||
func Int32Value(v *int32) int32 { | |||
if v != nil { | |||
@@ -195,7 +195,7 @@ func Int32Value(v *int32) int32 { | |||
return 0 | |||
} | |||
// Int32Slice converts a slice of int64 values into a slice of | |||
// Int32Slice converts a slice of int32 values into a slice of | |||
// int32 pointers | |||
func Int32Slice(src []int32) []*int32 { | |||
dst := make([]*int32, len(src)) | |||
@@ -299,13 +299,80 @@ func Int64ValueMap(src map[string]*int64) map[string]int64 { | |||
return dst | |||
} | |||
// Uint returns a pouinter to of the uint value passed in. | |||
// Uint16 returns a pointer to of the uint16 value passed in. | |||
func Uint16(v uint16) *uint16 { | |||
return &v | |||
} | |||
// Uint16Value returns the value of the uint16 pointer passed in or | |||
// 0 if the pointer is nil. | |||
func Uint16Value(v *uint16) uint16 { | |||
if v != nil { | |||
return *v | |||
} | |||
return 0 | |||
} | |||
// Uint16Slice converts a slice of uint16 values into a slice of | |||
// uint16 pointers | |||
func Uint16Slice(src []uint16) []*uint16 { | |||
dst := make([]*uint16, len(src)) | |||
for i := 0; i < len(src); i++ { | |||
dst[i] = &(src[i]) | |||
} | |||
return dst | |||
} | |||
// Uint16ValueSlice converts a slice of uint16 pointers into a slice of | |||
// uint16 values | |||
func Uint16ValueSlice(src []*uint16) []uint16 { | |||
dst := make([]uint16, len(src)) | |||
for i := 0; i < len(src); i++ { | |||
if src[i] != nil { | |||
dst[i] = *(src[i]) | |||
} | |||
} | |||
return dst | |||
} | |||
// Uint16Map converts a string map of uint16 values into a string | |||
// map of uint16 pointers | |||
func Uint16Map(src map[string]uint16) map[string]*uint16 { | |||
dst := make(map[string]*uint16) | |||
for k, val := range src { | |||
v := val | |||
dst[k] = &v | |||
} | |||
return dst | |||
} | |||
// Uint16ValueMap converts a string map of uint16 pointers into a string | |||
// map of uint16 values | |||
func Uint16ValueMap(src map[string]*uint16) map[string]uint16 { | |||
dst := make(map[string]uint16) | |||
for k, val := range src { | |||
if val != nil { | |||
dst[k] = *val | |||
} | |||
} | |||
return dst | |||
} | |||
// Uint returns a pointer to of the uint value passed in. | |||
func Uint(v uint) *uint { | |||
return &v | |||
} | |||
// UintValue returns the value of the uint pouinter passed in or | |||
// 0 if the pouinter is nil. | |||
// UintValue returns the value of the uint pointer passed in or | |||
// 0 if the pointer is nil. | |||
func UintValue(v *uint) uint { | |||
if v != nil { | |||
return *v | |||
@@ -313,8 +380,8 @@ func UintValue(v *uint) uint { | |||
return 0 | |||
} | |||
// UintSlice converts a slice of uint values uinto a slice of | |||
// uint pouinters | |||
// UintSlice converts a slice of uint values into a slice of | |||
// uint pointers | |||
func UintSlice(src []uint) []*uint { | |||
dst := make([]*uint, len(src)) | |||
for i := 0; i < len(src); i++ { | |||
@@ -323,7 +390,7 @@ func UintSlice(src []uint) []*uint { | |||
return dst | |||
} | |||
// UintValueSlice converts a slice of uint pouinters uinto a slice of | |||
// UintValueSlice converts a slice of uint pointers into a slice of | |||
// uint values | |||
func UintValueSlice(src []*uint) []uint { | |||
dst := make([]uint, len(src)) | |||
@@ -335,8 +402,8 @@ func UintValueSlice(src []*uint) []uint { | |||
return dst | |||
} | |||
// UintMap converts a string map of uint values uinto a string | |||
// map of uint pouinters | |||
// UintMap converts a string map of uint values into a string | |||
// map of uint pointers | |||
func UintMap(src map[string]uint) map[string]*uint { | |||
dst := make(map[string]*uint) | |||
for k, val := range src { | |||
@@ -346,7 +413,7 @@ func UintMap(src map[string]uint) map[string]*uint { | |||
return dst | |||
} | |||
// UintValueMap converts a string map of uint pouinters uinto a string | |||
// UintValueMap converts a string map of uint pointers into a string | |||
// map of uint values | |||
func UintValueMap(src map[string]*uint) map[string]uint { | |||
dst := make(map[string]uint) | |||
@@ -358,13 +425,13 @@ func UintValueMap(src map[string]*uint) map[string]uint { | |||
return dst | |||
} | |||
// Uint32 returns a pouinter to of the uint64 value passed in. | |||
// Uint32 returns a pointer to of the uint32 value passed in. | |||
func Uint32(v uint32) *uint32 { | |||
return &v | |||
} | |||
// Uint32Value returns the value of the uint64 pouinter passed in or | |||
// 0 if the pouinter is nil. | |||
// Uint32Value returns the value of the uint32 pointer passed in or | |||
// 0 if the pointer is nil. | |||
func Uint32Value(v *uint32) uint32 { | |||
if v != nil { | |||
return *v | |||
@@ -372,8 +439,8 @@ func Uint32Value(v *uint32) uint32 { | |||
return 0 | |||
} | |||
// Uint32Slice converts a slice of uint64 values uinto a slice of | |||
// uint32 pouinters | |||
// Uint32Slice converts a slice of uint32 values into a slice of | |||
// uint32 pointers | |||
func Uint32Slice(src []uint32) []*uint32 { | |||
dst := make([]*uint32, len(src)) | |||
for i := 0; i < len(src); i++ { | |||
@@ -382,7 +449,7 @@ func Uint32Slice(src []uint32) []*uint32 { | |||
return dst | |||
} | |||
// Uint32ValueSlice converts a slice of uint32 pouinters uinto a slice of | |||
// Uint32ValueSlice converts a slice of uint32 pointers into a slice of | |||
// uint32 values | |||
func Uint32ValueSlice(src []*uint32) []uint32 { | |||
dst := make([]uint32, len(src)) | |||
@@ -394,8 +461,8 @@ func Uint32ValueSlice(src []*uint32) []uint32 { | |||
return dst | |||
} | |||
// Uint32Map converts a string map of uint32 values uinto a string | |||
// map of uint32 pouinters | |||
// Uint32Map converts a string map of uint32 values into a string | |||
// map of uint32 pointers | |||
func Uint32Map(src map[string]uint32) map[string]*uint32 { | |||
dst := make(map[string]*uint32) | |||
for k, val := range src { | |||
@@ -405,7 +472,7 @@ func Uint32Map(src map[string]uint32) map[string]*uint32 { | |||
return dst | |||
} | |||
// Uint32ValueMap converts a string map of uint32 pouinters uinto a string | |||
// Uint32ValueMap converts a string map of uint32 pointers into a string | |||
// map of uint32 values | |||
func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { | |||
dst := make(map[string]uint32) | |||
@@ -417,13 +484,13 @@ func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { | |||
return dst | |||
} | |||
// Uint64 returns a pouinter to of the uint64 value passed in. | |||
// Uint64 returns a pointer to of the uint64 value passed in. | |||
func Uint64(v uint64) *uint64 { | |||
return &v | |||
} | |||
// Uint64Value returns the value of the uint64 pouinter passed in or | |||
// 0 if the pouinter is nil. | |||
// Uint64Value returns the value of the uint64 pointer passed in or | |||
// 0 if the pointer is nil. | |||
func Uint64Value(v *uint64) uint64 { | |||
if v != nil { | |||
return *v | |||
@@ -431,8 +498,8 @@ func Uint64Value(v *uint64) uint64 { | |||
return 0 | |||
} | |||
// Uint64Slice converts a slice of uint64 values uinto a slice of | |||
// uint64 pouinters | |||
// Uint64Slice converts a slice of uint64 values into a slice of | |||
// uint64 pointers | |||
func Uint64Slice(src []uint64) []*uint64 { | |||
dst := make([]*uint64, len(src)) | |||
for i := 0; i < len(src); i++ { | |||
@@ -441,7 +508,7 @@ func Uint64Slice(src []uint64) []*uint64 { | |||
return dst | |||
} | |||
// Uint64ValueSlice converts a slice of uint64 pouinters uinto a slice of | |||
// Uint64ValueSlice converts a slice of uint64 pointers into a slice of | |||
// uint64 values | |||
func Uint64ValueSlice(src []*uint64) []uint64 { | |||
dst := make([]uint64, len(src)) | |||
@@ -453,8 +520,8 @@ func Uint64ValueSlice(src []*uint64) []uint64 { | |||
return dst | |||
} | |||
// Uint64Map converts a string map of uint64 values uinto a string | |||
// map of uint64 pouinters | |||
// Uint64Map converts a string map of uint64 values into a string | |||
// map of uint64 pointers | |||
func Uint64Map(src map[string]uint64) map[string]*uint64 { | |||
dst := make(map[string]*uint64) | |||
for k, val := range src { | |||
@@ -464,7 +531,7 @@ func Uint64Map(src map[string]uint64) map[string]*uint64 { | |||
return dst | |||
} | |||
// Uint64ValueMap converts a string map of uint64 pouinters uinto a string | |||
// Uint64ValueMap converts a string map of uint64 pointers into a string | |||
// map of uint64 values | |||
func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { | |||
dst := make(map[string]uint64) | |||
@@ -476,6 +543,74 @@ func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { | |||
return dst | |||
} | |||
// Float32 returns a pointer to of the float32 value passed in. | |||
func Float32(v float32) *float32 { | |||
return &v | |||
} | |||
// Float32Value returns the value of the float32 pointer passed in or | |||
// 0 if the pointer is nil. | |||
func Float32Value(v *float32) float32 { | |||
if v != nil { | |||
return *v | |||
} | |||
return 0 | |||
} | |||
// Float32Slice converts a slice of float32 values into a slice of | |||
// float32 pointers | |||
func Float32Slice(src []float32) []*float32 { | |||
dst := make([]*float32, len(src)) | |||
for i := 0; i < len(src); i++ { | |||
dst[i] = &(src[i]) | |||
} | |||
return dst | |||
} | |||
// Float32ValueSlice converts a slice of float32 pointers into a slice of | |||
// float32 values | |||
func Float32ValueSlice(src []*float32) []float32 { | |||
dst := make([]float32, len(src)) | |||
for i := 0; i < len(src); i++ { | |||
if src[i] != nil { | |||
dst[i] = *(src[i]) | |||
} | |||
} | |||
return dst | |||
} | |||
// Float32Map converts a string map of float32 values into a string | |||
// map of float32 pointers | |||
func Float32Map(src map[string]float32) map[string]*float32 { | |||
dst := make(map[string]*float32) | |||
for k, val := range src { | |||
v := val | |||
dst[k] = &v | |||
} | |||
return dst | |||
} | |||
// Float32ValueMap converts a string map of float32 pointers into a string | |||
// map of float32 values | |||
func Float32ValueMap(src map[string]*float32) map[string]float32 { | |||
dst := make(map[string]float32) | |||
for k, val := range src { | |||
if val != nil { | |||
dst[k] = *val | |||
} | |||
} | |||
return dst | |||
} | |||
// Float64 returns a pointer to of the float64 value passed in. | |||
func Float64(v float64) *float64 { | |||
return &v |
@@ -6,9 +6,11 @@ require ( | |||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 | |||
github.com/stretchr/testify v1.3.0 | |||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect | |||
gopkg.in/yaml.v2 v2.2.2 | |||
gopkg.in/yaml.v2 v2.2.4 | |||
) | |||
replace github.com/golang/lint => golang.org/x/lint v0.0.0-20190409202823-959b441ac422 | |||
replace sourcegraph.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1 | |||
go 1.13 |
@@ -16,5 +16,5 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV | |||
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/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= |
@@ -51,7 +51,7 @@ type ejUnmarshaler interface { | |||
UnmarshalEasyJSON(w *jlexer.Lexer) | |||
} | |||
// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaller | |||
// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaler | |||
// so it takes the fastest option available. | |||
func WriteJSON(data interface{}) ([]byte, error) { | |||
if d, ok := data.(ejMarshaler); ok { | |||
@@ -65,8 +65,8 @@ func WriteJSON(data interface{}) ([]byte, error) { | |||
return json.Marshal(data) | |||
} | |||
// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaller | |||
// so it takes the fastes option available | |||
// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaler | |||
// so it takes the fastest option available | |||
func ReadJSON(data []byte, value interface{}) error { | |||
trimmedData := bytes.Trim(data, "\x00") | |||
if d, ok := value.(ejUnmarshaler); ok { | |||
@@ -189,7 +189,7 @@ func FromDynamicJSON(data, target interface{}) error { | |||
return json.Unmarshal(b, target) | |||
} | |||
// NameProvider represents an object capabale of translating from go property names | |||
// NameProvider represents an object capable of translating from go property names | |||
// to json property names | |||
// This type is thread-safe. | |||
type NameProvider struct { |
@@ -27,6 +27,15 @@ import ( | |||
// LoadHTTPTimeout the default timeout for load requests | |||
var LoadHTTPTimeout = 30 * time.Second | |||
// LoadHTTPBasicAuthUsername the username to use when load requests require basic auth | |||
var LoadHTTPBasicAuthUsername = "" | |||
// LoadHTTPBasicAuthPassword the password to use when load requests require basic auth | |||
var LoadHTTPBasicAuthPassword = "" | |||
// LoadHTTPCustomHeaders an optional collection of custom HTTP headers for load requests | |||
var LoadHTTPCustomHeaders = map[string]string{} | |||
// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in | |||
func LoadFromFileOrHTTP(path string) ([]byte, error) { | |||
return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path) | |||
@@ -59,6 +68,15 @@ func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) { | |||
if err != nil { | |||
return nil, err | |||
} | |||
if LoadHTTPBasicAuthUsername != "" && LoadHTTPBasicAuthPassword != "" { | |||
req.SetBasicAuth(LoadHTTPBasicAuthUsername, LoadHTTPBasicAuthPassword) | |||
} | |||
for key, val := range LoadHTTPCustomHeaders { | |||
req.Header.Set(key, val) | |||
} | |||
resp, err := client.Do(req) | |||
defer func() { | |||
if resp != nil { |
@@ -4,17 +4,25 @@ linters-settings: | |||
golint: | |||
min-confidence: 0 | |||
gocyclo: | |||
min-complexity: 25 | |||
min-complexity: 50 | |||
maligned: | |||
suggest-new: true | |||
dupl: | |||
threshold: 100 | |||
goconst: | |||
min-len: 2 | |||
min-occurrences: 2 | |||
min-occurrences: 3 | |||
linters: | |||
enable-all: true | |||
disable: | |||
- maligned | |||
- lll | |||
- godox | |||
- gocognit | |||
- whitespace | |||
- wsl | |||
- funlen | |||
- gochecknoglobals | |||
- gochecknoinits | |||
- scopelint |
@@ -1,12 +1,10 @@ | |||
after_success: | |||
- bash <(curl -s https://codecov.io/bash) | |||
go: | |||
- 1.11.x | |||
- 1.12.x | |||
- 1.13.x | |||
- 1.14.x | |||
install: | |||
- GO111MODULE=off go get -u gotest.tools/gotestsum | |||
env: | |||
- GO111MODULE=on | |||
language: go | |||
notifications: | |||
slack: |
@@ -33,14 +33,8 @@ func (d *defaultValidator) resetVisited() { | |||
d.visitedSchemas = map[string]bool{} | |||
} | |||
// beingVisited asserts a schema is being visited | |||
func (d *defaultValidator) beingVisited(path string) { | |||
d.visitedSchemas[path] = true | |||
} | |||
// isVisited tells if a path has already been visited | |||
func (d *defaultValidator) isVisited(path string) bool { | |||
found := d.visitedSchemas[path] | |||
func isVisited(path string, visitedSchemas map[string]bool) bool { | |||
found := visitedSchemas[path] | |||
if !found { | |||
// search for overlapping paths | |||
frags := strings.Split(path, ".") | |||
@@ -70,6 +64,16 @@ func (d *defaultValidator) isVisited(path string) bool { | |||
return found | |||
} | |||
// beingVisited asserts a schema is being visited | |||
func (d *defaultValidator) beingVisited(path string) { | |||
d.visitedSchemas[path] = true | |||
} | |||
// isVisited tells if a path has already been visited | |||
func (d *defaultValidator) isVisited(path string) bool { | |||
return isVisited(path, d.visitedSchemas) | |||
} | |||
// Validate validates the default values declared in the swagger spec | |||
func (d *defaultValidator) Validate() (errs *Result) { | |||
errs = new(Result) | |||
@@ -89,64 +93,60 @@ func (d *defaultValidator) validateDefaultValueValidAgainstSchema() *Result { | |||
s := d.SpecValidator | |||
for method, pathItem := range s.analyzer.Operations() { | |||
if pathItem != nil { // Safeguard | |||
for path, op := range pathItem { | |||
// parameters | |||
for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { | |||
if param.Default != nil && param.Required { | |||
res.AddWarnings(requiredHasDefaultMsg(param.Name, param.In)) | |||
} | |||
for path, op := range pathItem { | |||
// parameters | |||
for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { | |||
if param.Default != nil && param.Required { | |||
res.AddWarnings(requiredHasDefaultMsg(param.Name, param.In)) | |||
} | |||
// reset explored schemas to get depth-first recursive-proof exploration | |||
d.resetVisited() | |||
// reset explored schemas to get depth-first recursive-proof exploration | |||
d.resetVisited() | |||
// Check simple parameters first | |||
// default values provided must validate against their inline definition (no explicit schema) | |||
if param.Default != nil && param.Schema == nil { | |||
// check param default value is valid | |||
red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Default) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) | |||
res.Merge(red) | |||
} | |||
// Check simple parameters first | |||
// default values provided must validate against their inline definition (no explicit schema) | |||
if param.Default != nil && param.Schema == nil { | |||
// check param default value is valid | |||
red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Default) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) | |||
res.Merge(red) | |||
} | |||
} | |||
// Recursively follows Items and Schemas | |||
if param.Items != nil { | |||
red := d.validateDefaultValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddErrors(defaultValueItemsDoesNotValidateMsg(param.Name, param.In)) | |||
res.Merge(red) | |||
} | |||
// Recursively follows Items and Schemas | |||
if param.Items != nil { | |||
red := d.validateDefaultValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddErrors(defaultValueItemsDoesNotValidateMsg(param.Name, param.In)) | |||
res.Merge(red) | |||
} | |||
} | |||
if param.Schema != nil { | |||
// Validate default value against schema | |||
red := d.validateDefaultValueSchemaAgainstSchema(param.Name, param.In, param.Schema) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) | |||
res.Merge(red) | |||
} | |||
if param.Schema != nil { | |||
// Validate default value against schema | |||
red := d.validateDefaultValueSchemaAgainstSchema(param.Name, param.In, param.Schema) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) | |||
res.Merge(red) | |||
} | |||
} | |||
} | |||
if op.Responses != nil { | |||
if op.Responses.Default != nil { | |||
// Same constraint on default Response | |||
res.Merge(d.validateDefaultInResponse(op.Responses.Default, "default", path, 0, op.ID)) | |||
} | |||
// Same constraint on regular Responses | |||
if op.Responses.StatusCodeResponses != nil { // Safeguard | |||
for code, r := range op.Responses.StatusCodeResponses { | |||
res.Merge(d.validateDefaultInResponse(&r, "response", path, code, op.ID)) | |||
} | |||
} | |||
} else { | |||
// Empty op.ID means there is no meaningful operation: no need to report a specific message | |||
if op.ID != "" { | |||
res.AddErrors(noValidResponseMsg(op.ID)) | |||
if op.Responses != nil { | |||
if op.Responses.Default != nil { | |||
// Same constraint on default Response | |||
res.Merge(d.validateDefaultInResponse(op.Responses.Default, jsonDefault, path, 0, op.ID)) | |||
} | |||
// Same constraint on regular Responses | |||
if op.Responses.StatusCodeResponses != nil { // Safeguard | |||
for code, r := range op.Responses.StatusCodeResponses { | |||
res.Merge(d.validateDefaultInResponse(&r, "response", path, code, op.ID)) | |||
} | |||
} | |||
} else if op.ID != "" { | |||
// Empty op.ID means there is no meaningful operation: no need to report a specific message | |||
res.AddErrors(noValidResponseMsg(op.ID)) | |||
} | |||
} | |||
} | |||
@@ -170,6 +170,7 @@ func (d *defaultValidator) validateDefaultInResponse(resp *spec.Response, respon | |||
responseName, responseCodeAsStr := responseHelp.responseMsgVariants(responseType, responseCode) | |||
// nolint: dupl | |||
if response.Headers != nil { // Safeguard | |||
for nm, h := range response.Headers { | |||
// reset explored schemas to get depth-first recursive-proof exploration | |||
@@ -223,7 +224,7 @@ func (d *defaultValidator) validateDefaultValueSchemaAgainstSchema(path, in stri | |||
s := d.SpecValidator | |||
if schema.Default != nil { | |||
res.Merge(NewSchemaValidator(schema, s.spec.Spec(), path+".default", s.KnownFormats).Validate(schema.Default)) | |||
res.Merge(NewSchemaValidator(schema, s.spec.Spec(), path+".default", s.KnownFormats, SwaggerSchema(true)).Validate(schema.Default)) | |||
} | |||
if schema.Items != nil { | |||
if schema.Items.Schema != nil { | |||
@@ -260,6 +261,8 @@ func (d *defaultValidator) validateDefaultValueSchemaAgainstSchema(path, in stri | |||
return res | |||
} | |||
// TODO: Temporary duplicated code. Need to refactor with examples | |||
// nolint: dupl | |||
func (d *defaultValidator) validateDefaultValueItemsAgainstSchema(path, in string, root interface{}, items *spec.Items) *Result { | |||
res := new(Result) | |||
s := d.SpecValidator |
@@ -16,7 +16,6 @@ package validate | |||
import ( | |||
"fmt" | |||
"strings" | |||
"github.com/go-openapi/spec" | |||
) | |||
@@ -39,34 +38,7 @@ func (ex *exampleValidator) beingVisited(path string) { | |||
// isVisited tells if a path has already been visited | |||
func (ex *exampleValidator) isVisited(path string) bool { | |||
found := ex.visitedSchemas[path] | |||
if !found { | |||
// search for overlapping paths | |||
frags := strings.Split(path, ".") | |||
if len(frags) < 2 { | |||
// shortcut exit on smaller paths | |||
return found | |||
} | |||
last := len(frags) - 1 | |||
var currentFragStr, parent string | |||
for i := range frags { | |||
if i == 0 { | |||
currentFragStr = frags[last] | |||
} else { | |||
currentFragStr = strings.Join([]string{frags[last-i], currentFragStr}, ".") | |||
} | |||
if i < last { | |||
parent = strings.Join(frags[0:last-i], ".") | |||
} else { | |||
parent = "" | |||
} | |||
if strings.HasSuffix(parent, currentFragStr) { | |||
found = true | |||
break | |||
} | |||
} | |||
} | |||
return found | |||
return isVisited(path, ex.visitedSchemas) | |||
} | |||
// Validate validates the example values declared in the swagger spec | |||
@@ -97,64 +69,60 @@ func (ex *exampleValidator) validateExampleValueValidAgainstSchema() *Result { | |||
s := ex.SpecValidator | |||
for method, pathItem := range s.analyzer.Operations() { | |||
if pathItem != nil { // Safeguard | |||
for path, op := range pathItem { | |||
// parameters | |||
for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { | |||
for path, op := range pathItem { | |||
// parameters | |||
for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { | |||
// As of swagger 2.0, Examples are not supported in simple parameters | |||
// However, it looks like it is supported by go-openapi | |||
// As of swagger 2.0, Examples are not supported in simple parameters | |||
// However, it looks like it is supported by go-openapi | |||
// reset explored schemas to get depth-first recursive-proof exploration | |||
ex.resetVisited() | |||
// reset explored schemas to get depth-first recursive-proof exploration | |||
ex.resetVisited() | |||
// Check simple parameters first | |||
// default values provided must validate against their inline definition (no explicit schema) | |||
if param.Example != nil && param.Schema == nil { | |||
// check param default value is valid | |||
red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Example) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) | |||
res.MergeAsWarnings(red) | |||
} | |||
// Check simple parameters first | |||
// default values provided must validate against their inline definition (no explicit schema) | |||
if param.Example != nil && param.Schema == nil { | |||
// check param default value is valid | |||
red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Example) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) | |||
res.MergeAsWarnings(red) | |||
} | |||
} | |||
// Recursively follows Items and Schemas | |||
if param.Items != nil { | |||
red := ex.validateExampleValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddWarnings(exampleValueItemsDoesNotValidateMsg(param.Name, param.In)) | |||
res.Merge(red) | |||
} | |||
// Recursively follows Items and Schemas | |||
if param.Items != nil { | |||
red := ex.validateExampleValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddWarnings(exampleValueItemsDoesNotValidateMsg(param.Name, param.In)) | |||
res.Merge(red) | |||
} | |||
} | |||
if param.Schema != nil { | |||
// Validate example value against schema | |||
red := ex.validateExampleValueSchemaAgainstSchema(param.Name, param.In, param.Schema) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) | |||
res.Merge(red) | |||
} | |||
if param.Schema != nil { | |||
// Validate example value against schema | |||
red := ex.validateExampleValueSchemaAgainstSchema(param.Name, param.In, param.Schema) | |||
if red.HasErrorsOrWarnings() { | |||
res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) | |||
res.Merge(red) | |||
} | |||
} | |||
} | |||
if op.Responses != nil { | |||
if op.Responses.Default != nil { | |||
// Same constraint on default Response | |||
res.Merge(ex.validateExampleInResponse(op.Responses.Default, "default", path, 0, op.ID)) | |||
} | |||
// Same constraint on regular Responses | |||
if op.Responses.StatusCodeResponses != nil { // Safeguard | |||
for code, r := range op.Responses.StatusCodeResponses { | |||
res.Merge(ex.validateExampleInResponse(&r, "response", path, code, op.ID)) | |||
} | |||
} | |||
} else { | |||
// Empty op.ID means there is no meaningful operation: no need to report a specific message | |||
if op.ID != "" { | |||
res.AddErrors(noValidResponseMsg(op.ID)) | |||
if op.Responses != nil { | |||
if op.Responses.Default != nil { | |||
// Same constraint on default Response | |||
res.Merge(ex.validateExampleInResponse(op.Responses.Default, jsonDefault, path, 0, op.ID)) | |||
} | |||
// Same constraint on regular Responses | |||
if op.Responses.StatusCodeResponses != nil { // Safeguard | |||
for code, r := range op.Responses.StatusCodeResponses { | |||
res.Merge(ex.validateExampleInResponse(&r, "response", path, code, op.ID)) | |||
} | |||
} | |||
} else if op.ID != "" { | |||
// Empty op.ID means there is no meaningful operation: no need to report a specific message | |||
res.AddErrors(noValidResponseMsg(op.ID)) | |||
} | |||
} | |||
} | |||
@@ -178,6 +146,7 @@ func (ex *exampleValidator) validateExampleInResponse(resp *spec.Response, respo | |||
responseName, responseCodeAsStr := responseHelp.responseMsgVariants(responseType, responseCode) | |||
// nolint: dupl | |||
if response.Headers != nil { // Safeguard | |||
for nm, h := range response.Headers { | |||
// reset explored schemas to get depth-first recursive-proof exploration | |||
@@ -222,7 +191,7 @@ func (ex *exampleValidator) validateExampleInResponse(resp *spec.Response, respo | |||
if response.Examples != nil { | |||
if response.Schema != nil { | |||
if example, ok := response.Examples["application/json"]; ok { | |||
res.MergeAsWarnings(NewSchemaValidator(response.Schema, s.spec.Spec(), path, s.KnownFormats).Validate(example)) | |||
res.MergeAsWarnings(NewSchemaValidator(response.Schema, s.spec.Spec(), path+".examples", s.KnownFormats, SwaggerSchema(true)).Validate(example)) | |||
} else { | |||
// TODO: validate other media types too | |||
res.AddWarnings(examplesMimeNotSupportedMsg(operationID, responseName)) | |||
@@ -244,7 +213,7 @@ func (ex *exampleValidator) validateExampleValueSchemaAgainstSchema(path, in str | |||
res := new(Result) | |||
if schema.Example != nil { | |||
res.MergeAsWarnings(NewSchemaValidator(schema, s.spec.Spec(), path+".example", s.KnownFormats).Validate(schema.Example)) | |||
res.MergeAsWarnings(NewSchemaValidator(schema, s.spec.Spec(), path+".example", s.KnownFormats, SwaggerSchema(true)).Validate(schema.Example)) | |||
} | |||
if schema.Items != nil { | |||
if schema.Items.Schema != nil { | |||
@@ -281,6 +250,8 @@ func (ex *exampleValidator) validateExampleValueSchemaAgainstSchema(path, in str | |||
return res | |||
} | |||
// TODO: Temporary duplicated code. Need to refactor with examples | |||
// nolint: dupl | |||
func (ex *exampleValidator) validateExampleValueItemsAgainstSchema(path, in string, root interface{}, items *spec.Items) *Result { | |||
res := new(Result) | |||
s := ex.SpecValidator |
@@ -37,19 +37,15 @@ func (f *formatValidator) Applies(source interface{}, kind reflect.Kind) bool { | |||
if source == nil { | |||
return false | |||
} | |||
switch source.(type) { | |||
switch source := source.(type) { | |||
case *spec.Items: | |||
it := source.(*spec.Items) | |||
return kind == reflect.String && f.KnownFormats.ContainsName(it.Format) | |||
return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) | |||
case *spec.Parameter: | |||
par := source.(*spec.Parameter) | |||
return kind == reflect.String && f.KnownFormats.ContainsName(par.Format) | |||
return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) | |||
case *spec.Schema: | |||
sch := source.(*spec.Schema) | |||
return kind == reflect.String && f.KnownFormats.ContainsName(sch.Format) | |||
return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) | |||
case *spec.Header: | |||
hdr := source.(*spec.Header) | |||
return kind == reflect.String && f.KnownFormats.ContainsName(hdr.Format) | |||
return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) | |||
} | |||
return false | |||
} |
@@ -1,17 +1,21 @@ | |||
module github.com/go-openapi/validate | |||
go 1.14 | |||
require ( | |||
github.com/go-openapi/analysis v0.19.4 | |||
github.com/go-openapi/errors v0.19.2 | |||
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect | |||
github.com/go-openapi/analysis v0.19.10 | |||
github.com/go-openapi/errors v0.19.6 | |||
github.com/go-openapi/jsonpointer v0.19.3 | |||
github.com/go-openapi/loads v0.19.2 | |||
github.com/go-openapi/runtime v0.19.4 | |||
github.com/go-openapi/spec v0.19.3 | |||
github.com/go-openapi/strfmt v0.19.2 | |||
github.com/go-openapi/swag v0.19.5 | |||
github.com/stretchr/testify v1.4.0 | |||
go.mongodb.org/mongo-driver v1.1.1 // indirect | |||
gopkg.in/yaml.v2 v2.2.2 | |||
github.com/go-openapi/loads v0.19.5 | |||
github.com/go-openapi/runtime v0.19.15 | |||
github.com/go-openapi/spec v0.19.8 | |||
github.com/go-openapi/strfmt v0.19.5 | |||
github.com/go-openapi/swag v0.19.9 | |||
github.com/mitchellh/mapstructure v1.3.2 // indirect | |||
github.com/stretchr/testify v1.6.1 | |||
go.mongodb.org/mongo-driver v1.3.4 // indirect | |||
golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect | |||
gopkg.in/yaml.v2 v2.3.0 | |||
) | |||
go 1.13 |
@@ -1,3 +1,4 @@ | |||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | |||
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= | |||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
@@ -6,130 +7,233 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko | |||
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/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/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 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= | |||
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 h1:ophLETFestFZHk3ji7niPEL4d466QjW+0Tdg5VyDq7E= | |||
github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= | |||
github.com/go-openapi/analysis v0.19.4 h1:1TjOzrWkj+9BrjnM1yPAICbaoC0FyfD49oVkTBrSSa0= | |||
github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= | |||
github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= | |||
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/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/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/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/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 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= | |||
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/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 h1:rf5ArTHmIJxyV5Oiks+Su0mUens1+AjpkPoWr5xFRcI= | |||
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 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls= | |||
github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= | |||
github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= | |||
github.com/go-openapi/runtime v0.19.0 h1:sU6pp4dSV2sGlNKKyHxZzi1m1kG4WnYtWcJ+HYbygjE= | |||
github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= | |||
github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= | |||
github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= | |||
github.com/go-openapi/runtime v0.19.15 h1:2GIefxs9Rx1vCDNghRtypRq+ig8KSLrjHbAYI/gCLCM= | |||
github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= | |||
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 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= | |||
github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= | |||
github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= | |||
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 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= | |||
github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | |||
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 h1:0Dn9qy1G9+UJfRU7TR8bmdGxb4uifB7HNrJjOnV0yPk= | |||
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/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/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/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/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-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= | |||
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= | |||
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= | |||
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | |||
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= | |||
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= | |||
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | |||
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= | |||
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= | |||
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= | |||
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= | |||
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= | |||
github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= | |||
github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= | |||
github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= | |||
github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= | |||
github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= | |||
github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | |||
github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= | |||
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | |||
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= | |||
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= | |||
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= | |||
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= | |||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | |||
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/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/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | |||
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= | |||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
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/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/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/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/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pkg/errors v0.8.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/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= | |||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | |||
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/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 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= | |||
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= | |||
go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= | |||
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/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | |||
go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= | |||
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 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE= | |||
go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | |||
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/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-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/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/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/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/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-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= | |||
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= | |||
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.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.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= |
@@ -26,8 +26,67 @@ import ( | |||
"github.com/go-openapi/spec" | |||
) | |||
const swaggerBody = "body" | |||
const objectType = "object" | |||
const ( | |||
swaggerBody = "body" | |||
swaggerExample = "example" | |||
swaggerExamples = "examples" | |||
) | |||
const ( | |||
objectType = "object" | |||
arrayType = "array" | |||
stringType = "string" | |||
integerType = "integer" | |||
numberType = "number" | |||
booleanType = "boolean" | |||
fileType = "file" | |||
nullType = "null" | |||
) | |||
const ( | |||
jsonProperties = "properties" | |||
jsonItems = "items" | |||
jsonType = "type" | |||
//jsonSchema = "schema" | |||
jsonDefault = "default" | |||
) | |||
const ( | |||
stringFormatDate = "date" | |||
stringFormatDateTime = "date-time" | |||
stringFormatPassword = "password" | |||
stringFormatByte = "byte" | |||
//stringFormatBinary = "binary" | |||
stringFormatCreditCard = "creditcard" | |||
stringFormatDuration = "duration" | |||
stringFormatEmail = "email" | |||
stringFormatHexColor = "hexcolor" | |||
stringFormatHostname = "hostname" | |||
stringFormatIPv4 = "ipv4" | |||
stringFormatIPv6 = "ipv6" | |||
stringFormatISBN = "isbn" | |||
stringFormatISBN10 = "isbn10" | |||
stringFormatISBN13 = "isbn13" | |||
stringFormatMAC = "mac" | |||
stringFormatBSONObjectID = "bsonobjectid" | |||
stringFormatRGBColor = "rgbcolor" | |||
stringFormatSSN = "ssn" | |||
stringFormatURI = "uri" | |||
stringFormatUUID = "uuid" | |||
stringFormatUUID3 = "uuid3" | |||
stringFormatUUID4 = "uuid4" | |||
stringFormatUUID5 = "uuid5" | |||
integerFormatInt32 = "int32" | |||
integerFormatInt64 = "int64" | |||
integerFormatUInt32 = "uint32" | |||
integerFormatUInt64 = "uint64" | |||
numberFormatFloat32 = "float32" | |||
numberFormatFloat64 = "float64" | |||
numberFormatFloat = "float" | |||
numberFormatDouble = "double" | |||
) | |||
// Helpers available at the package level | |||
var ( | |||
@@ -205,7 +264,8 @@ func (h *paramHelper) checkExpandedParam(pr *spec.Parameter, path, in, operation | |||
res := new(Result) | |||
simpleZero := spec.SimpleSchema{} | |||
// Try to explain why... best guess | |||
if pr.In == swaggerBody && (pr.SimpleSchema != simpleZero && pr.SimpleSchema.Type != objectType) { | |||
switch { | |||
case pr.In == swaggerBody && (pr.SimpleSchema != simpleZero && pr.SimpleSchema.Type != objectType): | |||
if isRef { | |||
// Most likely, a $ref with a sibling is an unwanted situation: in itself this is a warning... | |||
// but we detect it because of the following error: | |||
@@ -213,13 +273,12 @@ func (h *paramHelper) checkExpandedParam(pr *spec.Parameter, path, in, operation | |||
res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation)) | |||
} | |||
res.AddErrors(invalidParameterDefinitionMsg(path, in, operation)) | |||
} else if pr.In != swaggerBody && pr.Schema != nil { | |||
case pr.In != swaggerBody && pr.Schema != nil: | |||
if isRef { | |||
res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation)) | |||
} | |||
res.AddErrors(invalidParameterDefinitionAsSchemaMsg(path, in, operation)) | |||
} else if (pr.In == swaggerBody && pr.Schema == nil) || | |||
(pr.In != swaggerBody && pr.SimpleSchema == simpleZero) { // Safeguard | |||
case (pr.In == swaggerBody && pr.Schema == nil) || (pr.In != swaggerBody && pr.SimpleSchema == simpleZero): | |||
// Other unexpected mishaps | |||
res.AddErrors(invalidParameterDefinitionMsg(path, in, operation)) | |||
} | |||
@@ -254,8 +313,8 @@ func (r *responseHelper) responseMsgVariants( | |||
responseType string, | |||
responseCode int) (responseName, responseCodeAsStr string) { | |||
// Path variants for messages | |||
if responseType == "default" { | |||
responseCodeAsStr = "default" | |||
if responseType == jsonDefault { | |||
responseCodeAsStr = jsonDefault | |||
responseName = "default response" | |||
} else { | |||
responseCodeAsStr = strconv.Itoa(responseCode) |
@@ -51,40 +51,54 @@ func (o *objectValidator) Applies(source interface{}, kind reflect.Kind) bool { | |||
return r | |||
} | |||
func (o *objectValidator) isPropertyName() bool { | |||
func (o *objectValidator) isProperties() bool { | |||
p := strings.Split(o.Path, ".") | |||
return p[len(p)-1] == "properties" && p[len(p)-2] != "properties" | |||
return len(p) > 1 && p[len(p)-1] == jsonProperties && p[len(p)-2] != jsonProperties | |||
} | |||
func (o *objectValidator) isDefault() bool { | |||
p := strings.Split(o.Path, ".") | |||
return len(p) > 1 && p[len(p)-1] == jsonDefault && p[len(p)-2] != jsonDefault | |||
} | |||
func (o *objectValidator) isExample() bool { | |||
p := strings.Split(o.Path, ".") | |||
return len(p) > 1 && (p[len(p)-1] == swaggerExample || p[len(p)-1] == swaggerExamples) && p[len(p)-2] != swaggerExample | |||
} | |||
func (o *objectValidator) checkArrayMustHaveItems(res *Result, val map[string]interface{}) { | |||
if t, typeFound := val["type"]; typeFound { | |||
if tpe, ok := t.(string); ok && tpe == "array" { | |||
if _, itemsKeyFound := val["items"]; !itemsKeyFound { | |||
res.AddErrors(errors.Required("items", o.Path)) | |||
// for swagger 2.0 schemas, there is an additional constraint to have array items defined explicitly. | |||
// with pure jsonschema draft 4, one may have arrays with undefined items (i.e. any type). | |||
if t, typeFound := val[jsonType]; typeFound { | |||
if tpe, ok := t.(string); ok && tpe == arrayType { | |||
if item, itemsKeyFound := val[jsonItems]; !itemsKeyFound { | |||
res.AddErrors(errors.Required(jsonItems, o.Path, item)) | |||
} | |||
} | |||
} | |||
} | |||
func (o *objectValidator) checkItemsMustBeTypeArray(res *Result, val map[string]interface{}) { | |||
if !o.isPropertyName() { | |||
if _, itemsKeyFound := val["items"]; itemsKeyFound { | |||
t, typeFound := val["type"] | |||
if !o.isProperties() && !o.isDefault() && !o.isExample() { | |||
if _, itemsKeyFound := val[jsonItems]; itemsKeyFound { | |||
t, typeFound := val[jsonType] | |||
if typeFound { | |||
if tpe, ok := t.(string); !ok || tpe != "array" { | |||
res.AddErrors(errors.InvalidType(o.Path, o.In, "array", nil)) | |||
if tpe, ok := t.(string); !ok || tpe != arrayType { | |||
res.AddErrors(errors.InvalidType(o.Path, o.In, arrayType, nil)) | |||
} | |||
} else { | |||
// there is no type | |||
res.AddErrors(errors.Required("type", o.Path)) | |||
res.AddErrors(errors.Required(jsonType, o.Path, t)) | |||
} | |||
} | |||
} | |||
} | |||
func (o *objectValidator) precheck(res *Result, val map[string]interface{}) { | |||
o.checkArrayMustHaveItems(res, val) | |||
if !o.Options.DisableObjectArrayTypeCheck { | |||
if o.Options.EnableArrayMustHaveItemsCheck { | |||
o.checkArrayMustHaveItems(res, val) | |||
} | |||
if o.Options.EnableObjectArrayTypeCheck { | |||
o.checkItemsMustBeTypeArray(res, val) | |||
} | |||
} | |||
@@ -134,21 +148,18 @@ func (o *objectValidator) Validate(data interface{}) *Result { | |||
// NOTE: prefix your messages here by "IMPORTANT!" so there are not filtered | |||
// by higher level callers (the IMPORTANT! tag will be eventually | |||
// removed). | |||
switch k { | |||
// $ref is forbidden in header | |||
case "headers": | |||
if val[k] != nil { | |||
if headers, mapOk := val[k].(map[string]interface{}); mapOk { | |||
for headerKey, headerBody := range headers { | |||
if headerBody != nil { | |||
if headerSchema, mapOfMapOk := headerBody.(map[string]interface{}); mapOfMapOk { | |||
if _, found := headerSchema["$ref"]; found { | |||
var msg string | |||
if refString, stringOk := headerSchema["$ref"].(string); stringOk { | |||
msg = strings.Join([]string{", one may not use $ref=\":", refString, "\""}, "") | |||
} | |||
res.AddErrors(refNotAllowedInHeaderMsg(o.Path, headerKey, msg)) | |||
if k == "headers" && val[k] != nil { | |||
// $ref is forbidden in header | |||
if headers, mapOk := val[k].(map[string]interface{}); mapOk { | |||
for headerKey, headerBody := range headers { | |||
if headerBody != nil { | |||
if headerSchema, mapOfMapOk := headerBody.(map[string]interface{}); mapOfMapOk { | |||
if _, found := headerSchema["$ref"]; found { | |||
var msg string | |||
if refString, stringOk := headerSchema["$ref"].(string); stringOk { | |||
msg = strings.Join([]string{", one may not use $ref=\":", refString, "\""}, "") | |||
} | |||
res.AddErrors(refNotAllowedInHeaderMsg(o.Path, headerKey, msg)) | |||
} | |||
} | |||
} | |||
@@ -216,8 +227,8 @@ func (o *objectValidator) Validate(data interface{}) *Result { | |||
// Check required properties | |||
if len(o.Required) > 0 { | |||
for _, k := range o.Required { | |||
if _, ok := val[k]; !ok && !createdFromDefaults[k] { | |||
res.AddErrors(errors.Required(o.Path+"."+k, o.In)) | |||
if v, ok := val[k]; !ok && !createdFromDefaults[k] { | |||
res.AddErrors(errors.Required(o.Path+"."+k, o.In, v)) | |||
continue | |||
} | |||
} |
@@ -132,6 +132,7 @@ func (r *Result) RootObjectSchemata() []*spec.Schema { | |||
} | |||
// FieldSchemata returns the schemata which apply to fields in objects. | |||
// nolint: dupl | |||
func (r *Result) FieldSchemata() map[FieldKey][]*spec.Schema { | |||
if r.cachedFieldSchemta != nil { | |||
return r.cachedFieldSchemta | |||
@@ -151,6 +152,7 @@ func (r *Result) FieldSchemata() map[FieldKey][]*spec.Schema { | |||
} | |||
// ItemSchemata returns the schemata which apply to items in slices. | |||
// nolint: dupl | |||
func (r *Result) ItemSchemata() map[ItemKey][]*spec.Schema { | |||
if r.cachedItemSchemata != nil { | |||
return r.cachedItemSchemata | |||
@@ -175,6 +177,7 @@ func (r *Result) resetCaches() { | |||
} | |||
// mergeForField merges other into r, assigning other's root schemata to the given Object and field name. | |||
// nolint: unparam | |||
func (r *Result) mergeForField(obj map[string]interface{}, field string, other *Result) *Result { | |||
if other == nil { | |||
return r | |||
@@ -196,6 +199,7 @@ func (r *Result) mergeForField(obj map[string]interface{}, field string, other * | |||
} | |||
// mergeForSlice merges other into r, assigning other's root schemata to the given slice and index. | |||
// nolint: unparam | |||
func (r *Result) mergeForSlice(slice reflect.Value, i int, other *Result) *Result { | |||
if other == nil { | |||
return r | |||
@@ -231,6 +235,7 @@ func (r *Result) addPropertySchemata(obj map[string]interface{}, fld string, sch | |||
r.fieldSchemata = append(r.fieldSchemata, fieldSchemata{obj: obj, field: fld, schemata: schemata{one: schema}}) | |||
} | |||
/* | |||
// addSliceSchemata adds the given schemata for the slice and index. | |||
// The slice schemata might be reused. I.e. do not modify it after being added to a result. | |||
func (r *Result) addSliceSchemata(slice reflect.Value, i int, schema *spec.Schema) { | |||
@@ -239,6 +244,7 @@ func (r *Result) addSliceSchemata(slice reflect.Value, i int, schema *spec.Schem | |||
} | |||
r.itemSchemata = append(r.itemSchemata, itemSchemata{slice: slice, index: i, schemata: schemata{one: schema}}) | |||
} | |||
*/ | |||
// mergeWithoutRootSchemata merges other into r, ignoring the rootObject schemata. | |||
func (r *Result) mergeWithoutRootSchemata(other *Result) { | |||
@@ -251,9 +257,7 @@ func (r *Result) mergeWithoutRootSchemata(other *Result) { | |||
if r.fieldSchemata == nil { | |||
r.fieldSchemata = other.fieldSchemata | |||
} else { | |||
for _, x := range other.fieldSchemata { | |||
r.fieldSchemata = append(r.fieldSchemata, x) | |||
} | |||
r.fieldSchemata = append(r.fieldSchemata, other.fieldSchemata...) | |||
} | |||
} | |||
@@ -261,9 +265,7 @@ func (r *Result) mergeWithoutRootSchemata(other *Result) { | |||
if r.itemSchemata == nil { | |||
r.itemSchemata = other.itemSchemata | |||
} else { | |||
for _, x := range other.itemSchemata { | |||
r.itemSchemata = append(r.itemSchemata, x) | |||
} | |||
r.itemSchemata = append(r.itemSchemata, other.itemSchemata...) | |||
} | |||
} | |||
} |
@@ -27,8 +27,8 @@ import ( | |||
var ( | |||
specSchemaType = reflect.TypeOf(&spec.Schema{}) | |||
specParameterType = reflect.TypeOf(&spec.Parameter{}) | |||
specItemsType = reflect.TypeOf(&spec.Items{}) | |||
specHeaderType = reflect.TypeOf(&spec.Header{}) | |||
//specItemsType = reflect.TypeOf(&spec.Items{}) | |||
) | |||
// SchemaValidator validates data against a JSON schema | |||
@@ -39,14 +39,14 @@ type SchemaValidator struct { | |||
validators []valueValidator | |||
Root interface{} | |||
KnownFormats strfmt.Registry | |||
Options *SchemaValidatorOptions | |||
Options SchemaValidatorOptions | |||
} | |||
// AgainstSchema validates the specified data against the provided schema, using a registry of supported formats. | |||
// | |||
// When no pre-parsed *spec.Schema structure is provided, it uses a JSON schema as default. See example. | |||
func AgainstSchema(schema *spec.Schema, data interface{}, formats strfmt.Registry) error { | |||
res := NewSchemaValidator(schema, nil, "", formats).Validate(data) | |||
func AgainstSchema(schema *spec.Schema, data interface{}, formats strfmt.Registry, options ...Option) error { | |||
res := NewSchemaValidator(schema, nil, "", formats, options...).Validate(data) | |||
if res.HasErrors() { | |||
return errors.CompositeValidationError(res.Errors...) | |||
} | |||
@@ -72,9 +72,15 @@ func NewSchemaValidator(schema *spec.Schema, rootSchema interface{}, root string | |||
panic(msg) | |||
} | |||
} | |||
s := SchemaValidator{Path: root, in: "body", Schema: schema, Root: rootSchema, KnownFormats: formats, Options: &SchemaValidatorOptions{}} | |||
s := SchemaValidator{ | |||
Path: root, | |||
in: "body", | |||
Schema: schema, | |||
Root: rootSchema, | |||
KnownFormats: formats, | |||
Options: SchemaValidatorOptions{}} | |||
for _, o := range options { | |||
o(s.Options) | |||
o(&s.Options) | |||
} | |||
s.validators = []valueValidator{ | |||
s.typeValidator(), | |||
@@ -134,9 +140,9 @@ func (s *SchemaValidator) Validate(data interface{}) *Result { | |||
// TODO: this part should be handed over to type validator | |||
// Handle special case of json.Number data (number marshalled as string) | |||
isnumber := s.Schema.Type.Contains("number") || s.Schema.Type.Contains("integer") | |||
isnumber := s.Schema.Type.Contains(numberType) || s.Schema.Type.Contains(integerType) | |||
if num, ok := data.(json.Number); ok && isnumber { | |||
if s.Schema.Type.Contains("integer") { // avoid lossy conversion | |||
if s.Schema.Type.Contains(integerType) { // avoid lossy conversion | |||
in, erri := num.Int64() | |||
if erri != nil { | |||
result.AddErrors(invalidTypeConversionMsg(s.Path, erri)) | |||
@@ -196,6 +202,7 @@ func (s *SchemaValidator) sliceValidator() valueValidator { | |||
Items: s.Schema.Items, | |||
Root: s.Root, | |||
KnownFormats: s.KnownFormats, | |||
Options: s.Options, | |||
} | |||
} | |||
@@ -248,6 +255,6 @@ func (s *SchemaValidator) objectValidator() valueValidator { | |||
PatternProperties: s.Schema.PatternProperties, | |||
Root: s.Root, | |||
KnownFormats: s.KnownFormats, | |||
Options: *s.Options, | |||
Options: s.Options, | |||
} | |||
} |
@@ -14,20 +14,41 @@ | |||
package validate | |||
// SchemaValidatorOptions defines optional rules for schema validation | |||
type SchemaValidatorOptions struct { | |||
DisableObjectArrayTypeCheck bool | |||
EnableObjectArrayTypeCheck bool | |||
EnableArrayMustHaveItemsCheck bool | |||
} | |||
// Option sets optional rules for schema validation | |||
type Option func(*SchemaValidatorOptions) | |||
func DisableObjectArrayTypeCheck(disable bool) Option { | |||
// EnableObjectArrayTypeCheck activates the swagger rule: an items must be in type: array | |||
func EnableObjectArrayTypeCheck(enable bool) Option { | |||
return func(svo *SchemaValidatorOptions) { | |||
svo.DisableObjectArrayTypeCheck = disable | |||
svo.EnableObjectArrayTypeCheck = enable | |||
} | |||
} | |||
// EnableArrayMustHaveItemsCheck activates the swagger rule: an array must have items defined | |||
func EnableArrayMustHaveItemsCheck(enable bool) Option { | |||
return func(svo *SchemaValidatorOptions) { | |||
svo.EnableArrayMustHaveItemsCheck = enable | |||
} | |||
} | |||
// SwaggerSchema activates swagger schema validation rules | |||
func SwaggerSchema(enable bool) Option { | |||
return func(svo *SchemaValidatorOptions) { | |||
svo.EnableObjectArrayTypeCheck = enable | |||
svo.EnableArrayMustHaveItemsCheck = enable | |||
} | |||
} | |||
// Options returns current options | |||
func (svo SchemaValidatorOptions) Options() []Option { | |||
return []Option{ | |||
DisableObjectArrayTypeCheck(svo.DisableObjectArrayTypeCheck), | |||
EnableObjectArrayTypeCheck(svo.EnableObjectArrayTypeCheck), | |||
EnableArrayMustHaveItemsCheck(svo.EnableArrayMustHaveItemsCheck), | |||
} | |||
} |
@@ -32,6 +32,7 @@ type schemaSliceValidator struct { | |||
Items *spec.SchemaOrArray | |||
Root interface{} | |||
KnownFormats strfmt.Registry | |||
Options SchemaValidatorOptions | |||
} | |||
func (s *schemaSliceValidator) SetPath(path string) { | |||
@@ -53,7 +54,7 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result { | |||
size := val.Len() | |||
if s.Items != nil && s.Items.Schema != nil { | |||
validator := NewSchemaValidator(s.Items.Schema, s.Root, s.Path, s.KnownFormats) | |||
validator := NewSchemaValidator(s.Items.Schema, s.Root, s.Path, s.KnownFormats, s.Options.Options()...) | |||
for i := 0; i < size; i++ { | |||
validator.SetPath(fmt.Sprintf("%s.%d", s.Path, i)) | |||
value := val.Index(i) | |||
@@ -65,11 +66,11 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result { | |||
if s.Items != nil && len(s.Items.Schemas) > 0 { | |||
itemsSize = len(s.Items.Schemas) | |||
for i := 0; i < itemsSize; i++ { | |||
validator := NewSchemaValidator(&s.Items.Schemas[i], s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats) | |||
validator := NewSchemaValidator(&s.Items.Schemas[i], s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats, s.Options.Options()...) | |||
if val.Len() <= i { | |||
break | |||
} | |||
result.mergeForSlice(val, int(i), validator.Validate(val.Index(i).Interface())) | |||
result.mergeForSlice(val, i, validator.Validate(val.Index(i).Interface())) | |||
} | |||
} | |||
if s.AdditionalItems != nil && itemsSize < size { | |||
@@ -78,8 +79,8 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result { | |||
} | |||
if s.AdditionalItems.Schema != nil { | |||
for i := itemsSize; i < size-itemsSize+1; i++ { | |||
validator := NewSchemaValidator(s.AdditionalItems.Schema, s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats) | |||
result.mergeForSlice(val, int(i), validator.Validate(val.Index(int(i)).Interface())) | |||
validator := NewSchemaValidator(s.AdditionalItems.Schema, s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats, s.Options.Options()...) | |||
result.mergeForSlice(val, i, validator.Validate(val.Index(i).Interface())) | |||
} | |||
} | |||
} |
@@ -71,25 +71,22 @@ func NewSpecValidator(schema *spec.Schema, formats strfmt.Registry) *SpecValidat | |||
} | |||
// Validate validates the swagger spec | |||
func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Result) { | |||
func (s *SpecValidator) Validate(data interface{}) (*Result, *Result) { | |||
var sd *loads.Document | |||
errs = new(Result) | |||
errs, warnings := new(Result), new(Result) | |||
switch v := data.(type) { | |||
case *loads.Document: | |||
if v, ok := data.(*loads.Document); ok { | |||
sd = v | |||
} | |||
if sd == nil { | |||
errs.AddErrors(invalidDocumentMsg()) | |||
return | |||
return errs, warnings // no point in continuing | |||
} | |||
s.spec = sd | |||
s.analyzer = analysis.New(sd.Spec()) | |||
warnings = new(Result) | |||
// Swagger schema validator | |||
schv := NewSchemaValidator(s.schema, nil, "", s.KnownFormats) | |||
schv := NewSchemaValidator(s.schema, nil, "", s.KnownFormats, SwaggerSchema(true)) | |||
var obj interface{} | |||
// Raw spec unmarshalling errors | |||
@@ -109,13 +106,13 @@ func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Resu | |||
errs.Merge(schv.Validate(obj)) // error - | |||
// There may be a point in continuing to try and determine more accurate errors | |||
if !s.Options.ContinueOnErrors && errs.HasErrors() { | |||
return // no point in continuing | |||
return errs, warnings // no point in continuing | |||
} | |||
errs.Merge(s.validateReferencesValid()) // error - | |||
// There may be a point in continuing to try and determine more accurate errors | |||
if !s.Options.ContinueOnErrors && errs.HasErrors() { | |||
return // no point in continuing | |||
return errs, warnings // no point in continuing | |||
} | |||
errs.Merge(s.validateDuplicateOperationIDs()) | |||
@@ -129,7 +126,7 @@ func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Resu | |||
// There may be a point in continuing to try and determine more accurate errors | |||
if !s.Options.ContinueOnErrors && errs.HasErrors() { | |||
return // no point in continuing | |||
return errs, warnings // no point in continuing | |||
} | |||
// Values provided as default MUST validate their schema | |||
@@ -147,7 +144,7 @@ func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Resu | |||
//errs.Merge(s.validateRefNoSibling()) // warning only | |||
errs.Merge(s.validateReferenced()) // warning only | |||
return | |||
return errs, warnings | |||
} | |||
func (s *SpecValidator) validateNonEmptyPathParamNames() *Result { | |||
@@ -172,9 +169,17 @@ func (s *SpecValidator) validateNonEmptyPathParamNames() *Result { | |||
func (s *SpecValidator) validateDuplicateOperationIDs() *Result { | |||
// OperationID, if specified, must be unique across the board | |||
var analyzer *analysis.Spec | |||
if s.expanded != nil { | |||
// $ref are valid: we can analyze operations on an expanded spec | |||
analyzer = analysis.New(s.expanded.Spec()) | |||
} else { | |||
// fallback on possible incomplete picture because of previous errors | |||
analyzer = s.analyzer | |||
} | |||
res := new(Result) | |||
known := make(map[string]int) | |||
for _, v := range s.analyzer.OperationIDs() { | |||
for _, v := range analyzer.OperationIDs() { | |||
if v != "" { | |||
known[v]++ | |||
} | |||
@@ -336,14 +341,14 @@ func (s *SpecValidator) validateItems() *Result { | |||
for path, op := range pi { | |||
for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { | |||
if param.TypeName() == "array" && param.ItemsTypeName() == "" { | |||
if param.TypeName() == arrayType && param.ItemsTypeName() == "" { | |||
res.AddErrors(arrayInParamRequiresItemsMsg(param.Name, op.ID)) | |||
continue | |||
} | |||
if param.In != "body" { | |||
if param.In != swaggerBody { | |||
if param.Items != nil { | |||
items := param.Items | |||
for items.TypeName() == "array" { | |||
for items.TypeName() == arrayType { | |||
if items.ItemsTypeName() == "" { | |||
res.AddErrors(arrayInParamRequiresItemsMsg(param.Name, op.ID)) | |||
break | |||
@@ -374,7 +379,7 @@ func (s *SpecValidator) validateItems() *Result { | |||
for _, resp := range responses { | |||
// Response headers with array | |||
for hn, hv := range resp.Headers { | |||
if hv.TypeName() == "array" && hv.ItemsTypeName() == "" { | |||
if hv.TypeName() == arrayType && hv.ItemsTypeName() == "" { | |||
res.AddErrors(arrayInHeaderRequiresItemsMsg(hn, op.ID)) | |||
} | |||
} | |||
@@ -390,7 +395,7 @@ func (s *SpecValidator) validateItems() *Result { | |||
// Verifies constraints on array type | |||
func (s *SpecValidator) validateSchemaItems(schema spec.Schema, prefix, opID string) *Result { | |||
res := new(Result) | |||
if !schema.Type.Contains("array") { | |||
if !schema.Type.Contains(arrayType) { | |||
return res | |||
} | |||
@@ -451,6 +456,7 @@ func (s *SpecValidator) validateReferenced() *Result { | |||
return &res | |||
} | |||
// nolint: dupl | |||
func (s *SpecValidator) validateReferencedParameters() *Result { | |||
// Each referenceable definition should have references. | |||
params := s.spec.Spec().Parameters | |||
@@ -463,9 +469,7 @@ func (s *SpecValidator) validateReferencedParameters() *Result { | |||
expected["#/parameters/"+jsonpointer.Escape(k)] = struct{}{} | |||
} | |||
for _, k := range s.analyzer.AllParameterReferences() { | |||
if _, ok := expected[k]; ok { | |||
delete(expected, k) | |||
} | |||
delete(expected, k) | |||
} | |||
if len(expected) == 0 { | |||
@@ -478,6 +482,7 @@ func (s *SpecValidator) validateReferencedParameters() *Result { | |||
return result | |||
} | |||
// nolint: dupl | |||
func (s *SpecValidator) validateReferencedResponses() *Result { | |||
// Each referenceable definition should have references. | |||
responses := s.spec.Spec().Responses | |||
@@ -490,9 +495,7 @@ func (s *SpecValidator) validateReferencedResponses() *Result { | |||
expected["#/responses/"+jsonpointer.Escape(k)] = struct{}{} | |||
} | |||
for _, k := range s.analyzer.AllResponseReferences() { | |||
if _, ok := expected[k]; ok { | |||
delete(expected, k) | |||
} | |||
delete(expected, k) | |||
} | |||
if len(expected) == 0 { | |||
@@ -505,6 +508,7 @@ func (s *SpecValidator) validateReferencedResponses() *Result { | |||
return result | |||
} | |||
// nolint: dupl | |||
func (s *SpecValidator) validateReferencedDefinitions() *Result { | |||
// Each referenceable definition must have references. | |||
defs := s.spec.Spec().Definitions | |||
@@ -517,9 +521,7 @@ func (s *SpecValidator) validateReferencedDefinitions() *Result { | |||
expected["#/definitions/"+jsonpointer.Escape(k)] = struct{}{} | |||
} | |||
for _, k := range s.analyzer.AllDefinitionReferences() { | |||
if _, ok := expected[k]; ok { | |||
delete(expected, k) | |||
} | |||
delete(expected, k) | |||
} | |||
if len(expected) == 0 { | |||
@@ -624,98 +626,114 @@ func (s *SpecValidator) validateParameters() *Result { | |||
rexGarbledPathSegment := mustCompileRegexp(`.*[{}\s]+.*`) | |||
for method, pi := range s.analyzer.Operations() { | |||
methodPaths := make(map[string]map[string]string) | |||
if pi != nil { // Safeguard | |||
for path, op := range pi { | |||
pathToAdd := pathHelp.stripParametersInPath(path) | |||
for path, op := range pi { | |||
pathToAdd := pathHelp.stripParametersInPath(path) | |||
// Warn on garbled path afer param stripping | |||
if rexGarbledPathSegment.MatchString(pathToAdd) { | |||
res.AddWarnings(pathStrippedParamGarbledMsg(pathToAdd)) | |||
} | |||
// Warn on garbled path afer param stripping | |||
if rexGarbledPathSegment.MatchString(pathToAdd) { | |||
res.AddWarnings(pathStrippedParamGarbledMsg(pathToAdd)) | |||
} | |||
// Check uniqueness of stripped paths | |||
if _, found := methodPaths[method][pathToAdd]; found { | |||
// Check uniqueness of stripped paths | |||
if _, found := methodPaths[method][pathToAdd]; found { | |||
// Sort names for stable, testable output | |||
if strings.Compare(path, methodPaths[method][pathToAdd]) < 0 { | |||
res.AddErrors(pathOverlapMsg(path, methodPaths[method][pathToAdd])) | |||
} else { | |||
res.AddErrors(pathOverlapMsg(methodPaths[method][pathToAdd], path)) | |||
} | |||
// Sort names for stable, testable output | |||
if strings.Compare(path, methodPaths[method][pathToAdd]) < 0 { | |||
res.AddErrors(pathOverlapMsg(path, methodPaths[method][pathToAdd])) | |||
} else { | |||
if _, found := methodPaths[method]; !found { | |||
methodPaths[method] = map[string]string{} | |||
} | |||
methodPaths[method][pathToAdd] = path //Original non stripped path | |||
res.AddErrors(pathOverlapMsg(methodPaths[method][pathToAdd], path)) | |||
} | |||
} else { | |||
if _, found := methodPaths[method]; !found { | |||
methodPaths[method] = map[string]string{} | |||
} | |||
methodPaths[method][pathToAdd] = path //Original non stripped path | |||
var bodyParams []string | |||
var paramNames []string | |||
var hasForm, hasBody bool | |||
} | |||
// Check parameters names uniqueness for operation | |||
// TODO: should be done after param expansion | |||
res.Merge(s.checkUniqueParams(path, method, op)) | |||
var bodyParams []string | |||
var paramNames []string | |||
var hasForm, hasBody bool | |||
for _, pr := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { | |||
// Validate pattern regexp for parameters with a Pattern property | |||
if _, err := compileRegexp(pr.Pattern); err != nil { | |||
res.AddErrors(invalidPatternInParamMsg(op.ID, pr.Name, pr.Pattern)) | |||
} | |||
// Check parameters names uniqueness for operation | |||
// TODO: should be done after param expansion | |||
res.Merge(s.checkUniqueParams(path, method, op)) | |||
// There must be at most one parameter in body: list them all | |||
if pr.In == "body" { | |||
bodyParams = append(bodyParams, fmt.Sprintf("%q", pr.Name)) | |||
hasBody = true | |||
} | |||
for _, pr := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { | |||
// Validate pattern regexp for parameters with a Pattern property | |||
if _, err := compileRegexp(pr.Pattern); err != nil { | |||
res.AddErrors(invalidPatternInParamMsg(op.ID, pr.Name, pr.Pattern)) | |||
} | |||
if pr.In == "path" { | |||
paramNames = append(paramNames, pr.Name) | |||
// Path declared in path must have the required: true property | |||
if !pr.Required { | |||
res.AddErrors(pathParamRequiredMsg(op.ID, pr.Name)) | |||
} | |||
} | |||
// There must be at most one parameter in body: list them all | |||
if pr.In == swaggerBody { | |||
bodyParams = append(bodyParams, fmt.Sprintf("%q", pr.Name)) | |||
hasBody = true | |||
} | |||
if pr.In == "formData" { | |||
hasForm = true | |||
if pr.In == "path" { | |||
paramNames = append(paramNames, pr.Name) | |||
// Path declared in path must have the required: true property | |||
if !pr.Required { | |||
res.AddErrors(pathParamRequiredMsg(op.ID, pr.Name)) | |||
} | |||
} | |||
// In:formData and In:body are mutually exclusive | |||
if hasBody && hasForm { | |||
res.AddErrors(bothFormDataAndBodyMsg(op.ID)) | |||
if pr.In == "formData" { | |||
hasForm = true | |||
} | |||
// There must be at most one body param | |||
// Accurately report situations when more than 1 body param is declared (possibly unnamed) | |||
if len(bodyParams) > 1 { | |||
sort.Strings(bodyParams) | |||
res.AddErrors(multipleBodyParamMsg(op.ID, bodyParams)) | |||
if !(pr.Type == numberType || pr.Type == integerType) && | |||
(pr.Maximum != nil || pr.Minimum != nil || pr.MultipleOf != nil) { | |||
// A non-numeric parameter has validation keywords for numeric instances (number and integer) | |||
res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type)) | |||
} | |||
// Check uniqueness of parameters in path | |||
paramsInPath := pathHelp.extractPathParams(path) | |||
for i, p := range paramsInPath { | |||
for j, q := range paramsInPath { | |||
if p == q && i > j { | |||
res.AddErrors(pathParamNotUniqueMsg(path, p, q)) | |||
break | |||
} | |||
} | |||
if !(pr.Type == stringType) && | |||
// A non-string parameter has validation keywords for strings | |||
(pr.MaxLength != nil || pr.MinLength != nil || pr.Pattern != "") { | |||
res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type)) | |||
} | |||
if !(pr.Type == arrayType) && | |||
// A non-array parameter has validation keywords for arrays | |||
(pr.MaxItems != nil || pr.MinItems != nil || pr.UniqueItems) { | |||
res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type)) | |||
} | |||
} | |||
// In:formData and In:body are mutually exclusive | |||
if hasBody && hasForm { | |||
res.AddErrors(bothFormDataAndBodyMsg(op.ID)) | |||
} | |||
// There must be at most one body param | |||
// Accurately report situations when more than 1 body param is declared (possibly unnamed) | |||
if len(bodyParams) > 1 { | |||
sort.Strings(bodyParams) | |||
res.AddErrors(multipleBodyParamMsg(op.ID, bodyParams)) | |||
} | |||
// Warns about possible malformed params in path | |||
rexGarbledParam := mustCompileRegexp(`{.*[{}\s]+.*}`) | |||
for _, p := range paramsInPath { | |||
if rexGarbledParam.MatchString(p) { | |||
res.AddWarnings(pathParamGarbledMsg(path, p)) | |||
// Check uniqueness of parameters in path | |||
paramsInPath := pathHelp.extractPathParams(path) | |||
for i, p := range paramsInPath { | |||
for j, q := range paramsInPath { | |||
if p == q && i > j { | |||
res.AddErrors(pathParamNotUniqueMsg(path, p, q)) | |||
break | |||
} | |||
} | |||
} | |||
// Match params from path vs params from params section | |||
res.Merge(s.validatePathParamPresence(path, paramsInPath, paramNames)) | |||
// Warns about possible malformed params in path | |||
rexGarbledParam := mustCompileRegexp(`{.*[{}\s]+.*}`) | |||
for _, p := range paramsInPath { | |||
if rexGarbledParam.MatchString(p) { | |||
res.AddWarnings(pathParamGarbledMsg(path, p)) | |||
} | |||
} | |||
// Match params from path vs params from params section | |||
res.Merge(s.validatePathParamPresence(path, paramsInPath, paramNames)) | |||
} | |||
} | |||
return res |
@@ -163,6 +163,9 @@ const ( | |||
// PathParamGarbledWarning ... | |||
PathParamGarbledWarning = "in path %q, param %q contains {,} or white space. Albeit not stricly illegal, this is probably no what you want" | |||
// ParamValidationTypeMismatch indicates that parameter has validation which does not match its type | |||
ParamValidationTypeMismatch = "validation keywords of parameter %q in path %q don't match its type %s" | |||
// PathStrippedParamGarbledWarning ... | |||
PathStrippedParamGarbledWarning = "path stripped from path parameters %s contains {,} or white space. This is probably no what you want." | |||
@@ -341,6 +344,9 @@ func invalidParameterDefinitionMsg(path, method, operationID string) errors.Erro | |||
func invalidParameterDefinitionAsSchemaMsg(path, method, operationID string) errors.Error { | |||
return errors.New(errors.CompositeErrorCode, InvalidParameterDefinitionAsSchemaError, path, method, operationID) | |||
} | |||
func parameterValidationTypeMismatchMsg(param, path, typ string) errors.Error { | |||
return errors.New(errors.CompositeErrorCode, ParamValidationTypeMismatch, param, path, typ) | |||
} | |||
// disabled | |||
//func invalidResponseDefinitionAsSchemaMsg(path, method string) errors.Error { |
@@ -39,53 +39,53 @@ func (t *typeValidator) schemaInfoForType(data interface{}) (string, string) { | |||
// TODO: this switch really is some sort of reverse lookup for formats. It should be provided by strfmt. | |||
switch data.(type) { | |||
case []byte, strfmt.Base64, *strfmt.Base64: | |||
return "string", "byte" | |||
return stringType, stringFormatByte | |||
case strfmt.CreditCard, *strfmt.CreditCard: | |||
return "string", "creditcard" | |||
return stringType, stringFormatCreditCard | |||
case strfmt.Date, *strfmt.Date: | |||
return "string", "date" | |||
return stringType, stringFormatDate | |||
case strfmt.DateTime, *strfmt.DateTime: | |||
return "string", "date-time" | |||
return stringType, stringFormatDateTime | |||
case strfmt.Duration, *strfmt.Duration: | |||
return "string", "duration" | |||
return stringType, stringFormatDuration | |||
case runtime.File, *runtime.File: | |||
return "file", "" | |||
return fileType, "" | |||
case strfmt.Email, *strfmt.Email: | |||
return "string", "email" | |||
return stringType, stringFormatEmail | |||
case strfmt.HexColor, *strfmt.HexColor: | |||
return "string", "hexcolor" | |||
return stringType, stringFormatHexColor | |||
case strfmt.Hostname, *strfmt.Hostname: | |||
return "string", "hostname" | |||
return stringType, stringFormatHostname | |||
case strfmt.IPv4, *strfmt.IPv4: | |||
return "string", "ipv4" | |||
return stringType, stringFormatIPv4 | |||
case strfmt.IPv6, *strfmt.IPv6: | |||
return "string", "ipv6" | |||
return stringType, stringFormatIPv6 | |||
case strfmt.ISBN, *strfmt.ISBN: | |||
return "string", "isbn" | |||
return stringType, stringFormatISBN | |||
case strfmt.ISBN10, *strfmt.ISBN10: | |||
return "string", "isbn10" | |||
return stringType, stringFormatISBN10 | |||
case strfmt.ISBN13, *strfmt.ISBN13: | |||
return "string", "isbn13" | |||
return stringType, stringFormatISBN13 | |||
case strfmt.MAC, *strfmt.MAC: | |||
return "string", "mac" | |||
return stringType, stringFormatMAC | |||
case strfmt.ObjectId, *strfmt.ObjectId: | |||
return "string", "bsonobjectid" | |||
return stringType, stringFormatBSONObjectID | |||
case strfmt.Password, *strfmt.Password: | |||
return "string", "password" | |||
return stringType, stringFormatPassword | |||
case strfmt.RGBColor, *strfmt.RGBColor: | |||
return "string", "rgbcolor" | |||
return stringType, stringFormatRGBColor | |||
case strfmt.SSN, *strfmt.SSN: | |||
return "string", "ssn" | |||
return stringType, stringFormatSSN | |||
case strfmt.URI, *strfmt.URI: | |||
return "string", "uri" | |||
return stringType, stringFormatURI | |||
case strfmt.UUID, *strfmt.UUID: | |||
return "string", "uuid" | |||
return stringType, stringFormatUUID | |||
case strfmt.UUID3, *strfmt.UUID3: | |||
return "string", "uuid3" | |||
return stringType, stringFormatUUID3 | |||
case strfmt.UUID4, *strfmt.UUID4: | |||
return "string", "uuid4" | |||
return stringType, stringFormatUUID4 | |||
case strfmt.UUID5, *strfmt.UUID5: | |||
return "string", "uuid5" | |||
return stringType, stringFormatUUID5 | |||
// TODO: missing binary (io.ReadCloser) | |||
// TODO: missing json.Number | |||
default: | |||
@@ -93,25 +93,25 @@ func (t *typeValidator) schemaInfoForType(data interface{}) (string, string) { | |||
tpe := val.Type() | |||
switch tpe.Kind() { | |||
case reflect.Bool: | |||
return "boolean", "" | |||
return booleanType, "" | |||
case reflect.String: | |||
return "string", "" | |||
return stringType, "" | |||
case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint8, reflect.Uint16, reflect.Uint32: | |||
// NOTE: that is the spec. With go-openapi, is that not uint32 for unsigned integers? | |||
return "integer", "int32" | |||
return integerType, integerFormatInt32 | |||
case reflect.Int, reflect.Int64, reflect.Uint, reflect.Uint64: | |||
return "integer", "int64" | |||
return integerType, integerFormatInt64 | |||
case reflect.Float32: | |||
// NOTE: is that not "float"? | |||
return "number", "float32" | |||
// NOTE: is that not numberFormatFloat? | |||
return numberType, numberFormatFloat32 | |||
case reflect.Float64: | |||
// NOTE: is that not "double"? | |||
return "number", "float64" | |||
return numberType, numberFormatFloat64 | |||
// NOTE: go arrays (reflect.Array) are not supported (fixed length) | |||
case reflect.Slice: | |||
return "array", "" | |||
return arrayType, "" | |||
case reflect.Map, reflect.Struct: | |||
return "object", "" | |||
return objectType, "" | |||
case reflect.Interface: | |||
// What to do here? | |||
panic("dunno what to do here") | |||
@@ -139,8 +139,8 @@ func (t *typeValidator) Validate(data interface{}) *Result { | |||
result.Inc() | |||
if data == nil || reflect.DeepEqual(reflect.Zero(reflect.TypeOf(data)), reflect.ValueOf(data)) { | |||
// nil or zero value for the passed structure require Type: null | |||
if len(t.Type) > 0 && !t.Type.Contains("null") && !t.Nullable { // TODO: if a property is not required it also passes this | |||
return errorHelp.sErr(errors.InvalidType(t.Path, t.In, strings.Join(t.Type, ","), "null")) | |||
if len(t.Type) > 0 && !t.Type.Contains(nullType) && !t.Nullable { // TODO: if a property is not required it also passes this | |||
return errorHelp.sErr(errors.InvalidType(t.Path, t.In, strings.Join(t.Type, ","), nullType)) | |||
} | |||
return result | |||
} | |||
@@ -157,17 +157,17 @@ func (t *typeValidator) Validate(data interface{}) *Result { | |||
// check numerical types | |||
// TODO: check unsigned ints | |||
// TODO: check json.Number (see schema.go) | |||
isLowerInt := t.Format == "int64" && format == "int32" | |||
isLowerFloat := t.Format == "float64" && format == "float32" | |||
isFloatInt := schType == "number" && swag.IsFloat64AJSONInteger(val.Float()) && t.Type.Contains("integer") | |||
isIntFloat := schType == "integer" && t.Type.Contains("number") | |||
isLowerInt := t.Format == integerFormatInt64 && format == integerFormatInt32 | |||
isLowerFloat := t.Format == numberFormatFloat64 && format == numberFormatFloat32 | |||
isFloatInt := schType == numberType && swag.IsFloat64AJSONInteger(val.Float()) && t.Type.Contains(integerType) | |||
isIntFloat := schType == integerType && t.Type.Contains(numberType) | |||
if kind != reflect.String && kind != reflect.Slice && t.Format != "" && !(t.Type.Contains(schType) || format == t.Format || isFloatInt || isIntFloat || isLowerInt || isLowerFloat) { | |||
// TODO: test case | |||
return errorHelp.sErr(errors.InvalidType(t.Path, t.In, t.Format, format)) | |||
} | |||
if !(t.Type.Contains("number") || t.Type.Contains("integer")) && t.Format != "" && (kind == reflect.String || kind == reflect.Slice) { | |||
if !(t.Type.Contains(numberType) || t.Type.Contains(integerType)) && t.Format != "" && (kind == reflect.String || kind == reflect.Slice) { | |||
return result | |||
} | |||