From fdbae49933bcd5308d39209156aadccec320ea1e Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 18 Mar 2026 15:18:14 -0400 Subject: [PATCH] CMP and SV to distinct namespaces --- README.MD | 18 +++++------- SabreTools.IO.sln | 28 ++++++++++++++++++ .../Enums.cs | 2 +- .../Reader.cs} | 10 +++---- .../Writer.cs} | 10 +++---- .../Reader.cs} | 10 +++---- .../Writer.cs} | 10 +++---- .../ReaderWriterTests.cs | 10 +++---- .../SabreTools.Text.ClrMamePro.Test.csproj | 29 +++++++++++++++++++ .../ReaderWriterTests.cs | 10 +++---- ...SabreTools.Text.SeparatedValue.Test.csproj | 29 +++++++++++++++++++ 11 files changed, 123 insertions(+), 43 deletions(-) rename SabreTools.IO/{SabreTools.IO.Readers => SabreTools.Text.ClrMamePro}/Enums.cs (85%) rename SabreTools.IO/{SabreTools.IO.Readers/ClrMameProReader.cs => SabreTools.Text.ClrMamePro/Reader.cs} (97%) rename SabreTools.IO/{SabreTools.IO.Writers/ClrMameProWriter.cs => SabreTools.Text.ClrMamePro/Writer.cs} (98%) rename SabreTools.IO/{SabreTools.IO.Readers/SeparatedValueReader.cs => SabreTools.Text.SeparatedValue/Reader.cs} (96%) rename SabreTools.IO/{SabreTools.IO.Writers/SeparatedValueWriter.cs => SabreTools.Text.SeparatedValue/Writer.cs} (95%) rename SabreTools.IO.Test/ReadersWriters/ClrMameProTests.cs => SabreTools.Text.ClrMamePro.Test/ReaderWriterTests.cs (86%) create mode 100644 SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj rename SabreTools.IO.Test/ReadersWriters/SeparatedValueTests.cs => SabreTools.Text.SeparatedValue.Test/ReaderWriterTests.cs (85%) create mode 100644 SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj diff --git a/README.MD b/README.MD index 5326753..42fba48 100644 --- a/README.MD +++ b/README.MD @@ -63,16 +63,6 @@ Extensions for `BinaryReader`, `byte[]`, and `Stream` to help with reading and w This namespace also contains other various extensions that help with common functionality and safe access. -### `SabreTools.IO.Readers` and `SabreTools.IO.Writers` - -Reading and writing support for the following file types: - -- ClrMamePro-derived Metadata files -- Standard and non-standard INI files -- Separated-Value files (e.g. CSV, SSV, TSV) - -For a generic INI implementation, see `SabreTools.IO.IniFile`. - ### `SabreTools.Logging` Logic for a logging system, including writing to console and textfile outputs. There are 4 possible log levels for logging statements to be invoked with. There is also a stopwatch implementation included for logging statements with automatic timespan tracking. @@ -133,6 +123,10 @@ Various encryption implementations that are used across multiple projects. Most | AES/CTR | Yes | Yes | Subset of functionality exposed from [The Bouncy Castle Cryptography Library For .NET](https://github.com/bcgit/bc-csharp) | | MoPaQ | No | Yes | Used to encrypt and decrypt MoPaQ tables for processing | +### `SabreTools.Text.ClrMamePro` + +Reader and writer classes for ClrMamePro-derived Metadata files. + ### `SabreTools.Text.Compare` Classes focused on string comparison by natural sorting. For example, "5" would be sorted before "100". @@ -141,6 +135,10 @@ Classes focused on string comparison by natural sorting. For example, "5" would Key-value pair INI file, implementing `Dictionary`. Includes reader and writer classes for easier access. +### `SabreTools.Text.SeparatedValue` + +Reader and writer classes for separated-Value files (e.g. CSV, SSV, TSV). + ## Releases For the most recent stable build, download the latest release here: [Releases Page](https://github.com/SabreTools/SabreTools.IO/releases) diff --git a/SabreTools.IO.sln b/SabreTools.IO.sln index 34f42f5..e618d04 100644 --- a/SabreTools.IO.sln +++ b/SabreTools.IO.sln @@ -17,6 +17,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.Compare.Tes EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.INI.Test", "SabreTools.Text.INI.Test\SabreTools.Text.INI.Test.csproj", "{4054E2C0-AC30-44EA-916E-73DD9FB3F2D0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.ClrMamePro.Test", "SabreTools.Text.ClrMamePro.Test\SabreTools.Text.ClrMamePro.Test.csproj", "{5AC10438-6EFC-408F-86F9-8B969C91DF9D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.SeparatedValue.Test", "SabreTools.Text.SeparatedValue.Test\SabreTools.Text.SeparatedValue.Test.csproj", "{F6366D73-08CF-4169-A05D-DC69047703E0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -111,6 +115,30 @@ Global {4054E2C0-AC30-44EA-916E-73DD9FB3F2D0}.Release|x64.Build.0 = Release|Any CPU {4054E2C0-AC30-44EA-916E-73DD9FB3F2D0}.Release|x86.ActiveCfg = Release|Any CPU {4054E2C0-AC30-44EA-916E-73DD9FB3F2D0}.Release|x86.Build.0 = Release|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Debug|x64.ActiveCfg = Debug|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Debug|x64.Build.0 = Debug|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Debug|x86.ActiveCfg = Debug|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Debug|x86.Build.0 = Debug|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Release|Any CPU.Build.0 = Release|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Release|x64.ActiveCfg = Release|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Release|x64.Build.0 = Release|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Release|x86.ActiveCfg = Release|Any CPU + {5AC10438-6EFC-408F-86F9-8B969C91DF9D}.Release|x86.Build.0 = Release|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Debug|x64.ActiveCfg = Debug|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Debug|x64.Build.0 = Debug|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Debug|x86.ActiveCfg = Debug|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Debug|x86.Build.0 = Debug|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Release|Any CPU.Build.0 = Release|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Release|x64.ActiveCfg = Release|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Release|x64.Build.0 = Release|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Release|x86.ActiveCfg = Release|Any CPU + {F6366D73-08CF-4169-A05D-DC69047703E0}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SabreTools.IO/SabreTools.IO.Readers/Enums.cs b/SabreTools.IO/SabreTools.Text.ClrMamePro/Enums.cs similarity index 85% rename from SabreTools.IO/SabreTools.IO.Readers/Enums.cs rename to SabreTools.IO/SabreTools.Text.ClrMamePro/Enums.cs index 6a75968..796f329 100644 --- a/SabreTools.IO/SabreTools.IO.Readers/Enums.cs +++ b/SabreTools.IO/SabreTools.Text.ClrMamePro/Enums.cs @@ -1,4 +1,4 @@ -namespace SabreTools.IO.Readers +namespace SabreTools.Text.ClrMamePro { /// /// Different types of CMP rows being parsed diff --git a/SabreTools.IO/SabreTools.IO.Readers/ClrMameProReader.cs b/SabreTools.IO/SabreTools.Text.ClrMamePro/Reader.cs similarity index 97% rename from SabreTools.IO/SabreTools.IO.Readers/ClrMameProReader.cs rename to SabreTools.IO/SabreTools.Text.ClrMamePro/Reader.cs index a19509a..18d8003 100644 --- a/SabreTools.IO/SabreTools.IO.Readers/ClrMameProReader.cs +++ b/SabreTools.IO/SabreTools.Text.ClrMamePro/Reader.cs @@ -4,9 +4,9 @@ using System.IO; using System.Text; using System.Text.RegularExpressions; -namespace SabreTools.IO.Readers +namespace SabreTools.Text.ClrMamePro { - public class ClrMameProReader : IDisposable + public class Reader : IDisposable { #region Constants @@ -93,7 +93,7 @@ namespace SabreTools.IO.Readers /// /// Constructor for reading from a file /// - public ClrMameProReader(string filename) + public Reader(string filename) { _reader = new StreamReader(filename); } @@ -101,7 +101,7 @@ namespace SabreTools.IO.Readers /// /// Constructor for reading from a stream and encoding /// - public ClrMameProReader(Stream stream, Encoding encoding) + public Reader(Stream stream, Encoding encoding) { _reader = new StreamReader(stream, encoding); } @@ -109,7 +109,7 @@ namespace SabreTools.IO.Readers /// /// Constructor for reading from a stream reader /// - public ClrMameProReader(StreamReader streamReader) + public Reader(StreamReader streamReader) { _reader = streamReader; } diff --git a/SabreTools.IO/SabreTools.IO.Writers/ClrMameProWriter.cs b/SabreTools.IO/SabreTools.Text.ClrMamePro/Writer.cs similarity index 98% rename from SabreTools.IO/SabreTools.IO.Writers/ClrMameProWriter.cs rename to SabreTools.IO/SabreTools.Text.ClrMamePro/Writer.cs index 08c4427..93affa9 100644 --- a/SabreTools.IO/SabreTools.IO.Writers/ClrMameProWriter.cs +++ b/SabreTools.IO/SabreTools.Text.ClrMamePro/Writer.cs @@ -2,13 +2,13 @@ using System.IO; using System.Text; -namespace SabreTools.IO.Writers +namespace SabreTools.Text.ClrMamePro { /// /// ClrMamePro writer patterned heavily off of XmlTextWriter /// /// - public class ClrMameProWriter : IDisposable + public class Writer : IDisposable { #region Private Enums and Structs @@ -120,7 +120,7 @@ namespace SabreTools.IO.Writers /// /// Constructor for writing to a file /// - public ClrMameProWriter(string filename) + public Writer(string filename) { _writer = new StreamWriter(filename); Quotes = true; @@ -134,7 +134,7 @@ namespace SabreTools.IO.Writers /// /// Constructor for writing to a stream /// - public ClrMameProWriter(Stream stream, Encoding encoding) + public Writer(Stream stream, Encoding encoding) { #if NET20 || NET35 || NET40 _writer = new StreamWriter(stream, encoding); @@ -152,7 +152,7 @@ namespace SabreTools.IO.Writers /// /// Constructor for writing to a stream writer /// - public ClrMameProWriter(StreamWriter streamWriter) + public Writer(StreamWriter streamWriter) { _writer = streamWriter; Quotes = true; diff --git a/SabreTools.IO/SabreTools.IO.Readers/SeparatedValueReader.cs b/SabreTools.IO/SabreTools.Text.SeparatedValue/Reader.cs similarity index 96% rename from SabreTools.IO/SabreTools.IO.Readers/SeparatedValueReader.cs rename to SabreTools.IO/SabreTools.Text.SeparatedValue/Reader.cs index 848d17c..0e4799a 100644 --- a/SabreTools.IO/SabreTools.IO.Readers/SeparatedValueReader.cs +++ b/SabreTools.IO/SabreTools.Text.SeparatedValue/Reader.cs @@ -4,9 +4,9 @@ using System.IO; using System.Text; using System.Text.RegularExpressions; -namespace SabreTools.IO.Readers +namespace SabreTools.Text.SeparatedValue { - public class SeparatedValueReader : IDisposable + public class Reader : IDisposable { #region Fields @@ -76,7 +76,7 @@ namespace SabreTools.IO.Readers /// /// Constructor for reading from a file /// - public SeparatedValueReader(string filename) + public Reader(string filename) { _reader = new StreamReader(filename); } @@ -84,7 +84,7 @@ namespace SabreTools.IO.Readers /// /// Constructor for reading from a stream /// - public SeparatedValueReader(Stream stream, Encoding encoding) + public Reader(Stream stream, Encoding encoding) { _reader = new StreamReader(stream, encoding); } @@ -92,7 +92,7 @@ namespace SabreTools.IO.Readers /// /// Constructor for reading from a stream reader /// - public SeparatedValueReader(StreamReader streamReader) + public Reader(StreamReader streamReader) { _reader = streamReader; } diff --git a/SabreTools.IO/SabreTools.IO.Writers/SeparatedValueWriter.cs b/SabreTools.IO/SabreTools.Text.SeparatedValue/Writer.cs similarity index 95% rename from SabreTools.IO/SabreTools.IO.Writers/SeparatedValueWriter.cs rename to SabreTools.IO/SabreTools.Text.SeparatedValue/Writer.cs index f429177..49ca4ad 100644 --- a/SabreTools.IO/SabreTools.IO.Writers/SeparatedValueWriter.cs +++ b/SabreTools.IO/SabreTools.Text.SeparatedValue/Writer.cs @@ -3,9 +3,9 @@ using System.Data; using System.IO; using System.Text; -namespace SabreTools.IO.Writers +namespace SabreTools.Text.SeparatedValue { - public class SeparatedValueWriter : IDisposable + public class Writer : IDisposable { #region Fields @@ -55,7 +55,7 @@ namespace SabreTools.IO.Writers /// /// Constructor for writing to a file /// - public SeparatedValueWriter(string filename) + public Writer(string filename) { _writer = new StreamWriter(filename); } @@ -63,7 +63,7 @@ namespace SabreTools.IO.Writers /// /// Consturctor for writing to a stream /// - public SeparatedValueWriter(Stream stream, Encoding encoding) + public Writer(Stream stream, Encoding encoding) { #if NET20 || NET35 || NET40 _writer = new StreamWriter(stream, encoding); @@ -75,7 +75,7 @@ namespace SabreTools.IO.Writers /// /// Consturctor for writing to a stream writer /// - public SeparatedValueWriter(StreamWriter streamWriter) + public Writer(StreamWriter streamWriter) { _writer = streamWriter; } diff --git a/SabreTools.IO.Test/ReadersWriters/ClrMameProTests.cs b/SabreTools.Text.ClrMamePro.Test/ReaderWriterTests.cs similarity index 86% rename from SabreTools.IO.Test/ReadersWriters/ClrMameProTests.cs rename to SabreTools.Text.ClrMamePro.Test/ReaderWriterTests.cs index 03c7d8a..c459578 100644 --- a/SabreTools.IO.Test/ReadersWriters/ClrMameProTests.cs +++ b/SabreTools.Text.ClrMamePro.Test/ReaderWriterTests.cs @@ -1,12 +1,10 @@ using System.IO; using System.Text; -using SabreTools.IO.Readers; -using SabreTools.IO.Writers; using Xunit; -namespace SabreTools.IO.Test.ReadersWriters +namespace SabreTools.Text.ClrMamePro.Test { - public class ClrMameProTests + public class ReaderWriterTests { [Fact] public void EndToEndTest() @@ -15,7 +13,7 @@ namespace SabreTools.IO.Test.ReadersWriters // Build and write the CMP file var stream = new MemoryStream(); - var writer = new ClrMameProWriter(stream, Encoding.UTF8); + var writer = new Writer(stream, Encoding.UTF8); Assert.True(writer.Quotes); writer.WriteStartElement("header"); @@ -42,7 +40,7 @@ namespace SabreTools.IO.Test.ReadersWriters // Parse the CMP file stream.Seek(0, SeekOrigin.Begin); - var reader = new ClrMameProReader(stream, Encoding.UTF8); + var reader = new Reader(stream, Encoding.UTF8); Assert.False(reader.DosCenter); Assert.True(reader.Quotes); diff --git a/SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj b/SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj new file mode 100644 index 0000000..45347d9 --- /dev/null +++ b/SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj @@ -0,0 +1,29 @@ + + + + net8.0;net9.0;net10.0 + false + latest + enable + true + CS0618 + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO.Test/ReadersWriters/SeparatedValueTests.cs b/SabreTools.Text.SeparatedValue.Test/ReaderWriterTests.cs similarity index 85% rename from SabreTools.IO.Test/ReadersWriters/SeparatedValueTests.cs rename to SabreTools.Text.SeparatedValue.Test/ReaderWriterTests.cs index 2fa29f6..0bcd1d7 100644 --- a/SabreTools.IO.Test/ReadersWriters/SeparatedValueTests.cs +++ b/SabreTools.Text.SeparatedValue.Test/ReaderWriterTests.cs @@ -1,12 +1,10 @@ using System.IO; using System.Text; -using SabreTools.IO.Readers; -using SabreTools.IO.Writers; using Xunit; -namespace SabreTools.IO.Test.ReadersWriters +namespace SabreTools.Text.SeparatedValue.Test { - public class SeparatedValueTests + public class ReaderWriterTests { [Fact] public void EndToEndTest() @@ -15,7 +13,7 @@ namespace SabreTools.IO.Test.ReadersWriters // Build and write the CSV var stream = new MemoryStream(); - var writer = new SeparatedValueWriter(stream, Encoding.UTF8); + var writer = new Writer(stream, Encoding.UTF8); Assert.True(writer.Quotes); Assert.Equal(',', writer.Separator); Assert.True(writer.VerifyFieldCount); @@ -34,7 +32,7 @@ namespace SabreTools.IO.Test.ReadersWriters // Parse the CSV stream.Seek(0, SeekOrigin.Begin); - var reader = new SeparatedValueReader(stream, Encoding.UTF8); + var reader = new Reader(stream, Encoding.UTF8); Assert.True(reader.Header); Assert.True(reader.Quotes); Assert.Equal(',', reader.Separator); diff --git a/SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj b/SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj new file mode 100644 index 0000000..45347d9 --- /dev/null +++ b/SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj @@ -0,0 +1,29 @@ + + + + net8.0;net9.0;net10.0 + false + latest + enable + true + CS0618 + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + \ No newline at end of file