Adds Available
this is the database for available packages
This commit is contained in:
parent
49f82610a3
commit
f21ded2b77
40
available.go
Normal file
40
available.go
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package pm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Name exists to document the keys in Available
|
||||||
|
type Name string
|
||||||
|
|
||||||
|
// Version exists to document the keys in Available
|
||||||
|
type Version string
|
||||||
|
|
||||||
|
// Available is the structure used to represent the collection of all packages
|
||||||
|
// that can be installed.
|
||||||
|
type Available map[Name]map[Version]Meta
|
||||||
|
|
||||||
|
// Add inserts m into a.
|
||||||
|
func (a Available) Add(m Meta) error {
|
||||||
|
if _, err := m.Valid(); err != nil {
|
||||||
|
return errors.Wrap(err, "invalid meta")
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := a[Name(m.Name)]; !ok {
|
||||||
|
a[m.Name] = map[Version]Meta{}
|
||||||
|
}
|
||||||
|
a[m.Name][m.Version] = m
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update inserts all data from o into a.
|
||||||
|
func (a Available) Update(o Available) error {
|
||||||
|
for _, vers := range o {
|
||||||
|
for _, m := range vers {
|
||||||
|
if err := a.Add(m); err != nil {
|
||||||
|
return errors.Wrap(err, "adding")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
95
available_test.go
Normal file
95
available_test.go
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
package pm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAvailableAdd(t *testing.T) {
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
label string
|
||||||
|
m Meta
|
||||||
|
count int
|
||||||
|
err error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
label: "good",
|
||||||
|
m: Meta{Name: "a", Version: "v1.0.0", Description: "test"},
|
||||||
|
count: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "bad meta",
|
||||||
|
m: Meta{Name: "a"},
|
||||||
|
count: 1,
|
||||||
|
err: errors.New("missing"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "dupe is last in",
|
||||||
|
m: Meta{Name: "a", Version: "v1.0.0", Description: "better version"},
|
||||||
|
count: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "another good",
|
||||||
|
m: Meta{Name: "a", Version: "v1.0.0", Description: "better version"},
|
||||||
|
count: 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
a := Available{}
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.label, func(t *testing.T) {
|
||||||
|
if err := a.Add(test.m); (err == nil) != (test.err == nil) {
|
||||||
|
t.Fatalf("adding meta%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got, want := len(a), test.count; got != want {
|
||||||
|
t.Fatalf("unexpected length after Add: got %v, want %v", got, want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if got, want := a["a"]["v1.0.0"].Description, "better version"; got != want {
|
||||||
|
t.Fatalf("version: got %v, want %v", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAvailableUpdate(t *testing.T) {
|
||||||
|
a := Available{}
|
||||||
|
if err := a.Add(Meta{Name: "a", Version: "v1.0.0", Description: "test"}); err != nil {
|
||||||
|
t.Fatalf("add: %v", err)
|
||||||
|
}
|
||||||
|
if err := a.Add(Meta{Name: "b", Version: "v2.0.0", Description: "test"}); err != nil {
|
||||||
|
t.Fatalf("add: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
b := Available{}
|
||||||
|
a.Update(b)
|
||||||
|
if got, want := len(a), 2; got != want {
|
||||||
|
t.Fatalf("len after empty update: got %v, want %v", got, want)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := b.Add(Meta{Name: "a", Version: "v1.0.0", Description: "test last in"}); err != nil {
|
||||||
|
t.Fatalf("add: %v", err)
|
||||||
|
}
|
||||||
|
if err := b.Add(Meta{Name: "b", Version: "v2.1.0", Description: "test"}); err != nil {
|
||||||
|
t.Fatalf("add: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := a.Update(b); err != nil {
|
||||||
|
t.Fatalf("update: %v", err)
|
||||||
|
}
|
||||||
|
if got, want := len(a), 2; got != want {
|
||||||
|
t.Fatalf("len after update: got %v, want %v", got, want)
|
||||||
|
}
|
||||||
|
if got, want := len(a["a"]), 1; got != want {
|
||||||
|
t.Fatalf("len after update: got %v, want %v", got, want)
|
||||||
|
}
|
||||||
|
if got, want := len(a["b"]), 2; got != want {
|
||||||
|
t.Fatalf("len after update: got %v, want %v", got, want)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got, want := a["a"]["v1.0.0"].Description, "test last in"; got != want {
|
||||||
|
t.Fatalf("last in didn't override")
|
||||||
|
}
|
||||||
|
}
|
8
meta.go
8
meta.go
@ -3,10 +3,10 @@ package pm
|
|||||||
import "errors"
|
import "errors"
|
||||||
|
|
||||||
type Meta struct {
|
type Meta struct {
|
||||||
Name string `json:"name"`
|
Name Name `json:"name"`
|
||||||
Version string `json:"version"`
|
Version Version `json:"version"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
Namespace string `json:"namespace"`
|
Namespace string `json:"namespace"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Meta) Valid() (bool, error) {
|
func (m *Meta) Valid() (bool, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user