Example #1
0
 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 ?? "";
 }
Example #2
0
        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;
            }
        }
Example #3
0
        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();
            }
        }