/// <summary> /// Constructor /// </summary> /// <param name="cardClient">jiraService used to get the related tickets</param> /// <param name="tickets">list of tickets that will be analysed</param> /// <param name="bucketSize">size of the bucket. if not specifed, set to a day</param> /// <param name="from">start date - if not specified, taking the earliest created ticket</param> /// <param name="to">end date - if not specified, taking the latest ticket closure</param> public CumulativeFlowAnalyser(ICardManagerClient cardClient, IEnumerable <Card> tickets, IEnumerable <CardStatus> statusesFilter, TimeSpan?bucketSize = null, DateTime?from = null, DateTime?to = null) { _cardClient = cardClient ?? throw new ArgumentNullException(nameof(cardClient)); _cards = tickets; _statusesFilter = statusesFilter; _dateFrom = from ?? _cards.Min(t => t.CreationDate); _dateTo = to ?? _cards.Max(t => t.ClosureDate) ?? DateTime.Now; _bucketSize = bucketSize ?? new TimeSpan(1, 0, 0, 0); if (_dateFrom > _dateTo) { throw new ArgumentException("Date from is after Date to"); } }
/// <summary> /// Constructor /// </summary> public DefaultModelConverter(ICardManagerClient cmClient, Dictionary <CardFieldMeta, string> overrides = null) { _client = cmClient ?? throw new ArgumentNullException(nameof(cmClient)); _jiraFieldMapping = new List <Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> > > { new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Summary", CardFieldMeta.Title, o => (string)o, (str1, str2, client) => str2 ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Issue Type", CardFieldMeta.Type, o => IdentifyCardType((string)o.name), (str1, str2, client) => IdentifyCardType(str2) ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Description", CardFieldMeta.Description, o => (string)o, (str1, str2, client) => str2 ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Created", CardFieldMeta.Created, o => (DateTime)o, (str1, str2, client) => DateTime.Parse(str2) ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Resolved", CardFieldMeta.ResolutionDate, o => (DateTime?)o, (str1, str2, client) => string.IsNullOrEmpty(str2) ? (DateTime?)null : DateTime.Parse(str2) ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Due Date", CardFieldMeta.DueDate, o => (DateTime?)o, (str1, str2, client) => string.IsNullOrEmpty(str2) ? (DateTime?)null : DateTime.Parse(str2) ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Story Points", CardFieldMeta.Points, o => (double?)o, (str1, str2, client) => string.IsNullOrEmpty(str2) ? (double?)null : Double.Parse(str2) ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Sprint", CardFieldMeta.Sprint, o => ExtractSprintDetailsFromString(o), (str1, str2, client) => string.IsNullOrEmpty(str1) ? (Sprint)null : (Sprint)client.GetSprint((string)str1) // str1 = sprintId, str2 = sprintNames ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Flagged", CardFieldMeta.Flagged, o => o != null, (str1, str2, client) => str2 == "Impediment" // throw new NotImplementedException() ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Resolution", CardFieldMeta.Resolution, o => o != null ? IdentifyCardResolution((string)o.name) : null, (str1, str2, client) => IdentifyCardResolution(str2) ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Status", CardFieldMeta.Status, o => ConvertStatus(o), (str1, str2, client) => string.IsNullOrEmpty(str1) ? (CardStatus)null : client.GetStatus((string)str1) // str1 = statusId, str2 = statusname ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Epic Link", CardFieldMeta.EpicId, o => (string)o, (str1, str2, client) => str2 ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Rank", CardFieldMeta.Rank, o => (string)o, (str1, str2, client) => str2 ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Labels", CardFieldMeta.Tags, o => ExtractTagList <string>(o, LabelTagCategory), (str1, str2, client) => str2 ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Assignee", CardFieldMeta.Assignee, o => ConvertUser(o), (str1, str2, client) => string.IsNullOrEmpty(str1) ? (User)null : client.GetUser((string)str1) ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Reporter", CardFieldMeta.Reporter, o => ConvertUser(o), (str1, str2, client) => string.IsNullOrEmpty(str1) ? (User)null : client.GetUser((string)str1) ), new Tuple <string, CardFieldMeta, Func <dynamic, object>, Func <string, string, ICardManagerClient, object> >( "Creator", CardFieldMeta.Creator, o => ConvertUser(o), (str1, str2, client) => string.IsNullOrEmpty(str1) ? (User)null : client.GetUser((string)str1) ), }; if (overrides != null) { _fieldMappingOverrides = new Dictionary <CardFieldMeta, string>(overrides); } }