// Display project details // http://docs.gemnasium.apiary.io/#get-%2Fprojects%2F%7Bslug%7D func (p *Project) Show() error { err := p.Fetch() if err != nil { return err } if config.RawFormat { return nil } color.Println(fmt.Sprintf("%s: %s\n", p.Name, utils.StatusDots(p.Color))) table := tablewriter.NewWriter(os.Stdout) table.SetRowLine(true) table.Append([]string{"Slug", p.Slug}) table.Append([]string{"Description", p.Description}) table.Append([]string{"Origin", p.Origin}) table.Append([]string{"Private", strconv.FormatBool(p.Private)}) table.Append([]string{"Monitored", strconv.FormatBool(p.Monitored)}) if !p.Monitored { table.Append([]string{"Unmonitored reason", p.UnmonitoredReason}) } table.Render() return nil }
// Live evaluation of dependency files Several files can be sent, not only from // the same language (ie: package.json + Gemfile + Gemfile.lock) LiveEvaluation // will return 2 stases (color for Runtime / Dev.) and the list of deps with // their color. func LiveEvaluation(files []string) error { dfiles, err := models.LookupDependencyFiles(files) if err != nil { return err } requestDeps := map[string][]*models.DependencyFile{"dependency_files": dfiles} var jsonResp map[string]interface{} opts := &gemnasium.APIRequestOptions{ Method: "POST", URI: LIVE_EVAL_PATH, Body: requestDeps, Result: &jsonResp, } err = gemnasium.APIRequest(opts) if err != nil { return err } // Wait until job is done url := fmt.Sprintf("%s%s/%s", config.APIEndpoint, LIVE_EVAL_PATH, jsonResp["job_id"]) req, err := http.NewRequest("GET", url, nil) if err != nil { return err } req.SetBasicAuth("x", config.APIKey) req.Header.Add("Content-Type", "application/json") var response struct { Status string `json:"status"` Result struct { RuntimeStatus string `json:"runtime_status"` DevelopmentStatus string `json:"development_status"` Dependencies []models.Dependency `json:"dependencies"` } `json:"result"` } var iter int // used to display the little dots for each loop bellow client := &http.Client{} for { // use the same request again and again resp, err := client.Do(req) if err != nil { return err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return err } if resp.StatusCode != http.StatusOK { response.Status = "error" } if err = json.Unmarshal(body, &response); err != nil { return err } if !config.RawFormat { // don't display status if RawFormat iter += 1 fmt.Printf("\rJob Status: %s%s", response.Status, strings.Repeat(".", iter)) } if response.Status != "working" && response.Status != "queued" { // Job has completed or failed or whatever if config.RawFormat { fmt.Printf("%s\n", body) return nil } break } // Wait 1s before trying again time.Sleep(time.Second * 1) } color.Println(fmt.Sprintf("\n\n%-12.12s %s", "Run. Status", utils.StatusDots(response.Result.RuntimeStatus))) color.Println(fmt.Sprintf("%-12.12s %s\n\n", "Dev. Status", utils.StatusDots(response.Result.DevelopmentStatus))) // Display deps in an ascii table models.RenderDepsAsTable(response.Result.Dependencies, os.Stdout) if response.Result.RuntimeStatus == "red" { return fmt.Errorf("There are important updates available.\n") } return nil }