Moved the flatten functionality to this package
This commit is contained in:
parent
f09fdb0b8b
commit
558da36360
|
@ -953,10 +953,6 @@ func TestToActivity(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFlattenActivityProperties(t *testing.T) {
|
|
||||||
t.Skipf("TODO")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestValidEventRSVPActivityType(t *testing.T) {
|
func TestValidEventRSVPActivityType(t *testing.T) {
|
||||||
t.Skipf("TODO")
|
t.Skipf("TODO")
|
||||||
}
|
}
|
||||||
|
|
122
flatten.go
Normal file
122
flatten.go
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
package activitypub
|
||||||
|
|
||||||
|
// FlattenActivityProperties flattens the Activity's properties from Object type to IRI
|
||||||
|
func FlattenActivityProperties(act *Activity) *Activity {
|
||||||
|
OnIntransitiveActivity(act, func(in *IntransitiveActivity) error {
|
||||||
|
FlattenIntransitiveActivityProperties(in)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
act.Object = FlattenToIRI(act.Object)
|
||||||
|
return act
|
||||||
|
}
|
||||||
|
|
||||||
|
// FlattenIntransitiveActivityProperties flattens the Activity's properties from Object type to IRI
|
||||||
|
func FlattenIntransitiveActivityProperties(act *IntransitiveActivity) *IntransitiveActivity {
|
||||||
|
act.Actor = FlattenToIRI(act.Actor)
|
||||||
|
act.Target = FlattenToIRI(act.Target)
|
||||||
|
act.Result = FlattenToIRI(act.Result)
|
||||||
|
act.Origin = FlattenToIRI(act.Origin)
|
||||||
|
act.Result = FlattenToIRI(act.Result)
|
||||||
|
act.Instrument = FlattenToIRI(act.Instrument)
|
||||||
|
OnObject(act, func(o *Object) error {
|
||||||
|
o = FlattenObjectProperties(o)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return act
|
||||||
|
}
|
||||||
|
|
||||||
|
// FlattenItemCollection flattens an Item Collection to their respective IRIs
|
||||||
|
func FlattenItemCollection(col ItemCollection) ItemCollection {
|
||||||
|
if col == nil {
|
||||||
|
return col
|
||||||
|
}
|
||||||
|
for k, it := range ItemCollectionDeduplication(&col) {
|
||||||
|
if iri := it.GetLink(); iri != "" {
|
||||||
|
col[k] = iri
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return col
|
||||||
|
}
|
||||||
|
|
||||||
|
// FlattenCollection flattens a Collection's objects to their respective IRIs
|
||||||
|
func FlattenCollection(col *Collection) *Collection {
|
||||||
|
if col == nil {
|
||||||
|
return col
|
||||||
|
}
|
||||||
|
col.Items = FlattenItemCollection(col.Items)
|
||||||
|
|
||||||
|
return col
|
||||||
|
}
|
||||||
|
|
||||||
|
// FlattenOrderedCollection flattens an OrderedCollection's objects to their respective IRIs
|
||||||
|
func FlattenOrderedCollection(col *OrderedCollection) *OrderedCollection {
|
||||||
|
if col == nil {
|
||||||
|
return col
|
||||||
|
}
|
||||||
|
col.OrderedItems = FlattenItemCollection(col.OrderedItems)
|
||||||
|
|
||||||
|
return col
|
||||||
|
}
|
||||||
|
|
||||||
|
// FlattenActorProperties flattens the Actor's properties from Object types to IRI
|
||||||
|
func FlattenActorProperties(a *Actor) *Actor {
|
||||||
|
OnObject(a, func(o *Object) error {
|
||||||
|
o = FlattenObjectProperties(o)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
// FlattenObjectProperties flattens the Object's properties from Object types to IRI
|
||||||
|
func FlattenObjectProperties(o *Object) *Object {
|
||||||
|
o.Replies = Flatten(o.Replies)
|
||||||
|
o.Shares = Flatten(o.Shares)
|
||||||
|
o.Likes = Flatten(o.Likes)
|
||||||
|
o.AttributedTo = Flatten(o.AttributedTo)
|
||||||
|
o.To = FlattenItemCollection(o.To)
|
||||||
|
o.Bto = FlattenItemCollection(o.Bto)
|
||||||
|
o.CC = FlattenItemCollection(o.CC)
|
||||||
|
o.BCC = FlattenItemCollection(o.BCC)
|
||||||
|
o.Audience = FlattenItemCollection(o.Audience)
|
||||||
|
//o.Tag = FlattenItemCollection(o.Tag)
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
|
// FlattenProperties flattens the Item's properties from Object types to IRI
|
||||||
|
func FlattenProperties(it Item) Item {
|
||||||
|
if ActivityTypes.Contains(it.GetType()) {
|
||||||
|
OnActivity(it, func(a *Activity) error {
|
||||||
|
a = FlattenActivityProperties(a)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if ActorTypes.Contains(it.GetType()) {
|
||||||
|
OnActor(it, func(a *Actor) error {
|
||||||
|
a = FlattenActorProperties(a)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if ObjectTypes.Contains(it.GetType()) {
|
||||||
|
OnObject(it, func(o *Object) error {
|
||||||
|
o = FlattenObjectProperties(o)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return it
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flatten checks if Item can be flatten to an IRI or array of IRIs and returns it if so
|
||||||
|
func Flatten(it Item) Item {
|
||||||
|
if it == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if it.IsCollection() {
|
||||||
|
if c, ok := it.(CollectionInterface); ok {
|
||||||
|
it = FlattenItemCollection(c.Collection())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if it != nil && len(it.GetLink()) > 0 {
|
||||||
|
return it.GetLink()
|
||||||
|
}
|
||||||
|
return it
|
||||||
|
}
|
89
flatten_test.go
Normal file
89
flatten_test.go
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
package activitypub
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestFlattenPersonProperties(t *testing.T) {
|
||||||
|
t.Skipf("TODO")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFlattenProperties(t *testing.T) {
|
||||||
|
t.Skipf("TODO")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFlattenItemCollection(t *testing.T) {
|
||||||
|
t.Skipf("TODO")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFlattenCollection(t *testing.T) {
|
||||||
|
t.Skipf("TODO")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFlattenOrderedCollection(t *testing.T) {
|
||||||
|
t.Skipf("TODO")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFlattenIntransitiveActivityProperties(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
act *IntransitiveActivity
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want *IntransitiveActivity
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "blank",
|
||||||
|
args: args{&IntransitiveActivity{}},
|
||||||
|
want: &IntransitiveActivity{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "flatten-actor",
|
||||||
|
args: args{&IntransitiveActivity{Actor: &Actor{ID: "example-actor-iri"}}},
|
||||||
|
want: &IntransitiveActivity{Actor: IRI("example-actor-iri")},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if got := FlattenIntransitiveActivityProperties(tt.args.act); !reflect.DeepEqual(got, tt.want) {
|
||||||
|
t.Errorf("FlattenIntransitiveActivityProperties() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFlattenActivityProperties(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
act *Activity
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want *Activity
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "blank",
|
||||||
|
args: args{&Activity{}},
|
||||||
|
want: &Activity{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "flatten-actor",
|
||||||
|
args: args{&Activity{Actor: &Actor{ID: "example-actor-iri"}}},
|
||||||
|
want: &Activity{Actor: IRI("example-actor-iri")},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "flatten-object",
|
||||||
|
args: args{&Activity{Object: &Object{ID: "example-actor-iri"}}},
|
||||||
|
want: &Activity{Object: IRI("example-actor-iri")},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if got := FlattenActivityProperties(tt.args.act); !reflect.DeepEqual(got, tt.want) {
|
||||||
|
t.Errorf("FlattenActivityProperties() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -221,10 +221,6 @@ func TestToIntransitiveActivity(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFlattenIntransitiveActivityProperties(t *testing.T) {
|
|
||||||
t.Skipf("TODO")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestIntransitiveActivity_Clean(t *testing.T) {
|
func TestIntransitiveActivity_Clean(t *testing.T) {
|
||||||
t.Skipf("TODO")
|
t.Skipf("TODO")
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,7 +107,7 @@ func (i *ItemCollection) Remove(r Item) {
|
||||||
if remIdx == -1 {
|
if remIdx == -1 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if remIdx < li - 1 {
|
if remIdx < li-1 {
|
||||||
*i = append((*i)[:remIdx], (*i)[remIdx+1:]...)
|
*i = append((*i)[:remIdx], (*i)[remIdx+1:]...)
|
||||||
} else {
|
} else {
|
||||||
*i = (*i)[:remIdx]
|
*i = (*i)[:remIdx]
|
||||||
|
@ -157,16 +157,6 @@ func ItemCollectionDeduplication(recCols ...*ItemCollection) ItemCollection {
|
||||||
return rec
|
return rec
|
||||||
}
|
}
|
||||||
|
|
||||||
// FlattenItemCollection flattens the Collection's properties from Object type to IRI
|
|
||||||
func FlattenItemCollection(c ItemCollection) ItemCollection {
|
|
||||||
if c != nil && len(c) > 0 {
|
|
||||||
for i, it := range c {
|
|
||||||
c[i] = FlattenToIRI(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToItemCollection
|
// ToItemCollection
|
||||||
func ToItemCollection(it Item) (*ItemCollection, error) {
|
func ToItemCollection(it Item) (*ItemCollection, error) {
|
||||||
switch i := it.(type) {
|
switch i := it.(type) {
|
||||||
|
|
|
@ -34,10 +34,6 @@ func TestItemCollection_First(t *testing.T) {
|
||||||
t.Skipf("TODO")
|
t.Skipf("TODO")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFlattenItemCollection(t *testing.T) {
|
|
||||||
t.Skipf("TODO")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestItemCollection_Count(t *testing.T) {
|
func TestItemCollection_Count(t *testing.T) {
|
||||||
t.Skipf("TODO")
|
t.Skipf("TODO")
|
||||||
}
|
}
|
||||||
|
@ -62,13 +58,13 @@ func TestItemCollection_Remove(t *testing.T) {
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "empty_collection_nil_item",
|
name: "empty_collection_nil_item",
|
||||||
i: ItemCollection{},
|
i: ItemCollection{},
|
||||||
arg: nil,
|
arg: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "empty_collection_non_nil_item",
|
name: "empty_collection_non_nil_item",
|
||||||
i: ItemCollection{},
|
i: ItemCollection{},
|
||||||
arg: &Object{},
|
arg: &Object{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "non_empty_collection_nil_item",
|
name: "non_empty_collection_nil_item",
|
||||||
|
@ -140,7 +136,7 @@ func TestItemCollection_Remove(t *testing.T) {
|
||||||
t.Errorf("%T should%s contain %T, but it does%s: %#v", tt.i, should, tt.arg, does, tt.i)
|
t.Errorf("%T should%s contain %T, but it does%s: %#v", tt.i, should, tt.arg, does, tt.i)
|
||||||
}
|
}
|
||||||
if origContains {
|
if origContains {
|
||||||
if tt.i.Count() > origLen - 1 {
|
if tt.i.Count() > origLen-1 {
|
||||||
t.Errorf("%T should have a count lower than %d, got %d", tt.i, origLen, tt.i.Count())
|
t.Errorf("%T should have a count lower than %d, got %d", tt.i, origLen, tt.i.Count())
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -436,10 +436,6 @@ func TestFlattenObjectProperties(t *testing.T) {
|
||||||
t.Skipf("TODO")
|
t.Skipf("TODO")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFlattenProperties(t *testing.T) {
|
|
||||||
t.Skipf("TODO")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestToTombstone(t *testing.T) {
|
func TestToTombstone(t *testing.T) {
|
||||||
t.Skipf("TODO")
|
t.Skipf("TODO")
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue