From 2dabdd18752c9541876df7c1ced8a8dcf05f6a55 Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Mon, 28 Apr 2025 09:21:18 -0400 Subject: [PATCH 01/10] 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/10] 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/10] 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/10] 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/10] 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 cbb6ec56b0ad8e0b7634c8772b1062915b3c39d0 Mon Sep 17 00:00:00 2001 From: Aparajit Pratap Date: Wed, 21 May 2025 22:30:38 -0400 Subject: [PATCH 10/10] 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.