Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#2020 #12

Merged
merged 8 commits into from
Jun 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
---
version: 2
version: 2.1
jobs:
build:
docker:
- image: circleci/golang:1.11
working_directory: /go/src/github.com/MediaMath/sr
docker:
- image: 'circleci/golang:1.14'
steps:
- run:
name: get golangci-lint
command: curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.27.0
- checkout
- run: make test
- run:
name: lint
command: make lint
- run:
name: test
command: make test
- run:
name: build
command: make build
28 changes: 6 additions & 22 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,24 +1,8 @@
.PHONY: test golint dep
lint:
golangci-lint run --issues-exit-code 0

# Copyright 2015 MediaMath <http://www.mediamath.com>. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

ifeq ($(CIRCLECI),true)
TEST_RACE=
else
TEST_RACE=-race
endif

test: golint dep
golint ./...
go vet ./...
go test $(VERBOSITY) $(TEST_RACE) ./...

golint:
go get github.com/golang/lint/golint

dep:
go get gopkg.in/stretchr/testify.v1
go get ./...
test:
go test -v -count 1 -race -mod vendor -parallel 10 ./...

build:
go build -v -mod vendor -ldflags="-s -w" ./...
8 changes: 8 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module github.com/MediaMath/sr

go 1.14

require (
github.com/stretchr/testify v1.6.1
github.com/urfave/cli/v2 v2.2.0
)
21 changes: 21 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4=
github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
116 changes: 64 additions & 52 deletions sr/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,29 +15,29 @@ import (
"strconv"

"github.com/MediaMath/sr"
"github.com/codegangsta/cli"
"github.com/urfave/cli/v2"
)

func main() {
app := cli.NewApp()
app.Name = "sr"
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "host",
EnvVar: "SCHEMA_REGISTRY_URL",
Usage: "url to the schema registry",
&cli.StringFlag{
Name: "host",
EnvVars: []string{"SCHEMA_REGISTRY_URL"},
Usage: "url to the schema registry",
},
cli.BoolFlag{
&cli.BoolFlag{
Name: "verbose",
Usage: "be more wordy",
},
cli.BoolFlag{
&cli.BoolFlag{
Name: "pretty",
Usage: "pretty print output",
},
}

app.Commands = []cli.Command{
app.Commands = []*cli.Command{
{
Name: "stupid",
Usage: "sr ls foo 12 | sr stupid",
Expand Down Expand Up @@ -85,49 +85,55 @@ func main() {
},
}

app.Run(os.Args)
var err = app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}

func setConfig(ctx *cli.Context) {
if len(ctx.Args()) != 2 {
func setConfig(ctx *cli.Context) error {
if ctx.Args().Len() != 2 {
log.Fatal("sr set-config SUBJECT LEVEL")
}

address := getAddress(ctx)
out(sr.SetSubjectCompatibility(client(ctx), address, sr.Subject(ctx.Args()[0]), sr.Compatibility(ctx.Args()[1])))
out(sr.SetSubjectCompatibility(client(ctx), address, sr.Subject(ctx.Args().First()), sr.Compatibility(ctx.Args().Get(1))))
return nil
}

func config(ctx *cli.Context) {
func config(ctx *cli.Context) error {
address := getAddress(ctx)
argCount := len(ctx.Args())
argCount := ctx.Args().Len()
switch argCount {
case 0:
out(sr.GetDefaultCompatibility(client(ctx), address))
case 1:
out(sr.GetSubjectDerivedCompatibility(client(ctx), address, sr.Subject(ctx.Args()[0])))
out(sr.GetSubjectDerivedCompatibility(client(ctx), address, sr.Subject(ctx.Args().First())))
default:
log.Fatal("usage sr config [subject]")
}
return nil
}

func schema(ctx *cli.Context) {
if len(ctx.Args()) != 1 {
func schema(ctx *cli.Context) error {
if ctx.Args().Len() != 1 {
log.Fatal("sr schema ID")
}

id, err := strconv.Atoi(ctx.Args()[0])
id, err := strconv.Atoi(ctx.Args().First())
if err != nil {
log.Fatal(err)
return err
}

address := getAddress(ctx)

out(sr.GetSchema(client(ctx), address, uint32(id)))
return nil
}

func ls(ctx *cli.Context) {
func ls(ctx *cli.Context) error {
address := getAddress(ctx)
argCount := len(ctx.Args())
argCount := ctx.Args().Len()
switch argCount {
case 0:
subjects, err := sr.ListSubjects(client(ctx), address)
Expand All @@ -139,130 +145,136 @@ func ls(ctx *cli.Context) {
fmt.Println(string(subject))
}
case 1:
out(sr.ListVersions(client(ctx), address, sr.Subject(ctx.Args()[0])))
out(sr.ListVersions(client(ctx), address, sr.Subject(ctx.Args().First())))
case 2:
_, schema, err := sr.GetVersion(client(ctx), address, sr.Subject(ctx.Args()[0]), ctx.Args()[1])
_, schema, err := sr.GetVersion(client(ctx), address, sr.Subject(ctx.Args().First()), ctx.Args().Get(1))
out(schema, err)
default:
log.Fatal("usage sr ls [subject] [version]")
}
return nil
}

func compatible(ctx *cli.Context) {
func compatible(ctx *cli.Context) error {
address := getAddress(ctx)

if len(ctx.Args()) < 2 {
if ctx.Args().Len() < 2 {
log.Fatal("usage sr compatible [subject] [version] [name of file | stdin]")
}

subject := ctx.Args()[0]
version := ctx.Args()[1]
subject := ctx.Args().First()
version := ctx.Args().Get(1)

inputFile, err := getStdinOrFile(ctx, 2)
if err != nil {
log.Fatal(err)
return err
}

schemaString, err := ioutil.ReadAll(inputFile)
if err != nil {
log.Fatal(err)
return err
}

out(sr.IsCompatible(client(ctx), address, sr.Subject(subject), version, sr.Schema(schemaString)))
return nil
}

func exists(ctx *cli.Context) {
func exists(ctx *cli.Context) error {
address := getAddress(ctx)

if len(ctx.Args()) < 1 {
if ctx.Args().Len() < 1 {
log.Fatal("usage sr exists [subject] [name of file | stdin]")
}

subject := ctx.Args()[0]
subject := ctx.Args().First()

inputFile, err := getStdinOrFile(ctx, 1)
if err != nil {
log.Fatal(err)
return err
}

schemaString, err := ioutil.ReadAll(inputFile)
if err != nil {
log.Fatal(err)
return err
}

version, id, err := sr.HasSchema(client(ctx), address, sr.Subject(subject), sr.Schema(schemaString))
out(fmt.Sprintf("%v %v", version, id), err)
return err
}

func add(ctx *cli.Context) {
func add(ctx *cli.Context) error {
address := getAddress(ctx)

if len(ctx.Args()) < 1 {
if ctx.Args().Len() < 1 {
log.Fatal("usage sr add [subject] [name of file | stdin]")
}

subject := ctx.Args()[0]
subject := ctx.Args().First()

inputFile, err := getStdinOrFile(ctx, 1)
if err != nil {
log.Fatal(err)
return err
}

schemaString, err := ioutil.ReadAll(inputFile)
if err != nil {
log.Fatal(err)
return err
}

id, err := sr.Register(http.DefaultClient, address, sr.Subject(subject), sr.Schema(string(schemaString)))
if err != nil {
log.Fatal(err)
return err
}
fmt.Printf("%v", id)
return nil
}

func stupid(ctx *cli.Context) {
func stupid(ctx *cli.Context) error {
inputFile, err := getStdinOrFile(ctx, 0)
if err != nil {
log.Fatal(err)
return err
}

notStupid, err := ioutil.ReadAll(inputFile)
if err != nil {
log.Fatal(err)
return err
}

schema := string(notStupid)

stupid := &sr.SchemaJSON{Schema: sr.Schema(schema)}
b, err := json.Marshal(stupid)
if err != nil {
log.Fatal(err)
return err
}

fmt.Println(string(b))

return nil
}

func unstupid(ctx *cli.Context) {
func unstupid(ctx *cli.Context) error {
inputFile, err := getStdinOrFile(ctx, 0)
if err != nil {
log.Fatal(err)
return err
}

stupidSchema, err := ioutil.ReadAll(inputFile)
if err != nil {
log.Fatal(err)
return err
}

schema := &sr.SchemaJSON{}
err = json.Unmarshal(stupidSchema, schema)
if err != nil {
log.Fatal(err)
return err
}

jsonObjs := make(map[string]interface{})
err = json.Unmarshal([]byte(schema.Schema), &jsonObjs)
output(ctx, jsonObjs, err)
return err
}

func output(ctx *cli.Context, resp interface{}, err error) {
Expand All @@ -271,7 +283,7 @@ func output(ctx *cli.Context, resp interface{}, err error) {
}

var r []byte
if ctx.GlobalBool("pretty") {
if ctx.Bool("pretty") {
r, err = json.MarshalIndent(resp, "", "\t")
} else {
r, err = json.Marshal(resp)
Expand All @@ -286,8 +298,8 @@ func output(ctx *cli.Context, resp interface{}, err error) {

func getStdinOrFile(ctx *cli.Context, index int) (r io.Reader, err error) {
r = os.Stdin
if len(ctx.Args()) > index {
r, err = os.Open(ctx.Args()[index])
if ctx.Args().Len() > index {
r, err = os.Open(ctx.Args().Get(index))
}

return
Expand All @@ -305,7 +317,7 @@ func client(ctx *cli.Context) sr.HTTPClient {
}

func getAddress(ctx *cli.Context) string {
address := ctx.GlobalString("host")
address := ctx.String("host")
if address == "" {
log.Fatal("host or SCHEMA_REGISTRY_URL must be provided")
}
Expand Down
Loading