Skip to content

Commit

Permalink
Optimize configuration
Browse files Browse the repository at this point in the history
- Change flag "seconds" to "decimal"
- Move configuration var to cmd
- Remove configuration file var
- Add flag "negate" for decimal values
  • Loading branch information
berlam committed Oct 4, 2019
1 parent 6675c48 commit d39bfee
Show file tree
Hide file tree
Showing 6 changed files with 160 additions and 148 deletions.
23 changes: 12 additions & 11 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,22 @@ import (
"os"
)

var cfgFile string
var conf internal.Configuration

func init() {
cobra.OnInitialize(func() {
if cfgFile != "" {
conf, _ := rootCmd.PersistentFlags().GetString(internal.FlagConfiguration)
if conf != "" {
// Use Configuration file from the flag.
viper.SetConfigFile(cfgFile)
viper.SetConfigFile(conf)
}
})

rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "specify the configuration file")
rootCmd.PersistentFlags().BoolVarP(&internal.Config.Insecure, internal.FlagInsecure, "k", false, "use http instead of https")
rootCmd.PersistentFlags().StringVarP(&internal.Config.Host, internal.FlagHost, "H", "", "specify the host to use for effort query")
rootCmd.PersistentFlags().StringVarP(&internal.Config.Username, internal.FlagUsername, "u", "", "specify the username to use for server authentication")
rootCmd.PersistentFlags().StringVarP(&internal.Config.Password, internal.FlagPassword, "p", "", "specify the password to use for server authentication")
rootCmd.PersistentFlags().StringP(internal.FlagConfiguration, "c", "", "specify the configuration file")
rootCmd.PersistentFlags().BoolVarP(&conf.Http, internal.FlagHttp, "k", false, "use http instead of https")
rootCmd.PersistentFlags().StringVarP(&conf.Host, internal.FlagHost, "H", "", "specify the host to use for effort query")
rootCmd.PersistentFlags().StringVarP(&conf.Username, internal.FlagUsername, "u", "", "specify the username to use for server authentication")
rootCmd.PersistentFlags().StringVarP(&conf.Password, internal.FlagPassword, "p", "", "specify the password to use for server authentication")
rootCmd.MarkPersistentFlagRequired(internal.FlagHost)
}

Expand All @@ -34,14 +35,14 @@ var rootCmd = &cobra.Command{
Args: cobra.NoArgs,
Version: internal.Version,
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
if cfgFile != "" {
if viper.ConfigFileUsed() != "" {
viper.BindPFlags(cmd.Flags())
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
return fmt.Errorf("can't read configuration. %s", err.Error())
return fmt.Errorf("can't read conf. %s", err.Error())
}
}
viper.Unmarshal(&internal.Config)
viper.Unmarshal(&conf)
}
// Remove required annotation if the user has that flag given with viper.
cmd.Flags().VisitAll(func(flag *pflag.Flag) {
Expand Down
84 changes: 44 additions & 40 deletions cmd/show.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,19 @@ func init() {
rootCmd.AddCommand(showCmd)
showCmd.AddCommand(showBcsCmd, showJiraCmd)

showCmd.PersistentFlags().IntVar(&internal.Config.Year, internal.FlagYear, time.Now().Year(), "specify the year to query effort for")
showCmd.PersistentFlags().IntVar(&internal.Config.Month, internal.FlagMonth, int(time.Now().Month()), "specify the month to query effort for")
showCmd.PersistentFlags().BoolVarP(&internal.Config.Summarize, internal.FlagSummarize, "s", false, "summarize effort per day")
showCmd.PersistentFlags().BoolVar(&internal.Config.PrintEmptyLine, internal.FlagPrintEmptyLine, false, "print empty line for missing day during summary")
showCmd.PersistentFlags().BoolVar(&internal.Config.Seconds, internal.FlagSeconds, false, "display duration in seconds")
showCmd.PersistentFlags().IntVar(&conf.Year, internal.FlagYear, time.Now().Year(), "specify the year to query effort for")
showCmd.PersistentFlags().IntVar(&conf.Month, internal.FlagMonth, int(time.Now().Month()), "specify the month to query effort for")
showCmd.PersistentFlags().BoolVarP(&conf.Duration.Summarize, internal.FlagSummarize, "s", false, "summarize effort per day")
showCmd.PersistentFlags().BoolVar(&conf.Duration.Empty, internal.FlagEmpty, false, "print empty durations during summary")
showCmd.PersistentFlags().BoolVar(&conf.Duration.Decimal, internal.FlagDecimal, false, "display duration as decimal hour")
showCmd.PersistentFlags().BoolVar(&conf.Duration.Negate, internal.FlagNegate, false, "negate decimal duration")

showBcsCmd.Flags().StringVar(&internal.Config.Report, internal.FlagReport, "", "specify the name of the report")
showBcsCmd.Flags().StringArrayVar(&internal.Config.Projects, internal.FlagProjects, nil, "specify the oid of the project")
showBcsCmd.Flags().StringVar(&conf.Report, internal.FlagReport, "", "specify the name of the report")
showBcsCmd.Flags().StringArrayVar(&conf.Projects, internal.FlagProjects, nil, "specify the oid of the project")
showBcsCmd.MarkFlagRequired(internal.FlagReport)

showJiraCmd.Flags().StringArrayVar(&internal.Config.Projects, internal.FlagProjects, nil, "specify the project key")
showJiraCmd.Flags().StringArrayVar(&internal.Config.Users, internal.FlagUsers, nil, "show results for user")
showJiraCmd.Flags().StringArrayVar(&conf.Projects, internal.FlagProjects, nil, "specify the project key")
showJiraCmd.Flags().StringArrayVar(&conf.Users, internal.FlagUsers, nil, "show results for user")
}

var showCmd = &cobra.Command{
Expand All @@ -40,8 +41,11 @@ var showCmd = &cobra.Command{
if err != nil {
return err
}
if !internal.Config.Summarize && internal.Config.PrintEmptyLine {
return fmt.Errorf("empty lines (--%s) are only available for summaries (--%s)", internal.FlagPrintEmptyLine, internal.FlagSummarize)
if !conf.Duration.Summarize && conf.Duration.Empty {
return fmt.Errorf("empty durations (--%s) are only available for summaries (--%s)", internal.FlagEmpty, internal.FlagSummarize)
}
if !conf.Duration.Decimal && conf.Duration.Negate {
return fmt.Errorf("negative durations (--%s) are only available for decimal values (--%s)", internal.FlagNegate, internal.FlagDecimal)
}
return nil
},
Expand All @@ -57,31 +61,31 @@ var showBcsCmd = &cobra.Command{
if err != nil {
return err
}
if internal.Config.Projects != nil && len(internal.Config.Projects) > 1 {
if conf.Projects != nil && len(conf.Projects) > 1 {
return fmt.Errorf("only one project allowed")
}
return nil
},
Run: func(cmd *cobra.Command, args []string) {
if internal.Config.Projects == nil || len(internal.Config.Projects) == 0 {
if conf.Projects == nil || len(conf.Projects) == 0 {
bcs.GetTimesheet(
pkg.NewHttpClient(),
internal.Config.Server(),
internal.Config.Userinfo(),
internal.Config.Year,
time.Month(internal.Config.Month),
internal.Config.Report,
).Print(os.Stdout, false, internal.Config.Summarize, internal.Config.PrintEmptyLine, internal.Config.Seconds)
conf.Server(),
conf.Userinfo(),
conf.Year,
time.Month(conf.Month),
conf.Report,
).Print(os.Stdout, false, &conf.Duration)
} else {
bcs.GetBulkTimesheet(
pkg.NewHttpClient(),
internal.Config.Server(),
internal.Config.Userinfo(),
internal.Config.Year,
time.Month(internal.Config.Month),
pkg.Project(internal.Config.Projects[0]),
internal.Config.Report,
).Print(os.Stdout, true, internal.Config.Summarize, internal.Config.PrintEmptyLine, internal.Config.Seconds)
conf.Server(),
conf.Userinfo(),
conf.Year,
time.Month(conf.Month),
pkg.Project(conf.Projects[0]),
conf.Report,
).Print(os.Stdout, true, &conf.Duration)
}
},
}
Expand All @@ -92,25 +96,25 @@ var showJiraCmd = &cobra.Command{
Long: "Show your worklog data from Atlassian Jira.",
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) {
if internal.Config.Users == nil || len(internal.Config.Users) == 0 {
if conf.Users == nil || len(conf.Users) == 0 {
jira.GetTimesheet(
pkg.NewHttpClient(),
internal.Config.Server(),
internal.Config.Userinfo(),
internal.Config.Year,
time.Month(internal.Config.Month),
internal.Projects(internal.Config.Projects),
).Print(os.Stdout, false, internal.Config.Summarize, internal.Config.PrintEmptyLine, internal.Config.Seconds)
conf.Server(),
conf.Userinfo(),
conf.Year,
time.Month(conf.Month),
pkg.Projects(conf.Projects),
).Print(os.Stdout, false, &conf.Duration)
} else {
jira.GetBulkTimesheet(
pkg.NewHttpClient(),
internal.Config.Server(),
internal.Config.Userinfo(),
internal.Config.Year,
time.Month(internal.Config.Month),
internal.Projects(internal.Config.Projects),
internal.Users(internal.Config.Users),
).Print(os.Stdout, true, internal.Config.Summarize, internal.Config.PrintEmptyLine, internal.Config.Seconds)
conf.Server(),
conf.Userinfo(),
conf.Year,
time.Month(conf.Month),
pkg.Projects(conf.Projects),
pkg.Users(conf.Users),
).Print(os.Stdout, true, &conf.Duration)
}
},
}
84 changes: 0 additions & 84 deletions internal/config.go

This file was deleted.

66 changes: 66 additions & 0 deletions internal/configuration.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package internal

import (
"net/url"
)

const (
Version = "0.1.0"
FlagConfiguration = "configuration"
FlagHttp = "http"
FlagHost = "host"
FlagUsername = "username"
FlagPassword = "password"
FlagYear = "year"
FlagMonth = "month"
FlagProjects = "project"
FlagUsers = "user"
FlagReport = "report"
FlagSummarize = "summarize"
FlagEmpty = "empty"
FlagDecimal = "decimal"
FlagNegate = "negate"
FlagAll = "all"
FlagForce = "force"
)

type Configuration struct {
Http bool `mapstructure:"http"`
Host string `mapstructure:"host"`
Username string `mapstructure:"username"`
Password string `mapstructure:"password"`
Year int `mapstructure:"year"`
Month int `mapstructure:"month"`
Projects []string `mapstructure:"projects"`
Users []string `mapstructure:"users"`
Report string `mapstructure:"report"`
Duration DurationOptions `mapstructure:",squash"`
}

type DurationOptions struct {
Summarize bool `mapstructure:"summarize"`
Empty bool `mapstructure:"empty"`
Decimal bool `mapstructure:"decimal"`
Negate bool `mapstructure:"negate"`
}

func (c *Configuration) Server() *url.URL {
scheme := "https"
if c.Http {
scheme = "http"
}
return &url.URL{
Scheme: scheme,
Host: c.Host,
}
}

func (c *Configuration) Userinfo() *url.Userinfo {
if c.Username != "" {
if c.Password != "" {
return url.UserPassword(c.Username, c.Password)
}
return url.User(c.Username)
}
return nil
}
Loading

0 comments on commit d39bfee

Please sign in to comment.