Standardize on returning objects, not the json roots.

Let's be nice to our consumers - they don't care about the root, they care about the object. Even when the user needs access to the Links, that's accessible via the resp variable returned.
This commit is contained in:
Phillip Baker 2015-05-22 21:16:02 -04:00 committed by bryanl
parent bbf01e0d69
commit 1df42b98f6
6 changed files with 41 additions and 44 deletions

View File

@ -4,7 +4,7 @@ package godo
// endpoints of the Digital Ocean API // endpoints of the Digital Ocean API
// See: https://developers.digitalocean.com/documentation/v2/#account // See: https://developers.digitalocean.com/documentation/v2/#account
type AccountService interface { type AccountService interface {
Get() (*AccountRoot, *Response, error) Get() (*Account, *Response, error)
} }
// AccountServiceOp handles communication with the Account related methods of // AccountServiceOp handles communication with the Account related methods of
@ -23,7 +23,7 @@ type Account struct {
EmailVerified bool `json:"email_verified,omitempty"` EmailVerified bool `json:"email_verified,omitempty"`
} }
type AccountRoot struct { type accountRoot struct {
Account *Account `json:"account"` Account *Account `json:"account"`
} }
@ -32,7 +32,7 @@ func (r Account) String() string {
} }
// Get DigitalOcean account info // Get DigitalOcean account info
func (s *AccountServiceOp) Get() (*AccountRoot, *Response, error) { func (s *AccountServiceOp) Get() (*Account, *Response, error) {
path := "v2/account" path := "v2/account"
req, err := s.client.NewRequest("GET", path, nil) req, err := s.client.NewRequest("GET", path, nil)
@ -40,11 +40,11 @@ func (s *AccountServiceOp) Get() (*AccountRoot, *Response, error) {
return nil, nil, err return nil, nil, err
} }
root := new(AccountRoot) root := new(accountRoot)
resp, err := s.client.Do(req, root) resp, err := s.client.Do(req, root)
if err != nil { if err != nil {
return nil, resp, err return nil, resp, err
} }
return root, resp, err return root.Account, resp, err
} }

View File

@ -31,8 +31,8 @@ func TestAccountGet(t *testing.T) {
t.Errorf("Account.Get returned error: %v", err) t.Errorf("Account.Get returned error: %v", err)
} }
expected := &AccountRoot{Account: &Account{DropletLimit: 25, Email: "sammy@digitalocean.com", expected := &Account{DropletLimit: 25, Email: "sammy@digitalocean.com",
UUID: "b6fr89dbf6d9156cace5f3c78dc9851d957381ef", EmailVerified: true}} UUID: "b6fr89dbf6d9156cace5f3c78dc9851d957381ef", EmailVerified: true}
if !reflect.DeepEqual(acct, expected) { if !reflect.DeepEqual(acct, expected) {
t.Errorf("Account.Get returned %+v, expected %+v", acct, expected) t.Errorf("Account.Get returned %+v, expected %+v", acct, expected)
} }

View File

@ -9,8 +9,8 @@ const domainsBasePath = "v2/domains"
// https://developers.digitalocean.com/documentation/v2#domain-records // https://developers.digitalocean.com/documentation/v2#domain-records
type DomainsService interface { type DomainsService interface {
List(*ListOptions) ([]Domain, *Response, error) List(*ListOptions) ([]Domain, *Response, error)
Get(string) (*DomainRoot, *Response, error) Get(string) (*Domain, *Response, error)
Create(*DomainCreateRequest) (*DomainRoot, *Response, error) Create(*DomainCreateRequest) (*Domain, *Response, error)
Delete(string) (*Response, error) Delete(string) (*Response, error)
Records(string, *ListOptions) ([]DomainRecord, *Response, error) Records(string, *ListOptions) ([]DomainRecord, *Response, error)
@ -35,8 +35,8 @@ type Domain struct {
ZoneFile string `json:"zone_file"` ZoneFile string `json:"zone_file"`
} }
// DomainRoot represents a response from the Digital Ocean API // domainRoot represents a response from the Digital Ocean API
type DomainRoot struct { type domainRoot struct {
Domain *Domain `json:"domain"` Domain *Domain `json:"domain"`
} }
@ -52,12 +52,12 @@ type DomainCreateRequest struct {
} }
// DomainRecordRoot is the root of an individual Domain Record response // DomainRecordRoot is the root of an individual Domain Record response
type DomainRecordRoot struct { type domainRecordRoot struct {
DomainRecord *DomainRecord `json:"domain_record"` DomainRecord *DomainRecord `json:"domain_record"`
} }
// DomainRecordsRoot is the root of a group of Domain Record responses // DomainRecordsRoot is the root of a group of Domain Record responses
type DomainRecordsRoot struct { type domainRecordsRoot struct {
DomainRecords []DomainRecord `json:"domain_records"` DomainRecords []DomainRecord `json:"domain_records"`
Links *Links `json:"links"` Links *Links `json:"links"`
} }
@ -113,7 +113,7 @@ func (s DomainsServiceOp) List(opt *ListOptions) ([]Domain, *Response, error) {
} }
// Get individual domain // Get individual domain
func (s *DomainsServiceOp) Get(name string) (*DomainRoot, *Response, error) { func (s *DomainsServiceOp) Get(name string) (*Domain, *Response, error) {
path := fmt.Sprintf("%s/%s", domainsBasePath, name) path := fmt.Sprintf("%s/%s", domainsBasePath, name)
req, err := s.client.NewRequest("GET", path, nil) req, err := s.client.NewRequest("GET", path, nil)
@ -121,31 +121,34 @@ func (s *DomainsServiceOp) Get(name string) (*DomainRoot, *Response, error) {
return nil, nil, err return nil, nil, err
} }
root := new(DomainRoot) root := new(domainRoot)
resp, err := s.client.Do(req, root) resp, err := s.client.Do(req, root)
if err != nil { if err != nil {
return nil, resp, err return nil, resp, err
} }
return root, resp, err return root.Domain, resp, err
} }
// Create a new domain // Create a new domain
func (s *DomainsServiceOp) Create(createRequest *DomainCreateRequest) (*DomainRoot, *Response, error) { func (s *DomainsServiceOp) Create(createRequest *DomainCreateRequest) (*Domain, *Response, error) {
path := domainsBasePath path := domainsBasePath
req, err := s.client.NewRequest("POST", path, createRequest) req, err := s.client.NewRequest("POST", path, createRequest)
if err != nil { if err != nil {
fmt.Printf("1Something bad happened: %+v", err)
return nil, nil, err return nil, nil, err
} }
root := new(DomainRoot) root := new(domainRoot)
resp, err := s.client.Do(req, root) resp, err := s.client.Do(req, root)
fmt.Printf("%+v\n", resp)
if err != nil { if err != nil {
fmt.Printf("2Something bad happened: %+v", err)
return nil, resp, err return nil, resp, err
} }
fmt.Printf("%+v\n", root)
return root, resp, err return root.Domain, resp, err
} }
// Delete domain // Delete domain
@ -185,7 +188,7 @@ func (s *DomainsServiceOp) Records(domain string, opt *ListOptions) ([]DomainRec
return nil, nil, err return nil, nil, err
} }
root := new(DomainRecordsRoot) root := new(domainRecordsRoot)
resp, err := s.client.Do(req, root) resp, err := s.client.Do(req, root)
if err != nil { if err != nil {
return nil, resp, err return nil, resp, err
@ -206,7 +209,7 @@ func (s *DomainsServiceOp) Record(domain string, id int) (*DomainRecord, *Respon
return nil, nil, err return nil, nil, err
} }
record := new(DomainRecordRoot) record := new(domainRecordRoot)
resp, err := s.client.Do(req, record) resp, err := s.client.Do(req, record)
if err != nil { if err != nil {
return nil, resp, err return nil, resp, err
@ -261,7 +264,7 @@ func (s *DomainsServiceOp) CreateRecord(
return nil, nil, err return nil, nil, err
} }
d := new(DomainRecordRoot) d := new(domainRecordRoot)
resp, err := s.client.Do(req, d) resp, err := s.client.Do(req, d)
if err != nil { if err != nil {
return nil, resp, err return nil, resp, err

View File

@ -90,7 +90,7 @@ func TestDomains_GetDomain(t *testing.T) {
t.Errorf("domain.Get returned error: %v", err) t.Errorf("domain.Get returned error: %v", err)
} }
expected := &DomainRoot{Domain: &Domain{Name: "example.com"}} expected := &Domain{Name: "example.com"}
if !reflect.DeepEqual(domains, expected) { if !reflect.DeepEqual(domains, expected) {
t.Errorf("domains.Get returned %+v, expected %+v", domains, expected) t.Errorf("domains.Get returned %+v, expected %+v", domains, expected)
} }
@ -117,13 +117,7 @@ func TestDomains_Create(t *testing.T) {
t.Errorf("Request body = %+v, expected %+v", v, createRequest) t.Errorf("Request body = %+v, expected %+v", v, createRequest)
} }
dr := DomainRoot{&Domain{Name: v.Name}} fmt.Fprint(w, `{"domain":{"name":"example.com"}}`)
b, err := json.Marshal(dr)
if err != nil {
t.Fatal(err)
}
fmt.Fprint(w, string(b))
}) })
domain, _, err := client.Domains.Create(createRequest) domain, _, err := client.Domains.Create(createRequest)
@ -131,7 +125,7 @@ func TestDomains_Create(t *testing.T) {
t.Errorf("Domains.Create returned error: %v", err) t.Errorf("Domains.Create returned error: %v", err)
} }
expected := &DomainRoot{Domain: &Domain{Name: "example.com"}} expected := &Domain{Name: "example.com"}
if !reflect.DeepEqual(domain, expected) { if !reflect.DeepEqual(domain, expected) {
t.Errorf("Domains.Create returned %+v, expected %+v", domain, expected) t.Errorf("Domains.Create returned %+v, expected %+v", domain, expected)
} }

View File

@ -12,8 +12,8 @@ const dropletBasePath = "v2/droplets"
// See: https://developers.digitalocean.com/documentation/v2#droplets // See: https://developers.digitalocean.com/documentation/v2#droplets
type DropletsService interface { type DropletsService interface {
List(*ListOptions) ([]Droplet, *Response, error) List(*ListOptions) ([]Droplet, *Response, error)
Get(int) (*DropletRoot, *Response, error) Get(int) (*Droplet, *Response, error)
Create(*DropletCreateRequest) (*DropletRoot, *Response, error) Create(*DropletCreateRequest) (*Droplet, *Response, error)
Delete(int) (*Response, error) Delete(int) (*Response, error)
Kernels(int, *ListOptions) ([]Kernel, *Response, error) Kernels(int, *ListOptions) ([]Kernel, *Response, error)
Snapshots(int, *ListOptions) ([]Image, *Response, error) Snapshots(int, *ListOptions) ([]Image, *Response, error)
@ -64,7 +64,7 @@ func (d Droplet) String() string {
} }
// DropletRoot represents a Droplet root // DropletRoot represents a Droplet root
type DropletRoot struct { type dropletRoot struct {
Droplet *Droplet `json:"droplet"` Droplet *Droplet `json:"droplet"`
Links *Links `json:"links,omitempty"` Links *Links `json:"links,omitempty"`
} }
@ -190,7 +190,7 @@ func (s *DropletsServiceOp) List(opt *ListOptions) ([]Droplet, *Response, error)
} }
// Get individual droplet // Get individual droplet
func (s *DropletsServiceOp) Get(dropletID int) (*DropletRoot, *Response, error) { func (s *DropletsServiceOp) Get(dropletID int) (*Droplet, *Response, error) {
path := fmt.Sprintf("%s/%d", dropletBasePath, dropletID) path := fmt.Sprintf("%s/%d", dropletBasePath, dropletID)
req, err := s.client.NewRequest("GET", path, nil) req, err := s.client.NewRequest("GET", path, nil)
@ -198,17 +198,17 @@ func (s *DropletsServiceOp) Get(dropletID int) (*DropletRoot, *Response, error)
return nil, nil, err return nil, nil, err
} }
root := new(DropletRoot) root := new(dropletRoot)
resp, err := s.client.Do(req, root) resp, err := s.client.Do(req, root)
if err != nil { if err != nil {
return nil, resp, err return nil, resp, err
} }
return root, resp, err return root.Droplet, resp, err
} }
// Create droplet // Create droplet
func (s *DropletsServiceOp) Create(createRequest *DropletCreateRequest) (*DropletRoot, *Response, error) { func (s *DropletsServiceOp) Create(createRequest *DropletCreateRequest) (*Droplet, *Response, error) {
path := dropletBasePath path := dropletBasePath
req, err := s.client.NewRequest("POST", path, createRequest) req, err := s.client.NewRequest("POST", path, createRequest)
@ -216,7 +216,7 @@ func (s *DropletsServiceOp) Create(createRequest *DropletCreateRequest) (*Drople
return nil, nil, err return nil, nil, err
} }
root := new(DropletRoot) root := new(dropletRoot)
resp, err := s.client.Do(req, root) resp, err := s.client.Do(req, root)
if err != nil { if err != nil {
return nil, resp, err return nil, resp, err
@ -225,7 +225,7 @@ func (s *DropletsServiceOp) Create(createRequest *DropletCreateRequest) (*Drople
resp.Links = l resp.Links = l
} }
return root, resp, err return root.Droplet, resp, err
} }
// Delete droplet // Delete droplet

View File

@ -106,7 +106,7 @@ func TestDroplets_GetDroplet(t *testing.T) {
t.Errorf("Droplet.Get returned error: %v", err) t.Errorf("Droplet.Get returned error: %v", err)
} }
expected := &DropletRoot{Droplet: &Droplet{ID: 12345}} expected := &Droplet{ID: 12345}
if !reflect.DeepEqual(droplets, expected) { if !reflect.DeepEqual(droplets, expected) {
t.Errorf("Droplets.Get returned %+v, expected %+v", droplets, expected) t.Errorf("Droplets.Get returned %+v, expected %+v", droplets, expected)
} }
@ -150,12 +150,12 @@ func TestDroplets_Create(t *testing.T) {
fmt.Fprintf(w, `{"droplet":{"id":1}, "links":{"actions": [{"id": 1, "href": "http://example.com", "rel": "create"}]}}`) fmt.Fprintf(w, `{"droplet":{"id":1}, "links":{"actions": [{"id": 1, "href": "http://example.com", "rel": "create"}]}}`)
}) })
root, resp, err := client.Droplets.Create(createRequest) droplet, resp, err := client.Droplets.Create(createRequest)
if err != nil { if err != nil {
t.Errorf("Droplets.Create returned error: %v", err) t.Errorf("Droplets.Create returned error: %v", err)
} }
if id := root.Droplet.ID; id != 1 { if id := droplet.ID; id != 1 {
t.Errorf("expected id '%d', received '%d'", 1, id) t.Errorf("expected id '%d', received '%d'", 1, id)
} }