Skip to content

Commit 7c1e616

Browse files
committed
Merge remote-tracking branch 'origin/main' into feature/ktsu-ecosystem-integration
# Conflicts: # Directory.Packages.props
2 parents ec8f57e + 2c8e392 commit 7c1e616

19 files changed

Lines changed: 1295 additions & 1100 deletions

CHANGELOG.md

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,37 @@
1-
## v1.3.4
1+
## v1.4.1 (patch)
22

3-
Changes since v1.3.4:
3+
Changes since v1.4.0:
4+
5+
- Fix analyzer errors in collection test data classes ([@Claude](https://github.com/Claude))
6+
- Add TAGS.md with NuGet package tags ([@matt-edmondson](https://github.com/matt-edmondson))
7+
- Fold owner decisions into roadmap ([@Claude](https://github.com/Claude))
8+
- Refresh documentation to match the current v1.4 API ([@Claude](https://github.com/Claude))
9+
- Add project roadmap based on codebase analysis ([@Claude](https://github.com/Claude))
10+
- Add schema validation API and fix lossy reflection type mappings ([@Claude](https://github.com/Claude))
11+
## v1.4.0 (minor)
12+
13+
Changes since v1.3.0:
14+
15+
- [minor] Complete DataSource and CodeGenerator models, fix Reassociate ([@matt-edmondson](https://github.com/matt-edmondson))
16+
- [minor] Add SchemaSerializer, JSON serialization support, and comprehensive test suite ([@matt-edmondson](https://github.com/matt-edmondson))
17+
- Remove .github\workflows\project.yml ([@matt-edmondson](https://github.com/matt-edmondson))
18+
- Update project SDK from ktsu.Sdk.App to ktsu.Sdk.ImGuiApp in SchemaEditor.csproj ([@matt-edmondson](https://github.com/matt-edmondson))
19+
- migrate to dotnet 10 ([@matt-edmondson](https://github.com/matt-edmondson))
20+
- Replace StrongStrings and StrongPaths with ktsu.Semantics across the codebase, updating relevant class constraints and references to use ISemanticString. This change enhances type safety and aligns with the latest library standards. ([@matt-edmondson](https://github.com/matt-edmondson))
21+
- Refactor Schema Library Documentation and Examples ([@matt-edmondson](https://github.com/matt-edmondson))
22+
- Update tests to use new SchemaProvider API - remove dependency on obsolete Schema class ([@matt-edmondson](https://github.com/matt-edmondson))
23+
- Update packages ([@matt-edmondson](https://github.com/matt-edmondson))
24+
- Update package references and add XML declaration in project files ([@matt-edmondson](https://github.com/matt-edmondson))
25+
- Refactor schema management by introducing a new Schema class and related models, replacing the previous SchemaProvider and related interfaces. This update enhances type safety and aligns with the latest design principles, removing obsolete classes and improving the overall structure of the schema definitions. ([@matt-edmondson](https://github.com/matt-edmondson))
26+
- Complete Schema refactoring to DI SchemaProvider - remove serialization and filesystem concerns ([@matt-edmondson](https://github.com/matt-edmondson))
27+
- [minor] Add CodeGenerator tree, DataSource property panel, and use SchemaSerializer in editor ([@matt-edmondson](https://github.com/matt-edmondson))
28+
- Remove Directory.Build.props and Directory.Build.targets files; add copyright notices to schema files; refactor variable declarations for consistency. ([@matt-edmondson](https://github.com/matt-edmondson))
29+
- Update README.md with comprehensive project details and usage examples ([@matt-edmondson](https://github.com/matt-edmondson))
30+
- Update package references and restructure project files for improved organization and clarity ([@matt-edmondson](https://github.com/matt-edmondson))
31+
- Update project SDK references and README formatting ([@matt-edmondson](https://github.com/matt-edmondson))
32+
- Add schema contract interfaces for schema definitions, including ISchema, ISchemaChild, ISchemaClass, ISchemaEnum, and related name interfaces. This introduces a structured approach to schema management without serialization concerns. ([@matt-edmondson](https://github.com/matt-edmondson))
33+
- Add CLAUDE.md for project guidance and documentation ([@matt-edmondson](https://github.com/matt-edmondson))
34+
- compatibility suppressions ([@matt-edmondson](https://github.com/matt-edmondson))
435
## v1.3.4 (patch)
536

637
Changes since v1.3.3:

Directory.Packages.props

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,20 @@
1212
<PackageVersion Include="ktsu.IntervalAction" Version="1.3.7" />
1313
<PackageVersion Include="ktsu.Keybinding.Core" Version="1.0.6" />
1414
<PackageVersion Include="ktsu.UndoRedo.Core" Version="1.0.6" />
15-
<PackageVersion Include="ktsu.RoundTripStringJsonConverter" Version="1.0.7" />
15+
<PackageVersion Include="ktsu.RoundTripStringJsonConverter" Version="1.0.10" />
1616
<PackageVersion Include="ktsu.SemanticString" Version="1.4.0" />
17-
<PackageVersion Include="ktsu.Semantics.Strings" Version="1.0.28" />
18-
<PackageVersion Include="ktsu.Semantics.Paths" Version="1.0.28" />
19-
<PackageVersion Include="ktsu.ImGui.App" Version="2.2.3" />
20-
<PackageVersion Include="ktsu.ImGui.Popups" Version="2.2.3" />
21-
<PackageVersion Include="ktsu.ImGui.Widgets" Version="2.2.3" />
17+
<PackageVersion Include="ktsu.Semantics.Strings" Version="1.0.35" />
18+
<PackageVersion Include="ktsu.Semantics.Paths" Version="1.0.35" />
19+
<PackageVersion Include="ktsu.ImGui.App" Version="2.15.0" />
20+
<PackageVersion Include="ktsu.ImGui.Popups" Version="2.15.0" />
21+
<PackageVersion Include="ktsu.ImGui.Widgets" Version="2.15.0" />
2222
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
2323
<PackageVersion Include="coverlet.msbuild" Version="6.0.4" />
2424
<PackageVersion Include="DiffPlex" Version="1.8.0" />
2525
<PackageVersion Include="FluentAssertions" Version="6.12.1" />
2626
<PackageVersion Include="FluentValidation" Version="12.0.0" />
2727
<PackageVersion Include="ImGui.NET" Version="1.91.6.1" />
28-
<PackageVersion Include="ktsu.AppDataStorage" Version="1.15.6" />
28+
<PackageVersion Include="ktsu.AppDataStorage" Version="1.16.21" />
2929
<PackageVersion Include="ktsu.AppData" Version="1.0.6" />
3030
<PackageVersion Include="ktsu.CaseConverter" Version="1.3.2" />
3131
<PackageVersion Include="ktsu.StrongPaths" Version="1.3.2" />
@@ -60,8 +60,8 @@
6060
<PackageVersion Include="TestableIO.System.IO.Abstractions.Wrappers" Version="22.0.14" />
6161
<PackageVersion Include="Tomlyn" Version="0.19.0" />
6262
<PackageVersion Include="YamlDotNet" Version="16.3.0" />
63-
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="10.0.102" />
64-
<PackageVersion Include="Microsoft.SourceLink.AzureRepos.Git" Version="10.0.102" />
65-
<PackageVersion Include="Polyfill" Version="9.7.6" />
63+
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="10.0.300" />
64+
<PackageVersion Include="Microsoft.SourceLink.AzureRepos.Git" Version="10.0.300" />
65+
<PackageVersion Include="Polyfill" Version="10.8.1" />
6666
</ItemGroup>
6767
</Project>

LATEST_CHANGELOG.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1-
## v1.3.4
1+
## v1.4.1 (patch)
22

3-
Changes since v1.3.4:
3+
Changes since v1.4.0:
4+
5+
- Fix analyzer errors in collection test data classes ([@Claude](https://github.com/Claude))
6+
- Add TAGS.md with NuGet package tags ([@matt-edmondson](https://github.com/matt-edmondson))
7+
- Fold owner decisions into roadmap ([@Claude](https://github.com/Claude))
8+
- Refresh documentation to match the current v1.4 API ([@Claude](https://github.com/Claude))
9+
- Add project roadmap based on codebase analysis ([@Claude](https://github.com/Claude))
10+
- Add schema validation API and fix lossy reflection type mappings ([@Claude](https://github.com/Claude))

Schema.Test/AddClassFromTypeTests.cs

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace ktsu.Schema.Tests;
66

7+
using System.Collections.ObjectModel;
78
using ktsu.Schema.Models;
89
using ktsu.Schema.Models.Names;
910
using ktsu.Semantics.Strings;
@@ -105,6 +106,136 @@ public void TestAddDuplicateClassFromType()
105106
SchemaClass? duplicate = schema.AddClass(typeof(SimpleClass));
106107
Assert.IsNull(duplicate);
107108
}
109+
110+
[TestMethod]
111+
public void TestAddClassFromTypeCreatesLongMember()
112+
{
113+
Schema schema = new();
114+
SchemaClass? schemaClass = schema.AddClass(typeof(TypeWithWideNumerics));
115+
Assert.IsNotNull(schemaClass);
116+
117+
Assert.IsTrue(schemaClass.TryGetMember("BigCount".As<MemberName>(), out SchemaMember? member));
118+
Assert.IsNotNull(member);
119+
Assert.IsInstanceOfType<SchemaTypes.Long>(member.Type);
120+
}
121+
122+
[TestMethod]
123+
public void TestAddClassFromTypeCreatesDoubleMember()
124+
{
125+
Schema schema = new();
126+
SchemaClass? schemaClass = schema.AddClass(typeof(TypeWithWideNumerics));
127+
Assert.IsNotNull(schemaClass);
128+
129+
Assert.IsTrue(schemaClass.TryGetMember("Precise".As<MemberName>(), out SchemaMember? member));
130+
Assert.IsNotNull(member);
131+
Assert.IsInstanceOfType<SchemaTypes.Double>(member.Type);
132+
133+
Assert.IsTrue(schemaClass.TryGetMember("Money".As<MemberName>(), out SchemaMember? decimalMember));
134+
Assert.IsNotNull(decimalMember);
135+
Assert.IsInstanceOfType<SchemaTypes.Double>(decimalMember.Type);
136+
}
137+
138+
[TestMethod]
139+
public void TestAddClassFromTypeCreatesTemporalMembers()
140+
{
141+
Schema schema = new();
142+
SchemaClass? schemaClass = schema.AddClass(typeof(TypeWithTemporals));
143+
Assert.IsNotNull(schemaClass);
144+
145+
Assert.IsTrue(schemaClass.TryGetMember("CreatedAt".As<MemberName>(), out SchemaMember? dateTimeMember));
146+
Assert.IsNotNull(dateTimeMember);
147+
Assert.IsInstanceOfType<SchemaTypes.DateTime>(dateTimeMember.Type);
148+
149+
Assert.IsTrue(schemaClass.TryGetMember("Duration".As<MemberName>(), out SchemaMember? timeSpanMember));
150+
Assert.IsNotNull(timeSpanMember);
151+
Assert.IsInstanceOfType<SchemaTypes.TimeSpan>(timeSpanMember.Type);
152+
}
153+
154+
[TestMethod]
155+
public void TestAddClassFromTypeUnwrapsNullable()
156+
{
157+
Schema schema = new();
158+
SchemaClass? schemaClass = schema.AddClass(typeof(TypeWithNullable));
159+
Assert.IsNotNull(schemaClass);
160+
161+
Assert.IsTrue(schemaClass.TryGetMember("MaybeValue".As<MemberName>(), out SchemaMember? member));
162+
Assert.IsNotNull(member);
163+
Assert.IsInstanceOfType<SchemaTypes.Int>(member.Type);
164+
}
165+
166+
[TestMethod]
167+
public void TestAddClassFromTypeCreatesArrayFromArray()
168+
{
169+
Schema schema = new();
170+
SchemaClass? schemaClass = schema.AddClass(typeof(TypeWithCollections));
171+
Assert.IsNotNull(schemaClass);
172+
173+
Assert.IsTrue(schemaClass.TryGetMember("Scores".As<MemberName>(), out SchemaMember? member));
174+
Assert.IsNotNull(member);
175+
SchemaTypes.Array? arrayType = member.Type as SchemaTypes.Array;
176+
Assert.IsNotNull(arrayType);
177+
Assert.IsInstanceOfType<SchemaTypes.Int>(arrayType.ElementType);
178+
Assert.AreEqual("vector".As<ContainerName>(), arrayType.Container);
179+
}
180+
181+
[TestMethod]
182+
public void TestAddClassFromTypeCreatesArrayFromList()
183+
{
184+
Schema schema = new();
185+
SchemaClass? schemaClass = schema.AddClass(typeof(TypeWithCollections));
186+
Assert.IsNotNull(schemaClass);
187+
188+
Assert.IsTrue(schemaClass.TryGetMember("Tags".As<MemberName>(), out SchemaMember? member));
189+
Assert.IsNotNull(member);
190+
SchemaTypes.Array? arrayType = member.Type as SchemaTypes.Array;
191+
Assert.IsNotNull(arrayType);
192+
Assert.IsInstanceOfType<SchemaTypes.String>(arrayType.ElementType);
193+
Assert.AreEqual("vector".As<ContainerName>(), arrayType.Container);
194+
}
195+
196+
[TestMethod]
197+
public void TestAddClassFromTypeCreatesObjectArrayAndAddsElementClass()
198+
{
199+
Schema schema = new();
200+
SchemaClass? schemaClass = schema.AddClass(typeof(TypeWithCollections));
201+
Assert.IsNotNull(schemaClass);
202+
203+
Assert.IsTrue(schemaClass.TryGetMember("Items".As<MemberName>(), out SchemaMember? member));
204+
Assert.IsNotNull(member);
205+
SchemaTypes.Array? arrayType = member.Type as SchemaTypes.Array;
206+
Assert.IsNotNull(arrayType);
207+
SchemaTypes.Object? elementType = arrayType.ElementType as SchemaTypes.Object;
208+
Assert.IsNotNull(elementType);
209+
Assert.AreEqual("SimpleClass".As<ClassName>(), elementType.ClassName);
210+
Assert.IsTrue(schema.TryGetClass("SimpleClass".As<ClassName>(), out _));
211+
}
212+
213+
[TestMethod]
214+
public void TestAddClassFromTypeCreatesMapFromDictionary()
215+
{
216+
Schema schema = new();
217+
SchemaClass? schemaClass = schema.AddClass(typeof(TypeWithCollections));
218+
Assert.IsNotNull(schemaClass);
219+
220+
Assert.IsTrue(schemaClass.TryGetMember("ItemsById".As<MemberName>(), out SchemaMember? member));
221+
Assert.IsNotNull(member);
222+
SchemaTypes.Array? arrayType = member.Type as SchemaTypes.Array;
223+
Assert.IsNotNull(arrayType);
224+
Assert.IsInstanceOfType<SchemaTypes.Object>(arrayType.ElementType);
225+
Assert.AreEqual("map".As<ContainerName>(), arrayType.Container);
226+
}
227+
228+
[TestMethod]
229+
public void TestAddClassFromTypeDoesNotTreatStringAsCollection()
230+
{
231+
Schema schema = new();
232+
SchemaClass? schemaClass = schema.AddClass(typeof(SimpleClass));
233+
Assert.IsNotNull(schemaClass);
234+
235+
Assert.IsTrue(schemaClass.TryGetMember("Name".As<MemberName>(), out SchemaMember? member));
236+
Assert.IsNotNull(member);
237+
Assert.IsInstanceOfType<SchemaTypes.String>(member.Type);
238+
}
108239
}
109240

110241
// Test data classes
@@ -135,3 +266,30 @@ public class TypeWithEnumProperty
135266
{
136267
public TestStatus Status { get; set; }
137268
}
269+
270+
public class TypeWithWideNumerics
271+
{
272+
public long BigCount { get; set; }
273+
public double Precise { get; set; }
274+
public decimal Money { get; set; }
275+
}
276+
277+
public class TypeWithTemporals
278+
{
279+
public DateTime CreatedAt { get; set; }
280+
public TimeSpan Duration { get; set; }
281+
}
282+
283+
public class TypeWithNullable
284+
{
285+
public int? MaybeValue { get; set; }
286+
}
287+
288+
public class TypeWithCollections
289+
{
290+
[System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1819:Properties should not return arrays", Justification = "Exercises array import via reflection")]
291+
public int[] Scores { get; } = [];
292+
public Collection<string> Tags { get; } = [];
293+
public Collection<SimpleClass> Items { get; } = [];
294+
public Dictionary<string, SimpleClass> ItemsById { get; } = [];
295+
}

0 commit comments

Comments
 (0)