ADO Markdown
This commit is contained in:
parent
5d679ae04c
commit
ba9b7d8d64
20
.vscode/launch.json
vendored
20
.vscode/launch.json
vendored
@ -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",
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
@ -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
|
@ -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
|
179
Day/Q32024/Helper-2024-09-11.cs
Normal file
179
Day/Q32024/Helper-2024-09-11.cs
Normal 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));
|
||||
}
|
||||
|
||||
}
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user