From 9a4e4ce2d2ef172fc2171481af311ab3463e1cea Mon Sep 17 00:00:00 2001 From: Anthony Truskinger Date: Mon, 13 Nov 2017 15:31:37 +1000 Subject: [PATCH] Fixed bugs in ALR ConfigFileResolver now better handles paths. FileDateBehaviour parsing has been restored. AP.exe now (restores previous behavior and) crashes if a file date is required in the filename but is not present. --- .../Acoustics.Shared/ConfigFile/ConfigFile.cs | 15 ++--- .../Acoustics.Test/Acoustics.Test.csproj | 4 +- .../TestAnalyzeLongRecording.cs | 58 +++++++++++++++++++ AudioAnalysis/AnalysisBase/FileSegment.cs | 14 ++++- .../AnalyseLongRecording.cs | 2 +- AudioAnalysis/AnalysisPrograms/App.config | 7 +-- .../Indices/IndexProperties.cs | 2 +- 7 files changed, 79 insertions(+), 23 deletions(-) diff --git a/Acoustics/Acoustics.Shared/ConfigFile/ConfigFile.cs b/Acoustics/Acoustics.Shared/ConfigFile/ConfigFile.cs index 4dc39c288..587f78c7b 100644 --- a/Acoustics/Acoustics.Shared/ConfigFile/ConfigFile.cs +++ b/Acoustics/Acoustics.Shared/ConfigFile/ConfigFile.cs @@ -167,21 +167,14 @@ public static bool TryResolveConfigFile(string file, IEnumerable // this is a holdover from concrete file systems. The concept of a working directory has no real // equivalent in a virtual file system but this is implemented for compatibility - var workingDirectory = Directory.GetCurrentDirectory().ToDirectoryEntry(); - var localConfig = workingDirectory.CombineFile(file); - if (localConfig.Exists) + // GetFullPath should take care of relative paths relative to current working directory + var fullPath = Path.GetFullPath(file); + if (File.Exists(fullPath)) { - configFile = localConfig; + configFile = fullPath.ToFileEntry(); return true; } - // if it does not exist - // and is rooted, it can't exist - if (Path.IsPathRooted(file)) - { - return false; - } - if (searchPaths != null) { foreach (var directory in searchPaths) diff --git a/Acoustics/Acoustics.Test/Acoustics.Test.csproj b/Acoustics/Acoustics.Test/Acoustics.Test.csproj index 12a72fdc9..d2170cff8 100644 --- a/Acoustics/Acoustics.Test/Acoustics.Test.csproj +++ b/Acoustics/Acoustics.Test/Acoustics.Test.csproj @@ -441,8 +441,8 @@ - - + rem copy configs +xcopy "$(SolutionDir)AnalysisConfigFiles" "$(TargetDir)ConfigFiles\" /S /Y diff --git a/Acoustics/Acoustics.Test/AnalysisPrograms/AnalyzeLongRecordings/TestAnalyzeLongRecording.cs b/Acoustics/Acoustics.Test/AnalysisPrograms/AnalyzeLongRecordings/TestAnalyzeLongRecording.cs index 129314454..87c3749ed 100644 --- a/Acoustics/Acoustics.Test/AnalysisPrograms/AnalyzeLongRecordings/TestAnalyzeLongRecording.cs +++ b/Acoustics/Acoustics.Test/AnalysisPrograms/AnalyzeLongRecordings/TestAnalyzeLongRecording.cs @@ -288,5 +288,63 @@ public void TestAnalyzeSr64000Recording() Assert.AreEqual(28, twoMapsImage.Width); Assert.AreEqual(652, twoMapsImage.Height); } + + [TestMethod] + public void TestEnsuresFailureForNoDate() + { + var recordingPath = PathHelper.ResolveAsset("geckos.wav"); + + var configPath = PathHelper.ResolveConfigFile("Towsey.Acoustic.yml"); + //var indexPropertiesFile = PathHelper.ResolveConfigFile("IndexPropertiesConfig.yml"); + //indexPropertiesFile.CopyTo(Path.Combine(this.outputDirectory.FullName, "IndexPropertiesConfig.yml")); + + // modify config file + // because of difficulties in dealing with dynamic config files, just edit the text file!!!!! + var configLines = File.ReadAllLines(configPath.FullName); + configLines[configLines.IndexOf(x => x.StartsWith("RequireDateInFilename:"))] = "RequireDateInFilename: true"; + + // write the edited Config file to temporary output directory + var newConfigPath = this.outputDirectory.CombineFile("Towsey.Acoustic.yml"); + File.WriteAllLines(newConfigPath.FullName, configLines); + + var arguments = new AnalyseLongRecording.Arguments + { + Source = recordingPath, + Config = newConfigPath, + Output = this.outputDirectory, + MixDownToMono = true, + }; + + Assert.ThrowsException(() => AnalyseLongRecording.Execute(arguments)); + } + + [TestMethod] + public void TestEnsuresFailureWithAmbiguousDate() + { + var recordingPath = this.outputDirectory.CombineFile("20160801_110000_continuous1.wav"); + + var configPath = PathHelper.ResolveConfigFile("Towsey.Acoustic.yml"); + //var indexPropertiesFile = PathHelper.ResolveConfigFile("IndexPropertiesConfig.yml"); + //indexPropertiesFile.CopyTo(Path.Combine(this.outputDirectory.FullName, "IndexPropertiesConfig.yml")); + + // modify config file + // because of difficulties in dealing with dynamic config files, just edit the text file!!!!! + var configLines = File.ReadAllLines(configPath.FullName); + configLines[configLines.IndexOf(x => x.StartsWith("RequireDateInFilename:"))] = "RequireDateInFilename: true"; + + // write the edited Config file to temporary output directory + var newConfigPath = this.outputDirectory.CombineFile("Towsey.Acoustic.yml"); + File.WriteAllLines(newConfigPath.FullName, configLines); + + var arguments = new AnalyseLongRecording.Arguments + { + Source = recordingPath, + Config = newConfigPath, + Output = this.outputDirectory, + MixDownToMono = true, + }; + + Assert.ThrowsException(() => AnalyseLongRecording.Execute(arguments)); + } } } \ No newline at end of file diff --git a/AudioAnalysis/AnalysisBase/FileSegment.cs b/AudioAnalysis/AnalysisBase/FileSegment.cs index 027c4161a..e83133db4 100644 --- a/AudioAnalysis/AnalysisBase/FileSegment.cs +++ b/AudioAnalysis/AnalysisBase/FileSegment.cs @@ -65,11 +65,21 @@ public FileSegment(FileInfo source, int sampleRate, TimeSpan duration, FileDateB /// Implies `FileDateBehavior.Required`. /// NOTE: Start offset will be set to start of file, and end offset set to the end of the file. /// - public FileSegment(FileInfo source, TimeAlignment alignment, IAudioUtility utility = null) + public FileSegment( + FileInfo source, + TimeAlignment alignment, + IAudioUtility utility = null, + FileDateBehavior dateBehavior = FileDateBehavior.Try) { Contract.Requires(source != null); + if (alignment != TimeAlignment.None) + { + Contract.Requires( + dateBehavior == FileDateBehavior.Required, + "If TimeAlignment is required, a date must be required in the filename"); + } - this.dateBehavior = alignment == TimeAlignment.None ? FileDateBehavior.Try : FileDateBehavior.Required; + this.dateBehavior = dateBehavior; this.Source = source; this.Alignment = alignment; diff --git a/AudioAnalysis/AnalysisPrograms/AnalyseLongRecordings/AnalyseLongRecording.cs b/AudioAnalysis/AnalysisPrograms/AnalyseLongRecordings/AnalyseLongRecording.cs index 7bb379e57..d1e3cb909 100644 --- a/AudioAnalysis/AnalysisPrograms/AnalyseLongRecordings/AnalyseLongRecording.cs +++ b/AudioAnalysis/AnalysisPrograms/AnalyseLongRecordings/AnalyseLongRecording.cs @@ -148,7 +148,7 @@ public static void Execute(Arguments arguments) // 4. get the segment of audio to be analysed // if tiling output, specify that FileSegment needs to be able to read the date - var fileSegment = new FileSegment(sourceAudio, arguments.AlignToMinute); + var fileSegment = new FileSegment(sourceAudio, arguments.AlignToMinute, null, defaultBehavior); var bothOffsetsProvided = arguments.StartOffset.HasValue && arguments.EndOffset.HasValue; if (bothOffsetsProvided) { diff --git a/AudioAnalysis/AnalysisPrograms/App.config b/AudioAnalysis/AnalysisPrograms/App.config index 4df495da7..8bb817180 100644 --- a/AudioAnalysis/AnalysisPrograms/App.config +++ b/AudioAnalysis/AnalysisPrograms/App.config @@ -9,7 +9,6 @@ - @@ -18,18 +17,14 @@ - - - - @@ -90,4 +85,4 @@ - + \ No newline at end of file diff --git a/AudioAnalysis/AudioAnalysisTools/Indices/IndexProperties.cs b/AudioAnalysis/AudioAnalysisTools/Indices/IndexProperties.cs index 4f0349c3f..46aa9db05 100644 --- a/AudioAnalysis/AudioAnalysisTools/Indices/IndexProperties.cs +++ b/AudioAnalysis/AudioAnalysisTools/Indices/IndexProperties.cs @@ -330,7 +330,7 @@ public static FileInfo Find(dynamic configuration, FileInfo originalConfigFile) return null; } - return Find((string)configuration[AnalysisKeys.KeyIndexPropertiesConfig], originalConfigFile.ToFileEntry()).ToFileInfo(); + return Find((string)configuration[AnalysisKeys.KeyIndexPropertiesConfig], originalConfigFile.ToFileEntry())?.ToFileInfo(); } ///