private ResourceDependencyInfoContainer getDirResourceDeps(string parentDirPath, string version, string resourceName) { string depsFilePath = Path.Combine( parentDirPath, resourceName, version, resourceName + depsFileExtension ); string depsJson = File.ReadAllText(depsFilePath); DepsFileJson fileJson = JsonConvert.DeserializeObject <DepsFileJson>(depsJson); ResourceDependencyInfoContainer infoContainer = new ResourceDependencyInfoContainer(); // cloning List <DepsFileJson.DepsFileEntry> codeUninvestigated = fileJson.code.Select(x => x).ToList(); List <DepsFileJson.DepsFileEntry> dataUninvestigated = fileJson.data.Select(x => x).ToList(); List <DepsFileJson.DepsFileEntry> modelUninvestigated = fileJson.model.Select(x => x).ToList(); while (true) { string dependenciesOfDependencyPath = null; (List <DepsFileJson.DepsFileEntry>, Dictionary <string, ResourceDependencyInfoContainer.DependencyDescription>, List <DepsFileJson.DepsFileEntry>, string)[] resourceGroups =
public static ResourceDependencyInfoContainer getResourceDependencies(string prefix, ResourceType resourceType, string resourceName, string version) { string url = resourceDependenciesUrl(prefix, resourceType, resourceName, version); string serializedInfo; try { serializedInfo = client.GetStringAsync(url).Result; } catch (System.Exception) { throw new NetworkUtilsException("Unable to get list of package dependencies from server"); } try { ResourceDependencyInfoContainer dependencies = ResourceDependencyInfoContainer.deserialize(serializedInfo); return(dependencies); } catch (System.Exception) { throw new NetworkUtilsException("Unable to process server response to request for list of dependencies"); } }
public static void listDependencies(string prefix, ResourceIdentifier resourceDescription) { string resourceName = resourceDescription.resourceName; ResourceType resourceType = resourceDescription.resourceType; string version = resourceDescription.version; try { // check if this resource exists on server var availableResources = NetworkUtils.getAvailableResources(prefix, resourceType); if (!availableResources.resourceDescriptions.ContainsKey(resourceName)) { CLIInterface.logError($"{resourceType.ToString()} resource {resourceName} could not be found on server"); return; } if (version == null) { if ( FSOps.resourceFileExists(resourceType, resourceName) && FSOps.resourceVersionFileExists(resourceType, resourceName) ) { version = FSOps.getResourceVersion(resourceType, resourceName); } else { var versionInfo = NetworkUtils.getResourceVersions(prefix, resourceType, resourceName); version = versionInfo.latestVersion; } } // check if user-specified version exists on the server at the given version else { var versionInfo = NetworkUtils.getResourceVersions(prefix, resourceType, resourceName); if (!versionInfo.versions.ContainsKey(version)) { CLIInterface.logError("Server does not report having a version \"{version}\" available for {resourceName}"); } } CLIInterface.logLine($"Showing dependencies of {resourceName}, version {version}"); ResourceDependencyInfoContainer deps = NetworkUtils.getResourceDependencies(prefix, resourceType, resourceName, version); CLIInterface.PrintTable table = new CLIInterface.PrintTable { { "Resource Type", 13 }, { "Dependency Type", 15 }, { "Name of Resource", 15 }, { "Resource Version", 15 }, { "File Size", 10 }, }; var availableResourcesInfo = new Dictionary <ResourceType, AvailableResourcesInfoContainer> { { ResourceType.Code, NetworkUtils.getAvailableResources(prefix, ResourceType.Code) }, { ResourceType.Data, NetworkUtils.getAvailableResources(prefix, ResourceType.Data) }, { ResourceType.Model, NetworkUtils.getAvailableResources(prefix, ResourceType.Model) }, }; var showDepDict = new Dictionary <ResourceType, Dictionary <string, ResourceDependencyInfoContainer.DependencyDescription> >() { { ResourceType.Code, deps.codeDeps }, { ResourceType.Data, deps.dataDeps }, { ResourceType.Model, deps.modelDeps }, }; foreach (var(dependenciesType, descriptions) in showDepDict.Select(x => (x.Key, x.Value))) { foreach (var(dependencyName, dependencyDescription) in descriptions.Select(x => (x.Key, x.Value))) { table.addRow( dependenciesType.ToString(), dependencyDescription.isDirectDependency ? "direct" : "indirect", dependencyName, dependencyDescription.versionStr, bytesToString(availableResourcesInfo[dependenciesType].resourceDescriptions[dependencyName].byteCount) ); } } CLIInterface.logTable(table); } catch (FSOps.FSOpsException ex) { CLIInterface.logError($"File System Error: " + ex.Message); } catch (NetworkUtils.NetworkUtilsException ex) { CLIInterface.logError($"Network Error: {ex.Message}"); } }
public static void addPackage(string prefix, ResourceIdentifier resourceDescription) { try { ResourceType resourceType = resourceDescription.resourceType; string resourceName = resourceDescription.resourceName; // check if the resource is available from the server var availableResources = NetworkUtils.getAvailableResources(prefix, resourceType); if (!availableResources.resourceDescriptions.ContainsKey(resourceName)) { CLIInterface.logError($"No resource called {resourceName} is available from the server."); return; } string version = resourceDescription.version; // possible null var serverVersionInfo = NetworkUtils.getResourceVersions(prefix, resourceType, resourceName); if (version == null) { version = serverVersionInfo.latestVersion; } else { // check that the requested version is available from the server if (!serverVersionInfo.versions.ContainsKey(version)) { CLIInterface.logError( $"There is no version {version} available of resource {resourceName}. " + $"These are the version(s) available: {string.Join(", ", serverVersionInfo.versions.Keys.ToList())}" ); return; } } // check if nyoka directories exists if (!FSOps.hasNecessaryDirs()) { bool createDirs = CLIInterface.askYesOrNo( "Resource directories are not present in this directory. Create them now?" ); if (createDirs) { FSOps.createCodeDataModelDirs(logCreated: true); } else { CLIInterface.logLine("Package add aborted"); return; } } // check if the resource is already present if (FSOps.resourceFileExists(resourceType, resourceName)) { bool continueAnyways = CLIInterface.askYesOrNo( $"{resourceType.ToString()} resource {resourceName} is already present. Delete and replace ?" ); if (continueAnyways) { FSOps.removeResourceFilesIfPresent(resourceType, resourceName); } else { CLIInterface.logLine("Aborting resource add."); return; } } ResourceDependencyInfoContainer dependencies = NetworkUtils.getResourceDependencies(prefix, resourceType, resourceName, version); var depDescriptions = new Dictionary <ResourceType, Dictionary <string, ResourceDependencyInfoContainer.DependencyDescription> > { { ResourceType.Code, dependencies.codeDeps }, { ResourceType.Data, dependencies.dataDeps }, { ResourceType.Model, dependencies.modelDeps }, }; bool downloadDependencies = false; // if there package has any dependencies if (depDescriptions.Any(kvPair => kvPair.Value.Count != 0)) { CLIInterface.PrintTable table = new CLIInterface.PrintTable { { "Resource Type", 13 }, { "Dependency Type", 15 }, { "Name of Resource", 16 }, { "Resource Version", 16 }, { "File Size", 9 }, }; foreach (var(depResourceType, deps) in depDescriptions.Select(x => (x.Key, x.Value))) { foreach (var(depName, depDescription) in deps.Select(x => (x.Key, x.Value))) { table.addRow( depResourceType.ToString(), depDescription.isDirectDependency ? "direct" : "indirect", depName, depDescription.versionStr, bytesToString(depDescription.byteCount) ); } } CLIInterface.logLine($"Resource {resourceName} has these dependencies:"); CLIInterface.logTable(table); downloadDependencies = CLIInterface.askYesOrNo("Download these dependencies?"); if (downloadDependencies) { CLIInterface.logLine("Downloading dependencies"); } else { CLIInterface.logLine("Skipping downloading dependencies."); } } if (downloadDependencies) { var depsToDownload = new List <(ResourceType, string, string)>(); foreach (var(depResourceType, deps) in depDescriptions.Select(x => (x.Key, x.Value))) { foreach (var(depName, depDescription) in deps.Select(x => (x.Key, x.Value))) { bool continueWithDownload = true; // Ask user whether to overwrite file if a file with this name exists locally already if (FSOps.resourceFileExists(depResourceType, depName)) { if (FSOps.resourceVersionFileExists(depResourceType, depName)) { string depLocalVersion = FSOps.getResourceVersion(depResourceType, depName); if (depDescription.versionStr == depLocalVersion) { continueWithDownload = CLIInterface.askYesOrNo( $"Dependency {depName} file exists locally at the required version " + $"({depDescription.versionStr}). Overwrite this file?" ); } else { continueWithDownload = CLIInterface.askYesOrNo( $"Dependency {depName} file exists locally at version {depLocalVersion}" + $" (depency required version is {depDescription.versionStr}). Overwrite this file?" ); } } else { continueWithDownload = CLIInterface.askYesOrNo( $"Dependency {depName} file exists locally at an unknown version. Overwrite this file?" ); } } if (continueWithDownload) { depsToDownload.Add((depResourceType, depName, depDescription.versionStr)); } else { CLIInterface.logWarning($"Skipping download of dependency {depName}."); } } } foreach (var(depResourceType, depName, depVersion) in depsToDownload) { downloadPackage(prefix, depResourceType, depName, depVersion); } } downloadPackage(prefix, resourceType, resourceName, version); } catch (FSOps.FSOpsException ex) { CLIInterface.logError($"File System Error: " + ex.Message); } catch (NetworkUtils.NetworkUtilsException ex) { CLIInterface.logError($"Network Error: {ex.Message}"); } }