public void StringLicense_CorrectResult() { const string expected = "TestLicense"; string json = $"{{ \"license\": \"{expected}\" }}"; var npmPackage = NpmPackage.Deserialize(json); Assert.Equal(expected, npmPackage.License); }
public void TypeLicense_InvalidRepositoryFormat_CorrectResult() { const string expected = "TestLicense"; const string json = "{\"name\":\"pinkie\",\"version\":\"2.0.0\",\"description\":\"Itty\",\"license\":\"TestLicense\",\"repository\":\"x/y\",\"author\":{\"name\":\"My Name\",\"email\":\"[email protected]\",\"url\":\"github.com/xx\"},\"engines\":{\"node\":\">=0.10.0\"},\"scripts\":{\"test\":\"xo && nyc mocha\",\"coverage\":\"nyc report --reporter=text-lcov | coveralls\"},\"files\":[\"index.js\"],\"keywords\":[\"promise\",\"promises\",\"es2015\",\"es6\"],\"devDependencies\":{\"coveralls\":\"^2.11.4\",\"mocha\":\"*\",\"nyc\":\"^3.2.2\",\"promises-aplus-tests\":\"*\",\"xo\":\"^0.10.1\"},\"_id\":\"[email protected]\",\"_npmVersion\":\"0.0.0-fake\",\"_nodeVersion\":\"0.0.0-fake\",\"_shasum\":\"11737918d16ab5859a90a5a031b6f7e0d6f245cc\",\"_npmUser\":{\"name\":\"npm\",\"email\":\"[email protected]\"},\"_from\":\".\",\"dist\":{\"shasum\":\"11737918d16ab5859a90a5a031b6f7e0d6f245cc\",\"tarball\":\"https://registry.npmjs.org/xx\"},\"maintainers\":[{\"name\":\"bb\",\"email\":\"[email protected]\"}],\"directories\":{}}";; var npmPackage = NpmPackage.Deserialize(json); Assert.Equal(expected, npmPackage.License); }
public void TypeLicense_CorrectResult() { const string expected = "TestLicense"; string json = $"{{ \"name\": \"test-name\", \"version\": \"1.0.0\", \"license\": {{ \"type\": \"{expected}\", \"url\": \"https://test\" }} }}"; var npmPackage = NpmPackage.Deserialize(json); Assert.Equal(expected, npmPackage.License); }
private void Versions_OnSelectionChanged(object sender, SelectionChangedEventArgs e) { ListView versions = (ListView)sender; ListBoxItem item = versions.SelectedItem as ListViewItem; if (item == null) { return; } SelectedPackage = (NpmPackage)item.Tag; }
/// <summary> /// For each package in our registry.json, query NuGet, extract package metadata, and convert them to unity packages. /// </summary> private async Task BuildInternal() { var packageMetadataResource = _sourceRepository.GetResource <PackageMetadataResource>(); foreach (var packageDesc in _registry) { var packageName = packageDesc.Key; var packageEntry = packageDesc.Value; // A package entry is ignored but allowed in the registry (case of Microsoft.CSharp) if (packageEntry.Ignored) { continue; } var packageMetaIt = await packageMetadataResource.GetMetadataAsync(packageName, false, false, _sourceCacheContext, Logger, CancellationToken.None); var packageMetas = packageMetaIt.ToList(); foreach (var packageMeta in packageMetas) { var packageIdentity = packageMeta.Identity; var packageId = packageIdentity.Id.ToLowerInvariant(); var npmPackageId = $"{UnityScope}.{packageId}"; if (!packageEntry.Version.Satisfies(packageMeta.Identity.Version)) { continue; } PackageDependencyGroup netstd20Dependency = null; foreach (var dependencySet in packageMeta.DependencySets) { if (dependencySet.TargetFramework == NuGetFrameworkNetStandard20) { netstd20Dependency = dependencySet; break; } } if (netstd20Dependency == null) { Logger.LogWarning($"The package `{packageIdentity}` doesn't support `netstandard2.0`"); continue; } if (!_npmPackageRegistry.Packages.TryGetValue(npmPackageId, out var npmPackage)) { npmPackage = new NpmPackage(); _npmPackageRegistry.Packages.Add(npmPackageId, npmPackage); } // One NpmPackage (for package request) var packageInfoList = packageEntry.Listed ? _npmPackageRegistry.ListedPackageInfos : _npmPackageRegistry.UnlistedPackageInfos; if (!packageInfoList.Packages.TryGetValue(npmPackageId, out var npmPackageInfo)) { npmPackageInfo = new NpmPackageInfo(); packageInfoList.Packages.Add(npmPackageId, npmPackageInfo); } // Update latest version var currentVersion = packageIdentity.Version; var update = !npmPackage.DistTags.TryGetValue("latest", out var latestVersion) || (currentVersion > NuGetVersion.Parse(latestVersion)); string npmCurrentVersion = $"{currentVersion.Major}.{currentVersion.Minor}.{currentVersion.Patch}"; if (currentVersion.Revision != 0) { npmCurrentVersion += $"-{currentVersion.Revision}"; } if (update) { npmPackage.DistTags["latest"] = npmCurrentVersion; npmPackageInfo.Versions.Clear(); npmPackageInfo.Versions[npmCurrentVersion] = "latest"; npmPackage.Id = npmPackageId; npmPackage.License = packageMeta.LicenseMetadata?.License ?? packageMeta.LicenseUrl?.ToString(); npmPackage.Name = npmPackageId; npmPackageInfo.Name = npmPackageId; npmPackage.Description = packageMeta.Description; npmPackageInfo.Description = packageMeta.Description; npmPackageInfo.Author = packageMeta.Authors; if (packageMeta.Owners != null) { npmPackageInfo.Maintainers.Clear(); npmPackageInfo.Maintainers.AddRange(SplitCommaSeparatedString(packageMeta.Owners)); } if (packageMeta.Tags != null) { npmPackageInfo.Keywords.Clear(); npmPackageInfo.Keywords.Add("nuget"); npmPackageInfo.Keywords.AddRange(SplitCommaSeparatedString(packageMeta.Tags)); } } var npmVersion = new NpmPackageVersion { Id = $"{npmPackageId}@{npmCurrentVersion}", Version = npmCurrentVersion, Name = npmPackageId, Description = packageMeta.Description, Author = AuthorNameUnityGroup, DisplayName = $"{packageMeta.Title} ({npmPackageInfo.Author})" }; npmVersion.Distribution.Tarball = new Uri($"{RootHttpUrl}/{npmPackage.Id}/-/{GetUnityPackageFileName(packageIdentity, npmVersion)}"); npmVersion.Unity = MinimumUnityVersion; npmPackage.Versions[npmVersion.Version] = npmVersion; bool hasDependencyErrors = false; foreach (var deps in netstd20Dependency.Packages) { var depsId = deps.Id.ToLowerInvariant(); if (!_registry.TryGetValue(deps.Id, out var packageEntryDep)) { LogError($"The package `{packageIdentity}` has a dependency on `{deps.Id}` which is not in the registry. You must add this dependency to the registry.json file."); hasDependencyErrors = true; } else if (packageEntryDep.Ignored) { // A package that is ignored is not declared as an explicit dependency continue; } else if (!deps.VersionRange.IsSubSetOrEqualTo(packageEntryDep.Version)) { LogError($"The version range `{deps.VersionRange}` for the dependency `{deps.Id}` for the package `{packageIdentity}` doesn't match the range allowed from the registry.json: `{packageEntryDep.Version}`"); hasDependencyErrors = true; } // Otherwise add the package as a dependency npmVersion.Dependencies.Add($"{UnityScope}.{depsId}", deps.VersionRange.MinVersion.ToString()); } // If we don't have any dependencies error, generate the package if (!hasDependencyErrors) { await ConvertNuGetToUnityPackageIfDoesNotExist(packageIdentity, npmPackageInfo, npmVersion, packageMeta); npmPackage.Time[npmCurrentVersion] = packageMeta.Published?.UtcDateTime ?? GetUnityPackageFileInfo(packageIdentity, npmVersion).CreationTimeUtc; // Copy repository info if necessary if (update) { npmPackage.Repository = npmVersion.Repository?.Clone(); } } } } }
/// <summary> /// For each package in our registry.json, query NuGet, extract package metadata, and convert them to unity packages. /// </summary> private async Task BuildInternal() { var packageMetadataResource = _sourceRepository.GetResource <PackageMetadataResource>(); var versionPath = Path.Combine(_rootPersistentFolder, "version.txt"); var forceUpdate = !File.Exists(versionPath) || await File.ReadAllTextAsync(versionPath) != CurrentRegistryVersion; if (forceUpdate) { _logger.LogInformation($"Registry version changed to {CurrentRegistryVersion} - Regenerating all packages"); } var regexFilter = Filter != null ? new Regex(Filter, RegexOptions.IgnoreCase) : null; if (Filter != null) { _logger.LogInformation($"Filtering with regex: {Filter}"); } var onProgress = OnProgress; var progressCount = 0; foreach (var packageDesc in _registry) { var packageName = packageDesc.Key; var packageEntry = packageDesc.Value; // Log progress count onProgress?.Invoke(++progressCount, _registry.Count); // A package entry is ignored but allowed in the registry (case of Microsoft.CSharp) if (packageEntry.Ignored || (regexFilter != null && !regexFilter.IsMatch(packageName))) { continue; } var packageMetaIt = await packageMetadataResource.GetMetadataAsync(packageName, false, false, _sourceCacheContext, _logger, CancellationToken.None); var packageMetas = packageMetaIt.ToList(); foreach (var packageMeta in packageMetas) { var packageIdentity = packageMeta.Identity; var packageId = packageIdentity.Id.ToLowerInvariant(); var npmPackageId = $"{_unityScope}.{packageId}"; if (!packageEntry.Version.Satisfies(packageMeta.Identity.Version)) { continue; } var resolvedDependencyGroups = packageMeta.DependencySets.Where(dependencySet => dependencySet.TargetFramework.IsAny || _targetFrameworks.Any(targetFramework => dependencySet.TargetFramework == targetFramework.Framework)).ToList(); if (!packageEntry.Analyzer && resolvedDependencyGroups.Count == 0) { _logger.LogWarning($"The package `{packageIdentity}` doesn't support `{string.Join(",", _targetFrameworks.Select(x => x.Name))}`"); continue; } if (!_npmPackageRegistry.Packages.TryGetValue(npmPackageId, out var npmPackage)) { npmPackage = new NpmPackage(); _npmPackageRegistry.Packages.Add(npmPackageId, npmPackage); } // One NpmPackage (for package request) var packageInfoList = packageEntry.Listed ? _npmPackageRegistry.ListedPackageInfos : _npmPackageRegistry.UnlistedPackageInfos; if (!packageInfoList.Packages.TryGetValue(npmPackageId, out var npmPackageInfo)) { npmPackageInfo = new NpmPackageInfo(); packageInfoList.Packages.Add(npmPackageId, npmPackageInfo); } // Update latest version var currentVersion = packageIdentity.Version; var update = !npmPackage.DistTags.TryGetValue("latest", out var latestVersion) || (currentVersion > NuGetVersion.Parse(latestVersion)) || forceUpdate; string npmCurrentVersion = GetNpmVersion(currentVersion); if (update) { npmPackage.DistTags["latest"] = npmCurrentVersion; npmPackageInfo.Versions.Clear(); npmPackageInfo.Versions[npmCurrentVersion] = "latest"; npmPackage.Id = npmPackageId; npmPackage.License = packageMeta.LicenseMetadata?.License ?? packageMeta.LicenseUrl?.ToString(); npmPackage.Name = npmPackageId; npmPackageInfo.Name = npmPackageId; npmPackage.Description = packageMeta.Description; npmPackageInfo.Description = packageMeta.Description; npmPackageInfo.Author = packageMeta.Authors; if (packageMeta.Owners != null) { npmPackageInfo.Maintainers.Clear(); npmPackageInfo.Maintainers.AddRange(SplitCommaSeparatedString(packageMeta.Owners)); } if (packageMeta.Tags != null) { npmPackageInfo.Keywords.Clear(); npmPackageInfo.Keywords.Add("nuget"); npmPackageInfo.Keywords.AddRange(SplitCommaSeparatedString(packageMeta.Tags)); } } var npmVersion = new NpmPackageVersion { Id = $"{npmPackageId}@{npmCurrentVersion}", Version = npmCurrentVersion, Name = npmPackageId, Description = packageMeta.Description, Author = npmPackageInfo.Author, DisplayName = packageMeta.Title + _packageNameNuGetPostFix }; npmVersion.Distribution.Tarball = new Uri(_rootHttpUri, $"{npmPackage.Id}/-/{GetUnityPackageFileName(packageIdentity, npmVersion)}"); npmVersion.Unity = _minimumUnityVersion; npmPackage.Versions[npmVersion.Version] = npmVersion; bool hasDependencyErrors = false; foreach (var resolvedDependencyGroup in resolvedDependencyGroups) { foreach (var deps in resolvedDependencyGroup.Packages) { if (!_registry.TryGetValue(deps.Id, out var packageEntryDep)) { LogError($"The package `{packageIdentity}` has a dependency on `{deps.Id}` which is not in the registry. You must add this dependency to the registry.json file."); hasDependencyErrors = true; } else if (packageEntryDep.Ignored) { // A package that is ignored is not declared as an explicit dependency continue; } else if (!deps.VersionRange.IsSubSetOrEqualTo(packageEntryDep.Version)) { LogError($"The version range `{deps.VersionRange}` for the dependency `{deps.Id}` for the package `{packageIdentity}` doesn't match the range allowed from the registry.json: `{packageEntryDep.Version}`"); hasDependencyErrors = true; continue; } // Otherwise add the package as a dependency var depsId = deps.Id.ToLowerInvariant(); var key = $"{_unityScope}.{depsId}"; if (!npmVersion.Dependencies.ContainsKey(key)) { npmVersion.Dependencies.Add(key, GetNpmVersion(deps.VersionRange.MinVersion)); } } } // If we don't have any dependencies error, generate the package if (!hasDependencyErrors) { await ConvertNuGetToUnityPackageIfDoesNotExist(packageIdentity, npmPackageInfo, npmVersion, packageMeta, forceUpdate, packageEntry); npmPackage.Time[npmCurrentVersion] = packageMeta.Published?.UtcDateTime ?? GetUnityPackageFileInfo(packageIdentity, npmVersion).CreationTimeUtc; // Copy repository info if necessary if (update) { npmPackage.Repository = npmVersion.Repository?.Clone(); } } } } if (forceUpdate) { await File.WriteAllTextAsync(versionPath, CurrentRegistryVersion); } }
public void InstallPackageFailureTest() { string wd = "c:\\root\\project1"; Uri registry = null; NpmFactory factory = new MockNpmFactory(); NpmPackageManager target = new NpmPackageManager(factory, wd, registry); NpmPackage package = new NpmPackage("bogusmod", null); NpmException expected = MockTestData.ErrorInstallExpected(); try { target.InstallPackage(package); Assert.Fail("Expected exception"); } catch (NpmException ex) { Assert.IsNotNull(ex); Assert.AreEqual(expected.Message, ex.Message); Assert.AreEqual(expected.NpmCode, ex.NpmCode); Assert.AreEqual(expected.NpmErrno, ex.NpmErrno); Assert.AreEqual(expected.NpmFile, ex.NpmFile); Assert.AreEqual(expected.NpmPath, ex.NpmPath); Assert.AreEqual(expected.NpmType, ex.NpmType); Assert.AreEqual(expected.NpmSyscall, ex.NpmSyscall); Assert.AreEqual(expected.NpmSystem, ex.NpmSystem); Assert.AreEqual(expected.NpmCommand, ex.NpmCommand); Assert.AreEqual(expected.NpmNodeVersion, ex.NpmNodeVersion); Assert.AreEqual(expected.NpmNpmVersion, ex.NpmNpmVersion); Assert.AreEqual(expected.NpmMessage, ex.NpmMessage); Assert.AreEqual(expected.NpmArguments, ex.NpmArguments); Assert.AreEqual(expected.NpmCwd, ex.NpmCwd); Assert.AreEqual(expected.NpmVerbose, ex.NpmVerbose); } }
public void UpdatePackageTest() { string wd = "c:\\root\\update1"; Uri registry = null; NpmFactory factory = new MockNpmFactory(); NpmPackageManager target = new NpmPackageManager(factory, wd, registry); NpmPackage package = new NpmPackage("underscore", null); target.UpdatePackage(package); Assert.IsTrue(true); // no exception thrown }
public void InstallPackageTest() { string wd = "c:\\root\\project1"; Uri registry = null; NpmFactory factory = new MockNpmFactory(); NpmPackageManager target = new NpmPackageManager(factory, wd, registry); NpmPackage package = new NpmPackage("install1", null); target.InstallPackage(package); Assert.IsTrue(true); // no exception thrown }
public void FindDependenciesToBeInstalledMultiTest() { string wd = "c:\\root\\outdatedmulti"; Uri registry = null; NpmFactory factory = new MockNpmFactory(); NpmPackageManager target = new NpmPackageManager(factory, wd, registry); NpmPackage package = new NpmPackage("outdatedparent", null); List<NpmPackageDependency> expected = MockTestData.OutdatedMultiExpected(); IEnumerable<INpmPackageDependency> actual; actual = target.FindDependenciesToBeInstalled(package); Assert.IsNotNull(actual); Assert.AreEqual(expected.Count, actual.Count()); int index = 0; foreach (INpmPackageDependency actualItem in actual) { Assert.AreEqual(expected[index], actualItem, "item value differs"); index++; } }
public void InstallTest() { string wd = "c:\\root\\project1"; Uri registry = null; NpmFactory factory = new MockNpmFactory(); NpmApi target = new NpmApi(factory, wd, registry); NpmPackage package = new NpmPackage("install1", null); List<NpmInstalledPackage> expected = MockTestData.Install1Expected(); IEnumerable<INpmInstalledPackage> actual; actual = target.Install(package); Assert.IsNotNull(actual); Assert.AreEqual(expected.Count, actual.Count()); int index = 0; foreach (INpmInstalledPackage actualItem in actual) { Assert.AreEqual(expected[index], actualItem, "item value differs"); index++; } }
/// <summary> /// Execute UpdatePackage /// </summary> /// <param name="npm">NpmPackageManager instance</param> /// <param name="name">name of package</param> private static void DoUpdate(NpmPackageManager npm, string name) { NpmPackage pkg = new NpmPackage(name, null); npm.UpdatePackage(pkg); }
/// <summary> /// Execute UninstallPackage /// </summary> /// <param name="npm">NpmPackageManager instance</param> /// <param name="name">name of package</param> private static void DoUninstall(NpmPackageManager npm, string name) { NpmPackage pkg = new NpmPackage(name, null); npm.UninstallPackage(pkg); }
/// <summary> /// Input for IsInstalled /// </summary> /// <returns>Input for IsInstalled test</returns> public static NpmPackage List2MatchInstalledPackage() { NpmPackage package; package = new NpmPackage("bogus", null); return package; }
/// <summary> /// Input for IsInstalled test /// </summary> /// <returns>Input data for IsInstalled test</returns> public static NpmPackage List1MatchInstalledPackage() { NpmPackage package; package = new NpmPackage("xml2js", null); return package; }