From 0e6a579e18e84c600bf0d7355da4235c4b143794 Mon Sep 17 00:00:00 2001 From: ltacker Date: Thu, 17 Jun 2021 15:05:18 +0200 Subject: [PATCH 01/15] Singleton component templates --- .../keeper/{{typeName}}.go.plush | 2 +- .../templates/typed/singleton/stargate.go | 1 + .../{{moduleName}}/{{typeName}}.proto.plush | 11 ++ .../client/cli/query_{{typeName}}.go.plush | 36 ++++ .../cli/query_{{typeName}}_test.go.plush} | 58 ------ .../keeper/grpc_query_{{typeName}}.go.plush | 26 +++ .../grpc_query_{{typeName}}_test.go.plush | 57 ++++++ .../keeper/{{typeName}}.go.plush | 33 ++++ .../keeper/{{typeName}}_test.go.plush | 40 +++++ .../client/cli/tx_{{typeName}}.go.plush | 103 +++++++++++ .../client/cli/tx_{{typeName}}_test.go.plush | 168 ++++++++++++++++++ .../keeper/msg_server_{{typeName}}.go.plush | 77 ++++++++ .../msg_server_{{typeName}}_test.go.plush | 119 +++++++++++++ .../types/messages_{{typeName}}.go.plush | 121 +++++++++++++ 14 files changed, 793 insertions(+), 59 deletions(-) create mode 100644 starport/templates/typed/singleton/stargate.go create mode 100644 starport/templates/typed/singleton/stargate/component/proto/{{moduleName}}/{{typeName}}.proto.plush create mode 100644 starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}.go.plush rename starport/templates/typed/{indexed/stargate/component/x/{{moduleName}}/client/cli/query{{TypeName}}_test.go.plush => singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush} (51%) create mode 100644 starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}.go.plush create mode 100644 starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush create mode 100644 starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush create mode 100644 starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush create mode 100644 starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}.go.plush create mode 100644 starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush create mode 100644 starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush create mode 100644 starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush create mode 100644 starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/types/messages_{{typeName}}.go.plush diff --git a/starport/templates/typed/indexed/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush b/starport/templates/typed/indexed/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush index e9972c8b9c..6c75e03615 100644 --- a/starport/templates/typed/indexed/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush +++ b/starport/templates/typed/indexed/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush @@ -26,7 +26,7 @@ func (k Keeper) Get<%= TypeName.UpperCamel %>(ctx sdk.Context, index string) (va return val, true } -// Delete<%= TypeName.UpperCamel %> removes a <%= TypeName.LowerCamel %> from the store +// Remove<%= TypeName.UpperCamel %> removes a <%= TypeName.LowerCamel %> from the store func (k Keeper) Remove<%= TypeName.UpperCamel %>(ctx sdk.Context, index string) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.<%= TypeName.UpperCamel %>Key)) store.Delete(types.KeyPrefix(index)) diff --git a/starport/templates/typed/singleton/stargate.go b/starport/templates/typed/singleton/stargate.go new file mode 100644 index 0000000000..92ec6a3b51 --- /dev/null +++ b/starport/templates/typed/singleton/stargate.go @@ -0,0 +1 @@ +package singleton diff --git a/starport/templates/typed/singleton/stargate/component/proto/{{moduleName}}/{{typeName}}.proto.plush b/starport/templates/typed/singleton/stargate/component/proto/{{moduleName}}/{{typeName}}.proto.plush new file mode 100644 index 0000000000..4a75035aa7 --- /dev/null +++ b/starport/templates/typed/singleton/stargate/component/proto/{{moduleName}}/{{typeName}}.proto.plush @@ -0,0 +1,11 @@ +syntax = "proto3"; +package <%= formatOwnerName(OwnerName) %>.<%= AppName %>.<%= ModuleName %>; + +option go_package = "<%= ModulePath %>/x/<%= ModuleName %>/types"; + +import "gogoproto/gogo.proto"; + +message <%= TypeName.UpperCamel %> { + string creator = 1;<%= for (i, field) in Fields { %> + <%= field.Datatype %> <%= field.Name.LowerCamel %> = <%= i+2 %>; <% } %> +} diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}.go.plush new file mode 100644 index 0000000000..aa3ed4ca56 --- /dev/null +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}.go.plush @@ -0,0 +1,36 @@ +package cli + +import ( + "context" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/spf13/cobra" + "<%= ModulePath %>/x/<%= ModuleName %>/types" +) + +func CmdShow<%= TypeName.UpperCamel %>() *cobra.Command { + cmd := &cobra.Command{ + Use: "show-<%= TypeName.Kebab %>", + Short: "shows <%= TypeName.Original %>", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryGet<%= TypeName.UpperCamel %>Request{} + + res, err := queryClient.<%= TypeName.UpperCamel %>(context.Background(), params) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/starport/templates/typed/indexed/stargate/component/x/{{moduleName}}/client/cli/query{{TypeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush similarity index 51% rename from starport/templates/typed/indexed/stargate/component/x/{{moduleName}}/client/cli/query{{TypeName}}_test.go.plush rename to starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush index 3da9f28c1d..37c32c0996 100644 --- a/starport/templates/typed/indexed/stargate/component/x/{{moduleName}}/client/cli/query{{TypeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush @@ -80,61 +80,3 @@ func TestShow<%= TypeName.UpperCamel %>(t *testing.T) { } } -func TestList<%= TypeName.UpperCamel %>(t *testing.T) { - net, objs := networkWith<%= TypeName.UpperCamel %>Objects(t, 5) - - ctx := net.Validators[0].ClientCtx - request := func(next []byte, offset, limit uint64, total bool) []string { - args := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - if next == nil { - args = append(args, fmt.Sprintf("--%s=%d", flags.FlagOffset, offset)) - } else { - args = append(args, fmt.Sprintf("--%s=%s", flags.FlagPageKey, next)) - } - args = append(args, fmt.Sprintf("--%s=%d", flags.FlagLimit, limit)) - if total { - args = append(args, fmt.Sprintf("--%s", flags.FlagCountTotal)) - } - return args - } - t.Run("ByOffset", func(t *testing.T) { - step := 2 - for i := 0; i < len(objs); i += step { - args := request(nil, uint64(i), uint64(step), false) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdList<%= TypeName.UpperCamel %>(), args) - require.NoError(t, err) - var resp types.QueryAll<%= TypeName.UpperCamel %>Response - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - for j := i; j < len(objs) && j < i+step; j++ { - assert.Equal(t, objs[j], resp.<%= TypeName.UpperCamel %>[j-i]) - } - } - }) - t.Run("ByKey", func(t *testing.T) { - step := 2 - var next []byte - for i := 0; i < len(objs); i += step { - args := request(next, 0, uint64(step), false) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdList<%= TypeName.UpperCamel %>(), args) - require.NoError(t, err) - var resp types.QueryAll<%= TypeName.UpperCamel %>Response - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - for j := i; j < len(objs) && j < i+step; j++ { - assert.Equal(t, objs[j], resp.<%= TypeName.UpperCamel %>[j-i]) - } - next = resp.Pagination.NextKey - } - }) - t.Run("Total", func(t *testing.T) { - args := request(nil, 0, uint64(len(objs)), true) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdList<%= TypeName.UpperCamel %>(), args) - require.NoError(t, err) - var resp types.QueryAll<%= TypeName.UpperCamel %>Response - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NoError(t, err) - require.Equal(t, len(objs), int(resp.Pagination.Total)) - require.Equal(t, objs, resp.<%= TypeName.UpperCamel %>) - }) -} diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}.go.plush new file mode 100644 index 0000000000..50531acb20 --- /dev/null +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}.go.plush @@ -0,0 +1,26 @@ +package keeper + +import ( + "context" + + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" + "<%= ModulePath %>/x/<%= ModuleName %>/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) <%= TypeName.UpperCamel %>(c context.Context, req *types.QueryGet<%= TypeName.UpperCamel %>Request) (*types.QueryGet<%= TypeName.UpperCamel %>Response, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + ctx := sdk.UnwrapSDKContext(c) + + val, found := k.Get<%= TypeName.UpperCamel %>(ctx) + if !found { + return nil, status.Error(codes.InvalidArgument, "not found") + } + + return &types.QueryGet<%= TypeName.UpperCamel %>Response{<%= TypeName.UpperCamel %>: &val}, nil +} \ No newline at end of file diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush new file mode 100644 index 0000000000..5ac7b31855 --- /dev/null +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush @@ -0,0 +1,57 @@ +package keeper + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "<%= ModulePath %>/x/<%= ModuleName %>/types" +) + +func Test<%= TypeName.UpperCamel %>Query(t *testing.T) { + keeper, ctx := setupKeeper(t) + wctx := sdk.WrapSDKContext(ctx) + msgs := createN<%= TypeName.UpperCamel %>(keeper, ctx, 2) + for _, tc := range []struct { + desc string + request *types.QueryGet<%= TypeName.UpperCamel %>Request + response *types.QueryGet<%= TypeName.UpperCamel %>Response + err error + }{ + { + desc: "First", + request: &types.QueryGet<%= TypeName.UpperCamel %>Request{Index: msgs[0].Index}, + response: &types.QueryGet<%= TypeName.UpperCamel %>Response{<%= TypeName.UpperCamel %>: &msgs[0]}, + }, + { + desc: "Second", + request: &types.QueryGet<%= TypeName.UpperCamel %>Request{Index: msgs[1].Index}, + response: &types.QueryGet<%= TypeName.UpperCamel %>Response{<%= TypeName.UpperCamel %>: &msgs[1]}, + }, + { + desc: "KeyNotFound", + request: &types.QueryGet<%= TypeName.UpperCamel %>Request{Index: "missing"}, + err: status.Error(codes.InvalidArgument, "not found"), + }, + { + desc: "InvalidRequest", + err: status.Error(codes.InvalidArgument, "invalid request"), + }, + } { + tc := tc + t.Run(tc.desc, func(t *testing.T) { + response, err := keeper.<%= TypeName.UpperCamel %>(wctx, tc.request) + if tc.err != nil { + require.ErrorIs(t, err, tc.err) + } else { + require.Equal(t, tc.response, response) + } + }) + } +} + diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush new file mode 100644 index 0000000000..bd56c60eab --- /dev/null +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush @@ -0,0 +1,33 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "<%= ModulePath %>/x/<%= ModuleName %>/types" + "github.com/cosmos/cosmos-sdk/store/prefix" +) + +// Set<%= TypeName.UpperCamel %> set <%= TypeName.LowerCamel %> in the store +func (k Keeper) Set<%= TypeName.UpperCamel %>(ctx sdk.Context, <%= TypeName.LowerCamel %> types.<%= TypeName.UpperCamel %>) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.<%= TypeName.UpperCamel %>Key)) + b := k.cdc.MustMarshalBinaryBare(&<%= TypeName.LowerCamel %>) + store.Set([]byte{}, b) +} + +// Get<%= TypeName.UpperCamel %> returns <%= TypeName.LowerCamel %> +func (k Keeper) Get<%= TypeName.UpperCamel %>(ctx sdk.Context, index string) (val types.<%= TypeName.UpperCamel %>, found bool) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.<%= TypeName.UpperCamel %>Key)) + + b := store.Get([]byte{}) + if b == nil { + return val, false + } + + k.cdc.MustUnmarshalBinaryBare(b, &val) + return val, true +} + +// Remove<%= TypeName.UpperCamel %> removes <%= TypeName.LowerCamel %> from the store +func (k Keeper) Remove<%= TypeName.UpperCamel %>(ctx sdk.Context, index string) { + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.<%= TypeName.UpperCamel %>Key)) + store.Delete([]byte{}) +} diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush new file mode 100644 index 0000000000..60e4cd6275 --- /dev/null +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush @@ -0,0 +1,40 @@ +package keeper + +import ( + "fmt" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/assert" + + "<%= ModulePath %>/x/<%= ModuleName %>/types" +) + +func createN<%= TypeName.UpperCamel %>(keeper *Keeper, ctx sdk.Context, n int) []types.<%= TypeName.UpperCamel %> { + items := make([]types.<%= TypeName.UpperCamel %>, n) + for i := range items { + items[i].Creator = "any" + items[i].Index = fmt.Sprintf("%d", i) + keeper.Set<%= TypeName.UpperCamel %>(ctx, items[i]) + } + return items +} + +func Test<%= TypeName.UpperCamel %>Get(t *testing.T) { + keeper, ctx := setupKeeper(t) + items := createN<%= TypeName.UpperCamel %>(keeper, ctx, 10) + for _, item := range items { + rst, found := keeper.Get<%= TypeName.UpperCamel %>(ctx, item.Index) + assert.True(t, found) + assert.Equal(t, item, rst) + } +} +func Test<%= TypeName.UpperCamel %>Remove(t *testing.T) { + keeper, ctx := setupKeeper(t) + items := createN<%= TypeName.UpperCamel %>(keeper, ctx, 10) + for _, item := range items { + keeper.Remove<%= TypeName.UpperCamel %>(ctx, item.Index) + _, found := keeper.Get<%= TypeName.UpperCamel %>(ctx, item.Index) + assert.False(t, found) + } +} diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}.go.plush new file mode 100644 index 0000000000..844f60ddac --- /dev/null +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}.go.plush @@ -0,0 +1,103 @@ +package cli + +import ( + "github.com/spf13/cobra" + +<%= if (len(Fields) > 0) { %> + "github.com/spf13/cast" +<% } %> + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "<%= ModulePath %>/x/<%= ModuleName %>/types" +) + +func CmdCreate<%= TypeName.UpperCamel %>() *cobra.Command { + cmd := &cobra.Command{ + Use: "create-<%= TypeName.Kebab %> [index]<%= for (i, field) in Fields { %> [<%= field.Name.LowerCamel %>]<% } %>", + Short: "Create a new <%= TypeName.Original %>", + Args: cobra.ExactArgs(<%= len(Fields) + 1 %>), + RunE: func(cmd *cobra.Command, args []string) error { + index := args[0] + <%= for (i, field) in Fields { %> args<%= field.Name.UpperCamel %>, err := <%= castArgs(field.Datatype, i+1) %> + if err != nil { + return err + } + <% } %> + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgCreate<%= TypeName.UpperCamel %>(clientCtx.GetFromAddress().String(), index<%= for (i, field) in Fields { %>, args<%= field.Name.UpperCamel %><% } %>) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +func CmdUpdate<%= TypeName.UpperCamel %>() *cobra.Command { + cmd := &cobra.Command{ + Use: "update-<%= TypeName.Kebab %> [index]<%= for (i, field) in Fields { %> [<%= field.Name.LowerCamel %>]<% } %>", + Short: "Update a <%= TypeName.Original %>", + Args: cobra.ExactArgs(<%= len(Fields) + 1 %>), + RunE: func(cmd *cobra.Command, args []string) error { + index := args[0] + + <%= for (i, field) in Fields { %> args<%= field.Name.UpperCamel %>, err := <%= castArgs(field.Datatype, i+1) %> + if err != nil { + return err + } + <% } %> + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgUpdate<%= TypeName.UpperCamel %>(clientCtx.GetFromAddress().String(), index<%= for (i, field) in Fields { %>, args<%= field.Name.UpperCamel %><% } %>) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +func CmdDelete<%= TypeName.UpperCamel %>() *cobra.Command { + cmd := &cobra.Command{ + Use: "delete-<%= TypeName.Kebab %> [index]", + Short: "Delete a <%= TypeName.Original %>", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + index := args[0] + + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgDelete<%= TypeName.UpperCamel %>(clientCtx.GetFromAddress().String(), index) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} \ No newline at end of file diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush new file mode 100644 index 0000000000..991583add2 --- /dev/null +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush @@ -0,0 +1,168 @@ +package cli_test + +import ( + "fmt" + "testing" + + "github.com/cosmos/cosmos-sdk/client/flags" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/stretchr/testify/require" + + "<%= ModulePath %>/testutil/network" + "<%= ModulePath %>/x/<%= ModuleName %>/client/cli" +) + +func TestCreate<%= TypeName.UpperCamel %>(t *testing.T) { + net := network.New(t) + val := net.Validators[0] + ctx := val.ClientCtx + id := "0" + + fields := []string{<%= for (field) in Fields { %> "<%= genValidArg(field.DatatypeName) %>", <% } %>} + for _, tc := range []struct { + desc string + id string + args []string + err error + code uint32 + }{ + { + id: id, + desc: "valid", + args: []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdk.NewInt(10))).String()), + }, + }, + } { + tc := tc + t.Run(tc.desc, func(t *testing.T) { + args := []string{tc.id} + args = append(args, fields...) + args = append(args, tc.args...) + out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdCreate<%= TypeName.UpperCamel %>(), args) + if tc.err != nil { + require.ErrorIs(t, err, tc.err) + } else { + require.NoError(t, err) + var resp sdk.TxResponse + require.NoError(t, ctx.JSONMarshaler.UnmarshalJSON(out.Bytes(), &resp)) + require.Equal(t, tc.code, resp.Code) + } + }) + } +} + +func TestUpdate<%= TypeName.UpperCamel %>(t *testing.T) { + net := network.New(t) + val := net.Validators[0] + ctx := val.ClientCtx + id := "0" + + fields := []string{<%= for (field) in Fields { %> "<%= genValidArg(field.DatatypeName) %>", <% } %>} + common := []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdk.NewInt(10))).String()), + } + args := []string{id} + args = append(args, fields...) + args = append(args, common...) + _, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdCreate<%= TypeName.UpperCamel %>(), args) + require.NoError(t, err) + + for _, tc := range []struct { + desc string + id string + args []string + code uint32 + err error + }{ + { + desc: "valid", + id: id, + args: common, + }, + { + desc: "key not found", + id: "1", + args: common, + code: sdkerrors.ErrKeyNotFound.ABCICode(), + }, + } { + tc := tc + t.Run(tc.desc, func(t *testing.T) { + args := []string{tc.id} + args = append(args, fields...) + args = append(args, tc.args...) + out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdUpdate<%= TypeName.UpperCamel %>(), args) + if tc.err != nil { + require.ErrorIs(t, err, tc.err) + } else { + require.NoError(t, err) + var resp sdk.TxResponse + require.NoError(t, ctx.JSONMarshaler.UnmarshalJSON(out.Bytes(), &resp)) + require.Equal(t, tc.code, resp.Code) + } + }) + } +} + +func TestDelete<%= TypeName.UpperCamel %>(t *testing.T) { + net := network.New(t) + + val := net.Validators[0] + ctx := val.ClientCtx + id := "0" + + fields := []string{<%= for (field) in Fields { %> "<%= genValidArg(field.DatatypeName) %>", <% } %>} + common := []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdk.NewInt(10))).String()), + } + args := []string{id} + args = append(args, fields...) + args = append(args, common...) + _, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdCreate<%= TypeName.UpperCamel %>(), args) + require.NoError(t, err) + + for _, tc := range []struct { + desc string + id string + args []string + code uint32 + err error + }{ + { + desc: "valid", + id: id, + args: common, + }, + { + desc: "key not found", + id: "1", + args: common, + code: sdkerrors.ErrKeyNotFound.ABCICode(), + }, + } { + tc := tc + t.Run(tc.desc, func(t *testing.T) { + out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdDelete<%= TypeName.UpperCamel %>(), append([]string{tc.id}, tc.args...)) + if tc.err != nil { + require.ErrorIs(t, err, tc.err) + } else { + require.NoError(t, err) + var resp sdk.TxResponse + require.NoError(t, ctx.JSONMarshaler.UnmarshalJSON(out.Bytes(), &resp)) + require.Equal(t, tc.code, resp.Code) + } + }) + } +} diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush new file mode 100644 index 0000000000..49ced69d80 --- /dev/null +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush @@ -0,0 +1,77 @@ +package keeper + +import ( + "fmt" + "context" + + "<%= ModulePath %>/x/<%= ModuleName %>/types" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + + +func (k msgServer) Create<%= TypeName.UpperCamel %>(goCtx context.Context, msg *types.MsgCreate<%= TypeName.UpperCamel %>) (*types.MsgCreate<%= TypeName.UpperCamel %>Response, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // Check if the value already exists + _, isFound := k.Get<%= TypeName.UpperCamel %>(ctx, msg.Index) + if isFound { + return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, fmt.Sprintf("index %v already set", msg.Index)) + } + + var <%= TypeName.LowerCamel %> = types.<%= TypeName.UpperCamel %>{ + Index: msg.Index, + Creator: msg.Creator,<%= for (field) in Fields { %> + <%= field.Name.UpperCamel %>: msg.<%= field.Name.UpperCamel %>,<% } %> + } + + k.Set<%= TypeName.UpperCamel %>( + ctx, + <%= TypeName.LowerCamel %>, + ) + return &types.MsgCreate<%= TypeName.UpperCamel %>Response{}, nil +} + +func (k msgServer) Update<%= TypeName.UpperCamel %>(goCtx context.Context, msg *types.MsgUpdate<%= TypeName.UpperCamel %>) (*types.MsgUpdate<%= TypeName.UpperCamel %>Response, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // Check if the value exists + valFound, isFound := k.Get<%= TypeName.UpperCamel %>(ctx, msg.Index) + if !isFound { + return nil, sdkerrors.Wrap(sdkerrors.ErrKeyNotFound, fmt.Sprintf("index %v not set", msg.Index)) + } + + // Checks if the the msg sender is the same as the current owner + if msg.Creator != valFound.Creator { + return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "incorrect owner") + } + + var <%= TypeName.LowerCamel %> = types.<%= TypeName.UpperCamel %>{ + Index: msg.Index, + Creator: msg.Creator,<%= for (field) in Fields { %> + <%= field.Name.UpperCamel %>: msg.<%= field.Name.UpperCamel %>,<% } %> + } + + k.Set<%= TypeName.UpperCamel %>(ctx, <%= TypeName.LowerCamel %>) + + return &types.MsgUpdate<%= TypeName.UpperCamel %>Response{}, nil +} + +func (k msgServer) Delete<%= TypeName.UpperCamel %>(goCtx context.Context, msg *types.MsgDelete<%= TypeName.UpperCamel %>) (*types.MsgDelete<%= TypeName.UpperCamel %>Response, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // Check if the value exists + valFound, isFound := k.Get<%= TypeName.UpperCamel %>(ctx, msg.Index) + if !isFound { + return nil, sdkerrors.Wrap(sdkerrors.ErrKeyNotFound, fmt.Sprintf("index %v not set", msg.Index)) + } + + // Checks if the the msg sender is the same as the current owner + if msg.Creator != valFound.Creator { + return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "incorrect owner") + } + + k.Remove<%= TypeName.UpperCamel %>(ctx, msg.Index) + + return &types.MsgDelete<%= TypeName.UpperCamel %>Response{}, nil +} \ No newline at end of file diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush new file mode 100644 index 0000000000..d2e3399640 --- /dev/null +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush @@ -0,0 +1,119 @@ +package keeper + +import ( + "fmt" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "<%= ModulePath %>/x/<%= ModuleName %>/types" +) + +func Test<%= TypeName.UpperCamel %>MsgServerCreate(t *testing.T) { + keeper, ctx := setupKeeper(t) + srv := NewMsgServerImpl(*keeper) + wctx := sdk.WrapSDKContext(ctx) + creator := "A" + for i := 0; i < 5; i++ { + idx := fmt.Sprintf("%d", i) + expected := &types.MsgCreate<%= TypeName.UpperCamel %>{Creator: creator, Index: idx} + _, err := srv.Create<%= TypeName.UpperCamel %>(wctx, expected) + require.NoError(t, err) + rst, found := keeper.Get<%= TypeName.UpperCamel %>(ctx, expected.Index) + require.True(t, found) + assert.Equal(t, expected.Creator, rst.Creator) + } +} + +func Test<%= TypeName.UpperCamel %>MsgServerUpdate(t *testing.T) { + creator := "A" + index := "any" + + for _, tc := range []struct { + desc string + request *types.MsgUpdate<%= TypeName.UpperCamel %> + err error + }{ + { + desc: "Completed", + request: &types.MsgUpdate<%= TypeName.UpperCamel %>{Creator: creator, Index: index}, + }, + { + desc: "Unauthorized", + request: &types.MsgUpdate<%= TypeName.UpperCamel %>{Creator: "B", Index: index}, + err: sdkerrors.ErrUnauthorized, + }, + { + desc: "KeyNotFound", + request: &types.MsgUpdate<%= TypeName.UpperCamel %>{Creator: creator, Index: "missing"}, + err: sdkerrors.ErrKeyNotFound, + }, + } { + tc := tc + t.Run(tc.desc, func(t *testing.T) { + keeper, ctx := setupKeeper(t) + srv := NewMsgServerImpl(*keeper) + wctx := sdk.WrapSDKContext(ctx) + expected := &types.MsgCreate<%= TypeName.UpperCamel %>{Creator: creator, Index: index} + _, err := srv.Create<%= TypeName.UpperCamel %>(wctx, expected) + require.NoError(t, err) + + _, err = srv.Update<%= TypeName.UpperCamel %>(wctx, tc.request) + if tc.err != nil { + require.ErrorIs(t, err, tc.err) + } else { + require.NoError(t, err) + rst, found := keeper.Get<%= TypeName.UpperCamel %>(ctx, expected.Index) + require.True(t, found) + assert.Equal(t, expected.Creator, rst.Creator) + } + }) + } +} + +func Test<%= TypeName.UpperCamel %>MsgServerDelete(t *testing.T) { + creator := "A" + index := "any" + + for _, tc := range []struct { + desc string + request *types.MsgDelete<%= TypeName.UpperCamel %> + err error + }{ + { + desc: "Completed", + request: &types.MsgDelete<%= TypeName.UpperCamel %>{Creator: creator, Index: index}, + }, + { + desc: "Unauthorized", + request: &types.MsgDelete<%= TypeName.UpperCamel %>{Creator: "B", Index: index}, + err: sdkerrors.ErrUnauthorized, + }, + { + desc: "KeyNotFound", + request: &types.MsgDelete<%= TypeName.UpperCamel %>{Creator: creator, Index: "missing"}, + err: sdkerrors.ErrKeyNotFound, + }, + } { + tc := tc + t.Run(tc.desc, func(t *testing.T) { + keeper, ctx := setupKeeper(t) + srv := NewMsgServerImpl(*keeper) + wctx := sdk.WrapSDKContext(ctx) + + _, err := srv.Create<%= TypeName.UpperCamel %>(wctx, &types.MsgCreate<%= TypeName.UpperCamel %>{Creator: creator, Index: index}) + require.NoError(t, err) + _, err = srv.Delete<%= TypeName.UpperCamel %>(wctx, tc.request) + if tc.err != nil { + require.ErrorIs(t, err, tc.err) + } else { + require.NoError(t, err) + _, found := keeper.Get<%= TypeName.UpperCamel %>(ctx, tc.request.Index) + require.False(t, found) + } + }) + } +} diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/types/messages_{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/types/messages_{{typeName}}.go.plush new file mode 100644 index 0000000000..b8c1b9b002 --- /dev/null +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/types/messages_{{typeName}}.go.plush @@ -0,0 +1,121 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +var _ sdk.Msg = &MsgCreate<%= TypeName.UpperCamel %>{} + +func NewMsgCreate<%= TypeName.UpperCamel %>(creator string, index string<%= for (field) in Fields { %>, <%= field.Name.LowerCamel %> <%= field.Datatype %><% } %>) *MsgCreate<%= TypeName.UpperCamel %> { + return &MsgCreate<%= TypeName.UpperCamel %>{ + Creator: creator, + Index: index,<%= for (field) in Fields { %> + <%= field.Name.UpperCamel %>: <%= field.Name.LowerCamel %>,<% } %> + } +} + +func (msg *MsgCreate<%= TypeName.UpperCamel %>) Route() string { + return RouterKey +} + +func (msg *MsgCreate<%= TypeName.UpperCamel %>) Type() string { + return "Create<%= TypeName.UpperCamel %>" +} + +func (msg *MsgCreate<%= TypeName.UpperCamel %>) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgCreate<%= TypeName.UpperCamel %>) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgCreate<%= TypeName.UpperCamel %>) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + return nil +} + +var _ sdk.Msg = &MsgUpdate<%= TypeName.UpperCamel %>{} + +func NewMsgUpdate<%= TypeName.UpperCamel %>(creator string, index string<%= for (field) in Fields { %>, <%= field.Name.LowerCamel %> <%= field.Datatype %><% } %>) *MsgUpdate<%= TypeName.UpperCamel %> { + return &MsgUpdate<%= TypeName.UpperCamel %>{ + Creator: creator, + Index : index,<%= for (field) in Fields { %> + <%= field.Name.UpperCamel %>: <%= field.Name.LowerCamel %>,<% } %> + } +} + +func (msg *MsgUpdate<%= TypeName.UpperCamel %>) Route() string { + return RouterKey +} + +func (msg *MsgUpdate<%= TypeName.UpperCamel %>) Type() string { + return "Update<%= TypeName.UpperCamel %>" +} + +func (msg *MsgUpdate<%= TypeName.UpperCamel %>) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgUpdate<%= TypeName.UpperCamel %>) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgUpdate<%= TypeName.UpperCamel %>) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + return nil +} + +var _ sdk.Msg = &MsgDelete<%= TypeName.UpperCamel %>{} + +func NewMsgDelete<%= TypeName.UpperCamel %>(creator string, index string) *MsgDelete<%= TypeName.UpperCamel %> { + return &MsgDelete<%= TypeName.UpperCamel %>{ + Creator: creator, + Index : index, + } +} +func (msg *MsgDelete<%= TypeName.UpperCamel %>) Route() string { + return RouterKey +} + +func (msg *MsgDelete<%= TypeName.UpperCamel %>) Type() string { + return "Delete<%= TypeName.UpperCamel %>" +} + +func (msg *MsgDelete<%= TypeName.UpperCamel %>) GetSigners() []sdk.AccAddress { + creator, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + panic(err) + } + return []sdk.AccAddress{creator} +} + +func (msg *MsgDelete<%= TypeName.UpperCamel %>) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(msg) + return sdk.MustSortJSON(bz) +} + +func (msg *MsgDelete<%= TypeName.UpperCamel %>) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Creator) + if err != nil { + return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid creator address (%s)", err) + } + return nil +} \ No newline at end of file From 67c2cbd16616ee5f3dc1bccb73f04230af1a5904 Mon Sep 17 00:00:00 2001 From: ltacker Date: Thu, 17 Jun 2021 15:20:39 +0200 Subject: [PATCH 02/15] Message template --- .../client/cli/tx_{{typeName}}.go.plush | 33 ++++++++----------- .../keeper/msg_server_{{typeName}}.go.plush | 12 +++---- .../types/messages_{{typeName}}.go.plush | 13 +++----- 3 files changed, 24 insertions(+), 34 deletions(-) diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}.go.plush index 844f60ddac..b933acc512 100644 --- a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}.go.plush +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}.go.plush @@ -15,12 +15,11 @@ import ( func CmdCreate<%= TypeName.UpperCamel %>() *cobra.Command { cmd := &cobra.Command{ - Use: "create-<%= TypeName.Kebab %> [index]<%= for (i, field) in Fields { %> [<%= field.Name.LowerCamel %>]<% } %>", - Short: "Create a new <%= TypeName.Original %>", - Args: cobra.ExactArgs(<%= len(Fields) + 1 %>), + Use: "create-<%= TypeName.Kebab %><%= for (i, field) in Fields { %> [<%= field.Name.LowerCamel %>]<% } %>", + Short: "Create <%= TypeName.Original %>", + Args: cobra.ExactArgs(<%= len(Fields) %>), RunE: func(cmd *cobra.Command, args []string) error { - index := args[0] - <%= for (i, field) in Fields { %> args<%= field.Name.UpperCamel %>, err := <%= castArgs(field.Datatype, i+1) %> + <%= for (i, field) in Fields { %> args<%= field.Name.UpperCamel %>, err := <%= castArgs(field.Datatype, i) %> if err != nil { return err } @@ -31,7 +30,7 @@ func CmdCreate<%= TypeName.UpperCamel %>() *cobra.Command { return err } - msg := types.NewMsgCreate<%= TypeName.UpperCamel %>(clientCtx.GetFromAddress().String(), index<%= for (i, field) in Fields { %>, args<%= field.Name.UpperCamel %><% } %>) + msg := types.NewMsgCreate<%= TypeName.UpperCamel %>(clientCtx.GetFromAddress().String()<%= for (i, field) in Fields { %>, args<%= field.Name.UpperCamel %><% } %>) if err := msg.ValidateBasic(); err != nil { return err } @@ -46,13 +45,11 @@ func CmdCreate<%= TypeName.UpperCamel %>() *cobra.Command { func CmdUpdate<%= TypeName.UpperCamel %>() *cobra.Command { cmd := &cobra.Command{ - Use: "update-<%= TypeName.Kebab %> [index]<%= for (i, field) in Fields { %> [<%= field.Name.LowerCamel %>]<% } %>", - Short: "Update a <%= TypeName.Original %>", - Args: cobra.ExactArgs(<%= len(Fields) + 1 %>), + Use: "update-<%= TypeName.Kebab %><%= for (i, field) in Fields { %> [<%= field.Name.LowerCamel %>]<% } %>", + Short: "Update <%= TypeName.Original %>", + Args: cobra.ExactArgs(<%= len(Fields) %>), RunE: func(cmd *cobra.Command, args []string) error { - index := args[0] - - <%= for (i, field) in Fields { %> args<%= field.Name.UpperCamel %>, err := <%= castArgs(field.Datatype, i+1) %> + <%= for (i, field) in Fields { %> args<%= field.Name.UpperCamel %>, err := <%= castArgs(field.Datatype, i) %> if err != nil { return err } @@ -63,7 +60,7 @@ func CmdUpdate<%= TypeName.UpperCamel %>() *cobra.Command { return err } - msg := types.NewMsgUpdate<%= TypeName.UpperCamel %>(clientCtx.GetFromAddress().String(), index<%= for (i, field) in Fields { %>, args<%= field.Name.UpperCamel %><% } %>) + msg := types.NewMsgUpdate<%= TypeName.UpperCamel %>(clientCtx.GetFromAddress().String()<%= for (i, field) in Fields { %>, args<%= field.Name.UpperCamel %><% } %>) if err := msg.ValidateBasic(); err != nil { return err } @@ -78,18 +75,16 @@ func CmdUpdate<%= TypeName.UpperCamel %>() *cobra.Command { func CmdDelete<%= TypeName.UpperCamel %>() *cobra.Command { cmd := &cobra.Command{ - Use: "delete-<%= TypeName.Kebab %> [index]", - Short: "Delete a <%= TypeName.Original %>", - Args: cobra.ExactArgs(1), + Use: "delete-<%= TypeName.Kebab %>", + Short: "Delete <%= TypeName.Original %>", + Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { - index := args[0] - clientCtx, err := client.GetClientTxContext(cmd) if err != nil { return err } - msg := types.NewMsgDelete<%= TypeName.UpperCamel %>(clientCtx.GetFromAddress().String(), index) + msg := types.NewMsgDelete<%= TypeName.UpperCamel %>(clientCtx.GetFromAddress().String()) if err := msg.ValidateBasic(); err != nil { return err } diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush index 49ced69d80..15f3a4b8d9 100644 --- a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush @@ -14,13 +14,12 @@ func (k msgServer) Create<%= TypeName.UpperCamel %>(goCtx context.Context, msg ctx := sdk.UnwrapSDKContext(goCtx) // Check if the value already exists - _, isFound := k.Get<%= TypeName.UpperCamel %>(ctx, msg.Index) + _, isFound := k.Get<%= TypeName.UpperCamel %>(ctx) if isFound { - return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, fmt.Sprintf("index %v already set", msg.Index)) + return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "already set") } var <%= TypeName.LowerCamel %> = types.<%= TypeName.UpperCamel %>{ - Index: msg.Index, Creator: msg.Creator,<%= for (field) in Fields { %> <%= field.Name.UpperCamel %>: msg.<%= field.Name.UpperCamel %>,<% } %> } @@ -38,7 +37,7 @@ func (k msgServer) Update<%= TypeName.UpperCamel %>(goCtx context.Context, msg // Check if the value exists valFound, isFound := k.Get<%= TypeName.UpperCamel %>(ctx, msg.Index) if !isFound { - return nil, sdkerrors.Wrap(sdkerrors.ErrKeyNotFound, fmt.Sprintf("index %v not set", msg.Index)) + return nil, sdkerrors.Wrap(sdkerrors.ErrKeyNotFound, "not set") } // Checks if the the msg sender is the same as the current owner @@ -47,7 +46,6 @@ func (k msgServer) Update<%= TypeName.UpperCamel %>(goCtx context.Context, msg } var <%= TypeName.LowerCamel %> = types.<%= TypeName.UpperCamel %>{ - Index: msg.Index, Creator: msg.Creator,<%= for (field) in Fields { %> <%= field.Name.UpperCamel %>: msg.<%= field.Name.UpperCamel %>,<% } %> } @@ -63,7 +61,7 @@ func (k msgServer) Delete<%= TypeName.UpperCamel %>(goCtx context.Context, msg // Check if the value exists valFound, isFound := k.Get<%= TypeName.UpperCamel %>(ctx, msg.Index) if !isFound { - return nil, sdkerrors.Wrap(sdkerrors.ErrKeyNotFound, fmt.Sprintf("index %v not set", msg.Index)) + return nil, sdkerrors.Wrap(sdkerrors.ErrKeyNotFound, "not set") } // Checks if the the msg sender is the same as the current owner @@ -71,7 +69,7 @@ func (k msgServer) Delete<%= TypeName.UpperCamel %>(goCtx context.Context, msg return nil, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "incorrect owner") } - k.Remove<%= TypeName.UpperCamel %>(ctx, msg.Index) + k.Remove<%= TypeName.UpperCamel %>(ctx) return &types.MsgDelete<%= TypeName.UpperCamel %>Response{}, nil } \ No newline at end of file diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/types/messages_{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/types/messages_{{typeName}}.go.plush index b8c1b9b002..28db269c8d 100644 --- a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/types/messages_{{typeName}}.go.plush +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/types/messages_{{typeName}}.go.plush @@ -7,10 +7,9 @@ import ( var _ sdk.Msg = &MsgCreate<%= TypeName.UpperCamel %>{} -func NewMsgCreate<%= TypeName.UpperCamel %>(creator string, index string<%= for (field) in Fields { %>, <%= field.Name.LowerCamel %> <%= field.Datatype %><% } %>) *MsgCreate<%= TypeName.UpperCamel %> { +func NewMsgCreate<%= TypeName.UpperCamel %>(creator string<%= for (field) in Fields { %>, <%= field.Name.LowerCamel %> <%= field.Datatype %><% } %>) *MsgCreate<%= TypeName.UpperCamel %> { return &MsgCreate<%= TypeName.UpperCamel %>{ - Creator: creator, - Index: index,<%= for (field) in Fields { %> + Creator: creator,<%= for (field) in Fields { %> <%= field.Name.UpperCamel %>: <%= field.Name.LowerCamel %>,<% } %> } } @@ -46,10 +45,9 @@ func (msg *MsgCreate<%= TypeName.UpperCamel %>) ValidateBasic() error { var _ sdk.Msg = &MsgUpdate<%= TypeName.UpperCamel %>{} -func NewMsgUpdate<%= TypeName.UpperCamel %>(creator string, index string<%= for (field) in Fields { %>, <%= field.Name.LowerCamel %> <%= field.Datatype %><% } %>) *MsgUpdate<%= TypeName.UpperCamel %> { +func NewMsgUpdate<%= TypeName.UpperCamel %>(creator string<%= for (field) in Fields { %>, <%= field.Name.LowerCamel %> <%= field.Datatype %><% } %>) *MsgUpdate<%= TypeName.UpperCamel %> { return &MsgUpdate<%= TypeName.UpperCamel %>{ - Creator: creator, - Index : index,<%= for (field) in Fields { %> + Creator: creator,<%= for (field) in Fields { %> <%= field.Name.UpperCamel %>: <%= field.Name.LowerCamel %>,<% } %> } } @@ -85,10 +83,9 @@ func (msg *MsgUpdate<%= TypeName.UpperCamel %>) ValidateBasic() error { var _ sdk.Msg = &MsgDelete<%= TypeName.UpperCamel %>{} -func NewMsgDelete<%= TypeName.UpperCamel %>(creator string, index string) *MsgDelete<%= TypeName.UpperCamel %> { +func NewMsgDelete<%= TypeName.UpperCamel %>(creator string) *MsgDelete<%= TypeName.UpperCamel %> { return &MsgDelete<%= TypeName.UpperCamel %>{ Creator: creator, - Index : index, } } func (msg *MsgDelete<%= TypeName.UpperCamel %>) Route() string { From 999157303ff7cdd12737431b43a612e5c887ae93 Mon Sep 17 00:00:00 2001 From: ltacker Date: Thu, 17 Jun 2021 15:51:11 +0200 Subject: [PATCH 03/15] File modification --- .../templates/typed/singleton/stargate.go | 428 ++++++++++++++++++ 1 file changed, 428 insertions(+) diff --git a/starport/templates/typed/singleton/stargate.go b/starport/templates/typed/singleton/stargate.go index 92ec6a3b51..6cdfc5e410 100644 --- a/starport/templates/typed/singleton/stargate.go +++ b/starport/templates/typed/singleton/stargate.go @@ -1 +1,429 @@ package singleton + +import ( + "embed" + "fmt" + "strings" + + "github.com/gobuffalo/genny" + "github.com/tendermint/starport/starport/pkg/placeholder" + "github.com/tendermint/starport/starport/pkg/xgenny" + "github.com/tendermint/starport/starport/templates/typed" +) + +var ( + //go:embed stargate/component/* stargate/component/**/* + fsStargateComponent embed.FS + + //go:embed stargate/messages/* stargate/messages/**/* + fsStargateMessages embed.FS + + // stargateIndexedComponentTemplate allows to scaffold a new indexed type component in a Stargate module + stargateSingletonComponentTemplate = xgenny.NewEmbedWalker(fsStargateComponent, "stargate/component/") + + // stargateIndexedMessagesTemplate allows to scaffold indexed type CRUD messages in a Stargate module + stargateSingletonMessagesTemplate = xgenny.NewEmbedWalker(fsStargateMessages, "stargate/messages/") +) + +// NewStargate returns the generator to scaffold a new indexed type in a Stargate module +func NewStargate(replacer placeholder.Replacer, opts *typed.Options) (*genny.Generator, error) { + g := genny.New() + + g.RunFn(typesKeyModify(opts)) + g.RunFn(protoRPCModify(replacer, opts)) + g.RunFn(moduleGRPCGatewayModify(replacer, opts)) + g.RunFn(clientCliQueryModify(replacer, opts)) + g.RunFn(genesisProtoModify(replacer, opts)) + g.RunFn(genesisTypesModify(replacer, opts)) + g.RunFn(genesisModuleModify(replacer, opts)) + + // Modifications for new messages + if !opts.NoMessage { + g.RunFn(protoTxModify(replacer, opts)) + g.RunFn(handlerModify(replacer, opts)) + g.RunFn(clientCliTxModify(replacer, opts)) + g.RunFn(typesCodecModify(replacer, opts)) + + if err := typed.Box(stargateSingletonMessagesTemplate, opts, g); err != nil { + return nil, err + } + } + + return g, typed.Box(stargateSingletonComponentTemplate, opts, g) +} + +func typesKeyModify(opts *typed.Options) genny.RunFn { + return func(r *genny.Runner) error { + path := fmt.Sprintf("x/%s/types/keys.go", opts.ModuleName) + f, err := r.Disk.Find(path) + if err != nil { + return err + } + content := f.String() + fmt.Sprintf(` +const ( + %[1]vKey= "%[1]v-value-" +) +`, opts.TypeName.UpperCamel) + newFile := genny.NewFileS(path, content) + return r.File(newFile) + } +} + +func protoRPCModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { + return func(r *genny.Runner) error { + path := fmt.Sprintf("proto/%s/query.proto", opts.ModuleName) + f, err := r.Disk.Find(path) + if err != nil { + return err + } + + // Import the type + templateImport := `%s +import "%s/%s.proto";` + replacementImport := fmt.Sprintf(templateImport, typed.Placeholder, + opts.ModuleName, + opts.TypeName.Snake, + ) + content := replacer.Replace(f.String(), typed.Placeholder, replacementImport) + + // Add the service + templateService := `%[1]v + + // Queries a %[3]v by index. + rpc %[2]v(QueryGet%[2]vRequest) returns (QueryGet%[2]vResponse) { + option (google.api.http).get = "/%[4]v/%[5]v/%[6]v/%[3]v"; + } +` + replacementService := fmt.Sprintf(templateService, typed.Placeholder2, + opts.TypeName.UpperCamel, + opts.TypeName.LowerCamel, + opts.OwnerName, + opts.AppName, + opts.ModuleName, + ) + content = replacer.Replace(content, typed.Placeholder2, replacementService) + + // Add the service messages + templateMessage := `%[1]v +message QueryGet%[2]vRequest { + string index = 1; +} + +message QueryGet%[2]vResponse { + %[2]v %[2]v = 1; +}` + replacementMessage := fmt.Sprintf(templateMessage, typed.Placeholder3, + opts.TypeName.UpperCamel, + opts.TypeName.LowerCamel, + ) + content = replacer.Replace(content, typed.Placeholder3, replacementMessage) + + newFile := genny.NewFileS(path, content) + return r.File(newFile) + } +} + +func moduleGRPCGatewayModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { + return func(r *genny.Runner) error { + path := fmt.Sprintf("x/%s/module.go", opts.ModuleName) + f, err := r.Disk.Find(path) + if err != nil { + return err + } + replacement := `"context"` + content := replacer.ReplaceOnce(f.String(), typed.Placeholder, replacement) + + replacement = `types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx))` + content = replacer.ReplaceOnce(content, typed.Placeholder2, replacement) + + newFile := genny.NewFileS(path, content) + return r.File(newFile) + } +} + +func clientCliQueryModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { + return func(r *genny.Runner) error { + path := fmt.Sprintf("x/%s/client/cli/query.go", opts.ModuleName) + f, err := r.Disk.Find(path) + if err != nil { + return err + } + template := `%[1]v + + cmd.AddCommand(CmdShow%[2]v()) +` + replacement := fmt.Sprintf(template, typed.Placeholder, + opts.TypeName.UpperCamel, + ) + content := replacer.Replace(f.String(), typed.Placeholder, replacement) + newFile := genny.NewFileS(path, content) + return r.File(newFile) + } +} + +func genesisProtoModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { + return func(r *genny.Runner) error { + path := fmt.Sprintf("proto/%s/genesis.proto", opts.ModuleName) + f, err := r.Disk.Find(path) + if err != nil { + return err + } + + templateProtoImport := `%[1]v +import "%[2]v/%[3]v.proto";` + replacementProtoImport := fmt.Sprintf( + templateProtoImport, + typed.PlaceholderGenesisProtoImport, + opts.ModuleName, + opts.TypeName.Snake, + ) + content := replacer.Replace(f.String(), typed.PlaceholderGenesisProtoImport, replacementProtoImport) + + // Determine the new field number + fieldNumber := strings.Count(content, typed.PlaceholderGenesisProtoStateField) + 1 + + templateProtoState := `%[1]v + %[2]v %[3]v = %[4]v; %[5]v` + replacementProtoState := fmt.Sprintf( + templateProtoState, + typed.PlaceholderGenesisProtoState, + opts.TypeName.UpperCamel, + opts.TypeName.LowerCamel, + fieldNumber, + typed.PlaceholderGenesisProtoStateField, + ) + content = replacer.Replace(content, typed.PlaceholderGenesisProtoState, replacementProtoState) + + newFile := genny.NewFileS(path, content) + return r.File(newFile) + } +} + +func genesisTypesModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { + return func(r *genny.Runner) error { + path := fmt.Sprintf("x/%s/types/genesis.go", opts.ModuleName) + f, err := r.Disk.Find(path) + if err != nil { + return err + } + + content := typed.PatchGenesisTypeImport(replacer, f.String()) + + templateTypesImport := `"fmt"` + content = replacer.ReplaceOnce(content, typed.PlaceholderGenesisTypesImport, templateTypesImport) + + templateTypesDefault := `%[1]v +%[2]v: nil,` + replacementTypesDefault := fmt.Sprintf( + templateTypesDefault, + typed.PlaceholderGenesisTypesDefault, + opts.TypeName.UpperCamel, + ) + content = replacer.Replace(content, typed.PlaceholderGenesisTypesDefault, replacementTypesDefault) + + newFile := genny.NewFileS(path, content) + return r.File(newFile) + } +} + +func genesisModuleModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { + return func(r *genny.Runner) error { + path := fmt.Sprintf("x/%s/genesis.go", opts.ModuleName) + f, err := r.Disk.Find(path) + if err != nil { + return err + } + + templateModuleInit := `%[1]v +// Set if defined +if genState.%[3]v != nil { + k.Set%[3]v(ctx, *genState.%[3]v) +} + +` + replacementModuleInit := fmt.Sprintf( + templateModuleInit, + typed.PlaceholderGenesisModuleInit, + opts.TypeName.LowerCamel, + opts.TypeName.UpperCamel, + ) + content := replacer.Replace(f.String(), typed.PlaceholderGenesisModuleInit, replacementModuleInit) + + templateModuleExport := `%[1]v +// Get all %[2]v +%[2]v, found := k.Get%[3]v(ctx) +if found { + genesis.%[3]v = &%[2]v +} +` + replacementModuleExport := fmt.Sprintf( + templateModuleExport, + typed.PlaceholderGenesisModuleExport, + opts.TypeName.LowerCamel, + opts.TypeName.UpperCamel, + ) + content = replacer.Replace(content, typed.PlaceholderGenesisModuleExport, replacementModuleExport) + + newFile := genny.NewFileS(path, content) + return r.File(newFile) + } +} + +func protoTxModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { + return func(r *genny.Runner) error { + path := fmt.Sprintf("proto/%s/tx.proto", opts.ModuleName) + f, err := r.Disk.Find(path) + if err != nil { + return err + } + + // Import + templateImport := `%s +import "%s/%s.proto";` + replacementImport := fmt.Sprintf(templateImport, typed.PlaceholderProtoTxImport, + opts.ModuleName, + opts.TypeName.Snake, + ) + content := replacer.Replace(f.String(), typed.PlaceholderProtoTxImport, replacementImport) + + // RPC service + templateRPC := `%[1]v + rpc Create%[2]v(MsgCreate%[2]v) returns (MsgCreate%[2]vResponse); + rpc Update%[2]v(MsgUpdate%[2]v) returns (MsgUpdate%[2]vResponse); + rpc Delete%[2]v(MsgDelete%[2]v) returns (MsgDelete%[2]vResponse);` + replacementRPC := fmt.Sprintf(templateRPC, typed.PlaceholderProtoTxRPC, + opts.TypeName.UpperCamel, + ) + content = replacer.Replace(content, typed.PlaceholderProtoTxRPC, replacementRPC) + + // Messages + var fields string + for i, field := range opts.Fields { + fields += fmt.Sprintf(" %s %s = %d;\n", field.Datatype, field.Name.LowerCamel, i+3) + } + + templateMessages := `%[1]v +message MsgCreate%[2]v { + string creator = 1; +%[3]v} +message MsgCreate%[2]vResponse { } + +message MsgUpdate%[2]v { + string creator = 1; +%[3]v} +message MsgUpdate%[2]vResponse { } + +message MsgDelete%[2]v { + string creator = 1; +} +message MsgDelete%[2]vResponse { } +` + replacementMessages := fmt.Sprintf(templateMessages, typed.PlaceholderProtoTxMessage, + opts.TypeName.UpperCamel, + fields, + ) + content = replacer.Replace(content, typed.PlaceholderProtoTxMessage, replacementMessages) + + newFile := genny.NewFileS(path, content) + return r.File(newFile) + } +} + +func handlerModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { + return func(r *genny.Runner) error { + path := fmt.Sprintf("x/%s/handler.go", opts.ModuleName) + f, err := r.Disk.Find(path) + if err != nil { + return err + } + + // Set once the MsgServer definition if it is not defined yet + replacementMsgServer := `msgServer := keeper.NewMsgServerImpl(k)` + content := replacer.ReplaceOnce(f.String(), typed.PlaceholderHandlerMsgServer, replacementMsgServer) + + templateHandlers := `%[1]v + case *types.MsgCreate%[2]v: + res, err := msgServer.Create%[2]v(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgUpdate%[2]v: + res, err := msgServer.Update%[2]v(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgDelete%[2]v: + res, err := msgServer.Delete%[2]v(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) +` + replacementHandlers := fmt.Sprintf(templateHandlers, + typed.Placeholder, + opts.TypeName.UpperCamel, + ) + content = replacer.Replace(content, typed.Placeholder, replacementHandlers) + newFile := genny.NewFileS(path, content) + return r.File(newFile) + } +} + +func clientCliTxModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { + return func(r *genny.Runner) error { + path := fmt.Sprintf("x/%s/client/cli/tx.go", opts.ModuleName) + f, err := r.Disk.Find(path) + if err != nil { + return err + } + template := `%[1]v + cmd.AddCommand(CmdCreate%[2]v()) + cmd.AddCommand(CmdUpdate%[2]v()) + cmd.AddCommand(CmdDelete%[2]v()) +` + replacement := fmt.Sprintf(template, typed.Placeholder, opts.TypeName.UpperCamel) + content := replacer.Replace(f.String(), typed.Placeholder, replacement) + newFile := genny.NewFileS(path, content) + return r.File(newFile) + } +} + +func typesCodecModify(replacer placeholder.Replacer, opts *typed.Options) genny.RunFn { + return func(r *genny.Runner) error { + path := fmt.Sprintf("x/%s/types/codec.go", opts.ModuleName) + f, err := r.Disk.Find(path) + if err != nil { + return err + } + + content := f.String() + + // Import + replacementImport := `sdk "github.com/cosmos/cosmos-sdk/types"` + content = replacer.ReplaceOnce(content, typed.Placeholder, replacementImport) + + // Concrete + templateConcrete := `%[1]v +cdc.RegisterConcrete(&MsgCreate%[2]v{}, "%[3]v/Create%[2]v", nil) +cdc.RegisterConcrete(&MsgUpdate%[2]v{}, "%[3]v/Update%[2]v", nil) +cdc.RegisterConcrete(&MsgDelete%[2]v{}, "%[3]v/Delete%[2]v", nil) +` + replacementConcrete := fmt.Sprintf( + templateConcrete, + typed.Placeholder2, + opts.TypeName.UpperCamel, + opts.ModuleName, + ) + content = replacer.Replace(content, typed.Placeholder2, replacementConcrete) + + // Interface + templateInterface := `%[1]v +registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgCreate%[2]v{}, + &MsgUpdate%[2]v{}, + &MsgDelete%[2]v{}, +)` + replacementInterface := fmt.Sprintf( + templateInterface, + typed.Placeholder3, + opts.TypeName.UpperCamel, + ) + content = replacer.Replace(content, typed.Placeholder3, replacementInterface) + + newFile := genny.NewFileS(path, content) + return r.File(newFile) + } +} From 5b47dca2a5f14619d338e4403fb0f512906c5bf9 Mon Sep 17 00:00:00 2001 From: ltacker Date: Thu, 17 Jun 2021 16:05:13 +0200 Subject: [PATCH 04/15] Query test --- .../cli/query_{{typeName}}_test.go.plush | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush index 37c32c0996..87d712dea8 100644 --- a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush @@ -18,23 +18,21 @@ import ( "<%= ModulePath %>/x/<%= ModuleName %>/types" ) -func networkWith<%= TypeName.UpperCamel %>Objects(t *testing.T, n int) (*network.Network, []*types.<%= TypeName.UpperCamel %>) { +func networkWith<%= TypeName.UpperCamel %>Objects(t *testing.T) (*network.Network, *types.<%= TypeName.UpperCamel %>) { t.Helper() cfg := network.DefaultConfig() state := types.GenesisState{} require.NoError(t, cfg.Codec.UnmarshalJSON(cfg.GenesisState[types.ModuleName], &state)) - for i := 0; i < n; i++ { - state.<%= TypeName.UpperCamel %>List = append(state.<%= TypeName.UpperCamel %>List, &types.<%= TypeName.UpperCamel %>{Creator: "ANY", Index: strconv.Itoa(i)}) - } + state.<%= TypeName.UpperCamel %> = &types.<%= TypeName.UpperCamel %>{Creator: "ANY"} buf, err := cfg.Codec.MarshalJSON(&state) require.NoError(t, err) cfg.GenesisState[types.ModuleName] = buf - return network.New(t, cfg), state.<%= TypeName.UpperCamel %>List + return network.New(t, cfg), state.<%= TypeName.UpperCamel %> } func TestShow<%= TypeName.UpperCamel %>(t *testing.T) { - net, objs := networkWith<%= TypeName.UpperCamel %>Objects(t, 2) + net, obj := networkWith<%= TypeName.UpperCamel %>Objects(t) ctx := net.Validators[0].ClientCtx common := []string{ @@ -48,16 +46,9 @@ func TestShow<%= TypeName.UpperCamel %>(t *testing.T) { obj *types.<%= TypeName.UpperCamel %> }{ { - desc: "found", - id: objs[0].Index, - args: common, - obj: objs[0], - }, - { - desc: "not found", - id: "not_found", + desc: "get", args: common, - err: status.Error(codes.InvalidArgument, "not found"), + obj: obj, }, } { tc := tc From b6eae1aa49f9b9e7bf0327e32b072bab15171a0d Mon Sep 17 00:00:00 2001 From: ltacker Date: Thu, 17 Jun 2021 18:05:53 +0200 Subject: [PATCH 05/15] Update tests --- .../cli/query_{{typeName}}_test.go.plush | 3 +- .../grpc_query_{{typeName}}_test.go.plush | 16 ++-------- .../keeper/{{typeName}}_test.go.plush | 32 ++++++++----------- .../client/cli/tx_{{typeName}}_test.go.plush | 29 +++-------------- .../msg_server_{{typeName}}_test.go.plush | 26 ++++----------- 5 files changed, 28 insertions(+), 78 deletions(-) diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush index 87d712dea8..603869e770 100644 --- a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush @@ -40,7 +40,6 @@ func TestShow<%= TypeName.UpperCamel %>(t *testing.T) { } for _, tc := range []struct { desc string - id string args []string err error obj *types.<%= TypeName.UpperCamel %> @@ -53,7 +52,7 @@ func TestShow<%= TypeName.UpperCamel %>(t *testing.T) { } { tc := tc t.Run(tc.desc, func(t *testing.T) { - args := []string{tc.id} + var args []string args = append(args, tc.args...) out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdShow<%= TypeName.UpperCamel %>(), args) if tc.err != nil { diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush index 5ac7b31855..f359df3b7d 100644 --- a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush @@ -16,7 +16,7 @@ import ( func Test<%= TypeName.UpperCamel %>Query(t *testing.T) { keeper, ctx := setupKeeper(t) wctx := sdk.WrapSDKContext(ctx) - msgs := createN<%= TypeName.UpperCamel %>(keeper, ctx, 2) + item := createTest<%= TypeName.UpperCamel %>(keeper, ctx) for _, tc := range []struct { desc string request *types.QueryGet<%= TypeName.UpperCamel %>Request @@ -25,18 +25,8 @@ func Test<%= TypeName.UpperCamel %>Query(t *testing.T) { }{ { desc: "First", - request: &types.QueryGet<%= TypeName.UpperCamel %>Request{Index: msgs[0].Index}, - response: &types.QueryGet<%= TypeName.UpperCamel %>Response{<%= TypeName.UpperCamel %>: &msgs[0]}, - }, - { - desc: "Second", - request: &types.QueryGet<%= TypeName.UpperCamel %>Request{Index: msgs[1].Index}, - response: &types.QueryGet<%= TypeName.UpperCamel %>Response{<%= TypeName.UpperCamel %>: &msgs[1]}, - }, - { - desc: "KeyNotFound", - request: &types.QueryGet<%= TypeName.UpperCamel %>Request{Index: "missing"}, - err: status.Error(codes.InvalidArgument, "not found"), + request: &types.QueryGet<%= TypeName.UpperCamel %>Request{}, + response: &types.QueryGet<%= TypeName.UpperCamel %>Response{<%= TypeName.UpperCamel %>: &item}, }, { desc: "InvalidRequest", diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush index 60e4cd6275..0f39604ad5 100644 --- a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush @@ -10,31 +10,25 @@ import ( "<%= ModulePath %>/x/<%= ModuleName %>/types" ) -func createN<%= TypeName.UpperCamel %>(keeper *Keeper, ctx sdk.Context, n int) []types.<%= TypeName.UpperCamel %> { - items := make([]types.<%= TypeName.UpperCamel %>, n) - for i := range items { - items[i].Creator = "any" - items[i].Index = fmt.Sprintf("%d", i) - keeper.Set<%= TypeName.UpperCamel %>(ctx, items[i]) +func createTest<%= TypeName.UpperCamel %>(keeper *Keeper, ctx sdk.Context) types.<%= TypeName.UpperCamel %> { + item := types.<%= TypeName.UpperCamel %>{ + Creator: "any" } - return items + keeper.Set<%= TypeName.UpperCamel %>(ctx, item) + return item } func Test<%= TypeName.UpperCamel %>Get(t *testing.T) { keeper, ctx := setupKeeper(t) - items := createN<%= TypeName.UpperCamel %>(keeper, ctx, 10) - for _, item := range items { - rst, found := keeper.Get<%= TypeName.UpperCamel %>(ctx, item.Index) - assert.True(t, found) - assert.Equal(t, item, rst) - } + item := createTest<%= TypeName.UpperCamel %>(keeper, ctx) + rst, found := keeper.Get<%= TypeName.UpperCamel %>(ctx) + assert.True(t, found) + assert.Equal(t, item, rst) } func Test<%= TypeName.UpperCamel %>Remove(t *testing.T) { keeper, ctx := setupKeeper(t) - items := createN<%= TypeName.UpperCamel %>(keeper, ctx, 10) - for _, item := range items { - keeper.Remove<%= TypeName.UpperCamel %>(ctx, item.Index) - _, found := keeper.Get<%= TypeName.UpperCamel %>(ctx, item.Index) - assert.False(t, found) - } + createTest<%= TypeName.UpperCamel %>(keeper, ctx) + keeper.Remove<%= TypeName.UpperCamel %>(ctx) + _, found := keeper.Get<%= TypeName.UpperCamel %>(ctx) + assert.False(t, found) } diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush index 991583add2..dc324fd315 100644 --- a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush @@ -18,18 +18,15 @@ func TestCreate<%= TypeName.UpperCamel %>(t *testing.T) { net := network.New(t) val := net.Validators[0] ctx := val.ClientCtx - id := "0" fields := []string{<%= for (field) in Fields { %> "<%= genValidArg(field.DatatypeName) %>", <% } %>} for _, tc := range []struct { desc string - id string args []string err error code uint32 }{ { - id: id, desc: "valid", args: []string{ fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), @@ -41,7 +38,7 @@ func TestCreate<%= TypeName.UpperCamel %>(t *testing.T) { } { tc := tc t.Run(tc.desc, func(t *testing.T) { - args := []string{tc.id} + var args []string args = append(args, fields...) args = append(args, tc.args...) out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdCreate<%= TypeName.UpperCamel %>(), args) @@ -61,7 +58,6 @@ func TestUpdate<%= TypeName.UpperCamel %>(t *testing.T) { net := network.New(t) val := net.Validators[0] ctx := val.ClientCtx - id := "0" fields := []string{<%= for (field) in Fields { %> "<%= genValidArg(field.DatatypeName) %>", <% } %>} common := []string{ @@ -70,7 +66,7 @@ func TestUpdate<%= TypeName.UpperCamel %>(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdk.NewInt(10))).String()), } - args := []string{id} + var args []string args = append(args, fields...) args = append(args, common...) _, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdCreate<%= TypeName.UpperCamel %>(), args) @@ -78,26 +74,18 @@ func TestUpdate<%= TypeName.UpperCamel %>(t *testing.T) { for _, tc := range []struct { desc string - id string args []string code uint32 err error }{ { desc: "valid", - id: id, args: common, }, - { - desc: "key not found", - id: "1", - args: common, - code: sdkerrors.ErrKeyNotFound.ABCICode(), - }, } { tc := tc t.Run(tc.desc, func(t *testing.T) { - args := []string{tc.id} + var args []string args = append(args, fields...) args = append(args, tc.args...) out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdUpdate<%= TypeName.UpperCamel %>(), args) @@ -118,7 +106,6 @@ func TestDelete<%= TypeName.UpperCamel %>(t *testing.T) { val := net.Validators[0] ctx := val.ClientCtx - id := "0" fields := []string{<%= for (field) in Fields { %> "<%= genValidArg(field.DatatypeName) %>", <% } %>} common := []string{ @@ -127,7 +114,7 @@ func TestDelete<%= TypeName.UpperCamel %>(t *testing.T) { fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(net.Config.BondDenom, sdk.NewInt(10))).String()), } - args := []string{id} + var args []string args = append(args, fields...) args = append(args, common...) _, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdCreate<%= TypeName.UpperCamel %>(), args) @@ -135,21 +122,13 @@ func TestDelete<%= TypeName.UpperCamel %>(t *testing.T) { for _, tc := range []struct { desc string - id string args []string code uint32 err error }{ { desc: "valid", - id: id, - args: common, - }, - { - desc: "key not found", - id: "1", args: common, - code: sdkerrors.ErrKeyNotFound.ABCICode(), }, } { tc := tc diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush index d2e3399640..d774a4ba78 100644 --- a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush @@ -30,7 +30,6 @@ func Test<%= TypeName.UpperCamel %>MsgServerCreate(t *testing.T) { func Test<%= TypeName.UpperCamel %>MsgServerUpdate(t *testing.T) { creator := "A" - index := "any" for _, tc := range []struct { desc string @@ -39,25 +38,20 @@ func Test<%= TypeName.UpperCamel %>MsgServerUpdate(t *testing.T) { }{ { desc: "Completed", - request: &types.MsgUpdate<%= TypeName.UpperCamel %>{Creator: creator, Index: index}, + request: &types.MsgUpdate<%= TypeName.UpperCamel %>{Creator: creator}, }, { desc: "Unauthorized", - request: &types.MsgUpdate<%= TypeName.UpperCamel %>{Creator: "B", Index: index}, + request: &types.MsgUpdate<%= TypeName.UpperCamel %>{Creator: "B"}, err: sdkerrors.ErrUnauthorized, }, - { - desc: "KeyNotFound", - request: &types.MsgUpdate<%= TypeName.UpperCamel %>{Creator: creator, Index: "missing"}, - err: sdkerrors.ErrKeyNotFound, - }, } { tc := tc t.Run(tc.desc, func(t *testing.T) { keeper, ctx := setupKeeper(t) srv := NewMsgServerImpl(*keeper) wctx := sdk.WrapSDKContext(ctx) - expected := &types.MsgCreate<%= TypeName.UpperCamel %>{Creator: creator, Index: index} + expected := &types.MsgCreate<%= TypeName.UpperCamel %>{Creator: creator} _, err := srv.Create<%= TypeName.UpperCamel %>(wctx, expected) require.NoError(t, err) @@ -66,7 +60,7 @@ func Test<%= TypeName.UpperCamel %>MsgServerUpdate(t *testing.T) { require.ErrorIs(t, err, tc.err) } else { require.NoError(t, err) - rst, found := keeper.Get<%= TypeName.UpperCamel %>(ctx, expected.Index) + rst, found := keeper.Get<%= TypeName.UpperCamel %>(ctx) require.True(t, found) assert.Equal(t, expected.Creator, rst.Creator) } @@ -76,7 +70,6 @@ func Test<%= TypeName.UpperCamel %>MsgServerUpdate(t *testing.T) { func Test<%= TypeName.UpperCamel %>MsgServerDelete(t *testing.T) { creator := "A" - index := "any" for _, tc := range []struct { desc string @@ -85,18 +78,13 @@ func Test<%= TypeName.UpperCamel %>MsgServerDelete(t *testing.T) { }{ { desc: "Completed", - request: &types.MsgDelete<%= TypeName.UpperCamel %>{Creator: creator, Index: index}, + request: &types.MsgDelete<%= TypeName.UpperCamel %>{Creator: creator}, }, { desc: "Unauthorized", - request: &types.MsgDelete<%= TypeName.UpperCamel %>{Creator: "B", Index: index}, + request: &types.MsgDelete<%= TypeName.UpperCamel %>{Creator: "B"}, err: sdkerrors.ErrUnauthorized, }, - { - desc: "KeyNotFound", - request: &types.MsgDelete<%= TypeName.UpperCamel %>{Creator: creator, Index: "missing"}, - err: sdkerrors.ErrKeyNotFound, - }, } { tc := tc t.Run(tc.desc, func(t *testing.T) { @@ -104,7 +92,7 @@ func Test<%= TypeName.UpperCamel %>MsgServerDelete(t *testing.T) { srv := NewMsgServerImpl(*keeper) wctx := sdk.WrapSDKContext(ctx) - _, err := srv.Create<%= TypeName.UpperCamel %>(wctx, &types.MsgCreate<%= TypeName.UpperCamel %>{Creator: creator, Index: index}) + _, err := srv.Create<%= TypeName.UpperCamel %>(wctx, &types.MsgCreate<%= TypeName.UpperCamel %>{Creator: creator}) require.NoError(t, err) _, err = srv.Delete<%= TypeName.UpperCamel %>(wctx, tc.request) if tc.err != nil { From 47656d7a482077f9c3e908aa55d5c54891aed540 Mon Sep 17 00:00:00 2001 From: ltacker Date: Fri, 18 Jun 2021 17:09:52 +0200 Subject: [PATCH 06/15] Add singletin in scaffolder --- starport/services/scaffolder/type.go | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/starport/services/scaffolder/type.go b/starport/services/scaffolder/type.go index 13fb340761..b5487deb34 100644 --- a/starport/services/scaffolder/type.go +++ b/starport/services/scaffolder/type.go @@ -1,6 +1,7 @@ package scaffolder import ( + "errors" "fmt" "os" @@ -13,10 +14,19 @@ import ( modulecreate "github.com/tendermint/starport/starport/templates/module/create" "github.com/tendermint/starport/starport/templates/typed" "github.com/tendermint/starport/starport/templates/typed/indexed" + "github.com/tendermint/starport/starport/templates/typed/singleton" +) + +type TypeModel int + +const ( + List TypeModel = iota + Map + Singleton ) type AddTypeOption struct { - Indexed bool + Model TypeModel NoMessage bool } @@ -84,13 +94,19 @@ func (s *Scaffolder) AddType( gens = append(gens, g) } - // Check if indexed type - if addTypeOptions.Indexed { - g, err = indexed.NewStargate(tracer, opts) - } else { - // Scaffolding a type with ID + // create the type generator depending on the model + // TODO: rename the template packages to make it consistent with the type new naming + switch addTypeOptions.Model { + case List: g, err = typed.NewStargate(tracer, opts) + case Map: + g, err = indexed.NewStargate(tracer, opts) + case Singleton: + g, err = singleton.NewStargate(tracer, opts) + default: + return sm, errors.New("unrecognized type model") } + if err != nil { return sm, err } From 8b752e241df00889e310eaf121577af1ae799cbb Mon Sep 17 00:00:00 2001 From: ltacker Date: Mon, 21 Jun 2021 08:38:36 +0200 Subject: [PATCH 07/15] Fix template errors --- starport/cmd/type.go | 14 +++++++++++++- starport/templates/typed/singleton/stargate.go | 7 +------ .../client/cli/query_{{typeName}}_test.go.plush | 4 ---- .../keeper/grpc_query_{{typeName}}.go.plush | 2 -- .../keeper/grpc_query_{{typeName}}_test.go.plush | 2 -- .../x/{{moduleName}}/keeper/{{typeName}}.go.plush | 4 ++-- .../keeper/{{typeName}}_test.go.plush | 3 +-- .../client/cli/tx_{{typeName}}_test.go.plush | 3 +-- .../keeper/msg_server_{{typeName}}.go.plush | 5 ++--- .../keeper/msg_server_{{typeName}}_test.go.plush | 6 +++--- 10 files changed, 23 insertions(+), 27 deletions(-) diff --git a/starport/cmd/type.go b/starport/cmd/type.go index 2459400c69..ca122932e4 100644 --- a/starport/cmd/type.go +++ b/starport/cmd/type.go @@ -12,6 +12,7 @@ import ( const ( flagModule = "module" flagIndexed = "indexed" + flagSingleton = "single" flagNoMessage = "no-message" ) @@ -27,6 +28,7 @@ func NewType() *cobra.Command { c.Flags().StringVarP(&appPath, "path", "p", "", "path of the app") c.Flags().String(flagModule, "", "Module to add the type into. Default: app's main module") c.Flags().Bool(flagIndexed, false, "Scaffold an indexed type") + c.Flags().Bool(flagSingleton, false, "Scaffold a singleton type") c.Flags().Bool(flagNoMessage, false, "Disable CRUD interaction messages scaffolding") return c @@ -41,8 +43,18 @@ func typeHandler(cmd *cobra.Command, args []string) error { // Add type options var opts scaffolder.AddTypeOption - opts.Indexed, _ = cmd.Flags().GetBool(flagIndexed) opts.NoMessage, _ = cmd.Flags().GetBool(flagNoMessage) + opts.Model = scaffolder.List + + // Get type model to scaffold + indexed, _ := cmd.Flags().GetBool(flagIndexed) + singleton, _ := cmd.Flags().GetBool(flagSingleton) + if indexed { + opts.Model = scaffolder.Map + } + if singleton { + opts.Model = scaffolder.Singleton + } sc, err := scaffolder.New(appPath) if err != nil { diff --git a/starport/templates/typed/singleton/stargate.go b/starport/templates/typed/singleton/stargate.go index 6cdfc5e410..662f79955a 100644 --- a/starport/templates/typed/singleton/stargate.go +++ b/starport/templates/typed/singleton/stargate.go @@ -105,9 +105,7 @@ import "%s/%s.proto";` // Add the service messages templateMessage := `%[1]v -message QueryGet%[2]vRequest { - string index = 1; -} +message QueryGet%[2]vRequest {} message QueryGet%[2]vResponse { %[2]v %[2]v = 1; @@ -209,9 +207,6 @@ func genesisTypesModify(replacer placeholder.Replacer, opts *typed.Options) genn content := typed.PatchGenesisTypeImport(replacer, f.String()) - templateTypesImport := `"fmt"` - content = replacer.ReplaceOnce(content, typed.PlaceholderGenesisTypesImport, templateTypesImport) - templateTypesDefault := `%[1]v %[2]v: nil,` replacementTypesDefault := fmt.Sprintf( diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush index 603869e770..01e557f088 100644 --- a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/client/cli/query_{{typeName}}_test.go.plush @@ -2,15 +2,11 @@ package cli_test import ( "fmt" - "strconv" "testing" - "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" tmcli "github.com/tendermint/tendermint/libs/cli" - "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "<%= ModulePath %>/testutil/network" diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}.go.plush index 50531acb20..f179597b25 100644 --- a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}.go.plush +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}.go.plush @@ -3,9 +3,7 @@ package keeper import ( "context" - "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/query" "<%= ModulePath %>/x/<%= ModuleName %>/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush index f359df3b7d..8662e58c75 100644 --- a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/grpc_query_{{typeName}}_test.go.plush @@ -4,8 +4,6 @@ import ( "testing" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/query" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush index bd56c60eab..567b96f610 100644 --- a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush @@ -14,7 +14,7 @@ func (k Keeper) Set<%= TypeName.UpperCamel %>(ctx sdk.Context, <%= TypeName.Lowe } // Get<%= TypeName.UpperCamel %> returns <%= TypeName.LowerCamel %> -func (k Keeper) Get<%= TypeName.UpperCamel %>(ctx sdk.Context, index string) (val types.<%= TypeName.UpperCamel %>, found bool) { +func (k Keeper) Get<%= TypeName.UpperCamel %>(ctx sdk.Context) (val types.<%= TypeName.UpperCamel %>, found bool) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.<%= TypeName.UpperCamel %>Key)) b := store.Get([]byte{}) @@ -27,7 +27,7 @@ func (k Keeper) Get<%= TypeName.UpperCamel %>(ctx sdk.Context, index string) (va } // Remove<%= TypeName.UpperCamel %> removes <%= TypeName.LowerCamel %> from the store -func (k Keeper) Remove<%= TypeName.UpperCamel %>(ctx sdk.Context, index string) { +func (k Keeper) Remove<%= TypeName.UpperCamel %>(ctx sdk.Context) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.<%= TypeName.UpperCamel %>Key)) store.Delete([]byte{}) } diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush index 0f39604ad5..49989294a5 100644 --- a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}_test.go.plush @@ -1,7 +1,6 @@ package keeper import ( - "fmt" "testing" sdk "github.com/cosmos/cosmos-sdk/types" @@ -12,7 +11,7 @@ import ( func createTest<%= TypeName.UpperCamel %>(keeper *Keeper, ctx sdk.Context) types.<%= TypeName.UpperCamel %> { item := types.<%= TypeName.UpperCamel %>{ - Creator: "any" + Creator: "any", } keeper.Set<%= TypeName.UpperCamel %>(ctx, item) return item diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush index dc324fd315..a94d8c6f88 100644 --- a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/client/cli/tx_{{typeName}}_test.go.plush @@ -7,7 +7,6 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/stretchr/testify/require" "<%= ModulePath %>/testutil/network" @@ -133,7 +132,7 @@ func TestDelete<%= TypeName.UpperCamel %>(t *testing.T) { } { tc := tc t.Run(tc.desc, func(t *testing.T) { - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdDelete<%= TypeName.UpperCamel %>(), append([]string{tc.id}, tc.args...)) + out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdDelete<%= TypeName.UpperCamel %>(), append([]string{}, tc.args...)) if tc.err != nil { require.ErrorIs(t, err, tc.err) } else { diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush index 15f3a4b8d9..dcaa6c2863 100644 --- a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}.go.plush @@ -1,7 +1,6 @@ package keeper import ( - "fmt" "context" "<%= ModulePath %>/x/<%= ModuleName %>/types" @@ -35,7 +34,7 @@ func (k msgServer) Update<%= TypeName.UpperCamel %>(goCtx context.Context, msg ctx := sdk.UnwrapSDKContext(goCtx) // Check if the value exists - valFound, isFound := k.Get<%= TypeName.UpperCamel %>(ctx, msg.Index) + valFound, isFound := k.Get<%= TypeName.UpperCamel %>(ctx) if !isFound { return nil, sdkerrors.Wrap(sdkerrors.ErrKeyNotFound, "not set") } @@ -59,7 +58,7 @@ func (k msgServer) Delete<%= TypeName.UpperCamel %>(goCtx context.Context, msg ctx := sdk.UnwrapSDKContext(goCtx) // Check if the value exists - valFound, isFound := k.Get<%= TypeName.UpperCamel %>(ctx, msg.Index) + valFound, isFound := k.Get<%= TypeName.UpperCamel %>(ctx) if !isFound { return nil, sdkerrors.Wrap(sdkerrors.ErrKeyNotFound, "not set") } diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush index d774a4ba78..6e4b839697 100644 --- a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush @@ -19,10 +19,10 @@ func Test<%= TypeName.UpperCamel %>MsgServerCreate(t *testing.T) { creator := "A" for i := 0; i < 5; i++ { idx := fmt.Sprintf("%d", i) - expected := &types.MsgCreate<%= TypeName.UpperCamel %>{Creator: creator, Index: idx} + expected := &types.MsgCreate<%= TypeName.UpperCamel %>{Creator: creator} _, err := srv.Create<%= TypeName.UpperCamel %>(wctx, expected) require.NoError(t, err) - rst, found := keeper.Get<%= TypeName.UpperCamel %>(ctx, expected.Index) + rst, found := keeper.Get<%= TypeName.UpperCamel %>(ctx) require.True(t, found) assert.Equal(t, expected.Creator, rst.Creator) } @@ -99,7 +99,7 @@ func Test<%= TypeName.UpperCamel %>MsgServerDelete(t *testing.T) { require.ErrorIs(t, err, tc.err) } else { require.NoError(t, err) - _, found := keeper.Get<%= TypeName.UpperCamel %>(ctx, tc.request.Index) + _, found := keeper.Get<%= TypeName.UpperCamel %>(ctx) require.False(t, found) } }) From bf4c659650b00114501fa5720f7335b2612c3e34 Mon Sep 17 00:00:00 2001 From: ltacker Date: Mon, 21 Jun 2021 09:29:52 +0200 Subject: [PATCH 08/15] Fix nil key --- .../x/{{moduleName}}/keeper/{{typeName}}.go.plush | 6 +++--- .../keeper/msg_server_{{typeName}}_test.go.plush | 15 ++++++--------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush index 567b96f610..d7482a7cb5 100644 --- a/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush +++ b/starport/templates/typed/singleton/stargate/component/x/{{moduleName}}/keeper/{{typeName}}.go.plush @@ -10,14 +10,14 @@ import ( func (k Keeper) Set<%= TypeName.UpperCamel %>(ctx sdk.Context, <%= TypeName.LowerCamel %> types.<%= TypeName.UpperCamel %>) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.<%= TypeName.UpperCamel %>Key)) b := k.cdc.MustMarshalBinaryBare(&<%= TypeName.LowerCamel %>) - store.Set([]byte{}, b) + store.Set([]byte{0}, b) } // Get<%= TypeName.UpperCamel %> returns <%= TypeName.LowerCamel %> func (k Keeper) Get<%= TypeName.UpperCamel %>(ctx sdk.Context) (val types.<%= TypeName.UpperCamel %>, found bool) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.<%= TypeName.UpperCamel %>Key)) - b := store.Get([]byte{}) + b := store.Get([]byte{0}) if b == nil { return val, false } @@ -29,5 +29,5 @@ func (k Keeper) Get<%= TypeName.UpperCamel %>(ctx sdk.Context) (val types.<%= Ty // Remove<%= TypeName.UpperCamel %> removes <%= TypeName.LowerCamel %> from the store func (k Keeper) Remove<%= TypeName.UpperCamel %>(ctx sdk.Context) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.<%= TypeName.UpperCamel %>Key)) - store.Delete([]byte{}) + store.Delete([]byte{0}) } diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush index 6e4b839697..33299f5f68 100644 --- a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush @@ -17,15 +17,12 @@ func Test<%= TypeName.UpperCamel %>MsgServerCreate(t *testing.T) { srv := NewMsgServerImpl(*keeper) wctx := sdk.WrapSDKContext(ctx) creator := "A" - for i := 0; i < 5; i++ { - idx := fmt.Sprintf("%d", i) - expected := &types.MsgCreate<%= TypeName.UpperCamel %>{Creator: creator} - _, err := srv.Create<%= TypeName.UpperCamel %>(wctx, expected) - require.NoError(t, err) - rst, found := keeper.Get<%= TypeName.UpperCamel %>(ctx) - require.True(t, found) - assert.Equal(t, expected.Creator, rst.Creator) - } + expected := &types.MsgCreate<%= TypeName.UpperCamel %>{Creator: creator} + _, err := srv.Create<%= TypeName.UpperCamel %>(wctx, expected) + require.NoError(t, err) + rst, found := keeper.Get<%= TypeName.UpperCamel %>(ctx) + require.True(t, found) + assert.Equal(t, expected.Creator, rst.Creator) } func Test<%= TypeName.UpperCamel %>MsgServerUpdate(t *testing.T) { From 21887755838109fbc5fec35dd96099227aa641b8 Mon Sep 17 00:00:00 2001 From: ltacker Date: Mon, 21 Jun 2021 10:12:21 +0200 Subject: [PATCH 09/15] integration test --- integration/cmd_type_test.go | 54 ++++++++++++++++++- .../msg_server_{{typeName}}_test.go.plush | 1 - 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/integration/cmd_type_test.go b/integration/cmd_type_test.go index 2b598ffcd1..b2edc74eb7 100644 --- a/integration/cmd_type_test.go +++ b/integration/cmd_type_test.go @@ -131,7 +131,7 @@ func TestCreateTypeInCustomModuleWithStargate(t *testing.T) { env.EnsureAppIsSteady(path) } -func TestCreateIndexTypeWithStargate(t *testing.T) { +func TestCreateIndexedTypeWithStargate(t *testing.T) { var ( env = newEnv(t) path = env.Scaffold("blog") @@ -182,3 +182,55 @@ func TestCreateIndexTypeWithStargate(t *testing.T) { env.EnsureAppIsSteady(path) } + +func TestCreateSingletonTypeWithStargate(t *testing.T) { + var ( + env = newEnv(t) + path = env.Scaffold("blog") + ) + + env.Must(env.Exec("create an singleton type", + step.NewSteps(step.New( + step.Exec("starport", "type", "user", "email", "--single"), + step.Workdir(path), + )), + )) + + env.Must(env.Exec("create an singleton type with no message", + step.NewSteps(step.New( + step.Exec("starport", "type", "nomessage", "email", "--single", "--no-message"), + step.Workdir(path), + )), + )) + + env.Must(env.Exec("create a module", + step.NewSteps(step.New( + step.Exec("starport", "module", "create", "example", "--require-registration"), + step.Workdir(path), + )), + )) + + env.Must(env.Exec("create a type", + step.NewSteps(step.New( + step.Exec("starport", "type", "user", "email", "--module", "example"), + step.Workdir(path), + )), + )) + + env.Must(env.Exec("should prevent creating an singleton type with a typename that already exist", + step.NewSteps(step.New( + step.Exec("starport", "type", "user", "email", "--single", "--module", "example"), + step.Workdir(path), + )), + ExecShouldError(), + )) + + env.Must(env.Exec("create an singleton type in a custom module", + step.NewSteps(step.New( + step.Exec("starport", "type", "singleuser", "email", "--single", "--module", "example"), + step.Workdir(path), + )), + )) + + env.EnsureAppIsSteady(path) +} diff --git a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush index 33299f5f68..63f4bdd443 100644 --- a/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush +++ b/starport/templates/typed/singleton/stargate/messages/x/{{moduleName}}/keeper/msg_server_{{typeName}}_test.go.plush @@ -1,7 +1,6 @@ package keeper import ( - "fmt" "testing" sdk "github.com/cosmos/cosmos-sdk/types" From ac3601ee23b41e03aa06a430931126bc206cf6d0 Mon Sep 17 00:00:00 2001 From: ltacker Date: Mon, 21 Jun 2021 11:00:06 +0200 Subject: [PATCH 10/15] changelog --- changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.md b/changelog.md index 20977a98df..e0934c1d83 100644 --- a/changelog.md +++ b/changelog.md @@ -8,6 +8,7 @@ - Added the flag `--no-default-module` to the command `starport app` to prevent scaffolding a default module when creating a new app - Added support for multiple naming conventions for component names and field names - Print created and modified files when scaffolding a new component +- Scaffold a type that contains a single instance in the store ### Fixes: From a7077ce4a8fa18f45c294151621be0a4d4e476f8 Mon Sep 17 00:00:00 2001 From: ltacker Date: Fri, 2 Jul 2021 10:06:12 +0200 Subject: [PATCH 11/15] Integrate command --- starport/cmd/message.go | 5 -- starport/cmd/scaffold.go | 12 ++++- starport/cmd/scaffold_list.go | 3 +- starport/cmd/scaffold_map.go | 9 +--- starport/cmd/scaffold_single.go | 30 ++++++++++++ starport/cmd/type.go | 73 ---------------------------- starport/services/scaffolder/type.go | 11 +++-- 7 files changed, 50 insertions(+), 93 deletions(-) create mode 100644 starport/cmd/scaffold_single.go delete mode 100644 starport/cmd/type.go diff --git a/starport/cmd/message.go b/starport/cmd/message.go index d134ddad87..a261e191a8 100644 --- a/starport/cmd/message.go +++ b/starport/cmd/message.go @@ -9,11 +9,6 @@ import ( "github.com/tendermint/starport/starport/services/scaffolder" ) -const ( - flagResponse string = "response" - flagDescription string = "desc" -) - // NewType command creates a new type command to scaffold messages func NewMessage() *cobra.Command { c := &cobra.Command{ diff --git a/starport/cmd/scaffold.go b/starport/cmd/scaffold.go index e034c9d522..17a20a9d0d 100644 --- a/starport/cmd/scaffold.go +++ b/starport/cmd/scaffold.go @@ -10,6 +10,14 @@ import ( "github.com/tendermint/starport/starport/services/scaffolder" ) +// flags related to component scaffolding +const ( + flagModule = "module" + flagNoMessage = "no-message" + flagResponse = "response" + flagDescription = "desc" +) + // NewScaffold returns a command that groups scaffolding related sub commands. func NewScaffold() *cobra.Command { c := &cobra.Command{ @@ -27,7 +35,7 @@ func NewScaffold() *cobra.Command { return c } -func scaffoldType(kind, module, typeName string, typeFields []string, opts scaffolder.AddTypeOption) error { +func scaffoldType(module, typeName string, typeFields []string, opts scaffolder.AddTypeOption) error { s := clispinner.New().SetText("Scaffolding...") defer s.Stop() @@ -43,7 +51,7 @@ func scaffoldType(kind, module, typeName string, typeFields []string, opts scaff s.Stop() fmt.Println(sourceModificationToString(sm)) - fmt.Printf("\nšŸŽ‰ Created a %s `%s`.\n\n", kind, typeName) + fmt.Printf("\nšŸŽ‰ Created a %s `%s`.\n\n", opts.Model, typeName) return nil } diff --git a/starport/cmd/scaffold_list.go b/starport/cmd/scaffold_list.go index 278e4ed10d..bf86e3bb1d 100644 --- a/starport/cmd/scaffold_list.go +++ b/starport/cmd/scaffold_list.go @@ -23,7 +23,8 @@ func NewScaffoldList() *cobra.Command { func scaffoldListHandler(cmd *cobra.Command, args []string) error { opts := scaffolder.AddTypeOption{ NoMessage: flagGetNoMessage(cmd), + Model: scaffolder.List, } - return scaffoldType("list", flagGetModule(cmd), args[0], args[1:], opts) + return scaffoldType(flagGetModule(cmd), args[0], args[1:], opts) } diff --git a/starport/cmd/scaffold_map.go b/starport/cmd/scaffold_map.go index 56cf5ef14e..65199119f0 100644 --- a/starport/cmd/scaffold_map.go +++ b/starport/cmd/scaffold_map.go @@ -5,11 +5,6 @@ import ( "github.com/tendermint/starport/starport/services/scaffolder" ) -const ( - flagModule = "module" - flagNoMessage = "no-message" -) - // NewScaffoldMap returns a new command to scaffold a map. func NewScaffoldMap() *cobra.Command { c := &cobra.Command{ @@ -27,9 +22,9 @@ func NewScaffoldMap() *cobra.Command { func scaffoldMapHandler(cmd *cobra.Command, args []string) error { opts := scaffolder.AddTypeOption{ - Indexed: true, NoMessage: flagGetNoMessage(cmd), + Model: scaffolder.Map, } - return scaffoldType("map", flagGetModule(cmd), args[0], args[1:], opts) + return scaffoldType(flagGetModule(cmd), args[0], args[1:], opts) } diff --git a/starport/cmd/scaffold_single.go b/starport/cmd/scaffold_single.go new file mode 100644 index 0000000000..d212322bcc --- /dev/null +++ b/starport/cmd/scaffold_single.go @@ -0,0 +1,30 @@ +package starportcmd + +import ( + "github.com/spf13/cobra" + "github.com/tendermint/starport/starport/services/scaffolder" +) + +// NewScaffoldSingle returns a new command to scaffold a singleton. +func NewScaffoldSingle() *cobra.Command { + c := &cobra.Command{ + Use: "single NAME [field]...", + Short: "Scaffold a singleton", + Args: cobra.MinimumNArgs(1), + RunE: scaffoldSingleHandler, + } + + c.Flags().StringVarP(&appPath, "path", "p", "", "path of the app") + c.Flags().AddFlagSet(flagSetScaffoldType()) + + return c +} + +func scaffoldSingleHandler(cmd *cobra.Command, args []string) error { + opts := scaffolder.AddTypeOption{ + NoMessage: flagGetNoMessage(cmd), + Model: scaffolder.Singleton, + } + + return scaffoldType(flagGetModule(cmd), args[0], args[1:], opts) +} diff --git a/starport/cmd/type.go b/starport/cmd/type.go deleted file mode 100644 index ca122932e4..0000000000 --- a/starport/cmd/type.go +++ /dev/null @@ -1,73 +0,0 @@ -package starportcmd - -import ( - "fmt" - - "github.com/spf13/cobra" - "github.com/tendermint/starport/starport/pkg/clispinner" - "github.com/tendermint/starport/starport/pkg/placeholder" - "github.com/tendermint/starport/starport/services/scaffolder" -) - -const ( - flagModule = "module" - flagIndexed = "indexed" - flagSingleton = "single" - flagNoMessage = "no-message" -) - -// NewType command creates a new type command to scaffold types. -func NewType() *cobra.Command { - c := &cobra.Command{ - Use: "type [typeName] [field1] [field2] ...", - Short: "Scaffold a type with CRUD operations", - Long: "Scaffold a type with create, read, update and delete operations", - Args: cobra.MinimumNArgs(1), - RunE: typeHandler, - } - c.Flags().StringVarP(&appPath, "path", "p", "", "path of the app") - c.Flags().String(flagModule, "", "Module to add the type into. Default: app's main module") - c.Flags().Bool(flagIndexed, false, "Scaffold an indexed type") - c.Flags().Bool(flagSingleton, false, "Scaffold a singleton type") - c.Flags().Bool(flagNoMessage, false, "Disable CRUD interaction messages scaffolding") - - return c -} - -func typeHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New().SetText("Scaffolding...") - defer s.Stop() - - // Get the module to add the type into - module, _ := cmd.Flags().GetString(flagModule) - - // Add type options - var opts scaffolder.AddTypeOption - opts.NoMessage, _ = cmd.Flags().GetBool(flagNoMessage) - opts.Model = scaffolder.List - - // Get type model to scaffold - indexed, _ := cmd.Flags().GetBool(flagIndexed) - singleton, _ := cmd.Flags().GetBool(flagSingleton) - if indexed { - opts.Model = scaffolder.Map - } - if singleton { - opts.Model = scaffolder.Singleton - } - - sc, err := scaffolder.New(appPath) - if err != nil { - return err - } - sm, err := sc.AddType(placeholder.New(), opts, module, args[0], args[1:]...) - if err != nil { - return err - } - - s.Stop() - - fmt.Println(sourceModificationToString(sm)) - fmt.Printf("\nšŸŽ‰ Created a type `%[1]v`.\n\n", args[0]) - return nil -} diff --git a/starport/services/scaffolder/type.go b/starport/services/scaffolder/type.go index eda383272e..50183a5990 100644 --- a/starport/services/scaffolder/type.go +++ b/starport/services/scaffolder/type.go @@ -17,12 +17,12 @@ import ( "github.com/tendermint/starport/starport/templates/typed/singleton" ) -type TypeModel int +type TypeModel string const ( - List TypeModel = iota - Map - Singleton + List TypeModel = "list" + Map TypeModel = "map" + Singleton TypeModel = "singleton" ) type AddTypeOption struct { @@ -111,10 +111,11 @@ func (s *Scaffolder) AddType( default: return sm, errors.New("unrecognized type model") } - if err != nil { return sm, err } + + // run the generation gens = append(gens, g) sm, err = xgenny.RunWithValidation(tracer, gens...) if err != nil { From b40b2999006f0bea236e0f3fe28ad389052814e2 Mon Sep 17 00:00:00 2001 From: ltacker Date: Fri, 2 Jul 2021 10:06:40 +0200 Subject: [PATCH 12/15] Update single tests --- integration/cmd_type_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/integration/cmd_type_test.go b/integration/cmd_type_test.go index 4b838d3ea0..d0fad4d2c6 100644 --- a/integration/cmd_type_test.go +++ b/integration/cmd_type_test.go @@ -191,14 +191,14 @@ func TestCreateSingletonTypeWithStargate(t *testing.T) { env.Must(env.Exec("create an singleton type", step.NewSteps(step.New( - step.Exec("starport", "type", "user", "email", "--single"), + step.Exec("starport", "single", "user", "email"), step.Workdir(path), )), )) env.Must(env.Exec("create an singleton type with no message", step.NewSteps(step.New( - step.Exec("starport", "type", "nomessage", "email", "--single", "--no-message"), + step.Exec("starport", "single", "nomessage", "email", "--no-message"), step.Workdir(path), )), )) @@ -210,16 +210,16 @@ func TestCreateSingletonTypeWithStargate(t *testing.T) { )), )) - env.Must(env.Exec("create a type", + env.Must(env.Exec("create another type", step.NewSteps(step.New( - step.Exec("starport", "type", "user", "email", "--module", "example"), + step.Exec("starport", "list", "user", "email", "--module", "example"), step.Workdir(path), )), )) env.Must(env.Exec("should prevent creating an singleton type with a typename that already exist", step.NewSteps(step.New( - step.Exec("starport", "type", "user", "email", "--single", "--module", "example"), + step.Exec("starport", "single", "user", "email", "--module", "example"), step.Workdir(path), )), ExecShouldError(), @@ -227,7 +227,7 @@ func TestCreateSingletonTypeWithStargate(t *testing.T) { env.Must(env.Exec("create an singleton type in a custom module", step.NewSteps(step.New( - step.Exec("starport", "type", "singleuser", "email", "--single", "--module", "example"), + step.Exec("starport", "single", "singleuser", "email", "--module", "example"), step.Workdir(path), )), )) From 2c21c39dbaa8fd7f3c8054ad116d4593baafe84b Mon Sep 17 00:00:00 2001 From: ltacker Date: Fri, 2 Jul 2021 10:32:26 +0200 Subject: [PATCH 13/15] Fix --- integration/cmd_type_test.go | 10 +++++----- starport/cmd/scaffold.go | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/integration/cmd_type_test.go b/integration/cmd_type_test.go index d0fad4d2c6..79c590d8f9 100644 --- a/integration/cmd_type_test.go +++ b/integration/cmd_type_test.go @@ -191,14 +191,14 @@ func TestCreateSingletonTypeWithStargate(t *testing.T) { env.Must(env.Exec("create an singleton type", step.NewSteps(step.New( - step.Exec("starport", "single", "user", "email"), + step.Exec("starport", "s", "single", "user", "email"), step.Workdir(path), )), )) env.Must(env.Exec("create an singleton type with no message", step.NewSteps(step.New( - step.Exec("starport", "single", "nomessage", "email", "--no-message"), + step.Exec("starport", "s", "single", "no-message", "email", "--no-message"), step.Workdir(path), )), )) @@ -212,14 +212,14 @@ func TestCreateSingletonTypeWithStargate(t *testing.T) { env.Must(env.Exec("create another type", step.NewSteps(step.New( - step.Exec("starport", "list", "user", "email", "--module", "example"), + step.Exec("starport", "s", "list", "user", "email", "--module", "example"), step.Workdir(path), )), )) env.Must(env.Exec("should prevent creating an singleton type with a typename that already exist", step.NewSteps(step.New( - step.Exec("starport", "single", "user", "email", "--module", "example"), + step.Exec("starport", "s", "single", "user", "email", "--module", "example"), step.Workdir(path), )), ExecShouldError(), @@ -227,7 +227,7 @@ func TestCreateSingletonTypeWithStargate(t *testing.T) { env.Must(env.Exec("create an singleton type in a custom module", step.NewSteps(step.New( - step.Exec("starport", "single", "singleuser", "email", "--module", "example"), + step.Exec("starport", "s", "single", "singleuser", "email", "--module", "example"), step.Workdir(path), )), )) diff --git a/starport/cmd/scaffold.go b/starport/cmd/scaffold.go index 17a20a9d0d..52a9a54563 100644 --- a/starport/cmd/scaffold.go +++ b/starport/cmd/scaffold.go @@ -30,6 +30,7 @@ func NewScaffold() *cobra.Command { c.AddCommand(NewScaffoldChain()) c.AddCommand(NewScaffoldList()) c.AddCommand(NewScaffoldMap()) + c.AddCommand(NewScaffoldSingle()) c.AddCommand(NewScaffoldVue()) return c From 1312e88f3de87adf30b7c2485178f9165a042d29 Mon Sep 17 00:00:00 2001 From: ltacker Date: Mon, 5 Jul 2021 09:40:27 +0200 Subject: [PATCH 14/15] lint --- starport/cmd/scaffold_message.go | 1 - 1 file changed, 1 deletion(-) diff --git a/starport/cmd/scaffold_message.go b/starport/cmd/scaffold_message.go index 34308a7572..7f58f19e1d 100644 --- a/starport/cmd/scaffold_message.go +++ b/starport/cmd/scaffold_message.go @@ -9,7 +9,6 @@ import ( "github.com/tendermint/starport/starport/services/scaffolder" ) - // NewScaffoldMessage returns the command to scaffold messages func NewScaffoldMessage() *cobra.Command { c := &cobra.Command{ From 14e28f9530d2c91c3b2a7b55583b96a4bd67308f Mon Sep 17 00:00:00 2001 From: ltacker Date: Mon, 5 Jul 2021 10:59:18 +0200 Subject: [PATCH 15/15] Fix module scaffold --- integration/cmd_type_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration/cmd_type_test.go b/integration/cmd_type_test.go index 90d9c7fa32..7be5c6c191 100644 --- a/integration/cmd_type_test.go +++ b/integration/cmd_type_test.go @@ -205,7 +205,7 @@ func TestCreateSingletonTypeWithStargate(t *testing.T) { env.Must(env.Exec("create a module", step.NewSteps(step.New( - step.Exec("starport", "module", "create", "example", "--require-registration"), + step.Exec("starport", "s", "module", "example", "--require-registration"), step.Workdir(path), )), ))