From fea83a38b265af4e531838a32a7133ed923b9bcc Mon Sep 17 00:00:00 2001 From: Chris Cummer Date: Mon, 15 Apr 2019 10:46:41 -0700 Subject: [PATCH] WTF-400 Jira extracted to new config format --- main.go | 3 +- modules/jira/client.go | 23 ++++--------- modules/jira/settings.go | 74 ++++++++++++++++++++++++++++++++++++++++ modules/jira/widget.go | 42 +++++++++-------------- wtf/utils.go | 3 -- 5 files changed, 98 insertions(+), 47 deletions(-) create mode 100644 modules/jira/settings.go diff --git a/main.go b/main.go index ea41c6e9..ae77eac6 100644 --- a/main.go +++ b/main.go @@ -241,7 +241,8 @@ func makeWidget(app *tview.Application, pages *tview.Pages, widgetName string) w settings := jenkins.NewSettingsFromYAML(wtf.Config) widget = jenkins.NewWidget(app, pages, settings) case "jira": - widget = jira.NewWidget(app, pages) + settings := jira.NewSettingsFromYAML(wtf.Config) + widget = jira.NewWidget(app, pages, settings) case "logger": widget = logger.NewWidget(app) case "mercurial": diff --git a/modules/jira/client.go b/modules/jira/client.go index df639251..15818076 100644 --- a/modules/jira/client.go +++ b/modules/jira/client.go @@ -9,13 +9,10 @@ import ( "io/ioutil" "net/http" "net/url" - "os" "strings" - - "github.com/wtfutil/wtf/wtf" ) -func IssuesFor(username string, projects []string, jql string) (*SearchResult, error) { +func (widget *Widget) IssuesFor(username string, projects []string, jql string) (*SearchResult, error) { query := []string{} var projQuery = getProjectQuery(projects) @@ -37,7 +34,7 @@ func IssuesFor(username string, projects []string, jql string) (*SearchResult, e url := fmt.Sprintf("/rest/api/2/search?%s", v.Encode()) - resp, err := jiraRequest(url) + resp, err := widget.jiraRequest(url) if err != nil { return &SearchResult{}, err } @@ -54,26 +51,18 @@ func buildJql(key string, value string) string { /* -------------------- Unexported Functions -------------------- */ -func apiKey() string { - return wtf.Config.UString( - "wtf.mods.jira.apiKey", - os.Getenv("WTF_JIRA_API_KEY"), - ) -} - -func jiraRequest(path string) (*http.Response, error) { - url := fmt.Sprintf("%s%s", wtf.Config.UString("wtf.mods.jira.domain"), path) +func (widget *Widget) jiraRequest(path string) (*http.Response, error) { + url := fmt.Sprintf("%s%s", widget.settings.domain, path) req, err := http.NewRequest("GET", url, nil) if err != nil { return nil, err } - req.SetBasicAuth(wtf.Config.UString("wtf.mods.jira.email"), apiKey()) + req.SetBasicAuth(widget.settings.email, widget.settings.apiKey) - verifyServerCertificate := wtf.Config.UBool("wtf.mods.jira.verifyServerCertificate", true) httpClient := &http.Client{Transport: &http.Transport{ TLSClientConfig: &tls.Config{ - InsecureSkipVerify: !verifyServerCertificate, + InsecureSkipVerify: !widget.settings.verifyServerCertificate, }, Proxy: http.ProxyFromEnvironment, }, diff --git a/modules/jira/settings.go b/modules/jira/settings.go new file mode 100644 index 00000000..a31c6f04 --- /dev/null +++ b/modules/jira/settings.go @@ -0,0 +1,74 @@ +package jira + +import ( + "os" + + "github.com/olebedev/config" + "github.com/wtfutil/wtf/cfg" +) + +type colors struct { + rows struct { + even string + odd string + } +} + +type Settings struct { + colors + common *cfg.Common + + apiKey string + domain string + email string + jql string + projects []string + username string + verifyServerCertificate bool +} + +func NewSettingsFromYAML(ymlConfig *config.Config) *Settings { + localConfig, _ := ymlConfig.Get("wtf.mods.jira") + + settings := Settings{ + common: cfg.NewCommonSettingsFromYAML(ymlConfig), + + apiKey: localConfig.UString("apiKey", os.Getenv("WTF_JIRA_API_KEY")), + domain: localConfig.UString("domain"), + email: localConfig.UString("email"), + jql: localConfig.UString("jql"), + username: localConfig.UString("username"), + verifyServerCertificate: localConfig.UBool("verifyServerCertificate", true), + } + + settings.colors.rows.even = localConfig.UString("colors.even", "lightblue") + settings.colors.rows.odd = localConfig.UString("colors.odd", "white") + + settings.projects = settings.arrayifyProjects(localConfig) + + return &settings +} + +/* -------------------- Unexported functions -------------------- */ + +// arrayifyProjects figures out if we're dealing with a single project or an array of projects +func (settings *Settings) arrayifyProjects(localConfig *config.Config) []string { + projects := []string{} + + // Single project + project, err := localConfig.String("project") + if err == nil { + projects = append(projects, project) + return projects + } + + // Array of projects + projectList := localConfig.UList("project") + for _, projectName := range projectList { + if project, ok := projectName.(string); ok { + projects = append(projects, project) + } + } + + return projects +} diff --git a/modules/jira/widget.go b/modules/jira/widget.go index ef260a12..06c1b887 100644 --- a/modules/jira/widget.go +++ b/modules/jira/widget.go @@ -28,12 +28,15 @@ type Widget struct { result *SearchResult selected int + settings *Settings } -func NewWidget(app *tview.Application, pages *tview.Pages) *Widget { +func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), TextWidget: wtf.NewTextWidget(app, "Jira", "jira", true), + + settings: settings, } widget.HelpfulWidget.SetView(widget.View) @@ -48,10 +51,10 @@ func NewWidget(app *tview.Application, pages *tview.Pages) *Widget { /* -------------------- Exported Functions -------------------- */ func (widget *Widget) Refresh() { - searchResult, err := IssuesFor( - wtf.Config.UString("wtf.mods.jira.username"), - getProjects(), - wtf.Config.UString("wtf.mods.jira.jql", ""), + searchResult, err := widget.IssuesFor( + widget.settings.username, + widget.settings.projects, + widget.settings.jql, ) if err != nil { @@ -74,7 +77,7 @@ func (widget *Widget) display() { } widget.View.SetWrap(false) - str := fmt.Sprintf("%s- [green]%s[white]", widget.Name(), wtf.Config.UString("wtf.mods.jira.project")) + str := fmt.Sprintf("%s- [green]%s[white]", widget.Name(), widget.settings.projects) widget.View.Clear() widget.View.SetTitle(widget.ContextualTitle(str)) @@ -100,7 +103,7 @@ func (widget *Widget) openItem() { sel := widget.selected if sel >= 0 && widget.result != nil && sel < len(widget.result.Issues) { issue := &widget.result.Issues[widget.selected] - wtf.OpenFile(wtf.Config.UString("wtf.mods.jira.domain") + "/browse/" + issue.Key) + wtf.OpenFile(widget.settings.domain + "/browse/" + issue.Key) } } @@ -137,7 +140,12 @@ func (widget *Widget) rowColor(idx int) string { if widget.View.HasFocus() && (idx == widget.selected) { return wtf.DefaultFocussedRowColor() } - return wtf.RowColor("jira", idx) + + if idx%2 == 0 { + return widget.settings.colors.rows.even + } + + return widget.settings.colors.rows.odd } func (widget *Widget) issueTypeColor(issue *Issue) string { @@ -153,24 +161,6 @@ func (widget *Widget) issueTypeColor(issue *Issue) string { } } -func getProjects() []string { - // see if project is set to a single string - configPath := "wtf.mods.jira.project" - singleProject, err := wtf.Config.String(configPath) - if err == nil { - return []string{singleProject} - } - // else, assume list - projList := wtf.Config.UList(configPath) - var ret []string - for _, proj := range projList { - if str, ok := proj.(string); ok { - ret = append(ret, str) - } - } - return ret -} - func (widget *Widget) keyboardIntercept(event *tcell.EventKey) *tcell.EventKey { switch string(event.Rune()) { case "/": diff --git a/wtf/utils.go b/wtf/utils.go index c8e8ae01..205ea09a 100644 --- a/wtf/utils.go +++ b/wtf/utils.go @@ -136,10 +136,7 @@ func ReadFileBytes(filePath string) ([]byte, error) { } func RightAlignFormat(view *tview.TextView) string { - //mutex := &sync.Mutex{} - //mutex.Lock() _, _, w, _ := view.GetInnerRect() - //mutex.Unlock() return fmt.Sprintf("%%%ds", w-1) }