refactor(orm)!: support core genesis (#14822)
This commit is contained in:
@@ -5,15 +5,24 @@ import (
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
"cosmossdk.io/core/appmodule"
|
||||
"golang.org/x/exp/maps"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
"cosmossdk.io/errors"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/orm/types/ormerrors"
|
||||
"github.com/cosmos/cosmos-sdk/orm/types/ormjson"
|
||||
)
|
||||
|
||||
func (m moduleDB) DefaultJSON(target ormjson.WriteTarget) error {
|
||||
type appModuleGenesisWrapper struct {
|
||||
moduleDB
|
||||
}
|
||||
|
||||
func (m appModuleGenesisWrapper) IsOnePerModuleType() {}
|
||||
|
||||
func (m appModuleGenesisWrapper) IsAppModule() {}
|
||||
|
||||
func (m appModuleGenesisWrapper) DefaultGenesis(target appmodule.GenesisTarget) error {
|
||||
tableNames := maps.Keys(m.tablesByName)
|
||||
sort.Slice(tableNames, func(i, j int) bool {
|
||||
ti, tj := tableNames[i], tableNames[j]
|
||||
@@ -22,7 +31,7 @@ func (m moduleDB) DefaultJSON(target ormjson.WriteTarget) error {
|
||||
|
||||
for _, name := range tableNames {
|
||||
table := m.tablesByName[name]
|
||||
w, err := target.OpenWriter(name)
|
||||
w, err := target(string(name))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -40,7 +49,7 @@ func (m moduleDB) DefaultJSON(target ormjson.WriteTarget) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m moduleDB) ValidateJSON(source ormjson.ReadSource) error {
|
||||
func (m appModuleGenesisWrapper) ValidateGenesis(source appmodule.GenesisSource) error {
|
||||
errMap := map[protoreflect.FullName]error{}
|
||||
names := maps.Keys(m.tablesByName)
|
||||
sort.Slice(names, func(i, j int) bool {
|
||||
@@ -48,7 +57,7 @@ func (m moduleDB) ValidateJSON(source ormjson.ReadSource) error {
|
||||
return ti.Name() < tj.Name()
|
||||
})
|
||||
for _, name := range names {
|
||||
r, err := source.OpenReader(name)
|
||||
r, err := source(string(name))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -80,7 +89,7 @@ func (m moduleDB) ValidateJSON(source ormjson.ReadSource) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m moduleDB) ImportJSON(ctx context.Context, source ormjson.ReadSource) error {
|
||||
func (m appModuleGenesisWrapper) InitGenesis(ctx context.Context, source appmodule.GenesisSource) error {
|
||||
var names []string
|
||||
for name := range m.tablesByName {
|
||||
names = append(names, string(name))
|
||||
@@ -91,7 +100,7 @@ func (m moduleDB) ImportJSON(ctx context.Context, source ormjson.ReadSource) err
|
||||
fullName := protoreflect.FullName(name)
|
||||
table := m.tablesByName[fullName]
|
||||
|
||||
r, err := source.OpenReader(fullName)
|
||||
r, err := source(string(fullName))
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "table %s", fullName)
|
||||
}
|
||||
@@ -114,7 +123,7 @@ func (m moduleDB) ImportJSON(ctx context.Context, source ormjson.ReadSource) err
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m moduleDB) ExportJSON(ctx context.Context, sink ormjson.WriteTarget) error {
|
||||
func (m appModuleGenesisWrapper) ExportGenesis(ctx context.Context, sink appmodule.GenesisTarget) error {
|
||||
// Ensure that we export the tables in a deterministic order.
|
||||
tableNames := maps.Keys(m.tablesByName)
|
||||
sort.Slice(tableNames, func(i, j int) bool {
|
||||
@@ -123,7 +132,7 @@ func (m moduleDB) ExportJSON(ctx context.Context, sink ormjson.WriteTarget) erro
|
||||
})
|
||||
|
||||
for _, name := range tableNames {
|
||||
w, err := sink.OpenWriter(name)
|
||||
w, err := sink(string(name))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
+18
-13
@@ -7,13 +7,12 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"cosmossdk.io/core/appmodule"
|
||||
"cosmossdk.io/core/store"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
|
||||
ormv1alpha1 "cosmossdk.io/api/cosmos/orm/v1alpha1"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/orm/types/ormjson"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protodesc"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/orm/encoding/encodeutil"
|
||||
@@ -31,18 +30,19 @@ import (
|
||||
type ModuleDB interface {
|
||||
ormtable.Schema
|
||||
|
||||
// DefaultJSON writes default JSON for each table in the module to the target.
|
||||
DefaultJSON(ormjson.WriteTarget) error
|
||||
// GenesisHandler returns an implementation of appmodule.HasGenesis
|
||||
// to be embedded in or called from app module implementations.
|
||||
// Ex:
|
||||
// type Keeper struct {
|
||||
// appmodule.HasGenesis
|
||||
// }
|
||||
//
|
||||
// func NewKeeper(db ModuleDB) *Keeper {
|
||||
// return &Keeper{HasGenesis: db.GenesisHandler()}
|
||||
// }
|
||||
GenesisHandler() appmodule.HasGenesis
|
||||
|
||||
// ValidateJSON validates JSON for each table in the module.
|
||||
ValidateJSON(ormjson.ReadSource) error
|
||||
|
||||
// ImportJSON imports JSON for each table in the module which has JSON
|
||||
// defined in the read source.
|
||||
ImportJSON(context.Context, ormjson.ReadSource) error
|
||||
|
||||
// ExportJSON exports JSON for each table in the module.
|
||||
ExportJSON(context.Context, ormjson.WriteTarget) error
|
||||
private()
|
||||
}
|
||||
|
||||
type moduleDB struct {
|
||||
@@ -212,3 +212,8 @@ func (m moduleDB) EncodeEntry(entry ormkv.Entry) (k, v []byte, err error) {
|
||||
func (m moduleDB) GetTable(message proto.Message) ormtable.Table {
|
||||
return m.tablesByName[message.ProtoReflect().Descriptor().FullName()]
|
||||
}
|
||||
func (m moduleDB) GenesisHandler() appmodule.HasGenesis {
|
||||
return appModuleGenesisWrapper{m}
|
||||
}
|
||||
|
||||
func (moduleDB) private() {}
|
||||
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
ormv1alpha1 "cosmossdk.io/api/cosmos/orm/v1alpha1"
|
||||
"cosmossdk.io/core/appconfig"
|
||||
"cosmossdk.io/core/appmodule"
|
||||
"cosmossdk.io/core/genesis"
|
||||
"cosmossdk.io/core/store"
|
||||
dbm "github.com/cosmos/cosmos-db"
|
||||
|
||||
@@ -32,7 +33,6 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/orm/model/ormtable"
|
||||
"github.com/cosmos/cosmos-sdk/orm/testing/ormtest"
|
||||
"github.com/cosmos/cosmos-sdk/orm/types/ormerrors"
|
||||
"github.com/cosmos/cosmos-sdk/orm/types/ormjson"
|
||||
)
|
||||
|
||||
// These tests use a simulated bank keeper. Addresses and balances use
|
||||
@@ -225,40 +225,40 @@ func TestModuleDB(t *testing.T) {
|
||||
}
|
||||
|
||||
// check JSON
|
||||
target := ormjson.NewRawMessageTarget()
|
||||
assert.NilError(t, db.DefaultJSON(target))
|
||||
target := genesis.RawJSONTarget{}
|
||||
assert.NilError(t, db.GenesisHandler().DefaultGenesis(target.Target()))
|
||||
rawJson, err := target.JSON()
|
||||
assert.NilError(t, err)
|
||||
golden.Assert(t, string(rawJson), "default_json.golden")
|
||||
|
||||
target = ormjson.NewRawMessageTarget()
|
||||
assert.NilError(t, db.ExportJSON(ctx, target))
|
||||
target = genesis.RawJSONTarget{}
|
||||
assert.NilError(t, db.GenesisHandler().ExportGenesis(ctx, target.Target()))
|
||||
rawJson, err = target.JSON()
|
||||
assert.NilError(t, err)
|
||||
|
||||
goodJSON := `{
|
||||
"testpb.Supply": []
|
||||
}`
|
||||
source, err := ormjson.NewRawMessageSource(json.RawMessage(goodJSON))
|
||||
source, err := genesis.SourceFromRawJSON(json.RawMessage(goodJSON))
|
||||
assert.NilError(t, err)
|
||||
assert.NilError(t, db.ValidateJSON(source))
|
||||
assert.NilError(t, db.ImportJSON(ormtable.WrapContextDefault(ormtest.NewMemoryBackend()), source))
|
||||
assert.NilError(t, db.GenesisHandler().ValidateGenesis(source))
|
||||
assert.NilError(t, db.GenesisHandler().InitGenesis(ormtable.WrapContextDefault(ormtest.NewMemoryBackend()), source))
|
||||
|
||||
badJSON := `{
|
||||
"testpb.Balance": 5,
|
||||
"testpb.Supply": {}
|
||||
}
|
||||
`
|
||||
source, err = ormjson.NewRawMessageSource(json.RawMessage(badJSON))
|
||||
source, err = genesis.SourceFromRawJSON(json.RawMessage(badJSON))
|
||||
assert.NilError(t, err)
|
||||
assert.ErrorIs(t, db.ValidateJSON(source), ormerrors.JSONValidationError)
|
||||
assert.ErrorIs(t, db.GenesisHandler().ValidateGenesis(source), ormerrors.JSONValidationError)
|
||||
|
||||
backend2 := ormtest.NewMemoryBackend()
|
||||
ctx2 := ormtable.WrapContextDefault(backend2)
|
||||
source, err = ormjson.NewRawMessageSource(rawJson)
|
||||
source, err = genesis.SourceFromRawJSON(rawJson)
|
||||
assert.NilError(t, err)
|
||||
assert.NilError(t, db.ValidateJSON(source))
|
||||
assert.NilError(t, db.ImportJSON(ctx2, source))
|
||||
assert.NilError(t, db.GenesisHandler().ValidateGenesis(source))
|
||||
assert.NilError(t, db.GenesisHandler().InitGenesis(ctx2, source))
|
||||
testkv.AssertBackendsEqual(t, backend, backend2)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user