ADO Markdown

This commit is contained in:
Mike Phares 2024-09-11 20:49:14 -07:00
parent 5d679ae04c
commit ba9b7d8d64
27 changed files with 2777 additions and 33 deletions

1094
.json Normal file

File diff suppressed because one or more lines are too long

1421
.md Normal file

File diff suppressed because it is too large Load Diff

20
.vscode/launch.json vendored
View File

@ -13,16 +13,16 @@
"args": [
"s",
"X",
"L:/DevOps/Mesa_FI/File-Folder-Helper/.vscode/helper/tfs",
"Day-Helper-2024-08-30",
"MES",
"https://tfs.intra.infineon.com",
"/tfs/FactoryIntegration",
"ART SPS",
"/0d06e969-e1f5-4835-a359-620d557c7595/_apis/wit",
"/wiql/3373b300-8de3-4301-9795-e990c3b226f9",
"4n7d2jcql6bkq32f66tohddonfxajkypq66lm5y3zqemtlohawsa",
"FI Backlog Mesa - Request List.json"
"D:/5-Other-Small/Kanban-messa010ec/Work-Items",
"Day-Helper-2024-09-11",
"*.json",
".kanbn",
"444",
"555",
"666",
"777",
"888",
"999"
],
"cwd": "${workspaceFolder}",
"console": "integratedTerminal",

View File

@ -89,18 +89,24 @@ internal static class HelperDay
Day.Q32024.Helper20240805.RenameFiles(logger, args);
else if (args[1] == "Day-Helper-2024-08-06")
Day.Q32024.Helper20240806.ArchiveFiles(logger, args);
#if WorkItems
else if (args[1] == "Day-Helper-2024-08-09")
Day.Q32024.Helper20240809.CreateWorkItems(logger, args);
#endif
else if (args[1] == "Day-Helper-2024-08-20")
Day.Q32024.Helper20240820.MoveFilesWithSleep(logger, args);
else if (args[1] == "Day-Helper-2024-08-22")
Day.Q32024.Helper20240822.ParseKanbn(logger, args);
else if (args[1] == "Day-Helper-2024-08-28")
Day.Q32024.Helper20240828.MoveWaferCounterToArchive(logger, args);
#if WorkItems
else if (args[1] == "Day-Helper-2024-08-30")
Day.Q32024.Helper20240830.CompareWorkItems(logger, args);
#endif
else if (args[1] == "Day-Helper-2024-09-10")
Day.Q32024.Helper20240910.MoveFilesToWeekOfYear(logger, args);
else if (args[1] == "Day-Helper-2024-09-11")
Day.Q32024.Helper20240911.WriteMarkdown(logger, args);
else
throw new Exception(appSettings.Company);
}

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.ConvertExcelToJson;
@ -142,3 +143,4 @@ internal partial class FIBacklogMesaCollectionSourceGenerationContext : JsonSeri
internal partial class FIBacklogMesaSourceGenerationContext : JsonSerializerContext
{
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using File_Folder_Helper.Day.Q32024.ConvertExcelToJson;
using File_Folder_Helper.Day.Q32024.WorkItems;
using File_Folder_Helper.Models;
@ -701,3 +702,4 @@ internal static partial class Helper20240809
}
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using File_Folder_Helper.Day.Q32024.WorkItems;
using Microsoft.Extensions.Logging;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
@ -232,3 +233,4 @@ internal static partial class Helper20240830
}
}
#endif

View File

@ -0,0 +1,179 @@
using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024;
internal static partial class Helper20240911
{
public record Attribute([property: JsonPropertyName("isLocked")] bool IsLocked,
[property: JsonPropertyName("name")] string Name);
public record Relation([property: JsonPropertyName("rel")] string Type,
[property: JsonPropertyName("url")] string URL,
[property: JsonPropertyName("attributes")] Attribute Attribute);
public record Record(WorkItem WorkItem, ReadOnlyDictionary<int, Record> Children);
public record WorkItem(string AreaPath,
string? AssignedTo,
int? BusinessValue,
DateTime ChangedDate,
DateTime? ClosedDate,
int CommentCount,
DateTime CreatedDate,
string Description,
float? Effort,
int Id,
string IterationPath,
int? Parent,
int? Priority,
Relation[] Relations,
string? Requester,
DateTime? ResolvedDate,
int Revision,
int? RiskReductionMinusOpportunityEnablement,
DateTime? StartDate,
string State,
string Tags,
DateTime? TargetDate,
float? TimeCriticality,
string Title,
string WorkItemType,
float? WeightedShortestJobFirst);
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(WorkItem))]
internal partial class WorkItemSourceGenerationContext : JsonSerializerContext
{
}
private static ReadOnlyDictionary<int, WorkItem> GetWorkItems(string filterDirectory, string[] files)
{
Dictionary<int, WorkItem> results = [];
string json;
WorkItem? workItem;
string? directoryName;
foreach (string file in files)
{
directoryName = Path.GetDirectoryName(file);
if (string.IsNullOrEmpty(directoryName))
continue;
if (!directoryName.EndsWith(filterDirectory))
continue;
json = File.ReadAllText(file);
workItem = JsonSerializer.Deserialize(json, WorkItemSourceGenerationContext.Default.WorkItem);
if (workItem is null)
continue;
results.Add(workItem.Id, workItem);
}
return new(results);
}
private static int? GetIdFromUrlIfChild(Relation relation)
{
int? result;
string[] segments = relation.Attribute.Name != "Child" ? [] : relation.URL.Split('/');
if (segments.Length < 2)
result = null;
else
{
if (!int.TryParse(segments[^1], out int id))
result = null;
else
result = id;
}
return result;
}
private static Dictionary<int, Record> GetKeyValuePairs(ReadOnlyDictionary<int, WorkItem> workItems, WorkItem workItem)
{
Dictionary<int, Record> results = [];
int? childId;
WorkItem? childWorkItem;
Dictionary<int, Record> keyValuePairs;
if (workItem.Relations is not null && workItem.Relations.Length > 0)
{
foreach (Relation relation in workItem.Relations)
{
childId = GetIdFromUrlIfChild(relation);
if (childId is null || !workItems.TryGetValue(childId.Value, out childWorkItem))
continue;
keyValuePairs = GetKeyValuePairs(workItems, childWorkItem);
results.Add(childId.Value, new(childWorkItem, new(keyValuePairs)));
}
}
return results;
}
private static ReadOnlyDictionary<int, Record> GetWorkItemAndChildren(ReadOnlyDictionary<int, WorkItem> workItems)
{
Dictionary<int, Record> results = [];
Dictionary<int, Record> keyValuePairs;
foreach (KeyValuePair<int, WorkItem> keyValuePair in workItems)
{
// if (keyValuePair.Key != 119185)
// continue;
keyValuePairs = GetKeyValuePairs(workItems, keyValuePair.Value);
results.Add(keyValuePair.Key, new(keyValuePair.Value, new(keyValuePairs)));
}
return new(results);
}
private static string GetClosed(WorkItem workItem)
{
string result = workItem.ClosedDate is null ? "[ ]" : "[x]";
return result;
}
private static void AppendLines(List<char> spaces, List<string> lines, Record record)
{
spaces.Add('\t');
WorkItem workItem;
foreach (KeyValuePair<int, Record> keyValuePair in record.Children)
{
workItem = keyValuePair.Value.WorkItem;
lines.Add($"{new string(spaces.ToArray())}- {GetClosed(workItem)} {keyValuePair.Key} - {workItem.Title} - {workItem.ClosedDate}");
AppendLines(spaces, lines, keyValuePair.Value);
}
spaces.RemoveAt(0);
}
private static void AppendLines(List<char> spaces, List<string> lines, ReadOnlyDictionary<int, Record> workItemAndChildren)
{
WorkItem workItem;
foreach (KeyValuePair<int, Record> keyValuePair in workItemAndChildren)
{
workItem = keyValuePair.Value.WorkItem;
lines.Add($"## {keyValuePair.Key} - {workItem.Title}");
lines.Add(string.Empty);
lines.Add($"{new string(spaces.ToArray())}- {GetClosed(workItem)} {keyValuePair.Key} - {workItem.Title} - {workItem.ClosedDate}");
AppendLines(spaces, lines, keyValuePair.Value);
lines.Add(string.Empty);
}
}
internal static void WriteMarkdown(ILogger<Worker> logger, List<string> args)
{
List<char> spaces = [];
string searchPattern = args[2];
string filterDirectory = args[3];
List<string> lines = ["# WorkItems", string.Empty];
string sourceDirectory = Path.GetFullPath(args[0]);
string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories);
logger.LogInformation("With search pattern '{SearchPattern}' found {files} file(s)", searchPattern, files.Length);
ReadOnlyDictionary<int, WorkItem> workItems = GetWorkItems(filterDirectory, files);
logger.LogInformation("With search pattern '{SearchPattern}' found {files} workItem(s)", searchPattern, workItems.Count);
ReadOnlyDictionary<int, Record> workItemAndChildren = GetWorkItemAndChildren(workItems);
logger.LogInformation("With search pattern '{SearchPattern}' found {files} workItemAndChildren", searchPattern, workItemAndChildren.Count);
if (workItemAndChildren.Count == -1)
{
string json = JsonSerializer.Serialize(workItemAndChildren, new JsonSerializerOptions() { WriteIndented = true });
File.WriteAllText(".json", json);
}
AppendLines(spaces, lines, workItemAndChildren);
File.WriteAllText(".md", string.Join(Environment.NewLine, lines));
}
}

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WIQL;
@ -20,3 +21,4 @@ public class Column
public string Name { get; set; } // { init; get; }
public string Url { get; set; } // { init; get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WIQL;
@ -20,3 +21,4 @@ public class Field
public string Name { get; set; } // { init; get; }
public string Url { get; set; } // { init; get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WIQL;
@ -35,3 +36,4 @@ public class Root
internal partial class WIQLRootSourceGenerationContext : JsonSerializerContext
{
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WIQL;
@ -17,3 +18,4 @@ public class SortColumn
public Field Field { get; set; } // { init; get; }
public bool Descending { get; set; } // { init; get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WIQL;
@ -17,3 +18,4 @@ public class WorkItem
public int Id { get; set; } // { init; get; }
public string Url { get; set; } // { init; get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WorkItems;
@ -11,3 +12,4 @@ public class Avatar
public string Href { get; } // { init; get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WorkItems;
@ -25,3 +26,4 @@ public class CommentVersionRef
[JsonPropertyName("url")]
public string URL { get; } // { init; get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WorkItems;
@ -32,3 +33,4 @@ public class CustomRequester
[JsonPropertyName("uniqueName")] public string UniqueName { get; }
[JsonPropertyName("url")] public string Url { get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WorkItems;
@ -97,3 +98,4 @@ public class Fields
[JsonPropertyName("System.WorkItemType")] public string SystemWorkItemType { get; } // { init; get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WorkItems;
@ -11,3 +12,4 @@ public class Html
public string Href { get; } // { init; get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WorkItems;
@ -12,3 +13,4 @@ public class Links
[JsonPropertyName("avatar")]
public Avatar Avatar { get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WorkItems;
@ -45,3 +46,4 @@ public class SystemAssignedTo
[JsonPropertyName("descriptor")]
public string Descriptor { get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WorkItems;
@ -45,3 +46,4 @@ public class SystemChangedBy
[JsonPropertyName("descriptor")]
public string Descriptor { get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WorkItems;
@ -45,3 +46,4 @@ public class SystemCreatedBy
[JsonPropertyName("descriptor")]
public string Descriptor { get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Day.Q32024.WorkItems;
@ -52,3 +53,4 @@ internal partial class ValueCollectionSourceGenerationContext : JsonSerializerCo
internal partial class ValueSourceGenerationContext : JsonSerializerContext
{
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
namespace File_Folder_Helper.Day.Q32024.WorkItems;
public class ValueWithReq
@ -17,3 +18,4 @@ public class ValueWithReq
public int Req { get; set; } // { init; get; }
public string Json { get; set; } // { init; get; }
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using System.Text.Json.Serialization;
namespace File_Folder_Helper.Models;
@ -17,3 +18,4 @@ public record Comment([property: JsonPropertyName("workItemId")] int? WorkItemId
internal partial class CommentSourceGenerationContext : JsonSerializerContext
{
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using File_Folder_Helper.Day.Q32024.WorkItems;
using System.Text.Json.Serialization;
@ -16,3 +17,4 @@ public record CreatedBy([property: JsonPropertyName("displayName")] string? Disp
internal partial class CreatedBySourceGenerationContext : JsonSerializerContext
{
}
#endif

View File

@ -1,3 +1,4 @@
#if WorkItems
using File_Folder_Helper.Day.Q32024.WorkItems;
using System.Text.Json.Serialization;
@ -16,3 +17,4 @@ public record ModifiedBy([property: JsonPropertyName("displayName")] string? Dis
internal partial class ModifiedBySourceGenerationContext : JsonSerializerContext
{
}
#endif