internal PipPackageView(PipPackageCache provider, string name, string version, string description) { _provider = provider; _name = name ?? ""; if (!string.IsNullOrEmpty(version)) { Pep440Version.TryParse(version, out _version); } _description = description ?? ""; }
internal PipPackageView(PipPackageCache provider, string packageSpec, bool versionIsInstalled = true) { _provider = provider; Match m; try { m = PipListOutputRegex.Match(packageSpec); } catch (RegexMatchTimeoutException) { Debug.Fail("Regex timeout"); m = null; } if (m == null || !m.Success) { try { m = PipFreezeOutputRegex.Match(packageSpec); } catch (RegexMatchTimeoutException) { Debug.Fail("Regex timeout"); m = null; } if (m == null || !m.Success) { try { m = NameAndDescriptionRegex.Match(packageSpec); } catch (RegexMatchTimeoutException) { Debug.Fail("Regex timeout"); m = null; } } } Pep440Version version; if (m.Success) { _name = m.Groups["name"].Value; Pep440Version.TryParse(m.Groups["version"].Value, out version); } else { _name = packageSpec; version = Pep440Version.Empty; } var description = m.Groups["description"].Value; if (!string.IsNullOrEmpty(description)) { _description = Uri.UnescapeDataString(description); } if (versionIsInstalled) { _version = version; _upgradeVersion = null; } else { _version = Pep440Version.Empty; _upgradeVersion = version; } }
public async Task UpdatePackageInfoAsync(PipPackageView package, CancellationToken cancel) { string description = null; List <string> versions = null; using (var client = new WebClient()) { var data = await client.OpenReadTaskAsync(new Uri(_index ?? DefaultIndex, package.Name + "/json")); try { using (var reader = JsonReaderWriterFactory.CreateJsonReader(data, new XmlDictionaryReaderQuotas())) { var doc = XDocument.Load(reader); // TODO: Get package URL //url = (string)doc.Document // .Elements("root") // .Elements("info") // .Elements("package_url") // .FirstOrDefault(); description = (string)doc.Document .Elements("root") .Elements("info") .Elements("description") .FirstOrDefault(); versions = doc.Document .Elements("root") .Elements("releases") .Elements() .Attributes("item") .Select(a => a.Value) .ToList(); } } catch (InvalidOperationException) { } } cancel.ThrowIfCancellationRequested(); bool changed = false; await _cacheLock.WaitAsync(); try { PipPackageView inCache; if (!_cache.TryGetValue(package.Name, out inCache)) { inCache = _cache[package.Name] = new PipPackageView(this, package.Name, null, null); } if (!string.IsNullOrEmpty(description)) { var lines = description.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); var firstLine = string.Join( " ", lines.TakeWhile(s => !IsSeparatorLine(s)).Select(s => s.Trim()) ); if (firstLine.Length > 500) { firstLine = firstLine.Substring(0, 497) + "..."; } if (firstLine == "UNKNOWN") { firstLine = string.Empty; } inCache.Description = firstLine; package.Description = firstLine; changed = true; } if (versions != null) { var updateVersion = Pep440Version.TryParseAll(versions) .Where(v => v.IsFinalRelease) .OrderByDescending(v => v) .FirstOrDefault(); inCache.UpgradeVersion = updateVersion; package.UpgradeVersion = updateVersion; changed = true; } } finally { _cacheLock.Release(); } if (changed) { TriggerWriteCacheToDisk(); } }