Ejemplo n.º 1
0
def get_dependencies(requires, setuptools_enabled=True):
    """Return the whole dependencies of the specified package
    :param list requires: List of requirements
    :param Bool setuptools_enabled: True if setuptools is enabled and False otherwise
    :return list: Return list of dependencies
    """
    list_deps = ["setuptools"] if setuptools_enabled else []

    for dep_text in requires:
        if isinstance(dep_text, string_types):
            dep_text = dep_text.splitlines()
        # Every item may be a single requirement
        #  or a multiline requirements string...
        for dep in dep_text:
            # ... and may also contain comments...
            dep = dep.split('#')[0].strip()
            if not dep:
                continue

            dep, marker = parse_dep_with_env_marker(dep)
            spec = spec_from_line(dep)

            if spec is None:
                sys.exit("Error: Could not parse: %s" % dep)

            if '~' in spec:
                version = spec.split()[-1]
                tilde_version = '~ {}'.format(version)
                pin_compatible = convert_version(version)
                spec = spec.replace(tilde_version, pin_compatible)

            if marker:
                spec = ' '.join((spec, marker))

            list_deps.append(spec)
    return list_deps
Ejemplo n.º 2
0
def get_package_metadata(package, d, data, output_dir, python_version,
                         all_extras, recursive, created_recipes, noarch_python,
                         noprompt, packages, extra_specs, config,
                         setup_options):

    print("Downloading %s" % package)
    print("PyPI URL: ", d['pypiurl'])
    pkginfo = get_pkginfo(package,
                          filename=d['filename'],
                          pypiurl=d['pypiurl'],
                          digest=d['digest'],
                          python_version=python_version,
                          extra_specs=extra_specs,
                          setup_options=setup_options,
                          config=config)

    setuptools_run = False

    # Look at the entry_points and construct console_script and
    #  gui_scripts entry_points for conda
    entry_points = pkginfo.get('entry_points', [])
    if entry_points:
        if isinstance(entry_points, str):
            # makes sure it is left-shifted
            newstr = "\n".join(x.strip() for x in entry_points.splitlines())
            _config = configparser.ConfigParser()
            entry_points = {}
            try:
                _config.readfp(StringIO(newstr))
            except Exception as err:
                print("WARNING: entry-points not understood: ", err)
                print("The string was", newstr)
                entry_points = pkginfo['entry_points']
            else:
                setuptools_run = True
                for section in _config.sections():
                    if section in ['console_scripts', 'gui_scripts']:
                        value = [
                            '%s=%s' % (option, _config.get(section, option))
                            for option in _config.options(section)
                        ]
                        entry_points[section] = value
        if not isinstance(entry_points, dict):
            print("WARNING: Could not add entry points. They were:")
            print(entry_points)
        else:
            cs = entry_points.get('console_scripts', [])
            gs = entry_points.get('gui_scripts', [])
            if isinstance(cs, string_types):
                cs = [cs]
            elif cs and isinstance(cs, list) and isinstance(cs[0], list):
                # We can have lists of lists here
                cs = [item for sublist in [s for s in cs] for item in sublist]
            if isinstance(gs, string_types):
                gs = [gs]
            elif gs and isinstance(gs, list) and isinstance(gs[0], list):
                gs = [item for sublist in [s for s in gs] for item in sublist]
            # We have *other* kinds of entry-points so we need
            # setuptools at run-time
            if set(entry_points.keys()) - {'console_scripts', 'gui_scripts'}:
                setuptools_run = True
            # TODO: Use pythonw for gui scripts
            entry_list = (cs + gs)
            if len(cs + gs) != 0:
                d['entry_points'] = entry_list
                d['test_commands'] = make_entry_tests(entry_list)

    requires = get_requirements(package, pkginfo, all_extras=all_extras)

    if requires or setuptools_run:
        deps = []
        if setuptools_run:
            deps.append('setuptools')
        for deptext in requires:
            if isinstance(deptext, string_types):
                deptext = deptext.splitlines()
            # Every item may be a single requirement
            #  or a multiline requirements string...
            for dep in deptext:
                # ... and may also contain comments...
                dep = dep.split('#')[0].strip()
                if dep:  # ... and empty (or comment only) lines
                    dep, marker = parse_dep_with_env_marker(dep)
                    spec = spec_from_line(dep)
                    if spec is None:
                        sys.exit("Error: Could not parse: %s" % dep)
                    if '~' in spec:
                        version = spec.split()[-1]
                        tilde_version = '~ {}'.format(version)
                        pin_compatible = convert_version(version)
                        spec = spec.replace(tilde_version, pin_compatible)
                    if marker:
                        spec = ' '.join((spec, marker))
                    deps.append(spec)

        if 'setuptools' in deps:
            setuptools_run = False
        d['build_depends'] = ['pip'] + deps
        # Never add setuptools to runtime dependencies.
        d['run_depends'] = deps

        if recursive:
            for dep in deps:
                dep = dep.split()[0]
                if not exists(join(output_dir, dep)):
                    if dep not in created_recipes:
                        packages.append(dep)

    if 'packagename' not in d:
        d['packagename'] = pkginfo['name'].lower()
    if d['version'] == 'UNKNOWN':
        d['version'] = pkginfo['version']

    if pkginfo.get('packages'):
        deps = set(pkginfo['packages'])
        if d['import_tests']:
            if not d['import_tests'] or d['import_tests'] == 'PLACEHOLDER':
                olddeps = []
            else:
                olddeps = [x for x in d['import_tests'].split() if x != '-']
            deps = set(olddeps) | deps
        d['import_tests'] = sorted(deps)

        d['tests_require'] = sorted([
            spec_from_line(pkg)
            for pkg in ensure_list(pkginfo['tests_require'])
        ])

    if pkginfo.get('home'):
        d['home'] = pkginfo['home']
    else:
        if data and 'home' in data:
            d['home'] = data['home']
        else:
            d['home'] = "The package home page"

    if pkginfo.get('summary'):
        if 'summary' in d and not d['summary']:
            # Need something here, use what the package had
            d['summary'] = pkginfo['summary']
    else:
        d['summary'] = "Summary of the package"

    license_classifier = "License :: OSI Approved :: "
    if pkginfo.get('classifiers'):
        licenses = [
            classifier.split(license_classifier, 1)[1]
            for classifier in pkginfo['classifiers']
            if classifier.startswith(license_classifier)
        ]
    elif data and 'classifiers' in data:
        licenses = [
            classifier.split(license_classifier, 1)[1]
            for classifier in data['classifiers']
            if classifier.startswith(license_classifier)
        ]
    else:
        licenses = []
    if not licenses:
        if pkginfo.get('license'):
            license_name = pkginfo['license']
        elif data and 'license' in data:
            license_name = data['license']
        else:
            license_name = None
        if license_name:
            if noprompt:
                pass
            elif '\n' not in license_name:
                print('Using "%s" for the license' % license_name)
            else:
                # Some projects put the whole license text in this field
                print("This is the license for %s" % package)
                print()
                print(license_name)
                print()
                license_name = input("What license string should I use? ")
        else:
            if noprompt:
                license_name = "UNKNOWN"
            else:
                license_name = input(
                    ("No license could be found for %s on " +
                     "PyPI or in the source. What license should I use? ") %
                    package)
    else:
        license_name = ' or '.join(licenses)
    # remove the word license from the license
    clean_license_name = re.subn('(.*)\s+license',
                                 r'\1',
                                 license_name,
                                 flags=re.IGNORECASE)[0]
    d['license'] = clean_license_name
    d['license_family'] = guess_license_family(license_name,
                                               allowed_license_families)
    if 'new_hash_value' in pkginfo:
        d['digest'] = pkginfo['new_hash_value']
Ejemplo n.º 3
0
def get_package_metadata(package, d, data, output_dir, python_version, all_extras,
                         recursive, created_recipes, noarch_python, noprompt, packages,
                         config, setup_options):

    print("Downloading %s" % package)

    pkginfo = get_pkginfo(package,
                          filename=d['filename'],
                          pypiurl=d['pypiurl'],
                          md5=d['md5'],
                          python_version=python_version,
                          setup_options=setup_options,
                          config=config)

    setuptools_build = pkginfo['setuptools']
    setuptools_run = False

    # Look at the entry_points and construct console_script and
    #  gui_scripts entry_points for conda
    entry_points = pkginfo['entry_points']
    if entry_points:
        if isinstance(entry_points, str):
            # makes sure it is left-shifted
            newstr = "\n".join(x.strip()
                                for x in entry_points.splitlines())
            _config = configparser.ConfigParser()
            entry_points = {}
            try:
                _config.readfp(StringIO(newstr))
            except Exception as err:
                print("WARNING: entry-points not understood: ",
                        err)
                print("The string was", newstr)
                entry_points = pkginfo['entry_points']
            else:
                setuptools_run = True
                for section in config.sections():
                    if section in ['console_scripts', 'gui_scripts']:
                        value = ['%s=%s' % (option, _config.get(section, option))
                                    for option in config.options(section)]
                        entry_points[section] = value
        if not isinstance(entry_points, dict):
            print("WARNING: Could not add entry points. They were:")
            print(entry_points)
        else:
            cs = entry_points.get('console_scripts', [])
            gs = entry_points.get('gui_scripts', [])
            if isinstance(cs, string_types):
                cs = [cs]
            if isinstance(gs, string_types):
                gs = [gs]
            # We have *other* kinds of entry-points so we need
            # setuptools at run-time
            if set(entry_points.keys()) - {'console_scripts', 'gui_scripts'}:
                setuptools_build = True
                setuptools_run = True
            # TODO: Use pythonw for gui scripts
            entry_list = (cs + gs)
            if len(cs + gs) != 0:
                d['entry_points'] = INDENT.join([''] + entry_list)
                d['entry_comment'] = ''
                d['build_comment'] = ''
                d['test_commands'] = INDENT.join([''] + make_entry_tests(entry_list))

    requires = get_requirements(package, pkginfo, all_extras=all_extras)

    if requires or setuptools_build or setuptools_run:
        deps = []
        if setuptools_run:
            deps.append('setuptools')
        for deptext in requires:
            if isinstance(deptext, string_types):
                deptext = deptext.splitlines()
            # Every item may be a single requirement
            #  or a multiline requirements string...
            for dep in deptext:
                # ... and may also contain comments...
                dep = dep.split('#')[0].strip()
                if dep:  # ... and empty (or comment only) lines
                    spec = spec_from_line(dep)
                    if spec is None:
                        sys.exit("Error: Could not parse: %s" % dep)
                    deps.append(spec)

        if 'setuptools' in deps:
            setuptools_build = False
            setuptools_run = False
            d['egg_comment'] = ''
            d['build_comment'] = ''
        d['build_depends'] = INDENT.join([''] +
                                            ['setuptools'] * setuptools_build +
                                            deps)
        d['run_depends'] = INDENT.join([''] +
                                        ['setuptools'] * setuptools_run +
                                        deps)

        if recursive:
            for dep in deps:
                dep = dep.split()[0]
                if not exists(join(output_dir, dep)):
                    if dep not in created_recipes:
                        packages.append(dep)

    if noarch_python:
        d['build_comment'] = ''
        d['noarch_python_comment'] = ''

    if 'packagename' not in d:
        d['packagename'] = pkginfo['name'].lower()
    if d['version'] == 'UNKNOWN':
        d['version'] = pkginfo['version']

    if pkginfo['packages']:
        deps = set(pkginfo['packages'])
        if d['import_tests']:
            if not d['import_tests'] or d['import_tests'] == 'PLACEHOLDER':
                olddeps = []
            else:
                olddeps = [x for x in d['import_tests'].split()
                        if x != '-']
            deps = set(olddeps) | deps
        d['import_tests'] = INDENT.join(sorted(deps))
        d['import_comment'] = ''

        d['tests_require'] = INDENT.join(sorted([spec_from_line(pkg) for pkg
                                                    in pkginfo['tests_require']]))

    if pkginfo['homeurl'] is not None:
        d['homeurl'] = pkginfo['homeurl']
    else:
        if data and 'homeurl' in data:
            d['homeurl'] = data['homeurl']
        else:
            d['homeurl'] = "The package home page"
            d['home_comment'] = '#'

    if pkginfo['summary']:
        d['summary'] = repr(pkginfo['summary'])
    else:
        if data:
            d['summary'] = repr(data['summary'])
        else:
            d['summary'] = "Summary of the package"
            d['summary_comment'] = '#'
    if d['summary'].startswith("u'") or d['summary'].startswith('u"'):
        d['summary'] = d['summary'][1:]

    license_classifier = "License :: OSI Approved :: "
    if pkginfo['classifiers']:
        licenses = [classifier.split(license_classifier, 1)[1] for
            classifier in pkginfo['classifiers'] if classifier.startswith(license_classifier)]
    elif data and 'classifiers' in data:
        licenses = [classifier.split(license_classifier, 1)[1] for classifier in
                data['classifiers'] if classifier.startswith(license_classifier)]
    else:
        licenses = []
    if not licenses:
        if pkginfo['license']:
            license_name = pkginfo['license']
        elif data and 'license' in data:
            license_name = data['license']
        else:
            license_name = None
        if license_name:
            if noprompt:
                pass
            elif '\n' not in license_name:
                print('Using "%s" for the license' % license_name)
            else:
                # Some projects put the whole license text in this field
                print("This is the license for %s" % package)
                print()
                print(license_name)
                print()
                license_name = input("What license string should I use? ")
        else:
            if noprompt:
                license_name = "UNKNOWN"
            else:
                license_name = input(("No license could be found for %s on " +
                                    "PyPI or in the source. What license should I use? ") %
                                package)
    else:
        license_name = ' or '.join(licenses)
    d['license'] = license_name
    d['license_family'] = guess_license_family(license_name, allowed_license_families)
Ejemplo n.º 4
0
def get_tests_require(pkginfo):
    return sorted(
        [spec_from_line(pkg) for pkg in ensure_list(pkginfo['tests_require'])])
Ejemplo n.º 5
0
def get_dependencies(requires, setuptools_enabled=True):
    """Return the whole dependencies of the specified package
    :param list requires: List of requirements
    :param Bool setuptools_enabled: True if setuptools is enabled and False otherwise
    :return list: Return list of dependencies
    """

    # START :: Copied from conda
    # These can be removed if we want to drop support for conda <= 4.9.0
    def _strip_comment(line):
        return line.split('#')[0].rstrip()

    def _spec_from_line(line):
        spec_pat = re.compile(
            r'(?P<name>[^=<>!\s]+)'  # package name  # lgtm [py/regex/unmatchable-dollar]
            r'\s*'  # ignore spaces
            r'('
            r'(?P<cc>=[^=]+(=[^=]+)?)'  # conda constraint
            r'|'
            r'(?P<pc>(?:[=!]=|[><]=?|~=).+)'  # new (pip-style) constraint(s)
            r')?$',
            re.VERBOSE)  # lgtm [py/regex/unmatchable-dollar]
        m = spec_pat.match(_strip_comment(line))
        if m is None:
            return None
        name, cc, pc = (m.group('name').lower(), m.group('cc'), m.group('pc'))
        if cc:
            return name + cc.replace('=', ' ')
        elif pc:
            if pc.startswith('~= '):
                assert pc.count('~=') == 1, \
                    "Overly complex 'Compatible release' spec not handled {}".format(line)
                assert pc.count(
                    '.'), "No '.' in 'Compatible release' version {}".format(
                        line)
                ver = pc.replace('~= ', '')
                ver2 = '.'.join(ver.split('.')[:-1]) + '.*'
                return name + ' >=' + ver + ',==' + ver2
            else:
                return name + ' ' + pc.replace(' ', '')
        else:
            return name

    # END :: Copied from conda

    list_deps = ["setuptools"] if setuptools_enabled else []

    for dep_text in requires:
        if isinstance(dep_text, string_types):
            dep_text = dep_text.splitlines()
        # Every item may be a single requirement
        #  or a multiline requirements string...
        for dep in dep_text:
            # ... and may also contain comments...
            dep = dep.split('#')[0].strip()
            if not dep:
                continue

            dep_orig = dep
            dep, marker = parse_dep_with_env_marker(dep_orig)
            # if '~' in dep_orig:
            #     # dep_orig = 'kubernetes ~= 11'
            #     version = dep_orig.split()[-1]
            #     tilde_version = '~= {}'.format(version)
            #     pin_compatible = convert_version(version)
            #     spec = dep_orig.replace(tilde_version, pin_compatible)
            #     spec2 = spec_from_line(dep)
            #     if spec != spec2:
            #         print("Disagreement on PEP440 'Compatible release' {} vs {}".format(spec, spec2))
            spec = spec_from_line(dep)
            if '~=' in dep_orig:
                spec = None

            if spec is None:
                if '~=' in dep_orig:
                    log = logging.getLogger(__name__)
                    log.warning(
                        "Your conda is too old to handle ~= PEP440 'Compatible versions', "
                        "using copied implementation.")
                    spec = _spec_from_line(dep_orig)
                if spec is None:
                    sys.exit("Error: Could not parse: %s" % dep)

            if marker:
                spec = ' '.join((spec, marker))

            list_deps.append(spec)
    return list_deps
Ejemplo n.º 6
0
    def run(self):
        # Make sure the metadata has the conda attributes, even if the
        # distclass isn't CondaDistribution. We primarily do this to simplify
        # the code below.

        metadata = self.distribution.metadata

        for attr in CondaDistribution.conda_attrs:
            if not hasattr(metadata, attr):
                setattr(metadata, attr, CondaDistribution.conda_attrs[attr])

        # The command line takes precedence
        if self.buildnum is not None:
            metadata.conda_buildnum = self.buildnum

        d = defaultdict(dict)
        # PyPI allows uppercase letters but conda does not, so we fix the
        # name here.
        d['package']['name'] = metadata.name.lower()
        d['package']['version'] = metadata.version
        d['build']['number'] = metadata.conda_buildnum

        # MetaData does the auto stuff if the build string is None
        d['build']['string'] = metadata.conda_buildstr

        d['build']['binary_relocation'] = metadata.conda_binary_relocation
        d['build']['preserve_egg_dir'] = metadata.conda_preserve_egg_dir
        d['build']['features'] = metadata.conda_features
        d['build']['track_features'] = metadata.conda_track_features

        # XXX: I'm not really sure if it is correct to combine requires
        # and install_requires
        d['requirements']['run'] = d['requirements']['build'] = \
            [spec_from_line(i) for i in
                (metadata.requires or []) +
                (getattr(self.distribution, 'install_requires', []) or
                    [])] + ['python']
        if hasattr(self.distribution, 'tests_require'):
            # A lot of packages use extras_require['test'], but
            # tests_require is the one that is officially supported by
            # setuptools.
            d['test']['requires'] = [
                spec_from_line(i)
                for i in self.distribution.tests_require or []
            ]

        d['about']['home'] = metadata.url
        # Don't worry about classifiers. This isn't skeleton pypi. We
        # don't need to make this work with random stuff in the wild. If
        # someone writes their setup.py wrong and this doesn't work, it's
        # their fault.
        d['about']['license'] = metadata.license
        d['about']['summary'] = metadata.description

        # This is similar logic from conda skeleton pypi
        entry_points = getattr(self.distribution, 'entry_points', [])
        if entry_points:
            if isinstance(entry_points, string_types):
                # makes sure it is left-shifted
                newstr = "\n".join(x.strip()
                                   for x in entry_points.splitlines())
                c = configparser.ConfigParser()
                entry_points = {}
                try:
                    c.read_file(StringIO(newstr))
                except Exception as err:
                    # This seems to be the best error here
                    raise DistutilsGetoptError(
                        "ERROR: entry-points not understood: " + str(err) +
                        "\nThe string was" + newstr)
                else:
                    for section in c.sections():
                        if section in ['console_scripts', 'gui_scripts']:
                            value = [
                                f'{option}={c.get(section, option)}'
                                for option in c.options(section)
                            ]
                            entry_points[section] = value
                        else:
                            # Make sure setuptools is added as a dependency below
                            entry_points[section] = None

            if not isinstance(entry_points, dict):
                raise DistutilsGetoptError(
                    "ERROR: Could not add entry points. They were:\n" +
                    entry_points)
            else:
                rs = entry_points.get('scripts', [])
                cs = entry_points.get('console_scripts', [])
                gs = entry_points.get('gui_scripts', [])
                # We have *other* kinds of entry-points so we need
                # setuptools at run-time
                if not rs and not cs and not gs and len(entry_points) > 1:
                    d['requirements']['run'].append('setuptools')
                    d['requirements']['build'].append('setuptools')
                entry_list = rs + cs + gs
                if gs and self.config.platform == 'osx':
                    d['build']['osx_is_app'] = True
                if len(cs + gs) != 0:
                    d['build']['entry_points'] = entry_list
                    if metadata.conda_command_tests is True:
                        d['test']['commands'] = list(
                            map(unicode, pypi.make_entry_tests(entry_list)))

        if 'setuptools' in d['requirements']['run']:
            d['build']['preserve_egg_dir'] = True

        if metadata.conda_import_tests:
            if metadata.conda_import_tests is True:
                d['test']['imports'] = ((self.distribution.packages or []) +
                                        (self.distribution.py_modules or []))
            else:
                d['test']['imports'] = metadata.conda_import_tests

        if (metadata.conda_command_tests
                and not isinstance(metadata.conda_command_tests, bool)):
            d['test']['commands'] = list(
                map(unicode, metadata.conda_command_tests))

        d = dict(d)
        self.config.keep_old_work = True
        m = MetaData.fromdict(d, config=self.config)
        # Shouldn't fail, but do you really trust the code above?
        m.check_fields()
        m.config.set_build_id = False
        m.config.variant['python'] = ".".join(
            (str(sys.version_info.major), str(sys.version_info.minor)))
        api.build(m, build_only=True, notest=True)
        self.config = m.config
        # prevent changes in the build ID from here, so that we're working in the same prefix
        # Do the install
        if not PY3:
            # Command is an old-style class in Python 2
            install.run(self)
        else:
            super().run()
        output = api.build(m, post=True, notest=True)[0]
        api.test(output, config=m.config)
        m.config.clean()
        if self.anaconda_upload:

            class args:
                anaconda_upload = self.anaconda_upload

            handle_anaconda_upload(output, args)
        else:
            no_upload_message = """\
# If you want to upload this package to anaconda.org later, type:
#
# $ anaconda upload %s
""" % output
            print(no_upload_message)
Ejemplo n.º 7
0
    def run(self):
        # Make sure the metadata has the conda attributes, even if the
        # distclass isn't CondaDistribution. We primarily do this to simplify
        # the code below.

        metadata = self.distribution.metadata

        for attr in CondaDistribution.conda_attrs:
            if not hasattr(metadata, attr):
                setattr(metadata, attr,
                    CondaDistribution.conda_attrs[attr])

        # The command line takes precedence
        if self.buildnum is not None:
            metadata.conda_buildnum = self.buildnum

        d = defaultdict(dict)
        # PyPI allows uppercase letters but conda does not, so we fix the
        # name here.
        d['package']['name'] = metadata.name.lower()
        d['package']['version'] = metadata.version
        d['build']['number'] = metadata.conda_buildnum

        # MetaData does the auto stuff if the build string is None
        d['build']['string'] = metadata.conda_buildstr

        d['build']['binary_relocation'] = metadata.conda_binary_relocation
        d['build']['preserve_egg_dir'] = metadata.conda_preserve_egg_dir
        d['build']['features'] = metadata.conda_features
        d['build']['track_features'] = metadata.conda_track_features

        # XXX: I'm not really sure if it is correct to combine requires
        # and install_requires
        d['requirements']['run'] = d['requirements']['build'] = \
            [spec_from_line(i) for i in
                (metadata.requires or []) +
                (getattr(self.distribution, 'install_requires', []) or
                    [])] + ['python']
        if hasattr(self.distribution, 'tests_require'):
            # A lot of packages use extras_require['test'], but
            # tests_require is the one that is officially supported by
            # setuptools.
            d['test']['requires'] = [spec_from_line(i) for i in
                self.distribution.tests_require or []]

        d['about']['home'] = metadata.url
        # Don't worry about classifiers. This isn't skeleton pypi. We
        # don't need to make this work with random stuff in the wild. If
        # someone writes their setup.py wrong and this doesn't work, it's
        # their fault.
        d['about']['license'] = metadata.license
        d['about']['summary'] = metadata.description

        # This is similar logic from conda skeleton pypi
        entry_points = getattr(self.distribution, 'entry_points', [])
        if entry_points:
            if isinstance(entry_points, string_types):
                # makes sure it is left-shifted
                newstr = "\n".join(x.strip() for x in
                    entry_points.splitlines())
                c = configparser.ConfigParser()
                entry_points = {}
                try:
                    c.readfp(StringIO(newstr))
                except Exception as err:
                    # This seems to be the best error here
                    raise DistutilsGetoptError("ERROR: entry-points not understood: " +
                                                str(err) + "\nThe string was" + newstr)
                else:
                    for section in c.sections():
                        if section in ['console_scripts', 'gui_scripts']:
                            value = ['%s=%s' % (option, c.get(section, option))
                                        for option in c.options(section)]
                            entry_points[section] = value
                        else:
                            # Make sure setuptools is added as a dependency below
                            entry_points[section] = None

            if not isinstance(entry_points, dict):
                raise DistutilsGetoptError("ERROR: Could not add entry points. They were:\n" +
                                            entry_points)
            else:
                rs = entry_points.get('scripts', [])
                cs = entry_points.get('console_scripts', [])
                gs = entry_points.get('gui_scripts', [])
                # We have *other* kinds of entry-points so we need
                # setuptools at run-time
                if not rs and not cs and not gs and len(entry_points) > 1:
                    d['requirements']['run'].append('setuptools')
                    d['requirements']['build'].append('setuptools')
                entry_list = rs + cs + gs
                if gs and self.config.platform == 'osx':
                    d['build']['osx_is_app'] = True
                if len(cs + gs) != 0:
                    d['build']['entry_points'] = entry_list
                    if metadata.conda_command_tests is True:
                        d['test']['commands'] = list(map(unicode,
                                                            pypi.make_entry_tests(entry_list)))

        if 'setuptools' in d['requirements']['run']:
            d['build']['preserve_egg_dir'] = True

        if metadata.conda_import_tests:
            if metadata.conda_import_tests is True:
                d['test']['imports'] = ((self.distribution.packages or []) +
                                        (self.distribution.py_modules or []))
            else:
                d['test']['imports'] = metadata.conda_import_tests

        if (metadata.conda_command_tests and not
                isinstance(metadata.conda_command_tests,
                bool)):
            d['test']['commands'] = list(map(unicode, metadata.conda_command_tests))

        d = dict(d)
        m = MetaData.fromdict(d, config=self.config)
        # Shouldn't fail, but do you really trust the code above?
        m.check_fields()
        m.config.set_build_id = False
        m.config.keep_old_work = True
        api.build(m, build_only=True)
        # prevent changes in the build ID from here, so that we're working in the same prefix
        # Do the install
        if not PY3:
            # Command is an old-style class in Python 2
            install.run(self)
        else:
            super().run()
        m.config.keep_old_work = False
        api.build(m, post=True)
        api.test(m)
        output_file = api.get_output_file_path(m)
        if self.anaconda_upload:
            class args:
                anaconda_upload = self.anaconda_upload
            handle_anaconda_upload(output_file, args)
        else:
            no_upload_message = """\
# If you want to upload this package to anaconda.org later, type:
#
# $ anaconda upload %s
""" % output_file
            print(no_upload_message)