/// <summary> /// Creates a new metrics extractor for the given Kanban configuration /// </summary> /// <param name="config">configuration to use</param> /// <param name="logCallback">optional callback delegate to receive log messages</param> public MetricsExtractor(JiraKanbanConfig config, Action <string> logCallback = null) { if (config == null) { throw new ArgumentNullException(nameof(config)); } if (string.IsNullOrWhiteSpace(config.JiraInstanceBaseAddress)) { throw new ArgumentNullException(nameof(config.JiraInstanceBaseAddress)); } if (string.IsNullOrWhiteSpace(config.JiraUsername)) { throw new ArgumentNullException(nameof(config.JiraUsername)); } if (config.JiraPassword == null || config.JiraPassword.Length == 0) { throw new ArgumentNullException(nameof(config.JiraPassword)); } _config = config; _logCallback = logCallback; _client = new HttpClient { BaseAddress = new Uri(config.JiraInstanceBaseAddress) }; var auth = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{config.JiraUsername}:{Crypto.GetStr(config.JiraPassword)}")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", auth); }
/// <summary> /// Create charts for the given configuration and list of issues /// </summary> /// <param name="config">Jira Kanban configuration</param> /// <param name="issues">list of issues</param> /// <returns>Kanban charts</returns> public static KanbanCharts Create(JiraKanbanConfig config, Issue[] issues) { var c = new KanbanCharts { Config = config, Issues = issues, StartDate = DateTime.Today.AddMonths(config.MonthsToAnalyse * -1), EndDate = DateTime.Today.AddDays((int)DateTime.Today.DayOfWeek * -1), }; // Consolidate information about tickets that are done c.DoneIssues = issues .Where(ticket => ticket.Entered(config.CommitmentStartColumns).HasValue) .Where(ticket => ticket.Entered(config.InProgressStartColumns).HasValue) .Where(ticket => ticket.Entered(config.DoneColumns).HasValue) .Select(ticket => new DoneIssue { IssueKey = ticket.IssueKey, IssueType = ticket.IssueType, LeadTime = ticket.LeadTime(config), TouchTime = ticket.TouchTime(config), QueueTime = ticket.QueueTime(config), Columns = ticket.Columns, // ReSharper disable PossibleInvalidOperationException ToDo = ticket.Entered(config.CommitmentStartColumns).Value, InProgress = ticket.Entered(config.InProgressStartColumns).Value, Done = ticket.FirstEntered(config.DoneColumns).Value, // ReSharper restore PossibleInvalidOperationException }) .Where(ticket => ticket.Done >= c.StartDate) .Where(ticket => ticket.Done <= c.EndDate) .ToArray(); c.ComputeAllCharts(); return(c); }
/// <summary> /// Determines if a given issue type is a defect, given a configuration /// </summary> /// <param name="issueType">issue type</param> /// <param name="config">kanban configuration</param> /// <returns>true if the issue type is a defect</returns> public static bool IsDefect(this string issueType, JiraKanbanConfig config) { var defects = config.DefectIssueTypes; return(defects.Any(s => s.Equals(issueType, StringComparison.InvariantCultureIgnoreCase))); }