CMP and SV to distinct namespaces

This commit is contained in:
Matt Nadareski
2026-03-18 15:18:14 -04:00
parent de5239dbc6
commit fdbae49933
11 changed files with 123 additions and 43 deletions

View File

@@ -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<string, string?>`. 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)

View File

@@ -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

View File

@@ -1,4 +1,4 @@
namespace SabreTools.IO.Readers
namespace SabreTools.Text.ClrMamePro
{
/// <summary>
/// Different types of CMP rows being parsed

View File

@@ -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
/// <summary>
/// Constructor for reading from a file
/// </summary>
public ClrMameProReader(string filename)
public Reader(string filename)
{
_reader = new StreamReader(filename);
}
@@ -101,7 +101,7 @@ namespace SabreTools.IO.Readers
/// <summary>
/// Constructor for reading from a stream and encoding
/// </summary>
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
/// <summary>
/// Constructor for reading from a stream reader
/// </summary>
public ClrMameProReader(StreamReader streamReader)
public Reader(StreamReader streamReader)
{
_reader = streamReader;
}

View File

@@ -2,13 +2,13 @@
using System.IO;
using System.Text;
namespace SabreTools.IO.Writers
namespace SabreTools.Text.ClrMamePro
{
/// <summary>
/// ClrMamePro writer patterned heavily off of XmlTextWriter
/// </summary>
/// <see cref="https://referencesource.microsoft.com/#System.Xml/System/Xml/Core/XmlTextWriter.cs"/>
public class ClrMameProWriter : IDisposable
public class Writer : IDisposable
{
#region Private Enums and Structs
@@ -120,7 +120,7 @@ namespace SabreTools.IO.Writers
/// <summary>
/// Constructor for writing to a file
/// </summary>
public ClrMameProWriter(string filename)
public Writer(string filename)
{
_writer = new StreamWriter(filename);
Quotes = true;
@@ -134,7 +134,7 @@ namespace SabreTools.IO.Writers
/// <summary>
/// Constructor for writing to a stream
/// </summary>
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
/// <summary>
/// Constructor for writing to a stream writer
/// </summary>
public ClrMameProWriter(StreamWriter streamWriter)
public Writer(StreamWriter streamWriter)
{
_writer = streamWriter;
Quotes = true;

View File

@@ -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
/// <summary>
/// Constructor for reading from a file
/// </summary>
public SeparatedValueReader(string filename)
public Reader(string filename)
{
_reader = new StreamReader(filename);
}
@@ -84,7 +84,7 @@ namespace SabreTools.IO.Readers
/// <summary>
/// Constructor for reading from a stream
/// </summary>
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
/// <summary>
/// Constructor for reading from a stream reader
/// </summary>
public SeparatedValueReader(StreamReader streamReader)
public Reader(StreamReader streamReader)
{
_reader = streamReader;
}

View File

@@ -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
/// <summary>
/// Constructor for writing to a file
/// </summary>
public SeparatedValueWriter(string filename)
public Writer(string filename)
{
_writer = new StreamWriter(filename);
}
@@ -63,7 +63,7 @@ namespace SabreTools.IO.Writers
/// <summary>
/// Consturctor for writing to a stream
/// </summary>
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
/// <summary>
/// Consturctor for writing to a stream writer
/// </summary>
public SeparatedValueWriter(StreamWriter streamWriter)
public Writer(StreamWriter streamWriter)
{
_writer = streamWriter;
}

View File

@@ -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);

View File

@@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
<IsPackable>false</IsPackable>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsNotAsErrors>CS0618</WarningsNotAsErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="8.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.3.0" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SabreTools.IO\SabreTools.IO.csproj" />
</ItemGroup>
</Project>

View File

@@ -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);

View File

@@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
<IsPackable>false</IsPackable>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsNotAsErrors>CS0618</WarningsNotAsErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="8.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.3.0" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SabreTools.IO\SabreTools.IO.csproj" />
</ItemGroup>
</Project>