mirror of
https://github.com/goharbor/harbor.git
synced 2024-11-22 10:15:35 +01:00
feat(swagger): generate apis v2.0 from swagger.yaml
Signed-off-by: He Weiwei <hweiwei@vmware.com>
This commit is contained in:
parent
1ea9e68178
commit
c729e3b9e0
2
.gitignore
vendored
2
.gitignore
vendored
@ -43,3 +43,5 @@ src/portal/src/lib/coverage
|
|||||||
**/.bin
|
**/.bin
|
||||||
src/core/conf/app.conf
|
src/core/conf/app.conf
|
||||||
|
|
||||||
|
src/server/v2.0/models/
|
||||||
|
src/server/v2.0/restapi/
|
28
Makefile
28
Makefile
@ -280,6 +280,30 @@ ifeq ($(CHARTFLAG), true)
|
|||||||
DOCKERSAVE_PARA+= $(DOCKERIMAGENAME_CHART_SERVER):$(CHARTMUSEUMVERSION)-$(VERSIONTAG)
|
DOCKERSAVE_PARA+= $(DOCKERIMAGENAME_CHART_SERVER):$(CHARTMUSEUMVERSION)-$(VERSIONTAG)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
SWAGGER_IMAGENAME=goharbor/swagger
|
||||||
|
SWAGGER_VERSION=v0.21.0
|
||||||
|
SWAGGER=$(DOCKERCMD) run --rm -u $(shell id -u):$(shell id -g) -v $(BUILDPATH):$(BUILDPATH) -w $(BUILDPATH) ${SWAGGER_IMAGENAME}:${SWAGGER_VERSION}
|
||||||
|
SWAGGER_GENERATE_SERVER=${SWAGGER} generate server --template-dir=$(TOOLSPATH)/swagger/templates --exclude-main
|
||||||
|
|
||||||
|
SWAGGER_IMAGENAME:
|
||||||
|
@if [ "$(shell ${DOCKERIMASES} -q ${SWAGGER_IMAGENAME}:$(SWAGGER_VERSION) 2> /dev/null)" == "" ]; then \
|
||||||
|
${DOCKERBUILD} -f ${TOOLSPATH}/swagger/Dockerfile --build-arg SWAGGER_VERSION=${SWAGGER_VERSION} -t ${SWAGGER_IMAGENAME}:$(SWAGGER_VERSION) . ; \
|
||||||
|
echo "build swagger image done"; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# $1 the path of swagger spec
|
||||||
|
# $2 the path of base directory for generating the files
|
||||||
|
# $3 the name of the application
|
||||||
|
define swagger_generate_server
|
||||||
|
@echo "generate all the files for API from $(1)"
|
||||||
|
@rm -rf $(2)/{models,restapi}
|
||||||
|
@mkdir -p $(2)
|
||||||
|
@$(SWAGGER_GENERATE_SERVER) -f $(1) -A $(3) --target $(2)
|
||||||
|
endef
|
||||||
|
|
||||||
|
gen_apis: SWAGGER_IMAGENAME
|
||||||
|
$(call swagger_generate_server,api/v2.0/swagger.yaml,src/server/v2.0,harbor)
|
||||||
|
|
||||||
export VERSIONS_FOR_PREPARE
|
export VERSIONS_FOR_PREPARE
|
||||||
versions_prepare:
|
versions_prepare:
|
||||||
@echo "$$VERSIONS_FOR_PREPARE" > $(MAKE_PREPARE_PATH)/$(PREPARE_VERSION_NAME)
|
@echo "$$VERSIONS_FOR_PREPARE" > $(MAKE_PREPARE_PATH)/$(PREPARE_VERSION_NAME)
|
||||||
@ -287,7 +311,7 @@ versions_prepare:
|
|||||||
check_environment:
|
check_environment:
|
||||||
@$(MAKEPATH)/$(CHECKENVCMD)
|
@$(MAKEPATH)/$(CHECKENVCMD)
|
||||||
|
|
||||||
compile_core:
|
compile_core: gen_apis
|
||||||
@echo "compiling binary for core (golang image)..."
|
@echo "compiling binary for core (golang image)..."
|
||||||
@echo $(GOBUILDPATHINCONTAINER)
|
@echo $(GOBUILDPATHINCONTAINER)
|
||||||
@$(DOCKERCMD) run --rm -v $(BUILDPATH):$(GOBUILDPATHINCONTAINER) -w $(GOBUILDPATH_CORE) $(GOBUILDIMAGE) $(GOIMAGEBUILD_CORE) -o $(GOBUILDPATHINCONTAINER)/$(GOBUILDMAKEPATH_CORE)/$(CORE_BINARYNAME)
|
@$(DOCKERCMD) run --rm -v $(BUILDPATH):$(GOBUILDPATHINCONTAINER) -w $(GOBUILDPATH_CORE) $(GOBUILDIMAGE) $(GOIMAGEBUILD_CORE) -o $(GOBUILDPATHINCONTAINER)/$(GOBUILDMAKEPATH_CORE)/$(CORE_BINARYNAME)
|
||||||
@ -368,7 +392,7 @@ gosec:
|
|||||||
$(GOPATH)/bin/gosec -fmt=json -out=harbor_gas_output.json -quiet ./... | true ; \
|
$(GOPATH)/bin/gosec -fmt=json -out=harbor_gas_output.json -quiet ./... | true ; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
go_check: misspell golint govet gofmt commentfmt
|
go_check: gen_apis misspell golint govet gofmt commentfmt
|
||||||
|
|
||||||
gofmt:
|
gofmt:
|
||||||
@echo checking gofmt...
|
@echo checking gofmt...
|
||||||
|
243
api/v2.0/swagger.yaml
Normal file
243
api/v2.0/swagger.yaml
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
swagger: '2.0'
|
||||||
|
info:
|
||||||
|
title: Harbor API
|
||||||
|
description: These APIs provide services for manipulating Harbor project.
|
||||||
|
version: '2.0'
|
||||||
|
host: localhost
|
||||||
|
schemes:
|
||||||
|
- http
|
||||||
|
- https
|
||||||
|
basePath: /api/v2.0
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
consumes:
|
||||||
|
- application/json
|
||||||
|
securityDefinitions:
|
||||||
|
basicAuth:
|
||||||
|
type: basic
|
||||||
|
security:
|
||||||
|
- basicAuth: []
|
||||||
|
paths:
|
||||||
|
/projects/{project_id}/repositories/{repository_id}/artifacts/{artifact_id}:
|
||||||
|
get:
|
||||||
|
summary: Read artifact by id
|
||||||
|
description: endpoint returns artifact by id
|
||||||
|
tags:
|
||||||
|
- artifact
|
||||||
|
operationId: readArtifact
|
||||||
|
parameters:
|
||||||
|
- $ref: '#/parameters/requestId'
|
||||||
|
- $ref: '#/parameters/projectId'
|
||||||
|
- $ref: '#/parameters/repositoryId'
|
||||||
|
- $ref: '#/parameters/artifactId'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: OK
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/Artifact'
|
||||||
|
'401':
|
||||||
|
$ref: '#/responses/401'
|
||||||
|
'403':
|
||||||
|
$ref: '#/responses/403'
|
||||||
|
'500':
|
||||||
|
$ref: '#/responses/500'
|
||||||
|
delete:
|
||||||
|
summary: Delete artifact by id
|
||||||
|
description: endpoint to delete the artifact by id
|
||||||
|
tags:
|
||||||
|
- artifact
|
||||||
|
operationId: deleteArtifact
|
||||||
|
parameters:
|
||||||
|
- $ref: '#/parameters/requestId'
|
||||||
|
- $ref: '#/parameters/projectId'
|
||||||
|
- $ref: '#/parameters/repositoryId'
|
||||||
|
- $ref: '#/parameters/artifactId'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Artifact is deleted successfully.
|
||||||
|
'401':
|
||||||
|
$ref: '#/responses/401'
|
||||||
|
'403':
|
||||||
|
$ref: '#/responses/403'
|
||||||
|
'500':
|
||||||
|
$ref: '#/responses/500'
|
||||||
|
/projects/{project_id}/repositories/{repository_id}/artifacts:
|
||||||
|
get:
|
||||||
|
summary: List artifacts of the repository
|
||||||
|
description: endpoint returns all artifacts of the repository.
|
||||||
|
tags:
|
||||||
|
- artifact
|
||||||
|
operationId: listArtifacts
|
||||||
|
parameters:
|
||||||
|
- $ref: '#/parameters/requestId'
|
||||||
|
- $ref: '#/parameters/projectId'
|
||||||
|
- $ref: '#/parameters/repositoryId'
|
||||||
|
- $ref: '#/parameters/page'
|
||||||
|
- $ref: '#/parameters/pageSize'
|
||||||
|
- name: label
|
||||||
|
in: query
|
||||||
|
description: Response for artifact include label info when it's true
|
||||||
|
type: boolean
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
- name: signature
|
||||||
|
in: query
|
||||||
|
description: Response for artifact include signature info when it's true
|
||||||
|
type: boolean
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
- name: vulnerability
|
||||||
|
in: query
|
||||||
|
description: Response for artifact include vulnerability info when it's true
|
||||||
|
type: boolean
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: OK
|
||||||
|
headers:
|
||||||
|
X-Total-Count:
|
||||||
|
description: The total count of artifacts
|
||||||
|
type: integer
|
||||||
|
Link:
|
||||||
|
description: Link refers to the previous page and next page
|
||||||
|
type: string
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/definitions/Artifact'
|
||||||
|
'401':
|
||||||
|
$ref: '#/responses/401'
|
||||||
|
'403':
|
||||||
|
$ref: '#/responses/403'
|
||||||
|
'500':
|
||||||
|
$ref: '#/responses/500'
|
||||||
|
parameters:
|
||||||
|
requestId:
|
||||||
|
name: X-Request-Id
|
||||||
|
description: A unique id for the request
|
||||||
|
in: header
|
||||||
|
type: string
|
||||||
|
required: false
|
||||||
|
minLength: 1
|
||||||
|
projectId:
|
||||||
|
name: project_id
|
||||||
|
in: path
|
||||||
|
description: The id of the project
|
||||||
|
required: true
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
repositoryId:
|
||||||
|
name: repository_id
|
||||||
|
in: path
|
||||||
|
description: The id of the repository
|
||||||
|
required: true
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
artifactId:
|
||||||
|
name: artifact_id
|
||||||
|
in: path
|
||||||
|
description: The id of the artifact
|
||||||
|
required: true
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
page:
|
||||||
|
name: page
|
||||||
|
in: query
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
required: false
|
||||||
|
description: 'The page number, default is 1.'
|
||||||
|
default: 1
|
||||||
|
pageSize:
|
||||||
|
name: page_size
|
||||||
|
in: query
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
required: false
|
||||||
|
description: 'The size of per page, default is 10, maximum is 100.'
|
||||||
|
default: 10
|
||||||
|
responses:
|
||||||
|
'401':
|
||||||
|
description: UnauthorizedError
|
||||||
|
headers:
|
||||||
|
X-Request-Id:
|
||||||
|
description: The request id this is a response to
|
||||||
|
type: string
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/Error'
|
||||||
|
'403':
|
||||||
|
description: ForbiddenError
|
||||||
|
headers:
|
||||||
|
X-Request-Id:
|
||||||
|
description: The request id this is a response to
|
||||||
|
type: string
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/Error'
|
||||||
|
'500':
|
||||||
|
description: InternalServerError
|
||||||
|
headers:
|
||||||
|
X-Request-Id:
|
||||||
|
description: The request id this is a response to
|
||||||
|
type: string
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/Error'
|
||||||
|
definitions:
|
||||||
|
Error:
|
||||||
|
description: a model for all the error response coming from harbor
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
code:
|
||||||
|
type: string
|
||||||
|
description: The error code
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
|
description: The error message
|
||||||
|
x-go-type:
|
||||||
|
import:
|
||||||
|
package: "github.com/goharbor/harbor/src/internal/error"
|
||||||
|
alias: "ierrors"
|
||||||
|
type: "Error"
|
||||||
|
Artifact:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
description: The id of the artifact
|
||||||
|
type:
|
||||||
|
type: string
|
||||||
|
description: The type of the artifact, eg image, chart, etc
|
||||||
|
repository:
|
||||||
|
$ref: '#/definitions/Repository'
|
||||||
|
description: The repository of the artifact
|
||||||
|
tags:
|
||||||
|
description: The list of tags that attached to the artifact
|
||||||
|
media_type:
|
||||||
|
type: string
|
||||||
|
description: The specific media type for the artifact
|
||||||
|
digest:
|
||||||
|
type: string
|
||||||
|
description: The digest of the artifact
|
||||||
|
size:
|
||||||
|
type: string
|
||||||
|
format: int64
|
||||||
|
description: The size of the artifact
|
||||||
|
upload_time:
|
||||||
|
type: string
|
||||||
|
format: date-time
|
||||||
|
description: The upload time for the artifact
|
||||||
|
labels:
|
||||||
|
description: The list of labels that attached to the artifact
|
||||||
|
signature:
|
||||||
|
description: The signature attached to the artifact
|
||||||
|
Repository:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
description: The id of the repository
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
description: The name of repository.
|
@ -15,6 +15,8 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/url"
|
||||||
|
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
"github.com/goharbor/harbor/src/common"
|
"github.com/goharbor/harbor/src/common"
|
||||||
"github.com/goharbor/harbor/src/core/api"
|
"github.com/goharbor/harbor/src/core/api"
|
||||||
@ -26,7 +28,7 @@ import (
|
|||||||
"github.com/goharbor/harbor/src/core/service/notifications/scheduler"
|
"github.com/goharbor/harbor/src/core/service/notifications/scheduler"
|
||||||
"github.com/goharbor/harbor/src/core/service/token"
|
"github.com/goharbor/harbor/src/core/service/token"
|
||||||
reg "github.com/goharbor/harbor/src/server/registry"
|
reg "github.com/goharbor/harbor/src/server/registry"
|
||||||
"net/url"
|
"github.com/goharbor/harbor/src/server/v2.0/handler"
|
||||||
)
|
)
|
||||||
|
|
||||||
func initRouters() {
|
func initRouters() {
|
||||||
@ -218,6 +220,9 @@ func initRouters() {
|
|||||||
beego.Router("/api/scans/all/metrics", scanAllAPI, "get:GetScanAllMetrics")
|
beego.Router("/api/scans/all/metrics", scanAllAPI, "get:GetScanAllMetrics")
|
||||||
beego.Router("/api/scans/schedule/metrics", scanAllAPI, "get:GetScheduleMetrics")
|
beego.Router("/api/scans/schedule/metrics", scanAllAPI, "get:GetScheduleMetrics")
|
||||||
|
|
||||||
|
// Add handler for api v2.0
|
||||||
|
beego.Handler("/api/v2.0/*", handler.New())
|
||||||
|
|
||||||
// Error pages
|
// Error pages
|
||||||
beego.ErrorController(&controllers.ErrorController{})
|
beego.ErrorController(&controllers.ErrorController{})
|
||||||
|
|
||||||
|
12
src/go.mod
12
src/go.mod
@ -32,10 +32,16 @@ require (
|
|||||||
github.com/docker/go v0.0.0-20160303222718-d30aec9fd63c // indirect
|
github.com/docker/go v0.0.0-20160303222718-d30aec9fd63c // indirect
|
||||||
github.com/docker/go-connections v0.4.0 // indirect
|
github.com/docker/go-connections v0.4.0 // indirect
|
||||||
github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82 // indirect
|
github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82 // indirect
|
||||||
github.com/docker/go-units v0.4.0 // indirect
|
|
||||||
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7
|
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7
|
||||||
github.com/garyburd/redigo v1.6.0
|
github.com/garyburd/redigo v1.6.0
|
||||||
github.com/ghodss/yaml v1.0.0
|
github.com/ghodss/yaml v1.0.0
|
||||||
|
github.com/go-openapi/errors v0.19.2
|
||||||
|
github.com/go-openapi/loads v0.19.3
|
||||||
|
github.com/go-openapi/runtime v0.19.5
|
||||||
|
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/go-sql-driver/mysql v1.4.1
|
github.com/go-sql-driver/mysql v1.4.1
|
||||||
github.com/gobwas/glob v0.2.3 // indirect
|
github.com/gobwas/glob v0.2.3 // indirect
|
||||||
github.com/gocraft/work v0.5.1
|
github.com/gocraft/work v0.5.1
|
||||||
@ -67,9 +73,9 @@ require (
|
|||||||
github.com/robfig/cron v1.0.0
|
github.com/robfig/cron v1.0.0
|
||||||
github.com/sirupsen/logrus v1.4.1 // indirect
|
github.com/sirupsen/logrus v1.4.1 // indirect
|
||||||
github.com/spf13/viper v1.4.0 // indirect
|
github.com/spf13/viper v1.4.0 // indirect
|
||||||
github.com/stretchr/testify v1.3.0
|
github.com/stretchr/testify v1.4.0
|
||||||
github.com/theupdateframework/notary v0.6.1
|
github.com/theupdateframework/notary v0.6.1
|
||||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c
|
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421
|
||||||
gopkg.in/asn1-ber.v1 v1.0.0-20150924051756-4e86f4367175 // indirect
|
gopkg.in/asn1-ber.v1 v1.0.0-20150924051756-4e86f4367175 // indirect
|
||||||
gopkg.in/dancannon/gorethink.v3 v3.0.5 // indirect
|
gopkg.in/dancannon/gorethink.v3 v3.0.5 // indirect
|
||||||
|
103
src/go.sum
103
src/go.sum
@ -11,6 +11,11 @@ github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF0
|
|||||||
github.com/Microsoft/go-winio v0.4.12 h1:xAfWHN1IrQ0NJ9TBC0KBZoqLjzDTr1ML+4MywiUOryc=
|
github.com/Microsoft/go-winio v0.4.12 h1:xAfWHN1IrQ0NJ9TBC0KBZoqLjzDTr1ML+4MywiUOryc=
|
||||||
github.com/Microsoft/go-winio v0.4.12/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
|
github.com/Microsoft/go-winio v0.4.12/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||||
|
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=
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs=
|
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs=
|
||||||
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
|
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
|
||||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||||
@ -26,6 +31,9 @@ github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190726115642-cd293c93fd97/go.mod
|
|||||||
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
||||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
|
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/astaxie/beego v1.9.0 h1:tPzS+D1oCLi+SEb/TLNRNYpCjaMVfAGoy9OTLwS5ul4=
|
github.com/astaxie/beego v1.9.0 h1:tPzS+D1oCLi+SEb/TLNRNYpCjaMVfAGoy9OTLwS5ul4=
|
||||||
github.com/astaxie/beego v1.9.0/go.mod h1:0R4++1tUqERR0WYFWdfkcrsyoVBCG4DgpDGokT3yb+U=
|
github.com/astaxie/beego v1.9.0/go.mod h1:0R4++1tUqERR0WYFWdfkcrsyoVBCG4DgpDGokT3yb+U=
|
||||||
github.com/aws/aws-sdk-go v1.19.47 h1:ZEze0mpk8Fttrsz6UNLqhH/jRGYbMPfWFA2ILas4AmM=
|
github.com/aws/aws-sdk-go v1.19.47 h1:ZEze0mpk8Fttrsz6UNLqhH/jRGYbMPfWFA2ILas4AmM=
|
||||||
@ -83,6 +91,7 @@ github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKoh
|
|||||||
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
||||||
github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82 h1:X0fj836zx99zFu83v/M79DuBn84IL/Syx1SY6Y5ZEMA=
|
github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82 h1:X0fj836zx99zFu83v/M79DuBn84IL/Syx1SY6Y5ZEMA=
|
||||||
github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
|
github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
|
||||||
|
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
|
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
|
||||||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4=
|
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4=
|
||||||
@ -98,11 +107,65 @@ github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc
|
|||||||
github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
|
github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
|
||||||
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
|
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
||||||
|
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
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.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
|
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
|
||||||
|
github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
|
||||||
|
github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
|
||||||
|
github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
|
||||||
|
github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
|
||||||
|
github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI=
|
||||||
|
github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
|
||||||
|
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/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/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/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/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/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/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/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/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-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
||||||
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||||
|
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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
|
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/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
||||||
@ -111,6 +174,7 @@ github.com/gocraft/work v0.5.1/go.mod h1:pc3n9Pb5FAESPPGfM0nL+7Q1xtgtRnF8rr/azzh
|
|||||||
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
|
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
|
||||||
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
|
github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI=
|
||||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
|
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||||
@ -134,12 +198,15 @@ github.com/google/certificate-transparency-go v1.0.21 h1:Yf1aXowfZ2nuboBsg7iYGLm
|
|||||||
github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg=
|
github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg=
|
||||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 h1:zLTLjkaOFEFIOxY5BWLFLwh+cL8vOBW4XJ2aqLE/Tf0=
|
github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 h1:zLTLjkaOFEFIOxY5BWLFLwh+cL8vOBW4XJ2aqLE/Tf0=
|
||||||
github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||||
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck=
|
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck=
|
||||||
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
|
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
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-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
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 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
@ -192,12 +259,18 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB
|
|||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
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.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
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 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/lib/pq v1.1.0 h1:/5u4a+KGJptBRqGzPvYQL9p0d/tPR4S31+Tnzj9lEO4=
|
github.com/lib/pq v1.1.0 h1:/5u4a+KGJptBRqGzPvYQL9p0d/tPR4S31+Tnzj9lEO4=
|
||||||
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
|
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
|
||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
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/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
|
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
|
||||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
|
github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
|
||||||
@ -227,6 +300,7 @@ github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zM
|
|||||||
github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU=
|
github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU=
|
||||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
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/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
||||||
|
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
||||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
@ -284,24 +358,37 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y
|
|||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
|
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
|
||||||
|
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
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.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/theupdateframework/notary v0.6.1 h1:7wshjstgS9x9F5LuB1L5mBI2xNMObWqjz+cjWoom6l0=
|
github.com/theupdateframework/notary v0.6.1 h1:7wshjstgS9x9F5LuB1L5mBI2xNMObWqjz+cjWoom6l0=
|
||||||
github.com/theupdateframework/notary v0.6.1/go.mod h1:MOfgIfmox8s7/7fduvB2xyPPMJCrjRLRizA8OFwpnKY=
|
github.com/theupdateframework/notary v0.6.1/go.mod h1:MOfgIfmox8s7/7fduvB2xyPPMJCrjRLRizA8OFwpnKY=
|
||||||
|
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
|
||||||
|
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
|
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.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
go.uber.org/zap v1.10.0/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-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-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 h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI=
|
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI=
|
||||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56 h1:ZpKuNIejY8P0ExLOVyKhb0WsgG8UdvHXe6TWjY7eL6k=
|
||||||
|
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
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-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
@ -310,14 +397,20 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
|
|||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
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-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-20181114220301-adae6a3d119a/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-20181220203305-927f97764cc3/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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/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-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-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco=
|
golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco=
|
||||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
|
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/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@ -325,6 +418,7 @@ 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-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-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-20190227155943-e225da77a7e6/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-20180830151530-49385e6e1522/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 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@ -334,19 +428,28 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f h1:25KHgbfyiSm6vwQLbM3zZIe1v9p/3ea4Rz+nnM5K/i4=
|
||||||
|
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.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-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-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-20190114222345-bf090417da8b/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-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-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/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-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
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=
|
||||||
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
||||||
|
40
src/server/middleware/request_id.go
Normal file
40
src/server/middleware/request_id.go
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// Copyright Project Harbor Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package middleware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HeaderXRequestID X-Request-ID header
|
||||||
|
const HeaderXRequestID = "X-Request-ID"
|
||||||
|
|
||||||
|
// RequestID middleware which add X-Request-ID header in the http request when not exist
|
||||||
|
func RequestID() func(http.Handler) http.Handler {
|
||||||
|
return func(next http.Handler) http.Handler {
|
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
rid := r.Header.Get(HeaderXRequestID)
|
||||||
|
if rid == "" {
|
||||||
|
rid = uuid.New().String()
|
||||||
|
r.Header.Set(HeaderXRequestID, rid)
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Header().Set(HeaderXRequestID, rid)
|
||||||
|
next.ServeHTTP(w, r)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
47
src/server/middleware/request_id_test.go
Normal file
47
src/server/middleware/request_id_test.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// Copyright Project Harbor Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package middleware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRequestID(t *testing.T) {
|
||||||
|
assert := assert.New(t)
|
||||||
|
|
||||||
|
next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.WriteHeader(200)
|
||||||
|
})
|
||||||
|
|
||||||
|
req1 := httptest.NewRequest(http.MethodGet, "/req1", nil)
|
||||||
|
rr1 := httptest.NewRecorder()
|
||||||
|
next.ServeHTTP(rr1, req1)
|
||||||
|
assert.Equal(rr1.Header().Get(HeaderXRequestID), "")
|
||||||
|
|
||||||
|
req2 := httptest.NewRequest(http.MethodGet, "/req2", nil)
|
||||||
|
rr2 := httptest.NewRecorder()
|
||||||
|
RequestID()(next).ServeHTTP(rr2, req2)
|
||||||
|
assert.NotEqual(rr2.Header().Get(HeaderXRequestID), "")
|
||||||
|
|
||||||
|
req3 := httptest.NewRequest(http.MethodGet, "/req2", nil)
|
||||||
|
req3.Header.Add(HeaderXRequestID, "852803be-e5fe-499b-bbea-c9e5b5f43916")
|
||||||
|
rr3 := httptest.NewRecorder()
|
||||||
|
RequestID()(next).ServeHTTP(rr3, req3)
|
||||||
|
assert.Equal(rr3.Header().Get(HeaderXRequestID), "852803be-e5fe-499b-bbea-c9e5b5f43916")
|
||||||
|
}
|
47
src/server/v2.0/handler/artifact.go
Normal file
47
src/server/v2.0/handler/artifact.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// Copyright Project Harbor Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/go-openapi/runtime/middleware"
|
||||||
|
operation "github.com/goharbor/harbor/src/server/v2.0/restapi/operations/artifact"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ArtifactAPI the api implemention of artifacts
|
||||||
|
type ArtifactAPI struct {
|
||||||
|
BaseAPI
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteArtifact ...
|
||||||
|
func (api *ArtifactAPI) DeleteArtifact(ctx context.Context, params operation.DeleteArtifactParams) middleware.Responder {
|
||||||
|
return operation.NewDeleteArtifactOK()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListArtifacts ...
|
||||||
|
func (api *ArtifactAPI) ListArtifacts(ctx context.Context, params operation.ListArtifactsParams) middleware.Responder {
|
||||||
|
return operation.NewListArtifactsOK()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadArtifact ...
|
||||||
|
func (api *ArtifactAPI) ReadArtifact(ctx context.Context, params operation.ReadArtifactParams) middleware.Responder {
|
||||||
|
return operation.NewReadArtifactOK()
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewArtifactAPI returns API of artifacts
|
||||||
|
func NewArtifactAPI() *ArtifactAPI {
|
||||||
|
return &ArtifactAPI{}
|
||||||
|
}
|
35
src/server/v2.0/handler/base.go
Normal file
35
src/server/v2.0/handler/base.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// Copyright Project Harbor Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/go-openapi/runtime/middleware"
|
||||||
|
)
|
||||||
|
|
||||||
|
// BaseAPI base API handler
|
||||||
|
type BaseAPI struct{}
|
||||||
|
|
||||||
|
// Prepare default prepare for operation
|
||||||
|
func (*BaseAPI) Prepare(ctx context.Context, operation string, params interface{}) middleware.Responder {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendError returns response for the err
|
||||||
|
func (*BaseAPI) SendError(ctx context.Context, err error) middleware.Responder {
|
||||||
|
// TODO: implement send error
|
||||||
|
return nil
|
||||||
|
}
|
71
src/server/v2.0/handler/handler.go
Normal file
71
src/server/v2.0/handler/handler.go
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
// Copyright Project Harbor Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-openapi/errors"
|
||||||
|
ierrors "github.com/goharbor/harbor/src/internal/error"
|
||||||
|
"github.com/goharbor/harbor/src/server/v2.0/restapi"
|
||||||
|
)
|
||||||
|
|
||||||
|
// New returns http handler for API V2.0
|
||||||
|
func New() http.Handler {
|
||||||
|
h, api, err := restapi.HandlerAPI(restapi.Config{
|
||||||
|
ArtifactAPI: NewArtifactAPI(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
api.ServeError = serveError
|
||||||
|
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
type apiError struct {
|
||||||
|
Code int32 `json:"code"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Before executing operation handler, go-swagger will bind a parameters object to a request and validate the request,
|
||||||
|
// it will return directly when bind and validate failed.
|
||||||
|
// The response format of the default ServeError implementation does not match the internal error response format.
|
||||||
|
// So we needed to convert the format to the internal error response format.
|
||||||
|
func serveError(rw http.ResponseWriter, r *http.Request, err error) {
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
errors.ServeError(w, r, err)
|
||||||
|
|
||||||
|
rw.WriteHeader(w.Code)
|
||||||
|
for key, values := range w.Header() {
|
||||||
|
for _, value := range values {
|
||||||
|
rw.Header().Add(key, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var er apiError
|
||||||
|
json.Unmarshal(w.Body.Bytes(), &er)
|
||||||
|
|
||||||
|
code := strings.Replace(strings.ToUpper(http.StatusText(w.Code)), " ", "_", -1)
|
||||||
|
|
||||||
|
e := ierrors.New(fmt.Errorf(er.Message)).WithCode(code)
|
||||||
|
rw.Write([]byte(e.Error()))
|
||||||
|
}
|
5
src/vendor/github.com/PuerkitoBio/purell/.gitignore
generated
vendored
Normal file
5
src/vendor/github.com/PuerkitoBio/purell/.gitignore
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
*.sublime-*
|
||||||
|
.DS_Store
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
tags
|
12
src/vendor/github.com/PuerkitoBio/purell/.travis.yml
generated
vendored
Normal file
12
src/vendor/github.com/PuerkitoBio/purell/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.4.x
|
||||||
|
- 1.5.x
|
||||||
|
- 1.6.x
|
||||||
|
- 1.7.x
|
||||||
|
- 1.8.x
|
||||||
|
- 1.9.x
|
||||||
|
- "1.10.x"
|
||||||
|
- "1.11.x"
|
||||||
|
- tip
|
12
src/vendor/github.com/PuerkitoBio/purell/LICENSE
generated
vendored
Normal file
12
src/vendor/github.com/PuerkitoBio/purell/LICENSE
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
Copyright (c) 2012, Martin Angers
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
188
src/vendor/github.com/PuerkitoBio/purell/README.md
generated
vendored
Normal file
188
src/vendor/github.com/PuerkitoBio/purell/README.md
generated
vendored
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
# Purell
|
||||||
|
|
||||||
|
Purell is a tiny Go library to normalize URLs. It returns a pure URL. Pure-ell. Sanitizer and all. Yeah, I know...
|
||||||
|
|
||||||
|
Based on the [wikipedia paper][wiki] and the [RFC 3986 document][rfc].
|
||||||
|
|
||||||
|
[![build status](https://travis-ci.org/PuerkitoBio/purell.svg?branch=master)](http://travis-ci.org/PuerkitoBio/purell)
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
`go get github.com/PuerkitoBio/purell`
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
* **v1.1.1** : Fix failing test due to Go1.12 changes (thanks to @ianlancetaylor).
|
||||||
|
* **2016-11-14 (v1.1.0)** : IDN: Conform to RFC 5895: Fold character width (thanks to @beeker1121).
|
||||||
|
* **2016-07-27 (v1.0.0)** : Normalize IDN to ASCII (thanks to @zenovich).
|
||||||
|
* **2015-02-08** : Add fix for relative paths issue ([PR #5][pr5]) and add fix for unnecessary encoding of reserved characters ([see issue #7][iss7]).
|
||||||
|
* **v0.2.0** : Add benchmarks, Attempt IDN support.
|
||||||
|
* **v0.1.0** : Initial release.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
From `example_test.go` (note that in your code, you would import "github.com/PuerkitoBio/purell", and would prefix references to its methods and constants with "purell."):
|
||||||
|
|
||||||
|
```go
|
||||||
|
package purell
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ExampleNormalizeURLString() {
|
||||||
|
if normalized, err := NormalizeURLString("hTTp://someWEBsite.com:80/Amazing%3f/url/",
|
||||||
|
FlagLowercaseScheme|FlagLowercaseHost|FlagUppercaseEscapes); err != nil {
|
||||||
|
panic(err)
|
||||||
|
} else {
|
||||||
|
fmt.Print(normalized)
|
||||||
|
}
|
||||||
|
// Output: http://somewebsite.com:80/Amazing%3F/url/
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleMustNormalizeURLString() {
|
||||||
|
normalized := MustNormalizeURLString("hTTpS://someWEBsite.com:443/Amazing%fa/url/",
|
||||||
|
FlagsUnsafeGreedy)
|
||||||
|
fmt.Print(normalized)
|
||||||
|
|
||||||
|
// Output: http://somewebsite.com/Amazing%FA/url
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleNormalizeURL() {
|
||||||
|
if u, err := url.Parse("Http://SomeUrl.com:8080/a/b/.././c///g?c=3&a=1&b=9&c=0#target"); err != nil {
|
||||||
|
panic(err)
|
||||||
|
} else {
|
||||||
|
normalized := NormalizeURL(u, FlagsUsuallySafeGreedy|FlagRemoveDuplicateSlashes|FlagRemoveFragment)
|
||||||
|
fmt.Print(normalized)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output: http://someurl.com:8080/a/c/g?c=3&a=1&b=9&c=0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
As seen in the examples above, purell offers three methods, `NormalizeURLString(string, NormalizationFlags) (string, error)`, `MustNormalizeURLString(string, NormalizationFlags) (string)` and `NormalizeURL(*url.URL, NormalizationFlags) (string)`. They all normalize the provided URL based on the specified flags. Here are the available flags:
|
||||||
|
|
||||||
|
```go
|
||||||
|
const (
|
||||||
|
// Safe normalizations
|
||||||
|
FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1
|
||||||
|
FlagLowercaseHost // http://HOST -> http://host
|
||||||
|
FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF
|
||||||
|
FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA
|
||||||
|
FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$
|
||||||
|
FlagRemoveDefaultPort // http://host:80 -> http://host
|
||||||
|
FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path
|
||||||
|
|
||||||
|
// Usually safe normalizations
|
||||||
|
FlagRemoveTrailingSlash // http://host/path/ -> http://host/path
|
||||||
|
FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags)
|
||||||
|
FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c
|
||||||
|
|
||||||
|
// Unsafe normalizations
|
||||||
|
FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/
|
||||||
|
FlagRemoveFragment // http://host/path#fragment -> http://host/path
|
||||||
|
FlagForceHTTP // https://host -> http://host
|
||||||
|
FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b
|
||||||
|
FlagRemoveWWW // http://www.host/ -> http://host/
|
||||||
|
FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags)
|
||||||
|
FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3
|
||||||
|
|
||||||
|
// Normalizations not in the wikipedia article, required to cover tests cases
|
||||||
|
// submitted by jehiah
|
||||||
|
FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147
|
||||||
|
FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147
|
||||||
|
FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147
|
||||||
|
FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path
|
||||||
|
FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path
|
||||||
|
|
||||||
|
// Convenience set of safe normalizations
|
||||||
|
FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator
|
||||||
|
|
||||||
|
// For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags,
|
||||||
|
// while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix".
|
||||||
|
|
||||||
|
// Convenience set of usually safe normalizations (includes FlagsSafe)
|
||||||
|
FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments
|
||||||
|
FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments
|
||||||
|
|
||||||
|
// Convenience set of unsafe normalizations (includes FlagsUsuallySafe)
|
||||||
|
FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery
|
||||||
|
FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery
|
||||||
|
|
||||||
|
// Convenience set of all available flags
|
||||||
|
FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
||||||
|
FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
For convenience, the set of flags `FlagsSafe`, `FlagsUsuallySafe[Greedy|NonGreedy]`, `FlagsUnsafe[Greedy|NonGreedy]` and `FlagsAll[Greedy|NonGreedy]` are provided for the similarly grouped normalizations on [wikipedia's URL normalization page][wiki]. You can add (using the bitwise OR `|` operator) or remove (using the bitwise AND NOT `&^` operator) individual flags from the sets if required, to build your own custom set.
|
||||||
|
|
||||||
|
The [full godoc reference is available on gopkgdoc][godoc].
|
||||||
|
|
||||||
|
Some things to note:
|
||||||
|
|
||||||
|
* `FlagDecodeUnnecessaryEscapes`, `FlagEncodeNecessaryEscapes`, `FlagUppercaseEscapes` and `FlagRemoveEmptyQuerySeparator` are always implicitly set, because internally, the URL string is parsed as an URL object, which automatically decodes unnecessary escapes, uppercases and encodes necessary ones, and removes empty query separators (an unnecessary `?` at the end of the url). So this operation cannot **not** be done. For this reason, `FlagRemoveEmptyQuerySeparator` (as well as the other three) has been included in the `FlagsSafe` convenience set, instead of `FlagsUnsafe`, where Wikipedia puts it.
|
||||||
|
|
||||||
|
* The `FlagDecodeUnnecessaryEscapes` decodes the following escapes (*from -> to*):
|
||||||
|
- %24 -> $
|
||||||
|
- %26 -> &
|
||||||
|
- %2B-%3B -> +,-./0123456789:;
|
||||||
|
- %3D -> =
|
||||||
|
- %40-%5A -> @ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||||
|
- %5F -> _
|
||||||
|
- %61-%7A -> abcdefghijklmnopqrstuvwxyz
|
||||||
|
- %7E -> ~
|
||||||
|
|
||||||
|
|
||||||
|
* When the `NormalizeURL` function is used (passing an URL object), this source URL object is modified (that is, after the call, the URL object will be modified to reflect the normalization).
|
||||||
|
|
||||||
|
* The *replace IP with domain name* normalization (`http://208.77.188.166/ → http://www.example.com/`) is obviously not possible for a library without making some network requests. This is not implemented in purell.
|
||||||
|
|
||||||
|
* The *remove unused query string parameters* and *remove default query parameters* are also not implemented, since this is a very case-specific normalization, and it is quite trivial to do with an URL object.
|
||||||
|
|
||||||
|
### Safe vs Usually Safe vs Unsafe
|
||||||
|
|
||||||
|
Purell allows you to control the level of risk you take while normalizing an URL. You can aggressively normalize, play it totally safe, or anything in between.
|
||||||
|
|
||||||
|
Consider the following URL:
|
||||||
|
|
||||||
|
`HTTPS://www.RooT.com/toto/t%45%1f///a/./b/../c/?z=3&w=2&a=4&w=1#invalid`
|
||||||
|
|
||||||
|
Normalizing with the `FlagsSafe` gives:
|
||||||
|
|
||||||
|
`https://www.root.com/toto/tE%1F///a/./b/../c/?z=3&w=2&a=4&w=1#invalid`
|
||||||
|
|
||||||
|
With the `FlagsUsuallySafeGreedy`:
|
||||||
|
|
||||||
|
`https://www.root.com/toto/tE%1F///a/c?z=3&w=2&a=4&w=1#invalid`
|
||||||
|
|
||||||
|
And with `FlagsUnsafeGreedy`:
|
||||||
|
|
||||||
|
`http://root.com/toto/tE%1F/a/c?a=4&w=1&w=2&z=3`
|
||||||
|
|
||||||
|
## TODOs
|
||||||
|
|
||||||
|
* Add a class/default instance to allow specifying custom directory index names? At the moment, removing directory index removes `(^|/)((?:default|index)\.\w{1,4})$`.
|
||||||
|
|
||||||
|
## Thanks / Contributions
|
||||||
|
|
||||||
|
@rogpeppe
|
||||||
|
@jehiah
|
||||||
|
@opennota
|
||||||
|
@pchristopher1275
|
||||||
|
@zenovich
|
||||||
|
@beeker1121
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The [BSD 3-Clause license][bsd].
|
||||||
|
|
||||||
|
[bsd]: http://opensource.org/licenses/BSD-3-Clause
|
||||||
|
[wiki]: http://en.wikipedia.org/wiki/URL_normalization
|
||||||
|
[rfc]: http://tools.ietf.org/html/rfc3986#section-6
|
||||||
|
[godoc]: http://go.pkgdoc.org/github.com/PuerkitoBio/purell
|
||||||
|
[pr5]: https://github.com/PuerkitoBio/purell/pull/5
|
||||||
|
[iss7]: https://github.com/PuerkitoBio/purell/issues/7
|
379
src/vendor/github.com/PuerkitoBio/purell/purell.go
generated
vendored
Normal file
379
src/vendor/github.com/PuerkitoBio/purell/purell.go
generated
vendored
Normal file
@ -0,0 +1,379 @@
|
|||||||
|
/*
|
||||||
|
Package purell offers URL normalization as described on the wikipedia page:
|
||||||
|
http://en.wikipedia.org/wiki/URL_normalization
|
||||||
|
*/
|
||||||
|
package purell
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
"regexp"
|
||||||
|
"sort"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/PuerkitoBio/urlesc"
|
||||||
|
"golang.org/x/net/idna"
|
||||||
|
"golang.org/x/text/unicode/norm"
|
||||||
|
"golang.org/x/text/width"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A set of normalization flags determines how a URL will
|
||||||
|
// be normalized.
|
||||||
|
type NormalizationFlags uint
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Safe normalizations
|
||||||
|
FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1
|
||||||
|
FlagLowercaseHost // http://HOST -> http://host
|
||||||
|
FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF
|
||||||
|
FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA
|
||||||
|
FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$
|
||||||
|
FlagRemoveDefaultPort // http://host:80 -> http://host
|
||||||
|
FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path
|
||||||
|
|
||||||
|
// Usually safe normalizations
|
||||||
|
FlagRemoveTrailingSlash // http://host/path/ -> http://host/path
|
||||||
|
FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags)
|
||||||
|
FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c
|
||||||
|
|
||||||
|
// Unsafe normalizations
|
||||||
|
FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/
|
||||||
|
FlagRemoveFragment // http://host/path#fragment -> http://host/path
|
||||||
|
FlagForceHTTP // https://host -> http://host
|
||||||
|
FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b
|
||||||
|
FlagRemoveWWW // http://www.host/ -> http://host/
|
||||||
|
FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags)
|
||||||
|
FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3
|
||||||
|
|
||||||
|
// Normalizations not in the wikipedia article, required to cover tests cases
|
||||||
|
// submitted by jehiah
|
||||||
|
FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147
|
||||||
|
FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147
|
||||||
|
FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147
|
||||||
|
FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path
|
||||||
|
FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path
|
||||||
|
|
||||||
|
// Convenience set of safe normalizations
|
||||||
|
FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator
|
||||||
|
|
||||||
|
// For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags,
|
||||||
|
// while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix".
|
||||||
|
|
||||||
|
// Convenience set of usually safe normalizations (includes FlagsSafe)
|
||||||
|
FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments
|
||||||
|
FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments
|
||||||
|
|
||||||
|
// Convenience set of unsafe normalizations (includes FlagsUsuallySafe)
|
||||||
|
FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery
|
||||||
|
FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery
|
||||||
|
|
||||||
|
// Convenience set of all available flags
|
||||||
|
FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
||||||
|
FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
defaultHttpPort = ":80"
|
||||||
|
defaultHttpsPort = ":443"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Regular expressions used by the normalizations
|
||||||
|
var rxPort = regexp.MustCompile(`(:\d+)/?$`)
|
||||||
|
var rxDirIndex = regexp.MustCompile(`(^|/)((?:default|index)\.\w{1,4})$`)
|
||||||
|
var rxDupSlashes = regexp.MustCompile(`/{2,}`)
|
||||||
|
var rxDWORDHost = regexp.MustCompile(`^(\d+)((?:\.+)?(?:\:\d*)?)$`)
|
||||||
|
var rxOctalHost = regexp.MustCompile(`^(0\d*)\.(0\d*)\.(0\d*)\.(0\d*)((?:\.+)?(?:\:\d*)?)$`)
|
||||||
|
var rxHexHost = regexp.MustCompile(`^0x([0-9A-Fa-f]+)((?:\.+)?(?:\:\d*)?)$`)
|
||||||
|
var rxHostDots = regexp.MustCompile(`^(.+?)(:\d+)?$`)
|
||||||
|
var rxEmptyPort = regexp.MustCompile(`:+$`)
|
||||||
|
|
||||||
|
// Map of flags to implementation function.
|
||||||
|
// FlagDecodeUnnecessaryEscapes has no action, since it is done automatically
|
||||||
|
// by parsing the string as an URL. Same for FlagUppercaseEscapes and FlagRemoveEmptyQuerySeparator.
|
||||||
|
|
||||||
|
// Since maps have undefined traversing order, make a slice of ordered keys
|
||||||
|
var flagsOrder = []NormalizationFlags{
|
||||||
|
FlagLowercaseScheme,
|
||||||
|
FlagLowercaseHost,
|
||||||
|
FlagRemoveDefaultPort,
|
||||||
|
FlagRemoveDirectoryIndex,
|
||||||
|
FlagRemoveDotSegments,
|
||||||
|
FlagRemoveFragment,
|
||||||
|
FlagForceHTTP, // Must be after remove default port (because https=443/http=80)
|
||||||
|
FlagRemoveDuplicateSlashes,
|
||||||
|
FlagRemoveWWW,
|
||||||
|
FlagAddWWW,
|
||||||
|
FlagSortQuery,
|
||||||
|
FlagDecodeDWORDHost,
|
||||||
|
FlagDecodeOctalHost,
|
||||||
|
FlagDecodeHexHost,
|
||||||
|
FlagRemoveUnnecessaryHostDots,
|
||||||
|
FlagRemoveEmptyPortSeparator,
|
||||||
|
FlagRemoveTrailingSlash, // These two (add/remove trailing slash) must be last
|
||||||
|
FlagAddTrailingSlash,
|
||||||
|
}
|
||||||
|
|
||||||
|
// ... and then the map, where order is unimportant
|
||||||
|
var flags = map[NormalizationFlags]func(*url.URL){
|
||||||
|
FlagLowercaseScheme: lowercaseScheme,
|
||||||
|
FlagLowercaseHost: lowercaseHost,
|
||||||
|
FlagRemoveDefaultPort: removeDefaultPort,
|
||||||
|
FlagRemoveDirectoryIndex: removeDirectoryIndex,
|
||||||
|
FlagRemoveDotSegments: removeDotSegments,
|
||||||
|
FlagRemoveFragment: removeFragment,
|
||||||
|
FlagForceHTTP: forceHTTP,
|
||||||
|
FlagRemoveDuplicateSlashes: removeDuplicateSlashes,
|
||||||
|
FlagRemoveWWW: removeWWW,
|
||||||
|
FlagAddWWW: addWWW,
|
||||||
|
FlagSortQuery: sortQuery,
|
||||||
|
FlagDecodeDWORDHost: decodeDWORDHost,
|
||||||
|
FlagDecodeOctalHost: decodeOctalHost,
|
||||||
|
FlagDecodeHexHost: decodeHexHost,
|
||||||
|
FlagRemoveUnnecessaryHostDots: removeUnncessaryHostDots,
|
||||||
|
FlagRemoveEmptyPortSeparator: removeEmptyPortSeparator,
|
||||||
|
FlagRemoveTrailingSlash: removeTrailingSlash,
|
||||||
|
FlagAddTrailingSlash: addTrailingSlash,
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustNormalizeURLString returns the normalized string, and panics if an error occurs.
|
||||||
|
// It takes an URL string as input, as well as the normalization flags.
|
||||||
|
func MustNormalizeURLString(u string, f NormalizationFlags) string {
|
||||||
|
result, e := NormalizeURLString(u, f)
|
||||||
|
if e != nil {
|
||||||
|
panic(e)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// NormalizeURLString returns the normalized string, or an error if it can't be parsed into an URL object.
|
||||||
|
// It takes an URL string as input, as well as the normalization flags.
|
||||||
|
func NormalizeURLString(u string, f NormalizationFlags) (string, error) {
|
||||||
|
parsed, err := url.Parse(u)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if f&FlagLowercaseHost == FlagLowercaseHost {
|
||||||
|
parsed.Host = strings.ToLower(parsed.Host)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The idna package doesn't fully conform to RFC 5895
|
||||||
|
// (https://tools.ietf.org/html/rfc5895), so we do it here.
|
||||||
|
// Taken from Go 1.8 cycle source, courtesy of bradfitz.
|
||||||
|
// TODO: Remove when (if?) idna package conforms to RFC 5895.
|
||||||
|
parsed.Host = width.Fold.String(parsed.Host)
|
||||||
|
parsed.Host = norm.NFC.String(parsed.Host)
|
||||||
|
if parsed.Host, err = idna.ToASCII(parsed.Host); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return NormalizeURL(parsed, f), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NormalizeURL returns the normalized string.
|
||||||
|
// It takes a parsed URL object as input, as well as the normalization flags.
|
||||||
|
func NormalizeURL(u *url.URL, f NormalizationFlags) string {
|
||||||
|
for _, k := range flagsOrder {
|
||||||
|
if f&k == k {
|
||||||
|
flags[k](u)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return urlesc.Escape(u)
|
||||||
|
}
|
||||||
|
|
||||||
|
func lowercaseScheme(u *url.URL) {
|
||||||
|
if len(u.Scheme) > 0 {
|
||||||
|
u.Scheme = strings.ToLower(u.Scheme)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func lowercaseHost(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
u.Host = strings.ToLower(u.Host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeDefaultPort(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
scheme := strings.ToLower(u.Scheme)
|
||||||
|
u.Host = rxPort.ReplaceAllStringFunc(u.Host, func(val string) string {
|
||||||
|
if (scheme == "http" && val == defaultHttpPort) || (scheme == "https" && val == defaultHttpsPort) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return val
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeTrailingSlash(u *url.URL) {
|
||||||
|
if l := len(u.Path); l > 0 {
|
||||||
|
if strings.HasSuffix(u.Path, "/") {
|
||||||
|
u.Path = u.Path[:l-1]
|
||||||
|
}
|
||||||
|
} else if l = len(u.Host); l > 0 {
|
||||||
|
if strings.HasSuffix(u.Host, "/") {
|
||||||
|
u.Host = u.Host[:l-1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func addTrailingSlash(u *url.URL) {
|
||||||
|
if l := len(u.Path); l > 0 {
|
||||||
|
if !strings.HasSuffix(u.Path, "/") {
|
||||||
|
u.Path += "/"
|
||||||
|
}
|
||||||
|
} else if l = len(u.Host); l > 0 {
|
||||||
|
if !strings.HasSuffix(u.Host, "/") {
|
||||||
|
u.Host += "/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeDotSegments(u *url.URL) {
|
||||||
|
if len(u.Path) > 0 {
|
||||||
|
var dotFree []string
|
||||||
|
var lastIsDot bool
|
||||||
|
|
||||||
|
sections := strings.Split(u.Path, "/")
|
||||||
|
for _, s := range sections {
|
||||||
|
if s == ".." {
|
||||||
|
if len(dotFree) > 0 {
|
||||||
|
dotFree = dotFree[:len(dotFree)-1]
|
||||||
|
}
|
||||||
|
} else if s != "." {
|
||||||
|
dotFree = append(dotFree, s)
|
||||||
|
}
|
||||||
|
lastIsDot = (s == "." || s == "..")
|
||||||
|
}
|
||||||
|
// Special case if host does not end with / and new path does not begin with /
|
||||||
|
u.Path = strings.Join(dotFree, "/")
|
||||||
|
if u.Host != "" && !strings.HasSuffix(u.Host, "/") && !strings.HasPrefix(u.Path, "/") {
|
||||||
|
u.Path = "/" + u.Path
|
||||||
|
}
|
||||||
|
// Special case if the last segment was a dot, make sure the path ends with a slash
|
||||||
|
if lastIsDot && !strings.HasSuffix(u.Path, "/") {
|
||||||
|
u.Path += "/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeDirectoryIndex(u *url.URL) {
|
||||||
|
if len(u.Path) > 0 {
|
||||||
|
u.Path = rxDirIndex.ReplaceAllString(u.Path, "$1")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeFragment(u *url.URL) {
|
||||||
|
u.Fragment = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func forceHTTP(u *url.URL) {
|
||||||
|
if strings.ToLower(u.Scheme) == "https" {
|
||||||
|
u.Scheme = "http"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeDuplicateSlashes(u *url.URL) {
|
||||||
|
if len(u.Path) > 0 {
|
||||||
|
u.Path = rxDupSlashes.ReplaceAllString(u.Path, "/")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeWWW(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 && strings.HasPrefix(strings.ToLower(u.Host), "www.") {
|
||||||
|
u.Host = u.Host[4:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func addWWW(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 && !strings.HasPrefix(strings.ToLower(u.Host), "www.") {
|
||||||
|
u.Host = "www." + u.Host
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sortQuery(u *url.URL) {
|
||||||
|
q := u.Query()
|
||||||
|
|
||||||
|
if len(q) > 0 {
|
||||||
|
arKeys := make([]string, len(q))
|
||||||
|
i := 0
|
||||||
|
for k := range q {
|
||||||
|
arKeys[i] = k
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
sort.Strings(arKeys)
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
for _, k := range arKeys {
|
||||||
|
sort.Strings(q[k])
|
||||||
|
for _, v := range q[k] {
|
||||||
|
if buf.Len() > 0 {
|
||||||
|
buf.WriteRune('&')
|
||||||
|
}
|
||||||
|
buf.WriteString(fmt.Sprintf("%s=%s", k, urlesc.QueryEscape(v)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rebuild the raw query string
|
||||||
|
u.RawQuery = buf.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeDWORDHost(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
if matches := rxDWORDHost.FindStringSubmatch(u.Host); len(matches) > 2 {
|
||||||
|
var parts [4]int64
|
||||||
|
|
||||||
|
dword, _ := strconv.ParseInt(matches[1], 10, 0)
|
||||||
|
for i, shift := range []uint{24, 16, 8, 0} {
|
||||||
|
parts[i] = dword >> shift & 0xFF
|
||||||
|
}
|
||||||
|
u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[2])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeOctalHost(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
if matches := rxOctalHost.FindStringSubmatch(u.Host); len(matches) > 5 {
|
||||||
|
var parts [4]int64
|
||||||
|
|
||||||
|
for i := 1; i <= 4; i++ {
|
||||||
|
parts[i-1], _ = strconv.ParseInt(matches[i], 8, 0)
|
||||||
|
}
|
||||||
|
u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[5])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeHexHost(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
if matches := rxHexHost.FindStringSubmatch(u.Host); len(matches) > 2 {
|
||||||
|
// Conversion is safe because of regex validation
|
||||||
|
parsed, _ := strconv.ParseInt(matches[1], 16, 0)
|
||||||
|
// Set host as DWORD (base 10) encoded host
|
||||||
|
u.Host = fmt.Sprintf("%d%s", parsed, matches[2])
|
||||||
|
// The rest is the same as decoding a DWORD host
|
||||||
|
decodeDWORDHost(u)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeUnncessaryHostDots(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
if matches := rxHostDots.FindStringSubmatch(u.Host); len(matches) > 1 {
|
||||||
|
// Trim the leading and trailing dots
|
||||||
|
u.Host = strings.Trim(matches[1], ".")
|
||||||
|
if len(matches) > 2 {
|
||||||
|
u.Host += matches[2]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeEmptyPortSeparator(u *url.URL) {
|
||||||
|
if len(u.Host) > 0 {
|
||||||
|
u.Host = rxEmptyPort.ReplaceAllString(u.Host, "")
|
||||||
|
}
|
||||||
|
}
|
15
src/vendor/github.com/PuerkitoBio/urlesc/.travis.yml
generated
vendored
Normal file
15
src/vendor/github.com/PuerkitoBio/urlesc/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.4.x
|
||||||
|
- 1.5.x
|
||||||
|
- 1.6.x
|
||||||
|
- 1.7.x
|
||||||
|
- 1.8.x
|
||||||
|
- tip
|
||||||
|
|
||||||
|
install:
|
||||||
|
- go build .
|
||||||
|
|
||||||
|
script:
|
||||||
|
- go test -v
|
27
src/vendor/github.com/PuerkitoBio/urlesc/LICENSE
generated
vendored
Normal file
27
src/vendor/github.com/PuerkitoBio/urlesc/LICENSE
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
Copyright (c) 2012 The Go Authors. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
* Neither the name of Google Inc. nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
16
src/vendor/github.com/PuerkitoBio/urlesc/README.md
generated
vendored
Normal file
16
src/vendor/github.com/PuerkitoBio/urlesc/README.md
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
urlesc [![Build Status](https://travis-ci.org/PuerkitoBio/urlesc.svg?branch=master)](https://travis-ci.org/PuerkitoBio/urlesc) [![GoDoc](http://godoc.org/github.com/PuerkitoBio/urlesc?status.svg)](http://godoc.org/github.com/PuerkitoBio/urlesc)
|
||||||
|
======
|
||||||
|
|
||||||
|
Package urlesc implements query escaping as per RFC 3986.
|
||||||
|
|
||||||
|
It contains some parts of the net/url package, modified so as to allow
|
||||||
|
some reserved characters incorrectly escaped by net/url (see [issue 5684](https://github.com/golang/go/issues/5684)).
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
go get github.com/PuerkitoBio/urlesc
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Go license (BSD-3-Clause)
|
||||||
|
|
180
src/vendor/github.com/PuerkitoBio/urlesc/urlesc.go
generated
vendored
Normal file
180
src/vendor/github.com/PuerkitoBio/urlesc/urlesc.go
generated
vendored
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package urlesc implements query escaping as per RFC 3986.
|
||||||
|
// It contains some parts of the net/url package, modified so as to allow
|
||||||
|
// some reserved characters incorrectly escaped by net/url.
|
||||||
|
// See https://github.com/golang/go/issues/5684
|
||||||
|
package urlesc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type encoding int
|
||||||
|
|
||||||
|
const (
|
||||||
|
encodePath encoding = 1 + iota
|
||||||
|
encodeUserPassword
|
||||||
|
encodeQueryComponent
|
||||||
|
encodeFragment
|
||||||
|
)
|
||||||
|
|
||||||
|
// Return true if the specified character should be escaped when
|
||||||
|
// appearing in a URL string, according to RFC 3986.
|
||||||
|
func shouldEscape(c byte, mode encoding) bool {
|
||||||
|
// §2.3 Unreserved characters (alphanum)
|
||||||
|
if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
switch c {
|
||||||
|
case '-', '.', '_', '~': // §2.3 Unreserved characters (mark)
|
||||||
|
return false
|
||||||
|
|
||||||
|
// §2.2 Reserved characters (reserved)
|
||||||
|
case ':', '/', '?', '#', '[', ']', '@', // gen-delims
|
||||||
|
'!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=': // sub-delims
|
||||||
|
// Different sections of the URL allow a few of
|
||||||
|
// the reserved characters to appear unescaped.
|
||||||
|
switch mode {
|
||||||
|
case encodePath: // §3.3
|
||||||
|
// The RFC allows sub-delims and : @.
|
||||||
|
// '/', '[' and ']' can be used to assign meaning to individual path
|
||||||
|
// segments. This package only manipulates the path as a whole,
|
||||||
|
// so we allow those as well. That leaves only ? and # to escape.
|
||||||
|
return c == '?' || c == '#'
|
||||||
|
|
||||||
|
case encodeUserPassword: // §3.2.1
|
||||||
|
// The RFC allows : and sub-delims in
|
||||||
|
// userinfo. The parsing of userinfo treats ':' as special so we must escape
|
||||||
|
// all the gen-delims.
|
||||||
|
return c == ':' || c == '/' || c == '?' || c == '#' || c == '[' || c == ']' || c == '@'
|
||||||
|
|
||||||
|
case encodeQueryComponent: // §3.4
|
||||||
|
// The RFC allows / and ?.
|
||||||
|
return c != '/' && c != '?'
|
||||||
|
|
||||||
|
case encodeFragment: // §4.1
|
||||||
|
// The RFC text is silent but the grammar allows
|
||||||
|
// everything, so escape nothing but #
|
||||||
|
return c == '#'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Everything else must be escaped.
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryEscape escapes the string so it can be safely placed
|
||||||
|
// inside a URL query.
|
||||||
|
func QueryEscape(s string) string {
|
||||||
|
return escape(s, encodeQueryComponent)
|
||||||
|
}
|
||||||
|
|
||||||
|
func escape(s string, mode encoding) string {
|
||||||
|
spaceCount, hexCount := 0, 0
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
c := s[i]
|
||||||
|
if shouldEscape(c, mode) {
|
||||||
|
if c == ' ' && mode == encodeQueryComponent {
|
||||||
|
spaceCount++
|
||||||
|
} else {
|
||||||
|
hexCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if spaceCount == 0 && hexCount == 0 {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
t := make([]byte, len(s)+2*hexCount)
|
||||||
|
j := 0
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
switch c := s[i]; {
|
||||||
|
case c == ' ' && mode == encodeQueryComponent:
|
||||||
|
t[j] = '+'
|
||||||
|
j++
|
||||||
|
case shouldEscape(c, mode):
|
||||||
|
t[j] = '%'
|
||||||
|
t[j+1] = "0123456789ABCDEF"[c>>4]
|
||||||
|
t[j+2] = "0123456789ABCDEF"[c&15]
|
||||||
|
j += 3
|
||||||
|
default:
|
||||||
|
t[j] = s[i]
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return string(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
var uiReplacer = strings.NewReplacer(
|
||||||
|
"%21", "!",
|
||||||
|
"%27", "'",
|
||||||
|
"%28", "(",
|
||||||
|
"%29", ")",
|
||||||
|
"%2A", "*",
|
||||||
|
)
|
||||||
|
|
||||||
|
// unescapeUserinfo unescapes some characters that need not to be escaped as per RFC3986.
|
||||||
|
func unescapeUserinfo(s string) string {
|
||||||
|
return uiReplacer.Replace(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Escape reassembles the URL into a valid URL string.
|
||||||
|
// The general form of the result is one of:
|
||||||
|
//
|
||||||
|
// scheme:opaque
|
||||||
|
// scheme://userinfo@host/path?query#fragment
|
||||||
|
//
|
||||||
|
// If u.Opaque is non-empty, String uses the first form;
|
||||||
|
// otherwise it uses the second form.
|
||||||
|
//
|
||||||
|
// In the second form, the following rules apply:
|
||||||
|
// - if u.Scheme is empty, scheme: is omitted.
|
||||||
|
// - if u.User is nil, userinfo@ is omitted.
|
||||||
|
// - if u.Host is empty, host/ is omitted.
|
||||||
|
// - if u.Scheme and u.Host are empty and u.User is nil,
|
||||||
|
// the entire scheme://userinfo@host/ is omitted.
|
||||||
|
// - if u.Host is non-empty and u.Path begins with a /,
|
||||||
|
// the form host/path does not add its own /.
|
||||||
|
// - if u.RawQuery is empty, ?query is omitted.
|
||||||
|
// - if u.Fragment is empty, #fragment is omitted.
|
||||||
|
func Escape(u *url.URL) string {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if u.Scheme != "" {
|
||||||
|
buf.WriteString(u.Scheme)
|
||||||
|
buf.WriteByte(':')
|
||||||
|
}
|
||||||
|
if u.Opaque != "" {
|
||||||
|
buf.WriteString(u.Opaque)
|
||||||
|
} else {
|
||||||
|
if u.Scheme != "" || u.Host != "" || u.User != nil {
|
||||||
|
buf.WriteString("//")
|
||||||
|
if ui := u.User; ui != nil {
|
||||||
|
buf.WriteString(unescapeUserinfo(ui.String()))
|
||||||
|
buf.WriteByte('@')
|
||||||
|
}
|
||||||
|
if h := u.Host; h != "" {
|
||||||
|
buf.WriteString(h)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if u.Path != "" && u.Path[0] != '/' && u.Host != "" {
|
||||||
|
buf.WriteByte('/')
|
||||||
|
}
|
||||||
|
buf.WriteString(escape(u.Path, encodePath))
|
||||||
|
}
|
||||||
|
if u.RawQuery != "" {
|
||||||
|
buf.WriteByte('?')
|
||||||
|
buf.WriteString(u.RawQuery)
|
||||||
|
}
|
||||||
|
if u.Fragment != "" {
|
||||||
|
buf.WriteByte('#')
|
||||||
|
buf.WriteString(escape(u.Fragment, encodeFragment))
|
||||||
|
}
|
||||||
|
return buf.String()
|
||||||
|
}
|
14
src/vendor/github.com/asaskevich/govalidator/.travis.yml
generated
vendored
Normal file
14
src/vendor/github.com/asaskevich/govalidator/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.1
|
||||||
|
- 1.2
|
||||||
|
- 1.3
|
||||||
|
- 1.4
|
||||||
|
- 1.5
|
||||||
|
- 1.6
|
||||||
|
- tip
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
email:
|
||||||
|
- bwatas@gmail.com
|
63
src/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md
generated
vendored
Normal file
63
src/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md
generated
vendored
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#### Support
|
||||||
|
If you do have a contribution to the package, feel free to create a Pull Request or an Issue.
|
||||||
|
|
||||||
|
#### What to contribute
|
||||||
|
If you don't know what to do, there are some features and functions that need to be done
|
||||||
|
|
||||||
|
- [ ] Refactor code
|
||||||
|
- [ ] Edit docs and [README](https://github.com/asaskevich/govalidator/README.md): spellcheck, grammar and typo check
|
||||||
|
- [ ] Create actual list of contributors and projects that currently using this package
|
||||||
|
- [ ] Resolve [issues and bugs](https://github.com/asaskevich/govalidator/issues)
|
||||||
|
- [ ] 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)
|
||||||
|
- [ ] Implement fuzzing testing
|
||||||
|
- [ ] Implement some struct/map/array utilities
|
||||||
|
- [ ] Implement map/array validation
|
||||||
|
- [ ] Implement benchmarking
|
||||||
|
- [ ] Implement batch of examples
|
||||||
|
- [ ] Look at forks for new features and fixes
|
||||||
|
|
||||||
|
#### Advice
|
||||||
|
Feel free to create what you want, but keep in mind when you implement new features:
|
||||||
|
- Code must be clear and readable, names of variables/constants clearly describes what they are doing
|
||||||
|
- Public functions must be documented and described in source file and added to README.md to the list of available functions
|
||||||
|
- There are must be unit-tests for any new functions and improvements
|
||||||
|
|
||||||
|
## Financial contributions
|
||||||
|
|
||||||
|
We also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/govalidator).
|
||||||
|
Anyone can file an expense. If the expense makes sense for the development of the community, it will be "merged" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed.
|
||||||
|
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
|
||||||
|
### 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>
|
||||||
|
|
||||||
|
|
||||||
|
### Backers
|
||||||
|
|
||||||
|
Thank you to all our backers! [[Become a backer](https://opencollective.com/govalidator#backer)]
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/govalidator#backers" target="_blank"><img src="https://opencollective.com/govalidator/backers.svg?width=890"></a>
|
||||||
|
|
||||||
|
|
||||||
|
### Sponsors
|
||||||
|
|
||||||
|
Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/govalidator#sponsor))
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/0/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/0/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/1/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/1/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/2/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/2/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/3/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/3/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/4/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/4/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/5/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/5/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/6/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/6/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/7/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/7/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/8/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/8/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/9/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/9/avatar.svg"></a>
|
21
src/vendor/github.com/asaskevich/govalidator/LICENSE
generated
vendored
Normal file
21
src/vendor/github.com/asaskevich/govalidator/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 Alex Saskevich
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
507
src/vendor/github.com/asaskevich/govalidator/README.md
generated
vendored
Normal file
507
src/vendor/github.com/asaskevich/govalidator/README.md
generated
vendored
Normal file
@ -0,0 +1,507 @@
|
|||||||
|
govalidator
|
||||||
|
===========
|
||||||
|
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/asaskevich/govalidator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![GoDoc](https://godoc.org/github.com/asaskevich/govalidator?status.png)](https://godoc.org/github.com/asaskevich/govalidator) [![Coverage Status](https://img.shields.io/coveralls/asaskevich/govalidator.svg)](https://coveralls.io/r/asaskevich/govalidator?branch=master) [![wercker status](https://app.wercker.com/status/1ec990b09ea86c910d5f08b0e02c6043/s "wercker status")](https://app.wercker.com/project/bykey/1ec990b09ea86c910d5f08b0e02c6043)
|
||||||
|
[![Build Status](https://travis-ci.org/asaskevich/govalidator.svg?branch=master)](https://travis-ci.org/asaskevich/govalidator) [![Go Report Card](https://goreportcard.com/badge/github.com/asaskevich/govalidator)](https://goreportcard.com/report/github.com/asaskevich/govalidator) [![GoSearch](http://go-search.org/badge?id=github.com%2Fasaskevich%2Fgovalidator)](http://go-search.org/view?id=github.com%2Fasaskevich%2Fgovalidator) [![Backers on Open Collective](https://opencollective.com/govalidator/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/govalidator/sponsors/badge.svg)](#sponsors) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_shield)
|
||||||
|
|
||||||
|
A package of validators and sanitizers for strings, structs and collections. Based on [validator.js](https://github.com/chriso/validator.js).
|
||||||
|
|
||||||
|
#### Installation
|
||||||
|
Make sure that Go is installed on your computer.
|
||||||
|
Type the following command in your terminal:
|
||||||
|
|
||||||
|
go get github.com/asaskevich/govalidator
|
||||||
|
|
||||||
|
or you can get specified release of the package with `gopkg.in`:
|
||||||
|
|
||||||
|
go get gopkg.in/asaskevich/govalidator.v4
|
||||||
|
|
||||||
|
After it the package is ready to use.
|
||||||
|
|
||||||
|
|
||||||
|
#### Import package in your project
|
||||||
|
Add following line in your `*.go` file:
|
||||||
|
```go
|
||||||
|
import "github.com/asaskevich/govalidator"
|
||||||
|
```
|
||||||
|
If you are unhappy to use long `govalidator`, you can do something like this:
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
valid "github.com/asaskevich/govalidator"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Activate behavior to require all fields have a validation tag by default
|
||||||
|
`SetFieldsRequiredByDefault` causes validation to fail when struct fields do not include validations or are not explicitly marked as exempt (using `valid:"-"` or `valid:"email,optional"`). A good place to activate this is a package init function or the main() function.
|
||||||
|
|
||||||
|
`SetNilPtrAllowedByRequired` causes validation to pass when struct fields marked by `required` are set to nil. This is disabled by default for consistency, but some packages that need to be able to determine between `nil` and `zero value` state can use this. If disabled, both `nil` and `zero` values cause validation errors.
|
||||||
|
|
||||||
|
```go
|
||||||
|
import "github.com/asaskevich/govalidator"
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
govalidator.SetFieldsRequiredByDefault(true)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Here's some code to explain it:
|
||||||
|
```go
|
||||||
|
// this struct definition will fail govalidator.ValidateStruct() (and the field values do not matter):
|
||||||
|
type exampleStruct struct {
|
||||||
|
Name string ``
|
||||||
|
Email string `valid:"email"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// this, however, will only fail when Email is empty or an invalid email address:
|
||||||
|
type exampleStruct2 struct {
|
||||||
|
Name string `valid:"-"`
|
||||||
|
Email string `valid:"email"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// lastly, this will only fail when Email is an invalid email address but not when it's empty:
|
||||||
|
type exampleStruct2 struct {
|
||||||
|
Name string `valid:"-"`
|
||||||
|
Email string `valid:"email,optional"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Recent breaking changes (see [#123](https://github.com/asaskevich/govalidator/pull/123))
|
||||||
|
##### Custom validator function signature
|
||||||
|
A context was added as the second parameter, for structs this is the object being validated – this makes dependent validation possible.
|
||||||
|
```go
|
||||||
|
import "github.com/asaskevich/govalidator"
|
||||||
|
|
||||||
|
// old signature
|
||||||
|
func(i interface{}) bool
|
||||||
|
|
||||||
|
// new signature
|
||||||
|
func(i interface{}, o interface{}) bool
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Adding a custom validator
|
||||||
|
This was changed to prevent data races when accessing custom validators.
|
||||||
|
```go
|
||||||
|
import "github.com/asaskevich/govalidator"
|
||||||
|
|
||||||
|
// before
|
||||||
|
govalidator.CustomTypeTagMap["customByteArrayValidator"] = CustomTypeValidator(func(i interface{}, o interface{}) bool {
|
||||||
|
// ...
|
||||||
|
})
|
||||||
|
|
||||||
|
// after
|
||||||
|
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(func(i interface{}, o interface{}) bool {
|
||||||
|
// ...
|
||||||
|
}))
|
||||||
|
```
|
||||||
|
|
||||||
|
#### List of functions:
|
||||||
|
```go
|
||||||
|
func Abs(value float64) float64
|
||||||
|
func BlackList(str, chars string) string
|
||||||
|
func ByteLength(str string, params ...string) bool
|
||||||
|
func CamelCaseToUnderscore(str string) string
|
||||||
|
func Contains(str, substring string) bool
|
||||||
|
func Count(array []interface{}, iterator ConditionIterator) int
|
||||||
|
func Each(array []interface{}, iterator Iterator)
|
||||||
|
func ErrorByField(e error, field string) string
|
||||||
|
func ErrorsByField(e error) map[string]string
|
||||||
|
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 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 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 IsFilePath(str string) (bool, int)
|
||||||
|
func IsFloat(str string) bool
|
||||||
|
func IsFullWidth(str string) bool
|
||||||
|
func IsHalfWidth(str string) bool
|
||||||
|
func IsHexadecimal(str string) bool
|
||||||
|
func IsHexcolor(str string) bool
|
||||||
|
func IsHost(str string) bool
|
||||||
|
func IsIP(str string) bool
|
||||||
|
func IsIPv4(str string) bool
|
||||||
|
func IsIPv6(str string) bool
|
||||||
|
func IsISBN(str string, version int) bool
|
||||||
|
func IsISBN10(str string) bool
|
||||||
|
func IsISBN13(str string) bool
|
||||||
|
func IsISO3166Alpha2(str string) bool
|
||||||
|
func IsISO3166Alpha3(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 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 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 IsNull(str string) bool
|
||||||
|
func IsNumeric(str string) bool
|
||||||
|
func IsPort(str string) bool
|
||||||
|
func IsPositive(value float64) bool
|
||||||
|
func IsPrintableASCII(str string) bool
|
||||||
|
func IsRFC3339(str string) bool
|
||||||
|
func IsRFC3339WithoutZone(str string) bool
|
||||||
|
func IsRGBcolor(str string) bool
|
||||||
|
func IsRequestURI(rawurl string) bool
|
||||||
|
func IsRequestURL(rawurl string) bool
|
||||||
|
func IsSSN(str string) bool
|
||||||
|
func IsSemver(str string) bool
|
||||||
|
func IsTime(str string, format string) bool
|
||||||
|
func IsURL(str string) bool
|
||||||
|
func IsUTFDigit(str string) bool
|
||||||
|
func IsUTFLetter(str string) bool
|
||||||
|
func IsUTFLetterNumeric(str string) bool
|
||||||
|
func IsUTFNumeric(str string) bool
|
||||||
|
func IsUUID(str string) bool
|
||||||
|
func IsUUIDv3(str string) bool
|
||||||
|
func IsUUIDv4(str string) bool
|
||||||
|
func IsUUIDv5(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 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 Range(str string, params ...string) bool
|
||||||
|
func RemoveTags(s string) string
|
||||||
|
func ReplacePattern(str, pattern, replace string) string
|
||||||
|
func Reverse(s string) string
|
||||||
|
func RightTrim(str, chars string) string
|
||||||
|
func RuneLength(str string, params ...string) bool
|
||||||
|
func SafeFileName(str string) string
|
||||||
|
func SetFieldsRequiredByDefault(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 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 UnderscoreToCamelCase(s string) string
|
||||||
|
func ValidateStruct(s interface{}) (bool, error)
|
||||||
|
func WhiteList(str, chars string) string
|
||||||
|
type ConditionIterator
|
||||||
|
type CustomTypeValidator
|
||||||
|
type Error
|
||||||
|
func (e Error) Error() string
|
||||||
|
type Errors
|
||||||
|
func (es Errors) Error() string
|
||||||
|
func (es Errors) Errors() []error
|
||||||
|
type ISO3166Entry
|
||||||
|
type Iterator
|
||||||
|
type ParamValidator
|
||||||
|
type ResultIterator
|
||||||
|
type UnsupportedTypeError
|
||||||
|
func (e *UnsupportedTypeError) Error() string
|
||||||
|
type Validator
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Examples
|
||||||
|
###### IsURL
|
||||||
|
```go
|
||||||
|
println(govalidator.IsURL(`http://user@pass:domain.com/path/page`))
|
||||||
|
```
|
||||||
|
###### ToString
|
||||||
|
```go
|
||||||
|
type User struct {
|
||||||
|
FirstName string
|
||||||
|
LastName string
|
||||||
|
}
|
||||||
|
|
||||||
|
str := govalidator.ToString(&User{"John", "Juan"})
|
||||||
|
println(str)
|
||||||
|
```
|
||||||
|
###### Each, Map, Filter, Count for slices
|
||||||
|
Each iterates over the slice/array and calls Iterator for every item
|
||||||
|
```go
|
||||||
|
data := []interface{}{1, 2, 3, 4, 5}
|
||||||
|
var fn govalidator.Iterator = func(value interface{}, index int) {
|
||||||
|
println(value.(int))
|
||||||
|
}
|
||||||
|
govalidator.Each(data, fn)
|
||||||
|
```
|
||||||
|
```go
|
||||||
|
data := []interface{}{1, 2, 3, 4, 5}
|
||||||
|
var fn govalidator.ResultIterator = func(value interface{}, index int) interface{} {
|
||||||
|
return value.(int) * 3
|
||||||
|
}
|
||||||
|
_ = govalidator.Map(data, fn) // result = []interface{}{1, 6, 9, 12, 15}
|
||||||
|
```
|
||||||
|
```go
|
||||||
|
data := []interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
||||||
|
var fn govalidator.ConditionIterator = func(value interface{}, index int) bool {
|
||||||
|
return value.(int)%2 == 0
|
||||||
|
}
|
||||||
|
_ = govalidator.Filter(data, fn) // result = []interface{}{2, 4, 6, 8, 10}
|
||||||
|
_ = govalidator.Count(data, fn) // result = 5
|
||||||
|
```
|
||||||
|
###### ValidateStruct [#2](https://github.com/asaskevich/govalidator/pull/2)
|
||||||
|
If you want to validate structs, you can use tag `valid` for any field in your structure. All validators used with this field in one tag are separated by comma. If you want to skip validation, place `-` in your tag. If you need a validator that is not on the list below, you can add it like this:
|
||||||
|
```go
|
||||||
|
govalidator.TagMap["duck"] = govalidator.Validator(func(str string) bool {
|
||||||
|
return str == "duck"
|
||||||
|
})
|
||||||
|
```
|
||||||
|
For completely custom validators (interface-based), see below.
|
||||||
|
|
||||||
|
Here is a list of available validators for struct fields (validator - used function):
|
||||||
|
```go
|
||||||
|
"email": IsEmail,
|
||||||
|
"url": IsURL,
|
||||||
|
"dialstring": IsDialString,
|
||||||
|
"requrl": IsRequestURL,
|
||||||
|
"requri": IsRequestURI,
|
||||||
|
"alpha": IsAlpha,
|
||||||
|
"utfletter": IsUTFLetter,
|
||||||
|
"alphanum": IsAlphanumeric,
|
||||||
|
"utfletternum": IsUTFLetterNumeric,
|
||||||
|
"numeric": IsNumeric,
|
||||||
|
"utfnumeric": IsUTFNumeric,
|
||||||
|
"utfdigit": IsUTFDigit,
|
||||||
|
"hexadecimal": IsHexadecimal,
|
||||||
|
"hexcolor": IsHexcolor,
|
||||||
|
"rgbcolor": IsRGBcolor,
|
||||||
|
"lowercase": IsLowerCase,
|
||||||
|
"uppercase": IsUpperCase,
|
||||||
|
"int": IsInt,
|
||||||
|
"float": IsFloat,
|
||||||
|
"null": IsNull,
|
||||||
|
"uuid": IsUUID,
|
||||||
|
"uuidv3": IsUUIDv3,
|
||||||
|
"uuidv4": IsUUIDv4,
|
||||||
|
"uuidv5": IsUUIDv5,
|
||||||
|
"creditcard": IsCreditCard,
|
||||||
|
"isbn10": IsISBN10,
|
||||||
|
"isbn13": IsISBN13,
|
||||||
|
"json": IsJSON,
|
||||||
|
"multibyte": IsMultibyte,
|
||||||
|
"ascii": IsASCII,
|
||||||
|
"printableascii": IsPrintableASCII,
|
||||||
|
"fullwidth": IsFullWidth,
|
||||||
|
"halfwidth": IsHalfWidth,
|
||||||
|
"variablewidth": IsVariableWidth,
|
||||||
|
"base64": IsBase64,
|
||||||
|
"datauri": IsDataURI,
|
||||||
|
"ip": IsIP,
|
||||||
|
"port": IsPort,
|
||||||
|
"ipv4": IsIPv4,
|
||||||
|
"ipv6": IsIPv6,
|
||||||
|
"dns": IsDNSName,
|
||||||
|
"host": IsHost,
|
||||||
|
"mac": IsMAC,
|
||||||
|
"latitude": IsLatitude,
|
||||||
|
"longitude": IsLongitude,
|
||||||
|
"ssn": IsSSN,
|
||||||
|
"semver": IsSemver,
|
||||||
|
"rfc3339": IsRFC3339,
|
||||||
|
"rfc3339WithoutZone": IsRFC3339WithoutZone,
|
||||||
|
"ISO3166Alpha2": IsISO3166Alpha2,
|
||||||
|
"ISO3166Alpha3": IsISO3166Alpha3,
|
||||||
|
```
|
||||||
|
Validators with parameters
|
||||||
|
|
||||||
|
```go
|
||||||
|
"range(min|max)": Range,
|
||||||
|
"length(min|max)": ByteLength,
|
||||||
|
"runelength(min|max)": RuneLength,
|
||||||
|
"stringlength(min|max)": StringLength,
|
||||||
|
"matches(pattern)": StringMatches,
|
||||||
|
"in(string1|string2|...|stringN)": IsIn,
|
||||||
|
"rsapub(keylength)" : IsRsaPub,
|
||||||
|
```
|
||||||
|
|
||||||
|
And here is small example of usage:
|
||||||
|
```go
|
||||||
|
type Post struct {
|
||||||
|
Title string `valid:"alphanum,required"`
|
||||||
|
Message string `valid:"duck,ascii"`
|
||||||
|
Message2 string `valid:"animal(dog)"`
|
||||||
|
AuthorIP string `valid:"ipv4"`
|
||||||
|
Date string `valid:"-"`
|
||||||
|
}
|
||||||
|
post := &Post{
|
||||||
|
Title: "My Example Post",
|
||||||
|
Message: "duck",
|
||||||
|
Message2: "dog",
|
||||||
|
AuthorIP: "123.234.54.3",
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add your own struct validation tags
|
||||||
|
govalidator.TagMap["duck"] = govalidator.Validator(func(str string) bool {
|
||||||
|
return str == "duck"
|
||||||
|
})
|
||||||
|
|
||||||
|
// Add your own struct validation tags with parameter
|
||||||
|
govalidator.ParamTagMap["animal"] = govalidator.ParamValidator(func(str string, params ...string) bool {
|
||||||
|
species := params[0]
|
||||||
|
return str == species
|
||||||
|
})
|
||||||
|
govalidator.ParamTagRegexMap["animal"] = regexp.MustCompile("^animal\\((\\w+)\\)$")
|
||||||
|
|
||||||
|
result, err := govalidator.ValidateStruct(post)
|
||||||
|
if err != nil {
|
||||||
|
println("error: " + err.Error())
|
||||||
|
}
|
||||||
|
println(result)
|
||||||
|
```
|
||||||
|
###### WhiteList
|
||||||
|
```go
|
||||||
|
// Remove all characters from string ignoring characters between "a" and "z"
|
||||||
|
println(govalidator.WhiteList("a3a43a5a4a3a2a23a4a5a4a3a4", "a-z") == "aaaaaaaaaaaa")
|
||||||
|
```
|
||||||
|
|
||||||
|
###### Custom validation functions
|
||||||
|
Custom validation using your own domain specific validators is also available - here's an example of how to use it:
|
||||||
|
```go
|
||||||
|
import "github.com/asaskevich/govalidator"
|
||||||
|
|
||||||
|
type CustomByteArray [6]byte // custom types are supported and can be validated
|
||||||
|
|
||||||
|
type StructWithCustomByteArray struct {
|
||||||
|
ID CustomByteArray `valid:"customByteArrayValidator,customMinLengthValidator"` // multiple custom validators are possible as well and will be evaluated in sequence
|
||||||
|
Email string `valid:"email"`
|
||||||
|
CustomMinLength int `valid:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(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,
|
||||||
|
// return early or not validate against the context at all – your choice
|
||||||
|
case SomeOtherType:
|
||||||
|
// ...
|
||||||
|
default:
|
||||||
|
// expecting some other type? Throw/panic here or continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch v := i.(type) { // type switch on the struct field being validated
|
||||||
|
case CustomByteArray:
|
||||||
|
for _, e := range v { // this validator checks that the byte array is not empty, i.e. not all zeroes
|
||||||
|
if e != 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}))
|
||||||
|
govalidator.CustomTypeTagMap.Set("customMinLengthValidator", CustomTypeValidator(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
|
||||||
|
}))
|
||||||
|
```
|
||||||
|
|
||||||
|
###### Custom error messages
|
||||||
|
Custom error messages are supported via annotations by adding the `~` separator - here's an example of how to use it:
|
||||||
|
```go
|
||||||
|
type Ticket struct {
|
||||||
|
Id int64 `json:"id"`
|
||||||
|
FirstName string `json:"firstname" valid:"required~First name is blank"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Notes
|
||||||
|
Documentation is available here: [godoc.org](https://godoc.org/github.com/asaskevich/govalidator).
|
||||||
|
Full information about code coverage is also available here: [govalidator on gocover.io](http://gocover.io/github.com/asaskevich/govalidator).
|
||||||
|
|
||||||
|
#### Support
|
||||||
|
If you do have a contribution to the package, feel free to create a Pull Request or an Issue.
|
||||||
|
|
||||||
|
#### What to contribute
|
||||||
|
If you don't know what to do, there are some features and functions that need to be done
|
||||||
|
|
||||||
|
- [ ] Refactor code
|
||||||
|
- [ ] Edit docs and [README](https://github.com/asaskevich/govalidator/README.md): spellcheck, grammar and typo check
|
||||||
|
- [ ] Create actual list of contributors and projects that currently using this package
|
||||||
|
- [ ] Resolve [issues and bugs](https://github.com/asaskevich/govalidator/issues)
|
||||||
|
- [ ] 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)
|
||||||
|
- [ ] Implement fuzzing testing
|
||||||
|
- [ ] Implement some struct/map/array utilities
|
||||||
|
- [ ] Implement map/array validation
|
||||||
|
- [ ] Implement benchmarking
|
||||||
|
- [ ] Implement batch of examples
|
||||||
|
- [ ] Look at forks for new features and fixes
|
||||||
|
|
||||||
|
#### Advice
|
||||||
|
Feel free to create what you want, but keep in mind when you implement new features:
|
||||||
|
- Code must be clear and readable, names of variables/constants clearly describes what they are doing
|
||||||
|
- Public functions must be documented and described in source file and added to README.md to the list of available functions
|
||||||
|
- There are must be unit-tests for any new functions and improvements
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
### Contributors
|
||||||
|
|
||||||
|
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
||||||
|
|
||||||
|
#### Special thanks to [contributors](https://github.com/asaskevich/govalidator/graphs/contributors)
|
||||||
|
* [Daniel Lohse](https://github.com/annismckenzie)
|
||||||
|
* [Attila Oláh](https://github.com/attilaolah)
|
||||||
|
* [Daniel Korner](https://github.com/Dadie)
|
||||||
|
* [Steven Wilkin](https://github.com/stevenwilkin)
|
||||||
|
* [Deiwin Sarjas](https://github.com/deiwin)
|
||||||
|
* [Noah Shibley](https://github.com/slugmobile)
|
||||||
|
* [Nathan Davies](https://github.com/nathj07)
|
||||||
|
* [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>
|
||||||
|
|
||||||
|
|
||||||
|
### Backers
|
||||||
|
|
||||||
|
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/govalidator#backer)]
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/govalidator#backers" target="_blank"><img src="https://opencollective.com/govalidator/backers.svg?width=890"></a>
|
||||||
|
|
||||||
|
|
||||||
|
### Sponsors
|
||||||
|
|
||||||
|
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/govalidator#sponsor)]
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/0/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/0/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/1/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/1/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/2/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/2/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/3/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/3/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/4/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/4/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/5/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/5/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/6/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/6/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/7/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/7/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/8/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/8/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/govalidator/sponsor/9/website" target="_blank"><img src="https://opencollective.com/govalidator/sponsor/9/avatar.svg"></a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 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)
|
58
src/vendor/github.com/asaskevich/govalidator/arrays.go
generated
vendored
Normal file
58
src/vendor/github.com/asaskevich/govalidator/arrays.go
generated
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package govalidator
|
||||||
|
|
||||||
|
// Iterator is the function that accepts element of slice/array and its index
|
||||||
|
type Iterator func(interface{}, int)
|
||||||
|
|
||||||
|
// ResultIterator is the function that accepts element of slice/array and its index and returns any result
|
||||||
|
type ResultIterator func(interface{}, int) interface{}
|
||||||
|
|
||||||
|
// ConditionIterator is the function that accepts element of slice/array and its index and returns boolean
|
||||||
|
type ConditionIterator func(interface{}, int) bool
|
||||||
|
|
||||||
|
// Each iterates over the slice and apply Iterator to every item
|
||||||
|
func Each(array []interface{}, iterator Iterator) {
|
||||||
|
for index, data := range array {
|
||||||
|
iterator(data, index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map iterates over the slice and apply ResultIterator to every item. Returns new slice as a result.
|
||||||
|
func Map(array []interface{}, iterator ResultIterator) []interface{} {
|
||||||
|
var result = make([]interface{}, len(array))
|
||||||
|
for index, data := range array {
|
||||||
|
result[index] = iterator(data, index)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find iterates over the slice and apply ConditionIterator to every item. Returns first item that meet ConditionIterator or nil otherwise.
|
||||||
|
func Find(array []interface{}, iterator ConditionIterator) interface{} {
|
||||||
|
for index, data := range array {
|
||||||
|
if iterator(data, index) {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter iterates over the slice and apply ConditionIterator to every item. Returns new slice.
|
||||||
|
func Filter(array []interface{}, iterator ConditionIterator) []interface{} {
|
||||||
|
var result = make([]interface{}, 0)
|
||||||
|
for index, data := range array {
|
||||||
|
if iterator(data, index) {
|
||||||
|
result = append(result, data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count iterates over the slice and apply ConditionIterator to every item. Returns count of items that meets ConditionIterator.
|
||||||
|
func Count(array []interface{}, iterator ConditionIterator) int {
|
||||||
|
count := 0
|
||||||
|
for index, data := range array {
|
||||||
|
if iterator(data, index) {
|
||||||
|
count = count + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
64
src/vendor/github.com/asaskevich/govalidator/converter.go
generated
vendored
Normal file
64
src/vendor/github.com/asaskevich/govalidator/converter.go
generated
vendored
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
package govalidator
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ToString convert the input to a string.
|
||||||
|
func ToString(obj interface{}) string {
|
||||||
|
res := fmt.Sprintf("%v", obj)
|
||||||
|
return string(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToJSON convert the input to a valid JSON string
|
||||||
|
func ToJSON(obj interface{}) (string, error) {
|
||||||
|
res, err := json.Marshal(obj)
|
||||||
|
if err != nil {
|
||||||
|
res = []byte("")
|
||||||
|
}
|
||||||
|
return string(res), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToFloat convert the input string to a float, or 0.0 if the input is not a float.
|
||||||
|
func ToFloat(str string) (float64, error) {
|
||||||
|
res, err := strconv.ParseFloat(str, 64)
|
||||||
|
if err != nil {
|
||||||
|
res = 0.0
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToInt convert the input string or any int type to an integer type 64, or 0 if the input is not an integer.
|
||||||
|
func ToInt(value interface{}) (res int64, err error) {
|
||||||
|
val := reflect.ValueOf(value)
|
||||||
|
|
||||||
|
switch value.(type) {
|
||||||
|
case int, int8, int16, int32, int64:
|
||||||
|
res = val.Int()
|
||||||
|
case uint, uint8, uint16, uint32, uint64:
|
||||||
|
res = int64(val.Uint())
|
||||||
|
case string:
|
||||||
|
if IsInt(val.String()) {
|
||||||
|
res, err = strconv.ParseInt(val.String(), 0, 64)
|
||||||
|
if err != nil {
|
||||||
|
res = 0
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("math: square root of negative number %g", value)
|
||||||
|
res = 0
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
err = fmt.Errorf("math: square root of negative number %g", value)
|
||||||
|
res = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToBoolean convert the input string to a boolean.
|
||||||
|
func ToBoolean(str string) (bool, error) {
|
||||||
|
return strconv.ParseBool(str)
|
||||||
|
}
|
43
src/vendor/github.com/asaskevich/govalidator/error.go
generated
vendored
Normal file
43
src/vendor/github.com/asaskevich/govalidator/error.go
generated
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package govalidator
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
|
// Errors is an array of multiple errors and conforms to the error interface.
|
||||||
|
type Errors []error
|
||||||
|
|
||||||
|
// Errors returns itself.
|
||||||
|
func (es Errors) Errors() []error {
|
||||||
|
return es
|
||||||
|
}
|
||||||
|
|
||||||
|
func (es Errors) Error() string {
|
||||||
|
var errs []string
|
||||||
|
for _, e := range es {
|
||||||
|
errs = append(errs, e.Error())
|
||||||
|
}
|
||||||
|
return strings.Join(errs, ";")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error encapsulates a name, an error and whether there's a custom error message or not.
|
||||||
|
type Error struct {
|
||||||
|
Name string
|
||||||
|
Err error
|
||||||
|
CustomErrorMessageExists bool
|
||||||
|
|
||||||
|
// Validator indicates the name of the validator that failed
|
||||||
|
Validator string
|
||||||
|
Path []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e Error) Error() string {
|
||||||
|
if e.CustomErrorMessageExists {
|
||||||
|
return e.Err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
errName := e.Name
|
||||||
|
if len(e.Path) > 0 {
|
||||||
|
errName = strings.Join(append(e.Path, e.Name), ".")
|
||||||
|
}
|
||||||
|
|
||||||
|
return errName + ": " + e.Err.Error()
|
||||||
|
}
|
97
src/vendor/github.com/asaskevich/govalidator/numerics.go
generated
vendored
Normal file
97
src/vendor/github.com/asaskevich/govalidator/numerics.go
generated
vendored
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
package govalidator
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Abs returns absolute value of number
|
||||||
|
func Abs(value float64) float64 {
|
||||||
|
return math.Abs(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sign returns signum of number: 1 in case of value > 0, -1 in case of value < 0, 0 otherwise
|
||||||
|
func Sign(value float64) float64 {
|
||||||
|
if value > 0 {
|
||||||
|
return 1
|
||||||
|
} else if value < 0 {
|
||||||
|
return -1
|
||||||
|
} else {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsNegative returns true if value < 0
|
||||||
|
func IsNegative(value float64) bool {
|
||||||
|
return value < 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsPositive returns true if value > 0
|
||||||
|
func IsPositive(value float64) bool {
|
||||||
|
return value > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsNonNegative returns true if value >= 0
|
||||||
|
func IsNonNegative(value float64) bool {
|
||||||
|
return value >= 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsNonPositive returns true if value <= 0
|
||||||
|
func IsNonPositive(value float64) bool {
|
||||||
|
return value <= 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// InRange returns true if value lies between left and right border
|
||||||
|
func InRangeInt(value, left, right interface{}) bool {
|
||||||
|
value64, _ := ToInt(value)
|
||||||
|
left64, _ := ToInt(left)
|
||||||
|
right64, _ := ToInt(right)
|
||||||
|
if left64 > right64 {
|
||||||
|
left64, right64 = right64, left64
|
||||||
|
}
|
||||||
|
return value64 >= left64 && value64 <= right64
|
||||||
|
}
|
||||||
|
|
||||||
|
// InRange returns true if value lies between left and right border
|
||||||
|
func InRangeFloat32(value, left, right float32) bool {
|
||||||
|
if left > right {
|
||||||
|
left, right = right, left
|
||||||
|
}
|
||||||
|
return value >= left && value <= right
|
||||||
|
}
|
||||||
|
|
||||||
|
// InRange returns true if value lies between left and right border
|
||||||
|
func InRangeFloat64(value, left, right float64) bool {
|
||||||
|
if left > right {
|
||||||
|
left, right = right, left
|
||||||
|
}
|
||||||
|
return value >= left && value <= right
|
||||||
|
}
|
||||||
|
|
||||||
|
// InRange returns true if value lies between left and right border, generic type to handle int, float32 or float64, all types must the same type
|
||||||
|
func InRange(value interface{}, left interface{}, right interface{}) bool {
|
||||||
|
|
||||||
|
reflectValue := reflect.TypeOf(value).Kind()
|
||||||
|
reflectLeft := reflect.TypeOf(left).Kind()
|
||||||
|
reflectRight := reflect.TypeOf(right).Kind()
|
||||||
|
|
||||||
|
if reflectValue == reflect.Int && reflectLeft == reflect.Int && reflectRight == reflect.Int {
|
||||||
|
return InRangeInt(value.(int), left.(int), right.(int))
|
||||||
|
} else if reflectValue == reflect.Float32 && reflectLeft == reflect.Float32 && reflectRight == reflect.Float32 {
|
||||||
|
return InRangeFloat32(value.(float32), left.(float32), right.(float32))
|
||||||
|
} else if reflectValue == reflect.Float64 && reflectLeft == reflect.Float64 && reflectRight == reflect.Float64 {
|
||||||
|
return InRangeFloat64(value.(float64), left.(float64), right.(float64))
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsWhole returns true if value is whole number
|
||||||
|
func IsWhole(value float64) bool {
|
||||||
|
return math.Remainder(value, 1) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsNatural returns true if value is natural number (positive and whole)
|
||||||
|
func IsNatural(value float64) bool {
|
||||||
|
return IsWhole(value) && IsPositive(value)
|
||||||
|
}
|
101
src/vendor/github.com/asaskevich/govalidator/patterns.go
generated
vendored
Normal file
101
src/vendor/github.com/asaskevich/govalidator/patterns.go
generated
vendored
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
package govalidator
|
||||||
|
|
||||||
|
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:]]+$"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Used by IsFilePath func
|
||||||
|
const (
|
||||||
|
// Unknown is unresolved OS type
|
||||||
|
Unknown = iota
|
||||||
|
// Win is Windows type
|
||||||
|
Win
|
||||||
|
// Unix is *nix OS types
|
||||||
|
Unix
|
||||||
|
)
|
||||||
|
|
||||||
|
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)
|
||||||
|
)
|
636
src/vendor/github.com/asaskevich/govalidator/types.go
generated
vendored
Normal file
636
src/vendor/github.com/asaskevich/govalidator/types.go
generated
vendored
Normal file
@ -0,0 +1,636 @@
|
|||||||
|
package govalidator
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"regexp"
|
||||||
|
"sort"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Validator is a wrapper for a validator function that returns bool and accepts string.
|
||||||
|
type Validator func(str string) bool
|
||||||
|
|
||||||
|
// CustomTypeValidator is a wrapper for validator functions that returns bool and accepts any type.
|
||||||
|
// The second parameter should be the context (in the case of validating a struct: the whole object being validated).
|
||||||
|
type CustomTypeValidator func(i interface{}, o interface{}) bool
|
||||||
|
|
||||||
|
// ParamValidator is a wrapper for validator functions that accepts additional parameters.
|
||||||
|
type ParamValidator func(str string, params ...string) bool
|
||||||
|
type tagOptionsMap map[string]tagOption
|
||||||
|
|
||||||
|
func (t tagOptionsMap) orderedKeys() []string {
|
||||||
|
var keys []string
|
||||||
|
for k := range t {
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Slice(keys, func(a, b int) bool {
|
||||||
|
return t[keys[a]].order < t[keys[b]].order
|
||||||
|
})
|
||||||
|
|
||||||
|
return keys
|
||||||
|
}
|
||||||
|
|
||||||
|
type tagOption struct {
|
||||||
|
name string
|
||||||
|
customErrorMessage string
|
||||||
|
order int
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnsupportedTypeError is a wrapper for reflect.Type
|
||||||
|
type UnsupportedTypeError struct {
|
||||||
|
Type reflect.Type
|
||||||
|
}
|
||||||
|
|
||||||
|
// stringValues is a slice of reflect.Value holding *reflect.StringValue.
|
||||||
|
// It implements the methods to sort by string.
|
||||||
|
type stringValues []reflect.Value
|
||||||
|
|
||||||
|
// 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,
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParamTagRegexMap maps param tags to their respective regexes.
|
||||||
|
var ParamTagRegexMap = map[string]*regexp.Regexp{
|
||||||
|
"range": regexp.MustCompile("^range\\((\\d+)\\|(\\d+)\\)$"),
|
||||||
|
"length": regexp.MustCompile("^length\\((\\d+)\\|(\\d+)\\)$"),
|
||||||
|
"runelength": regexp.MustCompile("^runelength\\((\\d+)\\|(\\d+)\\)$"),
|
||||||
|
"stringlength": regexp.MustCompile("^stringlength\\((\\d+)\\|(\\d+)\\)$"),
|
||||||
|
"in": regexp.MustCompile(`^in\((.*)\)`),
|
||||||
|
"matches": regexp.MustCompile(`^matches\((.+)\)$`),
|
||||||
|
"rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"),
|
||||||
|
}
|
||||||
|
|
||||||
|
type customTypeTagMap struct {
|
||||||
|
validators map[string]CustomTypeValidator
|
||||||
|
|
||||||
|
sync.RWMutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tm *customTypeTagMap) Get(name string) (CustomTypeValidator, bool) {
|
||||||
|
tm.RLock()
|
||||||
|
defer tm.RUnlock()
|
||||||
|
v, ok := tm.validators[name]
|
||||||
|
return v, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tm *customTypeTagMap) Set(name string, ctv CustomTypeValidator) {
|
||||||
|
tm.Lock()
|
||||||
|
defer tm.Unlock()
|
||||||
|
tm.validators[name] = ctv
|
||||||
|
}
|
||||||
|
|
||||||
|
// CustomTypeTagMap is a map of functions that can be used as tags for ValidateStruct function.
|
||||||
|
// Use this to validate compound or custom types that need to be handled as a whole, e.g.
|
||||||
|
// `type UUID [16]byte` (this would be handled as an array of bytes).
|
||||||
|
var CustomTypeTagMap = &customTypeTagMap{validators: make(map[string]CustomTypeValidator)}
|
||||||
|
|
||||||
|
// TagMap is a map of functions, that can be used as tags for ValidateStruct function.
|
||||||
|
var TagMap = map[string]Validator{
|
||||||
|
"email": IsEmail,
|
||||||
|
"url": IsURL,
|
||||||
|
"dialstring": IsDialString,
|
||||||
|
"requrl": IsRequestURL,
|
||||||
|
"requri": IsRequestURI,
|
||||||
|
"alpha": IsAlpha,
|
||||||
|
"utfletter": IsUTFLetter,
|
||||||
|
"alphanum": IsAlphanumeric,
|
||||||
|
"utfletternum": IsUTFLetterNumeric,
|
||||||
|
"numeric": IsNumeric,
|
||||||
|
"utfnumeric": IsUTFNumeric,
|
||||||
|
"utfdigit": IsUTFDigit,
|
||||||
|
"hexadecimal": IsHexadecimal,
|
||||||
|
"hexcolor": IsHexcolor,
|
||||||
|
"rgbcolor": IsRGBcolor,
|
||||||
|
"lowercase": IsLowerCase,
|
||||||
|
"uppercase": IsUpperCase,
|
||||||
|
"int": IsInt,
|
||||||
|
"float": IsFloat,
|
||||||
|
"null": IsNull,
|
||||||
|
"uuid": IsUUID,
|
||||||
|
"uuidv3": IsUUIDv3,
|
||||||
|
"uuidv4": IsUUIDv4,
|
||||||
|
"uuidv5": IsUUIDv5,
|
||||||
|
"creditcard": IsCreditCard,
|
||||||
|
"isbn10": IsISBN10,
|
||||||
|
"isbn13": IsISBN13,
|
||||||
|
"json": IsJSON,
|
||||||
|
"multibyte": IsMultibyte,
|
||||||
|
"ascii": IsASCII,
|
||||||
|
"printableascii": IsPrintableASCII,
|
||||||
|
"fullwidth": IsFullWidth,
|
||||||
|
"halfwidth": IsHalfWidth,
|
||||||
|
"variablewidth": IsVariableWidth,
|
||||||
|
"base64": IsBase64,
|
||||||
|
"datauri": IsDataURI,
|
||||||
|
"ip": IsIP,
|
||||||
|
"port": IsPort,
|
||||||
|
"ipv4": IsIPv4,
|
||||||
|
"ipv6": IsIPv6,
|
||||||
|
"dns": IsDNSName,
|
||||||
|
"host": IsHost,
|
||||||
|
"mac": IsMAC,
|
||||||
|
"latitude": IsLatitude,
|
||||||
|
"longitude": IsLongitude,
|
||||||
|
"ssn": IsSSN,
|
||||||
|
"semver": IsSemver,
|
||||||
|
"rfc3339": IsRFC3339,
|
||||||
|
"rfc3339WithoutZone": IsRFC3339WithoutZone,
|
||||||
|
"ISO3166Alpha2": IsISO3166Alpha2,
|
||||||
|
"ISO3166Alpha3": IsISO3166Alpha3,
|
||||||
|
"ISO4217": IsISO4217,
|
||||||
|
}
|
||||||
|
|
||||||
|
// ISO3166Entry stores country codes
|
||||||
|
type ISO3166Entry struct {
|
||||||
|
EnglishShortName string
|
||||||
|
FrenchShortName string
|
||||||
|
Alpha2Code string
|
||||||
|
Alpha3Code string
|
||||||
|
Numeric string
|
||||||
|
}
|
||||||
|
|
||||||
|
//ISO3166List based on https://www.iso.org/obp/ui/#search/code/ Code Type "Officially Assigned Codes"
|
||||||
|
var ISO3166List = []ISO3166Entry{
|
||||||
|
{"Afghanistan", "Afghanistan (l')", "AF", "AFG", "004"},
|
||||||
|
{"Albania", "Albanie (l')", "AL", "ALB", "008"},
|
||||||
|
{"Antarctica", "Antarctique (l')", "AQ", "ATA", "010"},
|
||||||
|
{"Algeria", "Algérie (l')", "DZ", "DZA", "012"},
|
||||||
|
{"American Samoa", "Samoa américaines (les)", "AS", "ASM", "016"},
|
||||||
|
{"Andorra", "Andorre (l')", "AD", "AND", "020"},
|
||||||
|
{"Angola", "Angola (l')", "AO", "AGO", "024"},
|
||||||
|
{"Antigua and Barbuda", "Antigua-et-Barbuda", "AG", "ATG", "028"},
|
||||||
|
{"Azerbaijan", "Azerbaïdjan (l')", "AZ", "AZE", "031"},
|
||||||
|
{"Argentina", "Argentine (l')", "AR", "ARG", "032"},
|
||||||
|
{"Australia", "Australie (l')", "AU", "AUS", "036"},
|
||||||
|
{"Austria", "Autriche (l')", "AT", "AUT", "040"},
|
||||||
|
{"Bahamas (the)", "Bahamas (les)", "BS", "BHS", "044"},
|
||||||
|
{"Bahrain", "Bahreïn", "BH", "BHR", "048"},
|
||||||
|
{"Bangladesh", "Bangladesh (le)", "BD", "BGD", "050"},
|
||||||
|
{"Armenia", "Arménie (l')", "AM", "ARM", "051"},
|
||||||
|
{"Barbados", "Barbade (la)", "BB", "BRB", "052"},
|
||||||
|
{"Belgium", "Belgique (la)", "BE", "BEL", "056"},
|
||||||
|
{"Bermuda", "Bermudes (les)", "BM", "BMU", "060"},
|
||||||
|
{"Bhutan", "Bhoutan (le)", "BT", "BTN", "064"},
|
||||||
|
{"Bolivia (Plurinational State of)", "Bolivie (État plurinational de)", "BO", "BOL", "068"},
|
||||||
|
{"Bosnia and Herzegovina", "Bosnie-Herzégovine (la)", "BA", "BIH", "070"},
|
||||||
|
{"Botswana", "Botswana (le)", "BW", "BWA", "072"},
|
||||||
|
{"Bouvet Island", "Bouvet (l'Île)", "BV", "BVT", "074"},
|
||||||
|
{"Brazil", "Brésil (le)", "BR", "BRA", "076"},
|
||||||
|
{"Belize", "Belize (le)", "BZ", "BLZ", "084"},
|
||||||
|
{"British Indian Ocean Territory (the)", "Indien (le Territoire britannique de l'océan)", "IO", "IOT", "086"},
|
||||||
|
{"Solomon Islands", "Salomon (Îles)", "SB", "SLB", "090"},
|
||||||
|
{"Virgin Islands (British)", "Vierges britanniques (les Îles)", "VG", "VGB", "092"},
|
||||||
|
{"Brunei Darussalam", "Brunéi Darussalam (le)", "BN", "BRN", "096"},
|
||||||
|
{"Bulgaria", "Bulgarie (la)", "BG", "BGR", "100"},
|
||||||
|
{"Myanmar", "Myanmar (le)", "MM", "MMR", "104"},
|
||||||
|
{"Burundi", "Burundi (le)", "BI", "BDI", "108"},
|
||||||
|
{"Belarus", "Bélarus (le)", "BY", "BLR", "112"},
|
||||||
|
{"Cambodia", "Cambodge (le)", "KH", "KHM", "116"},
|
||||||
|
{"Cameroon", "Cameroun (le)", "CM", "CMR", "120"},
|
||||||
|
{"Canada", "Canada (le)", "CA", "CAN", "124"},
|
||||||
|
{"Cabo Verde", "Cabo Verde", "CV", "CPV", "132"},
|
||||||
|
{"Cayman Islands (the)", "Caïmans (les Îles)", "KY", "CYM", "136"},
|
||||||
|
{"Central African Republic (the)", "République centrafricaine (la)", "CF", "CAF", "140"},
|
||||||
|
{"Sri Lanka", "Sri Lanka", "LK", "LKA", "144"},
|
||||||
|
{"Chad", "Tchad (le)", "TD", "TCD", "148"},
|
||||||
|
{"Chile", "Chili (le)", "CL", "CHL", "152"},
|
||||||
|
{"China", "Chine (la)", "CN", "CHN", "156"},
|
||||||
|
{"Taiwan (Province of China)", "Taïwan (Province de Chine)", "TW", "TWN", "158"},
|
||||||
|
{"Christmas Island", "Christmas (l'Île)", "CX", "CXR", "162"},
|
||||||
|
{"Cocos (Keeling) Islands (the)", "Cocos (les Îles)/ Keeling (les Îles)", "CC", "CCK", "166"},
|
||||||
|
{"Colombia", "Colombie (la)", "CO", "COL", "170"},
|
||||||
|
{"Comoros (the)", "Comores (les)", "KM", "COM", "174"},
|
||||||
|
{"Mayotte", "Mayotte", "YT", "MYT", "175"},
|
||||||
|
{"Congo (the)", "Congo (le)", "CG", "COG", "178"},
|
||||||
|
{"Congo (the Democratic Republic of the)", "Congo (la République démocratique du)", "CD", "COD", "180"},
|
||||||
|
{"Cook Islands (the)", "Cook (les Îles)", "CK", "COK", "184"},
|
||||||
|
{"Costa Rica", "Costa Rica (le)", "CR", "CRI", "188"},
|
||||||
|
{"Croatia", "Croatie (la)", "HR", "HRV", "191"},
|
||||||
|
{"Cuba", "Cuba", "CU", "CUB", "192"},
|
||||||
|
{"Cyprus", "Chypre", "CY", "CYP", "196"},
|
||||||
|
{"Czech Republic (the)", "tchèque (la République)", "CZ", "CZE", "203"},
|
||||||
|
{"Benin", "Bénin (le)", "BJ", "BEN", "204"},
|
||||||
|
{"Denmark", "Danemark (le)", "DK", "DNK", "208"},
|
||||||
|
{"Dominica", "Dominique (la)", "DM", "DMA", "212"},
|
||||||
|
{"Dominican Republic (the)", "dominicaine (la République)", "DO", "DOM", "214"},
|
||||||
|
{"Ecuador", "Équateur (l')", "EC", "ECU", "218"},
|
||||||
|
{"El Salvador", "El Salvador", "SV", "SLV", "222"},
|
||||||
|
{"Equatorial Guinea", "Guinée équatoriale (la)", "GQ", "GNQ", "226"},
|
||||||
|
{"Ethiopia", "Éthiopie (l')", "ET", "ETH", "231"},
|
||||||
|
{"Eritrea", "Érythrée (l')", "ER", "ERI", "232"},
|
||||||
|
{"Estonia", "Estonie (l')", "EE", "EST", "233"},
|
||||||
|
{"Faroe Islands (the)", "Féroé (les Îles)", "FO", "FRO", "234"},
|
||||||
|
{"Falkland Islands (the) [Malvinas]", "Falkland (les Îles)/Malouines (les Îles)", "FK", "FLK", "238"},
|
||||||
|
{"South Georgia and the South Sandwich Islands", "Géorgie du Sud-et-les Îles Sandwich du Sud (la)", "GS", "SGS", "239"},
|
||||||
|
{"Fiji", "Fidji (les)", "FJ", "FJI", "242"},
|
||||||
|
{"Finland", "Finlande (la)", "FI", "FIN", "246"},
|
||||||
|
{"Åland Islands", "Åland(les Îles)", "AX", "ALA", "248"},
|
||||||
|
{"France", "France (la)", "FR", "FRA", "250"},
|
||||||
|
{"French Guiana", "Guyane française (la )", "GF", "GUF", "254"},
|
||||||
|
{"French Polynesia", "Polynésie française (la)", "PF", "PYF", "258"},
|
||||||
|
{"French Southern Territories (the)", "Terres australes françaises (les)", "TF", "ATF", "260"},
|
||||||
|
{"Djibouti", "Djibouti", "DJ", "DJI", "262"},
|
||||||
|
{"Gabon", "Gabon (le)", "GA", "GAB", "266"},
|
||||||
|
{"Georgia", "Géorgie (la)", "GE", "GEO", "268"},
|
||||||
|
{"Gambia (the)", "Gambie (la)", "GM", "GMB", "270"},
|
||||||
|
{"Palestine, State of", "Palestine, État de", "PS", "PSE", "275"},
|
||||||
|
{"Germany", "Allemagne (l')", "DE", "DEU", "276"},
|
||||||
|
{"Ghana", "Ghana (le)", "GH", "GHA", "288"},
|
||||||
|
{"Gibraltar", "Gibraltar", "GI", "GIB", "292"},
|
||||||
|
{"Kiribati", "Kiribati", "KI", "KIR", "296"},
|
||||||
|
{"Greece", "Grèce (la)", "GR", "GRC", "300"},
|
||||||
|
{"Greenland", "Groenland (le)", "GL", "GRL", "304"},
|
||||||
|
{"Grenada", "Grenade (la)", "GD", "GRD", "308"},
|
||||||
|
{"Guadeloupe", "Guadeloupe (la)", "GP", "GLP", "312"},
|
||||||
|
{"Guam", "Guam", "GU", "GUM", "316"},
|
||||||
|
{"Guatemala", "Guatemala (le)", "GT", "GTM", "320"},
|
||||||
|
{"Guinea", "Guinée (la)", "GN", "GIN", "324"},
|
||||||
|
{"Guyana", "Guyana (le)", "GY", "GUY", "328"},
|
||||||
|
{"Haiti", "Haïti", "HT", "HTI", "332"},
|
||||||
|
{"Heard Island and McDonald Islands", "Heard-et-Îles MacDonald (l'Île)", "HM", "HMD", "334"},
|
||||||
|
{"Holy See (the)", "Saint-Siège (le)", "VA", "VAT", "336"},
|
||||||
|
{"Honduras", "Honduras (le)", "HN", "HND", "340"},
|
||||||
|
{"Hong Kong", "Hong Kong", "HK", "HKG", "344"},
|
||||||
|
{"Hungary", "Hongrie (la)", "HU", "HUN", "348"},
|
||||||
|
{"Iceland", "Islande (l')", "IS", "ISL", "352"},
|
||||||
|
{"India", "Inde (l')", "IN", "IND", "356"},
|
||||||
|
{"Indonesia", "Indonésie (l')", "ID", "IDN", "360"},
|
||||||
|
{"Iran (Islamic Republic of)", "Iran (République Islamique d')", "IR", "IRN", "364"},
|
||||||
|
{"Iraq", "Iraq (l')", "IQ", "IRQ", "368"},
|
||||||
|
{"Ireland", "Irlande (l')", "IE", "IRL", "372"},
|
||||||
|
{"Israel", "Israël", "IL", "ISR", "376"},
|
||||||
|
{"Italy", "Italie (l')", "IT", "ITA", "380"},
|
||||||
|
{"Côte d'Ivoire", "Côte d'Ivoire (la)", "CI", "CIV", "384"},
|
||||||
|
{"Jamaica", "Jamaïque (la)", "JM", "JAM", "388"},
|
||||||
|
{"Japan", "Japon (le)", "JP", "JPN", "392"},
|
||||||
|
{"Kazakhstan", "Kazakhstan (le)", "KZ", "KAZ", "398"},
|
||||||
|
{"Jordan", "Jordanie (la)", "JO", "JOR", "400"},
|
||||||
|
{"Kenya", "Kenya (le)", "KE", "KEN", "404"},
|
||||||
|
{"Korea (the Democratic People's Republic of)", "Corée (la République populaire démocratique de)", "KP", "PRK", "408"},
|
||||||
|
{"Korea (the Republic of)", "Corée (la République de)", "KR", "KOR", "410"},
|
||||||
|
{"Kuwait", "Koweït (le)", "KW", "KWT", "414"},
|
||||||
|
{"Kyrgyzstan", "Kirghizistan (le)", "KG", "KGZ", "417"},
|
||||||
|
{"Lao People's Democratic Republic (the)", "Lao, République démocratique populaire", "LA", "LAO", "418"},
|
||||||
|
{"Lebanon", "Liban (le)", "LB", "LBN", "422"},
|
||||||
|
{"Lesotho", "Lesotho (le)", "LS", "LSO", "426"},
|
||||||
|
{"Latvia", "Lettonie (la)", "LV", "LVA", "428"},
|
||||||
|
{"Liberia", "Libéria (le)", "LR", "LBR", "430"},
|
||||||
|
{"Libya", "Libye (la)", "LY", "LBY", "434"},
|
||||||
|
{"Liechtenstein", "Liechtenstein (le)", "LI", "LIE", "438"},
|
||||||
|
{"Lithuania", "Lituanie (la)", "LT", "LTU", "440"},
|
||||||
|
{"Luxembourg", "Luxembourg (le)", "LU", "LUX", "442"},
|
||||||
|
{"Macao", "Macao", "MO", "MAC", "446"},
|
||||||
|
{"Madagascar", "Madagascar", "MG", "MDG", "450"},
|
||||||
|
{"Malawi", "Malawi (le)", "MW", "MWI", "454"},
|
||||||
|
{"Malaysia", "Malaisie (la)", "MY", "MYS", "458"},
|
||||||
|
{"Maldives", "Maldives (les)", "MV", "MDV", "462"},
|
||||||
|
{"Mali", "Mali (le)", "ML", "MLI", "466"},
|
||||||
|
{"Malta", "Malte", "MT", "MLT", "470"},
|
||||||
|
{"Martinique", "Martinique (la)", "MQ", "MTQ", "474"},
|
||||||
|
{"Mauritania", "Mauritanie (la)", "MR", "MRT", "478"},
|
||||||
|
{"Mauritius", "Maurice", "MU", "MUS", "480"},
|
||||||
|
{"Mexico", "Mexique (le)", "MX", "MEX", "484"},
|
||||||
|
{"Monaco", "Monaco", "MC", "MCO", "492"},
|
||||||
|
{"Mongolia", "Mongolie (la)", "MN", "MNG", "496"},
|
||||||
|
{"Moldova (the Republic of)", "Moldova , République de", "MD", "MDA", "498"},
|
||||||
|
{"Montenegro", "Monténégro (le)", "ME", "MNE", "499"},
|
||||||
|
{"Montserrat", "Montserrat", "MS", "MSR", "500"},
|
||||||
|
{"Morocco", "Maroc (le)", "MA", "MAR", "504"},
|
||||||
|
{"Mozambique", "Mozambique (le)", "MZ", "MOZ", "508"},
|
||||||
|
{"Oman", "Oman", "OM", "OMN", "512"},
|
||||||
|
{"Namibia", "Namibie (la)", "NA", "NAM", "516"},
|
||||||
|
{"Nauru", "Nauru", "NR", "NRU", "520"},
|
||||||
|
{"Nepal", "Népal (le)", "NP", "NPL", "524"},
|
||||||
|
{"Netherlands (the)", "Pays-Bas (les)", "NL", "NLD", "528"},
|
||||||
|
{"Curaçao", "Curaçao", "CW", "CUW", "531"},
|
||||||
|
{"Aruba", "Aruba", "AW", "ABW", "533"},
|
||||||
|
{"Sint Maarten (Dutch part)", "Saint-Martin (partie néerlandaise)", "SX", "SXM", "534"},
|
||||||
|
{"Bonaire, Sint Eustatius and Saba", "Bonaire, Saint-Eustache et Saba", "BQ", "BES", "535"},
|
||||||
|
{"New Caledonia", "Nouvelle-Calédonie (la)", "NC", "NCL", "540"},
|
||||||
|
{"Vanuatu", "Vanuatu (le)", "VU", "VUT", "548"},
|
||||||
|
{"New Zealand", "Nouvelle-Zélande (la)", "NZ", "NZL", "554"},
|
||||||
|
{"Nicaragua", "Nicaragua (le)", "NI", "NIC", "558"},
|
||||||
|
{"Niger (the)", "Niger (le)", "NE", "NER", "562"},
|
||||||
|
{"Nigeria", "Nigéria (le)", "NG", "NGA", "566"},
|
||||||
|
{"Niue", "Niue", "NU", "NIU", "570"},
|
||||||
|
{"Norfolk Island", "Norfolk (l'Île)", "NF", "NFK", "574"},
|
||||||
|
{"Norway", "Norvège (la)", "NO", "NOR", "578"},
|
||||||
|
{"Northern Mariana Islands (the)", "Mariannes du Nord (les Îles)", "MP", "MNP", "580"},
|
||||||
|
{"United States Minor Outlying Islands (the)", "Îles mineures éloignées des États-Unis (les)", "UM", "UMI", "581"},
|
||||||
|
{"Micronesia (Federated States of)", "Micronésie (États fédérés de)", "FM", "FSM", "583"},
|
||||||
|
{"Marshall Islands (the)", "Marshall (Îles)", "MH", "MHL", "584"},
|
||||||
|
{"Palau", "Palaos (les)", "PW", "PLW", "585"},
|
||||||
|
{"Pakistan", "Pakistan (le)", "PK", "PAK", "586"},
|
||||||
|
{"Panama", "Panama (le)", "PA", "PAN", "591"},
|
||||||
|
{"Papua New Guinea", "Papouasie-Nouvelle-Guinée (la)", "PG", "PNG", "598"},
|
||||||
|
{"Paraguay", "Paraguay (le)", "PY", "PRY", "600"},
|
||||||
|
{"Peru", "Pérou (le)", "PE", "PER", "604"},
|
||||||
|
{"Philippines (the)", "Philippines (les)", "PH", "PHL", "608"},
|
||||||
|
{"Pitcairn", "Pitcairn", "PN", "PCN", "612"},
|
||||||
|
{"Poland", "Pologne (la)", "PL", "POL", "616"},
|
||||||
|
{"Portugal", "Portugal (le)", "PT", "PRT", "620"},
|
||||||
|
{"Guinea-Bissau", "Guinée-Bissau (la)", "GW", "GNB", "624"},
|
||||||
|
{"Timor-Leste", "Timor-Leste (le)", "TL", "TLS", "626"},
|
||||||
|
{"Puerto Rico", "Porto Rico", "PR", "PRI", "630"},
|
||||||
|
{"Qatar", "Qatar (le)", "QA", "QAT", "634"},
|
||||||
|
{"Réunion", "Réunion (La)", "RE", "REU", "638"},
|
||||||
|
{"Romania", "Roumanie (la)", "RO", "ROU", "642"},
|
||||||
|
{"Russian Federation (the)", "Russie (la Fédération de)", "RU", "RUS", "643"},
|
||||||
|
{"Rwanda", "Rwanda (le)", "RW", "RWA", "646"},
|
||||||
|
{"Saint Barthélemy", "Saint-Barthélemy", "BL", "BLM", "652"},
|
||||||
|
{"Saint Helena, Ascension and Tristan da Cunha", "Sainte-Hélène, Ascension et Tristan da Cunha", "SH", "SHN", "654"},
|
||||||
|
{"Saint Kitts and Nevis", "Saint-Kitts-et-Nevis", "KN", "KNA", "659"},
|
||||||
|
{"Anguilla", "Anguilla", "AI", "AIA", "660"},
|
||||||
|
{"Saint Lucia", "Sainte-Lucie", "LC", "LCA", "662"},
|
||||||
|
{"Saint Martin (French part)", "Saint-Martin (partie française)", "MF", "MAF", "663"},
|
||||||
|
{"Saint Pierre and Miquelon", "Saint-Pierre-et-Miquelon", "PM", "SPM", "666"},
|
||||||
|
{"Saint Vincent and the Grenadines", "Saint-Vincent-et-les Grenadines", "VC", "VCT", "670"},
|
||||||
|
{"San Marino", "Saint-Marin", "SM", "SMR", "674"},
|
||||||
|
{"Sao Tome and Principe", "Sao Tomé-et-Principe", "ST", "STP", "678"},
|
||||||
|
{"Saudi Arabia", "Arabie saoudite (l')", "SA", "SAU", "682"},
|
||||||
|
{"Senegal", "Sénégal (le)", "SN", "SEN", "686"},
|
||||||
|
{"Serbia", "Serbie (la)", "RS", "SRB", "688"},
|
||||||
|
{"Seychelles", "Seychelles (les)", "SC", "SYC", "690"},
|
||||||
|
{"Sierra Leone", "Sierra Leone (la)", "SL", "SLE", "694"},
|
||||||
|
{"Singapore", "Singapour", "SG", "SGP", "702"},
|
||||||
|
{"Slovakia", "Slovaquie (la)", "SK", "SVK", "703"},
|
||||||
|
{"Viet Nam", "Viet Nam (le)", "VN", "VNM", "704"},
|
||||||
|
{"Slovenia", "Slovénie (la)", "SI", "SVN", "705"},
|
||||||
|
{"Somalia", "Somalie (la)", "SO", "SOM", "706"},
|
||||||
|
{"South Africa", "Afrique du Sud (l')", "ZA", "ZAF", "710"},
|
||||||
|
{"Zimbabwe", "Zimbabwe (le)", "ZW", "ZWE", "716"},
|
||||||
|
{"Spain", "Espagne (l')", "ES", "ESP", "724"},
|
||||||
|
{"South Sudan", "Soudan du Sud (le)", "SS", "SSD", "728"},
|
||||||
|
{"Sudan (the)", "Soudan (le)", "SD", "SDN", "729"},
|
||||||
|
{"Western Sahara*", "Sahara occidental (le)*", "EH", "ESH", "732"},
|
||||||
|
{"Suriname", "Suriname (le)", "SR", "SUR", "740"},
|
||||||
|
{"Svalbard and Jan Mayen", "Svalbard et l'Île Jan Mayen (le)", "SJ", "SJM", "744"},
|
||||||
|
{"Swaziland", "Swaziland (le)", "SZ", "SWZ", "748"},
|
||||||
|
{"Sweden", "Suède (la)", "SE", "SWE", "752"},
|
||||||
|
{"Switzerland", "Suisse (la)", "CH", "CHE", "756"},
|
||||||
|
{"Syrian Arab Republic", "République arabe syrienne (la)", "SY", "SYR", "760"},
|
||||||
|
{"Tajikistan", "Tadjikistan (le)", "TJ", "TJK", "762"},
|
||||||
|
{"Thailand", "Thaïlande (la)", "TH", "THA", "764"},
|
||||||
|
{"Togo", "Togo (le)", "TG", "TGO", "768"},
|
||||||
|
{"Tokelau", "Tokelau (les)", "TK", "TKL", "772"},
|
||||||
|
{"Tonga", "Tonga (les)", "TO", "TON", "776"},
|
||||||
|
{"Trinidad and Tobago", "Trinité-et-Tobago (la)", "TT", "TTO", "780"},
|
||||||
|
{"United Arab Emirates (the)", "Émirats arabes unis (les)", "AE", "ARE", "784"},
|
||||||
|
{"Tunisia", "Tunisie (la)", "TN", "TUN", "788"},
|
||||||
|
{"Turkey", "Turquie (la)", "TR", "TUR", "792"},
|
||||||
|
{"Turkmenistan", "Turkménistan (le)", "TM", "TKM", "795"},
|
||||||
|
{"Turks and Caicos Islands (the)", "Turks-et-Caïcos (les Îles)", "TC", "TCA", "796"},
|
||||||
|
{"Tuvalu", "Tuvalu (les)", "TV", "TUV", "798"},
|
||||||
|
{"Uganda", "Ouganda (l')", "UG", "UGA", "800"},
|
||||||
|
{"Ukraine", "Ukraine (l')", "UA", "UKR", "804"},
|
||||||
|
{"Macedonia (the former Yugoslav Republic of)", "Macédoine (l'ex‑République yougoslave de)", "MK", "MKD", "807"},
|
||||||
|
{"Egypt", "Égypte (l')", "EG", "EGY", "818"},
|
||||||
|
{"United Kingdom of Great Britain and Northern Ireland (the)", "Royaume-Uni de Grande-Bretagne et d'Irlande du Nord (le)", "GB", "GBR", "826"},
|
||||||
|
{"Guernsey", "Guernesey", "GG", "GGY", "831"},
|
||||||
|
{"Jersey", "Jersey", "JE", "JEY", "832"},
|
||||||
|
{"Isle of Man", "Île de Man", "IM", "IMN", "833"},
|
||||||
|
{"Tanzania, United Republic of", "Tanzanie, République-Unie de", "TZ", "TZA", "834"},
|
||||||
|
{"United States of America (the)", "États-Unis d'Amérique (les)", "US", "USA", "840"},
|
||||||
|
{"Virgin Islands (U.S.)", "Vierges des États-Unis (les Îles)", "VI", "VIR", "850"},
|
||||||
|
{"Burkina Faso", "Burkina Faso (le)", "BF", "BFA", "854"},
|
||||||
|
{"Uruguay", "Uruguay (l')", "UY", "URY", "858"},
|
||||||
|
{"Uzbekistan", "Ouzbékistan (l')", "UZ", "UZB", "860"},
|
||||||
|
{"Venezuela (Bolivarian Republic of)", "Venezuela (République bolivarienne du)", "VE", "VEN", "862"},
|
||||||
|
{"Wallis and Futuna", "Wallis-et-Futuna", "WF", "WLF", "876"},
|
||||||
|
{"Samoa", "Samoa (le)", "WS", "WSM", "882"},
|
||||||
|
{"Yemen", "Yémen (le)", "YE", "YEM", "887"},
|
||||||
|
{"Zambia", "Zambie (la)", "ZM", "ZMB", "894"},
|
||||||
|
}
|
||||||
|
|
||||||
|
// ISO4217List is the list of ISO currency codes
|
||||||
|
var ISO4217List = []string{
|
||||||
|
"AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN",
|
||||||
|
"BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BOV", "BRL", "BSD", "BTN", "BWP", "BYN", "BZD",
|
||||||
|
"CAD", "CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "CNY", "COP", "COU", "CRC", "CUC", "CUP", "CVE", "CZK",
|
||||||
|
"DJF", "DKK", "DOP", "DZD",
|
||||||
|
"EGP", "ERN", "ETB", "EUR",
|
||||||
|
"FJD", "FKP",
|
||||||
|
"GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD",
|
||||||
|
"HKD", "HNL", "HRK", "HTG", "HUF",
|
||||||
|
"IDR", "ILS", "INR", "IQD", "IRR", "ISK",
|
||||||
|
"JMD", "JOD", "JPY",
|
||||||
|
"KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT",
|
||||||
|
"LAK", "LBP", "LKR", "LRD", "LSL", "LYD",
|
||||||
|
"MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRO", "MUR", "MVR", "MWK", "MXN", "MXV", "MYR", "MZN",
|
||||||
|
"NAD", "NGN", "NIO", "NOK", "NPR", "NZD",
|
||||||
|
"OMR",
|
||||||
|
"PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG",
|
||||||
|
"QAR",
|
||||||
|
"RON", "RSD", "RUB", "RWF",
|
||||||
|
"SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STD", "SVC", "SYP", "SZL",
|
||||||
|
"THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS",
|
||||||
|
"UAH", "UGX", "USD", "USN", "UYI", "UYU", "UZS",
|
||||||
|
"VEF", "VND", "VUV",
|
||||||
|
"WST",
|
||||||
|
"XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR", "XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "XXX",
|
||||||
|
"YER",
|
||||||
|
"ZAR", "ZMW", "ZWL",
|
||||||
|
}
|
||||||
|
|
||||||
|
// ISO693Entry stores ISO language codes
|
||||||
|
type ISO693Entry struct {
|
||||||
|
Alpha3bCode string
|
||||||
|
Alpha2Code string
|
||||||
|
English string
|
||||||
|
}
|
||||||
|
|
||||||
|
//ISO693List based on http://data.okfn.org/data/core/language-codes/r/language-codes-3b2.json
|
||||||
|
var ISO693List = []ISO693Entry{
|
||||||
|
{Alpha3bCode: "aar", Alpha2Code: "aa", English: "Afar"},
|
||||||
|
{Alpha3bCode: "abk", Alpha2Code: "ab", English: "Abkhazian"},
|
||||||
|
{Alpha3bCode: "afr", Alpha2Code: "af", English: "Afrikaans"},
|
||||||
|
{Alpha3bCode: "aka", Alpha2Code: "ak", English: "Akan"},
|
||||||
|
{Alpha3bCode: "alb", Alpha2Code: "sq", English: "Albanian"},
|
||||||
|
{Alpha3bCode: "amh", Alpha2Code: "am", English: "Amharic"},
|
||||||
|
{Alpha3bCode: "ara", Alpha2Code: "ar", English: "Arabic"},
|
||||||
|
{Alpha3bCode: "arg", Alpha2Code: "an", English: "Aragonese"},
|
||||||
|
{Alpha3bCode: "arm", Alpha2Code: "hy", English: "Armenian"},
|
||||||
|
{Alpha3bCode: "asm", Alpha2Code: "as", English: "Assamese"},
|
||||||
|
{Alpha3bCode: "ava", Alpha2Code: "av", English: "Avaric"},
|
||||||
|
{Alpha3bCode: "ave", Alpha2Code: "ae", English: "Avestan"},
|
||||||
|
{Alpha3bCode: "aym", Alpha2Code: "ay", English: "Aymara"},
|
||||||
|
{Alpha3bCode: "aze", Alpha2Code: "az", English: "Azerbaijani"},
|
||||||
|
{Alpha3bCode: "bak", Alpha2Code: "ba", English: "Bashkir"},
|
||||||
|
{Alpha3bCode: "bam", Alpha2Code: "bm", English: "Bambara"},
|
||||||
|
{Alpha3bCode: "baq", Alpha2Code: "eu", English: "Basque"},
|
||||||
|
{Alpha3bCode: "bel", Alpha2Code: "be", English: "Belarusian"},
|
||||||
|
{Alpha3bCode: "ben", Alpha2Code: "bn", English: "Bengali"},
|
||||||
|
{Alpha3bCode: "bih", Alpha2Code: "bh", English: "Bihari languages"},
|
||||||
|
{Alpha3bCode: "bis", Alpha2Code: "bi", English: "Bislama"},
|
||||||
|
{Alpha3bCode: "bos", Alpha2Code: "bs", English: "Bosnian"},
|
||||||
|
{Alpha3bCode: "bre", Alpha2Code: "br", English: "Breton"},
|
||||||
|
{Alpha3bCode: "bul", Alpha2Code: "bg", English: "Bulgarian"},
|
||||||
|
{Alpha3bCode: "bur", Alpha2Code: "my", English: "Burmese"},
|
||||||
|
{Alpha3bCode: "cat", Alpha2Code: "ca", English: "Catalan; Valencian"},
|
||||||
|
{Alpha3bCode: "cha", Alpha2Code: "ch", English: "Chamorro"},
|
||||||
|
{Alpha3bCode: "che", Alpha2Code: "ce", English: "Chechen"},
|
||||||
|
{Alpha3bCode: "chi", Alpha2Code: "zh", English: "Chinese"},
|
||||||
|
{Alpha3bCode: "chu", Alpha2Code: "cu", English: "Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic"},
|
||||||
|
{Alpha3bCode: "chv", Alpha2Code: "cv", English: "Chuvash"},
|
||||||
|
{Alpha3bCode: "cor", Alpha2Code: "kw", English: "Cornish"},
|
||||||
|
{Alpha3bCode: "cos", Alpha2Code: "co", English: "Corsican"},
|
||||||
|
{Alpha3bCode: "cre", Alpha2Code: "cr", English: "Cree"},
|
||||||
|
{Alpha3bCode: "cze", Alpha2Code: "cs", English: "Czech"},
|
||||||
|
{Alpha3bCode: "dan", Alpha2Code: "da", English: "Danish"},
|
||||||
|
{Alpha3bCode: "div", Alpha2Code: "dv", English: "Divehi; Dhivehi; Maldivian"},
|
||||||
|
{Alpha3bCode: "dut", Alpha2Code: "nl", English: "Dutch; Flemish"},
|
||||||
|
{Alpha3bCode: "dzo", Alpha2Code: "dz", English: "Dzongkha"},
|
||||||
|
{Alpha3bCode: "eng", Alpha2Code: "en", English: "English"},
|
||||||
|
{Alpha3bCode: "epo", Alpha2Code: "eo", English: "Esperanto"},
|
||||||
|
{Alpha3bCode: "est", Alpha2Code: "et", English: "Estonian"},
|
||||||
|
{Alpha3bCode: "ewe", Alpha2Code: "ee", English: "Ewe"},
|
||||||
|
{Alpha3bCode: "fao", Alpha2Code: "fo", English: "Faroese"},
|
||||||
|
{Alpha3bCode: "fij", Alpha2Code: "fj", English: "Fijian"},
|
||||||
|
{Alpha3bCode: "fin", Alpha2Code: "fi", English: "Finnish"},
|
||||||
|
{Alpha3bCode: "fre", Alpha2Code: "fr", English: "French"},
|
||||||
|
{Alpha3bCode: "fry", Alpha2Code: "fy", English: "Western Frisian"},
|
||||||
|
{Alpha3bCode: "ful", Alpha2Code: "ff", English: "Fulah"},
|
||||||
|
{Alpha3bCode: "geo", Alpha2Code: "ka", English: "Georgian"},
|
||||||
|
{Alpha3bCode: "ger", Alpha2Code: "de", English: "German"},
|
||||||
|
{Alpha3bCode: "gla", Alpha2Code: "gd", English: "Gaelic; Scottish Gaelic"},
|
||||||
|
{Alpha3bCode: "gle", Alpha2Code: "ga", English: "Irish"},
|
||||||
|
{Alpha3bCode: "glg", Alpha2Code: "gl", English: "Galician"},
|
||||||
|
{Alpha3bCode: "glv", Alpha2Code: "gv", English: "Manx"},
|
||||||
|
{Alpha3bCode: "gre", Alpha2Code: "el", English: "Greek, Modern (1453-)"},
|
||||||
|
{Alpha3bCode: "grn", Alpha2Code: "gn", English: "Guarani"},
|
||||||
|
{Alpha3bCode: "guj", Alpha2Code: "gu", English: "Gujarati"},
|
||||||
|
{Alpha3bCode: "hat", Alpha2Code: "ht", English: "Haitian; Haitian Creole"},
|
||||||
|
{Alpha3bCode: "hau", Alpha2Code: "ha", English: "Hausa"},
|
||||||
|
{Alpha3bCode: "heb", Alpha2Code: "he", English: "Hebrew"},
|
||||||
|
{Alpha3bCode: "her", Alpha2Code: "hz", English: "Herero"},
|
||||||
|
{Alpha3bCode: "hin", Alpha2Code: "hi", English: "Hindi"},
|
||||||
|
{Alpha3bCode: "hmo", Alpha2Code: "ho", English: "Hiri Motu"},
|
||||||
|
{Alpha3bCode: "hrv", Alpha2Code: "hr", English: "Croatian"},
|
||||||
|
{Alpha3bCode: "hun", Alpha2Code: "hu", English: "Hungarian"},
|
||||||
|
{Alpha3bCode: "ibo", Alpha2Code: "ig", English: "Igbo"},
|
||||||
|
{Alpha3bCode: "ice", Alpha2Code: "is", English: "Icelandic"},
|
||||||
|
{Alpha3bCode: "ido", Alpha2Code: "io", English: "Ido"},
|
||||||
|
{Alpha3bCode: "iii", Alpha2Code: "ii", English: "Sichuan Yi; Nuosu"},
|
||||||
|
{Alpha3bCode: "iku", Alpha2Code: "iu", English: "Inuktitut"},
|
||||||
|
{Alpha3bCode: "ile", Alpha2Code: "ie", English: "Interlingue; Occidental"},
|
||||||
|
{Alpha3bCode: "ina", Alpha2Code: "ia", English: "Interlingua (International Auxiliary Language Association)"},
|
||||||
|
{Alpha3bCode: "ind", Alpha2Code: "id", English: "Indonesian"},
|
||||||
|
{Alpha3bCode: "ipk", Alpha2Code: "ik", English: "Inupiaq"},
|
||||||
|
{Alpha3bCode: "ita", Alpha2Code: "it", English: "Italian"},
|
||||||
|
{Alpha3bCode: "jav", Alpha2Code: "jv", English: "Javanese"},
|
||||||
|
{Alpha3bCode: "jpn", Alpha2Code: "ja", English: "Japanese"},
|
||||||
|
{Alpha3bCode: "kal", Alpha2Code: "kl", English: "Kalaallisut; Greenlandic"},
|
||||||
|
{Alpha3bCode: "kan", Alpha2Code: "kn", English: "Kannada"},
|
||||||
|
{Alpha3bCode: "kas", Alpha2Code: "ks", English: "Kashmiri"},
|
||||||
|
{Alpha3bCode: "kau", Alpha2Code: "kr", English: "Kanuri"},
|
||||||
|
{Alpha3bCode: "kaz", Alpha2Code: "kk", English: "Kazakh"},
|
||||||
|
{Alpha3bCode: "khm", Alpha2Code: "km", English: "Central Khmer"},
|
||||||
|
{Alpha3bCode: "kik", Alpha2Code: "ki", English: "Kikuyu; Gikuyu"},
|
||||||
|
{Alpha3bCode: "kin", Alpha2Code: "rw", English: "Kinyarwanda"},
|
||||||
|
{Alpha3bCode: "kir", Alpha2Code: "ky", English: "Kirghiz; Kyrgyz"},
|
||||||
|
{Alpha3bCode: "kom", Alpha2Code: "kv", English: "Komi"},
|
||||||
|
{Alpha3bCode: "kon", Alpha2Code: "kg", English: "Kongo"},
|
||||||
|
{Alpha3bCode: "kor", Alpha2Code: "ko", English: "Korean"},
|
||||||
|
{Alpha3bCode: "kua", Alpha2Code: "kj", English: "Kuanyama; Kwanyama"},
|
||||||
|
{Alpha3bCode: "kur", Alpha2Code: "ku", English: "Kurdish"},
|
||||||
|
{Alpha3bCode: "lao", Alpha2Code: "lo", English: "Lao"},
|
||||||
|
{Alpha3bCode: "lat", Alpha2Code: "la", English: "Latin"},
|
||||||
|
{Alpha3bCode: "lav", Alpha2Code: "lv", English: "Latvian"},
|
||||||
|
{Alpha3bCode: "lim", Alpha2Code: "li", English: "Limburgan; Limburger; Limburgish"},
|
||||||
|
{Alpha3bCode: "lin", Alpha2Code: "ln", English: "Lingala"},
|
||||||
|
{Alpha3bCode: "lit", Alpha2Code: "lt", English: "Lithuanian"},
|
||||||
|
{Alpha3bCode: "ltz", Alpha2Code: "lb", English: "Luxembourgish; Letzeburgesch"},
|
||||||
|
{Alpha3bCode: "lub", Alpha2Code: "lu", English: "Luba-Katanga"},
|
||||||
|
{Alpha3bCode: "lug", Alpha2Code: "lg", English: "Ganda"},
|
||||||
|
{Alpha3bCode: "mac", Alpha2Code: "mk", English: "Macedonian"},
|
||||||
|
{Alpha3bCode: "mah", Alpha2Code: "mh", English: "Marshallese"},
|
||||||
|
{Alpha3bCode: "mal", Alpha2Code: "ml", English: "Malayalam"},
|
||||||
|
{Alpha3bCode: "mao", Alpha2Code: "mi", English: "Maori"},
|
||||||
|
{Alpha3bCode: "mar", Alpha2Code: "mr", English: "Marathi"},
|
||||||
|
{Alpha3bCode: "may", Alpha2Code: "ms", English: "Malay"},
|
||||||
|
{Alpha3bCode: "mlg", Alpha2Code: "mg", English: "Malagasy"},
|
||||||
|
{Alpha3bCode: "mlt", Alpha2Code: "mt", English: "Maltese"},
|
||||||
|
{Alpha3bCode: "mon", Alpha2Code: "mn", English: "Mongolian"},
|
||||||
|
{Alpha3bCode: "nau", Alpha2Code: "na", English: "Nauru"},
|
||||||
|
{Alpha3bCode: "nav", Alpha2Code: "nv", English: "Navajo; Navaho"},
|
||||||
|
{Alpha3bCode: "nbl", Alpha2Code: "nr", English: "Ndebele, South; South Ndebele"},
|
||||||
|
{Alpha3bCode: "nde", Alpha2Code: "nd", English: "Ndebele, North; North Ndebele"},
|
||||||
|
{Alpha3bCode: "ndo", Alpha2Code: "ng", English: "Ndonga"},
|
||||||
|
{Alpha3bCode: "nep", Alpha2Code: "ne", English: "Nepali"},
|
||||||
|
{Alpha3bCode: "nno", Alpha2Code: "nn", English: "Norwegian Nynorsk; Nynorsk, Norwegian"},
|
||||||
|
{Alpha3bCode: "nob", Alpha2Code: "nb", English: "Bokmål, Norwegian; Norwegian Bokmål"},
|
||||||
|
{Alpha3bCode: "nor", Alpha2Code: "no", English: "Norwegian"},
|
||||||
|
{Alpha3bCode: "nya", Alpha2Code: "ny", English: "Chichewa; Chewa; Nyanja"},
|
||||||
|
{Alpha3bCode: "oci", Alpha2Code: "oc", English: "Occitan (post 1500); Provençal"},
|
||||||
|
{Alpha3bCode: "oji", Alpha2Code: "oj", English: "Ojibwa"},
|
||||||
|
{Alpha3bCode: "ori", Alpha2Code: "or", English: "Oriya"},
|
||||||
|
{Alpha3bCode: "orm", Alpha2Code: "om", English: "Oromo"},
|
||||||
|
{Alpha3bCode: "oss", Alpha2Code: "os", English: "Ossetian; Ossetic"},
|
||||||
|
{Alpha3bCode: "pan", Alpha2Code: "pa", English: "Panjabi; Punjabi"},
|
||||||
|
{Alpha3bCode: "per", Alpha2Code: "fa", English: "Persian"},
|
||||||
|
{Alpha3bCode: "pli", Alpha2Code: "pi", English: "Pali"},
|
||||||
|
{Alpha3bCode: "pol", Alpha2Code: "pl", English: "Polish"},
|
||||||
|
{Alpha3bCode: "por", Alpha2Code: "pt", English: "Portuguese"},
|
||||||
|
{Alpha3bCode: "pus", Alpha2Code: "ps", English: "Pushto; Pashto"},
|
||||||
|
{Alpha3bCode: "que", Alpha2Code: "qu", English: "Quechua"},
|
||||||
|
{Alpha3bCode: "roh", Alpha2Code: "rm", English: "Romansh"},
|
||||||
|
{Alpha3bCode: "rum", Alpha2Code: "ro", English: "Romanian; Moldavian; Moldovan"},
|
||||||
|
{Alpha3bCode: "run", Alpha2Code: "rn", English: "Rundi"},
|
||||||
|
{Alpha3bCode: "rus", Alpha2Code: "ru", English: "Russian"},
|
||||||
|
{Alpha3bCode: "sag", Alpha2Code: "sg", English: "Sango"},
|
||||||
|
{Alpha3bCode: "san", Alpha2Code: "sa", English: "Sanskrit"},
|
||||||
|
{Alpha3bCode: "sin", Alpha2Code: "si", English: "Sinhala; Sinhalese"},
|
||||||
|
{Alpha3bCode: "slo", Alpha2Code: "sk", English: "Slovak"},
|
||||||
|
{Alpha3bCode: "slv", Alpha2Code: "sl", English: "Slovenian"},
|
||||||
|
{Alpha3bCode: "sme", Alpha2Code: "se", English: "Northern Sami"},
|
||||||
|
{Alpha3bCode: "smo", Alpha2Code: "sm", English: "Samoan"},
|
||||||
|
{Alpha3bCode: "sna", Alpha2Code: "sn", English: "Shona"},
|
||||||
|
{Alpha3bCode: "snd", Alpha2Code: "sd", English: "Sindhi"},
|
||||||
|
{Alpha3bCode: "som", Alpha2Code: "so", English: "Somali"},
|
||||||
|
{Alpha3bCode: "sot", Alpha2Code: "st", English: "Sotho, Southern"},
|
||||||
|
{Alpha3bCode: "spa", Alpha2Code: "es", English: "Spanish; Castilian"},
|
||||||
|
{Alpha3bCode: "srd", Alpha2Code: "sc", English: "Sardinian"},
|
||||||
|
{Alpha3bCode: "srp", Alpha2Code: "sr", English: "Serbian"},
|
||||||
|
{Alpha3bCode: "ssw", Alpha2Code: "ss", English: "Swati"},
|
||||||
|
{Alpha3bCode: "sun", Alpha2Code: "su", English: "Sundanese"},
|
||||||
|
{Alpha3bCode: "swa", Alpha2Code: "sw", English: "Swahili"},
|
||||||
|
{Alpha3bCode: "swe", Alpha2Code: "sv", English: "Swedish"},
|
||||||
|
{Alpha3bCode: "tah", Alpha2Code: "ty", English: "Tahitian"},
|
||||||
|
{Alpha3bCode: "tam", Alpha2Code: "ta", English: "Tamil"},
|
||||||
|
{Alpha3bCode: "tat", Alpha2Code: "tt", English: "Tatar"},
|
||||||
|
{Alpha3bCode: "tel", Alpha2Code: "te", English: "Telugu"},
|
||||||
|
{Alpha3bCode: "tgk", Alpha2Code: "tg", English: "Tajik"},
|
||||||
|
{Alpha3bCode: "tgl", Alpha2Code: "tl", English: "Tagalog"},
|
||||||
|
{Alpha3bCode: "tha", Alpha2Code: "th", English: "Thai"},
|
||||||
|
{Alpha3bCode: "tib", Alpha2Code: "bo", English: "Tibetan"},
|
||||||
|
{Alpha3bCode: "tir", Alpha2Code: "ti", English: "Tigrinya"},
|
||||||
|
{Alpha3bCode: "ton", Alpha2Code: "to", English: "Tonga (Tonga Islands)"},
|
||||||
|
{Alpha3bCode: "tsn", Alpha2Code: "tn", English: "Tswana"},
|
||||||
|
{Alpha3bCode: "tso", Alpha2Code: "ts", English: "Tsonga"},
|
||||||
|
{Alpha3bCode: "tuk", Alpha2Code: "tk", English: "Turkmen"},
|
||||||
|
{Alpha3bCode: "tur", Alpha2Code: "tr", English: "Turkish"},
|
||||||
|
{Alpha3bCode: "twi", Alpha2Code: "tw", English: "Twi"},
|
||||||
|
{Alpha3bCode: "uig", Alpha2Code: "ug", English: "Uighur; Uyghur"},
|
||||||
|
{Alpha3bCode: "ukr", Alpha2Code: "uk", English: "Ukrainian"},
|
||||||
|
{Alpha3bCode: "urd", Alpha2Code: "ur", English: "Urdu"},
|
||||||
|
{Alpha3bCode: "uzb", Alpha2Code: "uz", English: "Uzbek"},
|
||||||
|
{Alpha3bCode: "ven", Alpha2Code: "ve", English: "Venda"},
|
||||||
|
{Alpha3bCode: "vie", Alpha2Code: "vi", English: "Vietnamese"},
|
||||||
|
{Alpha3bCode: "vol", Alpha2Code: "vo", English: "Volapük"},
|
||||||
|
{Alpha3bCode: "wel", Alpha2Code: "cy", English: "Welsh"},
|
||||||
|
{Alpha3bCode: "wln", Alpha2Code: "wa", English: "Walloon"},
|
||||||
|
{Alpha3bCode: "wol", Alpha2Code: "wo", English: "Wolof"},
|
||||||
|
{Alpha3bCode: "xho", Alpha2Code: "xh", English: "Xhosa"},
|
||||||
|
{Alpha3bCode: "yid", Alpha2Code: "yi", English: "Yiddish"},
|
||||||
|
{Alpha3bCode: "yor", Alpha2Code: "yo", English: "Yoruba"},
|
||||||
|
{Alpha3bCode: "zha", Alpha2Code: "za", English: "Zhuang; Chuang"},
|
||||||
|
{Alpha3bCode: "zul", Alpha2Code: "zu", English: "Zulu"},
|
||||||
|
}
|
270
src/vendor/github.com/asaskevich/govalidator/utils.go
generated
vendored
Normal file
270
src/vendor/github.com/asaskevich/govalidator/utils.go
generated
vendored
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
package govalidator
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"html"
|
||||||
|
"math"
|
||||||
|
"path"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
"unicode"
|
||||||
|
"unicode/utf8"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Contains check 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)
|
||||||
|
// 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.
|
||||||
|
func LeftTrim(str, chars string) string {
|
||||||
|
if chars == "" {
|
||||||
|
return strings.TrimLeftFunc(str, unicode.IsSpace)
|
||||||
|
}
|
||||||
|
r, _ := regexp.Compile("^[" + chars + "]+")
|
||||||
|
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.
|
||||||
|
func RightTrim(str, chars string) string {
|
||||||
|
if chars == "" {
|
||||||
|
return strings.TrimRightFunc(str, unicode.IsSpace)
|
||||||
|
}
|
||||||
|
r, _ := regexp.Compile("[" + chars + "]+$")
|
||||||
|
return r.ReplaceAllString(str, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trim trim characters from both sides of the input.
|
||||||
|
// If second argument is empty, it's will be remove spaces.
|
||||||
|
func Trim(str, chars string) string {
|
||||||
|
return LeftTrim(RightTrim(str, chars), chars)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WhiteList remove 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.
|
||||||
|
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.
|
||||||
|
// 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 := ""
|
||||||
|
if keepNewLines {
|
||||||
|
chars = "\x00-\x09\x0B\x0C\x0E-\x1F\x7F"
|
||||||
|
} else {
|
||||||
|
chars = "\x00-\x1F\x7F"
|
||||||
|
}
|
||||||
|
return BlackList(str, chars)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReplacePattern replace 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.
|
||||||
|
var Escape = html.EscapeString
|
||||||
|
|
||||||
|
func addSegment(inrune, segment []rune) []rune {
|
||||||
|
if len(segment) == 0 {
|
||||||
|
return inrune
|
||||||
|
}
|
||||||
|
if len(inrune) != 0 {
|
||||||
|
inrune = append(inrune, '_')
|
||||||
|
}
|
||||||
|
inrune = append(inrune, segment...)
|
||||||
|
return inrune
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnderscoreToCamelCase converts from underscore separated form to camel case form.
|
||||||
|
// Ex.: my_func => MyFunc
|
||||||
|
func UnderscoreToCamelCase(s string) string {
|
||||||
|
return strings.Replace(strings.Title(strings.Replace(strings.ToLower(s), "_", " ", -1)), " ", "", -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CamelCaseToUnderscore converts from camel case form to underscore separated form.
|
||||||
|
// Ex.: MyFunc => my_func
|
||||||
|
func CamelCaseToUnderscore(str string) string {
|
||||||
|
var output []rune
|
||||||
|
var segment []rune
|
||||||
|
for _, r := range str {
|
||||||
|
|
||||||
|
// not treat number as separate segment
|
||||||
|
if !unicode.IsLower(r) && string(r) != "_" && !unicode.IsNumber(r) {
|
||||||
|
output = addSegment(output, segment)
|
||||||
|
segment = nil
|
||||||
|
}
|
||||||
|
segment = append(segment, unicode.ToLower(r))
|
||||||
|
}
|
||||||
|
output = addSegment(output, segment)
|
||||||
|
return string(output)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reverse return 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 {
|
||||||
|
r[i], r[j] = r[j], r[i]
|
||||||
|
}
|
||||||
|
return string(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLines split 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
|
||||||
|
func GetLine(s string, index int) (string, error) {
|
||||||
|
lines := GetLines(s)
|
||||||
|
if index < 0 || index >= len(lines) {
|
||||||
|
return "", errors.New("line index out of bounds")
|
||||||
|
}
|
||||||
|
return lines[index], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveTags remove all tags from HTML string
|
||||||
|
func RemoveTags(s string) string {
|
||||||
|
return ReplacePattern(s, "<[^>]*>", "")
|
||||||
|
}
|
||||||
|
|
||||||
|
// SafeFileName return safe string that can be used in file names
|
||||||
|
func SafeFileName(str string) string {
|
||||||
|
name := strings.ToLower(str)
|
||||||
|
name = path.Clean(path.Base(name))
|
||||||
|
name = strings.Trim(name, " ")
|
||||||
|
separators, err := regexp.Compile(`[ &_=+:]`)
|
||||||
|
if err == nil {
|
||||||
|
name = separators.ReplaceAllString(name, "-")
|
||||||
|
}
|
||||||
|
legal, err := regexp.Compile(`[^[:alnum:]-.]`)
|
||||||
|
if err == nil {
|
||||||
|
name = legal.ReplaceAllString(name, "")
|
||||||
|
}
|
||||||
|
for strings.Contains(name, "--") {
|
||||||
|
name = strings.Replace(name, "--", "-", -1)
|
||||||
|
}
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
|
||||||
|
// NormalizeEmail canonicalize an email address.
|
||||||
|
// The local part of the email address is lowercased for all domains; the hostname is always lowercased and
|
||||||
|
// the local part of the email address is always lowercased for hosts that are known to be case-insensitive (currently only GMail).
|
||||||
|
// Normalization follows special rules for known providers: currently, GMail addresses have dots removed in the local part and
|
||||||
|
// are stripped of tags (e.g. some.one+tag@gmail.com becomes someone@gmail.com) and all @googlemail.com addresses are
|
||||||
|
// normalized to @gmail.com.
|
||||||
|
func NormalizeEmail(str string) (string, error) {
|
||||||
|
if !IsEmail(str) {
|
||||||
|
return "", fmt.Errorf("%s is not an email", str)
|
||||||
|
}
|
||||||
|
parts := strings.Split(str, "@")
|
||||||
|
parts[0] = strings.ToLower(parts[0])
|
||||||
|
parts[1] = strings.ToLower(parts[1])
|
||||||
|
if parts[1] == "gmail.com" || parts[1] == "googlemail.com" {
|
||||||
|
parts[1] = "gmail.com"
|
||||||
|
parts[0] = strings.Split(ReplacePattern(parts[0], `\.`, ""), "+")[0]
|
||||||
|
}
|
||||||
|
return strings.Join(parts, "@"), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Truncate a string to the closest length without breaking words.
|
||||||
|
func Truncate(str string, length int, ending string) string {
|
||||||
|
var aftstr, befstr string
|
||||||
|
if len(str) > length {
|
||||||
|
words := strings.Fields(str)
|
||||||
|
before, present := 0, 0
|
||||||
|
for i := range words {
|
||||||
|
befstr = aftstr
|
||||||
|
before = present
|
||||||
|
aftstr = aftstr + words[i] + " "
|
||||||
|
present = len(aftstr)
|
||||||
|
if present > length && i != 0 {
|
||||||
|
if (length - before) < (present - length) {
|
||||||
|
return Trim(befstr, " /\\.,\"'#!?&@+-") + ending
|
||||||
|
}
|
||||||
|
return Trim(aftstr, " /\\.,\"'#!?&@+-") + ending
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
// PadLeft pad left side of 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
|
||||||
|
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
|
||||||
|
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
|
||||||
|
func buildPadStr(str string, padStr string, padLen int, padLeft bool, padRight bool) string {
|
||||||
|
|
||||||
|
// When padded length is less then the current string size
|
||||||
|
if padLen < utf8.RuneCountInString(str) {
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
padLen -= utf8.RuneCountInString(str)
|
||||||
|
|
||||||
|
targetLen := padLen
|
||||||
|
|
||||||
|
targetLenLeft := targetLen
|
||||||
|
targetLenRight := targetLen
|
||||||
|
if padLeft && padRight {
|
||||||
|
targetLenLeft = padLen / 2
|
||||||
|
targetLenRight = padLen - targetLenLeft
|
||||||
|
}
|
||||||
|
|
||||||
|
strToRepeatLen := utf8.RuneCountInString(padStr)
|
||||||
|
|
||||||
|
repeatTimes := int(math.Ceil(float64(targetLen) / float64(strToRepeatLen)))
|
||||||
|
repeatedString := strings.Repeat(padStr, repeatTimes)
|
||||||
|
|
||||||
|
leftSide := ""
|
||||||
|
if padLeft {
|
||||||
|
leftSide = repeatedString[0:targetLenLeft]
|
||||||
|
}
|
||||||
|
|
||||||
|
rightSide := ""
|
||||||
|
if padRight {
|
||||||
|
rightSide = repeatedString[0:targetLenRight]
|
||||||
|
}
|
||||||
|
|
||||||
|
return leftSide + str + rightSide
|
||||||
|
}
|
||||||
|
|
||||||
|
// TruncatingErrorf removes extra args from fmt.Errorf if not formatted in the str object
|
||||||
|
func TruncatingErrorf(str string, args ...interface{}) error {
|
||||||
|
n := strings.Count(str, "%s")
|
||||||
|
return fmt.Errorf(str, args[:n]...)
|
||||||
|
}
|
1278
src/vendor/github.com/asaskevich/govalidator/validator.go
generated
vendored
Normal file
1278
src/vendor/github.com/asaskevich/govalidator/validator.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
15
src/vendor/github.com/asaskevich/govalidator/wercker.yml
generated
vendored
Normal file
15
src/vendor/github.com/asaskevich/govalidator/wercker.yml
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
box: golang
|
||||||
|
build:
|
||||||
|
steps:
|
||||||
|
- setup-go-workspace
|
||||||
|
|
||||||
|
- script:
|
||||||
|
name: go get
|
||||||
|
code: |
|
||||||
|
go version
|
||||||
|
go get -t ./...
|
||||||
|
|
||||||
|
- script:
|
||||||
|
name: go test
|
||||||
|
code: |
|
||||||
|
go test -race ./...
|
5
src/vendor/github.com/go-openapi/analysis/.codecov.yml
generated
vendored
Normal file
5
src/vendor/github.com/go-openapi/analysis/.codecov.yml
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
coverage:
|
||||||
|
status:
|
||||||
|
patch:
|
||||||
|
default:
|
||||||
|
target: 80%
|
5
src/vendor/github.com/go-openapi/analysis/.gitignore
generated
vendored
Normal file
5
src/vendor/github.com/go-openapi/analysis/.gitignore
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
secrets.yml
|
||||||
|
coverage.out
|
||||||
|
coverage.txt
|
||||||
|
*.cov
|
||||||
|
.idea
|
27
src/vendor/github.com/go-openapi/analysis/.golangci.yml
generated
vendored
Normal file
27
src/vendor/github.com/go-openapi/analysis/.golangci.yml
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
linters-settings:
|
||||||
|
govet:
|
||||||
|
check-shadowing: true
|
||||||
|
golint:
|
||||||
|
min-confidence: 0
|
||||||
|
gocyclo:
|
||||||
|
min-complexity: 40
|
||||||
|
maligned:
|
||||||
|
suggest-new: true
|
||||||
|
dupl:
|
||||||
|
threshold: 100
|
||||||
|
goconst:
|
||||||
|
min-len: 2
|
||||||
|
min-occurrences: 4
|
||||||
|
|
||||||
|
linters:
|
||||||
|
enable-all: true
|
||||||
|
disable:
|
||||||
|
- maligned
|
||||||
|
- lll
|
||||||
|
- gochecknoglobals
|
||||||
|
- gochecknoinits
|
||||||
|
# scopelint is useful, but also reports false positives
|
||||||
|
# that unfortunately can't be disabled. So we disable the
|
||||||
|
# linter rather than changing code that works.
|
||||||
|
# see: https://github.com/kyoh86/scopelint/issues/4
|
||||||
|
- scopelint
|
15
src/vendor/github.com/go-openapi/analysis/.travis.yml
generated
vendored
Normal file
15
src/vendor/github.com/go-openapi/analysis/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
|
go:
|
||||||
|
- 1.11.x
|
||||||
|
- 1.12.x
|
||||||
|
install:
|
||||||
|
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
||||||
|
env:
|
||||||
|
- GO111MODULE=on
|
||||||
|
language: go
|
||||||
|
notifications:
|
||||||
|
slack:
|
||||||
|
secure: Sf7kZf7ZGbnwWUMpffHwMu5A0cHkLK2MYY32LNTPj4+/3qC3Ghl7+9v4TSLOqOlCwdRNjOGblAq7s+GDJed6/xgRQl1JtCi1klzZNrYX4q01pgTPvvGcwbBkIYgeMaPeIRcK9OZnud7sRXdttozgTOpytps2U6Js32ip7uj5mHSg2ub0FwoSJwlS6dbezZ8+eDhoha0F/guY99BEwx8Bd+zROrT2TFGsSGOFGN6wFc7moCqTHO/YkWib13a2QNXqOxCCVBy/lt76Wp+JkeFppjHlzs/2lP3EAk13RIUAaesdEUHvIHrzCyNJEd3/+KO2DzsWOYfpktd+KBCvgaYOsoo7ubdT3IROeAegZdCgo/6xgCEsmFc9ZcqCfN5yNx2A+BZ2Vwmpws+bQ1E1+B5HDzzaiLcYfG4X2O210QVGVDLWsv1jqD+uPYeHY2WRfh5ZsIUFvaqgUEnwHwrK44/8REAhQavt1QAj5uJpsRd7CkRVPWRNK+yIky+wgbVUFEchRNmS55E7QWf+W4+4QZkQi7vUTMc9nbTUu2Es9NfvfudOpM2wZbn98fjpb/qq/nRv6Bk+ca+7XD5/IgNLMbWp2ouDdzbiHLCOfDUiHiDJhLfFZx9Bwo7ZwfzeOlbrQX66bx7xRKYmOe4DLrXhNcpbsMa8qbfxlZRCmYbubB/Y8h4=
|
||||||
|
script:
|
||||||
|
- gotestsum -f short-verbose -- -race -timeout=20m -coverprofile=coverage.txt -covermode=atomic ./...
|
74
src/vendor/github.com/go-openapi/analysis/CODE_OF_CONDUCT.md
generated
vendored
Normal file
74
src/vendor/github.com/go-openapi/analysis/CODE_OF_CONDUCT.md
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity and
|
||||||
|
orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at ivan+abuse@flanders.co.nz. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/4/
|
202
src/vendor/github.com/go-openapi/analysis/LICENSE
generated
vendored
Normal file
202
src/vendor/github.com/go-openapi/analysis/LICENSE
generated
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
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
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
9
src/vendor/github.com/go-openapi/analysis/README.md
generated
vendored
Normal file
9
src/vendor/github.com/go-openapi/analysis/README.md
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# OpenAPI initiative analysis [![Build Status](https://travis-ci.org/go-openapi/analysis.svg?branch=master)](https://travis-ci.org/go-openapi/analysis) [![Build status](https://ci.appveyor.com/api/projects/status/x377t5o9ennm847o/branch/master?svg=true)](https://ci.appveyor.com/project/casualjim/go-openapi/analysis/branch/master) [![codecov](https://codecov.io/gh/go-openapi/analysis/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/analysis)
|
||||||
|
[![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io)
|
||||||
|
[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/analysis/master/LICENSE)
|
||||||
|
[![GoDoc](https://godoc.org/github.com/go-openapi/analysis?status.svg)](http://godoc.org/github.com/go-openapi/analysis)
|
||||||
|
[![GolangCI](https://golangci.com/badges/github.com/go-openapi/analysis.svg)](https://golangci.com)
|
||||||
|
[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/analysis)](https://goreportcard.com/report/github.com/go-openapi/analysis)
|
||||||
|
|
||||||
|
|
||||||
|
A foundational library to analyze an OAI specification document for easier reasoning about the content.
|
970
src/vendor/github.com/go-openapi/analysis/analyzer.go
generated
vendored
Normal file
970
src/vendor/github.com/go-openapi/analysis/analyzer.go
generated
vendored
Normal file
@ -0,0 +1,970 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package analysis
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
slashpath "path"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-openapi/jsonpointer"
|
||||||
|
"github.com/go-openapi/spec"
|
||||||
|
"github.com/go-openapi/swag"
|
||||||
|
)
|
||||||
|
|
||||||
|
type referenceAnalysis struct {
|
||||||
|
schemas map[string]spec.Ref
|
||||||
|
responses map[string]spec.Ref
|
||||||
|
parameters map[string]spec.Ref
|
||||||
|
items map[string]spec.Ref
|
||||||
|
headerItems map[string]spec.Ref
|
||||||
|
parameterItems map[string]spec.Ref
|
||||||
|
allRefs map[string]spec.Ref
|
||||||
|
pathItems map[string]spec.Ref
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *referenceAnalysis) addRef(key string, ref spec.Ref) {
|
||||||
|
r.allRefs["#"+key] = ref
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *referenceAnalysis) addItemsRef(key string, items *spec.Items, location string) {
|
||||||
|
r.items["#"+key] = items.Ref
|
||||||
|
r.addRef(key, items.Ref)
|
||||||
|
if location == "header" {
|
||||||
|
// NOTE: in swagger 2.0, headers and parameters (but not body param schemas) are simple schemas
|
||||||
|
// and $ref are not supported here. However it is possible to analyze this.
|
||||||
|
r.headerItems["#"+key] = items.Ref
|
||||||
|
} else {
|
||||||
|
r.parameterItems["#"+key] = items.Ref
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *referenceAnalysis) addSchemaRef(key string, ref SchemaRef) {
|
||||||
|
r.schemas["#"+key] = ref.Schema.Ref
|
||||||
|
r.addRef(key, ref.Schema.Ref)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *referenceAnalysis) addResponseRef(key string, resp *spec.Response) {
|
||||||
|
r.responses["#"+key] = resp.Ref
|
||||||
|
r.addRef(key, resp.Ref)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *referenceAnalysis) addParamRef(key string, param *spec.Parameter) {
|
||||||
|
r.parameters["#"+key] = param.Ref
|
||||||
|
r.addRef(key, param.Ref)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *referenceAnalysis) addPathItemRef(key string, pathItem *spec.PathItem) {
|
||||||
|
r.pathItems["#"+key] = pathItem.Ref
|
||||||
|
r.addRef(key, pathItem.Ref)
|
||||||
|
}
|
||||||
|
|
||||||
|
type patternAnalysis struct {
|
||||||
|
parameters map[string]string
|
||||||
|
headers map[string]string
|
||||||
|
items map[string]string
|
||||||
|
schemas map[string]string
|
||||||
|
allPatterns map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *patternAnalysis) addPattern(key, pattern string) {
|
||||||
|
p.allPatterns["#"+key] = pattern
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *patternAnalysis) addParameterPattern(key, pattern string) {
|
||||||
|
p.parameters["#"+key] = pattern
|
||||||
|
p.addPattern(key, pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *patternAnalysis) addHeaderPattern(key, pattern string) {
|
||||||
|
p.headers["#"+key] = pattern
|
||||||
|
p.addPattern(key, pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *patternAnalysis) addItemsPattern(key, pattern string) {
|
||||||
|
p.items["#"+key] = pattern
|
||||||
|
p.addPattern(key, pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *patternAnalysis) addSchemaPattern(key, pattern string) {
|
||||||
|
p.schemas["#"+key] = pattern
|
||||||
|
p.addPattern(key, pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
type enumAnalysis struct {
|
||||||
|
parameters map[string][]interface{}
|
||||||
|
headers map[string][]interface{}
|
||||||
|
items map[string][]interface{}
|
||||||
|
schemas map[string][]interface{}
|
||||||
|
allEnums map[string][]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *enumAnalysis) addEnum(key string, enum []interface{}) {
|
||||||
|
p.allEnums["#"+key] = enum
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *enumAnalysis) addParameterEnum(key string, enum []interface{}) {
|
||||||
|
p.parameters["#"+key] = enum
|
||||||
|
p.addEnum(key, enum)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *enumAnalysis) addHeaderEnum(key string, enum []interface{}) {
|
||||||
|
p.headers["#"+key] = enum
|
||||||
|
p.addEnum(key, enum)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *enumAnalysis) addItemsEnum(key string, enum []interface{}) {
|
||||||
|
p.items["#"+key] = enum
|
||||||
|
p.addEnum(key, enum)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *enumAnalysis) addSchemaEnum(key string, enum []interface{}) {
|
||||||
|
p.schemas["#"+key] = enum
|
||||||
|
p.addEnum(key, enum)
|
||||||
|
}
|
||||||
|
|
||||||
|
// New takes a swagger spec object and returns an analyzed spec document.
|
||||||
|
// The analyzed document contains a number of indices that make it easier to
|
||||||
|
// reason about semantics of a swagger specification for use in code generation
|
||||||
|
// or validation etc.
|
||||||
|
func New(doc *spec.Swagger) *Spec {
|
||||||
|
a := &Spec{
|
||||||
|
spec: doc,
|
||||||
|
references: referenceAnalysis{},
|
||||||
|
patterns: patternAnalysis{},
|
||||||
|
enums: enumAnalysis{},
|
||||||
|
}
|
||||||
|
a.reset()
|
||||||
|
a.initialize()
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spec is an analyzed specification object. It takes a swagger spec object and turns it into a registry
|
||||||
|
// with a bunch of utility methods to act on the information in the spec.
|
||||||
|
type Spec struct {
|
||||||
|
spec *spec.Swagger
|
||||||
|
consumes map[string]struct{}
|
||||||
|
produces map[string]struct{}
|
||||||
|
authSchemes map[string]struct{}
|
||||||
|
operations map[string]map[string]*spec.Operation
|
||||||
|
references referenceAnalysis
|
||||||
|
patterns patternAnalysis
|
||||||
|
enums enumAnalysis
|
||||||
|
allSchemas map[string]SchemaRef
|
||||||
|
allOfs map[string]SchemaRef
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Spec) reset() {
|
||||||
|
s.consumes = make(map[string]struct{}, 150)
|
||||||
|
s.produces = make(map[string]struct{}, 150)
|
||||||
|
s.authSchemes = make(map[string]struct{}, 150)
|
||||||
|
s.operations = make(map[string]map[string]*spec.Operation, 150)
|
||||||
|
s.allSchemas = make(map[string]SchemaRef, 150)
|
||||||
|
s.allOfs = make(map[string]SchemaRef, 150)
|
||||||
|
s.references.schemas = make(map[string]spec.Ref, 150)
|
||||||
|
s.references.pathItems = make(map[string]spec.Ref, 150)
|
||||||
|
s.references.responses = make(map[string]spec.Ref, 150)
|
||||||
|
s.references.parameters = make(map[string]spec.Ref, 150)
|
||||||
|
s.references.items = make(map[string]spec.Ref, 150)
|
||||||
|
s.references.headerItems = make(map[string]spec.Ref, 150)
|
||||||
|
s.references.parameterItems = make(map[string]spec.Ref, 150)
|
||||||
|
s.references.allRefs = make(map[string]spec.Ref, 150)
|
||||||
|
s.patterns.parameters = make(map[string]string, 150)
|
||||||
|
s.patterns.headers = make(map[string]string, 150)
|
||||||
|
s.patterns.items = make(map[string]string, 150)
|
||||||
|
s.patterns.schemas = make(map[string]string, 150)
|
||||||
|
s.patterns.allPatterns = make(map[string]string, 150)
|
||||||
|
s.enums.parameters = make(map[string][]interface{}, 150)
|
||||||
|
s.enums.headers = make(map[string][]interface{}, 150)
|
||||||
|
s.enums.items = make(map[string][]interface{}, 150)
|
||||||
|
s.enums.schemas = make(map[string][]interface{}, 150)
|
||||||
|
s.enums.allEnums = make(map[string][]interface{}, 150)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Spec) reload() {
|
||||||
|
s.reset()
|
||||||
|
s.initialize()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Spec) initialize() {
|
||||||
|
for _, c := range s.spec.Consumes {
|
||||||
|
s.consumes[c] = struct{}{}
|
||||||
|
}
|
||||||
|
for _, c := range s.spec.Produces {
|
||||||
|
s.produces[c] = struct{}{}
|
||||||
|
}
|
||||||
|
for _, ss := range s.spec.Security {
|
||||||
|
for k := range ss {
|
||||||
|
s.authSchemes[k] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for path, pathItem := range s.AllPaths() {
|
||||||
|
s.analyzeOperations(path, &pathItem)
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, parameter := range s.spec.Parameters {
|
||||||
|
refPref := slashpath.Join("/parameters", jsonpointer.Escape(name))
|
||||||
|
if parameter.Items != nil {
|
||||||
|
s.analyzeItems("items", parameter.Items, refPref, "parameter")
|
||||||
|
}
|
||||||
|
if parameter.In == "body" && parameter.Schema != nil {
|
||||||
|
s.analyzeSchema("schema", *parameter.Schema, refPref)
|
||||||
|
}
|
||||||
|
if parameter.Pattern != "" {
|
||||||
|
s.patterns.addParameterPattern(refPref, parameter.Pattern)
|
||||||
|
}
|
||||||
|
if len(parameter.Enum) > 0 {
|
||||||
|
s.enums.addParameterEnum(refPref, parameter.Enum)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, response := range s.spec.Responses {
|
||||||
|
refPref := slashpath.Join("/responses", jsonpointer.Escape(name))
|
||||||
|
for k, v := range response.Headers {
|
||||||
|
hRefPref := slashpath.Join(refPref, "headers", k)
|
||||||
|
if v.Items != nil {
|
||||||
|
s.analyzeItems("items", v.Items, hRefPref, "header")
|
||||||
|
}
|
||||||
|
if v.Pattern != "" {
|
||||||
|
s.patterns.addHeaderPattern(hRefPref, v.Pattern)
|
||||||
|
}
|
||||||
|
if len(v.Enum) > 0 {
|
||||||
|
s.enums.addHeaderEnum(hRefPref, v.Enum)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if response.Schema != nil {
|
||||||
|
s.analyzeSchema("schema", *response.Schema, refPref)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, schema := range s.spec.Definitions {
|
||||||
|
s.analyzeSchema(name, schema, "/definitions")
|
||||||
|
}
|
||||||
|
// TODO: after analyzing all things and flattening schemas etc
|
||||||
|
// resolve all the collected references to their final representations
|
||||||
|
// best put in a separate method because this could get expensive
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Spec) analyzeOperations(path string, pi *spec.PathItem) {
|
||||||
|
// TODO: resolve refs here?
|
||||||
|
// Currently, operations declared via pathItem $ref are known only after expansion
|
||||||
|
op := pi
|
||||||
|
if pi.Ref.String() != "" {
|
||||||
|
key := slashpath.Join("/paths", jsonpointer.Escape(path))
|
||||||
|
s.references.addPathItemRef(key, pi)
|
||||||
|
}
|
||||||
|
s.analyzeOperation("GET", path, op.Get)
|
||||||
|
s.analyzeOperation("PUT", path, op.Put)
|
||||||
|
s.analyzeOperation("POST", path, op.Post)
|
||||||
|
s.analyzeOperation("PATCH", path, op.Patch)
|
||||||
|
s.analyzeOperation("DELETE", path, op.Delete)
|
||||||
|
s.analyzeOperation("HEAD", path, op.Head)
|
||||||
|
s.analyzeOperation("OPTIONS", path, op.Options)
|
||||||
|
for i, param := range op.Parameters {
|
||||||
|
refPref := slashpath.Join("/paths", jsonpointer.Escape(path), "parameters", strconv.Itoa(i))
|
||||||
|
if param.Ref.String() != "" {
|
||||||
|
s.references.addParamRef(refPref, ¶m)
|
||||||
|
}
|
||||||
|
if param.Pattern != "" {
|
||||||
|
s.patterns.addParameterPattern(refPref, param.Pattern)
|
||||||
|
}
|
||||||
|
if len(param.Enum) > 0 {
|
||||||
|
s.enums.addParameterEnum(refPref, param.Enum)
|
||||||
|
}
|
||||||
|
if param.Items != nil {
|
||||||
|
s.analyzeItems("items", param.Items, refPref, "parameter")
|
||||||
|
}
|
||||||
|
if param.Schema != nil {
|
||||||
|
s.analyzeSchema("schema", *param.Schema, refPref)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Spec) analyzeItems(name string, items *spec.Items, prefix, location string) {
|
||||||
|
if items == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
refPref := slashpath.Join(prefix, name)
|
||||||
|
s.analyzeItems(name, items.Items, refPref, location)
|
||||||
|
if items.Ref.String() != "" {
|
||||||
|
s.references.addItemsRef(refPref, items, location)
|
||||||
|
}
|
||||||
|
if items.Pattern != "" {
|
||||||
|
s.patterns.addItemsPattern(refPref, items.Pattern)
|
||||||
|
}
|
||||||
|
if len(items.Enum) > 0 {
|
||||||
|
s.enums.addItemsEnum(refPref, items.Enum)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) {
|
||||||
|
if op == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range op.Consumes {
|
||||||
|
s.consumes[c] = struct{}{}
|
||||||
|
}
|
||||||
|
for _, c := range op.Produces {
|
||||||
|
s.produces[c] = struct{}{}
|
||||||
|
}
|
||||||
|
for _, ss := range op.Security {
|
||||||
|
for k := range ss {
|
||||||
|
s.authSchemes[k] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if _, ok := s.operations[method]; !ok {
|
||||||
|
s.operations[method] = make(map[string]*spec.Operation)
|
||||||
|
}
|
||||||
|
s.operations[method][path] = op
|
||||||
|
prefix := slashpath.Join("/paths", jsonpointer.Escape(path), strings.ToLower(method))
|
||||||
|
for i, param := range op.Parameters {
|
||||||
|
refPref := slashpath.Join(prefix, "parameters", strconv.Itoa(i))
|
||||||
|
if param.Ref.String() != "" {
|
||||||
|
s.references.addParamRef(refPref, ¶m)
|
||||||
|
}
|
||||||
|
if param.Pattern != "" {
|
||||||
|
s.patterns.addParameterPattern(refPref, param.Pattern)
|
||||||
|
}
|
||||||
|
if len(param.Enum) > 0 {
|
||||||
|
s.enums.addParameterEnum(refPref, param.Enum)
|
||||||
|
}
|
||||||
|
s.analyzeItems("items", param.Items, refPref, "parameter")
|
||||||
|
if param.In == "body" && param.Schema != nil {
|
||||||
|
s.analyzeSchema("schema", *param.Schema, refPref)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if op.Responses != nil {
|
||||||
|
if op.Responses.Default != nil {
|
||||||
|
refPref := slashpath.Join(prefix, "responses", "default")
|
||||||
|
if op.Responses.Default.Ref.String() != "" {
|
||||||
|
s.references.addResponseRef(refPref, op.Responses.Default)
|
||||||
|
}
|
||||||
|
for k, v := range op.Responses.Default.Headers {
|
||||||
|
hRefPref := slashpath.Join(refPref, "headers", k)
|
||||||
|
s.analyzeItems("items", v.Items, hRefPref, "header")
|
||||||
|
if v.Pattern != "" {
|
||||||
|
s.patterns.addHeaderPattern(hRefPref, v.Pattern)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if op.Responses.Default.Schema != nil {
|
||||||
|
s.analyzeSchema("schema", *op.Responses.Default.Schema, refPref)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for k, res := range op.Responses.StatusCodeResponses {
|
||||||
|
refPref := slashpath.Join(prefix, "responses", strconv.Itoa(k))
|
||||||
|
if res.Ref.String() != "" {
|
||||||
|
s.references.addResponseRef(refPref, &res)
|
||||||
|
}
|
||||||
|
for k, v := range res.Headers {
|
||||||
|
hRefPref := slashpath.Join(refPref, "headers", k)
|
||||||
|
s.analyzeItems("items", v.Items, hRefPref, "header")
|
||||||
|
if v.Pattern != "" {
|
||||||
|
s.patterns.addHeaderPattern(hRefPref, v.Pattern)
|
||||||
|
}
|
||||||
|
if len(v.Enum) > 0 {
|
||||||
|
s.enums.addHeaderEnum(hRefPref, v.Enum)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if res.Schema != nil {
|
||||||
|
s.analyzeSchema("schema", *res.Schema, refPref)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) {
|
||||||
|
refURI := slashpath.Join(prefix, jsonpointer.Escape(name))
|
||||||
|
schRef := SchemaRef{
|
||||||
|
Name: name,
|
||||||
|
Schema: &schema,
|
||||||
|
Ref: spec.MustCreateRef("#" + refURI),
|
||||||
|
TopLevel: prefix == "/definitions",
|
||||||
|
}
|
||||||
|
|
||||||
|
s.allSchemas["#"+refURI] = schRef
|
||||||
|
|
||||||
|
if schema.Ref.String() != "" {
|
||||||
|
s.references.addSchemaRef(refURI, schRef)
|
||||||
|
}
|
||||||
|
if schema.Pattern != "" {
|
||||||
|
s.patterns.addSchemaPattern(refURI, schema.Pattern)
|
||||||
|
}
|
||||||
|
if len(schema.Enum) > 0 {
|
||||||
|
s.enums.addSchemaEnum(refURI, schema.Enum)
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range schema.Definitions {
|
||||||
|
s.analyzeSchema(k, v, slashpath.Join(refURI, "definitions"))
|
||||||
|
}
|
||||||
|
for k, v := range schema.Properties {
|
||||||
|
s.analyzeSchema(k, v, slashpath.Join(refURI, "properties"))
|
||||||
|
}
|
||||||
|
for k, v := range schema.PatternProperties {
|
||||||
|
// 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"))
|
||||||
|
}
|
||||||
|
for i, v := range schema.AllOf {
|
||||||
|
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 {
|
||||||
|
// 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 {
|
||||||
|
// 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"))
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
if schema.Items != nil {
|
||||||
|
if schema.Items.Schema != nil {
|
||||||
|
s.analyzeSchema("items", *schema.Items.Schema, refURI)
|
||||||
|
}
|
||||||
|
for i, sch := range schema.Items.Schemas {
|
||||||
|
s.analyzeSchema(strconv.Itoa(i), sch, slashpath.Join(refURI, "items"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SecurityRequirement is a representation of a security requirement for an operation
|
||||||
|
type SecurityRequirement struct {
|
||||||
|
Name string
|
||||||
|
Scopes []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// SecurityRequirementsFor gets the security requirements for the operation
|
||||||
|
func (s *Spec) SecurityRequirementsFor(operation *spec.Operation) [][]SecurityRequirement {
|
||||||
|
if s.spec.Security == nil && operation.Security == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
schemes := s.spec.Security
|
||||||
|
if operation.Security != nil {
|
||||||
|
schemes = operation.Security
|
||||||
|
}
|
||||||
|
|
||||||
|
result := [][]SecurityRequirement{}
|
||||||
|
for _, scheme := range schemes {
|
||||||
|
if len(scheme) == 0 {
|
||||||
|
// append a zero object for anonymous
|
||||||
|
result = append(result, []SecurityRequirement{{}})
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var reqs []SecurityRequirement
|
||||||
|
for k, v := range scheme {
|
||||||
|
if v == nil {
|
||||||
|
v = []string{}
|
||||||
|
}
|
||||||
|
reqs = append(reqs, SecurityRequirement{Name: k, Scopes: v})
|
||||||
|
}
|
||||||
|
result = append(result, reqs)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// SecurityDefinitionsForRequirements gets the matching security definitions for a set of requirements
|
||||||
|
func (s *Spec) SecurityDefinitionsForRequirements(requirements []SecurityRequirement) map[string]spec.SecurityScheme {
|
||||||
|
result := make(map[string]spec.SecurityScheme)
|
||||||
|
|
||||||
|
for _, v := range requirements {
|
||||||
|
if definition, ok := s.spec.SecurityDefinitions[v.Name]; ok {
|
||||||
|
if definition != nil {
|
||||||
|
result[v.Name] = *definition
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// SecurityDefinitionsFor gets the matching security definitions for a set of requirements
|
||||||
|
func (s *Spec) SecurityDefinitionsFor(operation *spec.Operation) map[string]spec.SecurityScheme {
|
||||||
|
requirements := s.SecurityRequirementsFor(operation)
|
||||||
|
if len(requirements) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
result := make(map[string]spec.SecurityScheme)
|
||||||
|
for _, reqs := range requirements {
|
||||||
|
for _, v := range reqs {
|
||||||
|
if v.Name == "" {
|
||||||
|
// optional requirement
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, ok := result[v.Name]; ok {
|
||||||
|
// duplicate requirement
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if definition, ok := s.spec.SecurityDefinitions[v.Name]; ok {
|
||||||
|
if definition != nil {
|
||||||
|
result[v.Name] = *definition
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConsumesFor gets the mediatypes for the operation
|
||||||
|
func (s *Spec) ConsumesFor(operation *spec.Operation) []string {
|
||||||
|
|
||||||
|
if len(operation.Consumes) == 0 {
|
||||||
|
cons := make(map[string]struct{}, len(s.spec.Consumes))
|
||||||
|
for _, k := range s.spec.Consumes {
|
||||||
|
cons[k] = struct{}{}
|
||||||
|
}
|
||||||
|
return s.structMapKeys(cons)
|
||||||
|
}
|
||||||
|
|
||||||
|
cons := make(map[string]struct{}, len(operation.Consumes))
|
||||||
|
for _, c := range operation.Consumes {
|
||||||
|
cons[c] = struct{}{}
|
||||||
|
}
|
||||||
|
return s.structMapKeys(cons)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProducesFor gets the mediatypes for the operation
|
||||||
|
func (s *Spec) ProducesFor(operation *spec.Operation) []string {
|
||||||
|
if len(operation.Produces) == 0 {
|
||||||
|
prod := make(map[string]struct{}, len(s.spec.Produces))
|
||||||
|
for _, k := range s.spec.Produces {
|
||||||
|
prod[k] = struct{}{}
|
||||||
|
}
|
||||||
|
return s.structMapKeys(prod)
|
||||||
|
}
|
||||||
|
|
||||||
|
prod := make(map[string]struct{}, len(operation.Produces))
|
||||||
|
for _, c := range operation.Produces {
|
||||||
|
prod[c] = struct{}{}
|
||||||
|
}
|
||||||
|
return s.structMapKeys(prod)
|
||||||
|
}
|
||||||
|
|
||||||
|
func mapKeyFromParam(param *spec.Parameter) string {
|
||||||
|
return fmt.Sprintf("%s#%s", param.In, fieldNameFromParam(param))
|
||||||
|
}
|
||||||
|
|
||||||
|
func fieldNameFromParam(param *spec.Parameter) string {
|
||||||
|
// TODO: this should be x-go-name
|
||||||
|
if nm, ok := param.Extensions.GetString("go-name"); ok {
|
||||||
|
return nm
|
||||||
|
}
|
||||||
|
return swag.ToGoName(param.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrorOnParamFunc is a callback function to be invoked
|
||||||
|
// whenever an error is encountered while resolving references
|
||||||
|
// on parameters.
|
||||||
|
//
|
||||||
|
// This function takes as input the spec.Parameter which triggered the
|
||||||
|
// error and the error itself.
|
||||||
|
//
|
||||||
|
// If the callback function returns false, the calling function should bail.
|
||||||
|
//
|
||||||
|
// If it returns true, the calling function should continue evaluating parameters.
|
||||||
|
// A nil ErrorOnParamFunc must be evaluated as equivalent to panic().
|
||||||
|
type ErrorOnParamFunc func(spec.Parameter, error) bool
|
||||||
|
|
||||||
|
func (s *Spec) paramsAsMap(parameters []spec.Parameter, res map[string]spec.Parameter, callmeOnError ErrorOnParamFunc) {
|
||||||
|
for _, param := range parameters {
|
||||||
|
pr := param
|
||||||
|
if pr.Ref.String() != "" {
|
||||||
|
obj, _, err := pr.Ref.GetPointer().Get(s.spec)
|
||||||
|
if err != nil {
|
||||||
|
if callmeOnError != nil {
|
||||||
|
if callmeOnError(param, fmt.Errorf("invalid reference: %q", pr.Ref.String())) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
panic(fmt.Sprintf("invalid reference: %q", pr.Ref.String()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if objAsParam, ok := obj.(spec.Parameter); ok {
|
||||||
|
pr = objAsParam
|
||||||
|
} else {
|
||||||
|
if callmeOnError != nil {
|
||||||
|
if callmeOnError(param, fmt.Errorf("resolved reference is not a parameter: %q", pr.Ref.String())) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
panic(fmt.Sprintf("resolved reference is not a parameter: %q", pr.Ref.String()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res[mapKeyFromParam(&pr)] = pr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParametersFor the specified operation id.
|
||||||
|
//
|
||||||
|
// Assumes parameters properly resolve references if any and that
|
||||||
|
// such references actually resolve to a parameter object.
|
||||||
|
// Otherwise, panics.
|
||||||
|
func (s *Spec) ParametersFor(operationID string) []spec.Parameter {
|
||||||
|
return s.SafeParametersFor(operationID, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SafeParametersFor the specified operation id.
|
||||||
|
//
|
||||||
|
// Does not assume parameters properly resolve references or that
|
||||||
|
// such references actually resolve to a parameter object.
|
||||||
|
//
|
||||||
|
// Upon error, invoke a ErrorOnParamFunc callback with the erroneous
|
||||||
|
// parameters. If the callback is set to nil, panics upon errors.
|
||||||
|
func (s *Spec) SafeParametersFor(operationID string, callmeOnError ErrorOnParamFunc) []spec.Parameter {
|
||||||
|
gatherParams := func(pi *spec.PathItem, op *spec.Operation) []spec.Parameter {
|
||||||
|
bag := make(map[string]spec.Parameter)
|
||||||
|
s.paramsAsMap(pi.Parameters, bag, callmeOnError)
|
||||||
|
s.paramsAsMap(op.Parameters, bag, callmeOnError)
|
||||||
|
|
||||||
|
var res []spec.Parameter
|
||||||
|
for _, v := range bag {
|
||||||
|
res = append(res, v)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
for _, pi := range s.spec.Paths.Paths {
|
||||||
|
if pi.Get != nil && pi.Get.ID == operationID {
|
||||||
|
return gatherParams(&pi, pi.Get)
|
||||||
|
}
|
||||||
|
if pi.Head != nil && pi.Head.ID == operationID {
|
||||||
|
return gatherParams(&pi, pi.Head)
|
||||||
|
}
|
||||||
|
if pi.Options != nil && pi.Options.ID == operationID {
|
||||||
|
return gatherParams(&pi, pi.Options)
|
||||||
|
}
|
||||||
|
if pi.Post != nil && pi.Post.ID == operationID {
|
||||||
|
return gatherParams(&pi, pi.Post)
|
||||||
|
}
|
||||||
|
if pi.Patch != nil && pi.Patch.ID == operationID {
|
||||||
|
return gatherParams(&pi, pi.Patch)
|
||||||
|
}
|
||||||
|
if pi.Put != nil && pi.Put.ID == operationID {
|
||||||
|
return gatherParams(&pi, pi.Put)
|
||||||
|
}
|
||||||
|
if pi.Delete != nil && pi.Delete.ID == operationID {
|
||||||
|
return gatherParams(&pi, pi.Delete)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParamsFor the specified method and path. Aggregates them with the defaults etc, so it's all the params that
|
||||||
|
// apply for the method and path.
|
||||||
|
//
|
||||||
|
// Assumes parameters properly resolve references if any and that
|
||||||
|
// such references actually resolve to a parameter object.
|
||||||
|
// Otherwise, panics.
|
||||||
|
func (s *Spec) ParamsFor(method, path string) map[string]spec.Parameter {
|
||||||
|
return s.SafeParamsFor(method, path, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SafeParamsFor the specified method and path. Aggregates them with the defaults etc, so it's all the params that
|
||||||
|
// apply for the method and path.
|
||||||
|
//
|
||||||
|
// Does not assume parameters properly resolve references or that
|
||||||
|
// such references actually resolve to a parameter object.
|
||||||
|
//
|
||||||
|
// Upon error, invoke a ErrorOnParamFunc callback with the erroneous
|
||||||
|
// parameters. If the callback is set to nil, panics upon errors.
|
||||||
|
func (s *Spec) SafeParamsFor(method, path string, callmeOnError ErrorOnParamFunc) map[string]spec.Parameter {
|
||||||
|
res := make(map[string]spec.Parameter)
|
||||||
|
if pi, ok := s.spec.Paths.Paths[path]; ok {
|
||||||
|
s.paramsAsMap(pi.Parameters, res, callmeOnError)
|
||||||
|
s.paramsAsMap(s.operations[strings.ToUpper(method)][path].Parameters, res, callmeOnError)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// OperationForName gets the operation for the given id
|
||||||
|
func (s *Spec) OperationForName(operationID string) (string, string, *spec.Operation, bool) {
|
||||||
|
for method, pathItem := range s.operations {
|
||||||
|
for path, op := range pathItem {
|
||||||
|
if operationID == op.ID {
|
||||||
|
return method, path, op, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", "", nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// OperationFor the given method and path
|
||||||
|
func (s *Spec) OperationFor(method, path string) (*spec.Operation, bool) {
|
||||||
|
if mp, ok := s.operations[strings.ToUpper(method)]; ok {
|
||||||
|
op, fn := mp[path]
|
||||||
|
return op, fn
|
||||||
|
}
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operations gathers all the operations specified in the spec document
|
||||||
|
func (s *Spec) Operations() map[string]map[string]*spec.Operation {
|
||||||
|
return s.operations
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Spec) structMapKeys(mp map[string]struct{}) []string {
|
||||||
|
if len(mp) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
result := make([]string, 0, len(mp))
|
||||||
|
for k := range mp {
|
||||||
|
result = append(result, k)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllPaths returns all the paths in the swagger spec
|
||||||
|
func (s *Spec) AllPaths() map[string]spec.PathItem {
|
||||||
|
if s.spec == nil || s.spec.Paths == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return s.spec.Paths.Paths
|
||||||
|
}
|
||||||
|
|
||||||
|
// OperationIDs gets all the operation ids based on method an dpath
|
||||||
|
func (s *Spec) OperationIDs() []string {
|
||||||
|
if len(s.operations) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
result := make([]string, 0, len(s.operations))
|
||||||
|
for method, v := range s.operations {
|
||||||
|
for p, o := range v {
|
||||||
|
if o.ID != "" {
|
||||||
|
result = append(result, o.ID)
|
||||||
|
} else {
|
||||||
|
result = append(result, fmt.Sprintf("%s %s", strings.ToUpper(method), p))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// OperationMethodPaths gets all the operation ids based on method an dpath
|
||||||
|
func (s *Spec) OperationMethodPaths() []string {
|
||||||
|
if len(s.operations) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
result := make([]string, 0, len(s.operations))
|
||||||
|
for method, v := range s.operations {
|
||||||
|
for p := range v {
|
||||||
|
result = append(result, fmt.Sprintf("%s %s", strings.ToUpper(method), p))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// RequiredConsumes gets all the distinct consumes that are specified in the specification document
|
||||||
|
func (s *Spec) RequiredConsumes() []string {
|
||||||
|
return s.structMapKeys(s.consumes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RequiredProduces gets all the distinct produces that are specified in the specification document
|
||||||
|
func (s *Spec) RequiredProduces() []string {
|
||||||
|
return s.structMapKeys(s.produces)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RequiredSecuritySchemes gets all the distinct security schemes that are specified in the swagger spec
|
||||||
|
func (s *Spec) RequiredSecuritySchemes() []string {
|
||||||
|
return s.structMapKeys(s.authSchemes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SchemaRef is a reference to a schema
|
||||||
|
type SchemaRef struct {
|
||||||
|
Name string
|
||||||
|
Ref spec.Ref
|
||||||
|
Schema *spec.Schema
|
||||||
|
TopLevel bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// SchemasWithAllOf returns schema references to all schemas that are defined
|
||||||
|
// with an allOf key
|
||||||
|
func (s *Spec) SchemasWithAllOf() (result []SchemaRef) {
|
||||||
|
for _, v := range s.allOfs {
|
||||||
|
result = append(result, v)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllDefinitions returns schema references for all the definitions that were discovered
|
||||||
|
func (s *Spec) AllDefinitions() (result []SchemaRef) {
|
||||||
|
for _, v := range s.allSchemas {
|
||||||
|
result = append(result, v)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllDefinitionReferences returns json refs for all the discovered schemas
|
||||||
|
func (s *Spec) AllDefinitionReferences() (result []string) {
|
||||||
|
for _, v := range s.references.schemas {
|
||||||
|
result = append(result, v.String())
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllParameterReferences returns json refs for all the discovered parameters
|
||||||
|
func (s *Spec) AllParameterReferences() (result []string) {
|
||||||
|
for _, v := range s.references.parameters {
|
||||||
|
result = append(result, v.String())
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllResponseReferences returns json refs for all the discovered responses
|
||||||
|
func (s *Spec) AllResponseReferences() (result []string) {
|
||||||
|
for _, v := range s.references.responses {
|
||||||
|
result = append(result, v.String())
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllPathItemReferences returns the references for all the items
|
||||||
|
func (s *Spec) AllPathItemReferences() (result []string) {
|
||||||
|
for _, v := range s.references.pathItems {
|
||||||
|
result = append(result, v.String())
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllItemsReferences returns the references for all the items in simple schemas (parameters or headers).
|
||||||
|
//
|
||||||
|
// NOTE: since Swagger 2.0 forbids $ref in simple params, this should always yield an empty slice for a valid
|
||||||
|
// Swagger 2.0 spec.
|
||||||
|
func (s *Spec) AllItemsReferences() (result []string) {
|
||||||
|
for _, v := range s.references.items {
|
||||||
|
result = append(result, v.String())
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllReferences returns all the references found in the document, with possible duplicates
|
||||||
|
func (s *Spec) AllReferences() (result []string) {
|
||||||
|
for _, v := range s.references.allRefs {
|
||||||
|
result = append(result, v.String())
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllRefs returns all the unique references found in the document
|
||||||
|
func (s *Spec) AllRefs() (result []spec.Ref) {
|
||||||
|
set := make(map[string]struct{})
|
||||||
|
for _, v := range s.references.allRefs {
|
||||||
|
a := v.String()
|
||||||
|
if a == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, ok := set[a]; !ok {
|
||||||
|
set[a] = struct{}{}
|
||||||
|
result = append(result, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func cloneStringMap(source map[string]string) map[string]string {
|
||||||
|
res := make(map[string]string, len(source))
|
||||||
|
for k, v := range source {
|
||||||
|
res[k] = v
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func cloneEnumMap(source map[string][]interface{}) map[string][]interface{} {
|
||||||
|
res := make(map[string][]interface{}, len(source))
|
||||||
|
for k, v := range source {
|
||||||
|
res[k] = v
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParameterPatterns returns all the patterns found in parameters
|
||||||
|
// the map is cloned to avoid accidental changes
|
||||||
|
func (s *Spec) ParameterPatterns() map[string]string {
|
||||||
|
return cloneStringMap(s.patterns.parameters)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HeaderPatterns returns all the patterns found in response headers
|
||||||
|
// the map is cloned to avoid accidental changes
|
||||||
|
func (s *Spec) HeaderPatterns() map[string]string {
|
||||||
|
return cloneStringMap(s.patterns.headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ItemsPatterns returns all the patterns found in simple array items
|
||||||
|
// the map is cloned to avoid accidental changes
|
||||||
|
func (s *Spec) ItemsPatterns() map[string]string {
|
||||||
|
return cloneStringMap(s.patterns.items)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SchemaPatterns returns all the patterns found in schemas
|
||||||
|
// the map is cloned to avoid accidental changes
|
||||||
|
func (s *Spec) SchemaPatterns() map[string]string {
|
||||||
|
return cloneStringMap(s.patterns.schemas)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllPatterns returns all the patterns found in the spec
|
||||||
|
// the map is cloned to avoid accidental changes
|
||||||
|
func (s *Spec) AllPatterns() map[string]string {
|
||||||
|
return cloneStringMap(s.patterns.allPatterns)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParameterEnums returns all the enums found in parameters
|
||||||
|
// the map is cloned to avoid accidental changes
|
||||||
|
func (s *Spec) ParameterEnums() map[string][]interface{} {
|
||||||
|
return cloneEnumMap(s.enums.parameters)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HeaderEnums returns all the enums found in response headers
|
||||||
|
// the map is cloned to avoid accidental changes
|
||||||
|
func (s *Spec) HeaderEnums() map[string][]interface{} {
|
||||||
|
return cloneEnumMap(s.enums.headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ItemsEnums returns all the enums found in simple array items
|
||||||
|
// the map is cloned to avoid accidental changes
|
||||||
|
func (s *Spec) ItemsEnums() map[string][]interface{} {
|
||||||
|
return cloneEnumMap(s.enums.items)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SchemaEnums returns all the enums found in schemas
|
||||||
|
// the map is cloned to avoid accidental changes
|
||||||
|
func (s *Spec) SchemaEnums() map[string][]interface{} {
|
||||||
|
return cloneEnumMap(s.enums.schemas)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllEnums returns all the enums found in the spec
|
||||||
|
// the map is cloned to avoid accidental changes
|
||||||
|
func (s *Spec) AllEnums() map[string][]interface{} {
|
||||||
|
return cloneEnumMap(s.enums.allEnums)
|
||||||
|
}
|
33
src/vendor/github.com/go-openapi/analysis/appveyor.yml
generated
vendored
Normal file
33
src/vendor/github.com/go-openapi/analysis/appveyor.yml
generated
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
version: "0.1.{build}"
|
||||||
|
|
||||||
|
clone_folder: C:\go-openapi\analysis
|
||||||
|
shallow_clone: true # for startup speed
|
||||||
|
pull_requests:
|
||||||
|
do_not_increment_build_number: true
|
||||||
|
|
||||||
|
#skip_tags: true
|
||||||
|
#skip_branch_with_pr: true
|
||||||
|
|
||||||
|
# appveyor.yml
|
||||||
|
build: off
|
||||||
|
|
||||||
|
environment:
|
||||||
|
GOPATH: c:\gopath
|
||||||
|
|
||||||
|
stack: go 1.12
|
||||||
|
|
||||||
|
test_script:
|
||||||
|
- go test -v -timeout 20m ./...
|
||||||
|
#artifacts:
|
||||||
|
# - path: '%GOPATH%\bin\*.exe'
|
||||||
|
deploy: off
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
- provider: Slack
|
||||||
|
incoming_webhook: https://hooks.slack.com/services/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
|
||||||
|
auth_token:
|
||||||
|
secure: Sf7kZf7ZGbnwWUMpffHwMu5A0cHkLK2MYY32LNTPj4+/3qC3Ghl7+9v4TSLOqOlCwdRNjOGblAq7s+GDJed6/xgRQl1JtCi1klzZNrYX4q01pgTPvvGcwbBkIYgeMaPeIRcK9OZnud7sRXdttozgTOpytps2U6Js32ip7uj5mHSg2ub0FwoSJwlS6dbezZ8+eDhoha0F/guY99BEwx8Bd+zROrT2TFGsSGOFGN6wFc7moCqTHO/YkWib13a2QNXqOxCCVBy/lt76Wp+JkeFppjHlzs/2lP3EAk13RIUAaesdEUHvIHrzCyNJEd3/+KO2DzsWOYfpktd+KBCvgaYOsoo7ubdT3IROeAegZdCgo/6xgCEsmFc9ZcqCfN5yNx2A+BZ2Vwmpws+bQ1E1+B5HDzzaiLcYfG4X2O210QVGVDLWsv1jqD+uPYeHY2WRfh5ZsIUFvaqgUEnwHwrK44/8REAhQavt1QAj5uJpsRd7CkRVPWRNK+yIky+wgbVUFEchRNmS55E7QWf+W4+4QZkQi7vUTMc9nbTUu2Es9NfvfudOpM2wZbn98fjpb/qq/nRv6Bk+ca+7XD5/IgNLMbWp2ouDdzbiHLCOfDUiHiDJhLfFZx9Bwo7ZwfzeOlbrQX66bx7xRKYmOe4DLrXhNcpbsMa8qbfxlZRCmYbubB/Y8h4=
|
||||||
|
channel: bots
|
||||||
|
on_build_success: false
|
||||||
|
on_build_failure: true
|
||||||
|
on_build_status_changed: true
|
47
src/vendor/github.com/go-openapi/analysis/debug.go
generated
vendored
Normal file
47
src/vendor/github.com/go-openapi/analysis/debug.go
generated
vendored
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package analysis
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Debug is true when the SWAGGER_DEBUG env var is not empty.
|
||||||
|
// It enables a more verbose logging of the spec analyzer.
|
||||||
|
Debug = os.Getenv("SWAGGER_DEBUG") != ""
|
||||||
|
// analysisLogger is a debug logger for this package
|
||||||
|
analysisLogger *log.Logger
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
debugOptions()
|
||||||
|
}
|
||||||
|
|
||||||
|
func debugOptions() {
|
||||||
|
analysisLogger = log.New(os.Stdout, "analysis:", log.LstdFlags)
|
||||||
|
}
|
||||||
|
|
||||||
|
func debugLog(msg string, args ...interface{}) {
|
||||||
|
// A private, trivial trace logger, based on go-openapi/spec/expander.go:debugLog()
|
||||||
|
if Debug {
|
||||||
|
_, file1, pos1, _ := runtime.Caller(1)
|
||||||
|
analysisLogger.Printf("%s:%d: %s", filepath.Base(file1), pos1, fmt.Sprintf(msg, args...))
|
||||||
|
}
|
||||||
|
}
|
43
src/vendor/github.com/go-openapi/analysis/doc.go
generated
vendored
Normal file
43
src/vendor/github.com/go-openapi/analysis/doc.go
generated
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package analysis provides methods to work with a Swagger specification document from
|
||||||
|
package go-openapi/spec.
|
||||||
|
|
||||||
|
Analyzing a specification
|
||||||
|
|
||||||
|
An analysed specification object (type Spec) provides methods to work with swagger definition.
|
||||||
|
|
||||||
|
Flattening or expanding a specification
|
||||||
|
|
||||||
|
Flattening a specification bundles all remote $ref in the main spec document.
|
||||||
|
Depending on flattening options, additional preprocessing may take place:
|
||||||
|
- full flattening: replacing all inline complex constructs by a named entry in #/definitions
|
||||||
|
- expand: replace all $ref's in the document by their expanded content
|
||||||
|
|
||||||
|
Merging several specifications
|
||||||
|
|
||||||
|
Mixin several specifications merges all Swagger constructs, and warns about found conflicts.
|
||||||
|
|
||||||
|
Fixing a specification
|
||||||
|
|
||||||
|
Unmarshalling a specification with golang json unmarshalling may lead to
|
||||||
|
some unwanted result on present but empty fields.
|
||||||
|
|
||||||
|
Analyzing a Swagger schema
|
||||||
|
|
||||||
|
Swagger schemas are analyzed to determine their complexity and qualify their content.
|
||||||
|
*/
|
||||||
|
package analysis
|
76
src/vendor/github.com/go-openapi/analysis/fixer.go
generated
vendored
Normal file
76
src/vendor/github.com/go-openapi/analysis/fixer.go
generated
vendored
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package analysis
|
||||||
|
|
||||||
|
import "github.com/go-openapi/spec"
|
||||||
|
|
||||||
|
// FixEmptyResponseDescriptions replaces empty ("") response
|
||||||
|
// descriptions in the input with "(empty)" to ensure that the
|
||||||
|
// resulting Swagger is stays valid. The problem appears to arise
|
||||||
|
// from reading in valid specs that have a explicit response
|
||||||
|
// description of "" (valid, response.description is required), but
|
||||||
|
// due to zero values being omitted upon re-serializing (omitempty) we
|
||||||
|
// lose them unless we stick some chars in there.
|
||||||
|
func FixEmptyResponseDescriptions(s *spec.Swagger) {
|
||||||
|
if s.Paths != nil {
|
||||||
|
for _, v := range s.Paths.Paths {
|
||||||
|
if v.Get != nil {
|
||||||
|
FixEmptyDescs(v.Get.Responses)
|
||||||
|
}
|
||||||
|
if v.Put != nil {
|
||||||
|
FixEmptyDescs(v.Put.Responses)
|
||||||
|
}
|
||||||
|
if v.Post != nil {
|
||||||
|
FixEmptyDescs(v.Post.Responses)
|
||||||
|
}
|
||||||
|
if v.Delete != nil {
|
||||||
|
FixEmptyDescs(v.Delete.Responses)
|
||||||
|
}
|
||||||
|
if v.Options != nil {
|
||||||
|
FixEmptyDescs(v.Options.Responses)
|
||||||
|
}
|
||||||
|
if v.Head != nil {
|
||||||
|
FixEmptyDescs(v.Head.Responses)
|
||||||
|
}
|
||||||
|
if v.Patch != nil {
|
||||||
|
FixEmptyDescs(v.Patch.Responses)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for k, v := range s.Responses {
|
||||||
|
FixEmptyDesc(&v)
|
||||||
|
s.Responses[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FixEmptyDescs adds "(empty)" as the description for any Response in
|
||||||
|
// the given Responses object that doesn't already have one.
|
||||||
|
func FixEmptyDescs(rs *spec.Responses) {
|
||||||
|
FixEmptyDesc(rs.Default)
|
||||||
|
for k, v := range rs.StatusCodeResponses {
|
||||||
|
FixEmptyDesc(&v)
|
||||||
|
rs.StatusCodeResponses[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FixEmptyDesc adds "(empty)" as the description to the given
|
||||||
|
// Response object if it doesn't already have one and isn't a
|
||||||
|
// ref. No-op on nil input.
|
||||||
|
func FixEmptyDesc(rs *spec.Response) {
|
||||||
|
if rs == nil || rs.Description != "" || rs.Ref.Ref.GetURL() != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
rs.Description = "(empty)"
|
||||||
|
}
|
1732
src/vendor/github.com/go-openapi/analysis/flatten.go
generated
vendored
Normal file
1732
src/vendor/github.com/go-openapi/analysis/flatten.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
13
src/vendor/github.com/go-openapi/analysis/go.mod
generated
vendored
Normal file
13
src/vendor/github.com/go-openapi/analysis/go.mod
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
module github.com/go-openapi/analysis
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.3
|
||||||
|
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/stretchr/testify v1.3.0
|
||||||
|
go.mongodb.org/mongo-driver v1.1.1 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
go 1.13
|
97
src/vendor/github.com/go-openapi/analysis/go.sum
generated
vendored
Normal file
97
src/vendor/github.com/go-openapi/analysis/go.sum
generated
vendored
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
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=
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
|
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/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/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/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=
|
||||||
|
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.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
|
||||||
|
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
|
||||||
|
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/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/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-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
|
||||||
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
|
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/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/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/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
||||||
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
||||||
|
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/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=
|
||||||
|
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=
|
||||||
|
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/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/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/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=
|
29
src/vendor/github.com/go-openapi/analysis/internal/post_go18.go
generated
vendored
Normal file
29
src/vendor/github.com/go-openapi/analysis/internal/post_go18.go
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// +build go1.8
|
||||||
|
|
||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package internal
|
||||||
|
|
||||||
|
import "net/url"
|
||||||
|
|
||||||
|
// PathUnescape provides url.PathUnescape(), with seamless
|
||||||
|
// go version support for pre-go1.8
|
||||||
|
//
|
||||||
|
// TODO: this function is currently defined in go-openapi/swag,
|
||||||
|
// but unexported. We might chose to export it, or simple phase
|
||||||
|
// out pre-go1.8 support.
|
||||||
|
func PathUnescape(path string) (string, error) {
|
||||||
|
return url.PathUnescape(path)
|
||||||
|
}
|
29
src/vendor/github.com/go-openapi/analysis/internal/pre_go18.go
generated
vendored
Normal file
29
src/vendor/github.com/go-openapi/analysis/internal/pre_go18.go
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// +build !go1.8
|
||||||
|
|
||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package internal
|
||||||
|
|
||||||
|
import "net/url"
|
||||||
|
|
||||||
|
// PathUnescape provides url.PathUnescape(), with seamless
|
||||||
|
// go version support for pre-go1.8
|
||||||
|
//
|
||||||
|
// TODO: this function is currently defined in go-openapi/swag,
|
||||||
|
// but unexported. We might chose to export it, or simple phase
|
||||||
|
// out pre-go1.8 support.
|
||||||
|
func PathUnescape(path string) (string, error) {
|
||||||
|
return url.QueryUnescape(path)
|
||||||
|
}
|
425
src/vendor/github.com/go-openapi/analysis/mixin.go
generated
vendored
Normal file
425
src/vendor/github.com/go-openapi/analysis/mixin.go
generated
vendored
Normal file
@ -0,0 +1,425 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package analysis
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
|
||||||
|
"github.com/go-openapi/spec"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Mixin modifies the primary swagger spec by adding the paths and
|
||||||
|
// definitions from the mixin specs. Top level parameters and
|
||||||
|
// responses from the mixins are also carried over. Operation id
|
||||||
|
// collisions are avoided by appending "Mixin<N>" but only if
|
||||||
|
// needed.
|
||||||
|
//
|
||||||
|
// The following parts of primary are subject to merge, filling empty details
|
||||||
|
// - Info
|
||||||
|
// - BasePath
|
||||||
|
// - Host
|
||||||
|
// - ExternalDocs
|
||||||
|
//
|
||||||
|
// Consider calling FixEmptyResponseDescriptions() on the modified primary
|
||||||
|
// if you read them from storage and they are valid to start with.
|
||||||
|
//
|
||||||
|
// Entries in "paths", "definitions", "parameters" and "responses" are
|
||||||
|
// added to the primary in the order of the given mixins. If the entry
|
||||||
|
// already exists in primary it is skipped with a warning message.
|
||||||
|
//
|
||||||
|
// The count of skipped entries (from collisions) is returned so any
|
||||||
|
// deviation from the number expected can flag a warning in your build
|
||||||
|
// scripts. Carefully review the collisions before accepting them;
|
||||||
|
// consider renaming things if possible.
|
||||||
|
//
|
||||||
|
// No key normalization takes place (paths, type defs,
|
||||||
|
// etc). Ensure they are canonical if your downstream tools do
|
||||||
|
// key normalization of any form.
|
||||||
|
//
|
||||||
|
// Merging schemes (http, https), and consumers/producers do not account for
|
||||||
|
// collisions.
|
||||||
|
func Mixin(primary *spec.Swagger, mixins ...*spec.Swagger) []string {
|
||||||
|
skipped := make([]string, 0, len(mixins))
|
||||||
|
opIds := getOpIds(primary)
|
||||||
|
initPrimary(primary)
|
||||||
|
|
||||||
|
for i, m := range mixins {
|
||||||
|
skipped = append(skipped, mergeSwaggerProps(primary, m)...)
|
||||||
|
|
||||||
|
skipped = append(skipped, mergeConsumes(primary, m)...)
|
||||||
|
|
||||||
|
skipped = append(skipped, mergeProduces(primary, m)...)
|
||||||
|
|
||||||
|
skipped = append(skipped, mergeTags(primary, m)...)
|
||||||
|
|
||||||
|
skipped = append(skipped, mergeSchemes(primary, m)...)
|
||||||
|
|
||||||
|
skipped = append(skipped, mergeSecurityDefinitions(primary, m)...)
|
||||||
|
|
||||||
|
skipped = append(skipped, mergeSecurityRequirements(primary, m)...)
|
||||||
|
|
||||||
|
skipped = append(skipped, mergeDefinitions(primary, m)...)
|
||||||
|
|
||||||
|
// merging paths requires a map of operationIDs to work with
|
||||||
|
skipped = append(skipped, mergePaths(primary, m, opIds, i)...)
|
||||||
|
|
||||||
|
skipped = append(skipped, mergeParameters(primary, m)...)
|
||||||
|
|
||||||
|
skipped = append(skipped, mergeResponses(primary, m)...)
|
||||||
|
}
|
||||||
|
return skipped
|
||||||
|
}
|
||||||
|
|
||||||
|
// getOpIds extracts all the paths.<path>.operationIds from the given
|
||||||
|
// spec and returns them as the keys in a map with 'true' values.
|
||||||
|
func getOpIds(s *spec.Swagger) map[string]bool {
|
||||||
|
rv := make(map[string]bool)
|
||||||
|
if s.Paths == nil {
|
||||||
|
return rv
|
||||||
|
}
|
||||||
|
for _, v := range s.Paths.Paths {
|
||||||
|
piops := pathItemOps(v)
|
||||||
|
for _, op := range piops {
|
||||||
|
rv[op.ID] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rv
|
||||||
|
}
|
||||||
|
|
||||||
|
func pathItemOps(p spec.PathItem) []*spec.Operation {
|
||||||
|
var rv []*spec.Operation
|
||||||
|
rv = appendOp(rv, p.Get)
|
||||||
|
rv = appendOp(rv, p.Put)
|
||||||
|
rv = appendOp(rv, p.Post)
|
||||||
|
rv = appendOp(rv, p.Delete)
|
||||||
|
rv = appendOp(rv, p.Head)
|
||||||
|
rv = appendOp(rv, p.Patch)
|
||||||
|
return rv
|
||||||
|
}
|
||||||
|
|
||||||
|
func appendOp(ops []*spec.Operation, op *spec.Operation) []*spec.Operation {
|
||||||
|
if op == nil {
|
||||||
|
return ops
|
||||||
|
}
|
||||||
|
return append(ops, op)
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeSecurityDefinitions(primary *spec.Swagger, m *spec.Swagger) (skipped []string) {
|
||||||
|
for k, v := range m.SecurityDefinitions {
|
||||||
|
if _, exists := primary.SecurityDefinitions[k]; exists {
|
||||||
|
warn := fmt.Sprintf(
|
||||||
|
"SecurityDefinitions entry '%v' already exists in primary or higher priority mixin, skipping\n", k)
|
||||||
|
skipped = append(skipped, warn)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
primary.SecurityDefinitions[k] = v
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeSecurityRequirements(primary *spec.Swagger, m *spec.Swagger) (skipped []string) {
|
||||||
|
for _, v := range m.Security {
|
||||||
|
found := false
|
||||||
|
for _, vv := range primary.Security {
|
||||||
|
if reflect.DeepEqual(v, vv) {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if found {
|
||||||
|
warn := fmt.Sprintf(
|
||||||
|
"Security requirement: '%v' already exists in primary or higher priority mixin, skipping\n", v)
|
||||||
|
skipped = append(skipped, warn)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
primary.Security = append(primary.Security, v)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeDefinitions(primary *spec.Swagger, m *spec.Swagger) (skipped []string) {
|
||||||
|
for k, v := range m.Definitions {
|
||||||
|
// assume name collisions represent IDENTICAL type. careful.
|
||||||
|
if _, exists := primary.Definitions[k]; exists {
|
||||||
|
warn := fmt.Sprintf(
|
||||||
|
"definitions entry '%v' already exists in primary or higher priority mixin, skipping\n", k)
|
||||||
|
skipped = append(skipped, warn)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
primary.Definitions[k] = v
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergePaths(primary *spec.Swagger, m *spec.Swagger, opIds map[string]bool, mixIndex int) (skipped []string) {
|
||||||
|
if m.Paths != nil {
|
||||||
|
for k, v := range m.Paths.Paths {
|
||||||
|
if _, exists := primary.Paths.Paths[k]; exists {
|
||||||
|
warn := fmt.Sprintf(
|
||||||
|
"paths entry '%v' already exists in primary or higher priority mixin, skipping\n", k)
|
||||||
|
skipped = append(skipped, warn)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Swagger requires that operationIds be
|
||||||
|
// unique within a spec. If we find a
|
||||||
|
// collision we append "Mixin0" to the
|
||||||
|
// operatoinId we are adding, where 0 is mixin
|
||||||
|
// index. We assume that operationIds with
|
||||||
|
// all the proivded specs are already unique.
|
||||||
|
piops := pathItemOps(v)
|
||||||
|
for _, piop := range piops {
|
||||||
|
if opIds[piop.ID] {
|
||||||
|
piop.ID = fmt.Sprintf("%v%v%v", piop.ID, "Mixin", mixIndex)
|
||||||
|
}
|
||||||
|
opIds[piop.ID] = true
|
||||||
|
}
|
||||||
|
primary.Paths.Paths[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeParameters(primary *spec.Swagger, m *spec.Swagger) (skipped []string) {
|
||||||
|
for k, v := range m.Parameters {
|
||||||
|
// could try to rename on conflict but would
|
||||||
|
// have to fix $refs in the mixin. Complain
|
||||||
|
// for now
|
||||||
|
if _, exists := primary.Parameters[k]; exists {
|
||||||
|
warn := fmt.Sprintf(
|
||||||
|
"top level parameters entry '%v' already exists in primary or higher priority mixin, skipping\n", k)
|
||||||
|
skipped = append(skipped, warn)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
primary.Parameters[k] = v
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeResponses(primary *spec.Swagger, m *spec.Swagger) (skipped []string) {
|
||||||
|
for k, v := range m.Responses {
|
||||||
|
// could try to rename on conflict but would
|
||||||
|
// have to fix $refs in the mixin. Complain
|
||||||
|
// for now
|
||||||
|
if _, exists := primary.Responses[k]; exists {
|
||||||
|
warn := fmt.Sprintf(
|
||||||
|
"top level responses entry '%v' already exists in primary or higher priority mixin, skipping\n", k)
|
||||||
|
skipped = append(skipped, warn)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
primary.Responses[k] = v
|
||||||
|
}
|
||||||
|
return skipped
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeConsumes(primary *spec.Swagger, m *spec.Swagger) []string {
|
||||||
|
for _, v := range m.Consumes {
|
||||||
|
found := false
|
||||||
|
for _, vv := range primary.Consumes {
|
||||||
|
if v == vv {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if found {
|
||||||
|
// no warning here: we just skip it
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
primary.Consumes = append(primary.Consumes, v)
|
||||||
|
}
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeProduces(primary *spec.Swagger, m *spec.Swagger) []string {
|
||||||
|
for _, v := range m.Produces {
|
||||||
|
found := false
|
||||||
|
for _, vv := range primary.Produces {
|
||||||
|
if v == vv {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if found {
|
||||||
|
// no warning here: we just skip it
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
primary.Produces = append(primary.Produces, v)
|
||||||
|
}
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeTags(primary *spec.Swagger, m *spec.Swagger) (skipped []string) {
|
||||||
|
for _, v := range m.Tags {
|
||||||
|
found := false
|
||||||
|
for _, vv := range primary.Tags {
|
||||||
|
if v.Name == vv.Name {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if found {
|
||||||
|
warn := fmt.Sprintf(
|
||||||
|
"top level tags entry with name '%v' already exists in primary or higher priority mixin, skipping\n", v.Name)
|
||||||
|
skipped = append(skipped, warn)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
primary.Tags = append(primary.Tags, v)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeSchemes(primary *spec.Swagger, m *spec.Swagger) []string {
|
||||||
|
for _, v := range m.Schemes {
|
||||||
|
found := false
|
||||||
|
for _, vv := range primary.Schemes {
|
||||||
|
if v == vv {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if found {
|
||||||
|
// no warning here: we just skip it
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
primary.Schemes = append(primary.Schemes, v)
|
||||||
|
}
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeSwaggerProps(primary *spec.Swagger, m *spec.Swagger) []string {
|
||||||
|
var skipped []string
|
||||||
|
primary.Extensions, skipped = mergeExtensions(primary.Extensions, m.Extensions)
|
||||||
|
|
||||||
|
// merging details in swagger top properties
|
||||||
|
if primary.Host == "" {
|
||||||
|
primary.Host = m.Host
|
||||||
|
}
|
||||||
|
if primary.BasePath == "" {
|
||||||
|
primary.BasePath = m.BasePath
|
||||||
|
}
|
||||||
|
if primary.Info == nil {
|
||||||
|
primary.Info = m.Info
|
||||||
|
} else if m.Info != nil {
|
||||||
|
var sk []string
|
||||||
|
primary.Info.Extensions, sk = mergeExtensions(primary.Info.Extensions, m.Info.Extensions)
|
||||||
|
skipped = append(skipped, sk...)
|
||||||
|
if primary.Info.Description == "" {
|
||||||
|
primary.Info.Description = m.Info.Description
|
||||||
|
}
|
||||||
|
if primary.Info.Title == "" {
|
||||||
|
primary.Info.Description = m.Info.Description
|
||||||
|
}
|
||||||
|
if primary.Info.TermsOfService == "" {
|
||||||
|
primary.Info.TermsOfService = m.Info.TermsOfService
|
||||||
|
}
|
||||||
|
if primary.Info.Version == "" {
|
||||||
|
primary.Info.Version = m.Info.Version
|
||||||
|
}
|
||||||
|
|
||||||
|
if primary.Info.Contact == nil {
|
||||||
|
primary.Info.Contact = m.Info.Contact
|
||||||
|
} else if m.Info.Contact != nil {
|
||||||
|
if primary.Info.Contact.Name == "" {
|
||||||
|
primary.Info.Contact.Name = m.Info.Contact.Name
|
||||||
|
}
|
||||||
|
if primary.Info.Contact.URL == "" {
|
||||||
|
primary.Info.Contact.URL = m.Info.Contact.URL
|
||||||
|
}
|
||||||
|
if primary.Info.Contact.Email == "" {
|
||||||
|
primary.Info.Contact.Email = m.Info.Contact.Email
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if primary.Info.License == nil {
|
||||||
|
primary.Info.License = m.Info.License
|
||||||
|
} else if m.Info.License != nil {
|
||||||
|
if primary.Info.License.Name == "" {
|
||||||
|
primary.Info.License.Name = m.Info.License.Name
|
||||||
|
}
|
||||||
|
if primary.Info.License.URL == "" {
|
||||||
|
primary.Info.License.URL = m.Info.License.URL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if primary.ExternalDocs == nil {
|
||||||
|
primary.ExternalDocs = m.ExternalDocs
|
||||||
|
} else if m.ExternalDocs != nil {
|
||||||
|
if primary.ExternalDocs.Description == "" {
|
||||||
|
primary.ExternalDocs.Description = m.ExternalDocs.Description
|
||||||
|
}
|
||||||
|
if primary.ExternalDocs.URL == "" {
|
||||||
|
primary.ExternalDocs.URL = m.ExternalDocs.URL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return skipped
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeExtensions(primary spec.Extensions, m spec.Extensions) (result spec.Extensions, skipped []string) {
|
||||||
|
if primary == nil {
|
||||||
|
result = m
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if m == nil {
|
||||||
|
result = primary
|
||||||
|
return
|
||||||
|
}
|
||||||
|
result = primary
|
||||||
|
for k, v := range m {
|
||||||
|
if _, found := primary[k]; found {
|
||||||
|
skipped = append(skipped, k)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
primary[k] = v
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func initPrimary(primary *spec.Swagger) {
|
||||||
|
if primary.SecurityDefinitions == nil {
|
||||||
|
primary.SecurityDefinitions = make(map[string]*spec.SecurityScheme)
|
||||||
|
}
|
||||||
|
if primary.Security == nil {
|
||||||
|
primary.Security = make([]map[string][]string, 0, 10)
|
||||||
|
}
|
||||||
|
if primary.Produces == nil {
|
||||||
|
primary.Produces = make([]string, 0, 10)
|
||||||
|
}
|
||||||
|
if primary.Consumes == nil {
|
||||||
|
primary.Consumes = make([]string, 0, 10)
|
||||||
|
}
|
||||||
|
if primary.Tags == nil {
|
||||||
|
primary.Tags = make([]spec.Tag, 0, 10)
|
||||||
|
}
|
||||||
|
if primary.Schemes == nil {
|
||||||
|
primary.Schemes = make([]string, 0, 10)
|
||||||
|
}
|
||||||
|
if primary.Paths == nil {
|
||||||
|
primary.Paths = &spec.Paths{Paths: make(map[string]spec.PathItem)}
|
||||||
|
}
|
||||||
|
if primary.Paths.Paths == nil {
|
||||||
|
primary.Paths.Paths = make(map[string]spec.PathItem)
|
||||||
|
}
|
||||||
|
if primary.Definitions == nil {
|
||||||
|
primary.Definitions = make(spec.Definitions)
|
||||||
|
}
|
||||||
|
if primary.Parameters == nil {
|
||||||
|
primary.Parameters = make(map[string]spec.Parameter)
|
||||||
|
}
|
||||||
|
if primary.Responses == nil {
|
||||||
|
primary.Responses = make(map[string]spec.Response)
|
||||||
|
}
|
||||||
|
}
|
234
src/vendor/github.com/go-openapi/analysis/schema.go
generated
vendored
Normal file
234
src/vendor/github.com/go-openapi/analysis/schema.go
generated
vendored
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
package analysis
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/go-openapi/spec"
|
||||||
|
"github.com/go-openapi/strfmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SchemaOpts configures the schema analyzer
|
||||||
|
type SchemaOpts struct {
|
||||||
|
Schema *spec.Schema
|
||||||
|
Root interface{}
|
||||||
|
BasePath string
|
||||||
|
_ struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Schema analysis, will classify the schema according to known
|
||||||
|
// patterns.
|
||||||
|
func Schema(opts SchemaOpts) (*AnalyzedSchema, error) {
|
||||||
|
if opts.Schema == nil {
|
||||||
|
return nil, fmt.Errorf("no schema to analyze")
|
||||||
|
}
|
||||||
|
|
||||||
|
a := &AnalyzedSchema{
|
||||||
|
schema: opts.Schema,
|
||||||
|
root: opts.Root,
|
||||||
|
basePath: opts.BasePath,
|
||||||
|
}
|
||||||
|
|
||||||
|
a.initializeFlags()
|
||||||
|
a.inferKnownType()
|
||||||
|
a.inferEnum()
|
||||||
|
a.inferBaseType()
|
||||||
|
|
||||||
|
if err := a.inferMap(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := a.inferArray(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
a.inferTuple()
|
||||||
|
|
||||||
|
if err := a.inferFromRef(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
a.inferSimpleSchema()
|
||||||
|
return a, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AnalyzedSchema indicates what the schema represents
|
||||||
|
type AnalyzedSchema struct {
|
||||||
|
schema *spec.Schema
|
||||||
|
root interface{}
|
||||||
|
basePath string
|
||||||
|
|
||||||
|
hasProps bool
|
||||||
|
hasAllOf bool
|
||||||
|
hasItems bool
|
||||||
|
hasAdditionalProps bool
|
||||||
|
hasAdditionalItems bool
|
||||||
|
hasRef bool
|
||||||
|
|
||||||
|
IsKnownType bool
|
||||||
|
IsSimpleSchema bool
|
||||||
|
IsArray bool
|
||||||
|
IsSimpleArray bool
|
||||||
|
IsMap bool
|
||||||
|
IsSimpleMap bool
|
||||||
|
IsExtendedObject bool
|
||||||
|
IsTuple bool
|
||||||
|
IsTupleWithExtra bool
|
||||||
|
IsBaseType bool
|
||||||
|
IsEnum bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inherits copies value fields from other onto this schema
|
||||||
|
func (a *AnalyzedSchema) inherits(other *AnalyzedSchema) {
|
||||||
|
if other == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
a.hasProps = other.hasProps
|
||||||
|
a.hasAllOf = other.hasAllOf
|
||||||
|
a.hasItems = other.hasItems
|
||||||
|
a.hasAdditionalItems = other.hasAdditionalItems
|
||||||
|
a.hasAdditionalProps = other.hasAdditionalProps
|
||||||
|
a.hasRef = other.hasRef
|
||||||
|
|
||||||
|
a.IsKnownType = other.IsKnownType
|
||||||
|
a.IsSimpleSchema = other.IsSimpleSchema
|
||||||
|
a.IsArray = other.IsArray
|
||||||
|
a.IsSimpleArray = other.IsSimpleArray
|
||||||
|
a.IsMap = other.IsMap
|
||||||
|
a.IsSimpleMap = other.IsSimpleMap
|
||||||
|
a.IsExtendedObject = other.IsExtendedObject
|
||||||
|
a.IsTuple = other.IsTuple
|
||||||
|
a.IsTupleWithExtra = other.IsTupleWithExtra
|
||||||
|
a.IsBaseType = other.IsBaseType
|
||||||
|
a.IsEnum = other.IsEnum
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AnalyzedSchema) inferFromRef() error {
|
||||||
|
if a.hasRef {
|
||||||
|
sch := new(spec.Schema)
|
||||||
|
sch.Ref = a.schema.Ref
|
||||||
|
err := spec.ExpandSchema(sch, a.root, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
rsch, err := Schema(SchemaOpts{
|
||||||
|
Schema: sch,
|
||||||
|
Root: a.root,
|
||||||
|
BasePath: a.basePath,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
// NOTE(fredbi): currently the only cause for errors is
|
||||||
|
// unresolved ref. Since spec.ExpandSchema() expands the
|
||||||
|
// schema recursively, there is no chance to get there,
|
||||||
|
// until we add more causes for error in this schema analysis.
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
a.inherits(rsch)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AnalyzedSchema) inferSimpleSchema() {
|
||||||
|
a.IsSimpleSchema = a.IsKnownType || a.IsSimpleArray || a.IsSimpleMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AnalyzedSchema) inferKnownType() {
|
||||||
|
tpe := a.schema.Type
|
||||||
|
format := a.schema.Format
|
||||||
|
a.IsKnownType = tpe.Contains("boolean") ||
|
||||||
|
tpe.Contains("integer") ||
|
||||||
|
tpe.Contains("number") ||
|
||||||
|
tpe.Contains("string") ||
|
||||||
|
(format != "" && strfmt.Default.ContainsName(format)) ||
|
||||||
|
(a.isObjectType() && !a.hasProps && !a.hasAllOf && !a.hasAdditionalProps && !a.hasAdditionalItems)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AnalyzedSchema) inferMap() error {
|
||||||
|
if a.isObjectType() {
|
||||||
|
hasExtra := a.hasProps || a.hasAllOf
|
||||||
|
a.IsMap = a.hasAdditionalProps && !hasExtra
|
||||||
|
a.IsExtendedObject = a.hasAdditionalProps && hasExtra
|
||||||
|
if a.IsMap {
|
||||||
|
if a.schema.AdditionalProperties.Schema != nil {
|
||||||
|
msch, err := Schema(SchemaOpts{
|
||||||
|
Schema: a.schema.AdditionalProperties.Schema,
|
||||||
|
Root: a.root,
|
||||||
|
BasePath: a.basePath,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
a.IsSimpleMap = msch.IsSimpleSchema
|
||||||
|
} else if a.schema.AdditionalProperties.Allows {
|
||||||
|
a.IsSimpleMap = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AnalyzedSchema) inferArray() error {
|
||||||
|
// an array has Items defined as an object schema, otherwise we qualify this JSON array as a tuple
|
||||||
|
// (yes, even if the Items array contains only one element).
|
||||||
|
// arrays in JSON schema may be unrestricted (i.e no Items specified).
|
||||||
|
// Note that arrays in Swagger MUST have Items. Nonetheless, we analyze unrestricted arrays.
|
||||||
|
//
|
||||||
|
// NOTE: the spec package misses the distinction between:
|
||||||
|
// items: [] and items: {}, so we consider both arrays here.
|
||||||
|
a.IsArray = a.isArrayType() && (a.schema.Items == nil || a.schema.Items.Schemas == nil)
|
||||||
|
if a.IsArray && a.hasItems {
|
||||||
|
if a.schema.Items.Schema != nil {
|
||||||
|
itsch, err := Schema(SchemaOpts{
|
||||||
|
Schema: a.schema.Items.Schema,
|
||||||
|
Root: a.root,
|
||||||
|
BasePath: a.basePath,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
a.IsSimpleArray = itsch.IsSimpleSchema
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if a.IsArray && !a.hasItems {
|
||||||
|
a.IsSimpleArray = true
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AnalyzedSchema) inferTuple() {
|
||||||
|
tuple := a.hasItems && a.schema.Items.Schemas != nil
|
||||||
|
a.IsTuple = tuple && !a.hasAdditionalItems
|
||||||
|
a.IsTupleWithExtra = tuple && a.hasAdditionalItems
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AnalyzedSchema) inferBaseType() {
|
||||||
|
if a.isObjectType() {
|
||||||
|
a.IsBaseType = a.schema.Discriminator != ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AnalyzedSchema) inferEnum() {
|
||||||
|
a.IsEnum = len(a.schema.Enum) > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AnalyzedSchema) initializeFlags() {
|
||||||
|
a.hasProps = len(a.schema.Properties) > 0
|
||||||
|
a.hasAllOf = len(a.schema.AllOf) > 0
|
||||||
|
a.hasRef = a.schema.Ref.String() != ""
|
||||||
|
|
||||||
|
a.hasItems = a.schema.Items != nil &&
|
||||||
|
(a.schema.Items.Schema != nil || len(a.schema.Items.Schemas) > 0)
|
||||||
|
|
||||||
|
a.hasAdditionalProps = a.schema.AdditionalProperties != nil &&
|
||||||
|
(a.schema.AdditionalProperties != nil || a.schema.AdditionalProperties.Allows)
|
||||||
|
|
||||||
|
a.hasAdditionalItems = a.schema.AdditionalItems != nil &&
|
||||||
|
(a.schema.AdditionalItems.Schema != nil || a.schema.AdditionalItems.Allows)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AnalyzedSchema) isObjectType() bool {
|
||||||
|
return !a.hasRef && (a.schema.Type == nil || a.schema.Type.Contains("") || a.schema.Type.Contains("object"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AnalyzedSchema) isArrayType() bool {
|
||||||
|
return !a.hasRef && (a.schema.Type != nil && a.schema.Type.Contains("array"))
|
||||||
|
}
|
2
src/vendor/github.com/go-openapi/errors/.gitignore
generated
vendored
Normal file
2
src/vendor/github.com/go-openapi/errors/.gitignore
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
secrets.yml
|
||||||
|
coverage.out
|
20
src/vendor/github.com/go-openapi/errors/.golangci.yml
generated
vendored
Normal file
20
src/vendor/github.com/go-openapi/errors/.golangci.yml
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
linters-settings:
|
||||||
|
govet:
|
||||||
|
check-shadowing: true
|
||||||
|
golint:
|
||||||
|
min-confidence: 0
|
||||||
|
gocyclo:
|
||||||
|
min-complexity: 30
|
||||||
|
maligned:
|
||||||
|
suggest-new: true
|
||||||
|
dupl:
|
||||||
|
threshold: 100
|
||||||
|
goconst:
|
||||||
|
min-len: 2
|
||||||
|
min-occurrences: 4
|
||||||
|
linters:
|
||||||
|
enable-all: true
|
||||||
|
disable:
|
||||||
|
- maligned
|
||||||
|
- lll
|
||||||
|
- gochecknoglobals
|
15
src/vendor/github.com/go-openapi/errors/.travis.yml
generated
vendored
Normal file
15
src/vendor/github.com/go-openapi/errors/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
|
go:
|
||||||
|
- 1.11.x
|
||||||
|
- 1.12.x
|
||||||
|
install:
|
||||||
|
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
||||||
|
env:
|
||||||
|
- GO111MODULE=on
|
||||||
|
language: go
|
||||||
|
notifications:
|
||||||
|
slack:
|
||||||
|
secure: gZGp9NaHxi7zawlXJXKY92BGeDR1x0tbIcTyU5nMKLq0fhIaiEBJEeALwZ4VgqsSv3DytSSF5mLH8fevAM3ixE6hxjKQ+lQuf7V/w3btCN1CSWgoua5LOh1kTnqZQtJuRvO4pzoJcT3bJWBsVZ07VGNVzzJEy/zAKCHFqBUCXShw7QemlLBcYWFNqveTlvDIfCzvouoLnPoXwxEpkjxe9uz/ZKZgAnup/fXjC8RFctmgCnkCyvJTk0Y/fZCsufixJrJhshBWTnlrFCzRmgNkz2d+i1Ls3+MJ5EJJ2Tx/A5S63dL49J1f9Kr0AKHADmulSy8JNzIckKwbyFMYUecrsW+Lsu9DhnVMy1jj5pKsJDLRi2iIU3fXTMWbcyQbXjbbnBO2mPdP3Tzme75y4D9fc8hUPeyqVv2BU26NEbQ7EF2pKJ93OXvci7HlwRBgdJa8j6mP2LEDClcPQW00g7N/OZe0cTOMa8L5AwiBlbArwqt9wv6YLJoTG0wpDhzWsFvbCg5bJxe28Yn3fIDD0Lk1I7iSnBbp/5gzF19jmxqvcT8tHRkDL4xfjbENFTZjA5uB4Z4pj4WSyWQILLV/Jwhe3fi9uQwdviFHfj5pnVrmNUiGSOQL672K5wl2c3E9mGwejvsu2dfEz28n7Y/FUnOpY3/cBS0n27JJaerS0zMKNLE=
|
||||||
|
script:
|
||||||
|
- gotestsum -f short-verbose -- -race -coverprofile=coverage.txt -covermode=atomic ./...
|
74
src/vendor/github.com/go-openapi/errors/CODE_OF_CONDUCT.md
generated
vendored
Normal file
74
src/vendor/github.com/go-openapi/errors/CODE_OF_CONDUCT.md
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity and
|
||||||
|
orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at ivan+abuse@flanders.co.nz. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/4/
|
202
src/vendor/github.com/go-openapi/errors/LICENSE
generated
vendored
Normal file
202
src/vendor/github.com/go-openapi/errors/LICENSE
generated
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
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
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
8
src/vendor/github.com/go-openapi/errors/README.md
generated
vendored
Normal file
8
src/vendor/github.com/go-openapi/errors/README.md
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# OpenAPI errors [![Build Status](https://travis-ci.org/go-openapi/errors.svg?branch=master)](https://travis-ci.org/go-openapi/errors) [![codecov](https://codecov.io/gh/go-openapi/errors/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/errors) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io)
|
||||||
|
|
||||||
|
[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/errors/master/LICENSE)
|
||||||
|
[![GoDoc](https://godoc.org/github.com/go-openapi/errors?status.svg)](http://godoc.org/github.com/go-openapi/errors)
|
||||||
|
[![GolangCI](https://golangci.com/badges/github.com/go-openapi/errors.svg)](https://golangci.com)
|
||||||
|
[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/errors)](https://goreportcard.com/report/github.com/go-openapi/errors)
|
||||||
|
|
||||||
|
Shared errors and error interface used throughout the various libraries found in the go-openapi toolkit.
|
164
src/vendor/github.com/go-openapi/errors/api.go
generated
vendored
Normal file
164
src/vendor/github.com/go-openapi/errors/api.go
generated
vendored
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package errors
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DefaultHTTPCode is used when the error Code cannot be used as an HTTP code.
|
||||||
|
var DefaultHTTPCode = http.StatusUnprocessableEntity
|
||||||
|
|
||||||
|
// Error represents a error interface all swagger framework errors implement
|
||||||
|
type Error interface {
|
||||||
|
error
|
||||||
|
Code() int32
|
||||||
|
}
|
||||||
|
|
||||||
|
type apiError struct {
|
||||||
|
code int32
|
||||||
|
message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *apiError) Error() string {
|
||||||
|
return a.message
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *apiError) Code() int32 {
|
||||||
|
return a.code
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new API error with a code and a message
|
||||||
|
func New(code int32, message string, args ...interface{}) Error {
|
||||||
|
if len(args) > 0 {
|
||||||
|
return &apiError{code, fmt.Sprintf(message, args...)}
|
||||||
|
}
|
||||||
|
return &apiError{code, message}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotFound creates a new not found error
|
||||||
|
func NotFound(message string, args ...interface{}) Error {
|
||||||
|
if message == "" {
|
||||||
|
message = "Not found"
|
||||||
|
}
|
||||||
|
return New(http.StatusNotFound, fmt.Sprintf(message, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotImplemented creates a new not implemented error
|
||||||
|
func NotImplemented(message string) Error {
|
||||||
|
return New(http.StatusNotImplemented, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MethodNotAllowedError represents an error for when the path matches but the method doesn't
|
||||||
|
type MethodNotAllowedError struct {
|
||||||
|
code int32
|
||||||
|
Allowed []string
|
||||||
|
message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MethodNotAllowedError) Error() string {
|
||||||
|
return m.message
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code the error code
|
||||||
|
func (m *MethodNotAllowedError) Code() int32 {
|
||||||
|
return m.code
|
||||||
|
}
|
||||||
|
|
||||||
|
func errorAsJSON(err Error) []byte {
|
||||||
|
b, _ := json.Marshal(struct {
|
||||||
|
Code int32 `json:"code"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}{err.Code(), err.Error()})
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func flattenComposite(errs *CompositeError) *CompositeError {
|
||||||
|
var res []error
|
||||||
|
for _, er := range errs.Errors {
|
||||||
|
switch e := er.(type) {
|
||||||
|
case *CompositeError:
|
||||||
|
if len(e.Errors) > 0 {
|
||||||
|
flat := flattenComposite(e)
|
||||||
|
if len(flat.Errors) > 0 {
|
||||||
|
res = append(res, flat.Errors...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
if e != nil {
|
||||||
|
res = append(res, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CompositeValidationError(res...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MethodNotAllowed creates a new method not allowed error
|
||||||
|
func MethodNotAllowed(requested string, allow []string) Error {
|
||||||
|
msg := fmt.Sprintf("method %s is not allowed, but [%s] are", requested, strings.Join(allow, ","))
|
||||||
|
return &MethodNotAllowedError{code: http.StatusMethodNotAllowed, Allowed: allow, message: msg}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServeError the error handler interface implementation
|
||||||
|
func ServeError(rw http.ResponseWriter, r *http.Request, err error) {
|
||||||
|
rw.Header().Set("Content-Type", "application/json")
|
||||||
|
switch e := err.(type) {
|
||||||
|
case *CompositeError:
|
||||||
|
er := flattenComposite(e)
|
||||||
|
// strips composite errors to first element only
|
||||||
|
if len(er.Errors) > 0 {
|
||||||
|
ServeError(rw, r, er.Errors[0])
|
||||||
|
} else {
|
||||||
|
// guard against empty CompositeError (invalid construct)
|
||||||
|
ServeError(rw, r, nil)
|
||||||
|
}
|
||||||
|
case *MethodNotAllowedError:
|
||||||
|
rw.Header().Add("Allow", strings.Join(err.(*MethodNotAllowedError).Allowed, ","))
|
||||||
|
rw.WriteHeader(asHTTPCode(int(e.Code())))
|
||||||
|
if r == nil || r.Method != http.MethodHead {
|
||||||
|
_, _ = rw.Write(errorAsJSON(e))
|
||||||
|
}
|
||||||
|
case Error:
|
||||||
|
value := reflect.ValueOf(e)
|
||||||
|
if value.Kind() == reflect.Ptr && value.IsNil() {
|
||||||
|
rw.WriteHeader(http.StatusInternalServerError)
|
||||||
|
_, _ = rw.Write(errorAsJSON(New(http.StatusInternalServerError, "Unknown error")))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
rw.WriteHeader(asHTTPCode(int(e.Code())))
|
||||||
|
if r == nil || r.Method != http.MethodHead {
|
||||||
|
_, _ = rw.Write(errorAsJSON(e))
|
||||||
|
}
|
||||||
|
case nil:
|
||||||
|
rw.WriteHeader(http.StatusInternalServerError)
|
||||||
|
_, _ = rw.Write(errorAsJSON(New(http.StatusInternalServerError, "Unknown error")))
|
||||||
|
default:
|
||||||
|
rw.WriteHeader(http.StatusInternalServerError)
|
||||||
|
if r == nil || r.Method != http.MethodHead {
|
||||||
|
_, _ = rw.Write(errorAsJSON(New(http.StatusInternalServerError, err.Error())))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func asHTTPCode(input int) int {
|
||||||
|
if input >= 600 {
|
||||||
|
return DefaultHTTPCode
|
||||||
|
}
|
||||||
|
return input
|
||||||
|
}
|
22
src/vendor/github.com/go-openapi/errors/auth.go
generated
vendored
Normal file
22
src/vendor/github.com/go-openapi/errors/auth.go
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package errors
|
||||||
|
|
||||||
|
import "net/http"
|
||||||
|
|
||||||
|
// Unauthenticated returns an unauthenticated error
|
||||||
|
func Unauthenticated(scheme string) Error {
|
||||||
|
return New(http.StatusUnauthorized, "unauthenticated for %s", scheme)
|
||||||
|
}
|
28
src/vendor/github.com/go-openapi/errors/doc.go
generated
vendored
Normal file
28
src/vendor/github.com/go-openapi/errors/doc.go
generated
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Package errors provides an Error interface and several concrete types
|
||||||
|
implementing this interface to manage API errors and JSON-schema validation
|
||||||
|
errors.
|
||||||
|
|
||||||
|
A middleware handler ServeError() is provided to serve the errors types
|
||||||
|
it defines.
|
||||||
|
|
||||||
|
It is used throughout the various go-openapi toolkit libraries
|
||||||
|
(https://github.com/go-openapi).
|
||||||
|
|
||||||
|
*/
|
||||||
|
package errors
|
6
src/vendor/github.com/go-openapi/errors/go.mod
generated
vendored
Normal file
6
src/vendor/github.com/go-openapi/errors/go.mod
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
module github.com/go-openapi/errors
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/stretchr/objx v0.2.0 // indirect
|
||||||
|
github.com/stretchr/testify v1.3.0
|
||||||
|
)
|
9
src/vendor/github.com/go-openapi/errors/go.sum
generated
vendored
Normal file
9
src/vendor/github.com/go-openapi/errors/go.sum
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
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/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=
|
85
src/vendor/github.com/go-openapi/errors/headers.go
generated
vendored
Normal file
85
src/vendor/github.com/go-openapi/errors/headers.go
generated
vendored
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package errors
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Validation represents a failure of a precondition
|
||||||
|
type Validation struct {
|
||||||
|
code int32
|
||||||
|
Name string
|
||||||
|
In string
|
||||||
|
Value interface{}
|
||||||
|
message string
|
||||||
|
Values []interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Validation) Error() string {
|
||||||
|
return e.message
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code the error code
|
||||||
|
func (e *Validation) Code() int32 {
|
||||||
|
return e.code
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateName produces an error message name for an aliased property
|
||||||
|
func (e *Validation) ValidateName(name string) *Validation {
|
||||||
|
if e.Name == "" && name != "" {
|
||||||
|
e.Name = name
|
||||||
|
e.message = name + e.message
|
||||||
|
}
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
contentTypeFail = `unsupported media type %q, only %v are allowed`
|
||||||
|
responseFormatFail = `unsupported media type requested, only %v are available`
|
||||||
|
)
|
||||||
|
|
||||||
|
// InvalidContentType error for an invalid content type
|
||||||
|
func InvalidContentType(value string, allowed []string) *Validation {
|
||||||
|
values := make([]interface{}, 0, len(allowed))
|
||||||
|
for _, v := range allowed {
|
||||||
|
values = append(values, v)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: http.StatusUnsupportedMediaType,
|
||||||
|
Name: "Content-Type",
|
||||||
|
In: "header",
|
||||||
|
Value: value,
|
||||||
|
Values: values,
|
||||||
|
message: fmt.Sprintf(contentTypeFail, value, allowed),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// InvalidResponseFormat error for an unacceptable response format request
|
||||||
|
func InvalidResponseFormat(value string, allowed []string) *Validation {
|
||||||
|
values := make([]interface{}, 0, len(allowed))
|
||||||
|
for _, v := range allowed {
|
||||||
|
values = append(values, v)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: http.StatusNotAcceptable,
|
||||||
|
Name: "Accept",
|
||||||
|
In: "header",
|
||||||
|
Value: value,
|
||||||
|
Values: values,
|
||||||
|
message: fmt.Sprintf(responseFormatFail, allowed),
|
||||||
|
}
|
||||||
|
}
|
51
src/vendor/github.com/go-openapi/errors/middleware.go
generated
vendored
Normal file
51
src/vendor/github.com/go-openapi/errors/middleware.go
generated
vendored
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package errors
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// APIVerificationFailed is an error that contains all the missing info for a mismatched section
|
||||||
|
// between the api registrations and the api spec
|
||||||
|
type APIVerificationFailed struct {
|
||||||
|
Section string
|
||||||
|
MissingSpecification []string
|
||||||
|
MissingRegistration []string
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
func (v *APIVerificationFailed) Error() string {
|
||||||
|
buf := bytes.NewBuffer(nil)
|
||||||
|
|
||||||
|
hasRegMissing := len(v.MissingRegistration) > 0
|
||||||
|
hasSpecMissing := len(v.MissingSpecification) > 0
|
||||||
|
|
||||||
|
if hasRegMissing {
|
||||||
|
buf.WriteString(fmt.Sprintf("missing [%s] %s registrations", strings.Join(v.MissingRegistration, ", "), v.Section))
|
||||||
|
}
|
||||||
|
|
||||||
|
if hasRegMissing && hasSpecMissing {
|
||||||
|
buf.WriteString("\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
if hasSpecMissing {
|
||||||
|
buf.WriteString(fmt.Sprintf("missing from spec file [%s] %s", strings.Join(v.MissingSpecification, ", "), v.Section))
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf.String()
|
||||||
|
}
|
59
src/vendor/github.com/go-openapi/errors/parsing.go
generated
vendored
Normal file
59
src/vendor/github.com/go-openapi/errors/parsing.go
generated
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package errors
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// ParseError respresents a parsing error
|
||||||
|
type ParseError struct {
|
||||||
|
code int32
|
||||||
|
Name string
|
||||||
|
In string
|
||||||
|
Value string
|
||||||
|
Reason error
|
||||||
|
message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *ParseError) Error() string {
|
||||||
|
return e.message
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code returns the http status code for this error
|
||||||
|
func (e *ParseError) Code() int32 {
|
||||||
|
return e.code
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
parseErrorTemplContent = `parsing %s %s from %q failed, because %s`
|
||||||
|
parseErrorTemplContentNoIn = `parsing %s from %q failed, because %s`
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewParseError creates a new parse error
|
||||||
|
func NewParseError(name, in, value string, reason error) *ParseError {
|
||||||
|
var msg string
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(parseErrorTemplContentNoIn, name, value, reason)
|
||||||
|
} else {
|
||||||
|
msg = fmt.Sprintf(parseErrorTemplContent, name, in, value, reason)
|
||||||
|
}
|
||||||
|
return &ParseError{
|
||||||
|
code: 400,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: value,
|
||||||
|
Reason: reason,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
562
src/vendor/github.com/go-openapi/errors/schema.go
generated
vendored
Normal file
562
src/vendor/github.com/go-openapi/errors/schema.go
generated
vendored
Normal file
@ -0,0 +1,562 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package errors
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
invalidType = "%s is an invalid type name"
|
||||||
|
typeFail = "%s in %s must be of type %s"
|
||||||
|
typeFailWithData = "%s in %s must be of type %s: %q"
|
||||||
|
typeFailWithError = "%s in %s must be of type %s, because: %s"
|
||||||
|
requiredFail = "%s in %s is required"
|
||||||
|
tooLongMessage = "%s in %s should be at most %d chars long"
|
||||||
|
tooShortMessage = "%s in %s should be at least %d chars long"
|
||||||
|
patternFail = "%s in %s should match '%s'"
|
||||||
|
enumFail = "%s in %s should be one of %v"
|
||||||
|
multipleOfFail = "%s in %s should be a multiple of %v"
|
||||||
|
maxIncFail = "%s in %s should be less than or equal to %v"
|
||||||
|
maxExcFail = "%s in %s should be less than %v"
|
||||||
|
minIncFail = "%s in %s should be greater than or equal to %v"
|
||||||
|
minExcFail = "%s in %s should be greater than %v"
|
||||||
|
uniqueFail = "%s in %s shouldn't contain duplicates"
|
||||||
|
maxItemsFail = "%s in %s should have at most %d items"
|
||||||
|
minItemsFail = "%s in %s should have at least %d items"
|
||||||
|
typeFailNoIn = "%s must be of type %s"
|
||||||
|
typeFailWithDataNoIn = "%s must be of type %s: %q"
|
||||||
|
typeFailWithErrorNoIn = "%s must be of type %s, because: %s"
|
||||||
|
requiredFailNoIn = "%s is required"
|
||||||
|
tooLongMessageNoIn = "%s should be at most %d chars long"
|
||||||
|
tooShortMessageNoIn = "%s should be at least %d chars long"
|
||||||
|
patternFailNoIn = "%s should match '%s'"
|
||||||
|
enumFailNoIn = "%s should be one of %v"
|
||||||
|
multipleOfFailNoIn = "%s should be a multiple of %v"
|
||||||
|
maxIncFailNoIn = "%s should be less than or equal to %v"
|
||||||
|
maxExcFailNoIn = "%s should be less than %v"
|
||||||
|
minIncFailNoIn = "%s should be greater than or equal to %v"
|
||||||
|
minExcFailNoIn = "%s should be greater than %v"
|
||||||
|
uniqueFailNoIn = "%s shouldn't contain duplicates"
|
||||||
|
maxItemsFailNoIn = "%s should have at most %d items"
|
||||||
|
minItemsFailNoIn = "%s should have at least %d items"
|
||||||
|
noAdditionalItems = "%s in %s can't have additional items"
|
||||||
|
noAdditionalItemsNoIn = "%s can't have additional items"
|
||||||
|
tooFewProperties = "%s in %s should have at least %d properties"
|
||||||
|
tooFewPropertiesNoIn = "%s should have at least %d properties"
|
||||||
|
tooManyProperties = "%s in %s should have at most %d properties"
|
||||||
|
tooManyPropertiesNoIn = "%s should have at most %d properties"
|
||||||
|
unallowedProperty = "%s.%s in %s is a forbidden property"
|
||||||
|
unallowedPropertyNoIn = "%s.%s is a forbidden property"
|
||||||
|
failedAllPatternProps = "%s.%s in %s failed all pattern properties"
|
||||||
|
failedAllPatternPropsNoIn = "%s.%s failed all pattern properties"
|
||||||
|
multipleOfMustBePositive = "factor MultipleOf declared for %s must be positive: %v"
|
||||||
|
)
|
||||||
|
|
||||||
|
// All code responses can be used to differentiate errors for different handling
|
||||||
|
// by the consuming program
|
||||||
|
const (
|
||||||
|
// CompositeErrorCode remains 422 for backwards-compatibility
|
||||||
|
// and to separate it from validation errors with cause
|
||||||
|
CompositeErrorCode = 422
|
||||||
|
// InvalidTypeCode is used for any subclass of invalid types
|
||||||
|
InvalidTypeCode = 600 + iota
|
||||||
|
RequiredFailCode
|
||||||
|
TooLongFailCode
|
||||||
|
TooShortFailCode
|
||||||
|
PatternFailCode
|
||||||
|
EnumFailCode
|
||||||
|
MultipleOfFailCode
|
||||||
|
MaxFailCode
|
||||||
|
MinFailCode
|
||||||
|
UniqueFailCode
|
||||||
|
MaxItemsFailCode
|
||||||
|
MinItemsFailCode
|
||||||
|
NoAdditionalItemsCode
|
||||||
|
TooFewPropertiesCode
|
||||||
|
TooManyPropertiesCode
|
||||||
|
UnallowedPropertyCode
|
||||||
|
FailedAllPatternPropsCode
|
||||||
|
MultipleOfMustBePositiveCode
|
||||||
|
)
|
||||||
|
|
||||||
|
// CompositeError is an error that groups several errors together
|
||||||
|
type CompositeError struct {
|
||||||
|
Errors []error
|
||||||
|
code int32
|
||||||
|
message string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code for this error
|
||||||
|
func (c *CompositeError) Code() int32 {
|
||||||
|
return c.code
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CompositeError) Error() string {
|
||||||
|
if len(c.Errors) > 0 {
|
||||||
|
msgs := []string{c.message + ":"}
|
||||||
|
for _, e := range c.Errors {
|
||||||
|
msgs = append(msgs, e.Error())
|
||||||
|
}
|
||||||
|
return strings.Join(msgs, "\n")
|
||||||
|
}
|
||||||
|
return c.message
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompositeValidationError an error to wrap a bunch of other errors
|
||||||
|
func CompositeValidationError(errors ...error) *CompositeError {
|
||||||
|
return &CompositeError{
|
||||||
|
code: CompositeErrorCode,
|
||||||
|
Errors: append([]error{}, errors...),
|
||||||
|
message: "validation failure list",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FailedAllPatternProperties an error for when the property doesn't match a pattern
|
||||||
|
func FailedAllPatternProperties(name, in, key string) *Validation {
|
||||||
|
msg := fmt.Sprintf(failedAllPatternProps, name, key, in)
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(failedAllPatternPropsNoIn, name, key)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: FailedAllPatternPropsCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: key,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PropertyNotAllowed an error for when the property doesn't match a pattern
|
||||||
|
func PropertyNotAllowed(name, in, key string) *Validation {
|
||||||
|
msg := fmt.Sprintf(unallowedProperty, name, key, in)
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(unallowedPropertyNoIn, name, key)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: UnallowedPropertyCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: key,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TooFewProperties an error for an object with too few properties
|
||||||
|
func TooFewProperties(name, in string, n int64) *Validation {
|
||||||
|
msg := fmt.Sprintf(tooFewProperties, name, in, n)
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(tooFewPropertiesNoIn, name, n)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: TooFewPropertiesCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: n,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TooManyProperties an error for an object with too many properties
|
||||||
|
func TooManyProperties(name, in string, n int64) *Validation {
|
||||||
|
msg := fmt.Sprintf(tooManyProperties, name, in, n)
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(tooManyPropertiesNoIn, name, n)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: TooManyPropertiesCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: n,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdditionalItemsNotAllowed an error for invalid additional items
|
||||||
|
func AdditionalItemsNotAllowed(name, in string) *Validation {
|
||||||
|
msg := fmt.Sprintf(noAdditionalItems, name, in)
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(noAdditionalItemsNoIn, name)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: NoAdditionalItemsCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// InvalidCollectionFormat another flavor of invalid type error
|
||||||
|
func InvalidCollectionFormat(name, in, format string) *Validation {
|
||||||
|
return &Validation{
|
||||||
|
code: InvalidTypeCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: format,
|
||||||
|
message: fmt.Sprintf("the collection format %q is not supported for the %s param %q", format, in, name),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// InvalidTypeName an error for when the type is invalid
|
||||||
|
func InvalidTypeName(typeName string) *Validation {
|
||||||
|
return &Validation{
|
||||||
|
code: InvalidTypeCode,
|
||||||
|
Value: typeName,
|
||||||
|
message: fmt.Sprintf(invalidType, typeName),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// InvalidType creates an error for when the type is invalid
|
||||||
|
func InvalidType(name, in, typeName string, value interface{}) *Validation {
|
||||||
|
var message string
|
||||||
|
|
||||||
|
if in != "" {
|
||||||
|
switch value.(type) {
|
||||||
|
case string:
|
||||||
|
message = fmt.Sprintf(typeFailWithData, name, in, typeName, value)
|
||||||
|
case error:
|
||||||
|
message = fmt.Sprintf(typeFailWithError, name, in, typeName, value)
|
||||||
|
default:
|
||||||
|
message = fmt.Sprintf(typeFail, name, in, typeName)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch value.(type) {
|
||||||
|
case string:
|
||||||
|
message = fmt.Sprintf(typeFailWithDataNoIn, name, typeName, value)
|
||||||
|
case error:
|
||||||
|
message = fmt.Sprintf(typeFailWithErrorNoIn, name, typeName, value)
|
||||||
|
default:
|
||||||
|
message = fmt.Sprintf(typeFailNoIn, name, typeName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Validation{
|
||||||
|
code: InvalidTypeCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: value,
|
||||||
|
message: message,
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// DuplicateItems error for when an array contains duplicates
|
||||||
|
func DuplicateItems(name, in string) *Validation {
|
||||||
|
msg := fmt.Sprintf(uniqueFail, name, in)
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(uniqueFailNoIn, name)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: UniqueFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TooManyItems error for when an array contains too many items
|
||||||
|
func TooManyItems(name, in string, max int64) *Validation {
|
||||||
|
msg := fmt.Sprintf(maxItemsFail, name, in, max)
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(maxItemsFailNoIn, name, max)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Validation{
|
||||||
|
code: MaxItemsFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TooFewItems error for when an array contains too few items
|
||||||
|
func TooFewItems(name, in string, min int64) *Validation {
|
||||||
|
msg := fmt.Sprintf(minItemsFail, name, in, min)
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(minItemsFailNoIn, name, min)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: MinItemsFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExceedsMaximumInt error for when maxinum validation fails
|
||||||
|
func ExceedsMaximumInt(name, in string, max int64, exclusive bool) *Validation {
|
||||||
|
var message string
|
||||||
|
if in == "" {
|
||||||
|
m := maxIncFailNoIn
|
||||||
|
if exclusive {
|
||||||
|
m = maxExcFailNoIn
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, max)
|
||||||
|
} else {
|
||||||
|
m := maxIncFail
|
||||||
|
if exclusive {
|
||||||
|
m = maxExcFail
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, in, max)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: MaxFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: max,
|
||||||
|
message: message,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExceedsMaximumUint error for when maxinum validation fails
|
||||||
|
func ExceedsMaximumUint(name, in string, max uint64, exclusive bool) *Validation {
|
||||||
|
var message string
|
||||||
|
if in == "" {
|
||||||
|
m := maxIncFailNoIn
|
||||||
|
if exclusive {
|
||||||
|
m = maxExcFailNoIn
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, max)
|
||||||
|
} else {
|
||||||
|
m := maxIncFail
|
||||||
|
if exclusive {
|
||||||
|
m = maxExcFail
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, in, max)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: MaxFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: max,
|
||||||
|
message: message,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExceedsMaximum error for when maxinum validation fails
|
||||||
|
func ExceedsMaximum(name, in string, max float64, exclusive bool) *Validation {
|
||||||
|
var message string
|
||||||
|
if in == "" {
|
||||||
|
m := maxIncFailNoIn
|
||||||
|
if exclusive {
|
||||||
|
m = maxExcFailNoIn
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, max)
|
||||||
|
} else {
|
||||||
|
m := maxIncFail
|
||||||
|
if exclusive {
|
||||||
|
m = maxExcFail
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, in, max)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: MaxFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: max,
|
||||||
|
message: message,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExceedsMinimumInt error for when maxinum validation fails
|
||||||
|
func ExceedsMinimumInt(name, in string, min int64, exclusive bool) *Validation {
|
||||||
|
var message string
|
||||||
|
if in == "" {
|
||||||
|
m := minIncFailNoIn
|
||||||
|
if exclusive {
|
||||||
|
m = minExcFailNoIn
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, min)
|
||||||
|
} else {
|
||||||
|
m := minIncFail
|
||||||
|
if exclusive {
|
||||||
|
m = minExcFail
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, in, min)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: MinFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: min,
|
||||||
|
message: message,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExceedsMinimumUint error for when maxinum validation fails
|
||||||
|
func ExceedsMinimumUint(name, in string, min uint64, exclusive bool) *Validation {
|
||||||
|
var message string
|
||||||
|
if in == "" {
|
||||||
|
m := minIncFailNoIn
|
||||||
|
if exclusive {
|
||||||
|
m = minExcFailNoIn
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, min)
|
||||||
|
} else {
|
||||||
|
m := minIncFail
|
||||||
|
if exclusive {
|
||||||
|
m = minExcFail
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, in, min)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: MinFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: min,
|
||||||
|
message: message,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExceedsMinimum error for when maxinum validation fails
|
||||||
|
func ExceedsMinimum(name, in string, min float64, exclusive bool) *Validation {
|
||||||
|
var message string
|
||||||
|
if in == "" {
|
||||||
|
m := minIncFailNoIn
|
||||||
|
if exclusive {
|
||||||
|
m = minExcFailNoIn
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, min)
|
||||||
|
} else {
|
||||||
|
m := minIncFail
|
||||||
|
if exclusive {
|
||||||
|
m = minExcFail
|
||||||
|
}
|
||||||
|
message = fmt.Sprintf(m, name, in, min)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: MinFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: min,
|
||||||
|
message: message,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotMultipleOf error for when multiple of validation fails
|
||||||
|
func NotMultipleOf(name, in string, multiple interface{}) *Validation {
|
||||||
|
var msg string
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(multipleOfFailNoIn, name, multiple)
|
||||||
|
} else {
|
||||||
|
msg = fmt.Sprintf(multipleOfFail, name, in, multiple)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: MultipleOfFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: multiple,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// EnumFail error for when an enum validation fails
|
||||||
|
func EnumFail(name, in string, value interface{}, values []interface{}) *Validation {
|
||||||
|
var msg string
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(enumFailNoIn, name, values)
|
||||||
|
} else {
|
||||||
|
msg = fmt.Sprintf(enumFail, name, in, values)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Validation{
|
||||||
|
code: EnumFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: value,
|
||||||
|
Values: values,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Required error for when a value is missing
|
||||||
|
func Required(name, in string) *Validation {
|
||||||
|
var msg string
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(requiredFailNoIn, name)
|
||||||
|
} else {
|
||||||
|
msg = fmt.Sprintf(requiredFail, name, in)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: RequiredFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TooLong error for when a string is too long
|
||||||
|
func TooLong(name, in string, max int64) *Validation {
|
||||||
|
var msg string
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(tooLongMessageNoIn, name, max)
|
||||||
|
} else {
|
||||||
|
msg = fmt.Sprintf(tooLongMessage, name, in, max)
|
||||||
|
}
|
||||||
|
return &Validation{
|
||||||
|
code: TooLongFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TooShort error for when a string is too short
|
||||||
|
func TooShort(name, in string, min int64) *Validation {
|
||||||
|
var msg string
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(tooShortMessageNoIn, name, min)
|
||||||
|
} else {
|
||||||
|
msg = fmt.Sprintf(tooShortMessage, name, in, min)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Validation{
|
||||||
|
code: TooShortFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
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 {
|
||||||
|
var msg string
|
||||||
|
if in == "" {
|
||||||
|
msg = fmt.Sprintf(patternFailNoIn, name, pattern)
|
||||||
|
} else {
|
||||||
|
msg = fmt.Sprintf(patternFail, name, in, pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Validation{
|
||||||
|
code: PatternFailCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
message: msg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MultipleOfMustBePositive error for when a
|
||||||
|
// multipleOf factor is negative
|
||||||
|
func MultipleOfMustBePositive(name, in string, factor interface{}) *Validation {
|
||||||
|
return &Validation{
|
||||||
|
code: MultipleOfMustBePositiveCode,
|
||||||
|
Name: name,
|
||||||
|
In: in,
|
||||||
|
Value: factor,
|
||||||
|
message: fmt.Sprintf(multipleOfMustBePositive, name, factor),
|
||||||
|
}
|
||||||
|
}
|
26
src/vendor/github.com/go-openapi/jsonpointer/.editorconfig
generated
vendored
Normal file
26
src/vendor/github.com/go-openapi/jsonpointer/.editorconfig
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# Unix-style newlines with a newline ending every file
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
# Set default charset
|
||||||
|
[*.{js,py,go,scala,rb,java,html,css,less,sass,md}]
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
# Tab indentation (no size specified)
|
||||||
|
[*.go]
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
# Matches the exact files either package.json or .travis.yml
|
||||||
|
[{package.json,.travis.yml}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
1
src/vendor/github.com/go-openapi/jsonpointer/.gitignore
generated
vendored
Normal file
1
src/vendor/github.com/go-openapi/jsonpointer/.gitignore
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
secrets.yml
|
15
src/vendor/github.com/go-openapi/jsonpointer/.travis.yml
generated
vendored
Normal file
15
src/vendor/github.com/go-openapi/jsonpointer/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
|
go:
|
||||||
|
- 1.11.x
|
||||||
|
- 1.12.x
|
||||||
|
install:
|
||||||
|
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
||||||
|
env:
|
||||||
|
- GO111MODULE=on
|
||||||
|
language: go
|
||||||
|
notifications:
|
||||||
|
slack:
|
||||||
|
secure: a5VgoiwB1G/AZqzmephPZIhEB9avMlsWSlVnM1dSAtYAwdrQHGTQxAmpOxYIoSPDhWNN5bfZmjd29++UlTwLcHSR+e0kJhH6IfDlsHj/HplNCJ9tyI0zYc7XchtdKgeMxMzBKCzgwFXGSbQGydXTliDNBo0HOzmY3cou/daMFTP60K+offcjS+3LRAYb1EroSRXZqrk1nuF/xDL3792DZUdPMiFR/L/Df6y74D6/QP4sTkTDFQitz4Wy/7jbsfj8dG6qK2zivgV6/l+w4OVjFkxVpPXogDWY10vVXNVynqxfJ7to2d1I9lNCHE2ilBCkWMIPdyJF7hjF8pKW+82yP4EzRh0vu8Xn0HT5MZpQxdRY/YMxNrWaG7SxsoEaO4q5uhgdzAqLYY3TRa7MjIK+7Ur+aqOeTXn6OKwVi0CjvZ6mIU3WUKSwiwkFZMbjRAkSb5CYwMEfGFO/z964xz83qGt6WAtBXNotqCQpTIiKtDHQeLOMfksHImCg6JLhQcWBVxamVgu0G3Pdh8Y6DyPnxraXY95+QDavbjqv7TeYT9T/FNnrkXaTTK0s4iWE5H4ACU0Qvz0wUYgfQrZv0/Hp7V17+rabUwnzYySHCy9SWX/7OV9Cfh31iMp9ZIffr76xmmThtOEqs8TrTtU6BWI3rWwvA9cXQipZTVtL0oswrGw=
|
||||||
|
script:
|
||||||
|
- gotestsum -f short-verbose -- -race -coverprofile=coverage.txt -covermode=atomic ./...
|
74
src/vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md
generated
vendored
Normal file
74
src/vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity and
|
||||||
|
orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at ivan+abuse@flanders.co.nz. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/4/
|
202
src/vendor/github.com/go-openapi/jsonpointer/LICENSE
generated
vendored
Normal file
202
src/vendor/github.com/go-openapi/jsonpointer/LICENSE
generated
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
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
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
15
src/vendor/github.com/go-openapi/jsonpointer/README.md
generated
vendored
Normal file
15
src/vendor/github.com/go-openapi/jsonpointer/README.md
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# gojsonpointer [![Build Status](https://travis-ci.org/go-openapi/jsonpointer.svg?branch=master)](https://travis-ci.org/go-openapi/jsonpointer) [![codecov](https://codecov.io/gh/go-openapi/jsonpointer/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonpointer) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io)
|
||||||
|
|
||||||
|
[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/jsonpointer?status.svg)](http://godoc.org/github.com/go-openapi/jsonpointer)
|
||||||
|
An implementation of JSON Pointer - Go language
|
||||||
|
|
||||||
|
## Status
|
||||||
|
Completed YES
|
||||||
|
|
||||||
|
Tested YES
|
||||||
|
|
||||||
|
## References
|
||||||
|
http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07
|
||||||
|
|
||||||
|
### Note
|
||||||
|
The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array, the reference token MUST contain either...' is not implemented.
|
9
src/vendor/github.com/go-openapi/jsonpointer/go.mod
generated
vendored
Normal file
9
src/vendor/github.com/go-openapi/jsonpointer/go.mod
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
module github.com/go-openapi/jsonpointer
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/go-openapi/swag v0.19.5
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e // indirect
|
||||||
|
github.com/stretchr/testify v1.3.0
|
||||||
|
)
|
||||||
|
|
||||||
|
go 1.13
|
24
src/vendor/github.com/go-openapi/jsonpointer/go.sum
generated
vendored
Normal file
24
src/vendor/github.com/go-openapi/jsonpointer/go.sum
generated
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
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/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=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
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=
|
390
src/vendor/github.com/go-openapi/jsonpointer/pointer.go
generated
vendored
Normal file
390
src/vendor/github.com/go-openapi/jsonpointer/pointer.go
generated
vendored
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
// Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// author sigu-399
|
||||||
|
// author-github https://github.com/sigu-399
|
||||||
|
// author-mail sigu.399@gmail.com
|
||||||
|
//
|
||||||
|
// repository-name jsonpointer
|
||||||
|
// repository-desc An implementation of JSON Pointer - Go language
|
||||||
|
//
|
||||||
|
// description Main and unique file.
|
||||||
|
//
|
||||||
|
// created 25-02-2013
|
||||||
|
|
||||||
|
package jsonpointer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-openapi/swag"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
emptyPointer = ``
|
||||||
|
pointerSeparator = `/`
|
||||||
|
|
||||||
|
invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator
|
||||||
|
)
|
||||||
|
|
||||||
|
var jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem()
|
||||||
|
var jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem()
|
||||||
|
|
||||||
|
// JSONPointable is an interface for structs to implement when they need to customize the
|
||||||
|
// json pointer process
|
||||||
|
type JSONPointable interface {
|
||||||
|
JSONLookup(string) (interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSONSetable is an interface for structs to implement when they need to customize the
|
||||||
|
// json pointer process
|
||||||
|
type JSONSetable interface {
|
||||||
|
JSONSet(string, interface{}) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new json pointer for the given string
|
||||||
|
func New(jsonPointerString string) (Pointer, error) {
|
||||||
|
|
||||||
|
var p Pointer
|
||||||
|
err := p.parse(jsonPointerString)
|
||||||
|
return p, err
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pointer the json pointer reprsentation
|
||||||
|
type Pointer struct {
|
||||||
|
referenceTokens []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Constructor", parses the given string JSON pointer
|
||||||
|
func (p *Pointer) parse(jsonPointerString string) error {
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if jsonPointerString != emptyPointer {
|
||||||
|
if !strings.HasPrefix(jsonPointerString, pointerSeparator) {
|
||||||
|
err = errors.New(invalidStart)
|
||||||
|
} else {
|
||||||
|
referenceTokens := strings.Split(jsonPointerString, pointerSeparator)
|
||||||
|
for _, referenceToken := range referenceTokens[1:] {
|
||||||
|
p.referenceTokens = append(p.referenceTokens, referenceToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get uses the pointer to retrieve a value from a JSON document
|
||||||
|
func (p *Pointer) Get(document interface{}) (interface{}, reflect.Kind, error) {
|
||||||
|
return p.get(document, swag.DefaultJSONNameProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set uses the pointer to set a value from a JSON document
|
||||||
|
func (p *Pointer) Set(document interface{}, value interface{}) (interface{}, error) {
|
||||||
|
return document, p.set(document, value, swag.DefaultJSONNameProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetForToken gets a value for a json pointer token 1 level deep
|
||||||
|
func GetForToken(document interface{}, decodedToken string) (interface{}, reflect.Kind, error) {
|
||||||
|
return getSingleImpl(document, decodedToken, swag.DefaultJSONNameProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetForToken gets a value for a json pointer token 1 level deep
|
||||||
|
func SetForToken(document interface{}, decodedToken string, value interface{}) (interface{}, error) {
|
||||||
|
return document, setSingleImpl(document, value, decodedToken, swag.DefaultJSONNameProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) {
|
||||||
|
rValue := reflect.Indirect(reflect.ValueOf(node))
|
||||||
|
kind := rValue.Kind()
|
||||||
|
|
||||||
|
switch kind {
|
||||||
|
|
||||||
|
case reflect.Struct:
|
||||||
|
if rValue.Type().Implements(jsonPointableType) {
|
||||||
|
r, err := node.(JSONPointable).JSONLookup(decodedToken)
|
||||||
|
if err != nil {
|
||||||
|
return nil, kind, err
|
||||||
|
}
|
||||||
|
return r, kind, nil
|
||||||
|
}
|
||||||
|
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
|
||||||
|
if !ok {
|
||||||
|
return nil, kind, fmt.Errorf("object has no field %q", decodedToken)
|
||||||
|
}
|
||||||
|
fld := rValue.FieldByName(nm)
|
||||||
|
return fld.Interface(), kind, nil
|
||||||
|
|
||||||
|
case reflect.Map:
|
||||||
|
kv := reflect.ValueOf(decodedToken)
|
||||||
|
mv := rValue.MapIndex(kv)
|
||||||
|
|
||||||
|
if mv.IsValid() {
|
||||||
|
return mv.Interface(), kind, nil
|
||||||
|
}
|
||||||
|
return nil, kind, fmt.Errorf("object has no key %q", decodedToken)
|
||||||
|
|
||||||
|
case reflect.Slice:
|
||||||
|
tokenIndex, err := strconv.Atoi(decodedToken)
|
||||||
|
if err != nil {
|
||||||
|
return nil, kind, err
|
||||||
|
}
|
||||||
|
sLength := rValue.Len()
|
||||||
|
if tokenIndex < 0 || tokenIndex >= sLength {
|
||||||
|
return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength-1, tokenIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
elem := rValue.Index(tokenIndex)
|
||||||
|
return elem.Interface(), kind, nil
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil, kind, fmt.Errorf("invalid token reference %q", decodedToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func setSingleImpl(node, data interface{}, decodedToken string, nameProvider *swag.NameProvider) error {
|
||||||
|
rValue := reflect.Indirect(reflect.ValueOf(node))
|
||||||
|
switch rValue.Kind() {
|
||||||
|
|
||||||
|
case reflect.Struct:
|
||||||
|
if ns, ok := node.(JSONSetable); ok { // pointer impl
|
||||||
|
return ns.JSONSet(decodedToken, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if rValue.Type().Implements(jsonSetableType) {
|
||||||
|
return node.(JSONSetable).JSONSet(decodedToken, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("object has no field %q", decodedToken)
|
||||||
|
}
|
||||||
|
fld := rValue.FieldByName(nm)
|
||||||
|
if fld.IsValid() {
|
||||||
|
fld.Set(reflect.ValueOf(data))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
|
case reflect.Map:
|
||||||
|
kv := reflect.ValueOf(decodedToken)
|
||||||
|
rValue.SetMapIndex(kv, reflect.ValueOf(data))
|
||||||
|
return nil
|
||||||
|
|
||||||
|
case reflect.Slice:
|
||||||
|
tokenIndex, err := strconv.Atoi(decodedToken)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
sLength := rValue.Len()
|
||||||
|
if tokenIndex < 0 || tokenIndex >= sLength {
|
||||||
|
return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
elem := rValue.Index(tokenIndex)
|
||||||
|
if !elem.CanSet() {
|
||||||
|
return fmt.Errorf("can't set slice index %s to %v", decodedToken, data)
|
||||||
|
}
|
||||||
|
elem.Set(reflect.ValueOf(data))
|
||||||
|
return nil
|
||||||
|
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("invalid token reference %q", decodedToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Pointer) get(node interface{}, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) {
|
||||||
|
|
||||||
|
if nameProvider == nil {
|
||||||
|
nameProvider = swag.DefaultJSONNameProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
kind := reflect.Invalid
|
||||||
|
|
||||||
|
// Full document when empty
|
||||||
|
if len(p.referenceTokens) == 0 {
|
||||||
|
return node, kind, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, token := range p.referenceTokens {
|
||||||
|
|
||||||
|
decodedToken := Unescape(token)
|
||||||
|
|
||||||
|
r, knd, err := getSingleImpl(node, decodedToken, nameProvider)
|
||||||
|
if err != nil {
|
||||||
|
return nil, knd, err
|
||||||
|
}
|
||||||
|
node, kind = r, knd
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
rValue := reflect.ValueOf(node)
|
||||||
|
kind = rValue.Kind()
|
||||||
|
|
||||||
|
return node, kind, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Pointer) set(node, data interface{}, nameProvider *swag.NameProvider) error {
|
||||||
|
knd := reflect.ValueOf(node).Kind()
|
||||||
|
|
||||||
|
if knd != reflect.Ptr && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array {
|
||||||
|
return fmt.Errorf("only structs, pointers, maps and slices are supported for setting values")
|
||||||
|
}
|
||||||
|
|
||||||
|
if nameProvider == nil {
|
||||||
|
nameProvider = swag.DefaultJSONNameProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
// Full document when empty
|
||||||
|
if len(p.referenceTokens) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
lastI := len(p.referenceTokens) - 1
|
||||||
|
for i, token := range p.referenceTokens {
|
||||||
|
isLastToken := i == lastI
|
||||||
|
decodedToken := Unescape(token)
|
||||||
|
|
||||||
|
if isLastToken {
|
||||||
|
|
||||||
|
return setSingleImpl(node, data, decodedToken, nameProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
rValue := reflect.Indirect(reflect.ValueOf(node))
|
||||||
|
kind := rValue.Kind()
|
||||||
|
|
||||||
|
switch kind {
|
||||||
|
|
||||||
|
case reflect.Struct:
|
||||||
|
if rValue.Type().Implements(jsonPointableType) {
|
||||||
|
r, err := node.(JSONPointable).JSONLookup(decodedToken)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fld := reflect.ValueOf(r)
|
||||||
|
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr {
|
||||||
|
node = fld.Addr().Interface()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
node = r
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("object has no field %q", decodedToken)
|
||||||
|
}
|
||||||
|
fld := rValue.FieldByName(nm)
|
||||||
|
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr {
|
||||||
|
node = fld.Addr().Interface()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
node = fld.Interface()
|
||||||
|
|
||||||
|
case reflect.Map:
|
||||||
|
kv := reflect.ValueOf(decodedToken)
|
||||||
|
mv := rValue.MapIndex(kv)
|
||||||
|
|
||||||
|
if !mv.IsValid() {
|
||||||
|
return fmt.Errorf("object has no key %q", decodedToken)
|
||||||
|
}
|
||||||
|
if mv.CanAddr() && mv.Kind() != reflect.Interface && mv.Kind() != reflect.Map && mv.Kind() != reflect.Slice && mv.Kind() != reflect.Ptr {
|
||||||
|
node = mv.Addr().Interface()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
node = mv.Interface()
|
||||||
|
|
||||||
|
case reflect.Slice:
|
||||||
|
tokenIndex, err := strconv.Atoi(decodedToken)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
sLength := rValue.Len()
|
||||||
|
if tokenIndex < 0 || tokenIndex >= sLength {
|
||||||
|
return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
elem := rValue.Index(tokenIndex)
|
||||||
|
if elem.CanAddr() && elem.Kind() != reflect.Interface && elem.Kind() != reflect.Map && elem.Kind() != reflect.Slice && elem.Kind() != reflect.Ptr {
|
||||||
|
node = elem.Addr().Interface()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
node = elem.Interface()
|
||||||
|
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("invalid token reference %q", decodedToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecodedTokens returns the decoded tokens
|
||||||
|
func (p *Pointer) DecodedTokens() []string {
|
||||||
|
result := make([]string, 0, len(p.referenceTokens))
|
||||||
|
for _, t := range p.referenceTokens {
|
||||||
|
result = append(result, Unescape(t))
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty returns true if this is an empty json pointer
|
||||||
|
// this indicates that it points to the root document
|
||||||
|
func (p *Pointer) IsEmpty() bool {
|
||||||
|
return len(p.referenceTokens) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pointer to string representation function
|
||||||
|
func (p *Pointer) String() string {
|
||||||
|
|
||||||
|
if len(p.referenceTokens) == 0 {
|
||||||
|
return emptyPointer
|
||||||
|
}
|
||||||
|
|
||||||
|
pointerString := pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator)
|
||||||
|
|
||||||
|
return pointerString
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specific JSON pointer encoding here
|
||||||
|
// ~0 => ~
|
||||||
|
// ~1 => /
|
||||||
|
// ... and vice versa
|
||||||
|
|
||||||
|
const (
|
||||||
|
encRefTok0 = `~0`
|
||||||
|
encRefTok1 = `~1`
|
||||||
|
decRefTok0 = `~`
|
||||||
|
decRefTok1 = `/`
|
||||||
|
)
|
||||||
|
|
||||||
|
// Unescape unescapes a json pointer reference token string to the original representation
|
||||||
|
func Unescape(token string) string {
|
||||||
|
step1 := strings.Replace(token, encRefTok1, decRefTok1, -1)
|
||||||
|
step2 := strings.Replace(step1, encRefTok0, decRefTok0, -1)
|
||||||
|
return step2
|
||||||
|
}
|
||||||
|
|
||||||
|
// Escape escapes a pointer reference token string
|
||||||
|
func Escape(token string) string {
|
||||||
|
step1 := strings.Replace(token, decRefTok0, encRefTok0, -1)
|
||||||
|
step2 := strings.Replace(step1, decRefTok1, encRefTok1, -1)
|
||||||
|
return step2
|
||||||
|
}
|
1
src/vendor/github.com/go-openapi/jsonreference/.gitignore
generated
vendored
Normal file
1
src/vendor/github.com/go-openapi/jsonreference/.gitignore
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
secrets.yml
|
15
src/vendor/github.com/go-openapi/jsonreference/.travis.yml
generated
vendored
Normal file
15
src/vendor/github.com/go-openapi/jsonreference/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
|
go:
|
||||||
|
- 1.11.x
|
||||||
|
- 1.12.x
|
||||||
|
install:
|
||||||
|
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
||||||
|
env:
|
||||||
|
- GO111MODULE=on
|
||||||
|
language: go
|
||||||
|
notifications:
|
||||||
|
slack:
|
||||||
|
secure: OpQG/36F7DSF00HLm9WZMhyqFCYYyYTsVDObW226cWiR8PWYiNfLZiSEvIzT1Gx4dDjhigKTIqcLhG34CkL5iNXDjm9Yyo2RYhQPlK8NErNqUEXuBqn4RqYHW48VGhEhOyDd4Ei0E2FN5ZbgpvHgtpkdZ6XDi64r3Ac89isP9aPHXQTuv2Jog6b4/OKKiUTftLcTIst0p4Cp3gqOJWf1wnoj+IadWiECNVQT6zb47IYjtyw6+uV8iUjTzdKcRB6Zc6b4Dq7JAg1Zd7Jfxkql3hlKp4PNlRf9Cy7y5iA3G7MLyg3FcPX5z2kmcyPt2jOTRMBWUJ5zIQpOxizAcN8WsT3WWBL5KbuYK6k0PzujrIDLqdxGpNmjkkMfDBT9cKmZpm2FdW+oZgPFJP+oKmAo4u4KJz/vjiPTXgQlN5bmrLuRMCp+AwC5wkIohTqWZVPE2TK6ZSnMYcg/W39s+RP/9mJoyryAvPSpBOLTI+biCgaUCTOAZxNTWpMFc3tPYntc41WWkdKcooZ9JA5DwfcaVFyTGQ3YXz+HvX6G1z/gW0Q/A4dBi9mj2iE1xm7tRTT+4VQ2AXFvSEI1HJpfPgYnwAtwOD1v3Qm2EUHk9sCdtEDR4wVGEPIVn44GnwFMnGKx9JWppMPYwFu3SVDdHt+E+LOlhZUply11Aa+IVrT2KUQ=
|
||||||
|
script:
|
||||||
|
- gotestsum -f short-verbose -- -race -coverprofile=coverage.txt -covermode=atomic ./...
|
74
src/vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md
generated
vendored
Normal file
74
src/vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity and
|
||||||
|
orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at ivan+abuse@flanders.co.nz. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/4/
|
202
src/vendor/github.com/go-openapi/jsonreference/LICENSE
generated
vendored
Normal file
202
src/vendor/github.com/go-openapi/jsonreference/LICENSE
generated
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
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
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
15
src/vendor/github.com/go-openapi/jsonreference/README.md
generated
vendored
Normal file
15
src/vendor/github.com/go-openapi/jsonreference/README.md
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# gojsonreference [![Build Status](https://travis-ci.org/go-openapi/jsonreference.svg?branch=master)](https://travis-ci.org/go-openapi/jsonreference) [![codecov](https://codecov.io/gh/go-openapi/jsonreference/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonreference) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io)
|
||||||
|
|
||||||
|
[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/jsonreference?status.svg)](http://godoc.org/github.com/go-openapi/jsonreference)
|
||||||
|
An implementation of JSON Reference - Go language
|
||||||
|
|
||||||
|
## Status
|
||||||
|
Work in progress ( 90% done )
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
https://github.com/go-openapi/jsonpointer
|
||||||
|
|
||||||
|
## References
|
||||||
|
http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07
|
||||||
|
|
||||||
|
http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03
|
10
src/vendor/github.com/go-openapi/jsonreference/go.mod
generated
vendored
Normal file
10
src/vendor/github.com/go-openapi/jsonreference/go.mod
generated
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
module github.com/go-openapi/jsonreference
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/PuerkitoBio/purell v1.1.1
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
|
||||||
|
github.com/go-openapi/jsonpointer v0.19.2
|
||||||
|
github.com/stretchr/testify v1.3.0
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 // indirect
|
||||||
|
golang.org/x/text v0.3.2 // indirect
|
||||||
|
)
|
36
src/vendor/github.com/go-openapi/jsonreference/go.sum
generated
vendored
Normal file
36
src/vendor/github.com/go-openapi/jsonreference/go.sum
generated
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
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=
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
|
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/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
|
||||||
|
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||||
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4=
|
||||||
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
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/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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
156
src/vendor/github.com/go-openapi/jsonreference/reference.go
generated
vendored
Normal file
156
src/vendor/github.com/go-openapi/jsonreference/reference.go
generated
vendored
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
// Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// author sigu-399
|
||||||
|
// author-github https://github.com/sigu-399
|
||||||
|
// author-mail sigu.399@gmail.com
|
||||||
|
//
|
||||||
|
// repository-name jsonreference
|
||||||
|
// repository-desc An implementation of JSON Reference - Go language
|
||||||
|
//
|
||||||
|
// description Main and unique file.
|
||||||
|
//
|
||||||
|
// created 26-02-2013
|
||||||
|
|
||||||
|
package jsonreference
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/PuerkitoBio/purell"
|
||||||
|
"github.com/go-openapi/jsonpointer"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
fragmentRune = `#`
|
||||||
|
)
|
||||||
|
|
||||||
|
// New creates a new reference for the given string
|
||||||
|
func New(jsonReferenceString string) (Ref, error) {
|
||||||
|
|
||||||
|
var r Ref
|
||||||
|
err := r.parse(jsonReferenceString)
|
||||||
|
return r, err
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustCreateRef parses the ref string and panics when it's invalid.
|
||||||
|
// Use the New method for a version that returns an error
|
||||||
|
func MustCreateRef(ref string) Ref {
|
||||||
|
r, err := New(ref)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ref represents a json reference object
|
||||||
|
type Ref struct {
|
||||||
|
referenceURL *url.URL
|
||||||
|
referencePointer jsonpointer.Pointer
|
||||||
|
|
||||||
|
HasFullURL bool
|
||||||
|
HasURLPathOnly bool
|
||||||
|
HasFragmentOnly bool
|
||||||
|
HasFileScheme bool
|
||||||
|
HasFullFilePath bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetURL gets the URL for this reference
|
||||||
|
func (r *Ref) GetURL() *url.URL {
|
||||||
|
return r.referenceURL
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPointer gets the json pointer for this reference
|
||||||
|
func (r *Ref) GetPointer() *jsonpointer.Pointer {
|
||||||
|
return &r.referencePointer
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns the best version of the url for this reference
|
||||||
|
func (r *Ref) String() string {
|
||||||
|
|
||||||
|
if r.referenceURL != nil {
|
||||||
|
return r.referenceURL.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.HasFragmentOnly {
|
||||||
|
return fragmentRune + r.referencePointer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.referencePointer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsRoot returns true if this reference is a root document
|
||||||
|
func (r *Ref) IsRoot() bool {
|
||||||
|
return r.referenceURL != nil &&
|
||||||
|
!r.IsCanonical() &&
|
||||||
|
!r.HasURLPathOnly &&
|
||||||
|
r.referenceURL.Fragment == ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsCanonical returns true when this pointer starts with http(s):// or file://
|
||||||
|
func (r *Ref) IsCanonical() bool {
|
||||||
|
return (r.HasFileScheme && r.HasFullFilePath) || (!r.HasFileScheme && r.HasFullURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Constructor", parses the given string JSON reference
|
||||||
|
func (r *Ref) parse(jsonReferenceString string) error {
|
||||||
|
|
||||||
|
parsed, err := url.Parse(jsonReferenceString)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.referenceURL, _ = url.Parse(purell.NormalizeURL(parsed, purell.FlagsSafe|purell.FlagRemoveDuplicateSlashes))
|
||||||
|
refURL := r.referenceURL
|
||||||
|
|
||||||
|
if refURL.Scheme != "" && refURL.Host != "" {
|
||||||
|
r.HasFullURL = true
|
||||||
|
} else {
|
||||||
|
if refURL.Path != "" {
|
||||||
|
r.HasURLPathOnly = true
|
||||||
|
} else if refURL.RawQuery == "" && refURL.Fragment != "" {
|
||||||
|
r.HasFragmentOnly = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r.HasFileScheme = refURL.Scheme == "file"
|
||||||
|
r.HasFullFilePath = strings.HasPrefix(refURL.Path, "/")
|
||||||
|
|
||||||
|
// invalid json-pointer error means url has no json-pointer fragment. simply ignore error
|
||||||
|
r.referencePointer, _ = jsonpointer.New(refURL.Fragment)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inherits creates a new reference from a parent and a child
|
||||||
|
// If the child cannot inherit from the parent, an error is returned
|
||||||
|
func (r *Ref) Inherits(child Ref) (*Ref, error) {
|
||||||
|
childURL := child.GetURL()
|
||||||
|
parentURL := r.GetURL()
|
||||||
|
if childURL == nil {
|
||||||
|
return nil, errors.New("child url is nil")
|
||||||
|
}
|
||||||
|
if parentURL == nil {
|
||||||
|
return &child, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ref, err := New(parentURL.ResolveReference(childURL).String())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ref, nil
|
||||||
|
}
|
26
src/vendor/github.com/go-openapi/loads/.editorconfig
generated
vendored
Normal file
26
src/vendor/github.com/go-openapi/loads/.editorconfig
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# Unix-style newlines with a newline ending every file
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
# Set default charset
|
||||||
|
[*.{js,py,go,scala,rb,java,html,css,less,sass,md}]
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
# Tab indentation (no size specified)
|
||||||
|
[*.go]
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
# Matches the exact files either package.json or .travis.yml
|
||||||
|
[{package.json,.travis.yml}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
4
src/vendor/github.com/go-openapi/loads/.gitignore
generated
vendored
Normal file
4
src/vendor/github.com/go-openapi/loads/.gitignore
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
secrets.yml
|
||||||
|
coverage.out
|
||||||
|
profile.cov
|
||||||
|
profile.out
|
22
src/vendor/github.com/go-openapi/loads/.golangci.yml
generated
vendored
Normal file
22
src/vendor/github.com/go-openapi/loads/.golangci.yml
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
linters-settings:
|
||||||
|
govet:
|
||||||
|
check-shadowing: true
|
||||||
|
golint:
|
||||||
|
min-confidence: 0
|
||||||
|
gocyclo:
|
||||||
|
min-complexity: 30
|
||||||
|
maligned:
|
||||||
|
suggest-new: true
|
||||||
|
dupl:
|
||||||
|
threshold: 100
|
||||||
|
goconst:
|
||||||
|
min-len: 2
|
||||||
|
min-occurrences: 4
|
||||||
|
|
||||||
|
linters:
|
||||||
|
enable-all: true
|
||||||
|
disable:
|
||||||
|
- maligned
|
||||||
|
- lll
|
||||||
|
- gochecknoglobals
|
||||||
|
- gochecknoinits
|
15
src/vendor/github.com/go-openapi/loads/.travis.yml
generated
vendored
Normal file
15
src/vendor/github.com/go-openapi/loads/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
|
go:
|
||||||
|
- 1.11.x
|
||||||
|
- 1.12.x
|
||||||
|
install:
|
||||||
|
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
||||||
|
env:
|
||||||
|
- GO111MODULE=on
|
||||||
|
language: go
|
||||||
|
notifications:
|
||||||
|
slack:
|
||||||
|
secure: OxkPwVp35qBTUilgWC8xykSj+sGMcj0h8IIOKD+Rflx2schZVlFfdYdyVBM+s9OqeOfvtuvnR9v1Ye2rPKAvcjWdC4LpRGUsgmItZaI6Um8Aj6+K9udCw5qrtZVfOVmRu8LieH//XznWWKdOultUuniW0MLqw5+II87Gd00RWbCGi0hk0PykHe7uK+PDA2BEbqyZ2WKKYCvfB3j+0nrFOHScXqnh0V05l2E83J4+Sgy1fsPy+1WdX58ZlNBG333ibaC1FS79XvKSmTgKRkx3+YBo97u6ZtUmJa5WZjf2OdLG3KIckGWAv6R5xgxeU31N0Ng8L332w/Edpp2O/M2bZwdnKJ8hJQikXIAQbICbr+lTDzsoNzMdEIYcHpJ5hjPbiUl3Bmd+Jnsjf5McgAZDiWIfpCKZ29tPCEkVwRsOCqkyPRMNMzHHmoja495P5jR+ODS7+J8RFg5xgcnOgpP9D4Wlhztlf5WyZMpkLxTUD+bZq2SRf50HfHFXTkfq22zPl3d1eq0yrLwh/Z/fWKkfb6SyysROL8y6s8u3dpFX1YHSg0BR6i913h4aoZw9B2BG27cafLLTwKYsp2dFo1PWl4O6u9giFJIeqwloZHLKKrwh0cBFhB7RH0I58asxkZpCH6uWjJierahmHe7iS+E6i+9oCHkOZ59hmCYNimIs3hM=
|
||||||
|
script:
|
||||||
|
- gotestsum -f short-verbose -- -race -timeout=20m -coverprofile=coverage.txt -covermode=atomic ./...
|
74
src/vendor/github.com/go-openapi/loads/CODE_OF_CONDUCT.md
generated
vendored
Normal file
74
src/vendor/github.com/go-openapi/loads/CODE_OF_CONDUCT.md
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity and
|
||||||
|
orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at ivan+abuse@flanders.co.nz. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/4/
|
202
src/vendor/github.com/go-openapi/loads/LICENSE
generated
vendored
Normal file
202
src/vendor/github.com/go-openapi/loads/LICENSE
generated
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
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
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
7
src/vendor/github.com/go-openapi/loads/README.md
generated
vendored
Normal file
7
src/vendor/github.com/go-openapi/loads/README.md
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# Loads OAI specs [![Build Status](https://travis-ci.org/go-openapi/loads.svg?branch=master)](https://travis-ci.org/go-openapi/loads) [![codecov](https://codecov.io/gh/go-openapi/loads/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/loads) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io)
|
||||||
|
|
||||||
|
[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/loads/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/loads?status.svg)](http://godoc.org/github.com/go-openapi/loads)
|
||||||
|
[![GolangCI](https://golangci.com/badges/github.com/go-openapi/loads.svg)](https://golangci.com)
|
||||||
|
[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/loads)](https://goreportcard.com/report/github.com/go-openapi/loads)
|
||||||
|
|
||||||
|
Loading of OAI specification documents from local or remote locations. Supports JSON and YAML documents.
|
21
src/vendor/github.com/go-openapi/loads/doc.go
generated
vendored
Normal file
21
src/vendor/github.com/go-openapi/loads/doc.go
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package loads provides document loading methods for swagger (OAI) specifications.
|
||||||
|
|
||||||
|
It is used by other go-openapi packages to load and run analysis on local or remote spec documents.
|
||||||
|
|
||||||
|
*/
|
||||||
|
package loads
|
11
src/vendor/github.com/go-openapi/loads/go.mod
generated
vendored
Normal file
11
src/vendor/github.com/go-openapi/loads/go.mod
generated
vendored
Normal file
@ -0,0 +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/stretchr/testify v1.3.0
|
||||||
|
gopkg.in/yaml.v2 v2.2.2
|
||||||
|
)
|
||||||
|
|
||||||
|
go 1.13
|
96
src/vendor/github.com/go-openapi/loads/go.sum
generated
vendored
Normal file
96
src/vendor/github.com/go-openapi/loads/go.sum
generated
vendored
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
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=
|
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||||
|
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/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/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/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=
|
||||||
|
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.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
|
||||||
|
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
|
||||||
|
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/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/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-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
|
||||||
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
|
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/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/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/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
||||||
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
||||||
|
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/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=
|
||||||
|
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=
|
||||||
|
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/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/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/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=
|
298
src/vendor/github.com/go-openapi/loads/spec.go
generated
vendored
Normal file
298
src/vendor/github.com/go-openapi/loads/spec.go
generated
vendored
Normal file
@ -0,0 +1,298 @@
|
|||||||
|
// Copyright 2015 go-swagger maintainers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package loads
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/gob"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
|
||||||
|
"github.com/go-openapi/analysis"
|
||||||
|
"github.com/go-openapi/spec"
|
||||||
|
"github.com/go-openapi/swag"
|
||||||
|
)
|
||||||
|
|
||||||
|
// JSONDoc loads a json document from either a file or a remote url
|
||||||
|
func JSONDoc(path string) (json.RawMessage, error) {
|
||||||
|
data, err := swag.LoadFromFileOrHTTP(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return json.RawMessage(data), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DocLoader represents a doc loader type
|
||||||
|
type DocLoader func(string) (json.RawMessage, error)
|
||||||
|
|
||||||
|
// DocMatcher represents a predicate to check if a loader matches
|
||||||
|
type DocMatcher func(string) bool
|
||||||
|
|
||||||
|
var (
|
||||||
|
loaders *loader
|
||||||
|
defaultLoader *loader
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
defaultLoader = &loader{Match: func(_ string) bool { return true }, Fn: JSONDoc}
|
||||||
|
loaders = defaultLoader
|
||||||
|
spec.PathLoader = loaders.Fn
|
||||||
|
AddLoader(swag.YAMLMatcher, swag.YAMLDoc)
|
||||||
|
|
||||||
|
gob.Register(map[string]interface{}{})
|
||||||
|
gob.Register([]interface{}{})
|
||||||
|
//gob.Register(spec.Refable{})
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddLoader for a document
|
||||||
|
func AddLoader(predicate DocMatcher, load DocLoader) {
|
||||||
|
prev := loaders
|
||||||
|
loaders = &loader{
|
||||||
|
Match: predicate,
|
||||||
|
Fn: load,
|
||||||
|
Next: prev,
|
||||||
|
}
|
||||||
|
spec.PathLoader = loaders.Fn
|
||||||
|
}
|
||||||
|
|
||||||
|
type loader struct {
|
||||||
|
Fn DocLoader
|
||||||
|
Match DocMatcher
|
||||||
|
Next *loader
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSONSpec loads a spec from a json document
|
||||||
|
func JSONSpec(path string) (*Document, error) {
|
||||||
|
data, err := JSONDoc(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// convert to json
|
||||||
|
return Analyzed(data, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Document represents a swagger spec document
|
||||||
|
type Document struct {
|
||||||
|
// specAnalyzer
|
||||||
|
Analyzer *analysis.Spec
|
||||||
|
spec *spec.Swagger
|
||||||
|
specFilePath string
|
||||||
|
origSpec *spec.Swagger
|
||||||
|
schema *spec.Schema
|
||||||
|
raw json.RawMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
// Embedded returns a Document based on embedded specs. No analysis is required
|
||||||
|
func Embedded(orig, flat json.RawMessage) (*Document, error) {
|
||||||
|
var origSpec, flatSpec spec.Swagger
|
||||||
|
if err := json.Unmarshal(orig, &origSpec); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal(flat, &flatSpec); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &Document{
|
||||||
|
raw: orig,
|
||||||
|
origSpec: &origSpec,
|
||||||
|
spec: &flatSpec,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spec loads a new spec document
|
||||||
|
func Spec(path string) (*Document, error) {
|
||||||
|
specURL, err := url.Parse(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var lastErr error
|
||||||
|
for l := loaders.Next; l != nil; l = l.Next {
|
||||||
|
if loaders.Match(specURL.Path) {
|
||||||
|
b, err2 := loaders.Fn(path)
|
||||||
|
if err2 != nil {
|
||||||
|
lastErr = err2
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
doc, err3 := Analyzed(b, "")
|
||||||
|
if err3 != nil {
|
||||||
|
return nil, err3
|
||||||
|
}
|
||||||
|
if doc != nil {
|
||||||
|
doc.specFilePath = path
|
||||||
|
}
|
||||||
|
return doc, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if lastErr != nil {
|
||||||
|
return nil, lastErr
|
||||||
|
}
|
||||||
|
b, err := defaultLoader.Fn(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
document, err := Analyzed(b, "")
|
||||||
|
if document != nil {
|
||||||
|
document.specFilePath = path
|
||||||
|
}
|
||||||
|
|
||||||
|
return document, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Analyzed creates a new analyzed spec document
|
||||||
|
func Analyzed(data json.RawMessage, version string) (*Document, error) {
|
||||||
|
if version == "" {
|
||||||
|
version = "2.0"
|
||||||
|
}
|
||||||
|
if version != "2.0" {
|
||||||
|
return nil, fmt.Errorf("spec version %q is not supported", version)
|
||||||
|
}
|
||||||
|
|
||||||
|
raw := data
|
||||||
|
trimmed := bytes.TrimSpace(data)
|
||||||
|
if len(trimmed) > 0 {
|
||||||
|
if trimmed[0] != '{' && trimmed[0] != '[' {
|
||||||
|
yml, err := swag.BytesToYAMLDoc(trimmed)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("analyzed: %v", err)
|
||||||
|
}
|
||||||
|
d, err := swag.YAMLToJSON(yml)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("analyzed: %v", err)
|
||||||
|
}
|
||||||
|
raw = d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
swspec := new(spec.Swagger)
|
||||||
|
if err := json.Unmarshal(raw, swspec); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
origsqspec, err := cloneSpec(swspec)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
d := &Document{
|
||||||
|
Analyzer: analysis.New(swspec),
|
||||||
|
schema: spec.MustLoadSwagger20Schema(),
|
||||||
|
spec: swspec,
|
||||||
|
raw: raw,
|
||||||
|
origSpec: origsqspec,
|
||||||
|
}
|
||||||
|
return d, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expanded expands the ref fields in the spec document and returns a new spec document
|
||||||
|
func (d *Document) Expanded(options ...*spec.ExpandOptions) (*Document, error) {
|
||||||
|
swspec := new(spec.Swagger)
|
||||||
|
if err := json.Unmarshal(d.raw, swspec); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var expandOptions *spec.ExpandOptions
|
||||||
|
if len(options) > 0 {
|
||||||
|
expandOptions = options[0]
|
||||||
|
} else {
|
||||||
|
expandOptions = &spec.ExpandOptions{
|
||||||
|
RelativeBase: d.specFilePath,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := spec.ExpandSpec(swspec, expandOptions); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dd := &Document{
|
||||||
|
Analyzer: analysis.New(swspec),
|
||||||
|
spec: swspec,
|
||||||
|
specFilePath: d.specFilePath,
|
||||||
|
schema: spec.MustLoadSwagger20Schema(),
|
||||||
|
raw: d.raw,
|
||||||
|
origSpec: d.origSpec,
|
||||||
|
}
|
||||||
|
return dd, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// BasePath the base path for this spec
|
||||||
|
func (d *Document) BasePath() string {
|
||||||
|
return d.spec.BasePath
|
||||||
|
}
|
||||||
|
|
||||||
|
// Version returns the version of this spec
|
||||||
|
func (d *Document) Version() string {
|
||||||
|
return d.spec.Swagger
|
||||||
|
}
|
||||||
|
|
||||||
|
// Schema returns the swagger 2.0 schema
|
||||||
|
func (d *Document) Schema() *spec.Schema {
|
||||||
|
return d.schema
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spec returns the swagger spec object model
|
||||||
|
func (d *Document) Spec() *spec.Swagger {
|
||||||
|
return d.spec
|
||||||
|
}
|
||||||
|
|
||||||
|
// Host returns the host for the API
|
||||||
|
func (d *Document) Host() string {
|
||||||
|
return d.spec.Host
|
||||||
|
}
|
||||||
|
|
||||||
|
// Raw returns the raw swagger spec as json bytes
|
||||||
|
func (d *Document) Raw() json.RawMessage {
|
||||||
|
return d.raw
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrigSpec yields the original spec
|
||||||
|
func (d *Document) OrigSpec() *spec.Swagger {
|
||||||
|
return d.origSpec
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResetDefinitions gives a shallow copy with the models reset
|
||||||
|
func (d *Document) ResetDefinitions() *Document {
|
||||||
|
defs := make(map[string]spec.Schema, len(d.origSpec.Definitions))
|
||||||
|
for k, v := range d.origSpec.Definitions {
|
||||||
|
defs[k] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
d.spec.Definitions = defs
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pristine creates a new pristine document instance based on the input data
|
||||||
|
func (d *Document) Pristine() *Document {
|
||||||
|
dd, _ := Analyzed(d.Raw(), d.Version())
|
||||||
|
return dd
|
||||||
|
}
|
||||||
|
|
||||||
|
// SpecFilePath returns the file path of the spec if one is defined
|
||||||
|
func (d *Document) SpecFilePath() string {
|
||||||
|
return d.specFilePath
|
||||||
|
}
|
||||||
|
|
||||||
|
func cloneSpec(src *spec.Swagger) (*spec.Swagger, error) {
|
||||||
|
var b bytes.Buffer
|
||||||
|
if err := gob.NewEncoder(&b).Encode(src); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var dst spec.Swagger
|
||||||
|
if err := gob.NewDecoder(&b).Decode(&dst); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &dst, nil
|
||||||
|
}
|
26
src/vendor/github.com/go-openapi/runtime/.editorconfig
generated
vendored
Normal file
26
src/vendor/github.com/go-openapi/runtime/.editorconfig
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# Unix-style newlines with a newline ending every file
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
# Set default charset
|
||||||
|
[*.{js,py,go,scala,rb,java,html,css,less,sass,md}]
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
# Tab indentation (no size specified)
|
||||||
|
[*.go]
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
# Matches the exact files either package.json or .travis.yml
|
||||||
|
[{package.json,.travis.yml}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
5
src/vendor/github.com/go-openapi/runtime/.gitignore
generated
vendored
Normal file
5
src/vendor/github.com/go-openapi/runtime/.gitignore
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
secrets.yml
|
||||||
|
coverage.out
|
||||||
|
*.cov
|
||||||
|
*.out
|
||||||
|
playground
|
15
src/vendor/github.com/go-openapi/runtime/.travis.yml
generated
vendored
Normal file
15
src/vendor/github.com/go-openapi/runtime/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
|
go:
|
||||||
|
- 1.11.x
|
||||||
|
- 1.12.x
|
||||||
|
install:
|
||||||
|
- GO111MODULE=off go get -u gotest.tools/gotestsum
|
||||||
|
env:
|
||||||
|
- GO111MODULE=on
|
||||||
|
language: go
|
||||||
|
notifications:
|
||||||
|
slack:
|
||||||
|
secure: EmObnQuM9Mw8J9vpFaKKHqSMN4Wsr/A9+v7ewAD5cEhA0T1P4m7MbJMiJOhxUhj/X+BFh2DamW+P2lT8mybj5wg8wnkQ2BteKA8Tawi6f9PRw2NRheO8tAi8o/npLnlmet0kc93mn+oLuqHw36w4+j5mkOl2FghkfGiUVhwrhkCP7KXQN+3TU87e+/HzQumlJ3nsE+6terVxkH3PmaUTsS5ONaODZfuxFpfb7RsoEl3skHf6d+tr+1nViLxxly7558Nc33C+W1mr0qiEvMLZ+kJ/CpGWBJ6CUJM3jm6hNe2eMuIPwEK2hxZob8c7n22VPap4K6a0bBRoydoDXaba+2sD7Ym6ivDO/DVyL44VeBBLyIiIBylDGQdZH+6SoWm90Qe/i7tnY/T5Ao5igT8f3cfQY1c3EsTfqmlDfrhmACBmwSlgkdVBLTprHL63JMY24LWmh4jhxsmMRZhCL4dze8su1w6pLN/pD1pGHtKYCEVbdTmaM3PblNRFf12XB7qosmQsgUndH4Vq3bTbU0s1pKjeDhRyLvFzvR0TBbo0pDLEoF1A/i5GVFWa7yLZNUDudQERRh7qv/xBl2excIaQ1sV4DSVm7bAE9l6Kp+yeHQJW2uN6Y3X8wu9gB9nv9l5HBze7wh8KE6PyWAOLYYqZg9/sAtsv/2GcQqXcKFF1zcA=
|
||||||
|
script:
|
||||||
|
- gotestsum -f short-verbose -- -race -timeout=20m -coverprofile=coverage.txt -covermode=atomic ./...
|
74
src/vendor/github.com/go-openapi/runtime/CODE_OF_CONDUCT.md
generated
vendored
Normal file
74
src/vendor/github.com/go-openapi/runtime/CODE_OF_CONDUCT.md
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity and
|
||||||
|
orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at ivan+abuse@flanders.co.nz. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
|
[homepage]: http://contributor-covenant.org
|
||||||
|
[version]: http://contributor-covenant.org/version/1/4/
|
202
src/vendor/github.com/go-openapi/runtime/LICENSE
generated
vendored
Normal file
202
src/vendor/github.com/go-openapi/runtime/LICENSE
generated
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
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
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user