diff --git a/CHANGELOG.md b/CHANGELOG.md index dca02dd..e473c22 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v2.0.0-beta.54 - 2025-02-04 + +- Follow Nexus changes + ## v2.0.0-beta.53 - 2025-02-03 - Fix version diff --git a/Directory.Packages.props b/Directory.Packages.props index 6ae35b8..a941e94 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -9,7 +9,7 @@ - + diff --git a/requirements.txt b/requirements.txt index 29a04bf..a512218 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,6 @@ apollo3zehn-package-management==1.0.0-b5 build fastapi[standard] -nexus-extensibility==2.0.0-b48 +nexus-extensibility==2.0.0-b50 pytest-asyncio wheel \ No newline at end of file diff --git a/src/Nexus.Sources.Remote/Remote.cs b/src/Nexus.Sources.Remote/Remote.cs index cf8bbc0..a5d3362 100644 --- a/src/Nexus.Sources.Remote/Remote.cs +++ b/src/Nexus.Sources.Remote/Remote.cs @@ -50,7 +50,7 @@ public partial class Remote : IDataSource, IUpgradableDataSource private DataSourceContext Context { get; set; } = default!; - public static async Task UpgradeSourceConfigurationAsync( + public async Task UpgradeSourceConfigurationAsync( JsonElement configuration, CancellationToken cancellationToken ) diff --git a/src/agent/python/requirements.txt b/src/agent/python/requirements.txt index b84b86f..b7f9615 100644 --- a/src/agent/python/requirements.txt +++ b/src/agent/python/requirements.txt @@ -1,3 +1,3 @@ apollo3zehn-package-management==1.0.0-b5 fastapi[standard] -nexus-extensibility==2.0.0-beta.48 \ No newline at end of file +nexus-extensibility==2.0.0-beta.50 \ No newline at end of file diff --git a/src/remoting/dotnet/Remoting.cs b/src/remoting/dotnet/Remoting.cs index 35aaba4..ef90e0c 100644 --- a/src/remoting/dotnet/Remoting.cs +++ b/src/remoting/dotnet/Remoting.cs @@ -220,12 +220,18 @@ CancellationToken cancellationToken throw new Exception("The connection must be initialized with a type before invoking other methods."); var dataSourceType = _getDataSourceType(_sourceTypeName); - var configuration = @params[0]; + var upgradedConfiguration = @params[0]; - var upgradedConfiguration = await InternalUpgradeAllAsync( - dataSourceType, - @params[0] - ); + if (dataSourceType.IsAssignableTo(dataSourceType)) + { + var upgradableDataSource = (IUpgradableDataSource)Activator.CreateInstance(dataSourceType)!; + var timeoutTokenSource = new CancellationTokenSource(TimeSpan.FromMinutes(1)); + + upgradedConfiguration = await upgradableDataSource.UpgradeSourceConfigurationAsync( + @params[0], + timeoutTokenSource.Token + ); + } result = JsonSerializer.SerializeToNode(upgradedConfiguration, Utilities.JsonSerializerOptions); } @@ -450,56 +456,6 @@ private int ReadSize(NetworkStream currentStream) var size = BitConverter.ToInt32(sizeBuffer); return size; } - - /* Copy of Nexus.Services.UpgradeConfigurationService.InternalUpgradeAllAsync */ - private static async Task InternalUpgradeAllAsync( - Type sourceType, - JsonElement configuration - ) - { - /* Collect potential types in the inheritance chain */ - var upgradableDataSourceTypes = new List(); - var currentType1 = sourceType; - - while (!(currentType1 is null || currentType1 == typeof(object))) - { - var interfaceTypes = currentType1.GetInterfaces(); - - if (interfaceTypes.Contains(typeof(IUpgradableDataSource))) - upgradableDataSourceTypes.Add(currentType1); - - currentType1 = currentType1.BaseType; - } - - upgradableDataSourceTypes.Reverse(); - - /* Invoke UpgradeSourceConfigurationAsync */ - var upgradedConfiguration = configuration; - - foreach (var currentType2 in upgradableDataSourceTypes) - { - var timeoutTokenSource = new CancellationTokenSource(TimeSpan.FromMinutes(1)); - - var methodInfo = currentType2 - .GetMethod(nameof(IUpgradableDataSource.UpgradeSourceConfigurationAsync), BindingFlags.Public | BindingFlags.Static)!; - - /* This happens when base class implements IUpgradableDataSource and - * sub class does not reimplement it, which is fine. - */ - if (methodInfo is null) - continue; - - upgradedConfiguration = await (Task)methodInfo.Invoke( - default, - [ - upgradedConfiguration, - timeoutTokenSource.Token - ] - )!; - } - - return upgradedConfiguration; - } } internal static class Utilities diff --git a/src/remoting/python/nexus_remoting/_remoting.py b/src/remoting/python/nexus_remoting/_remoting.py index ac64391..e2ccdb1 100644 --- a/src/remoting/python/nexus_remoting/_remoting.py +++ b/src/remoting/python/nexus_remoting/_remoting.py @@ -165,11 +165,11 @@ async def _process_invocation(self, request: dict[str, Any]) \ raise Exception("The connection must be initialized with a type before invoking other methods.") data_source_type = self._get_data_source_type(self._source_type_name) + upgraded_configuration = params[0] - upgraded_configuration = await self.internal_upgrade_all( - data_source_type, - params[0] - ) + if issubclass(data_source_type, IUpgradableDataSource): + upgradable_data_source = cast(IUpgradableDataSource, data_source_type()) + upgraded_configuration = await upgradable_data_source.upgrade_source_configuration(params[0]) result = upgraded_configuration @@ -327,37 +327,6 @@ async def _read_size(self, reader: asyncio.StreamReader) -> int: return size - async def internal_upgrade_all(self, source_type: type, configuration: Any): - - # Collect potential types in the inheritance chain - upgradable_data_source_types: list[type[IUpgradableDataSource]] = [] - current_type = source_type - - # The following implementation just follows the first base type - # which is not IDataSource or IUpgradableDataSource - while not (current_type is None): - - if issubclass(current_type, IUpgradableDataSource) and IUpgradableDataSource in current_type.__bases__: - upgradable_data_source_types.append(current_type) - - current_type = next( - ( - base for base in current_type.__bases__ \ - if base is not IDataSource and base is not IUpgradableDataSource - ), - None - ) - - upgradable_data_source_types.reverse() - - # Invoke upgrade_source_configuration - upgraded_configuration = configuration - - for current_type in upgradable_data_source_types: - upgraded_configuration = await current_type.upgrade_source_configuration(configuration) - - return upgraded_configuration - async def _send_to_server(message: Any, writer: asyncio.StreamWriter): encoded = JsonEncoder.encode(message, _json_encoder_options) diff --git a/src/remoting/python/setup.py b/src/remoting/python/setup.py index c93e1f8..80c546a 100644 --- a/src/remoting/python/setup.py +++ b/src/remoting/python/setup.py @@ -47,6 +47,6 @@ }, python_requires=">=3.10", install_requires=[ - "nexus-extensibility>=2.0.0b48" + "nexus-extensibility>=2.0.0b50" ] ) diff --git a/tests/Nexus.Sources.Remote.Tests/RemoteTests.cs b/tests/Nexus.Sources.Remote.Tests/RemoteTests.cs index 941349b..c8347e2 100644 --- a/tests/Nexus.Sources.Remote.Tests/RemoteTests.cs +++ b/tests/Nexus.Sources.Remote.Tests/RemoteTests.cs @@ -40,7 +40,7 @@ public async Task CanUpgradeSourceConfiguration(string language) var configuration = CreateSettings(language); // Act - var upgradedConfiguration = await Remote.UpgradeSourceConfigurationAsync( + var upgradedConfiguration = await new Remote().UpgradeSourceConfigurationAsync( JsonSerializer.SerializeToElement(configuration, Utilities.JsonSerializerOptions), CancellationToken.None ); diff --git a/tests/Nexus.Sources.Remote.Tests/dotnet/v1/Test.cs b/tests/Nexus.Sources.Remote.Tests/dotnet/v1/Test.cs index 70adb32..2dd6500 100644 --- a/tests/Nexus.Sources.Remote.Tests/dotnet/v1/Test.cs +++ b/tests/Nexus.Sources.Remote.Tests/dotnet/v1/Test.cs @@ -14,15 +14,13 @@ string LogMessage public class TestBase : IUpgradableDataSource { - public static Task UpgradeSourceConfigurationAsync( + public virtual Task UpgradeSourceConfigurationAsync( JsonElement configuration, CancellationToken cancellationToken ) { var jsonNode = JsonSerializer.SerializeToNode(configuration)!; - jsonNode["foo"] = jsonNode["logMessage"]!.DeepClone(); - var upgradedConfiguration = JsonSerializer.SerializeToElement(jsonNode, JsonSerializerOptions.Web); return Task.FromResult(upgradedConfiguration); @@ -32,22 +30,21 @@ CancellationToken cancellationToken /* Note: Inherit from StructuredFileDataSource would be possible * but collides with ReadAndModifyNexusData method */ -public class Test : TestBase, IDataSource, IUpgradableDataSource +public class Test : TestBase, IDataSource { private DataSourceContext _context = default!; - public static new Task UpgradeSourceConfigurationAsync( + public override async Task UpgradeSourceConfigurationAsync( JsonElement configuration, CancellationToken cancellationToken ) { + configuration = await base.UpgradeSourceConfigurationAsync(configuration, cancellationToken); var jsonNode = JsonSerializer.SerializeToNode(configuration)!; - jsonNode["bar"] = jsonNode["logMessage"]!.DeepClone(); - var upgradedConfiguration = JsonSerializer.SerializeToElement(jsonNode, JsonSerializerOptions.Web); - return Task.FromResult(upgradedConfiguration); + return upgradedConfiguration; } public Task SetContextAsync( diff --git a/tests/Nexus.Sources.Remote.Tests/python/v1/src/foo/test.py b/tests/Nexus.Sources.Remote.Tests/python/v1/src/foo/test.py index ec4c4ae..12ecd92 100644 --- a/tests/Nexus.Sources.Remote.Tests/python/v1/src/foo/test.py +++ b/tests/Nexus.Sources.Remote.Tests/python/v1/src/foo/test.py @@ -1,3 +1,4 @@ +from abc import abstractmethod import glob import os from dataclasses import dataclass @@ -19,17 +20,17 @@ class TestSettings(): class TestBase(IUpgradableDataSource): - @staticmethod - async def upgrade_source_configuration(configuration: Any) -> Any: + @abstractmethod + async def upgrade_source_configuration(self, configuration: Any) -> Any: configuration["foo"] = configuration["logMessage"] -class Test(TestBase, IDataSource[TestSettings], IUpgradableDataSource): +class Test(TestBase, IDataSource[TestSettings]): _root: str - @staticmethod - async def upgrade_source_configuration(configuration: Any) -> Any: + async def upgrade_source_configuration(self, configuration: Any) -> Any: + await super().upgrade_source_configuration(configuration) configuration["bar"] = configuration["logMessage"] return configuration diff --git a/version.json b/version.json index 5adb24e..7cbadcf 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { "version": "2.0.0", - "suffix": "beta.53" + "suffix": "beta.54" } \ No newline at end of file