From 2dabdd18752c9541876df7c1ced8a8dcf05f6a55 Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Mon, 28 Apr 2025 09:21:18 -0400 Subject: [PATCH 01/18] initial commit --- doc/distrib/xml/en-US/DSCoreNodes.xml | 5 +++ .../Configuration/ExecutionSession.cs | 1 + src/DynamoCore/Models/DynamoModel.cs | 3 +- .../ViewModels/Core/DynamoViewModel.cs | 4 +- .../PackageManagerClientViewModel.cs | 8 ++-- src/DynamoPackages/PackageManagerClient.cs | 42 +++++++++++++++++-- src/DynamoPackages/PackageManagerExtension.cs | 5 ++- .../Properties/Resources.Designer.cs | 9 ++++ .../Properties/Resources.cs-CZ.resx | 6 ++- .../Properties/Resources.de-DE.resx | 6 ++- .../Properties/Resources.en-US.resx | 5 ++- .../Properties/Resources.es-ES.resx | 6 ++- .../Properties/Resources.fr-FR.resx | 6 ++- .../Properties/Resources.it-IT.resx | 6 ++- .../Properties/Resources.ja-JP.resx | 6 ++- .../Properties/Resources.ko-KR.resx | 6 ++- .../Properties/Resources.pl-PL.resx | 6 ++- .../Properties/Resources.pt-BR.resx | 6 ++- src/DynamoPackages/Properties/Resources.resx | 5 ++- .../Properties/Resources.ru-RU.resx | 6 ++- .../Properties/Resources.zh-CN.resx | 6 ++- .../Properties/Resources.zh-TW.resx | 6 ++- .../Properties/Resources.cs-CZ.resx | 2 +- .../Properties/Resources.de-DE.resx | 2 +- .../Properties/Resources.es-ES.resx | 2 +- .../Properties/Resources.fr-FR.resx | 2 +- .../Properties/Resources.it-IT.resx | 2 +- .../Properties/Resources.ja-JP.resx | 2 +- .../Properties/Resources.ko-KR.resx | 2 +- .../Properties/Resources.pl-PL.resx | 2 +- .../Properties/Resources.pt-BR.resx | 2 +- .../Properties/Resources.ru-RU.resx | 2 +- .../Properties/Resources.zh-CN.resx | 2 +- .../Properties/Resources.zh-TW.resx | 2 +- src/Libraries/CoreNodeModels/WebRequest.cs | 6 ++- .../Properties/Resources.Designer.cs | 9 ++++ .../CoreNodes/Properties/Resources.cs-CZ.resx | 6 ++- .../CoreNodes/Properties/Resources.de-DE.resx | 6 ++- .../CoreNodes/Properties/Resources.en-US.resx | 5 ++- .../CoreNodes/Properties/Resources.es-ES.resx | 6 ++- .../CoreNodes/Properties/Resources.fr-FR.resx | 6 ++- .../CoreNodes/Properties/Resources.it-IT.resx | 6 ++- .../CoreNodes/Properties/Resources.ja-JP.resx | 6 ++- .../CoreNodes/Properties/Resources.ko-KR.resx | 6 ++- .../CoreNodes/Properties/Resources.pl-PL.resx | 6 ++- .../CoreNodes/Properties/Resources.pt-BR.resx | 6 ++- .../CoreNodes/Properties/Resources.resx | 5 ++- .../CoreNodes/Properties/Resources.ru-RU.resx | 6 ++- .../CoreNodes/Properties/Resources.zh-CN.resx | 6 ++- .../CoreNodes/Properties/Resources.zh-TW.resx | 6 ++- src/Libraries/CoreNodes/Web.cs | 12 ++++++ src/NodeServices/ExecutionSession.cs | 5 +++ 52 files changed, 242 insertions(+), 55 deletions(-) diff --git a/doc/distrib/xml/en-US/DSCoreNodes.xml b/doc/distrib/xml/en-US/DSCoreNodes.xml index 964204be67a..da27041781c 100644 --- a/doc/distrib/xml/en-US/DSCoreNodes.xml +++ b/doc/distrib/xml/en-US/DSCoreNodes.xml @@ -2370,6 +2370,11 @@ Looks up a localized string similar to The url cannot be null.. + + + Looks up a localized string similar to The Web Request node is unavailable in No Network mode.. + + Looks up a localized string similar to Use Image.WriteToFile node instead. diff --git a/src/DynamoCore/Configuration/ExecutionSession.cs b/src/DynamoCore/Configuration/ExecutionSession.cs index efb62792d36..b738d2f7a89 100644 --- a/src/DynamoCore/Configuration/ExecutionSession.cs +++ b/src/DynamoCore/Configuration/ExecutionSession.cs @@ -26,6 +26,7 @@ public ExecutionSession(Scheduler.UpdateGraphAsyncTask updateTask, DynamoModel m parameters[ParameterKeys.LastExecutionDuration] = new TimeSpan(updateTask.ExecutionEndTime.TickCount - updateTask.ExecutionStartTime.TickCount); parameters[ParameterKeys.PackagePaths] = pathManager.PackagesDirectories; parameters[ParameterKeys.Logger] = model.Logger; + parameters[ParameterKeys.NoNetworkMode] = model.NoNetworkMode; } /// diff --git a/src/DynamoCore/Models/DynamoModel.cs b/src/DynamoCore/Models/DynamoModel.cs index 9fef6d0a89b..76e4fb1b5d1 100644 --- a/src/DynamoCore/Models/DynamoModel.cs +++ b/src/DynamoCore/Models/DynamoModel.cs @@ -664,7 +664,8 @@ protected DynamoModel(IStartConfiguration config) Context = config.Context; IsTestMode = config.StartInTestMode; IsHeadless = config.IsHeadless; - NoNetworkMode = config.NoNetworkMode; + //NoNetworkMode = config.NoNetworkMode; + NoNetworkMode = true; HostAnalyticsInfo = config.HostAnalyticsInfo; DebugSettings = new DebugSettings(); diff --git a/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs index a8f12f0d92f..c0b7165e06d 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs @@ -2810,12 +2810,12 @@ internal void ShowPackageManager(object parameters) internal bool CanShowPackageManagerSearch(object parameters) { - return !model.IsServiceMode; + return !model.IsServiceMode && !model.NoNetworkMode; } internal bool CanShowPackageManager(object parameters) { - return !model.IsServiceMode; + return !model.IsServiceMode && !model.NoNetworkMode; } /// diff --git a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerClientViewModel.cs b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerClientViewModel.cs index 116a616f867..b57dc83891a 100644 --- a/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerClientViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/PackageManager/PackageManagerClientViewModel.cs @@ -343,7 +343,7 @@ public void PublishCurrentWorkspace(object m) public bool CanPublishCurrentWorkspace(object m) { - return DynamoViewModel.Model.CurrentWorkspace is CustomNodeWorkspaceModel && AuthenticationManager.HasAuthProvider; + return DynamoViewModel.Model.CurrentWorkspace is CustomNodeWorkspaceModel && AuthenticationManager.HasAuthProvider && !Model.NoNetworkMode; } public void PublishNewPackage(object m) @@ -363,7 +363,7 @@ public void PublishNewPackage(object m) public bool CanPublishNewPackage(object m) { - return AuthenticationManager.HasAuthProvider; + return AuthenticationManager.HasAuthProvider && !Model.NoNetworkMode; } public void PublishCustomNode(Function m) @@ -393,7 +393,7 @@ public void PublishCustomNode(Function m) public bool CanPublishCustomNode(Function m) { - return AuthenticationManager.HasAuthProvider && m != null; + return AuthenticationManager.HasAuthProvider && m != null && !Model.NoNetworkMode; } public void PublishSelectedNodes(object m) @@ -453,7 +453,7 @@ public void PublishSelectedNodes(object m) public bool CanPublishSelectedNodes(object m) { return DynamoSelection.Instance.Selection.Count > 0 && - DynamoSelection.Instance.Selection.All(x => x is Function) && AuthenticationManager.HasAuthProvider; ; + DynamoSelection.Instance.Selection.All(x => x is Function) && AuthenticationManager.HasAuthProvider && !Model.NoNetworkMode; } private void ShowNodePublishInfo() diff --git a/src/DynamoPackages/PackageManagerClient.cs b/src/DynamoPackages/PackageManagerClient.cs index b808f243a38..602ecffce7c 100644 --- a/src/DynamoPackages/PackageManagerClient.cs +++ b/src/DynamoPackages/PackageManagerClient.cs @@ -49,18 +49,24 @@ public string BaseUrl get { return this.client.BaseUrl; } } + internal readonly bool NoNetworkMode; + #endregion - internal PackageManagerClient(IGregClient client, IPackageUploadBuilder builder, string packageUploadDirectory) + internal PackageManagerClient(IGregClient client, IPackageUploadBuilder builder, string packageUploadDirectory, + bool noNetworkMode = false) { this.packageUploadDirectory = packageUploadDirectory; this.uploadBuilder = builder; this.client = client; this.packageMaintainers = new Dictionary(); + this.NoNetworkMode = noNetworkMode; } internal bool Upvote(string packageId) { + if (NoNetworkMode) return false; + return FailFunc.TryExecute(() => { var pkgResponse = this.client.ExecuteAndDeserialize(new Upvote(packageId)); @@ -70,6 +76,8 @@ internal bool Upvote(string packageId) internal List UserVotes() { + if (NoNetworkMode) return null; + var votes = FailFunc.TryExecute(() => { var nv = new GetUserVotes(); @@ -82,6 +90,8 @@ internal List UserVotes() internal List CompatibilityMap() { + if (NoNetworkMode) return null; + var compatibilityMap = FailFunc.TryExecute(() => { var cm = new GetCompatibilityMap(); @@ -99,6 +109,8 @@ internal PackageManagerResult DownloadPackage(string packageId, string version, { try { + if (NoNetworkMode) throw new Exception(DynamoPackages.Properties.Resources.DownloadPackageDisabled); + var response = this.client.Execute(new PackageDownload(packageId, version)); pathToPackage = PackageDownload.GetFileFromResponse(response); return PackageManagerResult.Succeeded(); @@ -112,6 +124,8 @@ internal PackageManagerResult DownloadPackage(string packageId, string version, internal IEnumerable ListAll() { + if (NoNetworkMode) return new List(); + return FailFunc.TryExecute(() => { var nv = HeaderCollectionDownload.ByEngine("dynamo"); var pkgResponse = this.client.ExecuteAndDeserializeWithContent>(nv); @@ -146,6 +160,8 @@ void CleanPackagesWithWrongVersions(List packages) /// internal PackageHeader GetPackageMaintainers(IPackageInfo packageInfo) { + if (NoNetworkMode) return null; + var header = FailFunc.TryExecute(() => { var nv = new GetMaintainers("dynamo", packageInfo.Name); @@ -162,6 +178,8 @@ internal PackageHeader GetPackageMaintainers(IPackageInfo packageInfo) /// internal UserPackages GetUsersLatestPackages() { + if (NoNetworkMode) return null; + var packages = FailFunc.TryExecute(() => { var nv = new GetMyPackages(); @@ -179,6 +197,8 @@ internal UserPackages GetUsersLatestPackages() /// Package version metadata internal PackageVersion GetPackageVersionHeader(IPackageInfo packageInfo) { + if (NoNetworkMode) return null; + var req = new HeaderVersionDownload("dynamo", packageInfo.Name, packageInfo.Version.ToString()); var pkgResponse = this.client.ExecuteAndDeserializeWithContent(req); if (!pkgResponse.success) @@ -196,6 +216,8 @@ internal PackageVersion GetPackageVersionHeader(IPackageInfo packageInfo) /// Package version metadata internal virtual PackageVersion GetPackageVersionHeader(string id, string version) { + if (NoNetworkMode) return null; + var req = new HeaderVersionDownload(id, version); var pkgResponse = this.client.ExecuteAndDeserializeWithContent(req); if (!pkgResponse.success) @@ -211,6 +233,8 @@ internal virtual PackageVersion GetPackageVersionHeader(string id, string versio /// internal virtual IEnumerable GetKnownHosts() { + if (NoNetworkMode) return null; + if (cachedHosts == null) { cachedHosts = FailFunc.TryExecute(() => @@ -235,6 +259,8 @@ public bool SetTermsOfUseAcceptanceStatus() private bool ExecuteTermsOfUseCall(bool queryAcceptanceStatus) { + if (NoNetworkMode) return false; + return FailFunc.TryExecute(() => { var request = new TermsOfUse(queryAcceptanceStatus); @@ -258,6 +284,8 @@ private bool ExecuteTermsOfUseCall(bool queryAcceptanceStatus) /// A Used to track the upload status. internal PackageUploadHandle PublishAsync(Package package, object files, IEnumerable markdownFiles, bool isNewVersion, IEnumerable roots, bool retainFolderStructure) { + if (NoNetworkMode) return null; + var packageUploadHandle = new PackageUploadHandle(PackageUploadBuilder.NewRequestBody(package)); Task.Factory.StartNew(() => @@ -321,6 +349,8 @@ internal void Publish(Package package, object files, IEnumerable markdow internal PackageManagerResult Deprecate(string name) { + if (NoNetworkMode) return null; + return FailFunc.TryExecute(() => { var pkgResponse = this.client.ExecuteAndDeserialize(new Deprecate(name, PackageEngineName)); @@ -330,6 +360,8 @@ internal PackageManagerResult Deprecate(string name) internal PackageManagerResult Undeprecate(string name) { + if (NoNetworkMode) return null; + return FailFunc.TryExecute(() => { var pkgResponse = this.client.ExecuteAndDeserialize(new Undeprecate(name, PackageEngineName)); @@ -339,14 +371,16 @@ internal PackageManagerResult Undeprecate(string name) internal bool DoesCurrentUserOwnPackage(Package package,string username) { + if (NoNetworkMode) return false; + bool value; - if (this.packageMaintainers.Count > 0 && this.packageMaintainers.TryGetValue(package.Name, out value)) { + if (packageMaintainers.Count > 0 && packageMaintainers.TryGetValue(package.Name, out value)) { return value; } var pkg = new PackageInfo(package.Name, new Version(package.VersionName)); var mnt = GetPackageMaintainers(pkg); value = (mnt != null) && (mnt.maintainers.Any(maintainer => maintainer.username.Equals(username))); - this.packageMaintainers[package.Name] = value; + packageMaintainers[package.Name] = value; return value; } @@ -386,7 +420,7 @@ internal void LoadCompatibilityMap() { compatibilityMap = new Dictionary>(); - var compatibilityMapList = this.CompatibilityMap(); + var compatibilityMapList = CompatibilityMap(); PackageManagerClient.compatibilityMapList = compatibilityMapList; // Loads the full CompatibilityMap as a side-effect foreach (var host in compatibilityMapList) diff --git a/src/DynamoPackages/PackageManagerExtension.cs b/src/DynamoPackages/PackageManagerExtension.cs index 257eb61a63e..690db27912d 100644 --- a/src/DynamoPackages/PackageManagerExtension.cs +++ b/src/DynamoPackages/PackageManagerExtension.cs @@ -157,11 +157,12 @@ public void Startup(StartupParams startupParams) var packageUploadDirectory = startupParams.PathManager.DefaultPackagesDirectory; + noNetworkMode = startupParams.NoNetworkMode; + PackageManagerClient = new PackageManagerClient( new GregClient(startupParams.AuthProvider, url), - uploadBuilder, packageUploadDirectory); + uploadBuilder, packageUploadDirectory, noNetworkMode); - noNetworkMode = startupParams.NoNetworkMode; //we don't ask dpm for the compatibility map in offline mode. if (!noNetworkMode) diff --git a/src/DynamoPackages/Properties/Resources.Designer.cs b/src/DynamoPackages/Properties/Resources.Designer.cs index 44c2d96fe09..eea0f4fcff2 100644 --- a/src/DynamoPackages/Properties/Resources.Designer.cs +++ b/src/DynamoPackages/Properties/Resources.Designer.cs @@ -78,6 +78,15 @@ public static string CannotRemovePackageAssemblyTitle { } } + /// + /// Looks up a localized string similar to Package download is disabled in no-network mode.. + /// + public static string DownloadPackageDisabled { + get { + return ResourceManager.GetString("DownloadPackageDisabled", resourceCulture); + } + } + /// /// Looks up a localized string similar to The folder '{0}' does not exist. /// diff --git a/src/DynamoPackages/Properties/Resources.cs-CZ.resx b/src/DynamoPackages/Properties/Resources.cs-CZ.resx index 840b8575d3f..93e979e3bcc 100644 --- a/src/DynamoPackages/Properties/Resources.cs-CZ.resx +++ b/src/DynamoPackages/Properties/Resources.cs-CZ.resx @@ -1,4 +1,4 @@ - + + + + + + + + + . From 0c71b76a92826f83e80366a0c59f8e932ce46d36 Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Wed, 7 May 2025 10:39:04 -0400 Subject: [PATCH 05/18] revert unchanged file --- src/DynamoCore/Models/DynamoModel.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/DynamoCore/Models/DynamoModel.cs b/src/DynamoCore/Models/DynamoModel.cs index 7efc19cac0b..c34197912fe 100644 --- a/src/DynamoCore/Models/DynamoModel.cs +++ b/src/DynamoCore/Models/DynamoModel.cs @@ -664,8 +664,7 @@ protected DynamoModel(IStartConfiguration config) Context = config.Context; IsTestMode = config.StartInTestMode; IsHeadless = config.IsHeadless; - //NoNetworkMode = config.NoNetworkMode; - NoNetworkMode = true; + NoNetworkMode = config.NoNetworkMode; HostAnalyticsInfo = config.HostAnalyticsInfo; DebugSettings = new DebugSettings(); From cd5d310459ae420ccac9894d02e0047e5a243672 Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Mon, 12 May 2025 10:40:59 -0400 Subject: [PATCH 06/18] update tests --- .../PackageManagerControlTests.cs | 2 +- ...ackageManagerSearchElementViewModelTests.cs | 18 +++++++++--------- .../PackageManager/PackageManagerUITests.cs | 6 +++--- .../PackageManagerViewModelTests.cs | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerControlTests.cs b/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerControlTests.cs index ead9b7272ab..63798baaed7 100644 --- a/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerControlTests.cs +++ b/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerControlTests.cs @@ -23,7 +23,7 @@ public void SearchBoxControlTextTests() { // Setup var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmCVM = new Mock(ViewModel, clientmock.Object) { CallBase = true }; var packageManagerSearchViewModel = new PackageManagerSearchViewModel(pmCVM.Object); packageManagerSearchViewModel.RegisterTransientHandlers(); diff --git a/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerSearchElementViewModelTests.cs b/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerSearchElementViewModelTests.cs index 885f81cd7d0..8b337a269df 100644 --- a/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerSearchElementViewModelTests.cs +++ b/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerSearchElementViewModelTests.cs @@ -49,7 +49,7 @@ public void TestPackageManagerSearchElementCanInstall() string formItFilterName = "FormIt"; var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmCVM = new Mock(ViewModel, clientmock.Object) { CallBase = true }; ; var ext = Model.GetPackageManagerExtension(); @@ -203,7 +203,7 @@ public void PackageSearchDialogSearchIntersectAgainstHostFilters() List intersectionPackagesName = new List { "DynamoTestPackage1", "DynamoTestPackage2" }; var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmCVM = new Mock(ViewModel, clientmock.Object) {CallBase=true }; var packageManagerSearchViewModel = new PackageManagerSearchViewModel(pmCVM.Object); @@ -306,7 +306,7 @@ public void PackageSearchDialogSearchTestStatusFilters() List deprecatedPackagesName = new List { "DynamoTestPackage1", "DynamoTestPackage2" }; var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmCVM = new Mock(ViewModel, clientmock.Object) { CallBase = true }; var packageManagerSearchViewModel = new PackageManagerSearchViewModel(pmCVM.Object); @@ -454,7 +454,7 @@ public void PackageSearchDialogSearchTestDependencyFilters() List noDependencyPackagesName = new List { "DynamoIronPython2.7", "dynamo", "mise en barre", "Test-PackageDependencyFilter" }; var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmCVM = new Mock(ViewModel, clientmock.Object) { CallBase = true }; var packageManagerSearchViewModel = new PackageManagerSearchViewModel(pmCVM.Object); @@ -579,7 +579,7 @@ public void PackageSearchDialogSearchTestCompatibilityFilters() List unknownCompatibilityPackagesName = new List { "DynamoXCompatPackage" }; var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmCVM = new Mock(ViewModel, clientmock.Object) { CallBase = true }; var packageManagerSearchViewModel = new PackageManagerSearchViewModel(pmCVM.Object); @@ -696,7 +696,7 @@ public void PackageSearchDialogSearchDifferentLanguage() List packageHeaders = new List(); var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmCVM = new Mock(ViewModel, clientmock.Object) { CallBase = true }; List cachedPackages = new List(); foreach (var packageName in packagesNameDifferentLanguages) @@ -762,7 +762,7 @@ public void PackageSearchOrderAfterTextReset() List packagesVotes = new List { 50, 60, 90, 40 }; var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmCVM = new Mock(ViewModel, clientmock.Object) { CallBase = true }; var packageManagerSearchVM = new PackageManagerSearchViewModel(pmCVM.Object); packageManagerSearchVM.RegisterTransientHandlers(); @@ -859,7 +859,7 @@ public void PackageSearchWithWhitespaceInName() List packageHeaders = new List(); var mockGreg = new Mock(); - var clientMock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientMock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmCVM = new Mock(ViewModel, clientMock.Object) { CallBase = true }; List cachedPackages = new List(); foreach (var packageName in packagesListNames) @@ -1225,7 +1225,7 @@ public void HostCompatibilityFiltersExclusivity() { var mockGreg = new Mock(); - var clientMock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientMock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmCVM = new Mock(ViewModel, clientMock.Object) { CallBase = true }; var pmSVM = new PackageManagerSearchViewModel(pmCVM.Object); pmSVM.RegisterTransientHandlers(); diff --git a/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerUITests.cs b/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerUITests.cs index 3ee4f301967..160e59af31a 100644 --- a/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerUITests.cs +++ b/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerUITests.cs @@ -1202,7 +1202,7 @@ public void PackageManagerDownloadsBeforeInstalling() var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmVmMock = new Mock(ViewModel, clientmock.Object) { CallBase = true }; var sharedEngineVersion = DynamoModel.Version; @@ -1318,7 +1318,7 @@ public void PackageManagerWarnWhenInstallingPackageTargetingOtherHost() var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmVmMock = new Mock(ViewModel, clientmock.Object); var pmMock = new Mock(); @@ -1424,7 +1424,7 @@ public void PackageManagerWarnWhenInstallingPackageTargetingOtherHost() public void InstallsPackagesEvenIfSomeFailToDownloadShouldNotThrow() { var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmVmMock = new PackageManagerClientViewModel(ViewModel, clientmock.Object); Assert.DoesNotThrow(() => { diff --git a/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerViewModelTests.cs b/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerViewModelTests.cs index 14f1c2ce0a6..8ed917a941e 100644 --- a/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerViewModelTests.cs +++ b/test/DynamoCoreWpf2Tests/PackageManager/PackageManagerViewModelTests.cs @@ -17,7 +17,7 @@ internal class PackageManagerViewModelTests : SystemTestBase public void PackageManagerLoadAllViewModelsTests() { var mockGreg = new Mock(); - var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty); + var clientmock = new Mock(mockGreg.Object, MockMaker.Empty(), string.Empty, false); var pmCVM = new Mock(ViewModel, clientmock.Object) { CallBase = true }; ; var packageManagerSearchViewModel = new PackageManagerSearchViewModel(pmCVM.Object); From be498b8e6e2d34f4189cfe876b60558b14aeed6f Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Tue, 13 May 2025 09:13:53 -0400 Subject: [PATCH 07/18] review comments --- src/DynamoCoreWpf/ViewModels/Menu/PreferencesViewModel.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/DynamoCoreWpf/ViewModels/Menu/PreferencesViewModel.cs b/src/DynamoCoreWpf/ViewModels/Menu/PreferencesViewModel.cs index 12964a38593..ad2a2941757 100644 --- a/src/DynamoCoreWpf/ViewModels/Menu/PreferencesViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Menu/PreferencesViewModel.cs @@ -1346,7 +1346,6 @@ private void AddPythonEnginesOptions() /// public TrustedPathViewModel TrustedPathsViewModel { get; set; } - //public bool NoNetworkMode => dynamoViewModel.Model.NoNetworkMode; private bool noNetworkMode; public bool NoNetworkMode { From e971915b9fa615187dd4df4627ff14f8977ce260 Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Wed, 14 May 2025 12:09:35 -0400 Subject: [PATCH 08/18] revert localized files --- src/DynamoPackages/Properties/Resources.cs-CZ.resx | 7 ++----- src/DynamoPackages/Properties/Resources.de-DE.resx | 7 ++----- src/DynamoPackages/Properties/Resources.es-ES.resx | 7 ++----- src/DynamoPackages/Properties/Resources.fr-FR.resx | 7 ++----- src/DynamoPackages/Properties/Resources.it-IT.resx | 7 ++----- src/DynamoPackages/Properties/Resources.ja-JP.resx | 7 ++----- src/DynamoPackages/Properties/Resources.ko-KR.resx | 7 ++----- src/DynamoPackages/Properties/Resources.pl-PL.resx | 7 ++----- src/DynamoPackages/Properties/Resources.pt-BR.resx | 7 ++----- src/DynamoPackages/Properties/Resources.ru-RU.resx | 7 ++----- src/DynamoPackages/Properties/Resources.zh-CN.resx | 7 ++----- src/DynamoPackages/Properties/Resources.zh-TW.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.cs-CZ.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.de-DE.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.es-ES.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.fr-FR.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.it-IT.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.ja-JP.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.ko-KR.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.pl-PL.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.pt-BR.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.ru-RU.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.zh-CN.resx | 7 ++----- src/Libraries/CoreNodes/Properties/Resources.zh-TW.resx | 7 ++----- 24 files changed, 48 insertions(+), 120 deletions(-) diff --git a/src/DynamoPackages/Properties/Resources.cs-CZ.resx b/src/DynamoPackages/Properties/Resources.cs-CZ.resx index 15550b019d9..840b8575d3f 100644 --- a/src/DynamoPackages/Properties/Resources.cs-CZ.resx +++ b/src/DynamoPackages/Properties/Resources.cs-CZ.resx @@ -1,4 +1,4 @@ - + + + + True + True + Resources.resx + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + \ No newline at end of file diff --git a/src/NodeServices/ExecutionSession.cs b/src/NodeServices/ExecutionSession.cs index 22d3301b37b..5fffaa1628b 100644 --- a/src/NodeServices/ExecutionSession.cs +++ b/src/NodeServices/ExecutionSession.cs @@ -1,4 +1,6 @@ +using System; using System.Collections.Generic; +using Dynamo.Events; namespace Dynamo.Session { @@ -83,8 +85,29 @@ public class ParameterKeys public static readonly string Logger = nameof(Logger); /// - /// + /// True if Dynamo is used in offline mode. /// public static readonly string NoNetworkMode = nameof(NoNetworkMode); } + + public static class ExecutionSessionHelper + { + /// + /// Throw exception in no-network mode. + /// This helper method can be used to display a warning on a node that + /// needs to be prevented from running when no-network mode is enabled. + /// + /// + public static void ThrowIfNoNetworkMode() + { + var session = ExecutionEvents.ActiveSession; + if (session != null) + { + if ((bool)session.GetParameterValue(ParameterKeys.NoNetworkMode)) + { + throw new Exception(DynamoServices.Properties.Resources.WebRequestOfflineWarning); + } + } + } + } } diff --git a/src/NodeServices/Properties/Resources.Designer.cs b/src/NodeServices/Properties/Resources.Designer.cs new file mode 100644 index 00000000000..7722b3a5469 --- /dev/null +++ b/src/NodeServices/Properties/Resources.Designer.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DynamoServices.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DynamoServices.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to The Web Request node is unavailable in No Network mode.. + /// + internal static string WebRequestOfflineWarning { + get { + return ResourceManager.GetString("WebRequestOfflineWarning", resourceCulture); + } + } + } +} diff --git a/src/NodeServices/Properties/Resources.en-US.resx b/src/NodeServices/Properties/Resources.en-US.resx new file mode 100644 index 00000000000..9091fe5abde --- /dev/null +++ b/src/NodeServices/Properties/Resources.en-US.resx @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The Web Request node is unavailable in No Network mode. + + diff --git a/src/NodeServices/Properties/Resources.resx b/src/NodeServices/Properties/Resources.resx new file mode 100644 index 00000000000..9091fe5abde --- /dev/null +++ b/src/NodeServices/Properties/Resources.resx @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The Web Request node is unavailable in No Network mode. + + From 3fe95ab89080a52f5bd3b310205144cc9464800f Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Wed, 21 May 2025 22:34:20 -0400 Subject: [PATCH 10/18] inject custom http client for no-network mode --- src/DynamoPackages/PackageManagerClient.cs | 33 ++----------------- src/DynamoPackages/PackageManagerExtension.cs | 29 ++++++++++++++-- 2 files changed, 29 insertions(+), 33 deletions(-) diff --git a/src/DynamoPackages/PackageManagerClient.cs b/src/DynamoPackages/PackageManagerClient.cs index 602ecffce7c..66aeed29628 100644 --- a/src/DynamoPackages/PackageManagerClient.cs +++ b/src/DynamoPackages/PackageManagerClient.cs @@ -2,7 +2,10 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net; +using System.Net.Http; using System.Text.Json; +using System.Threading; using System.Threading.Tasks; using Dynamo.Graph.Workspaces; using Greg; @@ -65,8 +68,6 @@ internal PackageManagerClient(IGregClient client, IPackageUploadBuilder builder, internal bool Upvote(string packageId) { - if (NoNetworkMode) return false; - return FailFunc.TryExecute(() => { var pkgResponse = this.client.ExecuteAndDeserialize(new Upvote(packageId)); @@ -76,8 +77,6 @@ internal bool Upvote(string packageId) internal List UserVotes() { - if (NoNetworkMode) return null; - var votes = FailFunc.TryExecute(() => { var nv = new GetUserVotes(); @@ -90,8 +89,6 @@ internal List UserVotes() internal List CompatibilityMap() { - if (NoNetworkMode) return null; - var compatibilityMap = FailFunc.TryExecute(() => { var cm = new GetCompatibilityMap(); @@ -109,8 +106,6 @@ internal PackageManagerResult DownloadPackage(string packageId, string version, { try { - if (NoNetworkMode) throw new Exception(DynamoPackages.Properties.Resources.DownloadPackageDisabled); - var response = this.client.Execute(new PackageDownload(packageId, version)); pathToPackage = PackageDownload.GetFileFromResponse(response); return PackageManagerResult.Succeeded(); @@ -124,8 +119,6 @@ internal PackageManagerResult DownloadPackage(string packageId, string version, internal IEnumerable ListAll() { - if (NoNetworkMode) return new List(); - return FailFunc.TryExecute(() => { var nv = HeaderCollectionDownload.ByEngine("dynamo"); var pkgResponse = this.client.ExecuteAndDeserializeWithContent>(nv); @@ -160,8 +153,6 @@ void CleanPackagesWithWrongVersions(List packages) /// internal PackageHeader GetPackageMaintainers(IPackageInfo packageInfo) { - if (NoNetworkMode) return null; - var header = FailFunc.TryExecute(() => { var nv = new GetMaintainers("dynamo", packageInfo.Name); @@ -178,8 +169,6 @@ internal PackageHeader GetPackageMaintainers(IPackageInfo packageInfo) /// internal UserPackages GetUsersLatestPackages() { - if (NoNetworkMode) return null; - var packages = FailFunc.TryExecute(() => { var nv = new GetMyPackages(); @@ -197,8 +186,6 @@ internal UserPackages GetUsersLatestPackages() /// Package version metadata internal PackageVersion GetPackageVersionHeader(IPackageInfo packageInfo) { - if (NoNetworkMode) return null; - var req = new HeaderVersionDownload("dynamo", packageInfo.Name, packageInfo.Version.ToString()); var pkgResponse = this.client.ExecuteAndDeserializeWithContent(req); if (!pkgResponse.success) @@ -216,8 +203,6 @@ internal PackageVersion GetPackageVersionHeader(IPackageInfo packageInfo) /// Package version metadata internal virtual PackageVersion GetPackageVersionHeader(string id, string version) { - if (NoNetworkMode) return null; - var req = new HeaderVersionDownload(id, version); var pkgResponse = this.client.ExecuteAndDeserializeWithContent(req); if (!pkgResponse.success) @@ -233,8 +218,6 @@ internal virtual PackageVersion GetPackageVersionHeader(string id, string versio /// internal virtual IEnumerable GetKnownHosts() { - if (NoNetworkMode) return null; - if (cachedHosts == null) { cachedHosts = FailFunc.TryExecute(() => @@ -259,8 +242,6 @@ public bool SetTermsOfUseAcceptanceStatus() private bool ExecuteTermsOfUseCall(bool queryAcceptanceStatus) { - if (NoNetworkMode) return false; - return FailFunc.TryExecute(() => { var request = new TermsOfUse(queryAcceptanceStatus); @@ -284,8 +265,6 @@ private bool ExecuteTermsOfUseCall(bool queryAcceptanceStatus) /// A Used to track the upload status. internal PackageUploadHandle PublishAsync(Package package, object files, IEnumerable markdownFiles, bool isNewVersion, IEnumerable roots, bool retainFolderStructure) { - if (NoNetworkMode) return null; - var packageUploadHandle = new PackageUploadHandle(PackageUploadBuilder.NewRequestBody(package)); Task.Factory.StartNew(() => @@ -349,8 +328,6 @@ internal void Publish(Package package, object files, IEnumerable markdow internal PackageManagerResult Deprecate(string name) { - if (NoNetworkMode) return null; - return FailFunc.TryExecute(() => { var pkgResponse = this.client.ExecuteAndDeserialize(new Deprecate(name, PackageEngineName)); @@ -360,8 +337,6 @@ internal PackageManagerResult Deprecate(string name) internal PackageManagerResult Undeprecate(string name) { - if (NoNetworkMode) return null; - return FailFunc.TryExecute(() => { var pkgResponse = this.client.ExecuteAndDeserialize(new Undeprecate(name, PackageEngineName)); @@ -371,8 +346,6 @@ internal PackageManagerResult Undeprecate(string name) internal bool DoesCurrentUserOwnPackage(Package package,string username) { - if (NoNetworkMode) return false; - bool value; if (packageMaintainers.Count > 0 && packageMaintainers.TryGetValue(package.Name, out value)) { return value; diff --git a/src/DynamoPackages/PackageManagerExtension.cs b/src/DynamoPackages/PackageManagerExtension.cs index 690db27912d..88b0b5739b6 100644 --- a/src/DynamoPackages/PackageManagerExtension.cs +++ b/src/DynamoPackages/PackageManagerExtension.cs @@ -2,7 +2,11 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; +using System.Net; +using System.Net.Http; using System.Reflection; +using System.Threading; +using System.Threading.Tasks; using Dynamo.Extensions; using Dynamo.Graph.Workspaces; using Dynamo.Interfaces; @@ -15,6 +19,25 @@ namespace Dynamo.PackageManager { public class PackageManagerExtension : IExtension, ILogSource, IExtensionSource { + private class NoNetworkModeHandler : DelegatingHandler + { + public NoNetworkModeHandler() : base(new HttpClientHandler()) + { + } + + protected override Task SendAsync( + HttpRequestMessage request, CancellationToken cancellationToken) + { + var json = "{\"success\":false,\"message\":\"Application is in offline mode\",\"content\":null}"; + var response = new HttpResponseMessage(HttpStatusCode.ServiceUnavailable) + { + Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"), + ReasonPhrase = "Offline Mode Enabled" + }; + return Task.FromResult(response); + } + } + #region Fields & Properties private Action RequestLoadNodeLibraryHandler; @@ -159,9 +182,9 @@ public void Startup(StartupParams startupParams) noNetworkMode = startupParams.NoNetworkMode; - PackageManagerClient = new PackageManagerClient( - new GregClient(startupParams.AuthProvider, url), - uploadBuilder, packageUploadDirectory, noNetworkMode); + var client = noNetworkMode ? new GregClient(startupParams.AuthProvider, url, + new HttpClient(new NoNetworkModeHandler())) : new GregClient(startupParams.AuthProvider, url); + PackageManagerClient = new PackageManagerClient(client, uploadBuilder, packageUploadDirectory, noNetworkMode); //we don't ask dpm for the compatibility map in offline mode. From 89c0e5c0801201bfd216ae7ad970dad222c0c69d Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Wed, 21 May 2025 22:30:38 -0400 Subject: [PATCH 11/18] cleanup --- doc/distrib/xml/en-US/DSCoreNodes.xml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/doc/distrib/xml/en-US/DSCoreNodes.xml b/doc/distrib/xml/en-US/DSCoreNodes.xml index cb80c61d387..348b8be3932 100644 --- a/doc/distrib/xml/en-US/DSCoreNodes.xml +++ b/doc/distrib/xml/en-US/DSCoreNodes.xml @@ -2187,7 +2187,7 @@ - Looks up a localized string similar to • Min and Max values must not be the same.. + Looks up a localized string similar to • Min and Max values must be different.. @@ -2390,11 +2390,6 @@ Looks up a localized string similar to The url cannot be null.. - - - Looks up a localized string similar to The Web Request node is unavailable in No Network mode.. - - Looks up a localized string similar to Use Image.WriteToFile node instead. From 0152a5bf61a51ed40761a6aeea6a00cbe55e0714 Mon Sep 17 00:00:00 2001 From: aparajit-pratap Date: Thu, 22 May 2025 09:45:10 -0400 Subject: [PATCH 12/18] Update src/NodeServices/ExecutionSession.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/NodeServices/ExecutionSession.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NodeServices/ExecutionSession.cs b/src/NodeServices/ExecutionSession.cs index 5fffaa1628b..da79e2566f2 100644 --- a/src/NodeServices/ExecutionSession.cs +++ b/src/NodeServices/ExecutionSession.cs @@ -105,7 +105,7 @@ public static void ThrowIfNoNetworkMode() { if ((bool)session.GetParameterValue(ParameterKeys.NoNetworkMode)) { - throw new Exception(DynamoServices.Properties.Resources.WebRequestOfflineWarning); + throw new InvalidOperationException(DynamoServices.Properties.Resources.WebRequestOfflineWarning); } } } From 465fab7f0a8268f30c8c9176e148e7c23060a31b Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Thu, 22 May 2025 12:43:20 -0400 Subject: [PATCH 13/18] refactor --- src/DynamoPackages/PackageManagerExtension.cs | 23 +-------------- src/NodeServices/ExecutionSession.cs | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/DynamoPackages/PackageManagerExtension.cs b/src/DynamoPackages/PackageManagerExtension.cs index 88b0b5739b6..2782118f0b9 100644 --- a/src/DynamoPackages/PackageManagerExtension.cs +++ b/src/DynamoPackages/PackageManagerExtension.cs @@ -2,16 +2,14 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; -using System.Net; using System.Net.Http; using System.Reflection; -using System.Threading; -using System.Threading.Tasks; using Dynamo.Extensions; using Dynamo.Graph.Workspaces; using Dynamo.Interfaces; using Dynamo.Logging; using Dynamo.Models; +using Dynamo.Session; using Greg; using Greg.Responses; @@ -19,25 +17,6 @@ namespace Dynamo.PackageManager { public class PackageManagerExtension : IExtension, ILogSource, IExtensionSource { - private class NoNetworkModeHandler : DelegatingHandler - { - public NoNetworkModeHandler() : base(new HttpClientHandler()) - { - } - - protected override Task SendAsync( - HttpRequestMessage request, CancellationToken cancellationToken) - { - var json = "{\"success\":false,\"message\":\"Application is in offline mode\",\"content\":null}"; - var response = new HttpResponseMessage(HttpStatusCode.ServiceUnavailable) - { - Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"), - ReasonPhrase = "Offline Mode Enabled" - }; - return Task.FromResult(response); - } - } - #region Fields & Properties private Action RequestLoadNodeLibraryHandler; diff --git a/src/NodeServices/ExecutionSession.cs b/src/NodeServices/ExecutionSession.cs index 5fffaa1628b..aa76184350e 100644 --- a/src/NodeServices/ExecutionSession.cs +++ b/src/NodeServices/ExecutionSession.cs @@ -1,5 +1,9 @@ using System; using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; using Dynamo.Events; namespace Dynamo.Session @@ -110,4 +114,28 @@ public static void ThrowIfNoNetworkMode() } } } + + /// + /// Custom HTTP message handler to simulate an "offline mode" (no-network mode) for network requests. + /// It can be used to intercept all outgoing HTTP requests and returns a predefined response indicating that the + /// application is offline. + /// + public class NoNetworkModeHandler : DelegatingHandler + { + public NoNetworkModeHandler() : base(new HttpClientHandler()) + { + } + + protected override Task SendAsync( + HttpRequestMessage request, CancellationToken cancellationToken) + { + var json = "{\"success\":false,\"message\":\"Application is in offline mode\",\"content\":null}"; + var response = new HttpResponseMessage(HttpStatusCode.ServiceUnavailable) + { + Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"), + ReasonPhrase = "Offline Mode Enabled" + }; + return Task.FromResult(response); + } + } } From 6af06b3bf3e0669cfbcf692366c9748fdcc91823 Mon Sep 17 00:00:00 2001 From: aparajit-pratap Date: Thu, 22 May 2025 22:18:12 -0400 Subject: [PATCH 14/18] Update src/Libraries/CoreNodeModels/WebRequest.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/Libraries/CoreNodeModels/WebRequest.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Libraries/CoreNodeModels/WebRequest.cs b/src/Libraries/CoreNodeModels/WebRequest.cs index 263d38a32cd..0f27f887a3c 100644 --- a/src/Libraries/CoreNodeModels/WebRequest.cs +++ b/src/Libraries/CoreNodeModels/WebRequest.cs @@ -2,9 +2,7 @@ using System.Collections.Generic; using CoreNodeModels.Properties; using DSCore; -using Dynamo.Events; using Dynamo.Graph.Nodes; -using Dynamo.Session; using Newtonsoft.Json; using ProtoCore.AST.AssociativeAST; From 60e6362280d8dfdf04e8c41eafea3c8d277dd571 Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Wed, 28 May 2025 12:22:15 -0400 Subject: [PATCH 15/18] reference latest package mgr client package --- src/DynamoCore/DynamoCore.csproj | 126 +++++++++--------- src/DynamoCoreWpf/DynamoCoreWpf.csproj | 80 +++++------ .../DynamoMLDataPipeline.csproj | 2 +- src/DynamoPackages/DynamoPackages.csproj | 2 +- .../PackageDetailsViewExtension.csproj | 2 +- .../NodeDocumentationMarkdownGenerator.csproj | 4 +- test/DynamoCoreTests/DynamoCoreTests.csproj | 2 +- .../DynamoCoreWpf2Tests.csproj | 2 +- .../DynamoCoreWpf3Tests.csproj | 2 +- .../DynamoCoreWpfTests.csproj | 2 +- .../PackageManagerTests.csproj | 2 +- 11 files changed, 113 insertions(+), 113 deletions(-) diff --git a/src/DynamoCore/DynamoCore.csproj b/src/DynamoCore/DynamoCore.csproj index 552fb51eb4b..8919efef341 100644 --- a/src/DynamoCore/DynamoCore.csproj +++ b/src/DynamoCore/DynamoCore.csproj @@ -31,10 +31,10 @@ - - - - + + + + @@ -130,22 +130,22 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -158,49 +158,49 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/DynamoCoreWpf/DynamoCoreWpf.csproj b/src/DynamoCoreWpf/DynamoCoreWpf.csproj index b9bb6a5b73a..7a78bdeb652 100644 --- a/src/DynamoCoreWpf/DynamoCoreWpf.csproj +++ b/src/DynamoCoreWpf/DynamoCoreWpf.csproj @@ -464,7 +464,7 @@ - + @@ -2262,19 +2262,19 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -2399,36 +2399,36 @@ - + - + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/src/DynamoMLDataPipeline/DynamoMLDataPipeline.csproj b/src/DynamoMLDataPipeline/DynamoMLDataPipeline.csproj index d70de1d7a9d..b22d6e79724 100644 --- a/src/DynamoMLDataPipeline/DynamoMLDataPipeline.csproj +++ b/src/DynamoMLDataPipeline/DynamoMLDataPipeline.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/DynamoPackages/DynamoPackages.csproj b/src/DynamoPackages/DynamoPackages.csproj index c409d05e0f5..6c116ff0f0c 100644 --- a/src/DynamoPackages/DynamoPackages.csproj +++ b/src/DynamoPackages/DynamoPackages.csproj @@ -30,7 +30,7 @@ - + diff --git a/src/PackageDetailsViewExtension/PackageDetailsViewExtension.csproj b/src/PackageDetailsViewExtension/PackageDetailsViewExtension.csproj index 43a12c841a1..af3c2c15b98 100644 --- a/src/PackageDetailsViewExtension/PackageDetailsViewExtension.csproj +++ b/src/PackageDetailsViewExtension/PackageDetailsViewExtension.csproj @@ -14,7 +14,7 @@ false - + diff --git a/src/Tools/NodeDocumentationMarkdownGenerator/NodeDocumentationMarkdownGenerator.csproj b/src/Tools/NodeDocumentationMarkdownGenerator/NodeDocumentationMarkdownGenerator.csproj index ecb421ac49b..4d323bdb7de 100644 --- a/src/Tools/NodeDocumentationMarkdownGenerator/NodeDocumentationMarkdownGenerator.csproj +++ b/src/Tools/NodeDocumentationMarkdownGenerator/NodeDocumentationMarkdownGenerator.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/test/DynamoCoreTests/DynamoCoreTests.csproj b/test/DynamoCoreTests/DynamoCoreTests.csproj index 678a9b0f7c0..fca4afde67b 100644 --- a/test/DynamoCoreTests/DynamoCoreTests.csproj +++ b/test/DynamoCoreTests/DynamoCoreTests.csproj @@ -34,7 +34,7 @@ - + all compile; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/DynamoCoreWpf2Tests/DynamoCoreWpf2Tests.csproj b/test/DynamoCoreWpf2Tests/DynamoCoreWpf2Tests.csproj index 8cd45eaa220..c66ee9af32a 100644 --- a/test/DynamoCoreWpf2Tests/DynamoCoreWpf2Tests.csproj +++ b/test/DynamoCoreWpf2Tests/DynamoCoreWpf2Tests.csproj @@ -36,7 +36,7 @@ - + all compile; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/DynamoCoreWpf3Tests/DynamoCoreWpf3Tests.csproj b/test/DynamoCoreWpf3Tests/DynamoCoreWpf3Tests.csproj index f18f32b9690..ed0d1e60e80 100644 --- a/test/DynamoCoreWpf3Tests/DynamoCoreWpf3Tests.csproj +++ b/test/DynamoCoreWpf3Tests/DynamoCoreWpf3Tests.csproj @@ -36,7 +36,7 @@ - + all compile; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/DynamoCoreWpfTests/DynamoCoreWpfTests.csproj b/test/DynamoCoreWpfTests/DynamoCoreWpfTests.csproj index ed9647d3705..86f9d74579a 100644 --- a/test/DynamoCoreWpfTests/DynamoCoreWpfTests.csproj +++ b/test/DynamoCoreWpfTests/DynamoCoreWpfTests.csproj @@ -37,7 +37,7 @@ - + all compile; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/Libraries/PackageManagerTests/PackageManagerTests.csproj b/test/Libraries/PackageManagerTests/PackageManagerTests.csproj index 94d85227180..2dd46a2fe1b 100644 --- a/test/Libraries/PackageManagerTests/PackageManagerTests.csproj +++ b/test/Libraries/PackageManagerTests/PackageManagerTests.csproj @@ -20,7 +20,7 @@ - + all compile; build; native; contentfiles; analyzers; buildtransitive From 6bf8e2e099ee7e4a89d6d3691ea5c0c70b36efbe Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Wed, 28 May 2025 12:34:18 -0400 Subject: [PATCH 16/18] resolve merge conflicts --- src/DynamoCore/DynamoCore.csproj | 4 ---- .../NodeDocumentationMarkdownGenerator.csproj | 2 -- 2 files changed, 6 deletions(-) diff --git a/src/DynamoCore/DynamoCore.csproj b/src/DynamoCore/DynamoCore.csproj index 7e33029ec7b..90f6f6b66f4 100644 --- a/src/DynamoCore/DynamoCore.csproj +++ b/src/DynamoCore/DynamoCore.csproj @@ -32,10 +32,6 @@ - - - - diff --git a/src/Tools/NodeDocumentationMarkdownGenerator/NodeDocumentationMarkdownGenerator.csproj b/src/Tools/NodeDocumentationMarkdownGenerator/NodeDocumentationMarkdownGenerator.csproj index 3665fc19991..3ae5d61e936 100644 --- a/src/Tools/NodeDocumentationMarkdownGenerator/NodeDocumentationMarkdownGenerator.csproj +++ b/src/Tools/NodeDocumentationMarkdownGenerator/NodeDocumentationMarkdownGenerator.csproj @@ -13,8 +13,6 @@ - - From 8465c48a534726bd8be5a81d7aef501b5dfe3260 Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Wed, 28 May 2025 12:43:32 -0400 Subject: [PATCH 17/18] review comments --- src/NodeServices/ExecutionSession.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NodeServices/ExecutionSession.cs b/src/NodeServices/ExecutionSession.cs index 901c1476b7c..db550990698 100644 --- a/src/NodeServices/ExecutionSession.cs +++ b/src/NodeServices/ExecutionSession.cs @@ -101,7 +101,7 @@ public static class ExecutionSessionHelper /// This helper method can be used to display a warning on a node that /// needs to be prevented from running when no-network mode is enabled. /// - /// + /// public static void ThrowIfNoNetworkMode() { var session = ExecutionEvents.ActiveSession; From 652881139a3e318e4bb2e9a8b4606a46ea217a92 Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Wed, 28 May 2025 17:20:00 -0400 Subject: [PATCH 18/18] add API to list --- src/DynamoCoreWpf/PublicAPI.Unshipped.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/DynamoCoreWpf/PublicAPI.Unshipped.txt b/src/DynamoCoreWpf/PublicAPI.Unshipped.txt index ace018da3a9..b5fc2e51946 100644 --- a/src/DynamoCoreWpf/PublicAPI.Unshipped.txt +++ b/src/DynamoCoreWpf/PublicAPI.Unshipped.txt @@ -2930,6 +2930,7 @@ Dynamo.ViewModels.PreferencesViewModel.UseHardwareAcceleration.get -> bool Dynamo.ViewModels.PreferencesViewModel.UseHardwareAcceleration.set -> void Dynamo.ViewModels.PreferencesViewModel.UseHostScaleUnits.get -> bool Dynamo.ViewModels.PreferencesViewModel.UseHostScaleUnits.set -> void +Dynamo.ViewModels.PreferencesViewModel.NoNetworkMode.get -> bool Dynamo.ViewModels.PreviewState Dynamo.ViewModels.PreviewState.ExecutionPreview = 1 -> Dynamo.ViewModels.PreviewState Dynamo.ViewModels.PreviewState.Hover = 2 -> Dynamo.ViewModels.PreviewState @@ -5922,4 +5923,4 @@ virtual Dynamo.Wpf.ViewModels.Watch3D.DefaultWatch3DViewModel.UpdateHelpers() -> virtual Dynamo.Wpf.ViewModels.Watch3D.DefaultWatch3DViewModel.ZoomToFit(object parameter) -> void virtual Dynamo.Wpf.ViewModels.Watch3D.HelixWatch3DViewModel.OnWatchExecution() -> void virtual Dynamo.Wpf.ViewModels.Watch3D.HelixWatch3DViewModel.UpdateUpstream() -> void -virtual UI.Prompts.PortPropertiesEditPrompt.OnPropertyChanged(System.ComponentModel.PropertyChangedEventArgs e) -> void +virtual UI.Prompts.PortPropertiesEditPrompt.OnPropertyChanged(System.ComponentModel.PropertyChangedEventArgs e) -> void \ No newline at end of file