Documentation ¶
Overview ¶
Package vervet supports opinionated API versioning tools.
Index ¶
- Constants
- Variables
- func ExtensionString(extProps openapi3.ExtensionProps, key string) (string, error)
- func IncludeHeaders(doc *Document) error
- func IsExtensionNotFound(err error) bool
- func LoadVersions(root fs.FS) ([]*openapi3.T, error)
- func Localize(doc *Document) error
- func Merge(dst, src *openapi3.T, replace bool)
- func ToSpecJSON(v interface{}) ([]byte, error)
- func ToSpecYAML(v interface{}) ([]byte, error)
- func VersionDateStrings(vs []Version) []string
- func WithGeneratedComment(yamlBuf []byte) ([]byte, error)
- type Document
- type Resource
- type ResourceVersions
- type SpecVersions
- type Stability
- type Version
- type VersionSlice
- func (vs VersionSlice) Deprecates(q Version) (*Version, bool)
- func (vs VersionSlice) Len() int
- func (vs VersionSlice) Less(i, j int) bool
- func (vs VersionSlice) Resolve(q Version) (*Version, error)
- func (vs VersionSlice) ResolveIndex(q Version) (int, error)
- func (vs VersionSlice) Strings() []string
- func (vs VersionSlice) Swap(i, j int)
Constants ¶
const ( // ExtSnykApiStability is used to annotate a top-level endpoint version spec with its API release stability level. ExtSnykApiStability = "x-snyk-api-stability" // ExtSnykApiResource is used to annotate a path in a compiled OpenAPI spec with its source resource name. ExtSnykApiResource = "x-snyk-api-resource" // ExtSnykApiVersion is used to annotate a path in a compiled OpenAPI spec with its resolved release version. ExtSnykApiVersion = "x-snyk-api-version" // ExtSnykApiReleases is used to annotate a path in a compiled OpenAPI spec // with all the release versions containing a change in the path info. This // is useful for navigating changes in a particular path across versions. ExtSnykApiReleases = "x-snyk-api-releases" // ExtSnykDeprecatedBy is used to annotate a path in a resource version // spec with the subsequent version that deprecates it. This may be used // by linters, service middleware and API documentation to indicate which // version deprecates a given version. ExtSnykDeprecatedBy = "x-snyk-deprecated-by" // ExtSnykSunsetEligible is used to annotate a path in a resource version // spec which is deprecated, with the sunset eligible date: the date after // which the resource version may be removed and no longer available. ExtSnykSunsetEligible = "x-snyk-sunset-eligible" )
const ( // SunsetWIP is the duration past deprecation after which a work-in-progress version may be sunset. SunsetWIP = 0 // SunsetExperimental is the duration past deprecation after which an experimental version may be sunset. SunsetExperimental = 31 * 24 * time.Hour // SunsetBeta is the duration past deprecation after which a beta version may be sunset. SunsetBeta = 91 * 24 * time.Hour // SunsetGA is the duration past deprecation after which a GA version may be sunset. SunsetGA = 181 * 24 * time.Hour )
const ( // ExtSnykIncludeHeaders is used to annotate a response with a list of // headers. While OpenAPI supports header references, it does not yet // support including a collection of common headers. This extension is used // by vervet to include headers from a referenced document when compiling // OpenAPI specs. ExtSnykIncludeHeaders = "x-snyk-include-headers" )
const SpecGlobPattern = "**/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/spec.yaml"
SpecGlobPattern defines the expected directory structure for the versioned OpenAPI specs of a single resource: subdirectories by date, of the form YYYY-mm-dd, each containing a spec.yaml file.
Variables ¶
var ErrNoMatchingVersion = fmt.Errorf("no matching version")
ErrNoMatchingVersion indicates the requested endpoint version cannot be satisfied by the declared Resource versions that are available.
Functions ¶
func ExtensionString ¶
func ExtensionString(extProps openapi3.ExtensionProps, key string) (string, error)
ExtensionString returns the string value of an OpenAPI extension.
func IncludeHeaders ¶
IncludeHeaders adds response headers included with the ExtSnykIncludeHeaders extension property.
func IsExtensionNotFound ¶
IsExtensionNotFound returns bool whether error from ExtensionString is not found versus unexpected.
func LoadVersions ¶
LoadVersions loads all Vervet-compiled and versioned API specs from a filesystem root and returns them.
func Merge ¶
Merge adds the paths and components from a source OpenAPI document root, to a destination document root.
TODO: This is a naive implementation that should be improved to detect and resolve conflicts better. For example, distinct resources might have localized references with the same URIs but different content. Content-addressible resource versions may further facilitate governance; this also would facilitate detecting and relocating such conflicts.
func ToSpecJSON ¶
ToSpecJSON renders an OpenAPI document object as JSON.
func ToSpecYAML ¶
ToSpecYAML renders an OpenAPI document object as YAML.
func VersionDateStrings ¶
VersionDateStrings returns a slice of distinct version date strings for a slice of Versions. Consecutive duplicate dates are removed.
func WithGeneratedComment ¶
WithGeneratedComment prepends a comment to YAML output indicating the file was generated.
Types ¶
type Document ¶
Document is an OpenAPI 3 document object model.
func NewDocumentFile ¶
NewDocumentFile loads an OpenAPI spec file from the given file path, returning a document object.
func (*Document) LoadReference ¶
func (d *Document) LoadReference(relPath, refPath string, target interface{}) (_ string, returnErr error)
LoadReference loads a reference from refPath, relative to relPath, into target. The relative path of the reference is returned, so that references may be chain-loaded with successive calls.
func (*Document) MarshalJSON ¶
MarshalJSON implements json.Marshaler.
func (*Document) RelativePath ¶
RelativePath returns the relative path for resolving references from the file path location of the top-level document: the directory which contains the file from which the top-level document was loaded.
func (*Document) ResolveRefs ¶
ResolveRefs resolves all Ref types in the document, causing the Value field of each Ref to be loaded and populated from its referenced location.
type Resource ¶
type Resource struct { *Document Name string Version Version // contains filtered or unexported fields }
Resource defines a specific version of a resource, corresponding to a standalone OpenAPI specification document that defines its operations, schema, etc. While a resource spec may declare multiple paths, they should all describe operations on a single conceptual resource.
type ResourceVersions ¶
type ResourceVersions struct {
// contains filtered or unexported fields
}
ResourceVersions defines a collection of multiple versions of an Resource.
func LoadResourceVersions ¶
func LoadResourceVersions(epPath string) (*ResourceVersions, error)
LoadResourceVersions returns a ResourceVersions slice parsed from a directory structure of resource specs. This directory will be of the form:
endpoint/ +- 2021-01-01 +- spec.yaml +- 2021-06-21 +- spec.yaml +- 2021-07-14 +- spec.yaml
The endpoint version stability level is defined by the ExtSnykApiStability extension value at the top-level of the OpenAPI document.
func LoadResourceVersionsFileset ¶
func LoadResourceVersionsFileset(specYamls []string) (*ResourceVersions, error)
LoadResourceVersionFileset returns a ResourceVersions slice parsed from the directory structure described above for LoadResourceVersions.
func (*ResourceVersions) At ¶
func (e *ResourceVersions) At(vs string) (*Resource, error)
At returns the Resource matching a version string. The endpoint returned will be the latest available version with a stability equal to or greater than the requested version, or ErrNoMatchingVersion if no matching version is available.
func (*ResourceVersions) Name ¶
func (e *ResourceVersions) Name() string
Name returns the resource name for a collection of resource versions.
func (*ResourceVersions) Versions ¶
func (e *ResourceVersions) Versions() []Version
Versions returns a slice containing each Version defined for this endpoint.
type SpecVersions ¶
type SpecVersions struct {
// contains filtered or unexported fields
}
SpecVersions stores a collection of versioned OpenAPI specs.
func LoadSpecVersions ¶
func LoadSpecVersions(root string) (*SpecVersions, error)
LoadSpecVersions returns SpecVersions loaded from a directory structure containing one or more Resource subdirectories.
func LoadSpecVersionsFileset ¶
func LoadSpecVersionsFileset(epPaths []string) (*SpecVersions, error)
LoadSpecVersionsFileset returns SpecVersions loaded from a set of spec files.
func (*SpecVersions) At ¶
func (sv *SpecVersions) At(v Version) (*openapi3.T, error)
At returns the OpenAPI document that matches the given version. If the version is not an exact match for an API release, the OpenAPI document effective on the given version date for the version stability level is returned. Returns ErrNoMatchingVersion if there is no release matching this version.
func (*SpecVersions) Versions ¶
func (sv *SpecVersions) Versions() VersionSlice
Versions returns the distinct API versions in this collection of OpenAPI documents.
type Stability ¶
type Stability int
Stability defines the stability level of the version.
const ( // StabilityWIP means the API is a work-in-progress and not yet ready. StabilityWIP Stability = iota // StabilityExperimental means the API is experimental and still subject to // drastic change. StabilityExperimental Stability = iota // StabilityBeta means the API is becoming more stable, but may undergo some // final changes before being released. StabilityBeta Stability = iota // StabilityGA means the API has been released and will not change. StabilityGA Stability = iota )
func MustParseStability ¶
MustParseStability parses a stability string into a Stability type, panicking if the string is invalid.
func ParseStability ¶
ParseStability parses a stability string into a Stability type, returning an error if the string is invalid.
type Version ¶
Version defines an API version. API versions may be dates of the form "YYYY-mm-dd", or stability tags "beta", "experimental".
func MustParseVersion ¶
MustParseVersion parses a version string into a Version type, panicking if the string is invalid.
func ParseVersion ¶
ParseVersion parses a version string into a Version type, returning an error if the string is invalid.
func (*Version) AddDays ¶
AddDays returns the version corresponding to adding the given number of days to the version date.
func (*Version) Compare ¶
Compare returns -1 if the given version is less than, 0 if equal to, and 1 if greater than the caller target version.
func (*Version) DateString ¶
DateString returns the string representation of the version date in YYYY-mm-dd form.
func (*Version) DeprecatedBy ¶
DeprecatedBy returns true if the given version deprecates the caller target version.
type VersionSlice ¶
type VersionSlice []Version
VersionSlice is a sortable, searchable slice of Versions.
func (VersionSlice) Deprecates ¶
func (vs VersionSlice) Deprecates(q Version) (*Version, bool)
Deprecates returns the version that deprecates the given version in the slice.
func (VersionSlice) Less ¶
func (vs VersionSlice) Less(i, j int) bool
Less implements sort.Interface.
func (VersionSlice) Resolve ¶
func (vs VersionSlice) Resolve(q Version) (*Version, error)
Resolve returns the most recent Version in the slice with equal or greater stability.
This method requires that the VersionSlice has already been sorted with sort.Sort, otherwise behavior is undefined.
func (VersionSlice) ResolveIndex ¶
func (vs VersionSlice) ResolveIndex(q Version) (int, error)
ResolveIndex returns the slice index of the most recent Version in the slice with equal or greater stability.
This method requires that the VersionSlice has already been sorted with sort.Sort, otherwise behavior is undefined.
func (VersionSlice) Strings ¶
func (vs VersionSlice) Strings() []string
Strings returns a slice of string versions
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package cmd provides subcommands for the vervet CLI.
|
Package cmd provides subcommands for the vervet CLI. |
internal
|
|
linter/optic
Package optic supports linting OpenAPI specs with Optic CI and Sweater Comb.
|
Package optic supports linting OpenAPI specs with Optic CI and Sweater Comb. |
Package versionware provides routing and middleware for building versioned HTTP services.
|
Package versionware provides routing and middleware for building versioned HTTP services. |