diff --git a/.ci/generation/PythonSchemaGeneration.Core/Emission/OutputWriter.cs b/.ci/generation/PythonSchemaGeneration.Core/Emission/OutputWriter.cs index ec3e423..21e13bc 100644 --- a/.ci/generation/PythonSchemaGeneration.Core/Emission/OutputWriter.cs +++ b/.ci/generation/PythonSchemaGeneration.Core/Emission/OutputWriter.cs @@ -18,16 +18,19 @@ public static class OutputWriter public static int Write(string packageRoot, IEnumerable rendered, bool cleanRedundant, Reporter reporter, ISet cleanAssemblies = null) { Dictionary fileTextByPath = new Dictionary(StringComparer.OrdinalIgnoreCase); + Dictionary typeByPath = new Dictionary(StringComparer.OrdinalIgnoreCase); + List clashes = new List(); foreach (RenderedType type in rendered) { string relativePath = type.Ref.RelativePath + ".py"; if (fileTextByPath.ContainsKey(relativePath)) { - reporter.Warn(type.Model.ClrName, $"output path {relativePath} is already used by another type, skipped"); + clashes.Add($"{typeByPath[relativePath]} and {type.Model.ClrName} would both be written to {relativePath}"); continue; } fileTextByPath[relativePath] = type.Text; + typeByPath[relativePath] = type.Model.ClrName; string[] segments = relativePath.Split('/'); for (int i = 1; i < segments.Length; i++) @@ -38,6 +41,10 @@ public static int Write(string packageRoot, IEnumerable rendered, } } + //File names ignore upper and lower case on Windows, so one of the two classes would silently be lost + if (clashes.Count > 0) + throw new InvalidOperationException("Two classes would be written to the same file:" + Environment.NewLine + string.Join(Environment.NewLine, clashes)); + if (cleanRedundant) CleanRedundantExistingFiles(packageRoot, fileTextByPath, cleanAssemblies); @@ -60,6 +67,56 @@ public static int Write(string packageRoot, IEnumerable rendered, /***************************************************/ + [Description("Lists the assembly folders of the package that this run did not generate: folders of the package root, other than the support and hidden ones, that " + + "no rendered type belongs to. With repos (a run for some repositories) only the folders whose Python files name one of those repositories count, so the " + + "folders of other repositories are left alone. Generator calls it after a full run, so a failed build of an assembly is noticed instead of leaving its old files behind.")] + public static List MissingAssemblyFolders(string packageRoot, IEnumerable rendered, IEnumerable repos) + { + HashSet generated = new HashSet(rendered.Select(r => r.Ref.RelativePath.Split('/')[0]), StringComparer.OrdinalIgnoreCase); + List missing = new List(); + if (!Directory.Exists(packageRoot)) + return missing; + + foreach (string folder in Directory.GetDirectories(packageRoot).Select(Path.GetFileName).OrderBy(name => name, StringComparer.Ordinal)) + { + if (folder.StartsWith("_") || folder.StartsWith(".") || generated.Contains(folder)) + continue; + + if (repos != null && !repos.Contains(RepoOfFolder(Path.Combine(packageRoot, folder)), StringComparer.OrdinalIgnoreCase)) + continue; + + missing.Add(folder); + } + + return missing; + } + + /***************************************************/ + + [Description("Reads the repository that the generated Python files of a folder name in their marker, or null when no file has one. MissingAssemblyFolders uses it to " + + "tell which repository a folder that was not generated belongs to.")] + private static string RepoOfFolder(string folder) + { + const string key = "'repo': '"; + foreach (string file in Directory.EnumerateFiles(folder, "*.py", SearchOption.AllDirectories)) + { + foreach (string line in File.ReadLines(file, m_Utf8)) + { + int start = line.IndexOf(key, StringComparison.Ordinal); + if (start < 0) + continue; + + start += key.Length; + int end = line.IndexOf('\'', start); + return end < 0 ? null : line.Substring(start, end - start); + } + } + + return null; + } + + /***************************************************/ + [Description("Deletes .py files in the folders of the written assemblies that are no longer generated, then removes the empty folders. Write calls it when " + "stale output must be cleaned; cleanAssemblies limits it to the assemblies of the requested repositories.")] private static void CleanRedundantExistingFiles(string packageRoot, Dictionary fileTextByPath, ISet cleanAssemblies) diff --git a/.ci/generation/PythonSchemaGeneration.Core/Emission/PythonEmitter.cs b/.ci/generation/PythonSchemaGeneration.Core/Emission/PythonEmitter.cs index 74b8cf6..684b101 100644 --- a/.ci/generation/PythonSchemaGeneration.Core/Emission/PythonEmitter.cs +++ b/.ci/generation/PythonSchemaGeneration.Core/Emission/PythonEmitter.cs @@ -398,7 +398,7 @@ private string Assemble(TypeModel model, string classLine, string body, NameTrac { StringBuilder sb = new StringBuilder(); sb.Append($"# Generated by BHoM_PythonSchema from the C# oM type {model.ClrName}. Do not edit by hand.\n"); - sb.Append("# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved.\n"); + sb.Append("# Copyright (c) the respective contributors. All rights reserved.\n"); sb.Append("# Licensed under the GNU Lesser General Public License, version 3.0 or later.\n"); bool isModel = model.Kind != TypeKind.Enum && model.Kind != TypeKind.Interface; diff --git a/.ci/generation/PythonSchemaGeneration.Core/Generation/GenerationOptions.cs b/.ci/generation/PythonSchemaGeneration.Core/Generation/GenerationOptions.cs index 47c174d..3d919c1 100644 --- a/.ci/generation/PythonSchemaGeneration.Core/Generation/GenerationOptions.cs +++ b/.ci/generation/PythonSchemaGeneration.Core/Generation/GenerationOptions.cs @@ -18,6 +18,8 @@ public class GenerationOptions public string ReleaseVersion; //Major.Minor of a release (for example 10.0): _version.py then holds the release version, and the run fails when it is not the version read + public bool CleanMissingAssemblies; //delete the assembly folders of the package that a full run did not generate, instead of only listing them + public string ManifestPath; public string ReportPath; diff --git a/.ci/generation/PythonSchemaGeneration.Core/Generator.cs b/.ci/generation/PythonSchemaGeneration.Core/Generator.cs index 31657bc..5f09b15 100644 --- a/.ci/generation/PythonSchemaGeneration.Core/Generator.cs +++ b/.ci/generation/PythonSchemaGeneration.Core/Generator.cs @@ -106,9 +106,12 @@ public static GenerationResult Run(GenerationOptions options) { result.FilesWritten = OutputWriter.Write(options.OutputFolder, result.Types, options.TypeFilter == null, reporter, repoAssemblies); - //A partial run (--types) does not say what the package is, so it leaves the version file alone + //A partial run (--types) does not say what the package is, so it leaves the version file and the other folders alone if (options.TypeFilter == null) + { result.FilesWritten += WriteVersionFile(options.OutputFolder, result.BHoMVersion, options.ReleaseVersion != null, reporter); + HandleMissingAssemblyFolders(options, result, reporter); + } } if (options.ManifestPath != null) @@ -122,6 +125,25 @@ public static GenerationResult Run(GenerationOptions options) /***************************************************/ + [Description("Warns about every assembly folder of the package that this full run did not generate (for example because its build failed), or deletes it with " + + "--clean-missing-assemblies. Run calls it after the classes are written; the warning is a new kind for the baseline, so the weekly run fails loudly.")] + private static void HandleMissingAssemblyFolders(GenerationOptions options, GenerationResult result, Reporter reporter) + { + foreach (string folder in OutputWriter.MissingAssemblyFolders(options.OutputFolder, result.Types, options.Repos)) + { + if (options.CleanMissingAssemblies) + { + Directory.Delete(Path.Combine(options.OutputFolder, folder), true); + reporter.Info($"Deleted the assembly folder {folder}, which this run did not generate"); + result.FilesWritten++; + } + else + reporter.Warn($"assembly folder {folder} was not generated in this run, its old Python files are kept (use --clean-missing-assemblies to delete them)"); + } + } + + /***************************************************/ + [Description("Writes bhom_schema/_version.py with the BHoM version the classes come from and the package version: that plus .0 for a release, and that plus .0.dev0 " + "for develop, so the weekly run changes the file only when the BHoM version changes. Returns the number of files written (0 when it is unchanged). Run calls it " + "after the classes are written; setuptools reads the package version from this file.")] diff --git a/.ci/generation/PythonSchemaGeneration/CommandLine.cs b/.ci/generation/PythonSchemaGeneration/CommandLine.cs index 0f73b9e..b5bb9bf 100644 --- a/.ci/generation/PythonSchemaGeneration/CommandLine.cs +++ b/.ci/generation/PythonSchemaGeneration/CommandLine.cs @@ -7,10 +7,13 @@ public class CommandLine { /***************************************************/ - private static readonly string[] m_Known = { "output", "assemblies", "org", "repos", "types", "manifest", "report", "baseline-warnings", "write-baseline", "release" }; + private static readonly string[] m_Known = { "output", "assemblies", "org", "repos", "types", "manifest", "report", "baseline-warnings", "write-baseline", "release", "clean-missing-assemblies" }; + + //Options that stand alone, without a value + private static readonly string[] m_Flags = { "clean-missing-assemblies" }; public const string Usage = "Usage: PythonSchemaGeneration --output [--assemblies ] [--org BHoM,Other] [--repos BHoM/BHoM,BHoM/Other_Toolkit] " - + "[--types A,B] [--manifest ] [--report ] [--baseline-warnings ] [--write-baseline ] [--release ]"; + + "[--types A,B] [--manifest ] [--report ] [--baseline-warnings ] [--write-baseline ] [--release ] [--clean-missing-assemblies]"; public GenerationOptions Options { get; private set; } @@ -39,6 +42,12 @@ public static CommandLine Parse(string[] args) if (!m_Known.Contains(name)) return result.Fail($"Unknown option --{name}."); + if (m_Flags.Contains(name)) + { + arguments[name] = "true"; + continue; + } + if (i + 1 >= args.Length || args[i + 1].StartsWith("--")) return result.Fail($"Option --{name} needs a value."); @@ -66,6 +75,7 @@ public static CommandLine Parse(string[] args) result.Options.TypeFilter = Split(types); result.Options.ReleaseVersion = arguments.GetValueOrDefault("release"); + result.Options.CleanMissingAssemblies = arguments.ContainsKey("clean-missing-assemblies"); result.BaselinePath = arguments.GetValueOrDefault("baseline-warnings"); result.WriteBaselinePath = arguments.GetValueOrDefault("write-baseline"); return result; diff --git a/.ci/unit-tests/csharp/Fixtures/FixtureAlpha_oM/Objects.cs b/.ci/unit-tests/csharp/Fixtures/FixtureAlpha_oM/Objects.cs index 6002253..cb4152d 100644 --- a/.ci/unit-tests/csharp/Fixtures/FixtureAlpha_oM/Objects.cs +++ b/.ci/unit-tests/csharp/Fixtures/FixtureAlpha_oM/Objects.cs @@ -80,6 +80,7 @@ public class Scalars : BHoMObject { public virtual DateTime Created { get; set; } = DateTime.Now; public virtual DateTime Fixed { get; set; } = new DateTime(2020, 1, 2, 3, 4, 5); + public virtual DateTimeOffset Stamp { get; set; } = new DateTimeOffset(2020, 1, 2, 3, 4, 5, TimeSpan.Zero); public virtual Guid Key { get; set; } = Guid.Empty; public virtual decimal Cost { get; set; } = 1.5m; public virtual Color Colour { get; set; } = Color.Empty; diff --git a/.ci/unit-tests/csharp/PythonSchemaGeneration.Tests/CommandLineAndBaselineTests.cs b/.ci/unit-tests/csharp/PythonSchemaGeneration.Tests/CommandLineAndBaselineTests.cs index 928c879..dea6782 100644 --- a/.ci/unit-tests/csharp/PythonSchemaGeneration.Tests/CommandLineAndBaselineTests.cs +++ b/.ci/unit-tests/csharp/PythonSchemaGeneration.Tests/CommandLineAndBaselineTests.cs @@ -34,6 +34,18 @@ public void KnownOptionsAreRead() /***************************************************/ + [Test] + [Description("Checks that --clean-missing-assemblies is a flag that needs no value, may stand anywhere, and is off when it is not given. Protects the option that " + + "deletes the assembly folders a full run did not generate.")] + public void CleanMissingAssembliesIsAFlag() + { + Assert.That(CommandLine.Parse(new[] { "--output", "out" }).Options.CleanMissingAssemblies, Is.False); + Assert.That(CommandLine.Parse(new[] { "--output", "out", "--clean-missing-assemblies" }).Options.CleanMissingAssemblies, Is.True); + Assert.That(CommandLine.Parse(new[] { "--clean-missing-assemblies", "--output", "out", "--repos", "BHoM/A" }).Options.Repos, Is.EqualTo(new[] { "BHoM/A" })); + } + + /***************************************************/ + [TestCase(new[] { "--output", "o", "--repo", "BHoM/A" }, "Unknown option --repo")] [TestCase(new[] { "--output", "o", "--types" }, "--types needs a value")] [TestCase(new[] { "--output", "--types", "A" }, "--output needs a value")] diff --git a/.ci/unit-tests/csharp/PythonSchemaGeneration.Tests/FixtureExtractionTests.cs b/.ci/unit-tests/csharp/PythonSchemaGeneration.Tests/FixtureExtractionTests.cs index d73a283..1b41e5b 100644 --- a/.ci/unit-tests/csharp/PythonSchemaGeneration.Tests/FixtureExtractionTests.cs +++ b/.ci/unit-tests/csharp/PythonSchemaGeneration.Tests/FixtureExtractionTests.cs @@ -138,6 +138,7 @@ public void VolatileAndScalarDefaults() string text = R(typeof(Scalars)).Text; Assert.That(text, Does.Contain("Created: datetime = Field(default_factory=datetime.now)")); Assert.That(text, Does.Contain("Fixed: datetime = datetime(2020, 1, 2, 3, 4, 5, 0)")); + Assert.That(text, Does.Contain("Stamp: Annotated[datetime, ClrType('System.DateTimeOffset')]"), "a DateTimeOffset keeps its C# type in the ClrType marker"); Assert.That(text, Does.Contain("Key: UUID = UUID(int=0)")); Assert.That(text, Does.Contain("Cost: Decimal = Decimal('1.5')")); Assert.That(text, Does.Contain("Colour: Color = Field(default_factory=Color)")); @@ -382,5 +383,17 @@ public void CyclicReferencesUseBottomImports() Assert.That(R(typeof(PointLike)).Text, Does.Not.Contain("model_rebuild"), "types outside a cycle do not need a rebuild"); Assert.That(FixtureOutput.Result.CyclicTypes, Is.EqualTo(2)); } + + [Test] + [Description("Checks that the header of every generated file names the copyright holder without a year range. Protects the weekly generation from rewriting " + + "every file when the year changes.")] + public void GeneratedHeadersHaveNoYear() + { + foreach (RenderedType type in FixtureOutput.Result.Types) + { + string copyright = type.Text.Split('\n')[1]; + Assert.That(copyright, Is.EqualTo("# Copyright (c) the respective contributors. All rights reserved."), type.Ref.RelativePath); + } + } } } diff --git a/.ci/unit-tests/csharp/PythonSchemaGeneration.Tests/OutputFolderTests.cs b/.ci/unit-tests/csharp/PythonSchemaGeneration.Tests/OutputFolderTests.cs new file mode 100644 index 0000000..22e70cb --- /dev/null +++ b/.ci/unit-tests/csharp/PythonSchemaGeneration.Tests/OutputFolderTests.cs @@ -0,0 +1,151 @@ +using PythonSchemaGeneration.Emission; +using PythonSchemaGeneration.Mapping; +using PythonSchemaGeneration.Model; + +namespace PythonSchemaGeneration.Tests +{ + //What the generator does about files and folders it cannot place, or no longer generates + public class OutputFolderTests + { + private const string FixtureRepo = "BHoM/CSharpSchema_Test"; + + /***************************************************/ + + [Description("Builds a generated type with only the C# name and the output path, which is all the output writer reads. Used by the file name tests.")] + private static RenderedType Rendered(string clrName, string relativePath) + { + return new RenderedType { Model = new TypeModel { ClrName = clrName }, Ref = new PyRef { RelativePath = relativePath }, Text = "x = 1\n" }; + } + + /***************************************************/ + + [Description("Writes a Python file that carries a repository marker into a package folder, as a generated class does. The missing folder tests use it to make an " + + "assembly folder that the run will not generate.")] + private static void WriteOldAssembly(string package, string assembly, string repo) + { + Directory.CreateDirectory(Path.Combine(package, assembly)); + File.WriteAllText(Path.Combine(package, assembly, "Thing.py"), $"class Thing:\n __bhom__ = {{\n 'repo': '{repo}',\n }}\n"); + } + + /***************************************************/ + + [Description("Runs the generator over the fixtures and BHoM for the fixture repository into a package folder, with the clean-up option as asked. The missing " + + "folder tests use it.")] + private static GenerationResult Run(string package, bool clean) + { + return Generator.Run(new GenerationOptions + { + Assemblies = new List { FixtureOutput.Alpha, FixtureOutput.Beta, typeof(BH.oM.Base.BHoMObject).Assembly }, + Repos = new List { FixtureRepo }, + OutputFolder = package, + CleanMissingAssemblies = clean, + }); + } + + /***************************************************/ + + [Test] + [Description("Checks that two classes whose file names differ only in upper and lower case stop the run with an error that names both, and write nothing. " + + "Protects the package from silently losing one of two classes on Windows.")] + public void ClassesWithTheSameFileNameStopTheRun() + { + string folder = Path.Combine(Path.GetTempPath(), "pysg-clash-" + Guid.NewGuid().ToString("N")); + try + { + RenderedType[] clashing = { Rendered("BH.oM.Demo.Panel", "Demo_oM/Panel"), Rendered("BH.oM.Demo.PANEL", "Demo_oM/PANEL") }; + InvalidOperationException error = Assert.Throws(() => OutputWriter.Write(folder, clashing, true, new PythonSchemaGeneration.Reporting.Reporter())); + + Assert.That(error.Message, Does.Contain("BH.oM.Demo.Panel").And.Contain("BH.oM.Demo.PANEL")); + Assert.That(Directory.Exists(folder), Is.False); + } + finally + { + if (Directory.Exists(folder)) Directory.Delete(folder, true); + } + } + + /***************************************************/ + + [Test] + [Description("Checks that a full run for a repository warns about an old assembly folder of that repository that it did not generate and keeps its files, while a " + + "folder of another repository is neither listed nor touched. Protects the weekly run from hiding an assembly whose build failed.")] + public void AnAssemblyFolderThatWasNotGeneratedIsListed() + { + string folder = Path.Combine(Path.GetTempPath(), "pysg-missing-" + Guid.NewGuid().ToString("N")); + try + { + string package = Path.Combine(folder, "bhom_schema"); + WriteOldAssembly(package, "Old_oM", FixtureRepo); + WriteOldAssembly(package, "Other_oM", "BHoM/Other"); + + GenerationResult result = Run(package, false); + + Assert.That(result.Reporter.Warnings, Has.Some.Contain("Old_oM").And.Some.Contain("--clean-missing-assemblies")); + Assert.That(result.Reporter.Warnings, Has.None.Contain("Other_oM")); + Assert.That(File.Exists(Path.Combine(package, "Old_oM", "Thing.py")), Is.True); + Assert.That(File.Exists(Path.Combine(package, "Other_oM", "Thing.py")), Is.True); + } + finally + { + if (Directory.Exists(folder)) Directory.Delete(folder, true); + } + } + + /***************************************************/ + + [Test] + [Description("Checks that --clean-missing-assemblies deletes the old assembly folder of the requested repository and nothing else. Protects the option from " + + "removing the folders of other repositories or the support package.")] + public void TheCleanOptionDeletesOnlyTheMissingFoldersOfTheRepository() + { + string folder = Path.Combine(Path.GetTempPath(), "pysg-clean-missing-" + Guid.NewGuid().ToString("N")); + try + { + string package = Path.Combine(folder, "bhom_schema"); + WriteOldAssembly(package, "Old_oM", FixtureRepo); + WriteOldAssembly(package, "Other_oM", "BHoM/Other"); + Directory.CreateDirectory(Path.Combine(package, "_support")); + + GenerationResult result = Run(package, true); + + Assert.That(Directory.Exists(Path.Combine(package, "Old_oM")), Is.False); + Assert.That(Directory.Exists(Path.Combine(package, "Other_oM")), Is.True); + Assert.That(Directory.Exists(Path.Combine(package, "_support")), Is.True); + Assert.That(result.Reporter.Warnings, Has.None.Contain("Old_oM")); + } + finally + { + if (Directory.Exists(folder)) Directory.Delete(folder, true); + } + } + + /***************************************************/ + + [Test] + [Description("Checks that a run for some types only does not list or delete assembly folders. Protects partial runs, which never say what the whole package is.")] + public void APartialRunNeverListsMissingFolders() + { + string folder = Path.Combine(Path.GetTempPath(), "pysg-partial-missing-" + Guid.NewGuid().ToString("N")); + try + { + string package = Path.Combine(folder, "bhom_schema"); + WriteOldAssembly(package, "Old_oM", FixtureRepo); + + GenerationResult result = Generator.Run(new GenerationOptions + { + Assemblies = new List { FixtureOutput.Alpha, FixtureOutput.Beta, typeof(BH.oM.Base.BHoMObject).Assembly }, + TypeFilter = new List { "BH.oM.FixtureAlpha.Beam" }, + OutputFolder = package, + CleanMissingAssemblies = true, + }); + + Assert.That(Directory.Exists(Path.Combine(package, "Old_oM")), Is.True); + Assert.That(result.Reporter.Warnings, Has.None.Contain("Old_oM")); + } + finally + { + if (Directory.Exists(folder)) Directory.Delete(folder, true); + } + } + } +} diff --git a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Beam.py b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Beam.py index a3e5ded..68f863f 100644 --- a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Beam.py +++ b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Beam.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Beam. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/CycleA.py b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/CycleA.py index 1bea8d6..acc9ac3 100644 --- a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/CycleA.py +++ b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/CycleA.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.CycleA. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/ICurveLike.py b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/ICurveLike.py index 08004ac..7f03a2e 100644 --- a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/ICurveLike.py +++ b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/ICurveLike.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.ICurveLike. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/ImmutableThing.py b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/ImmutableThing.py index 61b2167..0ae9141 100644 --- a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/ImmutableThing.py +++ b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/ImmutableThing.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.ImmutableThing. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Options.py b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Options.py index 35f3851..00cc23b 100644 --- a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Options.py +++ b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Options.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Options. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/SupportKind.py b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/SupportKind.py index 46408db..4d1072c 100644 --- a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/SupportKind.py +++ b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/SupportKind.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.SupportKind. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Wrapper_1.py b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Wrapper_1.py index 4e06c66..554cd7c 100644 --- a/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Wrapper_1.py +++ b/.ci/unit-tests/golden/fixtures/FixtureAlpha_oM/Wrapper_1.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Wrapper`1. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/.ci/unit-tests/golden/fixtures/FixtureBeta_oM/PointLike.py b/.ci/unit-tests/golden/fixtures/FixtureBeta_oM/PointLike.py index 533ebe5..a73294f 100644 --- a/.ci/unit-tests/golden/fixtures/FixtureBeta_oM/PointLike.py +++ b/.ci/unit-tests/golden/fixtures/FixtureBeta_oM/PointLike.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureBeta.PointLike. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/.ci/unit-tests/golden/spike/Graphics_oM/Enums/GradientCenteringOptions.py b/.ci/unit-tests/golden/spike/Graphics_oM/Enums/GradientCenteringOptions.py index 314437a..ce1c373 100644 --- a/.ci/unit-tests/golden/spike/Graphics_oM/Enums/GradientCenteringOptions.py +++ b/.ci/unit-tests/golden/spike/Graphics_oM/Enums/GradientCenteringOptions.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.Graphics.Enums.GradientCenteringOptions. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/.ci/unit-tests/python/test_py2cs/test_workflows.py b/.ci/unit-tests/python/test_py2cs/test_workflows.py index 205e6e2..c1ee923 100644 --- a/.ci/unit-tests/python/test_py2cs/test_workflows.py +++ b/.ci/unit-tests/python/test_py2cs/test_workflows.py @@ -217,3 +217,14 @@ def test_the_alignment_check_is_its_own_job_with_a_name_that_says_what_is_pendin assert any(s.get("name") == "Explain the failure" and "GITHUB_STEP_SUMMARY" in s["run"] for s in jobs["alignment"]["steps"]) assert not any("align" in s.get("run", "") for s in jobs["checks"]["steps"]) assert any("py2cs check" in s.get("run", "") for s in jobs["checks"]["steps"]) + + +def test_the_included_repositories_file_is_tidy(): + """Checks that Included-repositories.txt does not misspell dKoP_Toolkit as dKop_Toolkit and ends with a newline, so that no tool skips its last line. + + Protects the list that the generation and the PR checks clone and build from. + """ + text = (REPO / "Included-repositories.txt").read_bytes().decode("utf-8") + assert text.endswith("\n") + assert "dKop" not in text, "the repository is spelt dKoP_Toolkit" + assert all(name == name.strip() for name in text.splitlines()) diff --git a/docs/CODING-PLAN.md b/docs/CODING-PLAN.md index 579d6bb..9190901 100644 --- a/docs/CODING-PLAN.md +++ b/docs/CODING-PLAN.md @@ -9,7 +9,7 @@ taken so far (section 9). ## Implementation status (phases 0 to 6 done, 7 and 8 not started) -Run `.ci/unit-tests/run-all.ps1`; it builds, generates, drafts, round-trips, runs NUnit (92 tests), pytest (183 tests) and Pyright. +Run `.ci/unit-tests/run-all.ps1`; it builds, generates, drafts, round-trips, runs NUnit (98 tests), pytest (184 tests) and Pyright. Where the implementation differs from the plan above: diff --git a/docs/audit-1/Fix-Plan.md b/docs/audit-1/Fix-Plan.md index 66f8b6b..197c368 100644 --- a/docs/audit-1/Fix-Plan.md +++ b/docs/audit-1/Fix-Plan.md @@ -603,19 +603,38 @@ someone changes it to 2027, and **every** generated file changes at once, which year range out of generated Python files, or read it from one setting that is changed on purpose in its own PR. C# files must still follow the BHoM copyright rule. +**Done.** The header of a generated Python file is now `# Copyright (c) the respective contributors. All rights reserved.`, with no year, so +a new year changes nothing. The files already in `src/bhom_schema` and the golden files were changed once to match (a one-line change in +each). The C# files that `py2cs` drafts keep their year range, as the BHoM copyright rule asks. A test checks that no generated header has a year. + 7.2 **Old folders left behind.** When a run doesn't include an assembly at all (for example because its build failed), its old Python files stay, and nobody is told. Fix: a full run lists every assembly folder it didn't generate; the weekly job can also delete them with a new option, `--clean-missing-assemblies`. +**Done.** After a full run (not `--types`) the generator warns `assembly folder X was not generated in this run, its old Python files are kept` +for every assembly folder of the package that it did not write. With `--repos`, only the folders whose files name one of those repositories count +(read from the `repo` marker), so the folders of other repositories are never listed or touched. `_support` and other folders starting with `_` or `.` are +ignored. The warning is a new kind for the baseline, so the weekly run fails loudly. `--clean-missing-assemblies` deletes the folders instead. It is not turned on in +the weekly workflow, because a failed build would then delete a whole assembly's Python. + 7.3 **Two classes with the same file name.** On Windows, file names ignore upper and lower case, so `Panel` and `PANEL` would land in the same file. Today one class is dropped with only a warning. Fix: make it an error that stops the run. +**Done.** `OutputWriter` collects every clash and stops the run with `InvalidOperationException` naming both classes and the file (exit code 1), +before anything is written. If the real BHoM has such a pair, the weekly run now fails until one class is renamed. + 7.4 **`DateTimeOffset` turns into `DateTime`.** C# has two date types; both become Python `datetime`, and on the way back the difference is lost. Fix: remember the original C# type in the field's `ClrType` marker. +**Done (it already worked).** The emitter already wrote `ClrType('System.DateTimeOffset')` because the property's C# type differs from the default for +`datetime`. I added a `DateTimeOffset` field to the test classes and a test that the marker is there. The alignment and round trip tests pass with it (the drafted C# +is `DateTimeOffset`, with the default converted from `DateTime`). + 7.5 **`Included-repositories.txt`**: it spells the dKoP repository `dKop_Toolkit` and the file doesn't end with a newline, which makes some tools skip the last line. Fix both. (This file is copied from the JSON repository; keep it in line with theirs.) +**Done (already the case).** The file lists no dKoP repository any more and ends with a newline. A test now keeps it that way. + ### How we'll know it works One test per fix, then the build and test gate passes. diff --git a/src/bhom_schema/BHoM/BHoMObject.py b/src/bhom_schema/BHoM/BHoMObject.py index abea399..862d3ac 100644 --- a/src/bhom_schema/BHoM/BHoMObject.py +++ b/src/bhom_schema/BHoM/BHoMObject.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.Base.BHoMObject. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/BHoM/IBHoMObject.py b/src/bhom_schema/BHoM/IBHoMObject.py index cd51f7f..d861d9e 100644 --- a/src/bhom_schema/BHoM/IBHoMObject.py +++ b/src/bhom_schema/BHoM/IBHoMObject.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.Base.IBHoMObject. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/BHoM/IFragment.py b/src/bhom_schema/BHoM/IFragment.py index 2f5051c..464c69f 100644 --- a/src/bhom_schema/BHoM/IFragment.py +++ b/src/bhom_schema/BHoM/IFragment.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.Base.IFragment. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/BHoM/IImmutable.py b/src/bhom_schema/BHoM/IImmutable.py index bfc611f..1ce9ea8 100644 --- a/src/bhom_schema/BHoM/IImmutable.py +++ b/src/bhom_schema/BHoM/IImmutable.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.Base.IImmutable. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/BHoM/IObject.py b/src/bhom_schema/BHoM/IObject.py index b0bb1fa..390957d 100644 --- a/src/bhom_schema/BHoM/IObject.py +++ b/src/bhom_schema/BHoM/IObject.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.Base.IObject. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/FixtureAlpha_oM/Beam.py b/src/bhom_schema/FixtureAlpha_oM/Beam.py index a3e5ded..68f863f 100644 --- a/src/bhom_schema/FixtureAlpha_oM/Beam.py +++ b/src/bhom_schema/FixtureAlpha_oM/Beam.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Beam. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/BeamPair.py b/src/bhom_schema/FixtureAlpha_oM/BeamPair.py index 6e726d3..6a261b6 100644 --- a/src/bhom_schema/FixtureAlpha_oM/BeamPair.py +++ b/src/bhom_schema/FixtureAlpha_oM/BeamPair.py @@ -1,5 +1,5 @@ -# Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.BeamPair. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Beam. Do not edit by hand. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/Collections.py b/src/bhom_schema/FixtureAlpha_oM/Collections.py index 7fd68fa..3803a01 100644 --- a/src/bhom_schema/FixtureAlpha_oM/Collections.py +++ b/src/bhom_schema/FixtureAlpha_oM/Collections.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Collections. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/Column.py b/src/bhom_schema/FixtureAlpha_oM/Column.py index 42152dd..2719969 100644 --- a/src/bhom_schema/FixtureAlpha_oM/Column.py +++ b/src/bhom_schema/FixtureAlpha_oM/Column.py @@ -1,5 +1,5 @@ -# Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Column. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Beam. Do not edit by hand. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/CycleA.py b/src/bhom_schema/FixtureAlpha_oM/CycleA.py index 1bea8d6..acc9ac3 100644 --- a/src/bhom_schema/FixtureAlpha_oM/CycleA.py +++ b/src/bhom_schema/FixtureAlpha_oM/CycleA.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.CycleA. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/CycleB.py b/src/bhom_schema/FixtureAlpha_oM/CycleB.py index e865cb2..0b03dbd 100644 --- a/src/bhom_schema/FixtureAlpha_oM/CycleB.py +++ b/src/bhom_schema/FixtureAlpha_oM/CycleB.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.CycleB. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/GeometryHolder.py b/src/bhom_schema/FixtureAlpha_oM/GeometryHolder.py index 9a82c51..e68cc03 100644 --- a/src/bhom_schema/FixtureAlpha_oM/GeometryHolder.py +++ b/src/bhom_schema/FixtureAlpha_oM/GeometryHolder.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.GeometryHolder. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/GridHolder.py b/src/bhom_schema/FixtureAlpha_oM/GridHolder.py index 1f17f28..7d0aa61 100644 --- a/src/bhom_schema/FixtureAlpha_oM/GridHolder.py +++ b/src/bhom_schema/FixtureAlpha_oM/GridHolder.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.GridHolder. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/ICurveLike.py b/src/bhom_schema/FixtureAlpha_oM/ICurveLike.py index 08004ac..7f03a2e 100644 --- a/src/bhom_schema/FixtureAlpha_oM/ICurveLike.py +++ b/src/bhom_schema/FixtureAlpha_oM/ICurveLike.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.ICurveLike. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/FixtureAlpha_oM/IElement1DLike.py b/src/bhom_schema/FixtureAlpha_oM/IElement1DLike.py index 548d77b..f09a08c 100644 --- a/src/bhom_schema/FixtureAlpha_oM/IElement1DLike.py +++ b/src/bhom_schema/FixtureAlpha_oM/IElement1DLike.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.IElement1DLike. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/FixtureAlpha_oM/IGeometryLike.py b/src/bhom_schema/FixtureAlpha_oM/IGeometryLike.py index e469e36..d919c81 100644 --- a/src/bhom_schema/FixtureAlpha_oM/IGeometryLike.py +++ b/src/bhom_schema/FixtureAlpha_oM/IGeometryLike.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.IGeometryLike. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/FixtureAlpha_oM/ILabelled.py b/src/bhom_schema/FixtureAlpha_oM/ILabelled.py index f2b664e..e3f95a7 100644 --- a/src/bhom_schema/FixtureAlpha_oM/ILabelled.py +++ b/src/bhom_schema/FixtureAlpha_oM/ILabelled.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.ILabelled. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/FixtureAlpha_oM/IOpeningLike_1.py b/src/bhom_schema/FixtureAlpha_oM/IOpeningLike_1.py index 7dcc986..571b26c 100644 --- a/src/bhom_schema/FixtureAlpha_oM/IOpeningLike_1.py +++ b/src/bhom_schema/FixtureAlpha_oM/IOpeningLike_1.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.IOpeningLike`1. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/FixtureAlpha_oM/IPanelLike_2.py b/src/bhom_schema/FixtureAlpha_oM/IPanelLike_2.py index 0d23c7d..2ed809d 100644 --- a/src/bhom_schema/FixtureAlpha_oM/IPanelLike_2.py +++ b/src/bhom_schema/FixtureAlpha_oM/IPanelLike_2.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.IPanelLike`2. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/FixtureAlpha_oM/ImmutableThing.py b/src/bhom_schema/FixtureAlpha_oM/ImmutableThing.py index 61b2167..0ae9141 100644 --- a/src/bhom_schema/FixtureAlpha_oM/ImmutableThing.py +++ b/src/bhom_schema/FixtureAlpha_oM/ImmutableThing.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.ImmutableThing. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/LineLike.py b/src/bhom_schema/FixtureAlpha_oM/LineLike.py index 4f419f7..548bc3a 100644 --- a/src/bhom_schema/FixtureAlpha_oM/LineLike.py +++ b/src/bhom_schema/FixtureAlpha_oM/LineLike.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.LineLike. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/Options.py b/src/bhom_schema/FixtureAlpha_oM/Options.py index 35f3851..00cc23b 100644 --- a/src/bhom_schema/FixtureAlpha_oM/Options.py +++ b/src/bhom_schema/FixtureAlpha_oM/Options.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Options. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/FixtureAlpha_oM/PointLike.py b/src/bhom_schema/FixtureAlpha_oM/PointLike.py index efd3266..c799f2c 100644 --- a/src/bhom_schema/FixtureAlpha_oM/PointLike.py +++ b/src/bhom_schema/FixtureAlpha_oM/PointLike.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.PointLike. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/ProjectLike.py b/src/bhom_schema/FixtureAlpha_oM/ProjectLike.py index ac1f3dd..1dd21ee 100644 --- a/src/bhom_schema/FixtureAlpha_oM/ProjectLike.py +++ b/src/bhom_schema/FixtureAlpha_oM/ProjectLike.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.ProjectLike. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/Scalars.py b/src/bhom_schema/FixtureAlpha_oM/Scalars.py index 42612a2..abb745b 100644 --- a/src/bhom_schema/FixtureAlpha_oM/Scalars.py +++ b/src/bhom_schema/FixtureAlpha_oM/Scalars.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Scalars. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/Sparse.py b/src/bhom_schema/FixtureAlpha_oM/Sparse.py index d2d6b36..b732b75 100644 --- a/src/bhom_schema/FixtureAlpha_oM/Sparse.py +++ b/src/bhom_schema/FixtureAlpha_oM/Sparse.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Sparse. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/FixtureAlpha_oM/SparseHolder.py b/src/bhom_schema/FixtureAlpha_oM/SparseHolder.py index 211da26..0543e65 100644 --- a/src/bhom_schema/FixtureAlpha_oM/SparseHolder.py +++ b/src/bhom_schema/FixtureAlpha_oM/SparseHolder.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.SparseHolder. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/SparseParent.py b/src/bhom_schema/FixtureAlpha_oM/SparseParent.py index a510c0e..da890b6 100644 --- a/src/bhom_schema/FixtureAlpha_oM/SparseParent.py +++ b/src/bhom_schema/FixtureAlpha_oM/SparseParent.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.SparseParent. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/SupportKind.py b/src/bhom_schema/FixtureAlpha_oM/SupportKind.py index 46408db..4d1072c 100644 --- a/src/bhom_schema/FixtureAlpha_oM/SupportKind.py +++ b/src/bhom_schema/FixtureAlpha_oM/SupportKind.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.SupportKind. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/FixtureAlpha_oM/ThingIdentity.py b/src/bhom_schema/FixtureAlpha_oM/ThingIdentity.py index 861dd35..39f2c2e 100644 --- a/src/bhom_schema/FixtureAlpha_oM/ThingIdentity.py +++ b/src/bhom_schema/FixtureAlpha_oM/ThingIdentity.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.ThingIdentity. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. from __future__ import annotations diff --git a/src/bhom_schema/FixtureAlpha_oM/TreeLike_1.py b/src/bhom_schema/FixtureAlpha_oM/TreeLike_1.py index 19b9aa3..ba2c5f2 100644 --- a/src/bhom_schema/FixtureAlpha_oM/TreeLike_1.py +++ b/src/bhom_schema/FixtureAlpha_oM/TreeLike_1.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.TreeLike`1. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureAlpha_oM/Wrapper_1.py b/src/bhom_schema/FixtureAlpha_oM/Wrapper_1.py index 4e06c66..554cd7c 100644 --- a/src/bhom_schema/FixtureAlpha_oM/Wrapper_1.py +++ b/src/bhom_schema/FixtureAlpha_oM/Wrapper_1.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureAlpha.Wrapper`1. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureBeta_oM/Elements/UsesBoth.py b/src/bhom_schema/FixtureBeta_oM/Elements/UsesBoth.py index 26e0d9b..4c060dd 100644 --- a/src/bhom_schema/FixtureBeta_oM/Elements/UsesBoth.py +++ b/src/bhom_schema/FixtureBeta_oM/Elements/UsesBoth.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureBeta.Elements.UsesBoth. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false diff --git a/src/bhom_schema/FixtureBeta_oM/PointLike.py b/src/bhom_schema/FixtureBeta_oM/PointLike.py index 533ebe5..a73294f 100644 --- a/src/bhom_schema/FixtureBeta_oM/PointLike.py +++ b/src/bhom_schema/FixtureBeta_oM/PointLike.py @@ -1,5 +1,5 @@ # Generated by BHoM_PythonSchema from the C# oM type BH.oM.FixtureBeta.PointLike. Do not edit by hand. -# Copyright (c) 2015 - 2026, the respective contributors. All rights reserved. +# Copyright (c) the respective contributors. All rights reserved. # Licensed under the GNU Lesser General Public License, version 3.0 or later. # pyright: reportUnknownVariableType=false, reportIncompatibleVariableOverride=false