~ibmcharmers/charms/xenial/layer-ibm-db2-cent/trunk

« back to all changes in this revision

Viewing changes to .tox/py35/lib/python3.5/site-packages/pip/commands/show.py

  • Committer: Anita Nayak
  • Date: 2017-04-11 05:22:58 UTC
  • Revision ID: anitanayak@in.ibm.com-20170411052258-mmr7i6ychq424w2a
initial check-in for layer-ibm-db2-cent

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from __future__ import absolute_import
 
2
 
 
3
from email.parser import FeedParser
 
4
import logging
 
5
import os
 
6
 
 
7
from pip.basecommand import Command
 
8
from pip.status_codes import SUCCESS, ERROR
 
9
from pip._vendor import pkg_resources
 
10
from pip._vendor.packaging.utils import canonicalize_name
 
11
 
 
12
 
 
13
logger = logging.getLogger(__name__)
 
14
 
 
15
 
 
16
class ShowCommand(Command):
 
17
    """Show information about one or more installed packages."""
 
18
    name = 'show'
 
19
    usage = """
 
20
      %prog [options] <package> ..."""
 
21
    summary = 'Show information about installed packages.'
 
22
 
 
23
    def __init__(self, *args, **kw):
 
24
        super(ShowCommand, self).__init__(*args, **kw)
 
25
        self.cmd_opts.add_option(
 
26
            '-f', '--files',
 
27
            dest='files',
 
28
            action='store_true',
 
29
            default=False,
 
30
            help='Show the full list of installed files for each package.')
 
31
 
 
32
        self.parser.insert_option_group(0, self.cmd_opts)
 
33
 
 
34
    def run(self, options, args):
 
35
        if not args:
 
36
            logger.warning('ERROR: Please provide a package name or names.')
 
37
            return ERROR
 
38
        query = args
 
39
 
 
40
        results = search_packages_info(query)
 
41
        if not print_results(
 
42
                results, list_files=options.files, verbose=options.verbose):
 
43
            return ERROR
 
44
        return SUCCESS
 
45
 
 
46
 
 
47
def search_packages_info(query):
 
48
    """
 
49
    Gather details from installed distributions. Print distribution name,
 
50
    version, location, and installed files. Installed files requires a
 
51
    pip generated 'installed-files.txt' in the distributions '.egg-info'
 
52
    directory.
 
53
    """
 
54
    installed = {}
 
55
    for p in pkg_resources.working_set:
 
56
        installed[canonicalize_name(p.project_name)] = p
 
57
 
 
58
    query_names = [canonicalize_name(name) for name in query]
 
59
 
 
60
    for dist in [installed[pkg] for pkg in query_names if pkg in installed]:
 
61
        package = {
 
62
            'name': dist.project_name,
 
63
            'version': dist.version,
 
64
            'location': dist.location,
 
65
            'requires': [dep.project_name for dep in dist.requires()],
 
66
        }
 
67
        file_list = None
 
68
        metadata = None
 
69
        if isinstance(dist, pkg_resources.DistInfoDistribution):
 
70
            # RECORDs should be part of .dist-info metadatas
 
71
            if dist.has_metadata('RECORD'):
 
72
                lines = dist.get_metadata_lines('RECORD')
 
73
                paths = [l.split(',')[0] for l in lines]
 
74
                paths = [os.path.join(dist.location, p) for p in paths]
 
75
                file_list = [os.path.relpath(p, dist.location) for p in paths]
 
76
 
 
77
            if dist.has_metadata('METADATA'):
 
78
                metadata = dist.get_metadata('METADATA')
 
79
        else:
 
80
            # Otherwise use pip's log for .egg-info's
 
81
            if dist.has_metadata('installed-files.txt'):
 
82
                paths = dist.get_metadata_lines('installed-files.txt')
 
83
                paths = [os.path.join(dist.egg_info, p) for p in paths]
 
84
                file_list = [os.path.relpath(p, dist.location) for p in paths]
 
85
 
 
86
            if dist.has_metadata('PKG-INFO'):
 
87
                metadata = dist.get_metadata('PKG-INFO')
 
88
 
 
89
        if dist.has_metadata('entry_points.txt'):
 
90
            entry_points = dist.get_metadata_lines('entry_points.txt')
 
91
            package['entry_points'] = entry_points
 
92
 
 
93
        if dist.has_metadata('INSTALLER'):
 
94
            for line in dist.get_metadata_lines('INSTALLER'):
 
95
                if line.strip():
 
96
                    package['installer'] = line.strip()
 
97
                    break
 
98
 
 
99
        # @todo: Should pkg_resources.Distribution have a
 
100
        # `get_pkg_info` method?
 
101
        feed_parser = FeedParser()
 
102
        feed_parser.feed(metadata)
 
103
        pkg_info_dict = feed_parser.close()
 
104
        for key in ('metadata-version', 'summary',
 
105
                    'home-page', 'author', 'author-email', 'license'):
 
106
            package[key] = pkg_info_dict.get(key)
 
107
 
 
108
        # It looks like FeedParser cannot deal with repeated headers
 
109
        classifiers = []
 
110
        for line in metadata.splitlines():
 
111
            if line.startswith('Classifier: '):
 
112
                classifiers.append(line[len('Classifier: '):])
 
113
        package['classifiers'] = classifiers
 
114
 
 
115
        if file_list:
 
116
            package['files'] = sorted(file_list)
 
117
        yield package
 
118
 
 
119
 
 
120
def print_results(distributions, list_files=False, verbose=False):
 
121
    """
 
122
    Print the informations from installed distributions found.
 
123
    """
 
124
    results_printed = False
 
125
    for i, dist in enumerate(distributions):
 
126
        results_printed = True
 
127
        if i > 0:
 
128
            logger.info("---")
 
129
        logger.info("Name: %s", dist.get('name', ''))
 
130
        logger.info("Version: %s", dist.get('version', ''))
 
131
        logger.info("Summary: %s", dist.get('summary', ''))
 
132
        logger.info("Home-page: %s", dist.get('home-page', ''))
 
133
        logger.info("Author: %s", dist.get('author', ''))
 
134
        logger.info("Author-email: %s", dist.get('author-email', ''))
 
135
        logger.info("License: %s", dist.get('license', ''))
 
136
        logger.info("Location: %s", dist.get('location', ''))
 
137
        logger.info("Requires: %s", ', '.join(dist.get('requires', [])))
 
138
        if verbose:
 
139
            logger.info("Metadata-Version: %s",
 
140
                        dist.get('metadata-version', ''))
 
141
            logger.info("Installer: %s", dist.get('installer', ''))
 
142
            logger.info("Classifiers:")
 
143
            for classifier in dist.get('classifiers', []):
 
144
                logger.info("  %s", classifier)
 
145
            logger.info("Entry-points:")
 
146
            for entry in dist.get('entry_points', []):
 
147
                logger.info("  %s", entry.strip())
 
148
        if list_files:
 
149
            logger.info("Files:")
 
150
            for line in dist.get('files', []):
 
151
                logger.info("  %s", line.strip())
 
152
            if "files" not in dist:
 
153
                logger.info("Cannot locate installed-files.txt")
 
154
    return results_printed