-
Notifications
You must be signed in to change notification settings - Fork 72
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
feat!: add Go modules and Go 1.19 compatibility #114
base: main
Are you sure you want to change the base?
Changes from all commits
5024604
23c6262
7974b71
226edb8
557c9ba
4afca7d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -26,3 +26,4 @@ _testmain.go | |
.settings.json | ||
|
||
temp.go | ||
.vscode |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,7 @@ | ||
.PHONY: test install | ||
|
||
install: | ||
go get -t -v ./... | ||
go get -t -v | ||
|
||
test: install | ||
go test -race -cover -v ./... | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why are you removing the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I understand now, this change was intentional due to the subfolder, if we remove the subfolder altogether, we can revert this change. |
||
go test -race -cover -v |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,24 +1,27 @@ | ||
package main | ||
|
||
import "github.com/sendgrid/rest" | ||
import "fmt" | ||
import ( | ||
"fmt" | ||
|
||
"github.com/sendgrid/rest" | ||
) | ||
|
||
func main() { | ||
const host = "https://httpbin.org" | ||
param := "get" | ||
endpoint := "/" + param | ||
baseURL := host + endpoint | ||
method := rest.Get | ||
request := rest.Request{ | ||
Method: method, | ||
BaseURL: baseURL, | ||
} | ||
response, err := rest.Send(request) | ||
if err != nil { | ||
fmt.Println(err) | ||
} else { | ||
fmt.Println(response.StatusCode) | ||
fmt.Println(response.Body) | ||
fmt.Println(response.Headers) | ||
} | ||
const host = "https://httpbin.org" | ||
param := "get" | ||
endpoint := "/" + param | ||
baseURL := host + endpoint | ||
method := rest.Get | ||
request := rest.Request{ | ||
Method: method, | ||
BaseURL: baseURL, | ||
} | ||
response, err := rest.Send(request) | ||
if err != nil { | ||
fmt.Println(err) | ||
} else { | ||
fmt.Println(response.StatusCode) | ||
fmt.Println(response.Body) | ||
fmt.Println(response.Headers) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
module github.com/sendgrid/rest | ||
|
||
go 1.14 | ||
|
||
require golang.org/x/net v0.0.0-20220708220712-1185a9018129 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= | ||
golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
.PHONY: test install | ||
|
||
install: | ||
go get -t -v | ||
|
||
test: install | ||
go test -race -cover -v |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
module github.com/sendgrid/rest/v3 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think it's a good idea to have a different folders. We can simply replace the version in the original There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Even though the https://go.dev/blog/v2-go-modules recommends having different folders, that's for projects that are actually introducing breaking changes, and this is not the case in this PR. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @marcoshuck Thanks for your review. If you take a look at these failed jobs, breaking changes are seemingly apparent when referencing the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That's a very a good point. We need to have this discussion with some of the members from the @sendgrid team, my 2c: We should replace There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @twilio-dx @SendGridDX Any suggested next steps? |
||
|
||
go 1.18 | ||
|
||
require golang.org/x/net v0.13.0 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY= | ||
golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
// Package rest allows for quick and easy access any REST or REST-like API. | ||
package rest | ||
|
||
import ( | ||
"bytes" | ||
"context" | ||
"io" | ||
"net/http" | ||
"net/url" | ||
) | ||
|
||
// Version represents the current version of the rest library | ||
const Version = "3.0.0" | ||
|
||
// Method contains the supported HTTP verbs. | ||
type Method string | ||
|
||
// Supported HTTP verbs. | ||
const ( | ||
Get Method = "GET" | ||
Post Method = "POST" | ||
Put Method = "PUT" | ||
Patch Method = "PATCH" | ||
Delete Method = "DELETE" | ||
) | ||
|
||
// Request holds the request to an API Call. | ||
type Request struct { | ||
Method Method | ||
BaseURL string // e.g. https://api.sendgrid.com | ||
Headers map[string]string | ||
QueryParams map[string]string | ||
Body []byte | ||
} | ||
|
||
// RestError is a struct for an error handling. | ||
type RestError struct { | ||
Response *Response | ||
} | ||
|
||
// Error is the implementation of the error interface. | ||
func (e *RestError) Error() string { | ||
return e.Response.Body | ||
} | ||
|
||
// DefaultClient is used if no custom HTTP client is defined | ||
var DefaultClient = &Client{HTTPClient: &http.Client{}} | ||
|
||
// Client allows modification of client headers, redirect policy | ||
// and other settings | ||
// See https://golang.org/pkg/net/http | ||
type Client struct { | ||
HTTPClient *http.Client | ||
} | ||
|
||
// Response holds the response from an API call. | ||
type Response struct { | ||
StatusCode int // e.g. 200 | ||
Body string // e.g. {"result: success"} | ||
Headers map[string][]string // e.g. map[X-Ratelimit-Limit:[600]] | ||
} | ||
|
||
// AddQueryParameters adds query parameters to the URL. | ||
func AddQueryParameters(baseURL string, queryParams map[string]string) string { | ||
baseURL += "?" | ||
params := url.Values{} | ||
for key, value := range queryParams { | ||
params.Add(key, value) | ||
} | ||
return baseURL + params.Encode() | ||
} | ||
|
||
// BuildRequestObject creates the HTTP request object. | ||
func BuildRequestObject(request Request) (*http.Request, error) { | ||
// Add any query parameters to the URL. | ||
if len(request.QueryParams) != 0 { | ||
request.BaseURL = AddQueryParameters(request.BaseURL, request.QueryParams) | ||
} | ||
req, err := http.NewRequest(string(request.Method), request.BaseURL, bytes.NewBuffer(request.Body)) | ||
if err != nil { | ||
return req, err | ||
} | ||
for key, value := range request.Headers { | ||
req.Header.Set(key, value) | ||
} | ||
_, exists := req.Header["Content-Type"] | ||
if len(request.Body) > 0 && !exists { | ||
req.Header.Set("Content-Type", "application/json") | ||
} | ||
return req, err | ||
} | ||
|
||
// MakeRequest makes the API call. | ||
func MakeRequest(req *http.Request) (*http.Response, error) { | ||
return DefaultClient.HTTPClient.Do(req) | ||
} | ||
|
||
// BuildResponse builds the response struct. | ||
func BuildResponse(res *http.Response) (*Response, error) { | ||
body, err := io.ReadAll(res.Body) | ||
response := Response{ | ||
StatusCode: res.StatusCode, | ||
Body: string(body), | ||
Headers: res.Header, | ||
} | ||
res.Body.Close() // nolint | ||
return &response, err | ||
} | ||
|
||
// Deprecated: API supports old implementation | ||
func API(request Request) (*Response, error) { | ||
return Send(request) | ||
} | ||
|
||
// Send uses the DefaultClient to send your request | ||
func Send(request Request) (*Response, error) { | ||
return SendWithContext(context.Background(), request) | ||
} | ||
|
||
// SendWithContext uses the DefaultClient to send your request with the provided context. | ||
func SendWithContext(ctx context.Context, request Request) (*Response, error) { | ||
return DefaultClient.SendWithContext(ctx, request) | ||
} | ||
|
||
// The following functions enable the ability to define a | ||
// custom HTTP Client | ||
|
||
// MakeRequest makes the API call. | ||
func (c *Client) MakeRequest(req *http.Request) (*http.Response, error) { | ||
return c.HTTPClient.Do(req) | ||
} | ||
|
||
// Deprecated: API supports old implementation | ||
func (c *Client) API(request Request) (*Response, error) { | ||
return c.Send(request) | ||
} | ||
|
||
// Send will build your request, make the request, and build your response. | ||
func (c *Client) Send(request Request) (*Response, error) { | ||
return c.SendWithContext(context.Background(), request) | ||
} | ||
|
||
// SendWithContext will build your request passing in the provided context, make the request, and build your response. | ||
func (c *Client) SendWithContext(ctx context.Context, request Request) (*Response, error) { | ||
// Build the HTTP request object. | ||
req, err := BuildRequestObject(request) | ||
if err != nil { | ||
return nil, err | ||
} | ||
// Pass in the user provided context | ||
req = req.WithContext(ctx) | ||
|
||
// Build the HTTP client and make the request. | ||
res, err := c.MakeRequest(req) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
// Build Response object. | ||
return BuildResponse(res) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why are we running this in a separate job? Consider including the respective Go versions in the original
test
job. Keep in mind while performing these changes that Go 1.20 is out already.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto to the reason I explained in go commands comment.