ktsu.CodeBlocker 1.1.6

Prefix Reserved
dotnet add package ktsu.CodeBlocker --version 1.1.6
                    
NuGet\Install-Package ktsu.CodeBlocker -Version 1.1.6
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ktsu.CodeBlocker" Version="1.1.6" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ktsu.CodeBlocker" Version="1.1.6" />
                    
Directory.Packages.props
<PackageReference Include="ktsu.CodeBlocker" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ktsu.CodeBlocker --version 1.1.6
                    
#r "nuget: ktsu.CodeBlocker, 1.1.6"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ktsu.CodeBlocker@1.1.6
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ktsu.CodeBlocker&version=1.1.6
                    
Install as a Cake Addin
#tool nuget:?package=ktsu.CodeBlocker&version=1.1.6
                    
Install as a Cake Tool

ktsu.CodeBlocker

An IndentedTextWriter that makes generating code blocks easier.

License NuGet NuGet Downloads Build Status GitHub Stars

Introduction

CodeBlocker is a specialized utility built on top of IndentedTextWriter that simplifies the process of programmatically generating structured code. It provides automatic indentation management and a fluent interface for creating code blocks with proper nesting, making it ideal for code generation tasks, template engines, and dynamic source code creation.

Features

  • Automatic Indentation: Properly manages indentation levels as you create nested code blocks
  • Configurable Indentation: Support for custom indent strings (tabs, spaces, or any custom pattern)
  • Scope Management: Uses C# using statements for clean, readable scope creation with automatic brace handling powered by ktsu.ScopedAction
  • Flexible API: Write individual lines or entire code blocks with proper formatting
  • Standard Output Support: Works with StringWriter for flexible output handling
  • Cross-Platform: Supports .NET 9.0, 8.0, 7.0, 6.0, 5.0, .NET Standard 2.0 and 2.1
  • Lightweight: Minimal dependencies, built on top of ktsu.ScopedAction for robust scope management
  • Well-Tested: Includes comprehensive unit and integration tests

Installation

Package Manager Console

Install-Package ktsu.CodeBlocker

.NET CLI

dotnet add package ktsu.CodeBlocker

Package Reference

<PackageReference Include="ktsu.CodeBlocker" Version="1.1.5" />

Usage Examples

Basic Example

namespace CodeBlockerExample;

using ktsu.CodeBlocker;

internal class Example
{
	public static void GenerateCode()
	{
		// Create a new CodeBlocker instance with default tab indentation
		using var codeBlocker = CodeBlocker.Create();

		// Write using statements and namespace
		codeBlocker.WriteLine("using System;");
		codeBlocker.NewLine(); // Add empty line without indentation
		codeBlocker.WriteLine("namespace Example");
		
		// Use Scope for automatic brace and indentation management
		using (new Scope(codeBlocker))
		{
			codeBlocker.WriteLine("public class Example");
			using (new Scope(codeBlocker))
			{
				codeBlocker.WriteLine("public static void Main()");
				using (new Scope(codeBlocker))
				{
					codeBlocker.WriteLine("Console.WriteLine(\"Hello, World!\");");
				} // Scope automatically writes closing brace and manages indentation
			}
		}

		// Output the generated code
		Console.WriteLine(codeBlocker.ToString());
	}
}

The above example generates the following code:

using System;

namespace Example
{
	public class Example
	{
		public static void Main()
		{
			Console.WriteLine("Hello, World!");
		};
	};
};

Note: The Scope class automatically adds semicolons after closing braces (};) by design, which can be useful for code generation scenarios where you need to distinguish generated blocks.

Custom Indentation

CodeBlocker supports configurable indentation strings, allowing you to use spaces, tabs, or any custom pattern:

// Using 2 spaces for indentation
using var codeBlocker2Space = CodeBlocker.Create("  ");

// Using 4 spaces for indentation
using var codeBlocker4Space = CodeBlocker.Create("    ");

// Using custom patterns (e.g., for markup generation)
using var customCodeBlocker = CodeBlocker.Create("-->");

// With existing StringWriter and custom indentation
using var stringWriter = new StringWriter();
using var codeBlocker = new CodeBlocker(stringWriter, "  ");

codeBlocker.WriteLine("function example() {");
codeBlocker.Indent();
codeBlocker.WriteLine("console.log('Hello with 2 spaces!');");
codeBlocker.Outdent();
codeBlocker.WriteLine("}");

Console.WriteLine(codeBlocker.ToString());
// Output:
// function example() {
//   console.log('Hello with 2 spaces!');
// }

// Check current indent configuration
Console.WriteLine($"Current indent: '{codeBlocker.IndentString}'"); // "  "

// Custom indentation works seamlessly with Scope
using var scopeCodeBlocker = CodeBlocker.Create("    "); // 4 spaces
scopeCodeBlocker.WriteLine("public class Example");
using (new Scope(scopeCodeBlocker))
{
    scopeCodeBlocker.WriteLine("public void Method()");
    using (new Scope(scopeCodeBlocker))
    {
        scopeCodeBlocker.WriteLine("// 4-space indented code");
    }
}

Advanced Usage

// Creating a CodeBlocker with a custom StringWriter
using var stringWriter = new StringWriter();
using var codeBlocker = new CodeBlocker(stringWriter);

// Generate a more complex structure
codeBlocker.WriteLine("public interface IExample");
using (new Scope(codeBlocker))
{
    // Define interface methods
    codeBlocker.WriteLine("void Method1();");
    codeBlocker.WriteLine("string Method2(int parameter);");
    
    // Define nested interface
    codeBlocker.NewLine();
    codeBlocker.WriteLine("public interface INestedExample");
    using (new Scope(codeBlocker))
    {
        codeBlocker.WriteLine("void NestedMethod();");
    }
}

// Add implementation
codeBlocker.NewLine();
codeBlocker.WriteLine("public class Implementation : IExample");
using (new Scope(codeBlocker))
{
    // Implement methods
    codeBlocker.WriteLine("public void Method1()");
    using (new Scope(codeBlocker))
    {
        codeBlocker.WriteLine("// Implementation here");
    }
    
    codeBlocker.NewLine();
    codeBlocker.WriteLine("public string Method2(int parameter)");
    using (new Scope(codeBlocker))
    {
        codeBlocker.WriteLine("return parameter.ToString();");
    }
}

// Get the result
string result = codeBlocker.ToString();

API Reference

CodeBlocker Class

The main class for building indented code blocks.

Constructors
Name Description
CodeBlocker(StringWriter stringWriter) Creates a new CodeBlocker with the specified StringWriter using tab indentation
CodeBlocker(StringWriter stringWriter, string indentString) Creates a new CodeBlocker with the specified StringWriter and custom indent string
Properties
Name Type Description
CurrentIndent int Gets or sets the current indentation level
IndentString string Gets the current indent string being used (e.g., "\t", " ", " ")
Methods
Name Return Type Description
WriteLine(string line) void Writes a line of text with appropriate indentation
WriteLine() void Writes an empty line with current indentation
Write(string text) void Writes text without adding a new line
NewLine() void Writes an empty line without indentation
Indent() void Increases the indent level
Outdent() void Decreases the indent level
ToString() string Returns the generated code as a string
Create() CodeBlocker Static factory method to create a new CodeBlocker instance with tab indentation
Create(string indentString) CodeBlocker Static factory method to create a new CodeBlocker instance with custom indentation
Dispose() void Disposes of the CodeBlocker and underlying resources

Scope Class

Helper class for managing indentation scopes with automatic brace handling. Built on top of ktsu.ScopedAction for guaranteed resource cleanup and exception safety.

Constructor
Name Description
Scope(CodeBlocker codeBlocker) Creates a new scope that automatically writes opening brace {, increases indentation, and handles cleanup on disposal
Methods
Name Return Type Description
Dispose() void Decreases indentation level and writes closing brace }; when scope is exited
Behavior
  • On Creation: Writes { and increases indentation level
  • On Disposal: Decreases indentation level and writes };
  • Exception Safety: Guaranteed cleanup even if exceptions occur within the scope
  • Resource Management: Built on ktsu.ScopedAction for reliable resource handling

Contributing

Contributions are welcome! Here's how you can help:

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 is compatible. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.1.6 206 8/6/2025
1.1.5 207 8/6/2025
1.1.4 207 8/6/2025
1.1.3 203 8/6/2025
1.1.2 207 8/6/2025
1.1.2-pre.17 125 5/20/2025
1.1.2-pre.15 82 5/17/2025
1.1.2-pre.14 132 5/16/2025
1.1.2-pre.13 208 5/15/2025
1.1.2-pre.12 206 5/14/2025
1.1.2-pre.11 207 5/13/2025
1.1.2-pre.10 232 5/12/2025
1.1.2-pre.9 170 5/11/2025
1.1.2-pre.8 118 5/10/2025
1.1.2-pre.7 53 5/9/2025
1.1.2-pre.6 125 5/8/2025
1.1.2-pre.5 126 5/7/2025
1.1.2-pre.4 125 5/6/2025
1.1.2-pre.3 126 5/5/2025
1.1.2-pre.2 124 5/4/2025
1.1.2-pre.1 127 5/4/2025
1.1.1 122 5/4/2025
1.1.1-pre.2 62 4/26/2025
1.1.1-pre.1 123 4/4/2025
1.1.0 149 3/30/2025
1.0.32-pre.2 81 3/29/2025
1.0.32-pre.1 463 3/25/2025
1.0.31 130 2/17/2025
1.0.31-pre.3 89 2/6/2025
1.0.31-pre.2 75 2/5/2025
1.0.31-pre.1 73 2/5/2025
1.0.30 115 1/2/2025
1.0.30-pre.29 74 2/3/2025
1.0.30-pre.28 76 2/3/2025
1.0.30-pre.27 80 2/1/2025
1.0.30-pre.26 71 1/30/2025
1.0.30-pre.25 79 1/28/2025
1.0.30-pre.24 73 1/26/2025
1.0.30-pre.23 65 1/24/2025
1.0.30-pre.22 67 1/22/2025
1.0.30-pre.21 75 1/20/2025
1.0.30-pre.20 62 1/18/2025
1.0.30-pre.19 67 1/16/2025
1.0.30-pre.18 49 1/14/2025
1.0.30-pre.17 59 1/13/2025
1.0.30-pre.16 67 1/11/2025
1.0.30-pre.15 61 1/10/2025
1.0.30-pre.14 66 1/10/2025
1.0.30-pre.13 63 1/8/2025
1.0.30-pre.12 68 1/7/2025
1.0.30-pre.11 72 1/6/2025
1.0.30-pre.10 88 1/4/2025
1.0.30-pre.9 78 1/3/2025
1.0.30-pre.8 74 1/3/2025
1.0.30-pre.7 76 1/3/2025
1.0.30-pre.6 85 1/2/2025
1.0.30-pre.5 102 12/31/2024
1.0.30-pre.4 70 12/29/2024
1.0.30-pre.3 72 12/28/2024
1.0.30-pre.2 79 12/27/2024
1.0.30-pre.1 69 12/27/2024
1.0.29-pre.1 66 12/27/2024
1.0.28 110 12/26/2024
1.0.27 108 12/26/2024
1.0.26 111 12/26/2024
1.0.25 112 12/26/2024
1.0.24 109 12/26/2024
1.0.23 112 12/26/2024
1.0.22 112 12/26/2024
1.0.21 107 12/23/2024
1.0.20 108 12/23/2024
1.0.19 119 12/22/2024
1.0.18 114 12/22/2024
1.0.17 115 12/4/2024
1.0.16 117 12/2/2024
1.0.15 118 11/30/2024
1.0.14 114 11/26/2024
1.0.13 124 11/20/2024
1.0.12 122 11/13/2024
1.0.11 115 11/1/2024
1.0.10 127 10/4/2024
1.0.10-pre.1 73 12/27/2024
1.0.9 121 9/19/2024
1.0.8 105 9/19/2024
1.0.7 108 9/19/2024
1.0.6 113 9/19/2024
1.0.5 121 9/18/2024
1.0.4 113 9/18/2024
1.0.3 115 9/18/2024
1.0.2 122 9/18/2024
1.0.1 129 9/14/2024
1.0.0 135 9/14/2024

## v1.1.6 (patch)

Changes since v1.1.5:

- Enhance CodeBlocker functionality with new methods and improved documentation ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.1.5 (patch)

Changes since v1.1.4:

- Add ktsu.ScopedAction dependency; enhance CodeBlocker with custom indentation support and Scope management ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.1.4 (patch)

Changes since v1.1.3:

- Integrate CodeBlocker.Test project with unit and integration tests; update dependencies and solution configuration for testing support ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.1.3 (patch)

Changes since v1.1.2:

- Add unit and integration tests for CodeBlocker functionality; include test dependencies in project configuration ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.1.2 (patch)

Changes since v1.1.1:

- Enhance .NET workflow with manual trigger support, JDK setup, and SonarQube integration; update PSBuild script to allow optional NuGet API key and handle changelog length limits. ([@matt-edmondson](https://github.com/matt-edmondson))
- Update configuration files and scripts for improved build and test processes ([@matt-edmondson](https://github.com/matt-edmondson))
- Support net9.0;net8.0;net7.0;net6.0;net5.0;netstandard2.0;netstandard2.1 ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.1.2-pre.17 (prerelease)

Changes since v1.1.2-pre.16:

- Merge remote-tracking branch 'refs/remotes/origin/main' ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .editorconfig ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\PSBuild.psm1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .runsettings ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitattributes ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitignore ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .mailmap ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.1.2-pre.16 (prerelease)

Changes since v1.1.2-pre.15:

- Sync scripts\PSBuild.psm1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .mailmap ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .editorconfig ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitattributes ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .runsettings ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitignore ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.1.2-pre.15 (prerelease)

Changes since v1.1.2-pre.14:
## v1.1.2-pre.14 (prerelease)

Changes since v1.1.2-pre.13:
## v1.1.2-pre.13 (prerelease)

Changes since v1.1.2-pre.12:
## v1.1.2-pre.12 (prerelease)

Changes since v1.1.2-pre.11:
## v1.1.2-pre.11 (prerelease)

Changes since v1.1.2-pre.10:
## v1.1.2-pre.10 (prerelease)

Changes since v1.1.2-pre.9:
## v1.1.2-pre.9 (prerelease)

Changes since v1.1.2-pre.8:
## v1.1.2-pre.8 (prerelease)

Changes since v1.1.2-pre.7:
## v1.1.2-pre.7 (prerelease)

Changes since v1.1.2-pre.6:
## v1.1.2-pre.6 (prerelease)

Changes since v1.1.2-pre.5:
## v1.1.2-pre.5 (prerelease)

Changes since v1.1.2-pre.4:
## v1.1.2-pre.4 (prerelease)

Changes since v1.1.2-pre.3:
## v1.1.2-pre.3 (prerelease)

Changes since v1.1.2-pre.2:
## v1.1.2-pre.2 (prerelease)

Changes since v1.1.2-pre.1:
## v1.1.2-pre.1 (prerelease)

Incremental prerelease update.
## v1.1.1 (patch)

Changes since v1.1.0:

- Remove Directory.Build.props and Directory.Build.targets files, delete commit metadata and changelog scripts, and add copyright notice to CodeBlocker.cs. ([@matt-edmondson](https://github.com/matt-edmondson))
- Enhance documentation and project metadata. Updated DESCRIPTION.md to clarify the purpose of CodeBlocker and expanded README.md with detailed introduction, features, installation instructions, usage examples, and API reference. Changed project SDK in CodeBlocker.csproj to ktsu.Sdk.Lib/1.8.0. ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.1.1-pre.2 (prerelease)

Changes since v1.1.1-pre.1:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .editorconfig ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .runsettings ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.1.1-pre.1 (prerelease)

Incremental prerelease update.
## v1.1.0 (minor)

Changes since v1.0.0:

- Update .editorconfig for improved code style and naming ([@matt-edmondson](https://github.com/matt-edmondson))
- Add automation scripts for metadata management and versioning ([@matt-edmondson](https://github.com/matt-edmondson))
- Add LICENSE template ([@matt-edmondson](https://github.com/matt-edmondson))
- Replace LICENSE file with LICENSE.md and update copyright information ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.32-pre.2 (prerelease)

Changes since v1.0.32-pre.1:

- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.32-pre.1 (prerelease)

Changes since v1.0.31:

- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .gitignore ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .editorconfig ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.31 (patch)

Changes since v1.0.30:

- Update .editorconfig for improved code style and naming ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.31-pre.3 (prerelease)

Changes since v1.0.31-pre.2:

- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.31-pre.2 (prerelease)

Changes since v1.0.31-pre.1:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.31-pre.1 (prerelease)

Incremental prerelease update.
## v1.0.30 (patch)

No significant changes detected since v1.0.30-pre.29.
## v1.0.30-pre.29 (prerelease)

Changes since v1.0.30-pre.28:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.30-pre.28 (prerelease)

Changes since v1.0.30-pre.27:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.30-pre.27 (prerelease)

Changes since v1.0.30-pre.26:
## v1.0.30-pre.26 (prerelease)

Changes since v1.0.30-pre.25:
## v1.0.30-pre.25 (prerelease)

Changes since v1.0.30-pre.24:

- Bump MSTest from 3.7.2 to 3.7.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.30-pre.24 (prerelease)

Changes since v1.0.30-pre.23:
## v1.0.30-pre.23 (prerelease)

Changes since v1.0.30-pre.22:
## v1.0.30-pre.22 (prerelease)

Changes since v1.0.30-pre.21:

- Bump MSTest from 3.7.1 to 3.7.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.30-pre.21 (prerelease)

Changes since v1.0.30-pre.20:

- Bump coverlet.collector from 6.0.3 to 6.0.4 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.30-pre.20 (prerelease)

Changes since v1.0.30-pre.19:
## v1.0.30-pre.19 (prerelease)

Changes since v1.0.30-pre.18:
## v1.0.30-pre.18 (prerelease)

Changes since v1.0.30-pre.17:

- Bump MSTest from 3.7.0 to 3.7.1 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.30-pre.17 (prerelease)

Changes since v1.0.30-pre.16:
## v1.0.30-pre.16 (prerelease)

Changes since v1.0.30-pre.15:
## v1.0.30-pre.15 (prerelease)

Changes since v1.0.30-pre.14:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.30-pre.14 (prerelease)

Changes since v1.0.30-pre.13:

- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.30-pre.13 (prerelease)

Changes since v1.0.30-pre.12:
## v1.0.30-pre.12 (prerelease)

Changes since v1.0.30-pre.11:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.30-pre.11 (prerelease)

Changes since v1.0.30-pre.10:
## v1.0.30-pre.10 (prerelease)

Changes since v1.0.30-pre.9:
## v1.0.30-pre.9 (prerelease)

Changes since v1.0.30-pre.8:

- Sync .mailmap ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync scripts\make-version.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.30-pre.8 (prerelease)

Changes since v1.0.30-pre.7:

- Sync scripts\make-changelog.ps1 ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.30-pre.7 (prerelease)

Changes since v1.0.30-pre.6:

- Add automation scripts for metadata management and versioning ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.30-pre.6 (prerelease)

Changes since v1.0.30-pre.5:
## v1.0.30-pre.5 (prerelease)

Changes since v1.0.30-pre.4:

- Bump coverlet.collector from 6.0.2 to 6.0.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.30-pre.4 (prerelease)

Changes since v1.0.30-pre.3:
## v1.0.30-pre.3 (prerelease)

Changes since v1.0.30-pre.2:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.30-pre.2 (prerelease)

Changes since v1.0.30-pre.1:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.30-pre.1 (prerelease)

Incremental prerelease update.
## v1.0.29-pre.1 (prerelease)

Changes since v1.0.28:

- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.28 (patch)

Changes since v1.0.27:

- Sync icon.png ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.27 (patch)

Changes since v1.0.26:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.26 (patch)

Changes since v1.0.25:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.25 (patch)

Changes since v1.0.24:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.24 (patch)

Changes since v1.0.23:

- Replace LICENSE file with LICENSE.md and update copyright information ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.23 (patch)

Changes since v1.0.22:

- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.22 (patch)

Changes since v1.0.21:

- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync icon.png ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.21 (patch)

Changes since v1.0.20:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.20 (patch)

Changes since v1.0.19:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.19 (patch)

Changes since v1.0.18:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.18 (patch)

Changes since v1.0.17:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.17 (patch)

Changes since v1.0.16:

- Bump MSTest.TestAdapter from 3.6.3 to 3.6.4 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump MSTest.TestFramework from 3.6.3 to 3.6.4 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.16 (patch)

Changes since v1.0.15:

- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.15 (patch)

Changes since v1.0.14:

- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.14 (patch)

Changes since v1.0.13:

- Sync Directory.Build.targets ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync Directory.Build.props ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.13 (patch)

Changes since v1.0.12:

- Bump Microsoft.NET.Test.Sdk in the microsoft group ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump MSTest.TestAdapter from 3.6.2 to 3.6.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.12 (patch)

Changes since v1.0.11:

- Bump MSTest.TestFramework from 3.6.2 to 3.6.3 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.11 (patch)

Changes since v1.0.10:

- Bump MSTest.TestAdapter from 3.6.1 to 3.6.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Bump MSTest.TestFramework from 3.6.0 to 3.6.2 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.10 (patch)

Changes since v1.0.9:

- Bump MSTest.TestAdapter from 3.6.0 to 3.6.1 ([@dependabot[bot]](https://github.com/dependabot[bot]))
## v1.0.10-pre.1 (prerelease)

Changes since v1.0.10:

- Replace LICENSE file with LICENSE.md and update copyright information ([@matt-edmondson](https://github.com/matt-edmondson))
- Renamed metadata files ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.9 (patch)

Changes since v1.0.8:

- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.8 (patch)

Changes since v1.0.7:
## v1.0.7 (patch)

Changes since v1.0.6:

- Sync .github\dependabot.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\dependabot.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.6 (patch)

Changes since v1.0.5:

- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.5 (patch)

Changes since v1.0.4:

- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.4 (patch)

Changes since v1.0.3:

- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.3 (patch)

Changes since v1.0.2:

- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Bump MSTest.TestAdapter from 3.5.2 to 3.6.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Bump MSTest.TestFramework from 3.5.2 to 3.6.0 ([@dependabot[bot]](https://github.com/dependabot[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dependabot-merge.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.2 (patch)

Changes since v1.0.1:

- Sync .github\dependabot.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
- Sync .github\workflows\dotnet.yml ([@ktsu[bot]](https://github.com/ktsu[bot]))
## v1.0.1 (patch)

Changes since v1.0.0:

- Migrate ktsu.io to ktsu namespace ([@matt-edmondson](https://github.com/matt-edmondson))
## v1.0.0 (major)

- Update description and readme ([@matt-edmondson](https://github.com/matt-edmondson))
- Initial commit after extricating out of Schema Tools project ([@matt-edmondson](https://github.com/matt-edmondson))
- Add XML documentation ([@matt-edmondson](https://github.com/matt-edmondson))
- Update LICENSE ([@matt-edmondson](https://github.com/matt-edmondson))
- Enable dependabot and sourcelink ([@matt-edmondson](https://github.com/matt-edmondson))
- Create dependabot-merge.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Read PackageDescription from DESCRIPTION file ([@matt-edmondson](https://github.com/matt-edmondson))
- Assign dependabot PRs to matt ([@matt-edmondson](https://github.com/matt-edmondson))
- Migrate from .project.props to Directory.Build.props ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Directory.Build.props ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Directory.Build.props ([@matt-edmondson](https://github.com/matt-edmondson))
- Update nuget.config ([@matt-edmondson](https://github.com/matt-edmondson))
- Create VERSION ([@matt-edmondson](https://github.com/matt-edmondson))
- Update build config ([@matt-edmondson](https://github.com/matt-edmondson))
- Update Directory.Build.targets ([@matt-edmondson](https://github.com/matt-edmondson))
- Update nuget.config ([@matt-edmondson](https://github.com/matt-edmondson))
- Update build scripts ([@matt-edmondson](https://github.com/matt-edmondson))
- Dont try to push packages when building pull requests ([@matt-edmondson](https://github.com/matt-edmondson))
- Update LICENSE ([@matt-edmondson](https://github.com/matt-edmondson))
- Read from VERSION when building ([@matt-edmondson](https://github.com/matt-edmondson))
- Set GenerateDocumentationFile ([@matt-edmondson](https://github.com/matt-edmondson))
- Fix code style errors ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Avoid double upload of symbols package ([@matt-edmondson](https://github.com/matt-edmondson))
- Update dotnet.yml ([@matt-edmondson](https://github.com/matt-edmondson))
- Update .editorconfig ([@matt-edmondson](https://github.com/matt-edmondson))
- Add github package support ([@matt-edmondson](https://github.com/matt-edmondson))
- Read from AUTHORS file during build ([@matt-edmondson](https://github.com/matt-edmondson))