Removed
VerifyPersonContainersDisplayDirectoryAllFiles, SaveOne, SaveParents, GetRelations, CleanDisplayDirectoryAllFilesAndWriteTicksGed
This commit is contained in:
parent
9071784255
commit
1594783c7d
@ -22,6 +22,7 @@ taskTemplate: '^+^_${overdue ? ''^R'' : ''''}${name}^: ${relations ? (''\n^-^/^g
|
|||||||
- [image-size-distribution-per-exif-model-directory-when-no-model](tasks/image-size-distribution-per-exif-model-directory-when-no-model.md)
|
- [image-size-distribution-per-exif-model-directory-when-no-model](tasks/image-size-distribution-per-exif-model-directory-when-no-model.md)
|
||||||
- [skip-metadata-load-after-first-each-day](tasks/skip-metadata-load-after-first-each-day.md)
|
- [skip-metadata-load-after-first-each-day](tasks/skip-metadata-load-after-first-each-day.md)
|
||||||
- [cluster-questioning](tasks/cluster-questioning.md)
|
- [cluster-questioning](tasks/cluster-questioning.md)
|
||||||
|
- [console-for-markdown-to-genealogical-data-communication](tasks/console-for-markdown-to-genealogical-data-communication.md)
|
||||||
|
|
||||||
## Todo
|
## Todo
|
||||||
|
|
||||||
@ -35,7 +36,7 @@ taskTemplate: '^+^_${overdue ? ''^R'' : ''''}${name}^: ${relations ? (''\n^-^/^g
|
|||||||
|
|
||||||
- [merge-kristy-files](tasks/merge-kristy-files.md)
|
- [merge-kristy-files](tasks/merge-kristy-files.md)
|
||||||
- [set-date-taken-when-missing](tasks/set-date-taken-when-missing.md)
|
- [set-date-taken-when-missing](tasks/set-date-taken-when-missing.md)
|
||||||
- [console-for-markdown-to-genealogical-data-communication](tasks/console-for-markdown-to-genealogical-data-communication.md)
|
- [ged-as-golden](tasks/ged-as-golden.md)
|
||||||
|
|
||||||
## Done
|
## Done
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
created: "2023-07-21T18:26:38.894Z"
|
created: "2023-07-21T18:26:38.894Z"
|
||||||
updated: "2023-07-22T06:43:30.988Z"
|
updated: "2023-07-30T04:45:55.208Z"
|
||||||
assigned: ""
|
assigned: ""
|
||||||
progress: 0
|
progress: 0
|
||||||
started: "2023-07-21T04:38:02.640Z"
|
started: "2023-07-21T04:38:02.640Z"
|
||||||
|
15
.kanbn/tasks/ged-as-golden.md
Normal file
15
.kanbn/tasks/ged-as-golden.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
created: 2023-07-30T04:46:47.436Z
|
||||||
|
updated: 2023-07-30T04:46:47.431Z
|
||||||
|
assigned: ""
|
||||||
|
progress: 0
|
||||||
|
tags: []
|
||||||
|
started: 2023-07-30T04:46:47.436Z
|
||||||
|
---
|
||||||
|
|
||||||
|
# GED as Golden
|
||||||
|
|
||||||
|
[ ] From directories create one *.pged file to compare
|
||||||
|
[x] From *.rmtree file export *.ged file
|
||||||
|
[ ] Read *.ged and write five files
|
||||||
|
[?] Create directories to compare with current
|
6
.vscode/tasks.json
vendored
6
.vscode/tasks.json
vendored
@ -59,6 +59,12 @@
|
|||||||
"type": "shell",
|
"type": "shell",
|
||||||
"command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s M '.kanbn/tasks'",
|
"command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s M '.kanbn/tasks'",
|
||||||
"problemMatcher": []
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "File-Folder-Helper AOT s M Self .Kanbn Tasks",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s G D:/1-Images-A/Images-dd514b88-Results/A2) People/dd514b88/{} -g D:/1-Images-A/Images-dd514b88-Results/A2) People/dd514b88/([])/Code-638160743318283885/aaa/638160743318283885.ged -d D:/1-Images-A/Images-dd514b88-Results/A2) People/dd514b88/{2}",
|
||||||
|
"problemMatcher": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -40,7 +40,6 @@ public partial class DlibDotNet
|
|||||||
private readonly Models.Configuration _Configuration;
|
private readonly Models.Configuration _Configuration;
|
||||||
private readonly bool _ArgZeroIsConfigurationRootDirectory;
|
private readonly bool _ArgZeroIsConfigurationRootDirectory;
|
||||||
private readonly Map.Models.Configuration _MapConfiguration;
|
private readonly Map.Models.Configuration _MapConfiguration;
|
||||||
private readonly ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> _FamilyIndexToCollection;
|
|
||||||
|
|
||||||
public DlibDotNet(
|
public DlibDotNet(
|
||||||
List<string> args,
|
List<string> args,
|
||||||
@ -110,10 +109,7 @@ public partial class DlibDotNet
|
|||||||
_MapConfiguration = Get(configuration, _Faces.FileNameExtension, _Faces.HiddenFileNameExtension, _FaceParts.FileNameExtension);
|
_MapConfiguration = Get(configuration, _Faces.FileNameExtension, _Faces.HiddenFileNameExtension, _FaceParts.FileNameExtension);
|
||||||
_Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistanceRenameToMatch, _Configuration.FaceConfidencePercent, configuration.RangeDistanceTolerance, configuration.RangeFaceConfidence, configuration.RectangleIntersectMinimums);
|
_Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistanceRenameToMatch, _Configuration.FaceConfidencePercent, configuration.RangeDistanceTolerance, configuration.RangeFaceConfidence, configuration.RectangleIntersectMinimums);
|
||||||
if (_PropertyRootExistedBefore || !_ArgZeroIsConfigurationRootDirectory)
|
if (_PropertyRootExistedBefore || !_ArgZeroIsConfigurationRootDirectory)
|
||||||
{
|
|
||||||
personContainers = new(new List<PersonContainer>());
|
personContainers = new(new List<PersonContainer>());
|
||||||
_FamilyIndexToCollection = new(new Dictionary<int, List<GenealogicalDataCommunicationRelation>>());
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||||
@ -125,20 +121,19 @@ public partial class DlibDotNet
|
|||||||
string peopleRootDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(propertyConfiguration, nameof(A2_People));
|
string peopleRootDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(propertyConfiguration, nameof(A2_People));
|
||||||
string? rootResultsDirectory = Path.GetDirectoryName(Path.GetDirectoryName(peopleRootDirectory)) ?? throw new Exception();
|
string? rootResultsDirectory = Path.GetDirectoryName(Path.GetDirectoryName(peopleRootDirectory)) ?? throw new Exception();
|
||||||
Storage storage = new(rootDirectory, rootResultsDirectory, peopleRootDirectory);
|
Storage storage = new(rootDirectory, rootResultsDirectory, peopleRootDirectory);
|
||||||
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(Path.Combine(peopleRootDirectory, _Configuration.PropertyConfiguration.ResultSingleton));
|
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(Path.Combine(peopleRootDirectory, propertyConfiguration.ResultSingleton));
|
||||||
personContainers = new(IPersonContainer.GetPersonContainers(storage, configuration.MappingDefaultName, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), _Faces.FileNameExtension));
|
personContainers = new(IPersonContainer.GetPersonContainers(storage, configuration.MappingDefaultName, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), _Faces.FileNameExtension));
|
||||||
(string[] headerLines, ReadOnlyDictionary<string, string[]> individuals, List<string[]> familyGroupLines, string[] footerLines, List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) = IGenealogicalDataCommunication.GetIndividuals(configuration.PropertyConfiguration.PersonBirthdayFormat, configuration.GenealogicalDataCommunicationFile, personContainers, requireNickName: true);
|
GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections = IGenealogicalDataCommunication.GetIndividuals(configuration.GenealogicalDataCommunicationFile, requireNickName: true);
|
||||||
_FamilyIndexToCollection = IGenealogicalDataCommunication.GetFamilyIndexToCollection(genealogicalDataCommunicationRelations);
|
if (!string.IsNullOrEmpty(configuration.GenealogicalDataCommunicationFile) && genealogicalDataCommunicationCollections.HeaderLines.Any() && genealogicalDataCommunicationCollections.Individuals.Any() && genealogicalDataCommunicationCollections.FamilyGroupLines.Any() && genealogicalDataCommunicationCollections.FooterLines.Any())
|
||||||
VerifyPersonContainersDisplayDirectoryAllFiles();
|
|
||||||
if (!string.IsNullOrEmpty(_Configuration.GenealogicalDataCommunicationFile) && headerLines.Any() && individuals.Any() && familyGroupLines.Any() && genealogicalDataCommunicationRelations.Any() && footerLines.Any())
|
|
||||||
{
|
{
|
||||||
string a2PeopleContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), "([])");
|
string a2PeopleContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration.PropertyConfiguration, nameof(A2_People), "([])");
|
||||||
TimeSpan a2LastWriteTimeTimeSpan = new(ticks - new DirectoryInfo(a2PeopleContentDirectory).LastWriteTime.Ticks);
|
TimeSpan a2LastWriteTimeTimeSpan = new(ticks - new DirectoryInfo(a2PeopleContentDirectory).LastWriteTime.Ticks);
|
||||||
if (a2LastWriteTimeTimeSpan.TotalDays > 1)
|
if (a2LastWriteTimeTimeSpan.TotalDays > 1)
|
||||||
{
|
{
|
||||||
IGenealogicalDataCommunication.MaybeWriteMarkDownFiles(configuration.MappingDefaultName, configuration.PersonBirthdayFormat, ticks, personContainers, individuals, _FamilyIndexToCollection, a2PeopleContentDirectory);
|
ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> familyIndexToCollection = IGenealogicalDataCommunication.GetFamilyIndexToCollection(configuration.PersonBirthdayFormat, personContainers, genealogicalDataCommunicationCollections);
|
||||||
if (IGenealogicalDataCommunication.CleanDisplayDirectoryAllFilesAndWriteTicksGed(_Configuration.MappingDefaultName, _Configuration.PersonBirthdayFormat, personContainers, headerLines, familyGroupLines, footerLines, ticks, a2PeopleContentDirectory))
|
if (familyIndexToCollection.Count != 0)
|
||||||
personContainers = new(IPersonContainer.GetPersonContainers(storage, configuration.MappingDefaultName, configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), _Faces.FileNameExtension));
|
IGenealogicalDataCommunication.MaybeWriteMarkDownFiles(configuration.MappingDefaultName, configuration.PersonBirthdayFormat, ticks, personContainers, genealogicalDataCommunicationCollections.Individuals, familyIndexToCollection, a2PeopleContentDirectory);
|
||||||
|
Directory.SetLastWriteTime(a2PeopleContentDirectory, new(ticks));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1042,30 +1037,6 @@ public partial class DlibDotNet
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void VerifyPersonContainersDisplayDirectoryAllFiles()
|
|
||||||
{
|
|
||||||
// WindowsShortcut windowsShortcut;
|
|
||||||
// foreach (PersonContainer personContainer in personContainersB)
|
|
||||||
// {
|
|
||||||
// foreach (string file in personContainer.DisplayDirectoryAllFiles)
|
|
||||||
// {
|
|
||||||
// if (!file.EndsWith(".lnk"))
|
|
||||||
// continue;
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// windowsShortcut = WindowsShortcut.Load(file);
|
|
||||||
// if (windowsShortcut.Path is null)
|
|
||||||
// continue;
|
|
||||||
// if (!File.Exists(windowsShortcut.Path))
|
|
||||||
// File.Delete(file);
|
|
||||||
// windowsShortcut.Dispose();
|
|
||||||
// }
|
|
||||||
// catch (Exception)
|
|
||||||
// { }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void Verify(string eDistanceContentDirectory, List<Item> distinctFilteredItems)
|
private static void Verify(string eDistanceContentDirectory, List<Item> distinctFilteredItems)
|
||||||
{
|
{
|
||||||
#if VerifyItem
|
#if VerifyItem
|
||||||
@ -1189,7 +1160,7 @@ public partial class DlibDotNet
|
|||||||
if (eLastWriteTimeTimeSpan.TotalDays > 1)
|
if (eLastWriteTimeTimeSpan.TotalDays > 1)
|
||||||
mapLogic = null;
|
mapLogic = null;
|
||||||
else
|
else
|
||||||
mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, _FamilyIndexToCollection, personContainers, ticks, a2PeopleSingletonDirectory, eDistanceContentDirectory);
|
mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, personContainers, ticks, a2PeopleSingletonDirectory, eDistanceContentDirectory);
|
||||||
foreach (string outputResolution in _Configuration.OutputResolutions)
|
foreach (string outputResolution in _Configuration.OutputResolutions)
|
||||||
{
|
{
|
||||||
if (outputResolution.Any(l => char.IsNumber(l)))
|
if (outputResolution.Any(l => char.IsNumber(l)))
|
||||||
@ -1262,7 +1233,7 @@ public partial class DlibDotNet
|
|||||||
}
|
}
|
||||||
fileNameToCollection = !Directory.Exists(fPhotoPrismSingletonDirectory) ? fileNameToCollection = new() : F_PhotoPrism.GetFileNameToCollection(fPhotoPrismSingletonDirectory);
|
fileNameToCollection = !Directory.Exists(fPhotoPrismSingletonDirectory) ? fileNameToCollection = new() : F_PhotoPrism.GetFileNameToCollection(fPhotoPrismSingletonDirectory);
|
||||||
B_Metadata metadata = new(_Configuration.PropertyConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata, bResultsFullGroupDirectory);
|
B_Metadata metadata = new(_Configuration.PropertyConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata, bResultsFullGroupDirectory);
|
||||||
mapLogic ??= new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, _FamilyIndexToCollection, personContainers, ticks, a2PeopleSingletonDirectory, eDistanceContentDirectory);
|
mapLogic ??= new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _MapConfiguration, personContainers, ticks, a2PeopleSingletonDirectory, eDistanceContentDirectory);
|
||||||
containers = Shared.Models.Stateless.Methods.IContainer.SortContainers(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, _ArgZeroIsConfigurationRootDirectory, argZero, containers);
|
containers = Shared.Models.Stateless.Methods.IContainer.SortContainers(_Configuration.PropertyConfiguration, _Configuration.IgnoreRelativePaths, _ArgZeroIsConfigurationRootDirectory, argZero, containers);
|
||||||
ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers = mapLogic.GetIdToLocationContainers();
|
ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers = mapLogic.GetIdToLocationContainers();
|
||||||
FullDoWork(argZero, propertyRoot, ticks, aResultsFullGroupDirectory, bResultsFullGroupDirectory, t, containers, propertyLogic, metadata, fileNameToCollection, idToLocationContainers, mapLogic);
|
FullDoWork(argZero, propertyRoot, ticks, aResultsFullGroupDirectory, bResultsFullGroupDirectory, t, containers, propertyLogic, metadata, fileNameToCollection, idToLocationContainers, mapLogic);
|
||||||
|
@ -26,7 +26,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
private readonly string _EDistanceContentTicksDirectory;
|
private readonly string _EDistanceContentTicksDirectory;
|
||||||
private readonly Shared.Models.Properties.IPropertyConfiguration _PropertyConfiguration;
|
private readonly Shared.Models.Properties.IPropertyConfiguration _PropertyConfiguration;
|
||||||
|
|
||||||
public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> familyIndexToCollection, ReadOnlyCollection<PersonContainer> personContainers, long ticks, string a2PeopleSingletonDirectory, string eDistanceContentDirectory)
|
public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, ReadOnlyCollection<PersonContainer> personContainers, long ticks, string a2PeopleSingletonDirectory, string eDistanceContentDirectory)
|
||||||
{
|
{
|
||||||
_Ticks = ticks;
|
_Ticks = ticks;
|
||||||
_Configuration = configuration;
|
_Configuration = configuration;
|
||||||
@ -55,7 +55,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
Stateless.MapLogic.Set(maxDegreeOfParallelism,
|
Stateless.MapLogic.Set(maxDegreeOfParallelism,
|
||||||
configuration,
|
configuration,
|
||||||
ticks,
|
ticks,
|
||||||
familyIndexToCollection,
|
|
||||||
personContainers,
|
personContainers,
|
||||||
a2PeopleSingletonDirectory,
|
a2PeopleSingletonDirectory,
|
||||||
eDistanceContentDirectory,
|
eDistanceContentDirectory,
|
||||||
@ -120,7 +119,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
{
|
{
|
||||||
foreach (PersonContainer personContainer in wholePercentagesToPersonContainers.Value)
|
foreach (PersonContainer personContainer in wholePercentagesToPersonContainers.Value)
|
||||||
{
|
{
|
||||||
if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
|
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Birthdays.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
if (personContainer.DisplayDirectoryName.Contains(@"{}\~\"))
|
if (personContainer.DisplayDirectoryName.Contains(@"{}\~\"))
|
||||||
shouldMove.Add(personContainer.DisplayDirectoryName);
|
shouldMove.Add(personContainer.DisplayDirectoryName);
|
||||||
@ -180,7 +179,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
}
|
}
|
||||||
foreach (PersonContainer personContainer in personContainers)
|
foreach (PersonContainer personContainer in personContainers)
|
||||||
{
|
{
|
||||||
if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
|
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Birthdays.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
personBirthday = personContainer.Birthdays[zero];
|
personBirthday = personContainer.Birthdays[zero];
|
||||||
personKey = personBirthday.Value.Ticks;
|
personKey = personBirthday.Value.Ticks;
|
||||||
@ -354,7 +353,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
for (int i = _NotMappedPersonContainers.Count - 1; i > 0; i--)
|
for (int i = _NotMappedPersonContainers.Count - 1; i > 0; i--)
|
||||||
{
|
{
|
||||||
personContainer = _NotMappedPersonContainers[i];
|
personContainer = _NotMappedPersonContainers[i];
|
||||||
if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
|
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Birthdays.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
personBirthday = personContainer.Birthdays[zero];
|
personBirthday = personContainer.Birthdays[zero];
|
||||||
mappingSegmentB = Stateless.MapLogic.GetMappingSegmentB(_Ticks, personBirthday, personContainer.ApproximateYears, mappingFromItem);
|
mappingSegmentB = Stateless.MapLogic.GetMappingSegmentB(_Ticks, personBirthday, personContainer.ApproximateYears, mappingFromItem);
|
||||||
@ -673,7 +672,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
|
|||||||
continue;
|
continue;
|
||||||
foreach (PersonContainer personContainer in personContainers)
|
foreach (PersonContainer personContainer in personContainers)
|
||||||
{
|
{
|
||||||
if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
|
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Birthdays.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
personBirthday = personContainer.Birthdays[zero];
|
personBirthday = personContainer.Birthdays[zero];
|
||||||
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday);
|
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday);
|
||||||
|
@ -3,7 +3,6 @@ using ShellProgressBar;
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Text.Json;
|
|
||||||
using View_by_Distance.Shared.Models;
|
using View_by_Distance.Shared.Models;
|
||||||
using View_by_Distance.Shared.Models.Stateless.Methods;
|
using View_by_Distance.Shared.Models.Stateless.Methods;
|
||||||
using WindowsShortcutFactory;
|
using WindowsShortcutFactory;
|
||||||
@ -17,6 +16,12 @@ internal abstract class MapLogic
|
|||||||
string[] PersonDisplayDirectoryNames,
|
string[] PersonDisplayDirectoryNames,
|
||||||
string MappedFaceFile);
|
string MappedFaceFile);
|
||||||
|
|
||||||
|
private record PersonKeyFormattedIdThenWholePercentages(string PersonKeyFormatted,
|
||||||
|
string[] PersonDisplayDirectoryNames,
|
||||||
|
string MappedFaceFile,
|
||||||
|
int Id,
|
||||||
|
int WholePercentages);
|
||||||
|
|
||||||
private static void SetPersonCollections(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<string> personKeyFormattedCollection, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection)
|
private static void SetPersonCollections(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<string> personKeyFormattedCollection, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection)
|
||||||
{
|
{
|
||||||
int? id;
|
int? id;
|
||||||
@ -47,7 +52,7 @@ internal abstract class MapLogic
|
|||||||
skipNotSkipCollection[id.Value].Add(wholePercentages.Value);
|
skipNotSkipCollection[id.Value].Add(wholePercentages.Value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
|
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || personContainer.Birthdays.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
foreach (PersonBirthday personBirthday in personContainer.Birthdays)
|
foreach (PersonBirthday personBirthday in personContainer.Birthdays)
|
||||||
{
|
{
|
||||||
@ -186,14 +191,35 @@ internal abstract class MapLogic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void MovedToNewestPersonKeyFormatted(string personKeyFormatted, string newestPersonKeyFormatted, string ticksDirectory, string personKeyDirectory)
|
||||||
|
{
|
||||||
|
string newestPersonKeyDirectory = Path.Combine(ticksDirectory, newestPersonKeyFormatted);
|
||||||
|
if (Directory.Exists(newestPersonKeyDirectory))
|
||||||
|
MoveFiles(personKeyFormatted, personKeyDirectory, newestPersonKeyFormatted, newestPersonKeyDirectory);
|
||||||
|
else
|
||||||
|
Directory.Move(personKeyDirectory, newestPersonKeyDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RenameUnknown(string[] files)
|
||||||
|
{
|
||||||
|
foreach (string file in files)
|
||||||
|
{
|
||||||
|
if (file.EndsWith(".unk"))
|
||||||
|
continue;
|
||||||
|
File.Move(file, $"{file}.unk");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static List<Record> DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<string> personKeyFormattedCollection, string[] ticksDirectories, string message)
|
private static List<Record> DeleteEmptyDirectoriesAndGetCollection(Configuration configuration, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<string> personKeyFormattedCollection, string[] ticksDirectories, string message)
|
||||||
{
|
{
|
||||||
List<Record> results = new();
|
List<Record> results = new();
|
||||||
int? id;
|
int? id;
|
||||||
|
long ticks;
|
||||||
string[] files;
|
string[] files;
|
||||||
string fileName;
|
string fileName;
|
||||||
|
bool isNotDefault;
|
||||||
|
TimeSpan timeSpan;
|
||||||
bool check = false;
|
bool check = false;
|
||||||
const int zero = 0;
|
|
||||||
int? wholePercentages;
|
int? wholePercentages;
|
||||||
string[] yearDirectories;
|
string[] yearDirectories;
|
||||||
string personKeyFormatted;
|
string personKeyFormatted;
|
||||||
@ -203,7 +229,6 @@ internal abstract class MapLogic
|
|||||||
List<string> distinct = new();
|
List<string> distinct = new();
|
||||||
string[] personKeyDirectories;
|
string[] personKeyDirectories;
|
||||||
string[] personNameDirectories;
|
string[] personNameDirectories;
|
||||||
string newestPersonKeyDirectory;
|
|
||||||
string? newestPersonKeyFormatted;
|
string? newestPersonKeyFormatted;
|
||||||
string[] personNameLinkDirectories;
|
string[] personNameLinkDirectories;
|
||||||
string? personFirstInitialDirectory;
|
string? personFirstInitialDirectory;
|
||||||
@ -216,7 +241,9 @@ internal abstract class MapLogic
|
|||||||
{
|
{
|
||||||
progressBar.Tick();
|
progressBar.Tick();
|
||||||
ticksDirectoryName = Path.GetFileName(ticksDirectory);
|
ticksDirectoryName = Path.GetFileName(ticksDirectory);
|
||||||
if (ticksDirectoryName.Length < 3 || ticksDirectoryName[zero] != '(' || ticksDirectoryName[^1] != ')')
|
if (ticksDirectoryName.Length < 3 || ticksDirectoryName.First() != '(' || ticksDirectoryName[^1] != ')')
|
||||||
|
continue;
|
||||||
|
if (!long.TryParse(ticksDirectoryName[1..^1], out ticks))
|
||||||
continue;
|
continue;
|
||||||
personKeyDirectories = Directory.GetDirectories(ticksDirectory, "*", SearchOption.TopDirectoryOnly);
|
personKeyDirectories = Directory.GetDirectories(ticksDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||||
foreach (string personKeyDirectory in personKeyDirectories)
|
foreach (string personKeyDirectory in personKeyDirectories)
|
||||||
@ -228,16 +255,12 @@ internal abstract class MapLogic
|
|||||||
Individually(configuration, ticksDirectory, personKeyDirectory);
|
Individually(configuration, ticksDirectory, personKeyDirectory);
|
||||||
throw new Exception($"B) Move personKey directories up one from {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} and delete {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} directory!");
|
throw new Exception($"B) Move personKey directories up one from {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} and delete {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} directory!");
|
||||||
}
|
}
|
||||||
if (personKeyFormattedToNewestPersonKeyFormatted.TryGetValue(personKeyFormatted, out newestPersonKeyFormatted) && personKeyFormatted != newestPersonKeyFormatted)
|
_ = personKeyFormattedToNewestPersonKeyFormatted.TryGetValue(personKeyFormatted, out newestPersonKeyFormatted);
|
||||||
|
if (personKeyFormattedToNewestPersonKeyFormatted.Count > 0 && newestPersonKeyFormatted is null)
|
||||||
{
|
{
|
||||||
if (!check)
|
timeSpan = new TimeSpan(DateTime.Now.Ticks - ticks);
|
||||||
check = true;
|
if (timeSpan.TotalDays > 3)
|
||||||
newestPersonKeyDirectory = Path.Combine(ticksDirectory, newestPersonKeyFormatted);
|
throw new Exception($"{configuration.MappingDefaultName} are only allowed within x days!");
|
||||||
if (Directory.Exists(newestPersonKeyDirectory))
|
|
||||||
MoveFiles(personKeyFormatted, personKeyDirectory, newestPersonKeyFormatted, newestPersonKeyDirectory);
|
|
||||||
else
|
|
||||||
Directory.Move(personKeyDirectory, newestPersonKeyDirectory);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
yearDirectories = Directory.GetDirectories(personKeyDirectory, "*", SearchOption.TopDirectoryOnly);
|
yearDirectories = Directory.GetDirectories(personKeyDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||||
foreach (string yearDirectory in yearDirectories)
|
foreach (string yearDirectory in yearDirectories)
|
||||||
@ -251,6 +274,18 @@ internal abstract class MapLogic
|
|||||||
personDisplayDirectoryNames = IPath.GetDirectoryNames(personNameDirectory);
|
personDisplayDirectoryNames = IPath.GetDirectoryNames(personNameDirectory);
|
||||||
if (!personDisplayDirectoryNames.Any())
|
if (!personDisplayDirectoryNames.Any())
|
||||||
continue;
|
continue;
|
||||||
|
if (personDisplayDirectoryNames[^1] == "Z" && personKeyFormatted.StartsWith("140"))
|
||||||
|
{
|
||||||
|
string checkDirectory = Path.Combine(yearDirectory, $"Z]{DateTime.Now.Ticks}");
|
||||||
|
if (Directory.Exists(checkDirectory))
|
||||||
|
{
|
||||||
|
files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||||
|
RenameUnknown(files);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Directory.Move(personNameDirectory, checkDirectory);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly);
|
files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||||
if (isReservedDirectoryName && files.Any())
|
if (isReservedDirectoryName && files.Any())
|
||||||
throw new Exception($"Move personKey directories up one from {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} and delete {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} directory!");
|
throw new Exception($"Move personKey directories up one from {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} and delete {nameof(Shared.Models.Stateless.IMapLogic.Sorting)} directory!");
|
||||||
@ -258,19 +293,22 @@ internal abstract class MapLogic
|
|||||||
throw new Exception($"Move personKey directories up one from {manualCopyHumanized} and delete {manualCopyHumanized} directory!");
|
throw new Exception($"Move personKey directories up one from {manualCopyHumanized} and delete {manualCopyHumanized} directory!");
|
||||||
if (personKeyFormatted == forceSingleImageHumanized && files.Any())
|
if (personKeyFormatted == forceSingleImageHumanized && files.Any())
|
||||||
throw new Exception($"Move personKey directories up one from {forceSingleImageHumanized} and delete {forceSingleImageHumanized} directory!");
|
throw new Exception($"Move personKey directories up one from {forceSingleImageHumanized} and delete {forceSingleImageHumanized} directory!");
|
||||||
if (newestPersonKeyFormatted is null)
|
isNotDefault = personDisplayDirectoryNames[^1].First() != 'Z' || !personKeyFormatted.StartsWith("140");
|
||||||
|
if (isNotDefault)
|
||||||
{
|
{
|
||||||
if (!IPerson.IsDefaultName(configuration.MappingDefaultName, personDisplayDirectoryNames[^1]))
|
if (personKeyFormattedToNewestPersonKeyFormatted.Count > 0 && newestPersonKeyFormatted is null)
|
||||||
|
RenameUnknown(files);
|
||||||
|
else if (newestPersonKeyFormatted is not null && personKeyFormatted != newestPersonKeyFormatted)
|
||||||
{
|
{
|
||||||
foreach (string file in files)
|
if (!check)
|
||||||
File.Move(file, $"{file}.unk");
|
check = true;
|
||||||
|
MovedToNewestPersonKeyFormatted(personKeyFormatted, newestPersonKeyFormatted, ticksDirectory, personKeyDirectory);
|
||||||
continue;
|
continue;
|
||||||
throw new NotImplementedException("Should this happen?");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length)
|
if (personKeyFormatted.Length != configuration.PersonBirthdayFormat.Length)
|
||||||
continue;
|
continue;
|
||||||
if (personDisplayDirectoryNames[^1].Length == 1 || IPerson.IsDefaultName(configuration.MappingDefaultName, personDisplayDirectoryNames[^1]) || !personKeyFormattedCollection.Contains(personKeyFormatted))
|
if (personDisplayDirectoryNames[^1].Length == 1 || !isNotDefault || !personKeyFormattedCollection.Contains(personKeyFormatted))
|
||||||
personFirstInitialDirectory = personNameDirectory;
|
personFirstInitialDirectory = personNameDirectory;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -347,7 +385,7 @@ internal abstract class MapLogic
|
|||||||
return results.ToArray();
|
return results.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void SetKeyValuePairs(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer, List<(string, string[], int, int)> personKeyFormattedIdThenWholePercentagesCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenWholePercentagesToPersonContainers, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
|
private static void SetKeyValuePairsAndAddToCollections(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer, List<PersonKeyFormattedIdThenWholePercentages> personKeyFormattedIdThenWholePercentagesCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenWholePercentagesToPersonContainers, List<(PersonKeyFormattedIdThenWholePercentages, PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
|
||||||
{
|
{
|
||||||
PersonBirthday? personBirthday;
|
PersonBirthday? personBirthday;
|
||||||
PersonContainer[] distinctPersonContainers;
|
PersonContainer[] distinctPersonContainers;
|
||||||
@ -357,32 +395,36 @@ internal abstract class MapLogic
|
|||||||
Dictionary<int, Dictionary<int, List<PersonContainer>>> idThenWholePercentagesToPersonContainerCollection = new();
|
Dictionary<int, Dictionary<int, List<PersonContainer>>> idThenWholePercentagesToPersonContainerCollection = new();
|
||||||
if (personKeyFormattedIdThenWholePercentagesCollection.Any())
|
if (personKeyFormattedIdThenWholePercentagesCollection.Any())
|
||||||
{
|
{
|
||||||
string personDisplayDirectory;
|
string group;
|
||||||
|
char[] matches;
|
||||||
|
char status, sex, first;
|
||||||
PersonContainer personContainer;
|
PersonContainer personContainer;
|
||||||
|
PersonDirectory personDirectory;
|
||||||
string personDisplayDirectoryName;
|
string personDisplayDirectoryName;
|
||||||
Dictionary<string, (string[], PersonContainer)> personDisplayDirectoryTo = new();
|
foreach (PersonKeyFormattedIdThenWholePercentages personKeyFormattedIdThenWholePercentages in personKeyFormattedIdThenWholePercentagesCollection)
|
||||||
foreach ((string personKeyFormatted, string[] personDisplayDirectoryNames, int id, int wholePercentages) in personKeyFormattedIdThenWholePercentagesCollection)
|
|
||||||
{
|
{
|
||||||
personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormatted);
|
personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormattedIdThenWholePercentages.PersonKeyFormatted);
|
||||||
if (personBirthday is null)
|
if (personBirthday is null)
|
||||||
continue;
|
continue;
|
||||||
personDisplayDirectoryName = personDisplayDirectoryNames[^1];
|
if (!personKeyFormattedToPersonContainer.ContainsKey(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted))
|
||||||
personDisplayDirectory = Path.Combine(personDisplayDirectoryNames);
|
|
||||||
if (!personKeyFormattedToPersonContainer.ContainsKey(personKeyFormatted))
|
|
||||||
{
|
{
|
||||||
personContainer = new(configuration.MappingDefaultName, configuration.PersonCharacters.ToArray(), personBirthday, personDisplayDirectoryName);
|
personDisplayDirectoryName = personKeyFormattedIdThenWholePercentages.PersonDisplayDirectoryNames[^1];
|
||||||
personKeyFormattedToPersonContainer.Add(personKeyFormatted, personContainer);
|
matches = configuration.PersonCharacters.Where(l => personDisplayDirectoryName.Contains(l)).ToArray();
|
||||||
|
if (matches.Length == 0)
|
||||||
|
throw new NotSupportedException();
|
||||||
|
group = IPerson.GetHourGroup(personDisplayDirectoryName, personBirthday.Value.Hour);
|
||||||
|
(status, sex, first) = IPerson.GetPersonHour(personDisplayDirectoryName, personBirthday.Value.Hour);
|
||||||
|
personDirectory = new(matches.First(), group, status, sex, first);
|
||||||
|
personContainer = new(configuration.MappingDefaultName, configuration.PersonCharacters.ToArray(), personBirthday, personDisplayDirectoryName, personDirectory);
|
||||||
|
personKeyFormattedToPersonContainer.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted, personContainer);
|
||||||
}
|
}
|
||||||
if (personDisplayDirectoryName.Length != 1 && personDisplayDirectoryName != configuration.MappingDefaultName && !personDisplayDirectoryTo.ContainsKey(personDisplayDirectory))
|
if (!idThenWholePercentagesToPersonContainerCollection.ContainsKey(personKeyFormattedIdThenWholePercentages.Id))
|
||||||
personDisplayDirectoryTo.Add(personDisplayDirectory, new(personDisplayDirectoryNames, personKeyFormattedToPersonContainer[personKeyFormatted]));
|
idThenWholePercentagesToPersonContainerCollection.Add(personKeyFormattedIdThenWholePercentages.Id, new());
|
||||||
if (!idThenWholePercentagesToPersonContainerCollection.ContainsKey(id))
|
if (!idThenWholePercentagesToPersonContainerCollection[personKeyFormattedIdThenWholePercentages.Id].ContainsKey(personKeyFormattedIdThenWholePercentages.WholePercentages))
|
||||||
idThenWholePercentagesToPersonContainerCollection.Add(id, new());
|
idThenWholePercentagesToPersonContainerCollection[personKeyFormattedIdThenWholePercentages.Id].Add(personKeyFormattedIdThenWholePercentages.WholePercentages, new());
|
||||||
if (!idThenWholePercentagesToPersonContainerCollection[id].ContainsKey(wholePercentages))
|
idThenWholePercentagesToPersonContainerCollection[personKeyFormattedIdThenWholePercentages.Id][personKeyFormattedIdThenWholePercentages.WholePercentages].Add(personKeyFormattedToPersonContainer[personKeyFormattedIdThenWholePercentages.PersonKeyFormatted]);
|
||||||
idThenWholePercentagesToPersonContainerCollection[id].Add(wholePercentages, new());
|
possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Add(new(personKeyFormattedIdThenWholePercentages, personKeyFormattedToPersonContainer[personKeyFormattedIdThenWholePercentages.PersonKeyFormatted]));
|
||||||
idThenWholePercentagesToPersonContainerCollection[id][wholePercentages].Add(personKeyFormattedToPersonContainer[personKeyFormatted]);
|
|
||||||
}
|
}
|
||||||
foreach (KeyValuePair<string, (string[], PersonContainer)> keyValuePair in personDisplayDirectoryTo)
|
|
||||||
possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Add(keyValuePair.Value);
|
|
||||||
}
|
}
|
||||||
foreach (KeyValuePair<int, Dictionary<int, List<PersonContainer>>> keyValuePair in idThenWholePercentagesToPersonContainerCollection)
|
foreach (KeyValuePair<int, Dictionary<int, List<PersonContainer>>> keyValuePair in idThenWholePercentagesToPersonContainerCollection)
|
||||||
{
|
{
|
||||||
@ -425,7 +467,7 @@ internal abstract class MapLogic
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int SetCollectionsAndGetUnableToConvertCount(Configuration configuration, long ticks, List<(string, string[], int, int)> personKeyFormattedIdThenWholePercentagesCollection, List<Record> collection)
|
private static int SetCollectionsAndGetUnableToConvertCount(Configuration configuration, long ticks, List<PersonKeyFormattedIdThenWholePercentages> personKeyFormattedIdThenWholePercentagesCollection, List<Record> collection)
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
int? id;
|
int? id;
|
||||||
@ -454,7 +496,7 @@ internal abstract class MapLogic
|
|||||||
personDisplayDirectoryName = personDisplayDirectoryNames[^1];
|
personDisplayDirectoryName = personDisplayDirectoryNames[^1];
|
||||||
if (string.IsNullOrEmpty(personDisplayDirectoryName))
|
if (string.IsNullOrEmpty(personDisplayDirectoryName))
|
||||||
continue;
|
continue;
|
||||||
personKeyFormattedIdThenWholePercentagesCollection.Add(new(personKeyFormatted, personDisplayDirectoryNames, id.Value, wholePercentages.Value));
|
personKeyFormattedIdThenWholePercentagesCollection.Add(new(personKeyFormatted, personDisplayDirectoryNames, mappedFaceFile, id.Value, wholePercentages.Value));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -467,7 +509,7 @@ internal abstract class MapLogic
|
|||||||
List<long> personKeys = IPersonContainer.GetPersonKeys(personContainers);
|
List<long> personKeys = IPersonContainer.GetPersonKeys(personContainers);
|
||||||
foreach (PersonContainer personContainer in personContainers)
|
foreach (PersonContainer personContainer in personContainers)
|
||||||
{
|
{
|
||||||
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
|
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || personContainer.Birthdays.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
if (personKeys.Contains(personContainer.Key.Value))
|
if (personKeys.Contains(personContainer.Key.Value))
|
||||||
continue;
|
continue;
|
||||||
@ -527,46 +569,56 @@ internal abstract class MapLogic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SavePossiblyNewPersonContainers(string personBirthdayFormat, string facesFileNameExtension, string? a2PeopleSingletonDirectory, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
|
static void PossiblyRebuildPersonContainers(Configuration configuration, string? a2PeopleSingletonDirectory, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<(PersonKeyFormattedIdThenWholePercentages, PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
|
||||||
{
|
{
|
||||||
string json;
|
bool[] matches;
|
||||||
string[] files;
|
string fileName;
|
||||||
string checkFile;
|
string checkFile;
|
||||||
const int zero = 0;
|
const int zero = 0;
|
||||||
string personKeyFormatted;
|
string personKeyFormatted;
|
||||||
string personDisplayDirectory;
|
string[] deleteCollection;
|
||||||
|
List<string> distinct = new();
|
||||||
PersonBirthday personBirthday;
|
PersonBirthday personBirthday;
|
||||||
string personDisplayDirectoryName;
|
string personDisplayDirectory;
|
||||||
string checkPersonDisplayDirectory;
|
string personKeyFormattedDirectory;
|
||||||
string checkPersonKeyFormattedDirectory;
|
foreach ((PersonKeyFormattedIdThenWholePercentages personKeyFormattedIdThenWholePercentages, PersonContainer personContainer) in possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
|
||||||
JsonSerializerOptions jsonSerializerOptions = new() { WriteIndented = true };
|
|
||||||
foreach ((string[] personDisplayDirectoryNames, PersonContainer personContainer) in possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
|
|
||||||
{
|
{
|
||||||
if (a2PeopleSingletonDirectory is null || personContainer.Key is null || personContainer.Birthdays is null || personContainer.PersonDirectory is null || !personContainer.Birthdays.Any())
|
if (distinct.Contains(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted))
|
||||||
|
continue;
|
||||||
|
if (a2PeopleSingletonDirectory is null || personContainer.Key is null || personContainer.Birthdays is null || personContainer.PersonDirectory is null || personContainer.Birthdays.Length == 0)
|
||||||
|
continue;
|
||||||
|
fileName = $"{Path.GetFileName(personKeyFormattedIdThenWholePercentages.MappedFaceFile)}{configuration.FacesHiddenFileNameExtension}";
|
||||||
|
matches = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(fileName) select true).ToArray();
|
||||||
|
if (matches.Length > 0)
|
||||||
|
continue;
|
||||||
|
matches = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(configuration.FacesHiddenFileNameExtension) select true).ToArray();
|
||||||
|
if (matches.Length > 0)
|
||||||
continue;
|
continue;
|
||||||
personBirthday = personContainer.Birthdays[zero];
|
personBirthday = personContainer.Birthdays[zero];
|
||||||
personDisplayDirectoryName = personDisplayDirectoryNames[^1];
|
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personBirthday);
|
||||||
personDisplayDirectory = Path.Combine(personDisplayDirectoryNames);
|
personDisplayDirectory = Path.Combine(a2PeopleSingletonDirectory, personContainer.PersonDirectory.Char.ToString(), personContainer.PersonDirectory.Group, personContainer.DisplayDirectoryName);
|
||||||
personKeyFormatted = IPersonBirthday.GetFormatted(personBirthdayFormat, personBirthday);
|
personKeyFormattedDirectory = Path.GetFullPath(Path.Combine(personDisplayDirectory, personKeyFormatted));
|
||||||
checkPersonDisplayDirectory = Path.Combine(a2PeopleSingletonDirectory, personContainer.PersonDirectory.Char.ToString(), personContainer.PersonDirectory.Group, personDisplayDirectoryName);
|
deleteCollection = (from l in personContainer.DisplayDirectoryAllFiles where l.StartsWith(personKeyFormattedDirectory) select l).ToArray();
|
||||||
checkPersonKeyFormattedDirectory = Path.Combine(checkPersonDisplayDirectory, personKeyFormatted);
|
if (personKeyFormattedToNewestPersonKeyFormatted.Count > 0 && personContainer.DisplayDirectoryAllFiles.Length != 0 && deleteCollection.Length == 0)
|
||||||
if (Directory.Exists(checkPersonKeyFormattedDirectory))
|
throw new NotSupportedException();
|
||||||
|
if (!Directory.Exists(personKeyFormattedDirectory))
|
||||||
|
_ = Directory.CreateDirectory(personKeyFormattedDirectory);
|
||||||
|
if (!File.Exists(personKeyFormattedIdThenWholePercentages.MappedFaceFile))
|
||||||
continue;
|
continue;
|
||||||
_ = Directory.CreateDirectory(checkPersonKeyFormattedDirectory);
|
checkFile = Path.Combine(personKeyFormattedDirectory, $"{Path.GetFileName(personKeyFormattedIdThenWholePercentages.MappedFaceFile)}{configuration.FacesHiddenFileNameExtension}");
|
||||||
checkFile = Path.Combine(checkPersonKeyFormattedDirectory, $"{personKeyFormatted}.json");
|
if (File.Exists(checkFile))
|
||||||
json = JsonSerializer.Serialize(personContainer.Person, jsonSerializerOptions);
|
|
||||||
_ = IPath.WriteAllText(checkFile, json, updateDateWhenMatches: false, compareBeforeWrite: true);
|
|
||||||
if (!Directory.Exists(personDisplayDirectory))
|
|
||||||
continue;
|
continue;
|
||||||
files = Directory.GetFiles(personDisplayDirectory, $"*{facesFileNameExtension}", SearchOption.TopDirectoryOnly);
|
File.Copy(personKeyFormattedIdThenWholePercentages.MappedFaceFile, checkFile);
|
||||||
foreach (string file in files)
|
foreach (string delete in deleteCollection)
|
||||||
{
|
{
|
||||||
checkFile = Path.Combine(checkPersonDisplayDirectory, Path.GetFileName(file));
|
if (delete.EndsWith(".lnk"))
|
||||||
if (File.Exists(checkFile))
|
|
||||||
continue;
|
continue;
|
||||||
File.Copy(files[0], checkFile);
|
if (!File.Exists(delete))
|
||||||
break;
|
continue;
|
||||||
|
File.Delete(delete);
|
||||||
}
|
}
|
||||||
|
Directory.SetLastWriteTime(personDisplayDirectory, DateTime.Now);
|
||||||
|
distinct.Add(personKeyFormattedIdThenWholePercentages.PersonKeyFormatted);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -713,92 +765,6 @@ internal abstract class MapLogic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void SaveParents(ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> familyIndexToCollection, List<GenealogicalDataCommunicationRelation> collection, string personKeyFormatted, string[] filteredDisplayDirectoryAllFiles)
|
|
||||||
{
|
|
||||||
string? directory;
|
|
||||||
string checkDirectory;
|
|
||||||
string? mergeWithLineTwo;
|
|
||||||
List<GenealogicalDataCommunicationRelation>? relations;
|
|
||||||
const string wife = IGenealogicalDataCommunication.Wife;
|
|
||||||
const string child = IGenealogicalDataCommunication.Child;
|
|
||||||
const string husband = IGenealogicalDataCommunication.Husband;
|
|
||||||
foreach (GenealogicalDataCommunicationRelation genealogicalDataCommunicationRelation in collection)
|
|
||||||
{
|
|
||||||
if (!filteredDisplayDirectoryAllFiles.Any())
|
|
||||||
continue;
|
|
||||||
directory = Path.GetDirectoryName(filteredDisplayDirectoryAllFiles.First());
|
|
||||||
if (string.IsNullOrEmpty(directory))
|
|
||||||
continue;
|
|
||||||
if (genealogicalDataCommunicationRelation.Relation != child)
|
|
||||||
continue;
|
|
||||||
if (genealogicalDataCommunicationRelation.NickName != personKeyFormatted)
|
|
||||||
continue;
|
|
||||||
if (!familyIndexToCollection.TryGetValue(genealogicalDataCommunicationRelation.FamilyIndex, out relations))
|
|
||||||
continue;
|
|
||||||
foreach (GenealogicalDataCommunicationRelation relation in relations)
|
|
||||||
{
|
|
||||||
if (relation.FamilyIndex != genealogicalDataCommunicationRelation.FamilyIndex)
|
|
||||||
continue;
|
|
||||||
if (relation.Relation is not husband and not wife)
|
|
||||||
continue;
|
|
||||||
checkDirectory = Path.Combine(directory, relation.NickName);
|
|
||||||
if (!Directory.Exists(checkDirectory))
|
|
||||||
{
|
|
||||||
_ = Directory.CreateDirectory(checkDirectory);
|
|
||||||
mergeWithLineTwo = IGenealogicalDataCommunication.GetMergeWithLineTwo(genealogicalDataCommunicationRelation, relation);
|
|
||||||
File.WriteAllText(Path.Combine(checkDirectory, $"{mergeWithLineTwo}.rel"), relation.FullName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void SaveOne(Configuration configuration, ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> familyIndexToCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection)
|
|
||||||
{
|
|
||||||
string checkFile;
|
|
||||||
string? directory;
|
|
||||||
string personKeyFormatted;
|
|
||||||
List<long> distinct = new();
|
|
||||||
List<PersonContainer>? personContainers;
|
|
||||||
string[] filteredDisplayDirectoryAllFiles;
|
|
||||||
List<GenealogicalDataCommunicationRelation>? collection;
|
|
||||||
string checkExtension = $"{configuration.FacesFileNameExtension}{configuration.FacesHiddenFileNameExtension}";
|
|
||||||
ReadOnlyDictionary<long, List<GenealogicalDataCommunicationRelation>> personKeyToCollection = IGenealogicalDataCommunication.GetCollection(configuration.PersonBirthdayFormat, familyIndexToCollection);
|
|
||||||
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers)
|
|
||||||
{
|
|
||||||
if (!locationContainer.File.EndsWith(configuration.FacesFileNameExtension))
|
|
||||||
continue;
|
|
||||||
if (distinct.Contains(locationContainer.PersonKey))
|
|
||||||
continue;
|
|
||||||
if (!personKeyToPersonContainerCollection.TryGetValue(locationContainer.PersonKey, out personContainers))
|
|
||||||
continue;
|
|
||||||
foreach (PersonContainer personContainer in personContainers)
|
|
||||||
{
|
|
||||||
if (personContainer.Key is null)
|
|
||||||
continue;
|
|
||||||
if (personKeyToCollection.TryGetValue(personContainer.Key.Value, out collection))
|
|
||||||
{
|
|
||||||
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personContainer.Key.Value);
|
|
||||||
SaveParents(familyIndexToCollection, collection, personKeyFormatted, personContainer.DisplayDirectoryAllFiles.Where(l => l.EndsWith(checkExtension)).ToArray());
|
|
||||||
}
|
|
||||||
if (personContainer.DisplayDirectoryAllFiles.Any(l => l.EndsWith(checkExtension)))
|
|
||||||
continue;
|
|
||||||
filteredDisplayDirectoryAllFiles = personContainer.DisplayDirectoryAllFiles.Where(l => l.EndsWith(".pged")).ToArray();
|
|
||||||
if (!filteredDisplayDirectoryAllFiles.Any())
|
|
||||||
continue;
|
|
||||||
directory = Path.GetDirectoryName(filteredDisplayDirectoryAllFiles.First());
|
|
||||||
if (string.IsNullOrEmpty(directory))
|
|
||||||
continue;
|
|
||||||
checkFile = Path.Combine(directory, $"{Path.GetFileName(locationContainer.File)}{configuration.FacesHiddenFileNameExtension}");
|
|
||||||
if (File.Exists(checkFile))
|
|
||||||
break;
|
|
||||||
File.Copy(locationContainer.File, checkFile);
|
|
||||||
File.Delete(filteredDisplayDirectoryAllFiles.First());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
distinct.Add(locationContainer.PersonKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void LookForPossibleDuplicates(Configuration configuration, List<LocationContainer<MetadataExtractor.Directory>> locationContainers)
|
private static void LookForPossibleDuplicates(Configuration configuration, List<LocationContainer<MetadataExtractor.Directory>> locationContainers)
|
||||||
{
|
{
|
||||||
string key;
|
string key;
|
||||||
@ -866,7 +832,7 @@ internal abstract class MapLogic
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void Set(int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> familyIndexToCollection, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, string eDistanceContentDirectory, Dictionary<long, PersonContainer> personKeyToPersonContainer, List<PersonContainer> notMappedPersonContainers, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenWholePercentagesToPersonContainers)
|
internal static void Set(int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, string eDistanceContentDirectory, Dictionary<long, PersonContainer> personKeyToPersonContainer, List<PersonContainer> notMappedPersonContainers, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenWholePercentagesToPersonContainers)
|
||||||
{
|
{
|
||||||
string message;
|
string message;
|
||||||
int totalSeconds;
|
int totalSeconds;
|
||||||
@ -876,15 +842,15 @@ internal abstract class MapLogic
|
|||||||
Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer = new();
|
Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer = new();
|
||||||
Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection = new();
|
Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection = new();
|
||||||
string[] ticksDirectories = UpdateDateVerifyAndGetTicksDirectories(eDistanceContentDirectory);
|
string[] ticksDirectories = UpdateDateVerifyAndGetTicksDirectories(eDistanceContentDirectory);
|
||||||
List<(string, string[], int, int)> personKeyFormattedIdThenWholePercentagesCollection = new();
|
List<PersonKeyFormattedIdThenWholePercentages> personKeyFormattedIdThenWholePercentagesCollection = new();
|
||||||
List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer = new();
|
List<(PersonKeyFormattedIdThenWholePercentages, PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer = new();
|
||||||
SetPersonCollections(configuration, personContainers, a2PeopleSingletonDirectory, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection, skipCollection, skipNotSkipCollection);
|
SetPersonCollections(configuration, personContainers, a2PeopleSingletonDirectory, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection, skipCollection, skipNotSkipCollection);
|
||||||
totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||||
message = $") {ticksDirectories.Length:000} compile from and clean ticks Director(ies) - B - {totalSeconds} total second(s)";
|
message = $") {ticksDirectories.Length:000} compile from and clean ticks Director(ies) - B - {totalSeconds} total second(s)";
|
||||||
List<Record> records = DeleteEmptyDirectoriesAndGetCollection(configuration, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection, ticksDirectories, message);
|
List<Record> records = DeleteEmptyDirectoriesAndGetCollection(configuration, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection, ticksDirectories, message);
|
||||||
locationContainers.AddRange(GetLocationContainers(maxDegreeOfParallelism, configuration, ticks, personContainers, eDistanceContentDirectory, records));
|
locationContainers.AddRange(GetLocationContainers(maxDegreeOfParallelism, configuration, ticks, personContainers, eDistanceContentDirectory, records));
|
||||||
int unableToMatchCount = SetCollectionsAndGetUnableToConvertCount(configuration, ticks, personKeyFormattedIdThenWholePercentagesCollection, records);
|
int unableToMatchCount = SetCollectionsAndGetUnableToConvertCount(configuration, ticks, personKeyFormattedIdThenWholePercentagesCollection, records);
|
||||||
SetKeyValuePairs(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer, personKeyFormattedIdThenWholePercentagesCollection, personKeyToPersonContainer, idThenWholePercentagesToPersonContainers, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
|
SetKeyValuePairsAndAddToCollections(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer, personKeyFormattedIdThenWholePercentagesCollection, personKeyToPersonContainer, idThenWholePercentagesToPersonContainers, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
|
||||||
totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||||
message = $") {records.Count:000} message from ticks Director(ies) - D - {unableToMatchCount} Unable To Match Count / {records.Count} Collection - {totalSeconds} total second(s)";
|
message = $") {records.Count:000} message from ticks Director(ies) - D - {unableToMatchCount} Unable To Match Count / {records.Count} Collection - {totalSeconds} total second(s)";
|
||||||
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||||
@ -898,12 +864,9 @@ internal abstract class MapLogic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
long[] personKeyCollection = (from l in nullablePersonKeyCollection where l is not null select l.Value).Distinct().ToArray();
|
long[] personKeyCollection = (from l in nullablePersonKeyCollection where l is not null select l.Value).Distinct().ToArray();
|
||||||
|
PossiblyRebuildPersonContainers(configuration, a2PeopleSingletonDirectory, personKeyFormattedToNewestPersonKeyFormatted, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
|
||||||
SetPersonKeyToPersonContainer(configuration, personContainers, personKeyCollection, personKeyToPersonContainer, personKeyToPersonContainerCollection);
|
SetPersonKeyToPersonContainer(configuration, personContainers, personKeyCollection, personKeyToPersonContainer, personKeyToPersonContainerCollection);
|
||||||
ReadOnlyDictionary<string, string> personKeyFormattedToPersonFullName = IPersonContainer.GetPersonKeyFormattedToPersonFullName(configuration.PersonBirthdayFormat, personContainers);
|
|
||||||
SaveOne(configuration, familyIndexToCollection, locationContainers, personKeyToPersonContainerCollection);
|
|
||||||
notMappedPersonContainers.AddRange(GetNotMappedPersonContainers(configuration, personContainers, personKeyCollection));
|
notMappedPersonContainers.AddRange(GetNotMappedPersonContainers(configuration, personContainers, personKeyCollection));
|
||||||
if (possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Any())
|
|
||||||
SavePossiblyNewPersonContainers(configuration.PersonBirthdayFormat, configuration.FacesFileNameExtension, a2PeopleSingletonDirectory, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string GetMappingSegmentB(long ticks, PersonBirthday personBirthday, int? approximateYears, long dateTimeOriginalThenMinimumDateTimeTicks, bool? isWrongYear)
|
private static string GetMappingSegmentB(long ticks, PersonBirthday personBirthday, int? approximateYears, long dateTimeOriginalThenMinimumDateTimeTicks, bool? isWrongYear)
|
||||||
|
19
Shared/Models/GenealogicalDataCommunicationCollections.cs
Normal file
19
Shared/Models/GenealogicalDataCommunicationCollections.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace View_by_Distance.Shared.Models;
|
||||||
|
|
||||||
|
public record GenealogicalDataCommunicationCollections(string[] HeaderLines,
|
||||||
|
ReadOnlyDictionary<string, string[]> Individuals,
|
||||||
|
List<string[]> FamilyGroupLines,
|
||||||
|
ReadOnlyDictionary<string, string> IdToNick,
|
||||||
|
string[] FooterLines)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -28,8 +28,8 @@ public class PersonContainer : Properties.IPersonContainer
|
|||||||
KeyIsMaxBirthday = birthdays is null || key is null ? null : key.Value == birthdays.First().Value.Ticks;
|
KeyIsMaxBirthday = birthdays is null || key is null ? null : key.Value == birthdays.First().Value.Ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PersonContainer(string mappingDefaultName, char[] personCharacters, PersonBirthday birthday, string displayDirectoryName) :
|
public PersonContainer(string mappingDefaultName, char[] personCharacters, PersonBirthday birthday, string displayDirectoryName, PersonDirectory personDirectory) :
|
||||||
this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), new PersonBirthday[] { birthday }, Array.Empty<string>(), displayDirectoryName, birthday.Value.Ticks, Stateless.Methods.IPerson.GetPerson(mappingDefaultName, personCharacters, displayDirectoryName, birthday.Value.Ticks, birthday), null)
|
this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), new PersonBirthday[] { birthday }, Array.Empty<string>(), displayDirectoryName, birthday.Value.Ticks, Stateless.Methods.IPerson.GetPerson(mappingDefaultName, personCharacters, displayDirectoryName, birthday.Value.Ticks, birthday), personDirectory)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) :
|
public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) :
|
||||||
|
@ -11,6 +11,13 @@ internal abstract class GenealogicalDataCommunication
|
|||||||
|
|
||||||
// ...
|
// ...
|
||||||
|
|
||||||
|
private record Record(Models.PersonContainer PersonContainer,
|
||||||
|
string PersonKeyFormatted,
|
||||||
|
string File,
|
||||||
|
string RelationPersonKeyFormatted,
|
||||||
|
string MergeWithLineTwo,
|
||||||
|
string? RelationFullName);
|
||||||
|
|
||||||
private static string[] GetHeaderLines(string startsWith, string[] sourceLines)
|
private static string[] GetHeaderLines(string startsWith, string[] sourceLines)
|
||||||
{
|
{
|
||||||
List<string> results = new();
|
List<string> results = new();
|
||||||
@ -23,39 +30,6 @@ internal abstract class GenealogicalDataCommunication
|
|||||||
return results.ToArray();
|
return results.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<GenealogicalDataCommunicationRelation> GetRelations(string personBirthdayFormat, ReadOnlyDictionary<string, string> personKeyFormattedToPersonFullName, Dictionary<string, string> idToNick, List<string[]> familyGroupLines)
|
|
||||||
{
|
|
||||||
List<GenealogicalDataCommunicationRelation> results = new();
|
|
||||||
string? nick;
|
|
||||||
long? personKey;
|
|
||||||
string relation;
|
|
||||||
string? fullName;
|
|
||||||
string[] segments;
|
|
||||||
string[] familyLines;
|
|
||||||
Models.PersonBirthday? personBirthday;
|
|
||||||
for (int i = 0; i < familyGroupLines.Count; i++)
|
|
||||||
{
|
|
||||||
familyLines = familyGroupLines[i];
|
|
||||||
for (int j = 0; j < familyLines.Length; j++)
|
|
||||||
{
|
|
||||||
segments = familyLines[j].Split('@');
|
|
||||||
if (segments.First().Length < 3 || segments.Length != 3)
|
|
||||||
continue;
|
|
||||||
if (!idToNick.TryGetValue(segments[1], out nick))
|
|
||||||
continue;
|
|
||||||
relation = segments.First()[2..].Trim();
|
|
||||||
personBirthday = IPersonBirthday.GetPersonBirthday(personBirthdayFormat, nick);
|
|
||||||
personKey = personBirthday?.Value.Ticks;
|
|
||||||
fullName = personKeyFormattedToPersonFullName.GetValueOrDefault(nick);
|
|
||||||
if (j + 1 >= familyLines.Length || familyLines[j + 1].Length < 3 || familyLines[j + 1][..3] != "2 _")
|
|
||||||
results.Add(new(i, relation, segments[1], nick, personKey, fullName, null));
|
|
||||||
else
|
|
||||||
results.Add(new(i, relation, segments[1], nick, personKey, fullName, familyLines[j + 1][2..]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static ReadOnlyDictionary<string, string[]> Convert(Dictionary<string, List<string>> keyValuePairs)
|
private static ReadOnlyDictionary<string, string[]> Convert(Dictionary<string, List<string>> keyValuePairs)
|
||||||
{
|
{
|
||||||
Dictionary<string, string[]> results = new();
|
Dictionary<string, string[]> results = new();
|
||||||
@ -64,8 +38,9 @@ internal abstract class GenealogicalDataCommunication
|
|||||||
return new(results);
|
return new(results);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static (string[], ReadOnlyDictionary<string, string[]>, List<string[]>, string[], List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) GetIndividuals(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName)
|
internal static GenealogicalDataCommunicationCollections GetIndividuals(string genealogicalDataCommunicationFile, bool requireNickName)
|
||||||
{
|
{
|
||||||
|
GenealogicalDataCommunicationCollections result;
|
||||||
ReadOnlyDictionary<string, string[]> results;
|
ReadOnlyDictionary<string, string[]> results;
|
||||||
string? nick;
|
string? nick;
|
||||||
string[] segments;
|
string[] segments;
|
||||||
@ -75,7 +50,6 @@ internal abstract class GenealogicalDataCommunication
|
|||||||
List<string[]> familyGroupLines = new();
|
List<string[]> familyGroupLines = new();
|
||||||
Dictionary<string, string> idToNick = new();
|
Dictionary<string, string> idToNick = new();
|
||||||
Dictionary<string, List<string>> keyValuePairs = new();
|
Dictionary<string, List<string>> keyValuePairs = new();
|
||||||
ReadOnlyDictionary<string, string> personKeyFormattedToPersonFullName = IPersonContainer.GetPersonKeyFormattedToPersonFullName(personBirthdayFormat, personContainers);
|
|
||||||
string[] sourceLines = string.IsNullOrEmpty(genealogicalDataCommunicationFile) || !File.Exists(genealogicalDataCommunicationFile) ? Array.Empty<string>() : File.ReadAllLines(genealogicalDataCommunicationFile);
|
string[] sourceLines = string.IsNullOrEmpty(genealogicalDataCommunicationFile) || !File.Exists(genealogicalDataCommunicationFile) ? Array.Empty<string>() : File.ReadAllLines(genealogicalDataCommunicationFile);
|
||||||
string[] headerLines = GetHeaderLines(startsWith, sourceLines);
|
string[] headerLines = GetHeaderLines(startsWith, sourceLines);
|
||||||
for (int i = headerLines.Length; i < sourceLines.Length; i++)
|
for (int i = headerLines.Length; i < sourceLines.Length; i++)
|
||||||
@ -135,18 +109,18 @@ internal abstract class GenealogicalDataCommunication
|
|||||||
throw new NotSupportedException();
|
throw new NotSupportedException();
|
||||||
}
|
}
|
||||||
results = Convert(keyValuePairs);
|
results = Convert(keyValuePairs);
|
||||||
List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations = GetRelations(personBirthdayFormat, personKeyFormattedToPersonFullName, idToNick, familyGroupLines);
|
result = new(headerLines, results, familyGroupLines, new(idToNick), footerLines.ToArray());
|
||||||
return (headerLines, results, familyGroupLines, footerLines.ToArray(), genealogicalDataCommunicationRelations);
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static List<string> GetMappedLines(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName)
|
internal static List<string> GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName)
|
||||||
{
|
{
|
||||||
List<string> results = new();
|
List<string> results = new();
|
||||||
Models.PersonBirthday personBirthday = new(DateTime.Now);
|
Models.PersonBirthday personBirthday = new(DateTime.Now);
|
||||||
GenealogicalDataCommunicationLines genealogicalDataCommunicationLines;
|
GenealogicalDataCommunicationLines genealogicalDataCommunicationLines;
|
||||||
(string[] headerLines, ReadOnlyDictionary<string, string[]> individuals, List<string[]> familyGroupLines, string[] footerLines, _) = GetIndividuals(personBirthdayFormat, genealogicalDataCommunicationFile, personContainers, requireNickName);
|
GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections = GetIndividuals(genealogicalDataCommunicationFile, requireNickName);
|
||||||
results.AddRange(headerLines);
|
results.AddRange(genealogicalDataCommunicationCollections.HeaderLines);
|
||||||
foreach (KeyValuePair<string, string[]> keyValuePair in individuals)
|
foreach (KeyValuePair<string, string[]> keyValuePair in genealogicalDataCommunicationCollections.Individuals)
|
||||||
{
|
{
|
||||||
genealogicalDataCommunicationLines = GetGenealogicalDataCommunicationLines(personBirthday, keyValuePair.Value);
|
genealogicalDataCommunicationLines = GetGenealogicalDataCommunicationLines(personBirthday, keyValuePair.Value);
|
||||||
if (!string.IsNullOrEmpty(genealogicalDataCommunicationLines.Id))
|
if (!string.IsNullOrEmpty(genealogicalDataCommunicationLines.Id))
|
||||||
@ -167,9 +141,9 @@ internal abstract class GenealogicalDataCommunication
|
|||||||
results.AddRange(genealogicalDataCommunicationLines.Death);
|
results.AddRange(genealogicalDataCommunicationLines.Death);
|
||||||
results.AddRange(genealogicalDataCommunicationLines.Changed);
|
results.AddRange(genealogicalDataCommunicationLines.Changed);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < familyGroupLines.Count; i++)
|
for (int i = 0; i < genealogicalDataCommunicationCollections.FamilyGroupLines.Count; i++)
|
||||||
results.AddRange(familyGroupLines[i]);
|
results.AddRange(genealogicalDataCommunicationCollections.FamilyGroupLines[i]);
|
||||||
results.AddRange(footerLines);
|
results.AddRange(genealogicalDataCommunicationCollections.FooterLines);
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,94 +275,45 @@ internal abstract class GenealogicalDataCommunication
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static bool CleanDisplayDirectoryAllFilesAndWriteTicksGed(string mappingDefaultName, string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, string[] headerLines, List<string[]> familyGroupLines, string[] footerLines, long ticks, string a2PeopleContentDirectory)
|
private static List<GenealogicalDataCommunicationRelation> GetRelations(string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections)
|
||||||
{
|
{
|
||||||
bool result = false;
|
List<GenealogicalDataCommunicationRelation> results = new();
|
||||||
string directory;
|
string? nick;
|
||||||
string[] mdFiles;
|
long? personKey;
|
||||||
string[] txtFiles;
|
string relation;
|
||||||
const int zero = 0;
|
string? fullName;
|
||||||
string[] jsonFiles;
|
string[] segments;
|
||||||
string[] pGedFiles;
|
string[] familyLines;
|
||||||
string personKeyFormatted;
|
Models.PersonBirthday? personBirthday;
|
||||||
List<string> lines = new();
|
ReadOnlyDictionary<string, string> personKeyFormattedToPersonFullName = IPersonContainer.GetPersonKeyFormattedToPersonFullName(personBirthdayFormat, personContainers);
|
||||||
List<long> distinct = new();
|
for (int i = 0; i < genealogicalDataCommunicationCollections.FamilyGroupLines.Count; i++)
|
||||||
List<string> individualsLines;
|
|
||||||
DateTime dateTime = new(ticks);
|
|
||||||
Models.PersonBirthday personBirthday;
|
|
||||||
Calendar calendar = new CultureInfo("en-US").Calendar;
|
|
||||||
string weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
|
|
||||||
lines.AddRange(headerLines);
|
|
||||||
foreach (Models.PersonContainer personContainer in personContainers)
|
|
||||||
{
|
{
|
||||||
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || !personContainer.Birthdays.Any())
|
familyLines = genealogicalDataCommunicationCollections.FamilyGroupLines[i];
|
||||||
continue;
|
for (int j = 0; j < familyLines.Length; j++)
|
||||||
if (IPerson.IsDefaultName(mappingDefaultName, personContainer.DisplayDirectoryName) || IPerson.IsDefaultName(mappingDefaultName, personContainer.Person))
|
|
||||||
continue;
|
|
||||||
if (distinct.Contains(personContainer.Key.Value))
|
|
||||||
continue;
|
|
||||||
distinct.Add(personContainer.Key.Value);
|
|
||||||
personBirthday = personContainer.Birthdays[zero];
|
|
||||||
personKeyFormatted = IPersonBirthday.GetFormatted(personBirthdayFormat, personBirthday);
|
|
||||||
mdFiles = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(".md") select l).ToArray();
|
|
||||||
txtFiles = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(".txt") select l).ToArray();
|
|
||||||
jsonFiles = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(".json") select l).ToArray();
|
|
||||||
pGedFiles = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(".pged") select l).ToArray();
|
|
||||||
foreach (string mdFile in mdFiles)
|
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(personKeyFormatted))
|
segments = familyLines[j].Split('@');
|
||||||
|
if (segments.First().Length < 3 || segments.Length != 3)
|
||||||
continue;
|
continue;
|
||||||
if (!mdFile.Contains(personKeyFormatted))
|
if (!genealogicalDataCommunicationCollections.IdToNick.TryGetValue(segments[1], out nick))
|
||||||
{
|
|
||||||
if (!result)
|
|
||||||
result = true;
|
|
||||||
File.Delete(mdFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach (string pGedFile in pGedFiles)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(personKeyFormatted))
|
|
||||||
continue;
|
continue;
|
||||||
if (!pGedFile.Contains(personKeyFormatted))
|
relation = segments.First()[2..].Trim();
|
||||||
{
|
personBirthday = IPersonBirthday.GetPersonBirthday(personBirthdayFormat, nick);
|
||||||
if (!result)
|
personKey = personBirthday?.Value.Ticks;
|
||||||
result = true;
|
fullName = personKeyFormattedToPersonFullName.GetValueOrDefault(nick);
|
||||||
File.Delete(pGedFile);
|
if (j + 1 >= familyLines.Length || familyLines[j + 1].Length < 3 || familyLines[j + 1][..3] != "2 _")
|
||||||
continue;
|
results.Add(new(i, relation, segments[1], nick, personKey, fullName, null));
|
||||||
}
|
else
|
||||||
individualsLines = File.ReadAllLines(pGedFile).ToList();
|
results.Add(new(i, relation, segments[1], nick, personKey, fullName, familyLines[j + 1][2..]));
|
||||||
foreach (string jsonFile in jsonFiles)
|
|
||||||
{
|
|
||||||
if (!result)
|
|
||||||
result = true;
|
|
||||||
File.Delete(jsonFile);
|
|
||||||
}
|
|
||||||
foreach (string txtFile in txtFiles)
|
|
||||||
{
|
|
||||||
if (new FileInfo(txtFile).Length == 0)
|
|
||||||
{
|
|
||||||
if (!result)
|
|
||||||
result = true;
|
|
||||||
File.Delete(txtFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lines.AddRange(individualsLines);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int i = 0; i < familyGroupLines.Count; i++)
|
return results;
|
||||||
lines.AddRange(familyGroupLines[i]);
|
|
||||||
lines.AddRange(footerLines);
|
|
||||||
directory = Path.Combine(a2PeopleContentDirectory, $"{dateTime.Year}-GenealogicalDataCommunication", $"{dateTime.Year}-Week-{weekOfYear}");
|
|
||||||
if (!Directory.Exists(directory))
|
|
||||||
_ = Directory.CreateDirectory(directory);
|
|
||||||
File.WriteAllLines(Path.Combine(directory, $"{ticks}.ged"), lines);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> GetFamilyIndexToCollection(List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations)
|
internal static ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> GetFamilyIndexToCollection(string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections)
|
||||||
{
|
{
|
||||||
Dictionary<int, List<GenealogicalDataCommunicationRelation>> results = new();
|
Dictionary<int, List<GenealogicalDataCommunicationRelation>> results = new();
|
||||||
List<GenealogicalDataCommunicationRelation>? relations;
|
List<GenealogicalDataCommunicationRelation>? relations;
|
||||||
|
List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations = GetRelations(personBirthdayFormat, personContainers, genealogicalDataCommunicationCollections);
|
||||||
foreach (GenealogicalDataCommunicationRelation genealogicalDataCommunicationRelation in genealogicalDataCommunicationRelations)
|
foreach (GenealogicalDataCommunicationRelation genealogicalDataCommunicationRelation in genealogicalDataCommunicationRelations)
|
||||||
{
|
{
|
||||||
if (!results.TryGetValue(genealogicalDataCommunicationRelation.FamilyIndex, out relations))
|
if (!results.TryGetValue(genealogicalDataCommunicationRelation.FamilyIndex, out relations))
|
||||||
@ -551,7 +476,7 @@ internal abstract class GenealogicalDataCommunication
|
|||||||
ReadOnlyDictionary<string, string> personKeyFormattedToPersonFullName = IPersonContainer.GetPersonKeyFormattedToPersonFullName(personBirthdayFormat, personContainers);
|
ReadOnlyDictionary<string, string> personKeyFormattedToPersonFullName = IPersonContainer.GetPersonKeyFormattedToPersonFullName(personBirthdayFormat, personContainers);
|
||||||
foreach (Models.PersonContainer personContainer in personContainers.OrderByDescending(l => l.Key))
|
foreach (Models.PersonContainer personContainer in personContainers.OrderByDescending(l => l.Key))
|
||||||
{
|
{
|
||||||
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || personContainer.PersonDirectory is null || !personContainer.Birthdays.Any())
|
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || personContainer.PersonDirectory is null || personContainer.Birthdays.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
male = personContainer.PersonDirectory.Sex == 'U' ? null : personContainer.PersonDirectory.Sex == 'M' || (personContainer.PersonDirectory.Sex == 'F' ? false : throw new Exception());
|
male = personContainer.PersonDirectory.Sex == 'U' ? null : personContainer.PersonDirectory.Sex == 'M' || (personContainer.PersonDirectory.Sex == 'F' ? false : throw new Exception());
|
||||||
first = personContainer.PersonDirectory.First == 'U' ? null : personContainer.PersonDirectory.First == 'Y' || (personContainer.PersonDirectory.First == 'N' ? false : throw new Exception());
|
first = personContainer.PersonDirectory.First == 'U' ? null : personContainer.PersonDirectory.First == 'Y' || (personContainer.PersonDirectory.First == 'N' ? false : throw new Exception());
|
||||||
|
@ -11,10 +11,10 @@ public interface IGenealogicalDataCommunication
|
|||||||
const string Child = "CHIL";
|
const string Child = "CHIL";
|
||||||
const string Husband = "HUSB";
|
const string Husband = "HUSB";
|
||||||
|
|
||||||
List<string> TestStatic_GetMappedLines(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName) =>
|
List<string> TestStatic_GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) =>
|
||||||
GetMappedLines(personBirthdayFormat, genealogicalDataCommunicationFile, personContainers, requireNickName);
|
GetMappedLines(genealogicalDataCommunicationFile, requireNickName);
|
||||||
static List<string> GetMappedLines(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName) =>
|
static List<string> GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) =>
|
||||||
GenealogicalDataCommunication.GetMappedLines(personBirthdayFormat, genealogicalDataCommunicationFile, personContainers, requireNickName);
|
GenealogicalDataCommunication.GetMappedLines(genealogicalDataCommunicationFile, requireNickName);
|
||||||
|
|
||||||
GenealogicalDataCommunicationLines TestStatic_GetGenealogicalDataCommunicationLines(Models.PersonBirthday personBirthday, string[] individualsLines) =>
|
GenealogicalDataCommunicationLines TestStatic_GetGenealogicalDataCommunicationLines(Models.PersonBirthday personBirthday, string[] individualsLines) =>
|
||||||
GetGenealogicalDataCommunicationLines(individualsLines);
|
GetGenealogicalDataCommunicationLines(individualsLines);
|
||||||
@ -26,15 +26,10 @@ public interface IGenealogicalDataCommunication
|
|||||||
static Models.GenealogicalDataCommunication GetGenealogicalDataCommunication(bool first, GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) =>
|
static Models.GenealogicalDataCommunication GetGenealogicalDataCommunication(bool first, GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) =>
|
||||||
GenealogicalDataCommunication.GetGenealogicalDataCommunication(first, genealogicalDataCommunicationLines);
|
GenealogicalDataCommunication.GetGenealogicalDataCommunication(first, genealogicalDataCommunicationLines);
|
||||||
|
|
||||||
(string[], ReadOnlyDictionary<string, string[]>, List<string[]>, string[], List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) TestStatic_GetIndividuals(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName) =>
|
GenealogicalDataCommunicationCollections TestStatic_GetIndividuals(string genealogicalDataCommunicationFile, bool requireNickName) =>
|
||||||
GetIndividuals(personBirthdayFormat, genealogicalDataCommunicationFile, personContainers, requireNickName);
|
GetIndividuals(genealogicalDataCommunicationFile, requireNickName);
|
||||||
static (string[], ReadOnlyDictionary<string, string[]>, List<string[]>, string[], List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) GetIndividuals(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName) =>
|
static GenealogicalDataCommunicationCollections GetIndividuals(string genealogicalDataCommunicationFile, bool requireNickName) =>
|
||||||
GenealogicalDataCommunication.GetIndividuals(personBirthdayFormat, genealogicalDataCommunicationFile, personContainers, requireNickName);
|
GenealogicalDataCommunication.GetIndividuals(genealogicalDataCommunicationFile, requireNickName);
|
||||||
|
|
||||||
bool TestStatic_CleanDisplayDirectoryAllFilesAndWriteTicksGed(string mappingDefaultName, string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, string[] headerLines, List<string[]> familyGroupLines, string[] footerLines, long ticks, string a2PeopleContentDirectory) =>
|
|
||||||
CleanDisplayDirectoryAllFilesAndWriteTicksGed(mappingDefaultName, personBirthdayFormat, personContainers, headerLines, familyGroupLines, footerLines, ticks, a2PeopleContentDirectory);
|
|
||||||
static bool CleanDisplayDirectoryAllFilesAndWriteTicksGed(string mappingDefaultName, string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, string[] headerLines, List<string[]> familyGroupLines, string[] footerLines, long ticks, string a2PeopleContentDirectory) =>
|
|
||||||
GenealogicalDataCommunication.CleanDisplayDirectoryAllFilesAndWriteTicksGed(mappingDefaultName, personBirthdayFormat, personContainers, headerLines, familyGroupLines, footerLines, ticks, a2PeopleContentDirectory);
|
|
||||||
|
|
||||||
ReadOnlyDictionary<long, List<GenealogicalDataCommunicationRelation>> TestStatic_GetCollection(string personBirthdayFormat, List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) =>
|
ReadOnlyDictionary<long, List<GenealogicalDataCommunicationRelation>> TestStatic_GetCollection(string personBirthdayFormat, List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) =>
|
||||||
GetCollection(personBirthdayFormat, genealogicalDataCommunicationRelations);
|
GetCollection(personBirthdayFormat, genealogicalDataCommunicationRelations);
|
||||||
@ -46,10 +41,10 @@ public interface IGenealogicalDataCommunication
|
|||||||
static ReadOnlyDictionary<long, List<GenealogicalDataCommunicationRelation>> GetCollection(string personBirthdayFormat, ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> familyIndexToCollection) =>
|
static ReadOnlyDictionary<long, List<GenealogicalDataCommunicationRelation>> GetCollection(string personBirthdayFormat, ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> familyIndexToCollection) =>
|
||||||
GenealogicalDataCommunication.GetCollection(personBirthdayFormat, familyIndexToCollection);
|
GenealogicalDataCommunication.GetCollection(personBirthdayFormat, familyIndexToCollection);
|
||||||
|
|
||||||
ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> TestStatic_GetFamilyIndexToCollection(List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) =>
|
ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> TestStatic_GetFamilyIndexToCollection(string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections) =>
|
||||||
GetFamilyIndexToCollection(genealogicalDataCommunicationRelations);
|
GetFamilyIndexToCollection(personBirthdayFormat, personContainers, genealogicalDataCommunicationCollections);
|
||||||
static ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> GetFamilyIndexToCollection(List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) =>
|
static ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> GetFamilyIndexToCollection(string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections) =>
|
||||||
GenealogicalDataCommunication.GetFamilyIndexToCollection(genealogicalDataCommunicationRelations);
|
GenealogicalDataCommunication.GetFamilyIndexToCollection(personBirthdayFormat, personContainers, genealogicalDataCommunicationCollections);
|
||||||
|
|
||||||
string? TestStatic_GetMergeWithLineTwo(GenealogicalDataCommunicationRelation genealogicalDataCommunicationRelation, GenealogicalDataCommunicationRelation relation) =>
|
string? TestStatic_GetMergeWithLineTwo(GenealogicalDataCommunicationRelation genealogicalDataCommunicationRelation, GenealogicalDataCommunicationRelation relation) =>
|
||||||
GetMergeWithLineTwo(genealogicalDataCommunicationRelation, relation);
|
GetMergeWithLineTwo(genealogicalDataCommunicationRelation, relation);
|
||||||
|
@ -10,6 +10,38 @@ public interface IPerson
|
|||||||
static Models.PersonName GetPersonName(string name) =>
|
static Models.PersonName GetPersonName(string name) =>
|
||||||
PersonName.GetPersonName(name);
|
PersonName.GetPersonName(name);
|
||||||
|
|
||||||
|
static (char, char, char) GetPersonHour(string personDisplayDirectoryName, int hour) =>
|
||||||
|
hour == 0 ? new('U', 'U', 'U') :
|
||||||
|
hour == 1 ? new('U', 'U', 'U') :
|
||||||
|
hour == 2 ? new('U', 'U', 'U') :
|
||||||
|
hour == 3 ? new('A', 'U', 'Y') :
|
||||||
|
hour == 4 ? new('A', 'F', 'Y') :
|
||||||
|
hour == 5 ? new('A', 'M', 'Y') :
|
||||||
|
hour == 6 ? new('A', 'F', 'N') :
|
||||||
|
hour == 7 ? new('A', 'M', 'N') :
|
||||||
|
hour == 13 ? new('D', 'U', 'Y') :
|
||||||
|
hour == 14 ? new('D', 'F', 'Y') :
|
||||||
|
hour == 15 ? new('D', 'M', 'Y') :
|
||||||
|
hour == 16 ? new('D', 'F', 'N') :
|
||||||
|
hour == 17 ? new('D', 'M', 'N') :
|
||||||
|
throw new NotImplementedException(personDisplayDirectoryName);
|
||||||
|
|
||||||
|
static string GetHourGroup(string personDisplayDirectoryName, int hour) =>
|
||||||
|
hour == 0 ? "Unknown-Unknown-Unknown" :
|
||||||
|
hour == 1 ? "Unknown-Unknown-Unknown" :
|
||||||
|
hour == 2 ? "Unknown-Unknown-Unknown" :
|
||||||
|
hour == 3 ? "Alive-Unknown-Yes" :
|
||||||
|
hour == 4 ? "Alive-Female-Yes" :
|
||||||
|
hour == 5 ? "Alive-Male-Yes" :
|
||||||
|
hour == 6 ? "Alive-Female-No" :
|
||||||
|
hour == 7 ? "Alive-Male-No" :
|
||||||
|
hour == 13 ? "Dead-Unknown-Yes" :
|
||||||
|
hour == 14 ? "Dead-Female-Yes" :
|
||||||
|
hour == 15 ? "Dead-Male-Yes" :
|
||||||
|
hour == 16 ? "Dead-Female-No" :
|
||||||
|
hour == 17 ? "Dead-Male-No" :
|
||||||
|
throw new NotImplementedException(personDisplayDirectoryName);
|
||||||
|
|
||||||
bool TestStatic_IsDefaultName(string mappingDefaultName, string value) =>
|
bool TestStatic_IsDefaultName(string mappingDefaultName, string value) =>
|
||||||
IsDefaultName(mappingDefaultName, value);
|
IsDefaultName(mappingDefaultName, value);
|
||||||
static bool IsDefaultName(string mappingDefaultName, string value) =>
|
static bool IsDefaultName(string mappingDefaultName, string value) =>
|
||||||
|
@ -110,7 +110,6 @@ internal abstract class PersonBirthday
|
|||||||
internal static List<(string, Models.PersonBirthday)> GetPersonBirthdays(string personBirthdayFormat, string[] personKeyDirectories, string personDisplayDirectory, string personDisplayDirectoryName)
|
internal static List<(string, Models.PersonBirthday)> GetPersonBirthdays(string personBirthdayFormat, string[] personKeyDirectories, string personDisplayDirectory, string personDisplayDirectoryName)
|
||||||
{
|
{
|
||||||
List<(string, Models.PersonBirthday)> results = new();
|
List<(string, Models.PersonBirthday)> results = new();
|
||||||
string[] files;
|
|
||||||
string personKeyFormatted;
|
string personKeyFormatted;
|
||||||
Models.PersonBirthday? personBirthday;
|
Models.PersonBirthday? personBirthday;
|
||||||
foreach (string personKeyDirectory in personKeyDirectories)
|
foreach (string personKeyDirectory in personKeyDirectories)
|
||||||
@ -124,9 +123,6 @@ internal abstract class PersonBirthday
|
|||||||
continue;
|
continue;
|
||||||
if (!IPersonBirthday.IsCounterPersonBirthday(personBirthday) && ((!personKeyDirectory.Contains('#') && (personDisplayDirectoryName.Contains('~') || personDisplayDirectoryName.Contains('#'))) || (personKeyDirectory.Contains('#') && !personDisplayDirectoryName.Contains('#'))))
|
if (!IPersonBirthday.IsCounterPersonBirthday(personBirthday) && ((!personKeyDirectory.Contains('#') && (personDisplayDirectoryName.Contains('~') || personDisplayDirectoryName.Contains('#'))) || (personKeyDirectory.Contains('#') && !personDisplayDirectoryName.Contains('#'))))
|
||||||
throw new NotSupportedException();
|
throw new NotSupportedException();
|
||||||
files = Directory.GetFiles(personKeyDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
||||||
if (!files.Any())
|
|
||||||
continue;
|
|
||||||
results.Add(new(personKeyFormatted, personBirthday));
|
results.Add(new(personKeyFormatted, personBirthday));
|
||||||
}
|
}
|
||||||
return results;
|
return results;
|
||||||
|
@ -5,7 +5,7 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
|
|||||||
internal abstract class PersonContainer
|
internal abstract class PersonContainer
|
||||||
{
|
{
|
||||||
|
|
||||||
private static string[] GetFiles(string personDisplayDirectory, bool isDefaultName)
|
private static List<string> GetFiles(string personDisplayDirectory, bool isDefaultName)
|
||||||
{
|
{
|
||||||
List<string> results = new();
|
List<string> results = new();
|
||||||
string[] files;
|
string[] files;
|
||||||
@ -58,12 +58,12 @@ internal abstract class PersonContainer
|
|||||||
results.Add(file);
|
results.Add(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return results.ToArray();
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string[] GetFiles(string facesFileNameExtension, string personDisplayDirectory, bool isDefaultName)
|
private static List<string> GetFiles(string facesFileNameExtension, string personDisplayDirectory, bool isDefaultName)
|
||||||
{
|
{
|
||||||
string[] results;
|
List<string> results;
|
||||||
int? id;
|
int? id;
|
||||||
string checkFile;
|
string checkFile;
|
||||||
int? wholePercentages;
|
int? wholePercentages;
|
||||||
@ -96,11 +96,13 @@ internal abstract class PersonContainer
|
|||||||
{
|
{
|
||||||
List<Models.PersonContainer> results = new();
|
List<Models.PersonContainer> results = new();
|
||||||
long personKey;
|
long personKey;
|
||||||
|
string[] files;
|
||||||
const int zero = 0;
|
const int zero = 0;
|
||||||
Models.Person person;
|
Models.Person person;
|
||||||
|
string personKeyDirectory;
|
||||||
Models.PersonContainer personContainer;
|
Models.PersonContainer personContainer;
|
||||||
Models.PersonBirthday[] orderedPersonBirthdays;
|
Models.PersonBirthday[] orderedPersonBirthdays;
|
||||||
string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName);
|
List<string> personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName);
|
||||||
foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection)
|
foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection)
|
||||||
{
|
{
|
||||||
orderedPersonBirthdays = (from l in collection where !l.PersonKeyFormatted.Contains(numberSign) orderby l.PersonBirthday.Value.Ticks descending select l.PersonBirthday).ToArray();
|
orderedPersonBirthdays = (from l in collection where !l.PersonKeyFormatted.Contains(numberSign) orderby l.PersonBirthday.Value.Ticks descending select l.PersonBirthday).ToArray();
|
||||||
@ -112,8 +114,13 @@ internal abstract class PersonContainer
|
|||||||
continue;
|
continue;
|
||||||
personKey = orderedPersonBirthdays[zero].Value.Ticks;
|
personKey = orderedPersonBirthdays[zero].Value.Ticks;
|
||||||
}
|
}
|
||||||
person = IPerson.GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles, personKey);
|
personKeyDirectory = Path.Combine(personDisplayDirectory, personKeyFormatted);
|
||||||
personContainer = new(approximateYears, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey, person, personDirectory);
|
files = Directory.GetFiles(personKeyDirectory, "*", SearchOption.AllDirectories);
|
||||||
|
if (!files.Any())
|
||||||
|
continue;
|
||||||
|
personDisplayDirectoryAllFiles.AddRange(files.Where(l => l.EndsWith(".rel")));
|
||||||
|
person = IPerson.GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles.ToArray(), personKey);
|
||||||
|
personContainer = new(approximateYears, orderedPersonBirthdays, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personKey, person, personDirectory);
|
||||||
results.Add(personContainer);
|
results.Add(personContainer);
|
||||||
}
|
}
|
||||||
return results;
|
return results;
|
||||||
@ -161,7 +168,7 @@ internal abstract class PersonContainer
|
|||||||
string[] personKeyDirectories;
|
string[] personKeyDirectories;
|
||||||
string? personDisplayDirectoryName;
|
string? personDisplayDirectoryName;
|
||||||
Models.PersonContainer personContainer;
|
Models.PersonContainer personContainer;
|
||||||
string[] personDisplayDirectoryAllFiles;
|
List<string> personDisplayDirectoryAllFiles;
|
||||||
List<Models.PersonContainer> personContainers;
|
List<Models.PersonContainer> personContainers;
|
||||||
List<(string, Models.PersonBirthday)> collection;
|
List<(string, Models.PersonBirthday)> collection;
|
||||||
foreach (string personDisplayDirectory in personDisplayDirectories)
|
foreach (string personDisplayDirectory in personDisplayDirectories)
|
||||||
@ -182,7 +189,7 @@ internal abstract class PersonContainer
|
|||||||
}
|
}
|
||||||
if (changes.Any(l => l is not null))
|
if (changes.Any(l => l is not null))
|
||||||
continue;
|
continue;
|
||||||
if (collection.Any())
|
if (collection.Count > 0)
|
||||||
{
|
{
|
||||||
personContainers = GetPersonContainersCollections(mappingDefaultName, facesFileNameExtension, personCharacters, personDirectory, numberSign, personDisplayDirectory, personDisplayDirectoryName, isDefaultName, approximateYears, collection);
|
personContainers = GetPersonContainersCollections(mappingDefaultName, facesFileNameExtension, personCharacters, personDirectory, numberSign, personDisplayDirectory, personDisplayDirectoryName, isDefaultName, approximateYears, collection);
|
||||||
results.AddRange(personContainers);
|
results.AddRange(personContainers);
|
||||||
@ -190,7 +197,7 @@ internal abstract class PersonContainer
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName);
|
personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName);
|
||||||
personContainer = new(approximateYears, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personDirectory);
|
personContainer = new(approximateYears, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personDirectory);
|
||||||
results.Add(personContainer);
|
results.Add(personContainer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -247,20 +254,22 @@ internal abstract class PersonContainer
|
|||||||
private static List<Models.PersonContainer> GetPersonContainersGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string[] groupDirectories)
|
private static List<Models.PersonContainer> GetPersonContainersGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string[] groupDirectories)
|
||||||
{
|
{
|
||||||
List<Models.PersonContainer> results;
|
List<Models.PersonContainer> results;
|
||||||
const int zero = 0;
|
|
||||||
List<string?> changes;
|
List<string?> changes;
|
||||||
string groupDirectoryName;
|
string groupDirectoryName;
|
||||||
List<string?> allChanges = new();
|
List<string?> allChanges = new();
|
||||||
List<Models.PersonContainer> collection;
|
List<Models.PersonContainer> collection;
|
||||||
List<Models.PersonContainer> personContainers = new();
|
List<Models.PersonContainer> personContainers = new();
|
||||||
foreach (string groupDirectory in groupDirectories)
|
for (int i = 0; i < personCharacters.Length; i++)
|
||||||
{
|
{
|
||||||
groupDirectoryName = Path.GetFileName(groupDirectory);
|
foreach (string groupDirectory in groupDirectories)
|
||||||
if (!personCharacters.Contains(groupDirectoryName[zero]))
|
{
|
||||||
continue;
|
groupDirectoryName = Path.GetFileName(groupDirectory);
|
||||||
(changes, collection) = GetPersonContainersInnerGroups(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectory, groupDirectoryName);
|
if (personCharacters[i] != groupDirectoryName.First())
|
||||||
allChanges.AddRange(changes);
|
continue;
|
||||||
personContainers.AddRange(collection);
|
(changes, collection) = GetPersonContainersInnerGroups(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectory, groupDirectoryName);
|
||||||
|
allChanges.AddRange(changes);
|
||||||
|
personContainers.AddRange(collection);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (allChanges.Any(l => l is not null))
|
if (allChanges.Any(l => l is not null))
|
||||||
throw new NotImplementedException($"A directory was changed restart to look for more! {string.Join(Environment.NewLine, (from l in allChanges where l is not null select l).ToArray())}");
|
throw new NotImplementedException($"A directory was changed restart to look for more! {string.Join(Environment.NewLine, (from l in allChanges where l is not null select l).ToArray())}");
|
||||||
@ -313,7 +322,7 @@ internal abstract class PersonContainer
|
|||||||
long personKey;
|
long personKey;
|
||||||
foreach (Models.PersonContainer personContainer in personContainers)
|
foreach (Models.PersonContainer personContainer in personContainers)
|
||||||
{
|
{
|
||||||
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
|
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || personContainer.Birthdays.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
foreach (Models.PersonBirthday personBirthday in personContainer.Birthdays)
|
foreach (Models.PersonBirthday personBirthday in personContainer.Birthdays)
|
||||||
{
|
{
|
||||||
@ -332,7 +341,7 @@ internal abstract class PersonContainer
|
|||||||
string personKeyFormatted;
|
string personKeyFormatted;
|
||||||
foreach (Models.PersonContainer personContainer in personContainers)
|
foreach (Models.PersonContainer personContainer in personContainers)
|
||||||
{
|
{
|
||||||
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || personContainer.PersonDirectory is null || !personContainer.Birthdays.Any())
|
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || personContainer.PersonDirectory is null || personContainer.Birthdays.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
personKeyFormatted = IPersonBirthday.GetFormatted(personBirthdayFormat, personContainer.Key.Value);
|
personKeyFormatted = IPersonBirthday.GetFormatted(personBirthdayFormat, personContainer.Key.Value);
|
||||||
personFullName = PersonName.GetFullName(personContainer.Person.Name);
|
personFullName = PersonName.GetFullName(personContainer.Person.Name);
|
||||||
|
@ -2,7 +2,6 @@ using Microsoft.Extensions.Configuration;
|
|||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using Phares.Shared;
|
using Phares.Shared;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using System.Collections.ObjectModel;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
@ -267,10 +266,9 @@ public partial class UnitTestHardCoded
|
|||||||
{
|
{
|
||||||
bool first = true;
|
bool first = true;
|
||||||
List<string> mappedLines;
|
List<string> mappedLines;
|
||||||
List<PersonContainer> personContainers = new();
|
|
||||||
ReadOnlyDictionary<string, string[]> individuals;
|
|
||||||
GenealogicalDataCommunication genealogicalDataCommunication;
|
GenealogicalDataCommunication genealogicalDataCommunication;
|
||||||
GenealogicalDataCommunicationLines genealogicalDataCommunicationLines;
|
GenealogicalDataCommunicationLines genealogicalDataCommunicationLines;
|
||||||
|
GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections;
|
||||||
List<(bool, string)> genealogicalDataCommunicationFiles = new()
|
List<(bool, string)> genealogicalDataCommunicationFiles = new()
|
||||||
{
|
{
|
||||||
// new(false, Path.Combine(directory, "Ancestry-Roberts/Roberts Family Tree.ged")),
|
// new(false, Path.Combine(directory, "Ancestry-Roberts/Roberts Family Tree.ged")),
|
||||||
@ -288,15 +286,15 @@ public partial class UnitTestHardCoded
|
|||||||
};
|
};
|
||||||
foreach ((bool requireNickName, string genealogicalDataCommunicationFile) in genealogicalDataCommunicationFiles)
|
foreach ((bool requireNickName, string genealogicalDataCommunicationFile) in genealogicalDataCommunicationFiles)
|
||||||
{
|
{
|
||||||
(_, individuals, _, _, _) = IGenealogicalDataCommunication.GetIndividuals(_Configuration.PropertyConfiguration.PersonBirthdayFormat, genealogicalDataCommunicationFile, new(personContainers), requireNickName);
|
genealogicalDataCommunicationCollections = IGenealogicalDataCommunication.GetIndividuals(genealogicalDataCommunicationFile, requireNickName);
|
||||||
foreach (KeyValuePair<string, string[]> keyValuePair in individuals)
|
foreach (KeyValuePair<string, string[]> keyValuePair in genealogicalDataCommunicationCollections.Individuals)
|
||||||
{
|
{
|
||||||
genealogicalDataCommunicationLines = IGenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(keyValuePair.Value);
|
genealogicalDataCommunicationLines = IGenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(keyValuePair.Value);
|
||||||
Assert.IsNotNull(genealogicalDataCommunicationLines.Name);
|
Assert.IsNotNull(genealogicalDataCommunicationLines.Name);
|
||||||
genealogicalDataCommunication = IGenealogicalDataCommunication.GetGenealogicalDataCommunication(first, genealogicalDataCommunicationLines);
|
genealogicalDataCommunication = IGenealogicalDataCommunication.GetGenealogicalDataCommunication(first, genealogicalDataCommunicationLines);
|
||||||
Assert.IsNotNull(genealogicalDataCommunication.Name);
|
Assert.IsNotNull(genealogicalDataCommunication.Name);
|
||||||
}
|
}
|
||||||
mappedLines = IGenealogicalDataCommunication.GetMappedLines(_Configuration.PropertyConfiguration.PersonBirthdayFormat, genealogicalDataCommunicationFile, new(personContainers), requireNickName);
|
mappedLines = IGenealogicalDataCommunication.GetMappedLines(genealogicalDataCommunicationFile, requireNickName);
|
||||||
if (IPath.WriteAllText($"{genealogicalDataCommunicationFile}.cln", string.Join(Environment.NewLine, mappedLines), updateDateWhenMatches: false, compareBeforeWrite: true))
|
if (IPath.WriteAllText($"{genealogicalDataCommunicationFile}.cln", string.Join(Environment.NewLine, mappedLines), updateDateWhenMatches: false, compareBeforeWrite: true))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -320,10 +318,9 @@ public partial class UnitTestHardCoded
|
|||||||
PersonName? personName;
|
PersonName? personName;
|
||||||
string personKeyFormatted;
|
string personKeyFormatted;
|
||||||
// bool isDefaultName = false;
|
// bool isDefaultName = false;
|
||||||
List<PersonContainer> personContainers = new();
|
|
||||||
ReadOnlyDictionary<string, string[]> individuals;
|
|
||||||
GenealogicalDataCommunication genealogicalDataCommunication;
|
GenealogicalDataCommunication genealogicalDataCommunication;
|
||||||
GenealogicalDataCommunicationLines genealogicalDataCommunicationLines;
|
GenealogicalDataCommunicationLines genealogicalDataCommunicationLines;
|
||||||
|
GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections;
|
||||||
List<(bool, bool, string)> genealogicalDataCommunicationFiles = new()
|
List<(bool, bool, string)> genealogicalDataCommunicationFiles = new()
|
||||||
{
|
{
|
||||||
// new(false, false, Path.Combine(saveDirectory, "Ancestry-Roberts/Roberts Family Tree.ged.cln")),
|
// new(false, false, Path.Combine(saveDirectory, "Ancestry-Roberts/Roberts Family Tree.ged.cln")),
|
||||||
@ -342,8 +339,8 @@ public partial class UnitTestHardCoded
|
|||||||
foreach ((bool verify, bool requireNickName, string genealogicalDataCommunicationFile) in genealogicalDataCommunicationFiles)
|
foreach ((bool verify, bool requireNickName, string genealogicalDataCommunicationFile) in genealogicalDataCommunicationFiles)
|
||||||
{
|
{
|
||||||
fileName = Path.GetFileNameWithoutExtension(genealogicalDataCommunicationFile).Split(' ')[0];
|
fileName = Path.GetFileNameWithoutExtension(genealogicalDataCommunicationFile).Split(' ')[0];
|
||||||
(_, individuals, _, _, _) = IGenealogicalDataCommunication.GetIndividuals(_Configuration.PropertyConfiguration.PersonBirthdayFormat, genealogicalDataCommunicationFile, new(personContainers), requireNickName);
|
genealogicalDataCommunicationCollections = IGenealogicalDataCommunication.GetIndividuals(genealogicalDataCommunicationFile, requireNickName);
|
||||||
foreach (KeyValuePair<string, string[]> keyValuePair in individuals)
|
foreach (KeyValuePair<string, string[]> keyValuePair in genealogicalDataCommunicationCollections.Individuals)
|
||||||
{
|
{
|
||||||
genealogicalDataCommunicationLines = IGenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(keyValuePair.Value);
|
genealogicalDataCommunicationLines = IGenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(keyValuePair.Value);
|
||||||
Assert.IsNotNull(genealogicalDataCommunicationLines.Name);
|
Assert.IsNotNull(genealogicalDataCommunicationLines.Name);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user