From f443b1102f41e9af58f31aeee0e1fed9c9d67866 Mon Sep 17 00:00:00 2001 From: Petr Ivanov Date: Tue, 26 Apr 2022 11:23:15 +0400 Subject: [PATCH 01/10] cliui 1st iteration --- ignite/cmd/account.go | 7 +- ignite/cmd/account_import.go | 5 +- ignite/cmd/cmd.go | 14 +- ignite/cmd/generate_dart.go | 5 +- ignite/cmd/generate_go.go | 5 +- ignite/cmd/generate_openapi.go | 5 +- ignite/cmd/generate_vuex.go | 5 +- ignite/cmd/network.go | 31 +--- ignite/cmd/network_campaign_account.go | 8 +- ignite/cmd/network_campaign_list.go | 23 +-- ignite/cmd/network_campaign_publish.go | 7 +- ignite/cmd/network_campaign_show.go | 2 +- ignite/cmd/network_campaign_update.go | 2 +- ignite/cmd/network_chain_init.go | 45 +++-- ignite/cmd/network_chain_install.go | 13 +- ignite/cmd/network_chain_join.go | 18 +- ignite/cmd/network_chain_launch.go | 2 +- ignite/cmd/network_chain_list.go | 24 ++- ignite/cmd/network_chain_prepare.go | 9 +- ignite/cmd/network_chain_publish.go | 19 +- ignite/cmd/network_chain_revert_launch.go | 2 +- ignite/cmd/network_chain_show.go | 27 ++- ignite/cmd/network_request_approve.go | 13 +- ignite/cmd/network_request_list.go | 7 +- ignite/cmd/network_request_reject.go | 9 +- ignite/cmd/network_request_show.go | 2 +- ignite/cmd/network_request_verify.go | 11 +- ignite/cmd/network_reward_set.go | 2 +- ignite/cmd/relayer_configure.go | 11 +- ignite/cmd/relayer_connect.go | 5 +- ignite/cmd/scaffold.go | 7 +- ignite/cmd/scaffold_band.go | 5 +- ignite/cmd/scaffold_chain.go | 5 +- ignite/cmd/scaffold_flutter.go | 5 +- ignite/cmd/scaffold_message.go | 5 +- ignite/cmd/scaffold_module.go | 5 +- ignite/cmd/scaffold_mwasm.go | 5 +- ignite/cmd/scaffold_package.go | 5 +- ignite/cmd/scaffold_query.go | 5 +- ignite/cmd/scaffold_vue.go | 5 +- ignite/pkg/{ => cliui}/cliquiz/question.go | 0 .../pkg/{ => cliui}/clispinner/clispinner.go | 0 ignite/pkg/cliui/cliui.go | 162 ++++++++++++++++++ .../{ => cliui}/entrywriter/entrywriter.go | 0 .../entrywriter/entrywriter_test.go | 3 +- .../pkg/{clispinner => cliui/icons}/icon.go | 2 +- ignite/pkg/events/events.go | 63 ++++++- ignite/services/network/network.go | 4 +- .../network/networkchain/networkchain.go | 4 +- ignite/services/network/reward.go | 6 +- 50 files changed, 395 insertions(+), 239 deletions(-) rename ignite/pkg/{ => cliui}/cliquiz/question.go (100%) rename ignite/pkg/{ => cliui}/clispinner/clispinner.go (100%) create mode 100644 ignite/pkg/cliui/cliui.go rename ignite/pkg/{ => cliui}/entrywriter/entrywriter.go (100%) rename ignite/pkg/{ => cliui}/entrywriter/entrywriter_test.go (94%) rename ignite/pkg/{clispinner => cliui/icons}/icon.go (95%) diff --git a/ignite/cmd/account.go b/ignite/cmd/account.go index c88366d3e0..a5d90b1417 100644 --- a/ignite/cmd/account.go +++ b/ignite/cmd/account.go @@ -3,12 +3,11 @@ package ignitecmd import ( "os" + "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" + "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" + "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" "github.com/spf13/cobra" flag "github.com/spf13/pflag" - - "github.com/ignite-hq/cli/ignite/pkg/cliquiz" - "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" - "github.com/ignite-hq/cli/ignite/pkg/entrywriter" ) const ( diff --git a/ignite/cmd/account_import.go b/ignite/cmd/account_import.go index 7012cd4c98..f3ce9db5d5 100644 --- a/ignite/cmd/account_import.go +++ b/ignite/cmd/account_import.go @@ -6,10 +6,9 @@ import ( "os" "github.com/cosmos/go-bip39" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/cliquiz" + "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" + "github.com/spf13/cobra" ) const flagSecret = "secret" diff --git a/ignite/cmd/cmd.go b/ignite/cmd/cmd.go index b3b5aa814c..e180c4328f 100644 --- a/ignite/cmd/cmd.go +++ b/ignite/cmd/cmd.go @@ -11,10 +11,8 @@ import ( "time" "github.com/fatih/color" - "github.com/spf13/cobra" - flag "github.com/spf13/pflag" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" "github.com/ignite-hq/cli/ignite/pkg/cosmosver" "github.com/ignite-hq/cli/ignite/pkg/events" @@ -24,6 +22,8 @@ import ( "github.com/ignite-hq/cli/ignite/services/chain" "github.com/ignite-hq/cli/ignite/services/scaffolder" "github.com/ignite-hq/cli/ignite/version" + "github.com/spf13/cobra" + flag "github.com/spf13/pflag" ) const ( @@ -82,10 +82,10 @@ func logLevel(cmd *cobra.Command) chain.LogLvl { return chain.LogRegular } -func printEvents(wg *sync.WaitGroup, bus events.Bus, s *clispinner.Spinner) { +func printEvents(wg *sync.WaitGroup, bus *events.Bus, s *clispinner.Spinner) { defer wg.Done() - for event := range bus { + for event := range bus.Events() { switch event.Status { case events.StatusOngoing: s.SetText(event.Text()) @@ -93,7 +93,7 @@ func printEvents(wg *sync.WaitGroup, bus events.Bus, s *clispinner.Spinner) { case events.StatusDone: icon := event.Icon if icon == "" { - icon = clispinner.OK + icon = icons.OK } s.Stop() fmt.Printf("%s %s\n", icon, event.Text()) diff --git a/ignite/cmd/generate_dart.go b/ignite/cmd/generate_dart.go index 8acf949391..9379a2e7e1 100644 --- a/ignite/cmd/generate_dart.go +++ b/ignite/cmd/generate_dart.go @@ -3,10 +3,9 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" + "github.com/spf13/cobra" ) func NewGenerateDart() *cobra.Command { diff --git a/ignite/cmd/generate_go.go b/ignite/cmd/generate_go.go index cf720a6186..e5eb99b45e 100644 --- a/ignite/cmd/generate_go.go +++ b/ignite/cmd/generate_go.go @@ -3,10 +3,9 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" + "github.com/spf13/cobra" ) func NewGenerateGo() *cobra.Command { diff --git a/ignite/cmd/generate_openapi.go b/ignite/cmd/generate_openapi.go index 6d51cfd8d8..06431b308a 100644 --- a/ignite/cmd/generate_openapi.go +++ b/ignite/cmd/generate_openapi.go @@ -3,10 +3,9 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" + "github.com/spf13/cobra" ) func NewGenerateOpenAPI() *cobra.Command { diff --git a/ignite/cmd/generate_vuex.go b/ignite/cmd/generate_vuex.go index cbf07686e5..d461a215c5 100644 --- a/ignite/cmd/generate_vuex.go +++ b/ignite/cmd/generate_vuex.go @@ -3,10 +3,9 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" + "github.com/spf13/cobra" ) func NewGenerateVuex() *cobra.Command { diff --git a/ignite/cmd/network.go b/ignite/cmd/network.go index f1554e0e05..c1b29485e5 100644 --- a/ignite/cmd/network.go +++ b/ignite/cmd/network.go @@ -1,12 +1,12 @@ package ignitecmd import ( + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "sync" "github.com/pkg/errors" "github.com/spf13/cobra" - "github.com/ignite-hq/cli/ignite/pkg/clispinner" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" "github.com/ignite-hq/cli/ignite/pkg/cosmosclient" "github.com/ignite-hq/cli/ignite/pkg/events" @@ -72,27 +72,20 @@ type NetworkBuilder struct { AccountRegistry cosmosaccount.Registry Spinner *clispinner.Spinner - ev events.Bus + ev *events.Bus wg *sync.WaitGroup cmd *cobra.Command cc cosmosclient.Client } func newNetworkBuilder(cmd *cobra.Command) (NetworkBuilder, error) { - var err error - - n := NetworkBuilder{ - Spinner: clispinner.New(), - ev: events.NewBus(), - wg: &sync.WaitGroup{}, - cmd: cmd, - } - - n.wg.Add(1) - go printEvents(n.wg, n.ev, n.Spinner) + var ( + err error + n = NetworkBuilder{cmd: cmd} + ) if n.cc, err = getNetworkCosmosClient(cmd); err != nil { - n.Cleanup() + //n.Cleanup() return NetworkBuilder{}, err } @@ -102,8 +95,6 @@ func newNetworkBuilder(cmd *cobra.Command) (NetworkBuilder, error) { } func (n NetworkBuilder) Chain(source networkchain.SourceOption, options ...networkchain.Option) (*networkchain.Chain, error) { - options = append(options, networkchain.CollectEvents(n.ev)) - if home := getHome(n.cmd); home != "" { options = append(options, networkchain.WithHome(home)) } @@ -124,17 +115,9 @@ func (n NetworkBuilder) Network(options ...network.Option) (network.Network, err } } - options = append(options, network.CollectEvents(n.ev)) - return network.New(*cosmos, account, options...), nil } -func (n NetworkBuilder) Cleanup() { - n.Spinner.Stop() - n.ev.Shutdown() - n.wg.Wait() -} - func getNetworkCosmosClient(cmd *cobra.Command) (cosmosclient.Client, error) { // check preconfigured networks if nightly && local { diff --git a/ignite/cmd/network_campaign_account.go b/ignite/cmd/network_campaign_account.go index 0b0f995175..1b6fb1271a 100644 --- a/ignite/cmd/network_campaign_account.go +++ b/ignite/cmd/network_campaign_account.go @@ -4,13 +4,13 @@ import ( "bytes" "context" "fmt" + "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "strconv" "github.com/spf13/cobra" "golang.org/x/sync/errgroup" - "github.com/ignite-hq/cli/ignite/pkg/clispinner" - "github.com/ignite-hq/cli/ignite/pkg/entrywriter" "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networktypes" ) @@ -48,7 +48,7 @@ func newNetworkCampaignAccountListHandler(cmd *cobra.Command, args []string) err if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() n, err := nb.Network() if err != nil { @@ -103,7 +103,7 @@ func newNetworkCampaignAccountListHandler(cmd *cobra.Command, args []string) err if accountSummary.Len() > 0 { fmt.Print(accountSummary.String()) } else { - fmt.Printf("%s %s\n", clispinner.Info, "no campaign account found") + fmt.Printf("%s %s\n", icons.Info, "no campaign account found") } return nil } diff --git a/ignite/cmd/network_campaign_list.go b/ignite/cmd/network_campaign_list.go index 20f1a3dee9..7d60f14e31 100644 --- a/ignite/cmd/network_campaign_list.go +++ b/ignite/cmd/network_campaign_list.go @@ -2,13 +2,12 @@ package ignitecmd import ( "fmt" - "io" - "os" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/entrywriter" + "github.com/ignite-hq/cli/ignite/pkg/cliui" + "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" + "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networktypes" + "github.com/spf13/cobra" ) var CampaignSummaryHeader = []string{ @@ -29,13 +28,16 @@ func NewNetworkCampaignList() *cobra.Command { return c } -func networkCampaignListHandler(cmd *cobra.Command, args []string) error { +func networkCampaignListHandler(cmd *cobra.Command, _ []string) error { + session := cliui.New() + defer session.Cleanup() + nb, err := newNetworkBuilder(cmd) if err != nil { return err } - n, err := nb.Network() + n, err := nb.Network(network.CollectEvents(session.EventBus())) if err != nil { return err } @@ -44,12 +46,11 @@ func networkCampaignListHandler(cmd *cobra.Command, args []string) error { return err } - nb.Cleanup() - return renderCampaignSummaries(campaigns, os.Stdout) + return renderCampaignSummaries(campaigns, session) } // renderCampaignSummaries writes into the provided out, the list of summarized campaigns -func renderCampaignSummaries(campaigns []networktypes.Campaign, out io.Writer) error { +func renderCampaignSummaries(campaigns []networktypes.Campaign, session cliui.Session) error { var campaignEntries [][]string for _, c := range campaigns { @@ -66,5 +67,5 @@ func renderCampaignSummaries(campaigns []networktypes.Campaign, out io.Writer) e }) } - return entrywriter.MustWrite(out, CampaignSummaryHeader, campaignEntries...) + return session.Table(CampaignSummaryHeader, campaignEntries...) } diff --git a/ignite/cmd/network_campaign_publish.go b/ignite/cmd/network_campaign_publish.go index 50df66f11b..dc2fdd6ca6 100644 --- a/ignite/cmd/network_campaign_publish.go +++ b/ignite/cmd/network_campaign_publish.go @@ -4,9 +4,8 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" ) const ( @@ -33,7 +32,7 @@ func networkCampaignPublishHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse launch ID totalSupply, err := sdk.ParseCoinsNormalized(args[1]) @@ -53,6 +52,6 @@ func networkCampaignPublishHandler(cmd *cobra.Command, args []string) error { } nb.Spinner.Stop() - fmt.Printf("%s Campaign ID: %d \n", clispinner.Bullet, campaignID) + fmt.Printf("%s Campaign ID: %d \n", icons.Bullet, campaignID) return nil } diff --git a/ignite/cmd/network_campaign_show.go b/ignite/cmd/network_campaign_show.go index c424547d99..dc6279d77c 100644 --- a/ignite/cmd/network_campaign_show.go +++ b/ignite/cmd/network_campaign_show.go @@ -31,7 +31,7 @@ func networkCampaignShowHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() n, err := nb.Network() if err != nil { diff --git a/ignite/cmd/network_campaign_update.go b/ignite/cmd/network_campaign_update.go index c302ac0f02..e3a81cb3a3 100644 --- a/ignite/cmd/network_campaign_update.go +++ b/ignite/cmd/network_campaign_update.go @@ -47,7 +47,7 @@ func networkCampaignUpdateHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse campaign ID campaignID, err := network.ParseID(args[0]) diff --git a/ignite/cmd/network_chain_init.go b/ignite/cmd/network_chain_init.go index c091f74602..294f8100bb 100644 --- a/ignite/cmd/network_chain_init.go +++ b/ignite/cmd/network_chain_init.go @@ -2,17 +2,16 @@ package ignitecmd import ( "fmt" + "github.com/ignite-hq/cli/ignite/pkg/cliui" - "github.com/manifoldco/promptui" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/cliquiz" - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" "github.com/ignite-hq/cli/ignite/pkg/cosmosutil" "github.com/ignite-hq/cli/ignite/services/chain" "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networkchain" + "github.com/spf13/cobra" ) const ( @@ -50,12 +49,13 @@ func NewNetworkChainInit() *cobra.Command { } func networkChainInitHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + nb, err := newNetworkBuilder(cmd) if err != nil { return err } - defer nb.Cleanup() - // parse launch ID launchID, err := network.ParseID(args[0]) if err != nil { @@ -76,21 +76,17 @@ func networkChainInitHandler(cmd *cobra.Command, args []string) error { } if !getYes(cmd) && exist { - prompt := promptui.Prompt{ - Label: fmt.Sprintf("The chain has already been initialized under: %s. Would you like to overwrite the home directory", - chainHome, - ), - IsConfirm: true, - } - nb.Spinner.Stop() - if _, err := prompt.Run(); err != nil { + question := fmt.Sprintf( + "The chain has already been initialized under: %s. Would you like to overwrite the home directory", + chainHome, + ) + if err := session.AskConfirm(question); err != nil { fmt.Println("said no") return nil } - nb.Spinner.Start() } - n, err := nb.Network() + n, err := nb.Network(network.CollectEvents(session.EventBus())) if err != nil { return err } @@ -100,7 +96,7 @@ func networkChainInitHandler(cmd *cobra.Command, args []string) error { return err } - c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch)) + c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch), networkchain.CollectEvents(session.EventBus())) if err != nil { return err } @@ -120,26 +116,25 @@ func networkChainInitHandler(cmd *cobra.Command, args []string) error { } // ask validator information. - v, err := askValidatorInfo(cmd, genesis.StakeDenom) + v, err := askValidatorInfo(cmd, session, genesis.StakeDenom) if err != nil { return err } - nb.Spinner.SetText("Generating your Gentx") - nb.Spinner.Start() + session.StartSpinner("Generating your Gentx") gentxPath, err := c.InitAccount(cmd.Context(), v, validatorAccount) if err != nil { return err } - nb.Spinner.Stop() - fmt.Printf("%s Gentx generated: %s\n", clispinner.Bullet, gentxPath) + session.StopSpinner() + session.Printf("%s Gentx generated: %s\n", icons.Bullet, gentxPath) return nil } // askValidatorInfo prompts to the user questions to query validator information -func askValidatorInfo(cmd *cobra.Command, stakeDenom string) (chain.Validator, error) { +func askValidatorInfo(cmd *cobra.Command, session cliui.Session, stakeDenom string) (chain.Validator, error) { var ( account, _ = cmd.Flags().GetString(flagValidatorAccount) website, _ = cmd.Flags().GetString(flagValidatorWebsite) @@ -186,5 +181,5 @@ func askValidatorInfo(cmd *cobra.Command, stakeDenom string) (chain.Validator, e cliquiz.Required(), ), ) - return v, cliquiz.Ask(questions...) + return v, session.Ask(questions...) } diff --git a/ignite/cmd/network_chain_install.go b/ignite/cmd/network_chain_install.go index cc92ed3e40..c01a828567 100644 --- a/ignite/cmd/network_chain_install.go +++ b/ignite/cmd/network_chain_install.go @@ -4,12 +4,11 @@ import ( "fmt" "path/filepath" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/goenv" "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networkchain" + "github.com/spf13/cobra" ) // NewNetworkChainInstall returns a new command to install a chain's binary by the launch id. @@ -29,7 +28,7 @@ func networkChainInstallHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) @@ -58,9 +57,9 @@ func networkChainInstallHandler(cmd *cobra.Command, args []string) error { } binaryPath := filepath.Join(goenv.Bin(), binaryName) - fmt.Printf("%s Binary installed\n", clispinner.OK) - fmt.Printf("%s Binary's name: %s\n", clispinner.Info, infoColor(binaryName)) - fmt.Printf("%s Binary's path: %s\n", clispinner.Info, infoColor(binaryPath)) + fmt.Printf("%s Binary installed\n", icons.OK) + fmt.Printf("%s Binary's name: %s\n", icons.Info, infoColor(binaryName)) + fmt.Printf("%s Binary's path: %s\n", icons.Info, infoColor(binaryPath)) return nil } diff --git a/ignite/cmd/network_chain_join.go b/ignite/cmd/network_chain_join.go index c8cb33566c..3c7a0aca9b 100644 --- a/ignite/cmd/network_chain_join.go +++ b/ignite/cmd/network_chain_join.go @@ -5,17 +5,17 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/manifoldco/promptui" - "github.com/pkg/errors" - "github.com/rdegges/go-ipify" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/cliquiz" - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/gitpod" "github.com/ignite-hq/cli/ignite/pkg/xchisel" "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networkchain" + "github.com/manifoldco/promptui" + "github.com/pkg/errors" + "github.com/rdegges/go-ipify" + "github.com/spf13/cobra" ) const ( @@ -51,7 +51,7 @@ func networkChainJoinHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse launch ID. launchID, err := network.ParseID(args[0]) @@ -111,7 +111,7 @@ func networkChainJoinHandler(cmd *cobra.Command, args []string) error { } } - fmt.Printf("%s %s\n", clispinner.Info, "Account request won't be submitted") + fmt.Printf("%s %s\n", icons.Info, "Account request won't be submitted") nb.Spinner.Start() } diff --git a/ignite/cmd/network_chain_launch.go b/ignite/cmd/network_chain_launch.go index d93946c1d0..6595b222f5 100644 --- a/ignite/cmd/network_chain_launch.go +++ b/ignite/cmd/network_chain_launch.go @@ -32,7 +32,7 @@ func networkChainLaunchHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) diff --git a/ignite/cmd/network_chain_list.go b/ignite/cmd/network_chain_list.go index e4686f0b3b..c571d48d27 100644 --- a/ignite/cmd/network_chain_list.go +++ b/ignite/cmd/network_chain_list.go @@ -2,13 +2,12 @@ package ignitecmd import ( "fmt" - "io" - "os" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/entrywriter" + "github.com/ignite-hq/cli/ignite/pkg/cliui" + "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" + "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networktypes" + "github.com/spf13/cobra" ) var LaunchSummaryHeader = []string{"launch ID", "chain ID", "source", "campaign ID", "network", "reward"} @@ -25,14 +24,14 @@ func NewNetworkChainList() *cobra.Command { } func networkChainListHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + nb, err := newNetworkBuilder(cmd) if err != nil { return err } - - nb.Spinner.Stop() - - n, err := nb.Network() + n, err := nb.Network(network.CollectEvents(session.EventBus())) if err != nil { return err } @@ -41,12 +40,11 @@ func networkChainListHandler(cmd *cobra.Command, args []string) error { return err } - nb.Cleanup() - return renderLaunchSummaries(chainLaunches, os.Stdout) + return renderLaunchSummaries(chainLaunches, session) } // renderLaunchSummaries writes into the provided out, the list of summarized launches -func renderLaunchSummaries(chainLaunches []networktypes.ChainLaunch, out io.Writer) error { +func renderLaunchSummaries(chainLaunches []networktypes.ChainLaunch, session cliui.Session) error { var launchEntries [][]string for _, c := range chainLaunches { @@ -70,5 +68,5 @@ func renderLaunchSummaries(chainLaunches []networktypes.ChainLaunch, out io.Writ }) } - return entrywriter.MustWrite(out, LaunchSummaryHeader, launchEntries...) + return session.Table(LaunchSummaryHeader, launchEntries...) } diff --git a/ignite/cmd/network_chain_prepare.go b/ignite/cmd/network_chain_prepare.go index 9c55a4b735..6361f04071 100644 --- a/ignite/cmd/network_chain_prepare.go +++ b/ignite/cmd/network_chain_prepare.go @@ -4,12 +4,11 @@ import ( "fmt" "path/filepath" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/goenv" "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networkchain" + "github.com/spf13/cobra" ) const ( @@ -40,7 +39,7 @@ func networkChainPrepareHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) @@ -88,7 +87,7 @@ func networkChainPrepareHandler(cmd *cobra.Command, args []string) error { } binaryDir := filepath.Dir(filepath.Join(goenv.Bin(), binaryName)) - fmt.Printf("%s Chain is prepared for launch\n", clispinner.OK) + fmt.Printf("%s Chain is prepared for launch\n", icons.OK) fmt.Println("\nYou can start your node by running the following command:") commandStr := fmt.Sprintf("%s start --home %s", binaryName, chainHome) fmt.Printf("\t%s/%s\n", binaryDir, infoColor(commandStr)) diff --git a/ignite/cmd/network_chain_publish.go b/ignite/cmd/network_chain_publish.go index c3fa9a6099..6a25e232b8 100644 --- a/ignite/cmd/network_chain_publish.go +++ b/ignite/cmd/network_chain_publish.go @@ -5,14 +5,13 @@ import ( "os" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/pkg/errors" - "github.com/spf13/cobra" - "github.com/tendermint/spn/pkg/chainid" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/xurl" "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networkchain" + "github.com/pkg/errors" + "github.com/spf13/cobra" + "github.com/tendermint/spn/pkg/chainid" ) const ( @@ -120,7 +119,7 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // use source from chosen target. var sourceOption networkchain.SourceOption @@ -216,11 +215,11 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error { nb.Spinner.Stop() - fmt.Printf("%s Network published \n", clispinner.OK) - fmt.Printf("%s Launch ID: %d \n", clispinner.Bullet, launchID) - fmt.Printf("%s Campaign ID: %d \n", clispinner.Bullet, campaignID) + fmt.Printf("%s Network published \n", icons.OK) + fmt.Printf("%s Launch ID: %d \n", icons.Bullet, launchID) + fmt.Printf("%s Campaign ID: %d \n", icons.Bullet, campaignID) if isMainnet { - fmt.Printf("%s Mainnet ID: %d \n", clispinner.Bullet, mainnetID) + fmt.Printf("%s Mainnet ID: %d \n", icons.Bullet, mainnetID) } return nil diff --git a/ignite/cmd/network_chain_revert_launch.go b/ignite/cmd/network_chain_revert_launch.go index 860c5f9795..8472cf80fd 100644 --- a/ignite/cmd/network_chain_revert_launch.go +++ b/ignite/cmd/network_chain_revert_launch.go @@ -28,7 +28,7 @@ func networkChainRevertLaunchHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) diff --git a/ignite/cmd/network_chain_show.go b/ignite/cmd/network_chain_show.go index bf79d65935..0021646eb0 100644 --- a/ignite/cmd/network_chain_show.go +++ b/ignite/cmd/network_chain_show.go @@ -8,15 +8,14 @@ import ( "strconv" "strings" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/cosmosutil" - "github.com/ignite-hq/cli/ignite/pkg/entrywriter" "github.com/ignite-hq/cli/ignite/pkg/yaml" "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networkchain" "github.com/ignite-hq/cli/ignite/services/network/networktypes" + "github.com/spf13/cobra" ) const flagOut = "out" @@ -67,7 +66,7 @@ func newNetworkChainShowInfo() *cobra.Command { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() n, err := nb.Network() if err != nil { return err @@ -122,7 +121,7 @@ func newNetworkChainShowGenesis() *cobra.Command { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() n, err := nb.Network() if err != nil { @@ -177,7 +176,7 @@ func newNetworkChainShowGenesis() *cobra.Command { if err := os.Rename(genesisPath, out); err != nil { return err } - fmt.Printf("%s Genesis generated: %s\n", clispinner.Bullet, out) + fmt.Printf("%s Genesis generated: %s\n", icons.Bullet, out) return nil }, @@ -198,7 +197,7 @@ func newNetworkChainShowAccounts() *cobra.Command { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() n, err := nb.Network() if err != nil { return err @@ -255,7 +254,7 @@ func newNetworkChainShowAccounts() *cobra.Command { if accountSummary.Len() > 0 { fmt.Print(accountSummary.String()) } else { - fmt.Printf("%s %s\n", clispinner.Info, "empty chain account list") + fmt.Printf("%s %s\n", icons.Info, "empty chain account list") } return nil }, @@ -273,7 +272,7 @@ func newNetworkChainShowValidators() *cobra.Command { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() n, err := nb.Network() if err != nil { return err @@ -307,7 +306,7 @@ func newNetworkChainShowValidators() *cobra.Command { } fmt.Print(validatorSummary.String()) } else { - fmt.Printf("%s %s\n", clispinner.Info, "no account found") + fmt.Printf("%s %s\n", icons.Info, "no account found") } return nil }, @@ -327,7 +326,7 @@ func newNetworkChainShowPeers() *cobra.Command { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() n, err := nb.Network() if err != nil { @@ -350,7 +349,7 @@ func newNetworkChainShowPeers() *cobra.Command { nb.Spinner.Stop() if len(peers) == 0 { - fmt.Printf("%s %s\n", clispinner.Info, "no peers found") + fmt.Printf("%s %s\n", icons.Info, "no peers found") return nil } @@ -366,7 +365,7 @@ func newNetworkChainShowPeers() *cobra.Command { return err } - fmt.Printf("%s Peer list generated: %s\n", clispinner.Bullet, out) + fmt.Printf("%s Peer list generated: %s\n", icons.Bullet, out) return nil }, } diff --git a/ignite/cmd/network_request_approve.go b/ignite/cmd/network_request_approve.go index f36ccab584..90c260d5c9 100644 --- a/ignite/cmd/network_request_approve.go +++ b/ignite/cmd/network_request_approve.go @@ -3,12 +3,11 @@ package ignitecmd import ( "fmt" - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/numbers" "github.com/ignite-hq/cli/ignite/services/network" + "github.com/pkg/errors" + "github.com/spf13/cobra" ) const ( @@ -38,7 +37,7 @@ func networkRequestApproveHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) @@ -68,7 +67,7 @@ func networkRequestApproveHandler(cmd *cobra.Command, args []string) error { if err := verifyRequest(cmd.Context(), nb, launchID, ids...); err != nil { return errors.Wrap(err, "request(s) not valid") } - fmt.Printf("%s Request(s) %s verified\n", clispinner.OK, numbers.List(ids, "#")) + fmt.Printf("%s Request(s) %s verified\n", icons.OK, numbers.List(ids, "#")) } // Submit the approved requests @@ -81,6 +80,6 @@ func networkRequestApproveHandler(cmd *cobra.Command, args []string) error { } nb.Spinner.Stop() - fmt.Printf("%s Request(s) %s approved\n", clispinner.OK, numbers.List(ids, "#")) + fmt.Printf("%s Request(s) %s approved\n", icons.OK, numbers.List(ids, "#")) return nil } diff --git a/ignite/cmd/network_request_list.go b/ignite/cmd/network_request_list.go index 379b721cc8..9357818c61 100644 --- a/ignite/cmd/network_request_list.go +++ b/ignite/cmd/network_request_list.go @@ -5,11 +5,10 @@ import ( "io" "os" + "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" + "github.com/ignite-hq/cli/ignite/services/network" "github.com/spf13/cobra" launchtypes "github.com/tendermint/spn/x/launch/types" - - "github.com/ignite-hq/cli/ignite/pkg/entrywriter" - "github.com/ignite-hq/cli/ignite/services/network" ) var requestSummaryHeader = []string{"ID", "Type", "Content"} @@ -49,7 +48,7 @@ func networkRequestListHandler(cmd *cobra.Command, args []string) error { return err } - nb.Cleanup() + //nb.Cleanup() return renderRequestSummaries(requests, os.Stdout) } diff --git a/ignite/cmd/network_request_reject.go b/ignite/cmd/network_request_reject.go index db9f826d7d..5b6fc24ee1 100644 --- a/ignite/cmd/network_request_reject.go +++ b/ignite/cmd/network_request_reject.go @@ -3,11 +3,10 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/numbers" "github.com/ignite-hq/cli/ignite/services/network" + "github.com/spf13/cobra" ) // NewNetworkRequestReject creates a new request reject @@ -32,7 +31,7 @@ func networkRequestRejectHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) @@ -61,6 +60,6 @@ func networkRequestRejectHandler(cmd *cobra.Command, args []string) error { } nb.Spinner.Stop() - fmt.Printf("%s Request(s) %s rejected\n", clispinner.OK, numbers.List(ids, "#")) + fmt.Printf("%s Request(s) %s rejected\n", icons.OK, numbers.List(ids, "#")) return nil } diff --git a/ignite/cmd/network_request_show.go b/ignite/cmd/network_request_show.go index d46323efc7..1a273c97c4 100644 --- a/ignite/cmd/network_request_show.go +++ b/ignite/cmd/network_request_show.go @@ -29,7 +29,7 @@ func networkRequestShowHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) diff --git a/ignite/cmd/network_request_verify.go b/ignite/cmd/network_request_verify.go index 6dd62e048b..3003113b5e 100644 --- a/ignite/cmd/network_request_verify.go +++ b/ignite/cmd/network_request_verify.go @@ -5,13 +5,12 @@ import ( "fmt" "os" - "github.com/spf13/cobra" - "github.com/ignite-hq/cli/ignite/pkg/chaincmd" - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/numbers" "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networkchain" + "github.com/spf13/cobra" ) // NewNetworkRequestVerify verify the request and simulate the chain. @@ -34,7 +33,7 @@ func networkRequestVerifyHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) @@ -50,12 +49,12 @@ func networkRequestVerifyHandler(cmd *cobra.Command, args []string) error { // verify the requests if err := verifyRequest(cmd.Context(), nb, launchID, ids...); err != nil { - fmt.Printf("%s Request(s) %s not valid\n", clispinner.NotOK, numbers.List(ids, "#")) + fmt.Printf("%s Request(s) %s not valid\n", icons.NotOK, numbers.List(ids, "#")) return err } nb.Spinner.Stop() - fmt.Printf("%s Request(s) %s verified\n", clispinner.OK, numbers.List(ids, "#")) + fmt.Printf("%s Request(s) %s verified\n", icons.OK, numbers.List(ids, "#")) return nil } diff --git a/ignite/cmd/network_reward_set.go b/ignite/cmd/network_reward_set.go index cefc786091..462fface16 100644 --- a/ignite/cmd/network_reward_set.go +++ b/ignite/cmd/network_reward_set.go @@ -30,7 +30,7 @@ func networkChainRewardSetHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - defer nb.Cleanup() + //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) diff --git a/ignite/cmd/relayer_configure.go b/ignite/cmd/relayer_configure.go index 8f35b9fabd..d8ff7dbcce 100644 --- a/ignite/cmd/relayer_configure.go +++ b/ignite/cmd/relayer_configure.go @@ -5,14 +5,13 @@ import ( "github.com/briandowns/spinner" "github.com/gookit/color" - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/cliquiz" - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" - "github.com/ignite-hq/cli/ignite/pkg/entrywriter" "github.com/ignite-hq/cli/ignite/pkg/relayer" + "github.com/pkg/errors" + "github.com/spf13/cobra" ) const ( diff --git a/ignite/cmd/relayer_connect.go b/ignite/cmd/relayer_connect.go index 1e85cffc39..24585a88c3 100644 --- a/ignite/cmd/relayer_connect.go +++ b/ignite/cmd/relayer_connect.go @@ -5,11 +5,10 @@ import ( "os" "text/tabwriter" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" "github.com/ignite-hq/cli/ignite/pkg/relayer" + "github.com/spf13/cobra" ) // NewRelayerConnect returns a new relayer connect command to link all or some relayer paths and start diff --git a/ignite/cmd/scaffold.go b/ignite/cmd/scaffold.go index 323bdfdacc..d91664e2a3 100644 --- a/ignite/cmd/scaffold.go +++ b/ignite/cmd/scaffold.go @@ -3,12 +3,11 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - flag "github.com/spf13/pflag" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" + "github.com/spf13/cobra" + flag "github.com/spf13/pflag" ) // flags related to component scaffolding diff --git a/ignite/cmd/scaffold_band.go b/ignite/cmd/scaffold_band.go index eb1ec7f2d9..2490c588f8 100644 --- a/ignite/cmd/scaffold_band.go +++ b/ignite/cmd/scaffold_band.go @@ -4,11 +4,10 @@ import ( "errors" "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" + "github.com/spf13/cobra" ) // NewScaffoldBandchain creates a new BandChain oracle in the module diff --git a/ignite/cmd/scaffold_chain.go b/ignite/cmd/scaffold_chain.go index 7cc961ba05..0486eccb7f 100644 --- a/ignite/cmd/scaffold_chain.go +++ b/ignite/cmd/scaffold_chain.go @@ -3,11 +3,10 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" + "github.com/spf13/cobra" ) const ( diff --git a/ignite/cmd/scaffold_flutter.go b/ignite/cmd/scaffold_flutter.go index 99bbcafabb..4cd3dd4f18 100644 --- a/ignite/cmd/scaffold_flutter.go +++ b/ignite/cmd/scaffold_flutter.go @@ -3,10 +3,9 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/scaffolder" + "github.com/spf13/cobra" ) // NewScaffoldFlutter scaffolds a Flutter app for a chain. diff --git a/ignite/cmd/scaffold_message.go b/ignite/cmd/scaffold_message.go index 5457af0b76..cac5d1bbeb 100644 --- a/ignite/cmd/scaffold_message.go +++ b/ignite/cmd/scaffold_message.go @@ -3,11 +3,10 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" + "github.com/spf13/cobra" ) const flagSigner = "signer" diff --git a/ignite/cmd/scaffold_module.go b/ignite/cmd/scaffold_module.go index 9d9080393c..822fbadf47 100644 --- a/ignite/cmd/scaffold_module.go +++ b/ignite/cmd/scaffold_module.go @@ -7,13 +7,12 @@ import ( "io" "strings" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/pkg/validation" "github.com/ignite-hq/cli/ignite/services/scaffolder" modulecreate "github.com/ignite-hq/cli/ignite/templates/module/create" + "github.com/spf13/cobra" ) const ( diff --git a/ignite/cmd/scaffold_mwasm.go b/ignite/cmd/scaffold_mwasm.go index 7942fe9b9b..ca352de94e 100644 --- a/ignite/cmd/scaffold_mwasm.go +++ b/ignite/cmd/scaffold_mwasm.go @@ -3,10 +3,9 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" + "github.com/spf13/cobra" ) func NewScaffoldWasm() *cobra.Command { diff --git a/ignite/cmd/scaffold_package.go b/ignite/cmd/scaffold_package.go index 01f97169d9..71ddeb2bd9 100644 --- a/ignite/cmd/scaffold_package.go +++ b/ignite/cmd/scaffold_package.go @@ -4,11 +4,10 @@ import ( "errors" "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" + "github.com/spf13/cobra" ) const ( diff --git a/ignite/cmd/scaffold_query.go b/ignite/cmd/scaffold_query.go index d34518370d..960cfd9a59 100644 --- a/ignite/cmd/scaffold_query.go +++ b/ignite/cmd/scaffold_query.go @@ -3,10 +3,9 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" + "github.com/spf13/cobra" ) const ( diff --git a/ignite/cmd/scaffold_vue.go b/ignite/cmd/scaffold_vue.go index 76424b9d91..86fead2317 100644 --- a/ignite/cmd/scaffold_vue.go +++ b/ignite/cmd/scaffold_vue.go @@ -3,10 +3,9 @@ package ignitecmd import ( "fmt" - "github.com/spf13/cobra" - - "github.com/ignite-hq/cli/ignite/pkg/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/scaffolder" + "github.com/spf13/cobra" ) // NewScaffoldVue scaffolds a Vue.js app for a chain. diff --git a/ignite/pkg/cliquiz/question.go b/ignite/pkg/cliui/cliquiz/question.go similarity index 100% rename from ignite/pkg/cliquiz/question.go rename to ignite/pkg/cliui/cliquiz/question.go diff --git a/ignite/pkg/clispinner/clispinner.go b/ignite/pkg/cliui/clispinner/clispinner.go similarity index 100% rename from ignite/pkg/clispinner/clispinner.go rename to ignite/pkg/cliui/clispinner/clispinner.go diff --git a/ignite/pkg/cliui/cliui.go b/ignite/pkg/cliui/cliui.go new file mode 100644 index 0000000000..6732aa5268 --- /dev/null +++ b/ignite/pkg/cliui/cliui.go @@ -0,0 +1,162 @@ +package cliui + +import ( + "errors" + "fmt" + "github.com/manifoldco/promptui" + "io" + "os" + "sync" + + "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" + "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" + "github.com/ignite-hq/cli/ignite/pkg/events" +) + +type Session struct { + ev *events.Bus + eventsWg *sync.WaitGroup + + spinner *clispinner.Spinner + spinnerWasPaused bool + + in io.Reader + out io.Writer + printLoopWg *sync.WaitGroup +} + +type Option func(s *Session) + +func WithOutput(output io.Writer) Option { + return func(s *Session) { + s.out = output + } +} + +func WithInput(input io.Reader) Option { + return func(s *Session) { + s.in = input + } +} + +func New(options ...Option) Session { + wg := &sync.WaitGroup{} + session := Session{ + spinner: clispinner.New(), + ev: events.NewBus(events.WithWaitGroup(wg)), + in: os.Stdin, + out: os.Stdout, + eventsWg: wg, + printLoopWg: &sync.WaitGroup{}, + } + for _, apply := range options { + apply(&session) + } + session.printLoopWg.Add(1) + go session.printLoop() + return session +} + +func (s Session) EventBus() *events.Bus { + return s.ev +} + +func (s Session) StartSpinner(text string) { + s.spinner.SetText(text).Start() +} + +func (s Session) StopSpinner() { + s.spinnerWasPaused = false + s.spinner.Stop() +} + +func (s Session) PauseSpinner() { + s.spinner.Stop() + s.spinnerWasPaused = true +} + +func (s Session) UnpauseSpinner() { + if s.spinnerWasPaused { + s.spinner.Start() + s.spinnerWasPaused = false + } +} + +func (s Session) Printf(format string, a ...interface{}) error { + s.eventsWg.Wait() + s.PauseSpinner() + defer s.UnpauseSpinner() + _, err := fmt.Fprintf(s.out, format, a...) + return err +} + +func (s Session) Println(messages ...interface{}) error { + s.eventsWg.Wait() + s.PauseSpinner() + defer s.UnpauseSpinner() + _, err := fmt.Fprintln(s.out, messages...) + return err +} + +func (s Session) Ask(questions ...cliquiz.Question) error { + s.eventsWg.Wait() + s.PauseSpinner() + defer s.UnpauseSpinner() + if s.in != os.Stdin && s.out != os.Stdout { + return errors.New("cannot use quiz with customized io") + } + return cliquiz.Ask(questions...) +} + +func (s Session) AskConfirm(message string) error { + s.eventsWg.Wait() + s.PauseSpinner() + defer s.UnpauseSpinner() + prompt := promptui.Prompt{ + Label: message, + IsConfirm: true, + } + _, err := prompt.Run() + return err +} + +func (s Session) Table(header []string, entries ...[]string) error { + s.eventsWg.Wait() + s.PauseSpinner() + defer s.UnpauseSpinner() + return entrywriter.MustWrite(s.out, header, entries...) +} + +func (s Session) Wait() { + s.eventsWg.Wait() +} + +func (s Session) Cleanup() { + s.StopSpinner() + s.ev.Shutdown() + s.printLoopWg.Wait() +} + +func (s Session) printLoop() { + for event := range s.ev.Events() { + switch event.Status { + case events.StatusOngoing: + s.StartSpinner(event.Text()) + case events.StatusDone: + if event.Icon == "" { + event.Icon = icons.OK + } + s.StopSpinner() + fmt.Fprintf(s.out, "%s %s\n", event.Icon, event.Text()) + case events.StatusNeutral: + s.PauseSpinner() + fmt.Fprintf(s.out, event.Text()) + s.UnpauseSpinner() + } + + s.eventsWg.Done() + } + s.printLoopWg.Done() +} diff --git a/ignite/pkg/entrywriter/entrywriter.go b/ignite/pkg/cliui/entrywriter/entrywriter.go similarity index 100% rename from ignite/pkg/entrywriter/entrywriter.go rename to ignite/pkg/cliui/entrywriter/entrywriter.go diff --git a/ignite/pkg/entrywriter/entrywriter_test.go b/ignite/pkg/cliui/entrywriter/entrywriter_test.go similarity index 94% rename from ignite/pkg/entrywriter/entrywriter_test.go rename to ignite/pkg/cliui/entrywriter/entrywriter_test.go index 078430601a..69fb0c0c45 100644 --- a/ignite/pkg/entrywriter/entrywriter_test.go +++ b/ignite/pkg/cliui/entrywriter/entrywriter_test.go @@ -2,12 +2,11 @@ package entrywriter_test import ( "errors" + "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" "io" "testing" "github.com/stretchr/testify/require" - - "github.com/ignite-hq/cli/ignite/pkg/entrywriter" ) type WriterWithError struct{} diff --git a/ignite/pkg/clispinner/icon.go b/ignite/pkg/cliui/icons/icon.go similarity index 95% rename from ignite/pkg/clispinner/icon.go rename to ignite/pkg/cliui/icons/icon.go index af0807fa8a..78ca3740b1 100644 --- a/ignite/pkg/clispinner/icon.go +++ b/ignite/pkg/cliui/icons/icon.go @@ -1,4 +1,4 @@ -package clispinner +package icons import "github.com/fatih/color" diff --git a/ignite/pkg/events/events.go b/ignite/pkg/events/events.go index 2a76fd6cfa..b19216e602 100644 --- a/ignite/pkg/events/events.go +++ b/ignite/pkg/events/events.go @@ -4,6 +4,7 @@ package events import ( "fmt" + "sync" "github.com/gookit/color" ) @@ -34,6 +35,7 @@ type ( const ( StatusOngoing Status = iota StatusDone + StatusNeutral ) // TextColor sets the text color @@ -59,6 +61,21 @@ func New(status Status, description string, options ...Option) Event { return ev } +// NewOngoing creates a new StatusOngoing event +func NewOngoing(description string) Event { + return New(StatusOngoing, description) +} + +// NewNeutral creates a new StatusNeutral event +func NewNeutral(description string) Event { + return New(StatusNeutral, description) +} + +// NewDone creates a new StatusDone event +func NewDone(description, icon string) Event { + return New(StatusDone, description, Icon(icon)) +} + // IsOngoing checks if state change that triggered this event is still ongoing. func (e Event) IsOngoing() bool { return e.Status == StatusOngoing @@ -74,25 +91,53 @@ func (e Event) Text() string { } // Bus is a send/receive event bus. -type Bus chan Event +type ( + Bus struct { + evchan chan Event + buswg *sync.WaitGroup + } + + BusOption func(*Bus) +) + +func WithWaitGroup(wg *sync.WaitGroup) BusOption { + return func(bus *Bus) { + bus.buswg = wg + } +} // NewBus creates a new event bus to send/receive events. -func NewBus() Bus { - return make(Bus) +func NewBus(options ...BusOption) *Bus { + bus := &Bus{ + evchan: make(chan Event), + } + + for _, apply := range options { + apply(bus) + } + + return bus } // Send sends a new event to bus. -func (b Bus) Send(e Event) { - if b == nil { +func (b *Bus) Send(e Event) { + if b == nil || b.evchan == nil { return } - b <- e + if b.buswg != nil { + b.buswg.Add(1) + } + b.evchan <- e +} + +func (b *Bus) Events() <-chan Event { + return b.evchan } // Shutdown shutdowns event bus. -func (b Bus) Shutdown() { - if b == nil { +func (b *Bus) Shutdown() { + if b.evchan == nil { return } - close(b) + close(b.evchan) } diff --git a/ignite/services/network/network.go b/ignite/services/network/network.go index 2384a49d7b..a9a6dbc9bf 100644 --- a/ignite/services/network/network.go +++ b/ignite/services/network/network.go @@ -28,7 +28,7 @@ type CosmosClient interface { // Network is network builder. type Network struct { - ev events.Bus + ev *events.Bus cosmos CosmosClient account cosmosaccount.Account campaignQuery campaigntypes.QueryClient @@ -81,7 +81,7 @@ func WithRewardQueryClient(client rewardtypes.QueryClient) Option { } // CollectEvents collects events from the network builder. -func CollectEvents(ev events.Bus) Option { +func CollectEvents(ev *events.Bus) Option { return func(n *Network) { n.ev = ev } diff --git a/ignite/services/network/networkchain/networkchain.go b/ignite/services/network/networkchain/networkchain.go index 29ea288162..e62db313d7 100644 --- a/ignite/services/network/networkchain/networkchain.go +++ b/ignite/services/network/networkchain/networkchain.go @@ -41,7 +41,7 @@ type Chain struct { ref plumbing.ReferenceName chain *chain.Chain - ev events.Bus + ev *events.Bus ar cosmosaccount.Registry } @@ -118,7 +118,7 @@ func WithGenesisFromURL(genesisURL string) Option { } // CollectEvents collects events from the chain. -func CollectEvents(ev events.Bus) Option { +func CollectEvents(ev *events.Bus) Option { return func(c *Chain) { c.ev = ev } diff --git a/ignite/services/network/reward.go b/ignite/services/network/reward.go index af0bc4f973..29daecb27c 100644 --- a/ignite/services/network/reward.go +++ b/ignite/services/network/reward.go @@ -2,11 +2,11 @@ package network import ( "fmt" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" sdk "github.com/cosmos/cosmos-sdk/types" rewardtypes "github.com/tendermint/spn/x/reward/types" - "github.com/ignite-hq/cli/ignite/pkg/clispinner" "github.com/ignite-hq/cli/ignite/pkg/events" "github.com/ignite-hq/cli/ignite/services/network/networktypes" ) @@ -42,7 +42,7 @@ func (n Network) SetReward(launchID uint64, lastRewardHeight int64, coins sdk.Co n.ev.Send(events.New( events.StatusDone, "The reward pool was empty", - events.Icon(clispinner.Info), + events.Icon(icons.Info), )) } else { n.ev.Send(events.New(events.StatusDone, @@ -51,7 +51,7 @@ func (n Network) SetReward(launchID uint64, lastRewardHeight int64, coins sdk.Co coins.String(), lastRewardHeight, ), - events.Icon(clispinner.Info), + events.Icon(icons.Info), )) } From bda212798275d518c6f0d9923f445b868f01ed3c Mon Sep 17 00:00:00 2001 From: Petr Ivanov Date: Wed, 27 Apr 2022 12:35:54 +0400 Subject: [PATCH 02/10] cliui refactor network commands --- ignite/cmd/generate_dart.go | 3 +- ignite/cmd/generate_go.go | 3 +- ignite/cmd/generate_openapi.go | 3 +- ignite/cmd/generate_vuex.go | 3 +- ignite/cmd/network.go | 35 +- ignite/cmd/network_campaign_account.go | 36 +- ignite/cmd/network_campaign_list.go | 4 +- ignite/cmd/network_campaign_publish.go | 14 +- ignite/cmd/network_campaign_show.go | 17 +- ignite/cmd/network_campaign_update.go | 16 +- ignite/cmd/network_chain_init.go | 10 +- ignite/cmd/network_chain_install.go | 14 +- ignite/cmd/network_chain_join.go | 36 +- ignite/cmd/network_chain_launch.go | 10 +- ignite/cmd/network_chain_list.go | 6 +- ignite/cmd/network_chain_prepare.go | 13 +- ignite/cmd/network_chain_publish.go | 23 +- ignite/cmd/network_chain_revert_launch.go | 10 +- ignite/cmd/network_chain_show.go | 337 +----------------- ignite/cmd/network_chain_show_accounts.go | 78 ++++ ignite/cmd/network_chain_show_genesis.go | 91 +++++ ignite/cmd/network_chain_show_info.go | 66 ++++ ignite/cmd/network_chain_show_peers.go | 76 ++++ ignite/cmd/network_chain_show_validators.go | 54 +++ ignite/cmd/network_request_approve.go | 16 +- ignite/cmd/network_request_list.go | 17 +- ignite/cmd/network_request_reject.go | 14 +- ignite/cmd/network_request_show.go | 18 +- ignite/cmd/network_request_verify.go | 15 +- ignite/cmd/network_reward_set.go | 10 +- ignite/cmd/relayer_configure.go | 3 +- ignite/cmd/relayer_connect.go | 2 +- ignite/cmd/scaffold.go | 3 +- ignite/cmd/scaffold_band.go | 3 +- ignite/cmd/scaffold_chain.go | 3 +- ignite/cmd/scaffold_flutter.go | 3 +- ignite/cmd/scaffold_message.go | 3 +- ignite/cmd/scaffold_module.go | 3 +- ignite/cmd/scaffold_mwasm.go | 3 +- ignite/cmd/scaffold_package.go | 3 +- ignite/cmd/scaffold_query.go | 3 +- ignite/cmd/scaffold_vue.go | 3 +- ignite/pkg/cliui/clispinner/clispinner.go | 9 +- ignite/pkg/cliui/cliui.go | 90 +++-- ignite/pkg/events/events.go | 22 +- ignite/services/network/network.go | 4 +- .../network/networkchain/networkchain.go | 4 +- 47 files changed, 637 insertions(+), 575 deletions(-) create mode 100644 ignite/cmd/network_chain_show_accounts.go create mode 100644 ignite/cmd/network_chain_show_genesis.go create mode 100644 ignite/cmd/network_chain_show_info.go create mode 100644 ignite/cmd/network_chain_show_peers.go create mode 100644 ignite/cmd/network_chain_show_validators.go diff --git a/ignite/cmd/generate_dart.go b/ignite/cmd/generate_dart.go index 9379a2e7e1..e8970ff0cd 100644 --- a/ignite/cmd/generate_dart.go +++ b/ignite/cmd/generate_dart.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" @@ -18,7 +19,7 @@ func NewGenerateDart() *cobra.Command { } func generateDartHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New().SetText("Generating...") + s := clispinner.New(os.Stdout).SetText("Generating...") defer s.Stop() c, err := newChainWithHomeFlags(cmd, chain.EnableThirdPartyModuleCodegen()) diff --git a/ignite/cmd/generate_go.go b/ignite/cmd/generate_go.go index e5eb99b45e..120db1af4b 100644 --- a/ignite/cmd/generate_go.go +++ b/ignite/cmd/generate_go.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" @@ -17,7 +18,7 @@ func NewGenerateGo() *cobra.Command { } func generateGoHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New().SetText("Generating...") + s := clispinner.New(os.Stdout).SetText("Generating...") defer s.Stop() c, err := newChainWithHomeFlags(cmd) diff --git a/ignite/cmd/generate_openapi.go b/ignite/cmd/generate_openapi.go index 06431b308a..f534b436e3 100644 --- a/ignite/cmd/generate_openapi.go +++ b/ignite/cmd/generate_openapi.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" @@ -17,7 +18,7 @@ func NewGenerateOpenAPI() *cobra.Command { } func generateOpenAPIHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New().SetText("Generating...") + s := clispinner.New(os.Stdout).SetText("Generating...") defer s.Stop() c, err := newChainWithHomeFlags(cmd) diff --git a/ignite/cmd/generate_vuex.go b/ignite/cmd/generate_vuex.go index d461a215c5..ec91cfbe55 100644 --- a/ignite/cmd/generate_vuex.go +++ b/ignite/cmd/generate_vuex.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" @@ -19,7 +20,7 @@ func NewGenerateVuex() *cobra.Command { } func generateVuexHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New().SetText("Generating...") + s := clispinner.New(os.Stdout).SetText("Generating...") defer s.Stop() c, err := newChainWithHomeFlags(cmd, chain.EnableThirdPartyModuleCodegen()) diff --git a/ignite/cmd/network.go b/ignite/cmd/network.go index c1b29485e5..14c225dee2 100644 --- a/ignite/cmd/network.go +++ b/ignite/cmd/network.go @@ -1,9 +1,6 @@ package ignitecmd import ( - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" - "sync" - "github.com/pkg/errors" "github.com/spf13/cobra" @@ -68,29 +65,39 @@ func NewNetwork() *cobra.Command { var cosmos *cosmosclient.Client -type NetworkBuilder struct { - AccountRegistry cosmosaccount.Registry - Spinner *clispinner.Spinner +type ( + NetworkBuilderOption func(builder *NetworkBuilder) + + NetworkBuilder struct { + AccountRegistry cosmosaccount.Registry + + ev events.Bus + cmd *cobra.Command + cc cosmosclient.Client + } +) - ev *events.Bus - wg *sync.WaitGroup - cmd *cobra.Command - cc cosmosclient.Client +func CollectEvents(ev events.Bus) NetworkBuilderOption { + return func(builder *NetworkBuilder) { + builder.ev = ev + } } -func newNetworkBuilder(cmd *cobra.Command) (NetworkBuilder, error) { +func newNetworkBuilder(cmd *cobra.Command, options ...NetworkBuilderOption) (NetworkBuilder, error) { var ( err error n = NetworkBuilder{cmd: cmd} ) if n.cc, err = getNetworkCosmosClient(cmd); err != nil { - //n.Cleanup() return NetworkBuilder{}, err } n.AccountRegistry = n.cc.AccountRegistry + for _, apply := range options { + apply(&n) + } return n, nil } @@ -99,6 +106,8 @@ func (n NetworkBuilder) Chain(source networkchain.SourceOption, options ...netwo options = append(options, networkchain.WithHome(home)) } + options = append(options, networkchain.CollectEvents(n.ev)) + return networkchain.New(n.cmd.Context(), n.AccountRegistry, source, options...) } @@ -115,6 +124,8 @@ func (n NetworkBuilder) Network(options ...network.Option) (network.Network, err } } + options = append(options, network.CollectEvents(n.ev)) + return network.New(*cosmos, account, options...), nil } diff --git a/ignite/cmd/network_campaign_account.go b/ignite/cmd/network_campaign_account.go index 1b6fb1271a..c9f56c7ab6 100644 --- a/ignite/cmd/network_campaign_account.go +++ b/ignite/cmd/network_campaign_account.go @@ -1,13 +1,12 @@ package ignitecmd import ( - "bytes" "context" - "fmt" - "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" - "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "strconv" + "github.com/ignite-hq/cli/ignite/pkg/cliui" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" + "github.com/spf13/cobra" "golang.org/x/sync/errgroup" @@ -44,19 +43,18 @@ func newNetworkCampaignAccountList() *cobra.Command { } func newNetworkCampaignAccountListHandler(cmd *cobra.Command, args []string) error { - nb, campaignID, err := networkChainLaunch(cmd, args) + session := cliui.New() + defer session.Cleanup() + + nb, campaignID, err := networkChainLaunch(cmd, args, session) if err != nil { return err } - //defer nb.Cleanup() - n, err := nb.Network() if err != nil { return err } - accountSummary := &bytes.Buffer{} - // get all campaign accounts mainnetAccs, vestingAccs, err := getAccounts(cmd.Context(), n, campaignID) if err != nil { @@ -71,11 +69,7 @@ func newNetworkCampaignAccountListHandler(cmd *cobra.Command, args []string) err }) } if len(mainnetAccEntries) > 0 { - if err = entrywriter.MustWrite( - accountSummary, - campaignMainnetsAccSummaryHeader, - mainnetAccEntries..., - ); err != nil { + if err = session.PrintTable(campaignMainnetsAccSummaryHeader, mainnetAccEntries...); err != nil { return err } } @@ -90,21 +84,15 @@ func newNetworkCampaignAccountListHandler(cmd *cobra.Command, args []string) err }) } if len(mainnetVestingAccEntries) > 0 { - if err = entrywriter.MustWrite( - accountSummary, - campaignVestingAccSummaryHeader, - mainnetVestingAccEntries..., - ); err != nil { + if err = session.PrintTable(campaignVestingAccSummaryHeader, mainnetVestingAccEntries...); err != nil { return err } } - nb.Spinner.Stop() - if accountSummary.Len() > 0 { - fmt.Print(accountSummary.String()) - } else { - fmt.Printf("%s %s\n", icons.Info, "no campaign account found") + if len(mainnetVestingAccEntries)+len(mainnetAccEntries) == 0 { + return session.Printf("%s %s\n", icons.Info, "no campaign account found") } + return nil } diff --git a/ignite/cmd/network_campaign_list.go b/ignite/cmd/network_campaign_list.go index 7d60f14e31..8e5bc4ba8d 100644 --- a/ignite/cmd/network_campaign_list.go +++ b/ignite/cmd/network_campaign_list.go @@ -32,7 +32,7 @@ func networkCampaignListHandler(cmd *cobra.Command, _ []string) error { session := cliui.New() defer session.Cleanup() - nb, err := newNetworkBuilder(cmd) + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } @@ -67,5 +67,5 @@ func renderCampaignSummaries(campaigns []networktypes.Campaign, session cliui.Se }) } - return session.Table(CampaignSummaryHeader, campaignEntries...) + return session.PrintTable(CampaignSummaryHeader, campaignEntries...) } diff --git a/ignite/cmd/network_campaign_publish.go b/ignite/cmd/network_campaign_publish.go index dc2fdd6ca6..17b0b08de4 100644 --- a/ignite/cmd/network_campaign_publish.go +++ b/ignite/cmd/network_campaign_publish.go @@ -1,9 +1,8 @@ package ignitecmd import ( - "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/spf13/cobra" ) @@ -28,13 +27,14 @@ func NewNetworkCampaignPublish() *cobra.Command { } func networkCampaignPublishHandler(cmd *cobra.Command, args []string) error { - nb, err := newNetworkBuilder(cmd) + session := cliui.New() + defer session.Cleanup() + + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() - // parse launch ID totalSupply, err := sdk.ParseCoinsNormalized(args[1]) if err != nil { return err @@ -51,7 +51,5 @@ func networkCampaignPublishHandler(cmd *cobra.Command, args []string) error { return err } - nb.Spinner.Stop() - fmt.Printf("%s Campaign ID: %d \n", icons.Bullet, campaignID) - return nil + return session.Printf("%s Campaign ID: %d \n", icons.Bullet, campaignID) } diff --git a/ignite/cmd/network_campaign_show.go b/ignite/cmd/network_campaign_show.go index dc6279d77c..6c7093dbb4 100644 --- a/ignite/cmd/network_campaign_show.go +++ b/ignite/cmd/network_campaign_show.go @@ -1,12 +1,10 @@ package ignitecmd import ( - "fmt" - - "github.com/spf13/cobra" - + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/yaml" "github.com/ignite-hq/cli/ignite/services/network" + "github.com/spf13/cobra" ) // NewNetworkCampaignShow returns a new command to show published campaign on Ignite @@ -21,22 +19,25 @@ func NewNetworkCampaignShow() *cobra.Command { } func networkCampaignShowHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + // parse campaign ID campaignID, err := network.ParseID(args[0]) if err != nil { return err } - nb, err := newNetworkBuilder(cmd) + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() n, err := nb.Network() if err != nil { return err } + campaign, err := n.Campaign(cmd.Context(), campaignID) if err != nil { return err @@ -47,7 +48,5 @@ func networkCampaignShowHandler(cmd *cobra.Command, args []string) error { return err } - nb.Spinner.Stop() - fmt.Print(info) - return nil + return session.Println(info) } diff --git a/ignite/cmd/network_campaign_update.go b/ignite/cmd/network_campaign_update.go index e3a81cb3a3..9ab5c57387 100644 --- a/ignite/cmd/network_campaign_update.go +++ b/ignite/cmd/network_campaign_update.go @@ -5,10 +5,10 @@ import ( "strings" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/spf13/cobra" - + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/yaml" "github.com/ignite-hq/cli/ignite/services/network" + "github.com/spf13/cobra" ) const ( @@ -33,6 +33,9 @@ func NewNetworkCampaignUpdate() *cobra.Command { } func networkCampaignUpdateHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + var ( campaignName, _ = cmd.Flags().GetString(flagCampaignName) metadata, _ = cmd.Flags().GetString(flagCampaignMetadata) @@ -43,11 +46,10 @@ func networkCampaignUpdateHandler(cmd *cobra.Command, args []string) error { return err } - nb, err := newNetworkBuilder(cmd) + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // parse campaign ID campaignID, err := network.ParseID(args[0]) @@ -90,14 +92,12 @@ func networkCampaignUpdateHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - fmt.Println("") + session.Println("") info, err := yaml.Marshal(cmd.Context(), campaign) if err != nil { return err } - nb.Spinner.Stop() - fmt.Print(info) - return nil + return session.Print(info) } diff --git a/ignite/cmd/network_chain_init.go b/ignite/cmd/network_chain_init.go index 294f8100bb..d26a023afc 100644 --- a/ignite/cmd/network_chain_init.go +++ b/ignite/cmd/network_chain_init.go @@ -2,8 +2,8 @@ package ignitecmd import ( "fmt" - "github.com/ignite-hq/cli/ignite/pkg/cliui" + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" @@ -52,10 +52,11 @@ func networkChainInitHandler(cmd *cobra.Command, args []string) error { session := cliui.New() defer session.Cleanup() - nb, err := newNetworkBuilder(cmd) + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } + // parse launch ID launchID, err := network.ParseID(args[0]) if err != nil { @@ -127,10 +128,7 @@ func networkChainInitHandler(cmd *cobra.Command, args []string) error { return err } - session.StopSpinner() - session.Printf("%s Gentx generated: %s\n", icons.Bullet, gentxPath) - - return nil + return session.Printf("%s Gentx generated: %s\n", icons.Bullet, gentxPath) } // askValidatorInfo prompts to the user questions to query validator information diff --git a/ignite/cmd/network_chain_install.go b/ignite/cmd/network_chain_install.go index c01a828567..76448f67a6 100644 --- a/ignite/cmd/network_chain_install.go +++ b/ignite/cmd/network_chain_install.go @@ -1,9 +1,9 @@ package ignitecmd import ( - "fmt" "path/filepath" + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/goenv" "github.com/ignite-hq/cli/ignite/services/network" @@ -24,11 +24,13 @@ func NewNetworkChainInstall() *cobra.Command { } func networkChainInstallHandler(cmd *cobra.Command, args []string) error { - nb, err := newNetworkBuilder(cmd) + session := cliui.New() + defer session.Cleanup() + + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) @@ -57,9 +59,9 @@ func networkChainInstallHandler(cmd *cobra.Command, args []string) error { } binaryPath := filepath.Join(goenv.Bin(), binaryName) - fmt.Printf("%s Binary installed\n", icons.OK) - fmt.Printf("%s Binary's name: %s\n", icons.Info, infoColor(binaryName)) - fmt.Printf("%s Binary's path: %s\n", icons.Info, infoColor(binaryPath)) + session.Printf("%s Binary installed\n", icons.OK) + session.Printf("%s Binary's name: %s\n", icons.Info, infoColor(binaryName)) + session.Printf("%s Binary's path: %s\n", icons.Info, infoColor(binaryPath)) return nil } diff --git a/ignite/cmd/network_chain_join.go b/ignite/cmd/network_chain_join.go index 3c7a0aca9b..cee85e447f 100644 --- a/ignite/cmd/network_chain_join.go +++ b/ignite/cmd/network_chain_join.go @@ -5,14 +5,13 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/gitpod" "github.com/ignite-hq/cli/ignite/pkg/xchisel" "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networkchain" - "github.com/manifoldco/promptui" "github.com/pkg/errors" "github.com/rdegges/go-ipify" "github.com/spf13/cobra" @@ -42,16 +41,18 @@ func NewNetworkChainJoin() *cobra.Command { } func networkChainJoinHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + var ( gentxPath, _ = cmd.Flags().GetString(flagGentx) amount, _ = cmd.Flags().GetString(flagAmount) ) - nb, err := newNetworkBuilder(cmd) + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // parse launch ID. launchID, err := network.ParseID(args[0]) @@ -66,7 +67,7 @@ func networkChainJoinHandler(cmd *cobra.Command, args []string) error { // if there is no custom gentx, we need to detect the public address. if gentxPath == "" { // get the peer public address for the validator. - publicAddr, err := askPublicAddress(cmd.Context(), nb.Spinner) + publicAddr, err := askPublicAddress(cmd.Context(), session) if err != nil { return err } @@ -97,22 +98,18 @@ func networkChainJoinHandler(cmd *cobra.Command, args []string) error { } joinOptions = append(joinOptions, network.WithAccountRequest(amountCoins)) } else { - nb.Spinner.Stop() - if !getYes(cmd) { - label := fmt.Sprintf("You haven't set the --%s flag and therefore an account request won't be submitted. Do you confirm", flagAmount) - prompt := promptui.Prompt{ - Label: label, - IsConfirm: true, - } - if _, err := prompt.Run(); err != nil { - fmt.Println("said no") + question := fmt.Sprintf( + "You haven't set the --%s flag and therefore an account request won't be submitted. Do you confirm", + flagAmount, + ) + if err := session.AskConfirm(question); err != nil { + session.Println("said no") return nil } } - fmt.Printf("%s %s\n", icons.Info, "Account request won't be submitted") - nb.Spinner.Start() + session.Printf("%s %s\n", icons.Info, "Account request won't be submitted") } // create the message to add the validator. @@ -121,10 +118,7 @@ func networkChainJoinHandler(cmd *cobra.Command, args []string) error { // askPublicAddress prepare questions to interactively ask for a publicAddress // when peer isn't provided and not running through chisel proxy. -func askPublicAddress(ctx context.Context, s *clispinner.Spinner) (publicAddress string, err error) { - s.Stop() - defer s.Start() - +func askPublicAddress(ctx context.Context, session cliui.Session) (publicAddress string, err error) { options := []cliquiz.Option{ cliquiz.Required(), } @@ -148,5 +142,5 @@ func askPublicAddress(ctx context.Context, s *clispinner.Spinner) (publicAddress &publicAddress, options..., )} - return publicAddress, cliquiz.Ask(questions...) + return publicAddress, session.Ask(questions...) } diff --git a/ignite/cmd/network_chain_launch.go b/ignite/cmd/network_chain_launch.go index 6595b222f5..50f19bb6a0 100644 --- a/ignite/cmd/network_chain_launch.go +++ b/ignite/cmd/network_chain_launch.go @@ -1,9 +1,9 @@ package ignitecmd import ( - "github.com/spf13/cobra" - + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/services/network" + "github.com/spf13/cobra" ) const ( @@ -28,11 +28,13 @@ func NewNetworkChainLaunch() *cobra.Command { } func networkChainLaunchHandler(cmd *cobra.Command, args []string) error { - nb, err := newNetworkBuilder(cmd) + session := cliui.New() + defer session.Cleanup() + + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) diff --git a/ignite/cmd/network_chain_list.go b/ignite/cmd/network_chain_list.go index c571d48d27..7b43821b8e 100644 --- a/ignite/cmd/network_chain_list.go +++ b/ignite/cmd/network_chain_list.go @@ -23,11 +23,11 @@ func NewNetworkChainList() *cobra.Command { return c } -func networkChainListHandler(cmd *cobra.Command, args []string) error { +func networkChainListHandler(cmd *cobra.Command, _ []string) error { session := cliui.New() defer session.Cleanup() - nb, err := newNetworkBuilder(cmd) + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } @@ -68,5 +68,5 @@ func renderLaunchSummaries(chainLaunches []networktypes.ChainLaunch, session cli }) } - return session.Table(LaunchSummaryHeader, launchEntries...) + return session.PrintTable(LaunchSummaryHeader, launchEntries...) } diff --git a/ignite/cmd/network_chain_prepare.go b/ignite/cmd/network_chain_prepare.go index 6361f04071..ba1fe350a3 100644 --- a/ignite/cmd/network_chain_prepare.go +++ b/ignite/cmd/network_chain_prepare.go @@ -4,6 +4,7 @@ import ( "fmt" "path/filepath" + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/goenv" "github.com/ignite-hq/cli/ignite/services/network" @@ -33,13 +34,15 @@ func NewNetworkChainPrepare() *cobra.Command { } func networkChainPrepareHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + force, _ := cmd.Flags().GetBool(flagForce) - nb, err := newNetworkBuilder(cmd) + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) @@ -87,10 +90,10 @@ func networkChainPrepareHandler(cmd *cobra.Command, args []string) error { } binaryDir := filepath.Dir(filepath.Join(goenv.Bin(), binaryName)) - fmt.Printf("%s Chain is prepared for launch\n", icons.OK) - fmt.Println("\nYou can start your node by running the following command:") + session.Printf("%s Chain is prepared for launch\n", icons.OK) + session.Println("\nYou can start your node by running the following command:") commandStr := fmt.Sprintf("%s start --home %s", binaryName, chainHome) - fmt.Printf("\t%s/%s\n", binaryDir, infoColor(commandStr)) + session.Printf("\t%s/%s\n", binaryDir, infoColor(commandStr)) return nil } diff --git a/ignite/cmd/network_chain_publish.go b/ignite/cmd/network_chain_publish.go index 6a25e232b8..ce230d6770 100644 --- a/ignite/cmd/network_chain_publish.go +++ b/ignite/cmd/network_chain_publish.go @@ -2,9 +2,8 @@ package ignitecmd import ( "fmt" - "os" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/xurl" "github.com/ignite-hq/cli/ignite/services/network" @@ -12,6 +11,7 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/tendermint/spn/pkg/chainid" + "os" ) const ( @@ -57,6 +57,9 @@ func NewNetworkChainPublish() *cobra.Command { } func networkChainPublishHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + var ( source = xurl.HTTPS(args[0]) tag, _ = cmd.Flags().GetString(flagTag) @@ -115,11 +118,10 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error { return fmt.Errorf("%s and %s flags must be provided together", flagRewardCoins, flagRewardHeight) } - nb, err := newNetworkBuilder(cmd) + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // use source from chosen target. var sourceOption networkchain.SourceOption @@ -194,8 +196,7 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error { return err } - nb.Spinner.SetText("Publishing...") - nb.Spinner.Start() + session.StartSpinner("Publishing...") n, err := nb.Network() if err != nil { @@ -213,13 +214,13 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error { } } - nb.Spinner.Stop() + session.StopSpinner() - fmt.Printf("%s Network published \n", icons.OK) - fmt.Printf("%s Launch ID: %d \n", icons.Bullet, launchID) - fmt.Printf("%s Campaign ID: %d \n", icons.Bullet, campaignID) + session.Printf("%s Network published \n", icons.OK) + session.Printf("%s Launch ID: %d \n", icons.Bullet, launchID) + session.Printf("%s Campaign ID: %d \n", icons.Bullet, campaignID) if isMainnet { - fmt.Printf("%s Mainnet ID: %d \n", icons.Bullet, mainnetID) + session.Printf("%s Mainnet ID: %d \n", icons.Bullet, mainnetID) } return nil diff --git a/ignite/cmd/network_chain_revert_launch.go b/ignite/cmd/network_chain_revert_launch.go index 8472cf80fd..2662c95ae8 100644 --- a/ignite/cmd/network_chain_revert_launch.go +++ b/ignite/cmd/network_chain_revert_launch.go @@ -1,10 +1,10 @@ package ignitecmd import ( - "github.com/spf13/cobra" - + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networkchain" + "github.com/spf13/cobra" ) // NewNetworkChainRevertLaunch creates a new chain revert launch command @@ -24,11 +24,13 @@ func NewNetworkChainRevertLaunch() *cobra.Command { } func networkChainRevertLaunchHandler(cmd *cobra.Command, args []string) error { - nb, err := newNetworkBuilder(cmd) + session := cliui.New() + defer session.Cleanup() + + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) diff --git a/ignite/cmd/network_chain_show.go b/ignite/cmd/network_chain_show.go index 0021646eb0..d08186cfd2 100644 --- a/ignite/cmd/network_chain_show.go +++ b/ignite/cmd/network_chain_show.go @@ -1,20 +1,8 @@ package ignitecmd import ( - "bytes" - "fmt" - "os" - "path/filepath" - "strconv" - "strings" - - "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" - "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" - "github.com/ignite-hq/cli/ignite/pkg/cosmosutil" - "github.com/ignite-hq/cli/ignite/pkg/yaml" + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/services/network" - "github.com/ignite-hq/cli/ignite/services/network/networkchain" - "github.com/ignite-hq/cli/ignite/services/network/networktypes" "github.com/spf13/cobra" ) @@ -43,8 +31,8 @@ func NewNetworkChainShow() *cobra.Command { return c } -func networkChainLaunch(cmd *cobra.Command, args []string) (NetworkBuilder, uint64, error) { - nb, err := newNetworkBuilder(cmd) +func networkChainLaunch(cmd *cobra.Command, args []string, session cliui.Session) (NetworkBuilder, uint64, error) { + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return nb, 0, err } @@ -55,322 +43,3 @@ func networkChainLaunch(cmd *cobra.Command, args []string) (NetworkBuilder, uint } return nb, launchID, err } - -func newNetworkChainShowInfo() *cobra.Command { - c := &cobra.Command{ - Use: "info [launch-id]", - Short: "Show info details of the chain", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - nb, launchID, err := networkChainLaunch(cmd, args) - if err != nil { - return err - } - //defer nb.Cleanup() - n, err := nb.Network() - if err != nil { - return err - } - - chainLaunch, err := n.ChainLaunch(cmd.Context(), launchID) - if err != nil { - return err - } - - reward, err := n.ChainReward(cmd.Context(), launchID) - if err != nil && err != network.ErrObjectNotFound { - return err - } - chainLaunch.Reward = reward.RemainingCoins.String() - - var genesis []byte - if chainLaunch.GenesisURL != "" { - genesis, _, err = cosmosutil.GenesisAndHashFromURL(cmd.Context(), chainLaunch.GenesisURL) - if err != nil { - return err - } - } - chainInfo := struct { - Chain networktypes.ChainLaunch `json:"Chain"` - Genesis []byte `json:"Genesis"` - }{ - Chain: chainLaunch, - Genesis: genesis, - } - info, err := yaml.Marshal(cmd.Context(), chainInfo, "$.Genesis") - if err != nil { - return err - } - nb.Spinner.Stop() - fmt.Print(info) - return nil - }, - } - return c -} - -func newNetworkChainShowGenesis() *cobra.Command { - c := &cobra.Command{ - Use: "genesis [launch-id]", - Short: "Show the chain genesis file", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - out, _ := cmd.Flags().GetString(flagOut) - - nb, launchID, err := networkChainLaunch(cmd, args) - if err != nil { - return err - } - //defer nb.Cleanup() - - n, err := nb.Network() - if err != nil { - return err - } - - chainLaunch, err := n.ChainLaunch(cmd.Context(), launchID) - if err != nil { - return err - } - - c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch)) - if err != nil { - return err - } - - genesisPath, err := c.GenesisPath() - if err != nil { - return err - } - - // check if the genesis already exists - if _, err = os.Stat(genesisPath); os.IsNotExist(err) { - // fetch the information to construct genesis - genesisInformation, err := n.GenesisInformation(cmd.Context(), launchID) - if err != nil { - return err - } - - // create the chain into a temp dir - home := filepath.Join(os.TempDir(), "spn/temp", chainLaunch.ChainID) - defer os.RemoveAll(home) - - c.SetHome(home) - - err = c.Prepare(cmd.Context(), genesisInformation) - if err != nil { - return err - } - - // get the new genesis path - genesisPath, err = c.GenesisPath() - if err != nil { - return err - } - } - - if err := os.MkdirAll(filepath.Dir(out), 0744); err != nil { - return err - } - - if err := os.Rename(genesisPath, out); err != nil { - return err - } - fmt.Printf("%s Genesis generated: %s\n", icons.Bullet, out) - - return nil - }, - } - - c.Flags().String(flagOut, "./genesis.json", "Path to output Genesis file") - - return c -} - -func newNetworkChainShowAccounts() *cobra.Command { - c := &cobra.Command{ - Use: "accounts [launch-id]", - Short: "Show all vesting and genesis accounts of the chain", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - nb, launchID, err := networkChainLaunch(cmd, args) - if err != nil { - return err - } - //defer nb.Cleanup() - n, err := nb.Network() - if err != nil { - return err - } - - accountSummary := &bytes.Buffer{} - - // get all chain genesis accounts - genesisAccs, err := n.GenesisAccounts(cmd.Context(), launchID) - if err != nil { - return err - } - genesisAccEntries := make([][]string, 0) - for _, acc := range genesisAccs { - genesisAccEntries = append(genesisAccEntries, []string{ - acc.Address, - acc.Coins, - }) - } - if len(genesisAccEntries) > 0 { - if err = entrywriter.MustWrite( - accountSummary, - chainGenesisAccSummaryHeader, - genesisAccEntries..., - ); err != nil { - return err - } - } - - // get all chain vesting accounts - vestingAccs, err := n.VestingAccounts(cmd.Context(), launchID) - if err != nil { - return err - } - genesisVestingAccEntries := make([][]string, 0) - for _, acc := range vestingAccs { - genesisVestingAccEntries = append(genesisVestingAccEntries, []string{ - acc.Address, - acc.TotalBalance, - acc.Vesting, - strconv.FormatInt(acc.EndTime, 10), - }) - } - if len(genesisVestingAccEntries) > 0 { - if err = entrywriter.MustWrite( - accountSummary, - chainVestingAccSummaryHeader, - genesisVestingAccEntries..., - ); err != nil { - return err - } - } - nb.Spinner.Stop() - if accountSummary.Len() > 0 { - fmt.Print(accountSummary.String()) - } else { - fmt.Printf("%s %s\n", icons.Info, "empty chain account list") - } - return nil - }, - } - return c -} - -func newNetworkChainShowValidators() *cobra.Command { - c := &cobra.Command{ - Use: "validators [launch-id]", - Short: "Show all validators of the chain", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - nb, launchID, err := networkChainLaunch(cmd, args) - if err != nil { - return err - } - //defer nb.Cleanup() - n, err := nb.Network() - if err != nil { - return err - } - - validatorSummary := bytes.NewBufferString("") - validators, err := n.GenesisValidators(cmd.Context(), launchID) - if err != nil { - return err - } - validatorEntries := make([][]string, 0) - for _, acc := range validators { - peer, err := network.PeerAddress(acc.Peer) - if err != nil { - return err - } - validatorEntries = append(validatorEntries, []string{ - acc.Address, - acc.SelfDelegation.String(), - peer, - }) - } - nb.Spinner.Stop() - if len(validatorEntries) > 0 { - if err = entrywriter.MustWrite( - validatorSummary, - chainGenesisValSummaryHeader, - validatorEntries..., - ); err != nil { - return err - } - fmt.Print(validatorSummary.String()) - } else { - fmt.Printf("%s %s\n", icons.Info, "no account found") - } - return nil - }, - } - return c -} - -func newNetworkChainShowPeers() *cobra.Command { - c := &cobra.Command{ - Use: "peers [launch-id]", - Short: "Show peers list of the chain", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - out, _ := cmd.Flags().GetString(flagOut) - - nb, launchID, err := networkChainLaunch(cmd, args) - if err != nil { - return err - } - //defer nb.Cleanup() - - n, err := nb.Network() - if err != nil { - return err - } - - genVals, err := n.GenesisValidators(cmd.Context(), launchID) - if err != nil { - return err - } - - peers := make([]string, 0) - for _, acc := range genVals { - peer, err := network.PeerAddress(acc.Peer) - if err != nil { - return err - } - peers = append(peers, peer) - } - nb.Spinner.Stop() - - if len(peers) == 0 { - fmt.Printf("%s %s\n", icons.Info, "no peers found") - return nil - - } - - if err := os.MkdirAll(filepath.Dir(out), 0744); err != nil { - return err - } - - b := &bytes.Buffer{} - peerList := strings.Join(peers, ",") - fmt.Fprintln(b, peerList) - if err := os.WriteFile(out, b.Bytes(), 0644); err != nil { - return err - } - - fmt.Printf("%s Peer list generated: %s\n", icons.Bullet, out) - return nil - }, - } - - c.Flags().String(flagOut, "./peers.txt", "Path to output peers list") - - return c -} diff --git a/ignite/cmd/network_chain_show_accounts.go b/ignite/cmd/network_chain_show_accounts.go new file mode 100644 index 0000000000..8dcfe459b0 --- /dev/null +++ b/ignite/cmd/network_chain_show_accounts.go @@ -0,0 +1,78 @@ +package ignitecmd + +import ( + "strconv" + + "github.com/ignite-hq/cli/ignite/pkg/cliui" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" + "github.com/spf13/cobra" +) + +func newNetworkChainShowAccounts() *cobra.Command { + c := &cobra.Command{ + Use: "accounts [launch-id]", + Short: "Show all vesting and genesis accounts of the chain", + Args: cobra.ExactArgs(1), + RunE: networkChainShowAccountsHandler, + } + + return c +} + +func networkChainShowAccountsHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + + nb, launchID, err := networkChainLaunch(cmd, args, session) + if err != nil { + return err + } + n, err := nb.Network() + if err != nil { + return err + } + + // get all chain genesis accounts + genesisAccs, err := n.GenesisAccounts(cmd.Context(), launchID) + if err != nil { + return err + } + genesisAccEntries := make([][]string, 0) + for _, acc := range genesisAccs { + genesisAccEntries = append(genesisAccEntries, []string{ + acc.Address, + acc.Coins, + }) + } + if len(genesisAccEntries) > 0 { + if err = session.PrintTable(chainGenesisAccSummaryHeader, genesisAccEntries...); err != nil { + return err + } + } + + // get all chain vesting accounts + vestingAccs, err := n.VestingAccounts(cmd.Context(), launchID) + if err != nil { + return err + } + genesisVestingAccEntries := make([][]string, 0) + for _, acc := range vestingAccs { + genesisVestingAccEntries = append(genesisVestingAccEntries, []string{ + acc.Address, + acc.TotalBalance, + acc.Vesting, + strconv.FormatInt(acc.EndTime, 10), + }) + } + if len(genesisVestingAccEntries) > 0 { + if err = session.PrintTable(chainVestingAccSummaryHeader, genesisVestingAccEntries...); err != nil { + return err + } + } + + if len(genesisVestingAccEntries)+len(genesisAccEntries) == 0 { + return session.Printf("%s %s\n", icons.Info, "empty chain account list") + } + + return nil +} diff --git a/ignite/cmd/network_chain_show_genesis.go b/ignite/cmd/network_chain_show_genesis.go new file mode 100644 index 0000000000..26b4a4cc03 --- /dev/null +++ b/ignite/cmd/network_chain_show_genesis.go @@ -0,0 +1,91 @@ +package ignitecmd + +import ( + "os" + "path/filepath" + + "github.com/ignite-hq/cli/ignite/pkg/cliui" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" + "github.com/ignite-hq/cli/ignite/services/network/networkchain" + "github.com/spf13/cobra" +) + +func newNetworkChainShowGenesis() *cobra.Command { + c := &cobra.Command{ + Use: "genesis [launch-id]", + Short: "Show the chain genesis file", + Args: cobra.ExactArgs(1), + RunE: networkChainShowGenesisHandler, + } + + c.Flags().String(flagOut, "./genesis.json", "Path to output Genesis file") + + return c +} + +func networkChainShowGenesisHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + + out, _ := cmd.Flags().GetString(flagOut) + + nb, launchID, err := networkChainLaunch(cmd, args, session) + if err != nil { + return err + } + n, err := nb.Network() + if err != nil { + return err + } + + chainLaunch, err := n.ChainLaunch(cmd.Context(), launchID) + if err != nil { + return err + } + + c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch)) + if err != nil { + return err + } + + genesisPath, err := c.GenesisPath() + if err != nil { + return err + } + + // check if the genesis already exists + if _, err = os.Stat(genesisPath); os.IsNotExist(err) { + // fetch the information to construct genesis + genesisInformation, err := n.GenesisInformation(cmd.Context(), launchID) + if err != nil { + return err + } + + // create the chain in a temp dir + home := filepath.Join(os.TempDir(), "spn/temp", chainLaunch.ChainID) + defer os.RemoveAll(home) + + c.SetHome(home) + + err = c.Prepare(cmd.Context(), genesisInformation) + if err != nil { + return err + } + + // get the new genesis path + genesisPath, err = c.GenesisPath() + if err != nil { + return err + } + } + + if err := os.MkdirAll(filepath.Dir(out), 0744); err != nil { + return err + } + + if err := os.Rename(genesisPath, out); err != nil { + return err + } + + return session.Printf("%s Genesis generated: %s\n", icons.Bullet, out) +} diff --git a/ignite/cmd/network_chain_show_info.go b/ignite/cmd/network_chain_show_info.go new file mode 100644 index 0000000000..ed4beabdd0 --- /dev/null +++ b/ignite/cmd/network_chain_show_info.go @@ -0,0 +1,66 @@ +package ignitecmd + +import ( + "github.com/ignite-hq/cli/ignite/pkg/cliui" + "github.com/ignite-hq/cli/ignite/pkg/cosmosutil" + "github.com/ignite-hq/cli/ignite/pkg/yaml" + "github.com/ignite-hq/cli/ignite/services/network" + "github.com/ignite-hq/cli/ignite/services/network/networktypes" + "github.com/spf13/cobra" +) + +func newNetworkChainShowInfo() *cobra.Command { + c := &cobra.Command{ + Use: "info [launch-id]", + Short: "Show info details of the chain", + Args: cobra.ExactArgs(1), + RunE: networkChainShowInfoHandler, + } + return c +} + +func networkChainShowInfoHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + + nb, launchID, err := networkChainLaunch(cmd, args, session) + if err != nil { + return err + } + n, err := nb.Network() + if err != nil { + return err + } + + chainLaunch, err := n.ChainLaunch(cmd.Context(), launchID) + if err != nil { + return err + } + + reward, err := n.ChainReward(cmd.Context(), launchID) + if err != nil && err != network.ErrObjectNotFound { + return err + } + chainLaunch.Reward = reward.RemainingCoins.String() + + var genesis []byte + if chainLaunch.GenesisURL != "" { + genesis, _, err = cosmosutil.GenesisAndHashFromURL(cmd.Context(), chainLaunch.GenesisURL) + if err != nil { + return err + } + } + chainInfo := struct { + Chain networktypes.ChainLaunch `json:"Chain"` + Genesis []byte `json:"Genesis"` + }{ + Chain: chainLaunch, + Genesis: genesis, + } + info, err := yaml.Marshal(cmd.Context(), chainInfo, "$.Genesis") + if err != nil { + return err + } + + return session.Print(info) +} diff --git a/ignite/cmd/network_chain_show_peers.go b/ignite/cmd/network_chain_show_peers.go new file mode 100644 index 0000000000..76cc1be732 --- /dev/null +++ b/ignite/cmd/network_chain_show_peers.go @@ -0,0 +1,76 @@ +package ignitecmd + +import ( + "bytes" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/ignite-hq/cli/ignite/pkg/cliui" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" + "github.com/ignite-hq/cli/ignite/services/network" + "github.com/spf13/cobra" +) + +func newNetworkChainShowPeers() *cobra.Command { + c := &cobra.Command{ + Use: "peers [launch-id]", + Short: "Show peers list of the chain", + Args: cobra.ExactArgs(1), + RunE: networkChainShowPeersHandler, + } + + c.Flags().String(flagOut, "./peers.txt", "Path to output peers list") + + return c +} + +func networkChainShowPeersHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + + out, _ := cmd.Flags().GetString(flagOut) + + nb, launchID, err := networkChainLaunch(cmd, args, session) + if err != nil { + return err + } + n, err := nb.Network() + if err != nil { + return err + } + + genVals, err := n.GenesisValidators(cmd.Context(), launchID) + if err != nil { + return err + } + + peers := make([]string, 0) + for _, acc := range genVals { + peer, err := network.PeerAddress(acc.Peer) + if err != nil { + return err + } + peers = append(peers, peer) + } + + if len(peers) == 0 { + session.Printf("%s %s\n", icons.Info, "no peers found") + return nil + + } + + if err := os.MkdirAll(filepath.Dir(out), 0744); err != nil { + return err + } + + b := &bytes.Buffer{} + peerList := strings.Join(peers, ",") + fmt.Fprintln(b, peerList) + if err := os.WriteFile(out, b.Bytes(), 0644); err != nil { + return err + } + + return session.Printf("%s Peer list generated: %s\n", icons.Bullet, out) +} diff --git a/ignite/cmd/network_chain_show_validators.go b/ignite/cmd/network_chain_show_validators.go new file mode 100644 index 0000000000..3316fbb1d9 --- /dev/null +++ b/ignite/cmd/network_chain_show_validators.go @@ -0,0 +1,54 @@ +package ignitecmd + +import ( + "github.com/ignite-hq/cli/ignite/pkg/cliui" + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" + "github.com/ignite-hq/cli/ignite/services/network" + "github.com/spf13/cobra" +) + +func newNetworkChainShowValidators() *cobra.Command { + c := &cobra.Command{ + Use: "validators [launch-id]", + Short: "Show all validators of the chain", + Args: cobra.ExactArgs(1), + RunE: networkChainShowValidatorsHandler, + } + return c +} + +func networkChainShowValidatorsHandler(cmd *cobra.Command, args []string) error { + session := cliui.New() + defer session.Cleanup() + + nb, launchID, err := networkChainLaunch(cmd, args, session) + if err != nil { + return err + } + n, err := nb.Network() + if err != nil { + return err + } + + validators, err := n.GenesisValidators(cmd.Context(), launchID) + if err != nil { + return err + } + validatorEntries := make([][]string, 0) + for _, acc := range validators { + peer, err := network.PeerAddress(acc.Peer) + if err != nil { + return err + } + validatorEntries = append(validatorEntries, []string{ + acc.Address, + acc.SelfDelegation.String(), + peer, + }) + } + if len(validatorEntries) > 0 { + return session.PrintTable(chainGenesisValSummaryHeader, validatorEntries...) + } else { + return session.Printf("%s %s\n", icons.Info, "no account found") + } +} diff --git a/ignite/cmd/network_request_approve.go b/ignite/cmd/network_request_approve.go index 90c260d5c9..5a1ab28d76 100644 --- a/ignite/cmd/network_request_approve.go +++ b/ignite/cmd/network_request_approve.go @@ -1,8 +1,7 @@ package ignitecmd import ( - "fmt" - + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/numbers" "github.com/ignite-hq/cli/ignite/services/network" @@ -32,12 +31,13 @@ func NewNetworkRequestApprove() *cobra.Command { } func networkRequestApproveHandler(cmd *cobra.Command, args []string) error { - // initialize network common methods - nb, err := newNetworkBuilder(cmd) + session := cliui.New() + defer session.Cleanup() + + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) @@ -67,7 +67,7 @@ func networkRequestApproveHandler(cmd *cobra.Command, args []string) error { if err := verifyRequest(cmd.Context(), nb, launchID, ids...); err != nil { return errors.Wrap(err, "request(s) not valid") } - fmt.Printf("%s Request(s) %s verified\n", icons.OK, numbers.List(ids, "#")) + session.Printf("%s Request(s) %s verified\n", icons.OK, numbers.List(ids, "#")) } // Submit the approved requests @@ -79,7 +79,5 @@ func networkRequestApproveHandler(cmd *cobra.Command, args []string) error { return err } - nb.Spinner.Stop() - fmt.Printf("%s Request(s) %s approved\n", icons.OK, numbers.List(ids, "#")) - return nil + return session.Printf("%s Request(s) %s approved\n", icons.OK, numbers.List(ids, "#")) } diff --git a/ignite/cmd/network_request_list.go b/ignite/cmd/network_request_list.go index 9357818c61..ee155667d0 100644 --- a/ignite/cmd/network_request_list.go +++ b/ignite/cmd/network_request_list.go @@ -2,10 +2,8 @@ package ignitecmd import ( "fmt" - "io" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/services/network" "github.com/spf13/cobra" launchtypes "github.com/tendermint/spn/x/launch/types" @@ -26,8 +24,10 @@ func NewNetworkRequestList() *cobra.Command { } func networkRequestListHandler(cmd *cobra.Command, args []string) error { - // initialize network common methods - nb, err := newNetworkBuilder(cmd) + session := cliui.New() + defer session.Cleanup() + + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } @@ -48,12 +48,11 @@ func networkRequestListHandler(cmd *cobra.Command, args []string) error { return err } - //nb.Cleanup() - return renderRequestSummaries(requests, os.Stdout) + return renderRequestSummaries(requests, session) } // renderRequestSummaries writes into the provided out, the list of summarized requests -func renderRequestSummaries(requests []launchtypes.Request, out io.Writer) error { +func renderRequestSummaries(requests []launchtypes.Request, session cliui.Session) error { requestEntries := make([][]string, 0) for _, request := range requests { id := fmt.Sprintf("%d", request.RequestID) @@ -105,5 +104,5 @@ func renderRequestSummaries(requests []launchtypes.Request, out io.Writer) error content, }) } - return entrywriter.MustWrite(out, requestSummaryHeader, requestEntries...) + return session.PrintTable(requestSummaryHeader, requestEntries...) } diff --git a/ignite/cmd/network_request_reject.go b/ignite/cmd/network_request_reject.go index 5b6fc24ee1..fd29f2e0f2 100644 --- a/ignite/cmd/network_request_reject.go +++ b/ignite/cmd/network_request_reject.go @@ -1,8 +1,7 @@ package ignitecmd import ( - "fmt" - + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/numbers" "github.com/ignite-hq/cli/ignite/services/network" @@ -26,12 +25,13 @@ func NewNetworkRequestReject() *cobra.Command { } func networkRequestRejectHandler(cmd *cobra.Command, args []string) error { - // initialize network common methods - nb, err := newNetworkBuilder(cmd) + session := cliui.New() + defer session.Cleanup() + + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) @@ -59,7 +59,5 @@ func networkRequestRejectHandler(cmd *cobra.Command, args []string) error { return err } - nb.Spinner.Stop() - fmt.Printf("%s Request(s) %s rejected\n", icons.OK, numbers.List(ids, "#")) - return nil + return session.Printf("%s Request(s) %s rejected\n", icons.OK, numbers.List(ids, "#")) } diff --git a/ignite/cmd/network_request_show.go b/ignite/cmd/network_request_show.go index 1a273c97c4..96dd1527dc 100644 --- a/ignite/cmd/network_request_show.go +++ b/ignite/cmd/network_request_show.go @@ -1,14 +1,13 @@ package ignitecmd import ( - "fmt" "strconv" - "github.com/pkg/errors" - "github.com/spf13/cobra" - + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/yaml" "github.com/ignite-hq/cli/ignite/services/network" + "github.com/pkg/errors" + "github.com/spf13/cobra" ) // NewNetworkRequestShow creates a new request show command to show @@ -24,12 +23,13 @@ func NewNetworkRequestShow() *cobra.Command { } func networkRequestShowHandler(cmd *cobra.Command, args []string) error { - // initialize network common methods - nb, err := newNetworkBuilder(cmd) + session := cliui.New() + defer session.Cleanup() + + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) @@ -63,7 +63,5 @@ func networkRequestShowHandler(cmd *cobra.Command, args []string) error { return err } - nb.Spinner.Stop() - fmt.Println(requestYaml) - return nil + return session.Println(requestYaml) } diff --git a/ignite/cmd/network_request_verify.go b/ignite/cmd/network_request_verify.go index 3003113b5e..83adc80edd 100644 --- a/ignite/cmd/network_request_verify.go +++ b/ignite/cmd/network_request_verify.go @@ -2,10 +2,10 @@ package ignitecmd import ( "context" - "fmt" "os" "github.com/ignite-hq/cli/ignite/pkg/chaincmd" + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/numbers" "github.com/ignite-hq/cli/ignite/services/network" @@ -28,12 +28,13 @@ func NewNetworkRequestVerify() *cobra.Command { } func networkRequestVerifyHandler(cmd *cobra.Command, args []string) error { - // initialize network common methods - nb, err := newNetworkBuilder(cmd) + session := cliui.New() + defer session.Cleanup() + + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) @@ -49,13 +50,11 @@ func networkRequestVerifyHandler(cmd *cobra.Command, args []string) error { // verify the requests if err := verifyRequest(cmd.Context(), nb, launchID, ids...); err != nil { - fmt.Printf("%s Request(s) %s not valid\n", icons.NotOK, numbers.List(ids, "#")) + session.Printf("%s Request(s) %s not valid\n", icons.NotOK, numbers.List(ids, "#")) return err } - nb.Spinner.Stop() - fmt.Printf("%s Request(s) %s verified\n", icons.OK, numbers.List(ids, "#")) - return nil + return session.Printf("%s Request(s) %s verified\n", icons.OK, numbers.List(ids, "#")) } // verifyRequest initialize the chain from the launch ID in a temporary directory diff --git a/ignite/cmd/network_reward_set.go b/ignite/cmd/network_reward_set.go index 462fface16..128ac861f0 100644 --- a/ignite/cmd/network_reward_set.go +++ b/ignite/cmd/network_reward_set.go @@ -5,9 +5,9 @@ import ( "strconv" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/spf13/cobra" - + "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/services/network" + "github.com/spf13/cobra" ) // NewNetworkRewardSet creates a new chain reward set command to @@ -26,11 +26,13 @@ func NewNetworkRewardSet() *cobra.Command { } func networkChainRewardSetHandler(cmd *cobra.Command, args []string) error { - nb, err := newNetworkBuilder(cmd) + session := cliui.New() + defer session.Cleanup() + + nb, err := newNetworkBuilder(cmd, CollectEvents(session.EventBus())) if err != nil { return err } - //defer nb.Cleanup() // parse launch ID launchID, err := network.ParseID(args[0]) diff --git a/ignite/cmd/relayer_configure.go b/ignite/cmd/relayer_configure.go index d8ff7dbcce..2136e54676 100644 --- a/ignite/cmd/relayer_configure.go +++ b/ignite/cmd/relayer_configure.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/briandowns/spinner" "github.com/gookit/color" @@ -97,7 +98,7 @@ func relayerConfigureHandler(cmd *cobra.Command, args []string) (err error) { return err } - s := clispinner.New().Stop() + s := clispinner.New(os.Stdout).Start() defer s.Stop() printSection("Setting up chains") diff --git a/ignite/cmd/relayer_connect.go b/ignite/cmd/relayer_connect.go index 24585a88c3..b2a2181cfb 100644 --- a/ignite/cmd/relayer_connect.go +++ b/ignite/cmd/relayer_connect.go @@ -44,7 +44,7 @@ func relayerConnectHandler(cmd *cobra.Command, args []string) (err error) { ids := args - s := clispinner.New() + s := clispinner.New(os.Stdout) defer s.Stop() var use []string diff --git a/ignite/cmd/scaffold.go b/ignite/cmd/scaffold.go index d91664e2a3..a8c24ad0c3 100644 --- a/ignite/cmd/scaffold.go +++ b/ignite/cmd/scaffold.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" @@ -82,7 +83,7 @@ func scaffoldType( } } - s := clispinner.New().SetText("Scaffolding...") + s := clispinner.New(os.Stdout).SetText("Scaffolding...") defer s.Stop() sc, err := newApp(appPath) diff --git a/ignite/cmd/scaffold_band.go b/ignite/cmd/scaffold_band.go index 2490c588f8..ac2dfa33d9 100644 --- a/ignite/cmd/scaffold_band.go +++ b/ignite/cmd/scaffold_band.go @@ -3,6 +3,7 @@ package ignitecmd import ( "errors" "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" @@ -34,7 +35,7 @@ func createBandchainHandler(cmd *cobra.Command, args []string) error { signer = flagGetSigner(cmd) ) - s := clispinner.New().SetText("Scaffolding...") + s := clispinner.New(os.Stdout).SetText("Scaffolding...") defer s.Stop() module, err := cmd.Flags().GetString(flagModule) diff --git a/ignite/cmd/scaffold_chain.go b/ignite/cmd/scaffold_chain.go index 0486eccb7f..278c9228f6 100644 --- a/ignite/cmd/scaffold_chain.go +++ b/ignite/cmd/scaffold_chain.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" @@ -31,7 +32,7 @@ func NewScaffoldChain() *cobra.Command { } func scaffoldChainHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New().SetText("Scaffolding...") + s := clispinner.New(os.Stdout).SetText("Scaffolding...") defer s.Stop() var ( diff --git a/ignite/cmd/scaffold_flutter.go b/ignite/cmd/scaffold_flutter.go index 4cd3dd4f18..6fc737cd4b 100644 --- a/ignite/cmd/scaffold_flutter.go +++ b/ignite/cmd/scaffold_flutter.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/scaffolder" @@ -23,7 +24,7 @@ func NewScaffoldFlutter() *cobra.Command { } func scaffoldFlutterHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New().SetText("Scaffolding...") + s := clispinner.New(os.Stdout).SetText("Scaffolding...") defer s.Stop() path := flagGetPath(cmd) diff --git a/ignite/cmd/scaffold_message.go b/ignite/cmd/scaffold_message.go index cac5d1bbeb..e4823c5656 100644 --- a/ignite/cmd/scaffold_message.go +++ b/ignite/cmd/scaffold_message.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" @@ -40,7 +41,7 @@ func messageHandler(cmd *cobra.Command, args []string) error { withoutSimulation = flagGetNoSimulation(cmd) ) - s := clispinner.New().SetText("Scaffolding...") + s := clispinner.New(os.Stdout).SetText("Scaffolding...") defer s.Stop() var options []scaffolder.MessageOption diff --git a/ignite/cmd/scaffold_module.go b/ignite/cmd/scaffold_module.go index 822fbadf47..ec8f7a756f 100644 --- a/ignite/cmd/scaffold_module.go +++ b/ignite/cmd/scaffold_module.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "io" + "os" "strings" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" @@ -48,7 +49,7 @@ func scaffoldModuleHandler(cmd *cobra.Command, args []string) error { name = args[0] appPath = flagGetPath(cmd) ) - s := clispinner.New().SetText("Scaffolding...") + s := clispinner.New(os.Stdout).SetText("Scaffolding...") defer s.Stop() ibcModule, err := cmd.Flags().GetBool(flagIBC) diff --git a/ignite/cmd/scaffold_mwasm.go b/ignite/cmd/scaffold_mwasm.go index ca352de94e..1409e47852 100644 --- a/ignite/cmd/scaffold_mwasm.go +++ b/ignite/cmd/scaffold_mwasm.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" @@ -25,7 +26,7 @@ func NewScaffoldWasm() *cobra.Command { func scaffoldWasmHandler(cmd *cobra.Command, args []string) error { appPath := flagGetPath(cmd) - s := clispinner.New().SetText("Scaffolding...") + s := clispinner.New(os.Stdout).SetText("Scaffolding...") defer s.Stop() sc, err := newApp(appPath) diff --git a/ignite/cmd/scaffold_package.go b/ignite/cmd/scaffold_package.go index 71ddeb2bd9..db7497a699 100644 --- a/ignite/cmd/scaffold_package.go +++ b/ignite/cmd/scaffold_package.go @@ -3,6 +3,7 @@ package ignitecmd import ( "errors" "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" @@ -34,7 +35,7 @@ func NewScaffoldPacket() *cobra.Command { } func createPacketHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New().SetText("Scaffolding...") + s := clispinner.New(os.Stdout).SetText("Scaffolding...") defer s.Stop() var ( diff --git a/ignite/cmd/scaffold_query.go b/ignite/cmd/scaffold_query.go index 960cfd9a59..ea59d3731f 100644 --- a/ignite/cmd/scaffold_query.go +++ b/ignite/cmd/scaffold_query.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" @@ -33,7 +34,7 @@ func NewScaffoldQuery() *cobra.Command { func queryHandler(cmd *cobra.Command, args []string) error { appPath := flagGetPath(cmd) - s := clispinner.New().SetText("Scaffolding...") + s := clispinner.New(os.Stdout).SetText("Scaffolding...") defer s.Stop() // Get the module to add the type into diff --git a/ignite/cmd/scaffold_vue.go b/ignite/cmd/scaffold_vue.go index 86fead2317..fec9597f68 100644 --- a/ignite/cmd/scaffold_vue.go +++ b/ignite/cmd/scaffold_vue.go @@ -2,6 +2,7 @@ package ignitecmd import ( "fmt" + "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/scaffolder" @@ -23,7 +24,7 @@ func NewScaffoldVue() *cobra.Command { } func scaffoldVueHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New().SetText("Scaffolding...") + s := clispinner.New(os.Stdout).SetText("Scaffolding...") defer s.Stop() path := flagGetPath(cmd) diff --git a/ignite/pkg/cliui/clispinner/clispinner.go b/ignite/pkg/cliui/clispinner/clispinner.go index b28065265d..2ccb437602 100644 --- a/ignite/pkg/cliui/clispinner/clispinner.go +++ b/ignite/pkg/cliui/clispinner/clispinner.go @@ -1,6 +1,7 @@ package clispinner import ( + "io" "time" "github.com/briandowns/spinner" @@ -17,8 +18,8 @@ type Spinner struct { } // New creates a new spinner. -func New() *Spinner { - sp := spinner.New(charset, refreshRate) +func New(w io.Writer) *Spinner { + sp := spinner.New(charset, refreshRate, spinner.WithWriter(w)) sp.Color(spinnerColor) s := &Spinner{ sp: sp, @@ -69,3 +70,7 @@ func (s *Spinner) Stop() *Spinner { s.sp.Stop() return s } + +func (s *Spinner) IsActive() bool { + return s.sp.Active() +} diff --git a/ignite/pkg/cliui/cliui.go b/ignite/pkg/cliui/cliui.go index 6732aa5268..5cca096cae 100644 --- a/ignite/pkg/cliui/cliui.go +++ b/ignite/pkg/cliui/cliui.go @@ -1,9 +1,7 @@ package cliui import ( - "errors" "fmt" - "github.com/manifoldco/promptui" "io" "os" "sync" @@ -13,14 +11,15 @@ import ( "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/events" + "github.com/manifoldco/promptui" ) +// Session controls command line interaction with users. type Session struct { - ev *events.Bus + ev events.Bus eventsWg *sync.WaitGroup - spinner *clispinner.Spinner - spinnerWasPaused bool + spinner *clispinner.Spinner in io.Reader out io.Writer @@ -29,22 +28,24 @@ type Session struct { type Option func(s *Session) +// WithOutput sets output stream for a session. func WithOutput(output io.Writer) Option { return func(s *Session) { s.out = output } } +// WithInput sets input stream for a session. func WithInput(input io.Reader) Option { return func(s *Session) { s.in = input } } +// New creates new Session. func New(options ...Option) Session { wg := &sync.WaitGroup{} session := Session{ - spinner: clispinner.New(), ev: events.NewBus(events.WithWaitGroup(wg)), in: os.Stdin, out: os.Stdout, @@ -54,66 +55,74 @@ func New(options ...Option) Session { for _, apply := range options { apply(&session) } + session.spinner = clispinner.New(session.out) session.printLoopWg.Add(1) go session.printLoop() return session } -func (s Session) EventBus() *events.Bus { +// StopSpinner returns session's event bus. +func (s Session) EventBus() events.Bus { return s.ev } +// StartSpinner starts spinner. func (s Session) StartSpinner(text string) { s.spinner.SetText(text).Start() } +// StopSpinner stops spinner. func (s Session) StopSpinner() { - s.spinnerWasPaused = false - s.spinner.Stop() -} - -func (s Session) PauseSpinner() { s.spinner.Stop() - s.spinnerWasPaused = true } -func (s Session) UnpauseSpinner() { - if s.spinnerWasPaused { - s.spinner.Start() - s.spinnerWasPaused = false +// PauseSpinner pauses spinner, returns resume function to start paused spinner again. +func (s Session) PauseSpinner() func() { + isActive := s.spinner.IsActive() + f := func() { + if isActive { + s.spinner.Start() + } } + s.spinner.Stop() + return f } +// Printf prints formatted arbitrary message. func (s Session) Printf(format string, a ...interface{}) error { - s.eventsWg.Wait() - s.PauseSpinner() - defer s.UnpauseSpinner() + s.Wait() + defer s.PauseSpinner()() _, err := fmt.Fprintf(s.out, format, a...) return err } +// Println prints arbitrary message with line break. func (s Session) Println(messages ...interface{}) error { - s.eventsWg.Wait() - s.PauseSpinner() - defer s.UnpauseSpinner() + s.Wait() + defer s.PauseSpinner()() _, err := fmt.Fprintln(s.out, messages...) return err } +// Println prints arbitrary message +func (s Session) Print(messages ...interface{}) error { + s.Wait() + defer s.PauseSpinner()() + _, err := fmt.Fprint(s.out, messages...) + return err +} + +// Ask asks questions in the terminal and collect answers. func (s Session) Ask(questions ...cliquiz.Question) error { - s.eventsWg.Wait() - s.PauseSpinner() - defer s.UnpauseSpinner() - if s.in != os.Stdin && s.out != os.Stdout { - return errors.New("cannot use quiz with customized io") - } + s.Wait() + defer s.PauseSpinner()() return cliquiz.Ask(questions...) } +// AskConfirm asks yes/no question in the terminal. func (s Session) AskConfirm(message string) error { - s.eventsWg.Wait() - s.PauseSpinner() - defer s.UnpauseSpinner() + s.Wait() + defer s.PauseSpinner()() prompt := promptui.Prompt{ Label: message, IsConfirm: true, @@ -122,38 +131,43 @@ func (s Session) AskConfirm(message string) error { return err } -func (s Session) Table(header []string, entries ...[]string) error { - s.eventsWg.Wait() - s.PauseSpinner() - defer s.UnpauseSpinner() +// PrintTable prints table data. +func (s Session) PrintTable(header []string, entries ...[]string) error { + s.Wait() + defer s.PauseSpinner()() return entrywriter.MustWrite(s.out, header, entries...) } +// Wait blocks until all queued events are handled. func (s Session) Wait() { s.eventsWg.Wait() } +// Cleanup ensure spinner is stopped and printLoop exited correctly. func (s Session) Cleanup() { s.StopSpinner() s.ev.Shutdown() s.printLoopWg.Wait() } +// printLoop handles events. func (s Session) printLoop() { for event := range s.ev.Events() { switch event.Status { case events.StatusOngoing: s.StartSpinner(event.Text()) + case events.StatusDone: if event.Icon == "" { event.Icon = icons.OK } s.StopSpinner() fmt.Fprintf(s.out, "%s %s\n", event.Icon, event.Text()) + case events.StatusNeutral: - s.PauseSpinner() + resume := s.PauseSpinner() fmt.Fprintf(s.out, event.Text()) - s.UnpauseSpinner() + resume() } s.eventsWg.Done() diff --git a/ignite/pkg/events/events.go b/ignite/pkg/events/events.go index b19216e602..af0d31a089 100644 --- a/ignite/pkg/events/events.go +++ b/ignite/pkg/events/events.go @@ -45,7 +45,7 @@ func TextColor(c color.Color) Option { } } -// Icon sets the text icon prefix +// Icon sets the text icon prefix. func Icon(icon string) Option { return func(e *Event) { e.Icon = icon @@ -61,17 +61,17 @@ func New(status Status, description string, options ...Option) Event { return ev } -// NewOngoing creates a new StatusOngoing event +// NewOngoing creates a new StatusOngoing event. func NewOngoing(description string) Event { return New(StatusOngoing, description) } -// NewNeutral creates a new StatusNeutral event +// NewNeutral creates a new StatusNeutral event. func NewNeutral(description string) Event { return New(StatusNeutral, description) } -// NewDone creates a new StatusDone event +// NewDone creates a new StatusDone event. func NewDone(description, icon string) Event { return New(StatusDone, description, Icon(icon)) } @@ -100,6 +100,7 @@ type ( BusOption func(*Bus) ) +// WithWaitGroup sets wait group which is blocked if events bus is not empty. func WithWaitGroup(wg *sync.WaitGroup) BusOption { return func(bus *Bus) { bus.buswg = wg @@ -107,21 +108,21 @@ func WithWaitGroup(wg *sync.WaitGroup) BusOption { } // NewBus creates a new event bus to send/receive events. -func NewBus(options ...BusOption) *Bus { - bus := &Bus{ +func NewBus(options ...BusOption) Bus { + bus := Bus{ evchan: make(chan Event), } for _, apply := range options { - apply(bus) + apply(&bus) } return bus } // Send sends a new event to bus. -func (b *Bus) Send(e Event) { - if b == nil || b.evchan == nil { +func (b Bus) Send(e Event) { + if b.evchan == nil { return } if b.buswg != nil { @@ -130,12 +131,13 @@ func (b *Bus) Send(e Event) { b.evchan <- e } +// Events returns go channel with Event accessible only for read. func (b *Bus) Events() <-chan Event { return b.evchan } // Shutdown shutdowns event bus. -func (b *Bus) Shutdown() { +func (b Bus) Shutdown() { if b.evchan == nil { return } diff --git a/ignite/services/network/network.go b/ignite/services/network/network.go index a9a6dbc9bf..2384a49d7b 100644 --- a/ignite/services/network/network.go +++ b/ignite/services/network/network.go @@ -28,7 +28,7 @@ type CosmosClient interface { // Network is network builder. type Network struct { - ev *events.Bus + ev events.Bus cosmos CosmosClient account cosmosaccount.Account campaignQuery campaigntypes.QueryClient @@ -81,7 +81,7 @@ func WithRewardQueryClient(client rewardtypes.QueryClient) Option { } // CollectEvents collects events from the network builder. -func CollectEvents(ev *events.Bus) Option { +func CollectEvents(ev events.Bus) Option { return func(n *Network) { n.ev = ev } diff --git a/ignite/services/network/networkchain/networkchain.go b/ignite/services/network/networkchain/networkchain.go index e62db313d7..29ea288162 100644 --- a/ignite/services/network/networkchain/networkchain.go +++ b/ignite/services/network/networkchain/networkchain.go @@ -41,7 +41,7 @@ type Chain struct { ref plumbing.ReferenceName chain *chain.Chain - ev *events.Bus + ev events.Bus ar cosmosaccount.Registry } @@ -118,7 +118,7 @@ func WithGenesisFromURL(genesisURL string) Option { } // CollectEvents collects events from the chain. -func CollectEvents(ev *events.Bus) Option { +func CollectEvents(ev events.Bus) Option { return func(c *Chain) { c.ev = ev } From bc2c03b64c44f049afa64266750bf67dae62d78e Mon Sep 17 00:00:00 2001 From: Petr Ivanov Date: Wed, 27 Apr 2022 14:01:54 +0400 Subject: [PATCH 03/10] fix lint --- ignite/cmd/cmd.go | 23 --------------------- ignite/cmd/network_chain_publish.go | 3 ++- ignite/cmd/network_chain_show_validators.go | 6 +++--- ignite/services/network/reward.go | 5 ++--- 4 files changed, 7 insertions(+), 30 deletions(-) diff --git a/ignite/cmd/cmd.go b/ignite/cmd/cmd.go index e180c4328f..1e37ef9e88 100644 --- a/ignite/cmd/cmd.go +++ b/ignite/cmd/cmd.go @@ -7,15 +7,11 @@ import ( "path/filepath" "sort" "strings" - "sync" "time" "github.com/fatih/color" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" - "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" "github.com/ignite-hq/cli/ignite/pkg/cosmosver" - "github.com/ignite-hq/cli/ignite/pkg/events" "github.com/ignite-hq/cli/ignite/pkg/gitpod" "github.com/ignite-hq/cli/ignite/pkg/goenv" "github.com/ignite-hq/cli/ignite/pkg/xgenny" @@ -82,25 +78,6 @@ func logLevel(cmd *cobra.Command) chain.LogLvl { return chain.LogRegular } -func printEvents(wg *sync.WaitGroup, bus *events.Bus, s *clispinner.Spinner) { - defer wg.Done() - - for event := range bus.Events() { - switch event.Status { - case events.StatusOngoing: - s.SetText(event.Text()) - s.Start() - case events.StatusDone: - icon := event.Icon - if icon == "" { - icon = icons.OK - } - s.Stop() - fmt.Printf("%s %s\n", icon, event.Text()) - } - } -} - func flagSetPath(cmd *cobra.Command) { cmd.PersistentFlags().StringP(flagPath, "p", ".", "path of the app") } diff --git a/ignite/cmd/network_chain_publish.go b/ignite/cmd/network_chain_publish.go index ce230d6770..03567f3b32 100644 --- a/ignite/cmd/network_chain_publish.go +++ b/ignite/cmd/network_chain_publish.go @@ -2,6 +2,8 @@ package ignitecmd import ( "fmt" + "os" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" @@ -11,7 +13,6 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/tendermint/spn/pkg/chainid" - "os" ) const ( diff --git a/ignite/cmd/network_chain_show_validators.go b/ignite/cmd/network_chain_show_validators.go index 3316fbb1d9..b17a918c26 100644 --- a/ignite/cmd/network_chain_show_validators.go +++ b/ignite/cmd/network_chain_show_validators.go @@ -46,9 +46,9 @@ func networkChainShowValidatorsHandler(cmd *cobra.Command, args []string) error peer, }) } - if len(validatorEntries) > 0 { - return session.PrintTable(chainGenesisValSummaryHeader, validatorEntries...) - } else { + if len(validatorEntries) == 0 { return session.Printf("%s %s\n", icons.Info, "no account found") } + + return session.PrintTable(chainGenesisValSummaryHeader, validatorEntries...) } diff --git a/ignite/services/network/reward.go b/ignite/services/network/reward.go index 29daecb27c..9e96cf4086 100644 --- a/ignite/services/network/reward.go +++ b/ignite/services/network/reward.go @@ -2,13 +2,12 @@ package network import ( "fmt" - "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" sdk "github.com/cosmos/cosmos-sdk/types" - rewardtypes "github.com/tendermint/spn/x/reward/types" - + "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/events" "github.com/ignite-hq/cli/ignite/services/network/networktypes" + rewardtypes "github.com/tendermint/spn/x/reward/types" ) // SetReward set a chain reward From af3621d5b2f7fa1d72b058ca386bfae708577b58 Mon Sep 17 00:00:00 2001 From: Petr Ivanov Date: Wed, 27 Apr 2022 14:11:04 +0400 Subject: [PATCH 04/10] configure bus channel size with option --- ignite/pkg/events/events.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ignite/pkg/events/events.go b/ignite/pkg/events/events.go index af0d31a089..86ad5cae52 100644 --- a/ignite/pkg/events/events.go +++ b/ignite/pkg/events/events.go @@ -107,6 +107,13 @@ func WithWaitGroup(wg *sync.WaitGroup) BusOption { } } +// WithCustomBufferSize configures buffer size of underlying bus channel +func WithCustomBufferSize(size int) BusOption { + return func(bus *Bus) { + bus.evchan = make(chan Event, size) + } +} + // NewBus creates a new event bus to send/receive events. func NewBus(options ...BusOption) Bus { bus := Bus{ From 1d0a54e1a33a68096ab116e35e1a8e809496f583 Mon Sep 17 00:00:00 2001 From: Petr Ivanov Date: Wed, 27 Apr 2022 14:34:12 +0400 Subject: [PATCH 05/10] fix events tests --- ignite/pkg/events/events_test.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/ignite/pkg/events/events_test.go b/ignite/pkg/events/events_test.go index c8e18cde9f..99bca73ccd 100644 --- a/ignite/pkg/events/events_test.go +++ b/ignite/pkg/events/events_test.go @@ -15,7 +15,7 @@ func TestBusSend(t *testing.T) { }{ { name: "send status ongoing event", - bus: make(Bus), + bus: Bus{evchan: make(chan Event)}, event: Event{ Status: StatusOngoing, Description: "description", @@ -23,15 +23,23 @@ func TestBusSend(t *testing.T) { }, { name: "send status done event", - bus: make(Bus), + bus: Bus{evchan: make(chan Event)}, event: Event{ Status: StatusDone, Description: "description", }, }, + { + name: "send status neutral event", + bus: Bus{evchan: make(chan Event)}, + event: Event{ + Status: StatusNeutral, + Description: "description", + }, + }, { name: "send event on nil bus", - bus: nil, + bus: Bus{}, event: Event{ Status: StatusDone, Description: "description", @@ -41,8 +49,8 @@ func TestBusSend(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { go tt.bus.Send(tt.event) - if tt.bus != nil { - require.Equal(t, tt.event, <-tt.bus) + if tt.bus.Events() != nil { + require.Equal(t, tt.event, <-tt.bus.Events()) } tt.bus.Shutdown() }) @@ -56,15 +64,15 @@ func TestBusShutdown(t *testing.T) { }{ { name: "shutdown nil bus", - bus: nil, + bus: Bus{}, }, { name: "shutdown bus correctly", - bus: make(Bus), + bus: Bus{evchan: make(chan Event)}, }, { name: "shutdown bus with size correctly", - bus: make(Bus, 1), + bus: Bus{evchan: make(chan Event, 1)}, }, } for _, tt := range tests { @@ -186,7 +194,7 @@ func TestNewBus(t *testing.T) { defer bus.Shutdown() for i := 0; i < 10; i++ { go bus.Send(tt.event) - require.Equal(t, tt.event, <-bus) + require.Equal(t, tt.event, <-bus.Events()) } }) } From 292ae1c4636e42700795a59b3a320767b14feeb3 Mon Sep 17 00:00:00 2001 From: Petr Ivanov Date: Wed, 27 Apr 2022 16:33:33 +0400 Subject: [PATCH 06/10] add spinner options --- ignite/cmd/generate_dart.go | 3 +- ignite/cmd/generate_go.go | 4 +- ignite/cmd/generate_openapi.go | 4 +- ignite/cmd/generate_vuex.go | 3 +- ignite/cmd/relayer_configure.go | 4 +- ignite/cmd/relayer_connect.go | 2 +- ignite/cmd/scaffold.go | 4 +- ignite/cmd/scaffold_band.go | 4 +- ignite/cmd/scaffold_chain.go | 4 +- ignite/cmd/scaffold_flutter.go | 4 +- ignite/cmd/scaffold_message.go | 4 +- ignite/cmd/scaffold_module.go | 3 +- ignite/cmd/scaffold_mwasm.go | 4 +- ignite/cmd/scaffold_package.go | 4 +- ignite/cmd/scaffold_query.go | 4 +- ignite/cmd/scaffold_vue.go | 4 +- ignite/pkg/cliui/clispinner/clispinner.go | 30 +++++++- ignite/pkg/cliui/cliui.go | 2 +- ignite/pkg/events/events.go | 3 - ignite/pkg/events/events_test.go | 85 ++++++++++------------- 20 files changed, 82 insertions(+), 97 deletions(-) diff --git a/ignite/cmd/generate_dart.go b/ignite/cmd/generate_dart.go index e8970ff0cd..9379a2e7e1 100644 --- a/ignite/cmd/generate_dart.go +++ b/ignite/cmd/generate_dart.go @@ -2,7 +2,6 @@ package ignitecmd import ( "fmt" - "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" @@ -19,7 +18,7 @@ func NewGenerateDart() *cobra.Command { } func generateDartHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New(os.Stdout).SetText("Generating...") + s := clispinner.New().SetText("Generating...") defer s.Stop() c, err := newChainWithHomeFlags(cmd, chain.EnableThirdPartyModuleCodegen()) diff --git a/ignite/cmd/generate_go.go b/ignite/cmd/generate_go.go index 120db1af4b..2284751baf 100644 --- a/ignite/cmd/generate_go.go +++ b/ignite/cmd/generate_go.go @@ -2,8 +2,6 @@ package ignitecmd import ( "fmt" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" "github.com/spf13/cobra" @@ -18,7 +16,7 @@ func NewGenerateGo() *cobra.Command { } func generateGoHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New(os.Stdout).SetText("Generating...") + s := clispinner.New().SetText("Generating...") defer s.Stop() c, err := newChainWithHomeFlags(cmd) diff --git a/ignite/cmd/generate_openapi.go b/ignite/cmd/generate_openapi.go index f534b436e3..643f81579f 100644 --- a/ignite/cmd/generate_openapi.go +++ b/ignite/cmd/generate_openapi.go @@ -2,8 +2,6 @@ package ignitecmd import ( "fmt" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" "github.com/spf13/cobra" @@ -18,7 +16,7 @@ func NewGenerateOpenAPI() *cobra.Command { } func generateOpenAPIHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New(os.Stdout).SetText("Generating...") + s := clispinner.New().SetText("Generating...") defer s.Stop() c, err := newChainWithHomeFlags(cmd) diff --git a/ignite/cmd/generate_vuex.go b/ignite/cmd/generate_vuex.go index ec91cfbe55..d461a215c5 100644 --- a/ignite/cmd/generate_vuex.go +++ b/ignite/cmd/generate_vuex.go @@ -2,7 +2,6 @@ package ignitecmd import ( "fmt" - "os" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" @@ -20,7 +19,7 @@ func NewGenerateVuex() *cobra.Command { } func generateVuexHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New(os.Stdout).SetText("Generating...") + s := clispinner.New().SetText("Generating...") defer s.Stop() c, err := newChainWithHomeFlags(cmd, chain.EnableThirdPartyModuleCodegen()) diff --git a/ignite/cmd/relayer_configure.go b/ignite/cmd/relayer_configure.go index 2136e54676..a992aade38 100644 --- a/ignite/cmd/relayer_configure.go +++ b/ignite/cmd/relayer_configure.go @@ -2,8 +2,6 @@ package ignitecmd import ( "fmt" - "os" - "github.com/briandowns/spinner" "github.com/gookit/color" "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" @@ -98,7 +96,7 @@ func relayerConfigureHandler(cmd *cobra.Command, args []string) (err error) { return err } - s := clispinner.New(os.Stdout).Start() + s := clispinner.New().Start() defer s.Stop() printSection("Setting up chains") diff --git a/ignite/cmd/relayer_connect.go b/ignite/cmd/relayer_connect.go index b2a2181cfb..24585a88c3 100644 --- a/ignite/cmd/relayer_connect.go +++ b/ignite/cmd/relayer_connect.go @@ -44,7 +44,7 @@ func relayerConnectHandler(cmd *cobra.Command, args []string) (err error) { ids := args - s := clispinner.New(os.Stdout) + s := clispinner.New() defer s.Stop() var use []string diff --git a/ignite/cmd/scaffold.go b/ignite/cmd/scaffold.go index a8c24ad0c3..583659fef4 100644 --- a/ignite/cmd/scaffold.go +++ b/ignite/cmd/scaffold.go @@ -2,8 +2,6 @@ package ignitecmd import ( "fmt" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" @@ -83,7 +81,7 @@ func scaffoldType( } } - s := clispinner.New(os.Stdout).SetText("Scaffolding...") + s := clispinner.New().SetText("Scaffolding...") defer s.Stop() sc, err := newApp(appPath) diff --git a/ignite/cmd/scaffold_band.go b/ignite/cmd/scaffold_band.go index ac2dfa33d9..03b11015bf 100644 --- a/ignite/cmd/scaffold_band.go +++ b/ignite/cmd/scaffold_band.go @@ -3,8 +3,6 @@ package ignitecmd import ( "errors" "fmt" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" @@ -35,7 +33,7 @@ func createBandchainHandler(cmd *cobra.Command, args []string) error { signer = flagGetSigner(cmd) ) - s := clispinner.New(os.Stdout).SetText("Scaffolding...") + s := clispinner.New().SetText("Scaffolding...") defer s.Stop() module, err := cmd.Flags().GetString(flagModule) diff --git a/ignite/cmd/scaffold_chain.go b/ignite/cmd/scaffold_chain.go index 278c9228f6..9b8534f585 100644 --- a/ignite/cmd/scaffold_chain.go +++ b/ignite/cmd/scaffold_chain.go @@ -2,8 +2,6 @@ package ignitecmd import ( "fmt" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" @@ -32,7 +30,7 @@ func NewScaffoldChain() *cobra.Command { } func scaffoldChainHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New(os.Stdout).SetText("Scaffolding...") + s := clispinner.New().SetText("Scaffolding...") defer s.Stop() var ( diff --git a/ignite/cmd/scaffold_flutter.go b/ignite/cmd/scaffold_flutter.go index 6fc737cd4b..bc19d77dbd 100644 --- a/ignite/cmd/scaffold_flutter.go +++ b/ignite/cmd/scaffold_flutter.go @@ -2,8 +2,6 @@ package ignitecmd import ( "fmt" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/scaffolder" "github.com/spf13/cobra" @@ -24,7 +22,7 @@ func NewScaffoldFlutter() *cobra.Command { } func scaffoldFlutterHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New(os.Stdout).SetText("Scaffolding...") + s := clispinner.New().SetText("Scaffolding...") defer s.Stop() path := flagGetPath(cmd) diff --git a/ignite/cmd/scaffold_message.go b/ignite/cmd/scaffold_message.go index e4823c5656..dabc26ea4a 100644 --- a/ignite/cmd/scaffold_message.go +++ b/ignite/cmd/scaffold_message.go @@ -2,8 +2,6 @@ package ignitecmd import ( "fmt" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" @@ -41,7 +39,7 @@ func messageHandler(cmd *cobra.Command, args []string) error { withoutSimulation = flagGetNoSimulation(cmd) ) - s := clispinner.New(os.Stdout).SetText("Scaffolding...") + s := clispinner.New().SetText("Scaffolding...") defer s.Stop() var options []scaffolder.MessageOption diff --git a/ignite/cmd/scaffold_module.go b/ignite/cmd/scaffold_module.go index ec8f7a756f..822fbadf47 100644 --- a/ignite/cmd/scaffold_module.go +++ b/ignite/cmd/scaffold_module.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "io" - "os" "strings" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" @@ -49,7 +48,7 @@ func scaffoldModuleHandler(cmd *cobra.Command, args []string) error { name = args[0] appPath = flagGetPath(cmd) ) - s := clispinner.New(os.Stdout).SetText("Scaffolding...") + s := clispinner.New().SetText("Scaffolding...") defer s.Stop() ibcModule, err := cmd.Flags().GetBool(flagIBC) diff --git a/ignite/cmd/scaffold_mwasm.go b/ignite/cmd/scaffold_mwasm.go index 1409e47852..15bbecddf7 100644 --- a/ignite/cmd/scaffold_mwasm.go +++ b/ignite/cmd/scaffold_mwasm.go @@ -2,8 +2,6 @@ package ignitecmd import ( "fmt" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/spf13/cobra" @@ -26,7 +24,7 @@ func NewScaffoldWasm() *cobra.Command { func scaffoldWasmHandler(cmd *cobra.Command, args []string) error { appPath := flagGetPath(cmd) - s := clispinner.New(os.Stdout).SetText("Scaffolding...") + s := clispinner.New().SetText("Scaffolding...") defer s.Stop() sc, err := newApp(appPath) diff --git a/ignite/cmd/scaffold_package.go b/ignite/cmd/scaffold_package.go index db7497a699..5e5b3733e4 100644 --- a/ignite/cmd/scaffold_package.go +++ b/ignite/cmd/scaffold_package.go @@ -3,8 +3,6 @@ package ignitecmd import ( "errors" "fmt" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" @@ -35,7 +33,7 @@ func NewScaffoldPacket() *cobra.Command { } func createPacketHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New(os.Stdout).SetText("Scaffolding...") + s := clispinner.New().SetText("Scaffolding...") defer s.Stop() var ( diff --git a/ignite/cmd/scaffold_query.go b/ignite/cmd/scaffold_query.go index ea59d3731f..4e4054a8f0 100644 --- a/ignite/cmd/scaffold_query.go +++ b/ignite/cmd/scaffold_query.go @@ -2,8 +2,6 @@ package ignitecmd import ( "fmt" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/spf13/cobra" @@ -34,7 +32,7 @@ func NewScaffoldQuery() *cobra.Command { func queryHandler(cmd *cobra.Command, args []string) error { appPath := flagGetPath(cmd) - s := clispinner.New(os.Stdout).SetText("Scaffolding...") + s := clispinner.New().SetText("Scaffolding...") defer s.Stop() // Get the module to add the type into diff --git a/ignite/cmd/scaffold_vue.go b/ignite/cmd/scaffold_vue.go index fec9597f68..3903e5ea8f 100644 --- a/ignite/cmd/scaffold_vue.go +++ b/ignite/cmd/scaffold_vue.go @@ -2,8 +2,6 @@ package ignitecmd import ( "fmt" - "os" - "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/scaffolder" "github.com/spf13/cobra" @@ -24,7 +22,7 @@ func NewScaffoldVue() *cobra.Command { } func scaffoldVueHandler(cmd *cobra.Command, args []string) error { - s := clispinner.New(os.Stdout).SetText("Scaffolding...") + s := clispinner.New().SetText("Scaffolding...") defer s.Stop() path := flagGetPath(cmd) diff --git a/ignite/pkg/cliui/clispinner/clispinner.go b/ignite/pkg/cliui/clispinner/clispinner.go index 2ccb437602..aa1e6967a9 100644 --- a/ignite/pkg/cliui/clispinner/clispinner.go +++ b/ignite/pkg/cliui/clispinner/clispinner.go @@ -17,9 +17,35 @@ type Spinner struct { sp *spinner.Spinner } +type ( + Option func(*Options) + + Options struct { + writer io.Writer + } +) + +// WithWriter configures an output for a spinner +func WithWriter(w io.Writer) Option { + return func(options *Options) { + options.writer = w + } +} + // New creates a new spinner. -func New(w io.Writer) *Spinner { - sp := spinner.New(charset, refreshRate, spinner.WithWriter(w)) +func New(options ...Option) *Spinner { + o := Options{} + for _, apply := range options { + apply(&o) + } + + underlyingSpinnerOptions := []spinner.Option{} + if o.writer != nil { + underlyingSpinnerOptions = append(underlyingSpinnerOptions, spinner.WithWriter(o.writer)) + } + + sp := spinner.New(charset, refreshRate, underlyingSpinnerOptions...) + sp.Color(spinnerColor) s := &Spinner{ sp: sp, diff --git a/ignite/pkg/cliui/cliui.go b/ignite/pkg/cliui/cliui.go index 5cca096cae..7bf2d99978 100644 --- a/ignite/pkg/cliui/cliui.go +++ b/ignite/pkg/cliui/cliui.go @@ -55,7 +55,7 @@ func New(options ...Option) Session { for _, apply := range options { apply(&session) } - session.spinner = clispinner.New(session.out) + session.spinner = clispinner.New(clispinner.WithWriter(session.out)) session.printLoopWg.Add(1) go session.printLoop() return session diff --git a/ignite/pkg/events/events.go b/ignite/pkg/events/events.go index 86ad5cae52..5a96ba9998 100644 --- a/ignite/pkg/events/events.go +++ b/ignite/pkg/events/events.go @@ -129,9 +129,6 @@ func NewBus(options ...BusOption) Bus { // Send sends a new event to bus. func (b Bus) Send(e Event) { - if b.evchan == nil { - return - } if b.buswg != nil { b.buswg.Add(1) } diff --git a/ignite/pkg/events/events_test.go b/ignite/pkg/events/events_test.go index 99bca73ccd..b7e96472c6 100644 --- a/ignite/pkg/events/events_test.go +++ b/ignite/pkg/events/events_test.go @@ -1,47 +1,40 @@ -package events +package events_test import ( "testing" "github.com/gookit/color" + "github.com/ignite-hq/cli/ignite/pkg/events" "github.com/stretchr/testify/require" ) func TestBusSend(t *testing.T) { tests := []struct { name string - bus Bus - event Event + bus events.Bus + event events.Event }{ { name: "send status ongoing event", - bus: Bus{evchan: make(chan Event)}, - event: Event{ - Status: StatusOngoing, + bus: events.NewBus(), + event: events.Event{ + Status: events.StatusOngoing, Description: "description", }, }, { name: "send status done event", - bus: Bus{evchan: make(chan Event)}, - event: Event{ - Status: StatusDone, + bus: events.NewBus(), + event: events.Event{ + Status: events.StatusDone, Description: "description", }, }, { name: "send status neutral event", - bus: Bus{evchan: make(chan Event)}, - event: Event{ - Status: StatusNeutral, - Description: "description", - }, - }, - { - name: "send event on nil bus", - bus: Bus{}, - event: Event{ - Status: StatusDone, + bus: events.NewBus(), + event: events.Event{ + Status: events.StatusNeutral, Description: "description", }, }, @@ -60,19 +53,15 @@ func TestBusSend(t *testing.T) { func TestBusShutdown(t *testing.T) { tests := []struct { name string - bus Bus + bus events.Bus }{ - { - name: "shutdown nil bus", - bus: Bus{}, - }, { name: "shutdown bus correctly", - bus: Bus{evchan: make(chan Event)}, + bus: events.NewBus(), }, { name: "shutdown bus with size correctly", - bus: Bus{evchan: make(chan Event, 1)}, + bus: events.NewBus(events.WithCustomBufferSize(1)), }, } for _, tt := range tests { @@ -84,7 +73,7 @@ func TestBusShutdown(t *testing.T) { func TestEventIsOngoing(t *testing.T) { type fields struct { - status Status + status events.Status description string } tests := []struct { @@ -92,12 +81,12 @@ func TestEventIsOngoing(t *testing.T) { fields fields want bool }{ - {"status ongoing", fields{StatusOngoing, "description"}, true}, - {"status done", fields{StatusDone, "description"}, false}, + {"status ongoing", fields{events.StatusOngoing, "description"}, true}, + {"status done", fields{events.StatusDone, "description"}, false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - e := Event{ + e := events.Event{ Status: tt.fields.status, Description: tt.fields.description, } @@ -108,7 +97,7 @@ func TestEventIsOngoing(t *testing.T) { func TestEventText(t *testing.T) { type fields struct { - status Status + status events.Status description string textColor color.Color } @@ -120,7 +109,7 @@ func TestEventText(t *testing.T) { { name: "status done", fields: fields{ - status: StatusDone, + status: events.StatusDone, description: "description", textColor: color.Red, }, @@ -129,7 +118,7 @@ func TestEventText(t *testing.T) { { name: "status ongoing", fields: fields{ - status: StatusOngoing, + status: events.StatusOngoing, description: "description", textColor: color.Red, }, @@ -138,7 +127,7 @@ func TestEventText(t *testing.T) { { name: "status ongoing with empty description", fields: fields{ - status: StatusOngoing, + status: events.StatusOngoing, description: "", textColor: color.Red, }, @@ -147,7 +136,7 @@ func TestEventText(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - e := Event{ + e := events.Event{ Status: tt.fields.status, Description: tt.fields.description, TextColor: tt.fields.textColor, @@ -159,22 +148,22 @@ func TestEventText(t *testing.T) { func TestNew(t *testing.T) { type args struct { - status Status + status events.Status description string } tests := []struct { name string args args - want Event + want events.Event }{ - {"zero value args", args{}, Event{}}, - {"large value args", args{status: 99999, description: "description"}, Event{Status: 99999, Description: "description"}}, - {"status ongoing", args{status: StatusOngoing, description: "description"}, Event{Status: 0, Description: "description"}}, - {"status done", args{status: StatusDone, description: "description"}, Event{Status: 1, Description: "description"}}, + {"zero value args", args{}, events.Event{}}, + {"large value args", args{status: 99999, description: "description"}, events.Event{Status: 99999, Description: "description"}}, + {"status ongoing", args{status: events.StatusOngoing, description: "description"}, events.Event{Status: 0, Description: "description"}}, + {"status done", args{status: events.StatusDone, description: "description"}, events.Event{Status: 1, Description: "description"}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - require.Equal(t, tt.want, New(tt.args.status, tt.args.description)) + require.Equal(t, tt.want, events.New(tt.args.status, tt.args.description)) }) } } @@ -182,15 +171,15 @@ func TestNew(t *testing.T) { func TestNewBus(t *testing.T) { tests := []struct { name string - event Event + event events.Event }{ - {"new bus with status done event", Event{Status: StatusDone, Description: "description"}}, - {"new bus with status ongoing event", Event{Status: StatusOngoing, Description: "description"}}, - {"new bus with zero value event", Event{}}, + {"new bus with status done event", events.Event{Status: events.StatusDone, Description: "description"}}, + {"new bus with status ongoing event", events.Event{Status: events.StatusOngoing, Description: "description"}}, + {"new bus with zero value event", events.Event{}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - bus := NewBus() + bus := events.NewBus() defer bus.Shutdown() for i := 0; i < 10; i++ { go bus.Send(tt.event) From e16649027d42bb92e6def47faafb0d43bec17bbe Mon Sep 17 00:00:00 2001 From: Petr Ivanov Date: Wed, 27 Apr 2022 16:41:22 +0400 Subject: [PATCH 07/10] revert import formatting --- ignite/cmd/account.go | 5 +++-- ignite/cmd/account_import.go | 3 ++- ignite/cmd/generate_dart.go | 3 ++- ignite/cmd/generate_go.go | 4 +++- ignite/cmd/generate_openapi.go | 4 +++- ignite/cmd/generate_vuex.go | 3 ++- ignite/cmd/relayer_configure.go | 6 ++++-- ignite/cmd/relayer_connect.go | 3 ++- ignite/cmd/scaffold.go | 6 ++++-- ignite/cmd/scaffold_band.go | 4 +++- ignite/cmd/scaffold_chain.go | 4 +++- ignite/cmd/scaffold_flutter.go | 4 +++- ignite/cmd/scaffold_message.go | 4 +++- ignite/cmd/scaffold_module.go | 3 ++- ignite/cmd/scaffold_mwasm.go | 4 +++- ignite/cmd/scaffold_package.go | 4 +++- ignite/cmd/scaffold_query.go | 4 +++- ignite/cmd/scaffold_vue.go | 4 +++- 18 files changed, 51 insertions(+), 21 deletions(-) diff --git a/ignite/cmd/account.go b/ignite/cmd/account.go index a5d90b1417..065c6e84d9 100644 --- a/ignite/cmd/account.go +++ b/ignite/cmd/account.go @@ -3,11 +3,12 @@ package ignitecmd import ( "os" + "github.com/spf13/cobra" + flag "github.com/spf13/pflag" + "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" - "github.com/spf13/cobra" - flag "github.com/spf13/pflag" ) const ( diff --git a/ignite/cmd/account_import.go b/ignite/cmd/account_import.go index f3ce9db5d5..d990ee2295 100644 --- a/ignite/cmd/account_import.go +++ b/ignite/cmd/account_import.go @@ -6,9 +6,10 @@ import ( "os" "github.com/cosmos/go-bip39" + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" - "github.com/spf13/cobra" ) const flagSecret = "secret" diff --git a/ignite/cmd/generate_dart.go b/ignite/cmd/generate_dart.go index 9379a2e7e1..ef9bdd6456 100644 --- a/ignite/cmd/generate_dart.go +++ b/ignite/cmd/generate_dart.go @@ -3,9 +3,10 @@ package ignitecmd import ( "fmt" + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" - "github.com/spf13/cobra" ) func NewGenerateDart() *cobra.Command { diff --git a/ignite/cmd/generate_go.go b/ignite/cmd/generate_go.go index 2284751baf..5f9d4b0d8d 100644 --- a/ignite/cmd/generate_go.go +++ b/ignite/cmd/generate_go.go @@ -2,9 +2,11 @@ package ignitecmd import ( "fmt" + + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" - "github.com/spf13/cobra" ) func NewGenerateGo() *cobra.Command { diff --git a/ignite/cmd/generate_openapi.go b/ignite/cmd/generate_openapi.go index 643f81579f..a76ebcb862 100644 --- a/ignite/cmd/generate_openapi.go +++ b/ignite/cmd/generate_openapi.go @@ -2,9 +2,11 @@ package ignitecmd import ( "fmt" + + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" - "github.com/spf13/cobra" ) func NewGenerateOpenAPI() *cobra.Command { diff --git a/ignite/cmd/generate_vuex.go b/ignite/cmd/generate_vuex.go index d461a215c5..43816aa385 100644 --- a/ignite/cmd/generate_vuex.go +++ b/ignite/cmd/generate_vuex.go @@ -3,9 +3,10 @@ package ignitecmd import ( "fmt" + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/chain" - "github.com/spf13/cobra" ) func NewGenerateVuex() *cobra.Command { diff --git a/ignite/cmd/relayer_configure.go b/ignite/cmd/relayer_configure.go index a992aade38..3098a6c0d3 100644 --- a/ignite/cmd/relayer_configure.go +++ b/ignite/cmd/relayer_configure.go @@ -2,15 +2,17 @@ package ignitecmd import ( "fmt" + "github.com/briandowns/spinner" "github.com/gookit/color" + "github.com/pkg/errors" + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/cliquiz" "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" "github.com/ignite-hq/cli/ignite/pkg/relayer" - "github.com/pkg/errors" - "github.com/spf13/cobra" ) const ( diff --git a/ignite/cmd/relayer_connect.go b/ignite/cmd/relayer_connect.go index 24585a88c3..b6c9372bcf 100644 --- a/ignite/cmd/relayer_connect.go +++ b/ignite/cmd/relayer_connect.go @@ -5,10 +5,11 @@ import ( "os" "text/tabwriter" + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/cosmosaccount" "github.com/ignite-hq/cli/ignite/pkg/relayer" - "github.com/spf13/cobra" ) // NewRelayerConnect returns a new relayer connect command to link all or some relayer paths and start diff --git a/ignite/cmd/scaffold.go b/ignite/cmd/scaffold.go index 583659fef4..6d5c0a8c8c 100644 --- a/ignite/cmd/scaffold.go +++ b/ignite/cmd/scaffold.go @@ -2,11 +2,13 @@ package ignitecmd import ( "fmt" + + "github.com/spf13/cobra" + flag "github.com/spf13/pflag" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" - "github.com/spf13/cobra" - flag "github.com/spf13/pflag" ) // flags related to component scaffolding diff --git a/ignite/cmd/scaffold_band.go b/ignite/cmd/scaffold_band.go index 03b11015bf..6b9c0d732c 100644 --- a/ignite/cmd/scaffold_band.go +++ b/ignite/cmd/scaffold_band.go @@ -3,10 +3,12 @@ package ignitecmd import ( "errors" "fmt" + + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" - "github.com/spf13/cobra" ) // NewScaffoldBandchain creates a new BandChain oracle in the module diff --git a/ignite/cmd/scaffold_chain.go b/ignite/cmd/scaffold_chain.go index 9b8534f585..14838075ab 100644 --- a/ignite/cmd/scaffold_chain.go +++ b/ignite/cmd/scaffold_chain.go @@ -2,10 +2,12 @@ package ignitecmd import ( "fmt" + + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" - "github.com/spf13/cobra" ) const ( diff --git a/ignite/cmd/scaffold_flutter.go b/ignite/cmd/scaffold_flutter.go index bc19d77dbd..6dd9b4dba8 100644 --- a/ignite/cmd/scaffold_flutter.go +++ b/ignite/cmd/scaffold_flutter.go @@ -2,9 +2,11 @@ package ignitecmd import ( "fmt" + + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/scaffolder" - "github.com/spf13/cobra" ) // NewScaffoldFlutter scaffolds a Flutter app for a chain. diff --git a/ignite/cmd/scaffold_message.go b/ignite/cmd/scaffold_message.go index dabc26ea4a..9bbc2d4ad7 100644 --- a/ignite/cmd/scaffold_message.go +++ b/ignite/cmd/scaffold_message.go @@ -2,10 +2,12 @@ package ignitecmd import ( "fmt" + + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" - "github.com/spf13/cobra" ) const flagSigner = "signer" diff --git a/ignite/cmd/scaffold_module.go b/ignite/cmd/scaffold_module.go index 822fbadf47..0be64e7942 100644 --- a/ignite/cmd/scaffold_module.go +++ b/ignite/cmd/scaffold_module.go @@ -7,12 +7,13 @@ import ( "io" "strings" + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/pkg/validation" "github.com/ignite-hq/cli/ignite/services/scaffolder" modulecreate "github.com/ignite-hq/cli/ignite/templates/module/create" - "github.com/spf13/cobra" ) const ( diff --git a/ignite/cmd/scaffold_mwasm.go b/ignite/cmd/scaffold_mwasm.go index 15bbecddf7..7ecec30ea7 100644 --- a/ignite/cmd/scaffold_mwasm.go +++ b/ignite/cmd/scaffold_mwasm.go @@ -2,9 +2,11 @@ package ignitecmd import ( "fmt" + + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" - "github.com/spf13/cobra" ) func NewScaffoldWasm() *cobra.Command { diff --git a/ignite/cmd/scaffold_package.go b/ignite/cmd/scaffold_package.go index 5e5b3733e4..1d94f3c208 100644 --- a/ignite/cmd/scaffold_package.go +++ b/ignite/cmd/scaffold_package.go @@ -3,10 +3,12 @@ package ignitecmd import ( "errors" "fmt" + + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" "github.com/ignite-hq/cli/ignite/services/scaffolder" - "github.com/spf13/cobra" ) const ( diff --git a/ignite/cmd/scaffold_query.go b/ignite/cmd/scaffold_query.go index 4e4054a8f0..09e81684bb 100644 --- a/ignite/cmd/scaffold_query.go +++ b/ignite/cmd/scaffold_query.go @@ -2,9 +2,11 @@ package ignitecmd import ( "fmt" + + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/pkg/placeholder" - "github.com/spf13/cobra" ) const ( diff --git a/ignite/cmd/scaffold_vue.go b/ignite/cmd/scaffold_vue.go index 3903e5ea8f..3ab71232e7 100644 --- a/ignite/cmd/scaffold_vue.go +++ b/ignite/cmd/scaffold_vue.go @@ -2,9 +2,11 @@ package ignitecmd import ( "fmt" + + "github.com/spf13/cobra" + "github.com/ignite-hq/cli/ignite/pkg/cliui/clispinner" "github.com/ignite-hq/cli/ignite/services/scaffolder" - "github.com/spf13/cobra" ) // NewScaffoldVue scaffolds a Vue.js app for a chain. From c1179a2025473b9fe50c81c76dba663ebb310fb7 Mon Sep 17 00:00:00 2001 From: Petr Ivanov Date: Wed, 27 Apr 2022 17:04:11 +0400 Subject: [PATCH 08/10] fix events tests again --- ignite/pkg/events/events.go | 3 +++ ignite/pkg/events/events_test.go | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/ignite/pkg/events/events.go b/ignite/pkg/events/events.go index 5a96ba9998..86ad5cae52 100644 --- a/ignite/pkg/events/events.go +++ b/ignite/pkg/events/events.go @@ -129,6 +129,9 @@ func NewBus(options ...BusOption) Bus { // Send sends a new event to bus. func (b Bus) Send(e Event) { + if b.evchan == nil { + return + } if b.buswg != nil { b.buswg.Add(1) } diff --git a/ignite/pkg/events/events_test.go b/ignite/pkg/events/events_test.go index b7e96472c6..3a8a82541a 100644 --- a/ignite/pkg/events/events_test.go +++ b/ignite/pkg/events/events_test.go @@ -38,6 +38,13 @@ func TestBusSend(t *testing.T) { Description: "description", }, }, + { + name: "send event on nil bus", + bus: events.Bus{}, + event: events.Event{ + Status: events.StatusDone, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -55,6 +62,10 @@ func TestBusShutdown(t *testing.T) { name string bus events.Bus }{ + { + name: "shutdown nil bus", + bus: events.Bus{}, + }, { name: "shutdown bus correctly", bus: events.NewBus(), From 4ed4d59fa5691376c96618e019ff992795640968 Mon Sep 17 00:00:00 2001 From: Petr Ivanov Date: Wed, 27 Apr 2022 18:36:54 +0400 Subject: [PATCH 09/10] fix spinner --- ignite/cmd/network_campaign_account.go | 33 ++++++++--------- ignite/cmd/network_campaign_list.go | 2 ++ ignite/cmd/network_campaign_publish.go | 2 ++ ignite/cmd/network_campaign_show.go | 2 ++ ignite/cmd/network_campaign_update.go | 2 ++ ignite/cmd/network_chain_init.go | 2 ++ ignite/cmd/network_chain_install.go | 1 + ignite/cmd/network_chain_list.go | 2 ++ ignite/cmd/network_chain_prepare.go | 1 + ignite/cmd/network_chain_publish.go | 1 - ignite/cmd/network_chain_show.go | 6 ---- ignite/cmd/network_chain_show_accounts.go | 40 +++++++++++---------- ignite/cmd/network_chain_show_genesis.go | 2 ++ ignite/cmd/network_chain_show_info.go | 2 ++ ignite/cmd/network_chain_show_peers.go | 2 ++ ignite/cmd/network_chain_show_validators.go | 6 ++++ ignite/cmd/network_request_approve.go | 2 ++ ignite/cmd/network_request_list.go | 2 ++ ignite/cmd/network_request_reject.go | 2 ++ ignite/cmd/network_request_show.go | 2 ++ 20 files changed, 70 insertions(+), 44 deletions(-) diff --git a/ignite/cmd/network_campaign_account.go b/ignite/cmd/network_campaign_account.go index c9f56c7ab6..f645d70ac8 100644 --- a/ignite/cmd/network_campaign_account.go +++ b/ignite/cmd/network_campaign_account.go @@ -6,12 +6,10 @@ import ( "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" - - "github.com/spf13/cobra" - "golang.org/x/sync/errgroup" - "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networktypes" + "github.com/spf13/cobra" + "golang.org/x/sync/errgroup" ) var ( @@ -61,19 +59,15 @@ func newNetworkCampaignAccountListHandler(cmd *cobra.Command, args []string) err return err } + if len(mainnetAccs)+len(vestingAccs) == 0 { + session.StopSpinner() + return session.Printf("%s %s\n", icons.Info, "no campaign account found") + } + mainnetAccEntries := make([][]string, 0) for _, acc := range mainnetAccs { - mainnetAccEntries = append(mainnetAccEntries, []string{ - acc.Address, - acc.Shares.String(), - }) - } - if len(mainnetAccEntries) > 0 { - if err = session.PrintTable(campaignMainnetsAccSummaryHeader, mainnetAccEntries...); err != nil { - return err - } + mainnetAccEntries = append(mainnetAccEntries, []string{acc.Address, acc.Shares.String()}) } - mainnetVestingAccEntries := make([][]string, 0) for _, acc := range vestingAccs { mainnetVestingAccEntries = append(mainnetVestingAccEntries, []string{ @@ -83,16 +77,19 @@ func newNetworkCampaignAccountListHandler(cmd *cobra.Command, args []string) err strconv.FormatInt(acc.EndTime, 10), }) } + + session.StopSpinner() + if len(mainnetAccEntries) > 0 { + if err = session.PrintTable(campaignMainnetsAccSummaryHeader, mainnetAccEntries...); err != nil { + return err + } + } if len(mainnetVestingAccEntries) > 0 { if err = session.PrintTable(campaignVestingAccSummaryHeader, mainnetVestingAccEntries...); err != nil { return err } } - if len(mainnetVestingAccEntries)+len(mainnetAccEntries) == 0 { - return session.Printf("%s %s\n", icons.Info, "no campaign account found") - } - return nil } diff --git a/ignite/cmd/network_campaign_list.go b/ignite/cmd/network_campaign_list.go index 8e5bc4ba8d..e7a341493e 100644 --- a/ignite/cmd/network_campaign_list.go +++ b/ignite/cmd/network_campaign_list.go @@ -67,5 +67,7 @@ func renderCampaignSummaries(campaigns []networktypes.Campaign, session cliui.Se }) } + session.StopSpinner() + return session.PrintTable(CampaignSummaryHeader, campaignEntries...) } diff --git a/ignite/cmd/network_campaign_publish.go b/ignite/cmd/network_campaign_publish.go index 17b0b08de4..2439402aa7 100644 --- a/ignite/cmd/network_campaign_publish.go +++ b/ignite/cmd/network_campaign_publish.go @@ -51,5 +51,7 @@ func networkCampaignPublishHandler(cmd *cobra.Command, args []string) error { return err } + session.StopSpinner() + return session.Printf("%s Campaign ID: %d \n", icons.Bullet, campaignID) } diff --git a/ignite/cmd/network_campaign_show.go b/ignite/cmd/network_campaign_show.go index 6c7093dbb4..0eea507932 100644 --- a/ignite/cmd/network_campaign_show.go +++ b/ignite/cmd/network_campaign_show.go @@ -48,5 +48,7 @@ func networkCampaignShowHandler(cmd *cobra.Command, args []string) error { return err } + session.StopSpinner() + return session.Println(info) } diff --git a/ignite/cmd/network_campaign_update.go b/ignite/cmd/network_campaign_update.go index 9ab5c57387..e46df96f96 100644 --- a/ignite/cmd/network_campaign_update.go +++ b/ignite/cmd/network_campaign_update.go @@ -99,5 +99,7 @@ func networkCampaignUpdateHandler(cmd *cobra.Command, args []string) error { return err } + session.StopSpinner() + return session.Print(info) } diff --git a/ignite/cmd/network_chain_init.go b/ignite/cmd/network_chain_init.go index d26a023afc..1528e5363b 100644 --- a/ignite/cmd/network_chain_init.go +++ b/ignite/cmd/network_chain_init.go @@ -128,6 +128,8 @@ func networkChainInitHandler(cmd *cobra.Command, args []string) error { return err } + session.StopSpinner() + return session.Printf("%s Gentx generated: %s\n", icons.Bullet, gentxPath) } diff --git a/ignite/cmd/network_chain_install.go b/ignite/cmd/network_chain_install.go index 76448f67a6..a8130af2e6 100644 --- a/ignite/cmd/network_chain_install.go +++ b/ignite/cmd/network_chain_install.go @@ -59,6 +59,7 @@ func networkChainInstallHandler(cmd *cobra.Command, args []string) error { } binaryPath := filepath.Join(goenv.Bin(), binaryName) + session.StopSpinner() session.Printf("%s Binary installed\n", icons.OK) session.Printf("%s Binary's name: %s\n", icons.Info, infoColor(binaryName)) session.Printf("%s Binary's path: %s\n", icons.Info, infoColor(binaryPath)) diff --git a/ignite/cmd/network_chain_list.go b/ignite/cmd/network_chain_list.go index 7b43821b8e..ddde4e40af 100644 --- a/ignite/cmd/network_chain_list.go +++ b/ignite/cmd/network_chain_list.go @@ -40,6 +40,8 @@ func networkChainListHandler(cmd *cobra.Command, _ []string) error { return err } + session.StopSpinner() + return renderLaunchSummaries(chainLaunches, session) } diff --git a/ignite/cmd/network_chain_prepare.go b/ignite/cmd/network_chain_prepare.go index ba1fe350a3..5985f3db91 100644 --- a/ignite/cmd/network_chain_prepare.go +++ b/ignite/cmd/network_chain_prepare.go @@ -90,6 +90,7 @@ func networkChainPrepareHandler(cmd *cobra.Command, args []string) error { } binaryDir := filepath.Dir(filepath.Join(goenv.Bin(), binaryName)) + session.StopSpinner() session.Printf("%s Chain is prepared for launch\n", icons.OK) session.Println("\nYou can start your node by running the following command:") commandStr := fmt.Sprintf("%s start --home %s", binaryName, chainHome) diff --git a/ignite/cmd/network_chain_publish.go b/ignite/cmd/network_chain_publish.go index b29a9f4e67..d051decf7f 100644 --- a/ignite/cmd/network_chain_publish.go +++ b/ignite/cmd/network_chain_publish.go @@ -231,7 +231,6 @@ func networkChainPublishHandler(cmd *cobra.Command, args []string) error { } session.StopSpinner() - session.Printf("%s Network published \n", icons.OK) session.Printf("%s Launch ID: %d \n", icons.Bullet, launchID) session.Printf("%s Campaign ID: %d \n", icons.Bullet, campaignID) diff --git a/ignite/cmd/network_chain_show.go b/ignite/cmd/network_chain_show.go index d08186cfd2..03c572b572 100644 --- a/ignite/cmd/network_chain_show.go +++ b/ignite/cmd/network_chain_show.go @@ -8,12 +8,6 @@ import ( const flagOut = "out" -var ( - chainGenesisValSummaryHeader = []string{"Genesis Validator", "Self Delegation", "Peer"} - chainGenesisAccSummaryHeader = []string{"Genesis Account", "Coins"} - chainVestingAccSummaryHeader = []string{"Vesting Account", "Total Balance", "Vesting", "EndTime"} -) - // NewNetworkChainShow creates a new chain show // command to show a chain details on SPN. func NewNetworkChainShow() *cobra.Command { diff --git a/ignite/cmd/network_chain_show_accounts.go b/ignite/cmd/network_chain_show_accounts.go index 8dcfe459b0..332f4cf350 100644 --- a/ignite/cmd/network_chain_show_accounts.go +++ b/ignite/cmd/network_chain_show_accounts.go @@ -8,6 +8,11 @@ import ( "github.com/spf13/cobra" ) +var ( + chainGenesisAccSummaryHeader = []string{"Genesis Account", "Coins"} + chainVestingAccSummaryHeader = []string{"Vesting Account", "Total Balance", "Vesting", "EndTime"} +) + func newNetworkChainShowAccounts() *cobra.Command { c := &cobra.Command{ Use: "accounts [launch-id]", @@ -32,29 +37,23 @@ func networkChainShowAccountsHandler(cmd *cobra.Command, args []string) error { return err } - // get all chain genesis accounts genesisAccs, err := n.GenesisAccounts(cmd.Context(), launchID) if err != nil { return err } - genesisAccEntries := make([][]string, 0) - for _, acc := range genesisAccs { - genesisAccEntries = append(genesisAccEntries, []string{ - acc.Address, - acc.Coins, - }) - } - if len(genesisAccEntries) > 0 { - if err = session.PrintTable(chainGenesisAccSummaryHeader, genesisAccEntries...); err != nil { - return err - } - } - - // get all chain vesting accounts vestingAccs, err := n.VestingAccounts(cmd.Context(), launchID) if err != nil { return err } + if len(genesisAccs)+len(vestingAccs) == 0 { + session.StopSpinner() + return session.Printf("%s %s\n", icons.Info, "empty chain account list") + } + + genesisAccEntries := make([][]string, 0) + for _, acc := range genesisAccs { + genesisAccEntries = append(genesisAccEntries, []string{acc.Address, acc.Coins}) + } genesisVestingAccEntries := make([][]string, 0) for _, acc := range vestingAccs { genesisVestingAccEntries = append(genesisVestingAccEntries, []string{ @@ -64,15 +63,18 @@ func networkChainShowAccountsHandler(cmd *cobra.Command, args []string) error { strconv.FormatInt(acc.EndTime, 10), }) } + + session.StopSpinner() + if len(genesisAccEntries) > 0 { + if err = session.PrintTable(chainGenesisAccSummaryHeader, genesisAccEntries...); err != nil { + return err + } + } if len(genesisVestingAccEntries) > 0 { if err = session.PrintTable(chainVestingAccSummaryHeader, genesisVestingAccEntries...); err != nil { return err } } - if len(genesisVestingAccEntries)+len(genesisAccEntries) == 0 { - return session.Printf("%s %s\n", icons.Info, "empty chain account list") - } - return nil } diff --git a/ignite/cmd/network_chain_show_genesis.go b/ignite/cmd/network_chain_show_genesis.go index 26b4a4cc03..db80c13c47 100644 --- a/ignite/cmd/network_chain_show_genesis.go +++ b/ignite/cmd/network_chain_show_genesis.go @@ -87,5 +87,7 @@ func networkChainShowGenesisHandler(cmd *cobra.Command, args []string) error { return err } + session.StopSpinner() + return session.Printf("%s Genesis generated: %s\n", icons.Bullet, out) } diff --git a/ignite/cmd/network_chain_show_info.go b/ignite/cmd/network_chain_show_info.go index ed4beabdd0..4040759732 100644 --- a/ignite/cmd/network_chain_show_info.go +++ b/ignite/cmd/network_chain_show_info.go @@ -62,5 +62,7 @@ func networkChainShowInfoHandler(cmd *cobra.Command, args []string) error { return err } + session.StopSpinner() + return session.Print(info) } diff --git a/ignite/cmd/network_chain_show_peers.go b/ignite/cmd/network_chain_show_peers.go index 76cc1be732..cea05e2b62 100644 --- a/ignite/cmd/network_chain_show_peers.go +++ b/ignite/cmd/network_chain_show_peers.go @@ -72,5 +72,7 @@ func networkChainShowPeersHandler(cmd *cobra.Command, args []string) error { return err } + session.StopSpinner() + return session.Printf("%s Peer list generated: %s\n", icons.Bullet, out) } diff --git a/ignite/cmd/network_chain_show_validators.go b/ignite/cmd/network_chain_show_validators.go index b17a918c26..73d37af658 100644 --- a/ignite/cmd/network_chain_show_validators.go +++ b/ignite/cmd/network_chain_show_validators.go @@ -7,6 +7,10 @@ import ( "github.com/spf13/cobra" ) +var ( + chainGenesisValSummaryHeader = []string{"Genesis Validator", "Self Delegation", "Peer"} +) + func newNetworkChainShowValidators() *cobra.Command { c := &cobra.Command{ Use: "validators [launch-id]", @@ -50,5 +54,7 @@ func networkChainShowValidatorsHandler(cmd *cobra.Command, args []string) error return session.Printf("%s %s\n", icons.Info, "no account found") } + session.StopSpinner() + return session.PrintTable(chainGenesisValSummaryHeader, validatorEntries...) } diff --git a/ignite/cmd/network_request_approve.go b/ignite/cmd/network_request_approve.go index 5a1ab28d76..dae3f2bf9f 100644 --- a/ignite/cmd/network_request_approve.go +++ b/ignite/cmd/network_request_approve.go @@ -79,5 +79,7 @@ func networkRequestApproveHandler(cmd *cobra.Command, args []string) error { return err } + session.StopSpinner() + return session.Printf("%s Request(s) %s approved\n", icons.OK, numbers.List(ids, "#")) } diff --git a/ignite/cmd/network_request_list.go b/ignite/cmd/network_request_list.go index ee155667d0..75bb83df59 100644 --- a/ignite/cmd/network_request_list.go +++ b/ignite/cmd/network_request_list.go @@ -48,6 +48,8 @@ func networkRequestListHandler(cmd *cobra.Command, args []string) error { return err } + session.StopSpinner() + return renderRequestSummaries(requests, session) } diff --git a/ignite/cmd/network_request_reject.go b/ignite/cmd/network_request_reject.go index fd29f2e0f2..eeb545c129 100644 --- a/ignite/cmd/network_request_reject.go +++ b/ignite/cmd/network_request_reject.go @@ -59,5 +59,7 @@ func networkRequestRejectHandler(cmd *cobra.Command, args []string) error { return err } + session.StopSpinner() + return session.Printf("%s Request(s) %s rejected\n", icons.OK, numbers.List(ids, "#")) } diff --git a/ignite/cmd/network_request_show.go b/ignite/cmd/network_request_show.go index 96dd1527dc..ae69239d06 100644 --- a/ignite/cmd/network_request_show.go +++ b/ignite/cmd/network_request_show.go @@ -63,5 +63,7 @@ func networkRequestShowHandler(cmd *cobra.Command, args []string) error { return err } + session.StopSpinner() + return session.Println(requestYaml) } From 68224f385c5a3048e8e1205da99e94043b5aa6b8 Mon Sep 17 00:00:00 2001 From: Petr Ivanov Date: Fri, 29 Apr 2022 11:44:28 +0400 Subject: [PATCH 10/10] do review fixes --- ignite/cmd/chain_build.go | 9 +++++---- ignite/cmd/chain_init.go | 5 +++-- ignite/cmd/cmd.go | 2 -- ignite/cmd/network_campaign_list.go | 3 +-- ignite/cmd/network_campaign_update.go | 2 +- ignite/cmd/network_chain_init.go | 7 +++---- ignite/cmd/network_chain_install.go | 5 +++-- ignite/cmd/network_chain_join.go | 3 +-- ignite/cmd/network_chain_prepare.go | 3 ++- ignite/pkg/cliui/cliui.go | 7 ++++++- ignite/pkg/cliui/colors/colors.go | 5 +++++ 11 files changed, 30 insertions(+), 21 deletions(-) create mode 100644 ignite/pkg/cliui/colors/colors.go diff --git a/ignite/cmd/chain_build.go b/ignite/cmd/chain_build.go index 7a51128839..3a82edec7f 100644 --- a/ignite/cmd/chain_build.go +++ b/ignite/cmd/chain_build.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/cobra" "github.com/ignite-hq/cli/ignite/pkg/chaincmd" + "github.com/ignite-hq/cli/ignite/pkg/cliui/colors" "github.com/ignite-hq/cli/ignite/services/chain" ) @@ -49,7 +50,7 @@ Sample usages: return c } -func chainBuildHandler(cmd *cobra.Command, args []string) error { +func chainBuildHandler(cmd *cobra.Command, _ []string) error { var ( isRelease, _ = cmd.Flags().GetBool(flagRelease) releaseTargets, _ = cmd.Flags().GetStringSlice(flagReleaseTargets) @@ -77,7 +78,7 @@ func chainBuildHandler(cmd *cobra.Command, args []string) error { return err } - fmt.Printf("🗃 Release created: %s\n", infoColor(releasePath)) + fmt.Printf("🗃 Release created: %s\n", colors.Info(releasePath)) return nil } @@ -88,10 +89,10 @@ func chainBuildHandler(cmd *cobra.Command, args []string) error { } if output == "" { - fmt.Printf("🗃 Installed. Use with: %s\n", infoColor(binaryName)) + fmt.Printf("🗃 Installed. Use with: %s\n", colors.Info(binaryName)) } else { binaryPath := filepath.Join(output, binaryName) - fmt.Printf("🗃 Binary built at the path: %s\n", infoColor(binaryPath)) + fmt.Printf("🗃 Binary built at the path: %s\n", colors.Info(binaryPath)) } return nil diff --git a/ignite/cmd/chain_init.go b/ignite/cmd/chain_init.go index ec9f699cee..3c887238b8 100644 --- a/ignite/cmd/chain_init.go +++ b/ignite/cmd/chain_init.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" "github.com/ignite-hq/cli/ignite/pkg/chaincmd" + "github.com/ignite-hq/cli/ignite/pkg/cliui/colors" "github.com/ignite-hq/cli/ignite/services/chain" ) @@ -23,7 +24,7 @@ func NewChainInit() *cobra.Command { return c } -func chainInitHandler(cmd *cobra.Command, args []string) error { +func chainInitHandler(cmd *cobra.Command, _ []string) error { chainOption := []chain.Option{ chain.LogLevel(logLevel(cmd)), chain.KeyringBackend(chaincmd.KeyringBackendTest), @@ -47,7 +48,7 @@ func chainInitHandler(cmd *cobra.Command, args []string) error { return err } - fmt.Printf("🗃 Initialized. Checkout your chain's home (data) directory: %s\n", infoColor(home)) + fmt.Printf("🗃 Initialized. Checkout your chain's home (data) directory: %s\n", colors.Info(home)) return nil } diff --git a/ignite/cmd/cmd.go b/ignite/cmd/cmd.go index 1e37ef9e88..1f8a88776c 100644 --- a/ignite/cmd/cmd.go +++ b/ignite/cmd/cmd.go @@ -31,8 +31,6 @@ const ( checkVersionTimeout = time.Millisecond * 600 ) -var infoColor = color.New(color.FgYellow).SprintFunc() - // New creates a new root command for `Ignite CLI` with its sub commands. func New(ctx context.Context) *cobra.Command { cobra.EnableCommandSorting = false diff --git a/ignite/cmd/network_campaign_list.go b/ignite/cmd/network_campaign_list.go index e7a341493e..a3d65caad9 100644 --- a/ignite/cmd/network_campaign_list.go +++ b/ignite/cmd/network_campaign_list.go @@ -5,7 +5,6 @@ import ( "github.com/ignite-hq/cli/ignite/pkg/cliui" "github.com/ignite-hq/cli/ignite/pkg/cliui/entrywriter" - "github.com/ignite-hq/cli/ignite/services/network" "github.com/ignite-hq/cli/ignite/services/network/networktypes" "github.com/spf13/cobra" ) @@ -37,7 +36,7 @@ func networkCampaignListHandler(cmd *cobra.Command, _ []string) error { return err } - n, err := nb.Network(network.CollectEvents(session.EventBus())) + n, err := nb.Network() if err != nil { return err } diff --git a/ignite/cmd/network_campaign_update.go b/ignite/cmd/network_campaign_update.go index e46df96f96..ab63364eb6 100644 --- a/ignite/cmd/network_campaign_update.go +++ b/ignite/cmd/network_campaign_update.go @@ -92,7 +92,7 @@ func networkCampaignUpdateHandler(cmd *cobra.Command, args []string) error { if err != nil { return err } - session.Println("") + session.Println() info, err := yaml.Marshal(cmd.Context(), campaign) if err != nil { diff --git a/ignite/cmd/network_chain_init.go b/ignite/cmd/network_chain_init.go index 1528e5363b..635f731bfc 100644 --- a/ignite/cmd/network_chain_init.go +++ b/ignite/cmd/network_chain_init.go @@ -82,12 +82,11 @@ func networkChainInitHandler(cmd *cobra.Command, args []string) error { chainHome, ) if err := session.AskConfirm(question); err != nil { - fmt.Println("said no") - return nil + return session.PrintSaidNo() } } - n, err := nb.Network(network.CollectEvents(session.EventBus())) + n, err := nb.Network() if err != nil { return err } @@ -97,7 +96,7 @@ func networkChainInitHandler(cmd *cobra.Command, args []string) error { return err } - c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch), networkchain.CollectEvents(session.EventBus())) + c, err := nb.Chain(networkchain.SourceLaunch(chainLaunch)) if err != nil { return err } diff --git a/ignite/cmd/network_chain_install.go b/ignite/cmd/network_chain_install.go index a8130af2e6..fba6b94fda 100644 --- a/ignite/cmd/network_chain_install.go +++ b/ignite/cmd/network_chain_install.go @@ -4,6 +4,7 @@ import ( "path/filepath" "github.com/ignite-hq/cli/ignite/pkg/cliui" + "github.com/ignite-hq/cli/ignite/pkg/cliui/colors" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/goenv" "github.com/ignite-hq/cli/ignite/services/network" @@ -61,8 +62,8 @@ func networkChainInstallHandler(cmd *cobra.Command, args []string) error { session.StopSpinner() session.Printf("%s Binary installed\n", icons.OK) - session.Printf("%s Binary's name: %s\n", icons.Info, infoColor(binaryName)) - session.Printf("%s Binary's path: %s\n", icons.Info, infoColor(binaryPath)) + session.Printf("%s Binary's name: %s\n", icons.Info, colors.Info(binaryName)) + session.Printf("%s Binary's path: %s\n", icons.Info, colors.Info(binaryPath)) return nil } diff --git a/ignite/cmd/network_chain_join.go b/ignite/cmd/network_chain_join.go index cee85e447f..8ee562f681 100644 --- a/ignite/cmd/network_chain_join.go +++ b/ignite/cmd/network_chain_join.go @@ -104,8 +104,7 @@ func networkChainJoinHandler(cmd *cobra.Command, args []string) error { flagAmount, ) if err := session.AskConfirm(question); err != nil { - session.Println("said no") - return nil + return session.PrintSaidNo() } } diff --git a/ignite/cmd/network_chain_prepare.go b/ignite/cmd/network_chain_prepare.go index 5985f3db91..0f3039d0d8 100644 --- a/ignite/cmd/network_chain_prepare.go +++ b/ignite/cmd/network_chain_prepare.go @@ -5,6 +5,7 @@ import ( "path/filepath" "github.com/ignite-hq/cli/ignite/pkg/cliui" + "github.com/ignite-hq/cli/ignite/pkg/cliui/colors" "github.com/ignite-hq/cli/ignite/pkg/cliui/icons" "github.com/ignite-hq/cli/ignite/pkg/goenv" "github.com/ignite-hq/cli/ignite/services/network" @@ -94,7 +95,7 @@ func networkChainPrepareHandler(cmd *cobra.Command, args []string) error { session.Printf("%s Chain is prepared for launch\n", icons.OK) session.Println("\nYou can start your node by running the following command:") commandStr := fmt.Sprintf("%s start --home %s", binaryName, chainHome) - session.Printf("\t%s/%s\n", binaryDir, infoColor(commandStr)) + session.Printf("\t%s/%s\n", binaryDir, colors.Info(commandStr)) return nil } diff --git a/ignite/pkg/cliui/cliui.go b/ignite/pkg/cliui/cliui.go index 7bf2d99978..fefcb9bf8b 100644 --- a/ignite/pkg/cliui/cliui.go +++ b/ignite/pkg/cliui/cliui.go @@ -77,7 +77,7 @@ func (s Session) StopSpinner() { } // PauseSpinner pauses spinner, returns resume function to start paused spinner again. -func (s Session) PauseSpinner() func() { +func (s Session) PauseSpinner() (mightResume func()) { isActive := s.spinner.IsActive() f := func() { if isActive { @@ -104,6 +104,11 @@ func (s Session) Println(messages ...interface{}) error { return err } +// PrintSaidNo prints message informing negative was given in a confirmation prompt +func (s Session) PrintSaidNo() error { + return s.Println("said no") +} + // Println prints arbitrary message func (s Session) Print(messages ...interface{}) error { s.Wait() diff --git a/ignite/pkg/cliui/colors/colors.go b/ignite/pkg/cliui/colors/colors.go new file mode 100644 index 0000000000..e7e1c9a1e0 --- /dev/null +++ b/ignite/pkg/cliui/colors/colors.go @@ -0,0 +1,5 @@ +package colors + +import "github.com/fatih/color" + +var Info = color.New(color.FgYellow).SprintFunc()