def skeletonize(packages, output_dir=".", version=None, recursive=False, all_urls=False, pypi_url='https://pypi.python.org/pypi', noprompt=False, version_compare=False, python_version=default_python, manual_url=False, all_extras=False, noarch_python=False, config=None, setup_options=None, pin_numpy=False): client = get_xmlrpc_client(pypi_url) package_dicts = {} if not setup_options: setup_options = [] if isinstance(setup_options, string_types): setup_options = [setup_options] if not config: config = Config() # all_packages = client.list_packages() # searching is faster than listing all packages, but we need to separate URLs from names all_packages = [] urls = [package for package in packages if ':' in package] names = [package for package in packages if package not in urls] all_packages = urls + [match["name"] for match in client.search({"name": names}, "or")] all_packages_lower = [i.lower() for i in all_packages] created_recipes = [] while packages: package = packages.pop() created_recipes.append(package) is_url = ':' in package if not is_url: dir_path = join(output_dir, package.lower()) if exists(dir_path) and not version_compare: raise RuntimeError("directory already exists: %s" % dir_path) d = package_dicts.setdefault(package, { 'packagename': package.lower(), 'run_depends': '', 'build_depends': '', 'entry_points': '', 'build_comment': '# ', 'noarch_python_comment': '# ', 'test_commands': '', 'requires_comment': '#', 'tests_require': '', 'usemd5': '', 'test_comment': '', 'entry_comment': '# ', 'egg_comment': '# ', 'summary_comment': '', 'home_comment': '', }) if is_url: del d['packagename'] if is_url: d['version'] = 'UNKNOWN' else: versions = sorted(client.package_releases(package, True), key=parse_version) if version_compare: version_compare(versions) if version: if version not in versions: sys.exit("Error: Version %s of %s is not available on PyPI." % (version, package)) d['version'] = version else: if not versions: # The xmlrpc interface is case sensitive, but the index itself # is apparently not (the last time I checked, # len(set(all_packages_lower)) == len(set(all_packages))) if package.lower() in all_packages_lower: cased_package = all_packages[all_packages_lower.index(package.lower())] if cased_package != package: print("%s not found, trying %s" % (package, cased_package)) packages.append(cased_package) del package_dicts[package] continue sys.exit("Error: Could not find any versions of package %s" % package) if len(versions) > 1: print("Warning, the following versions were found for %s" % package) for ver in versions: print(ver) print("Using %s" % versions[-1]) print("Use --version to specify a different version.") d['version'] = versions[-1] data, d['pypiurl'], d['filename'], d['md5'] = get_download_data(client, package, d['version'], is_url, all_urls, noprompt, manual_url) if d['md5'] == '': d['usemd5'] = '# ' else: d['usemd5'] = '' d['import_tests'] = '' get_package_metadata(package, d, data, output_dir, python_version, all_extras, recursive, created_recipes, noarch_python, noprompt, packages, config=config, setup_options=setup_options) if d['import_tests'] == '': d['import_comment'] = '# ' else: d['import_comment'] = '' d['import_tests'] = INDENT + d['import_tests'] if d['tests_require'] == '': d['requires_comment'] = '# ' else: d['requires_comment'] = '' d['tests_require'] = INDENT + d['tests_require'] if d['entry_comment'] == d['import_comment'] == '# ': d['test_comment'] = '# ' d['recipe_setup_options'] = ' '.join(setup_options) # Change requirements to use format that guarantees the numpy # version will be pinned when the recipe is built and that # the version is included in the build string. if pin_numpy: for depends in ['build_depends', 'run_depends']: deps = d[depends].split(INDENT) numpy_dep = [idx for idx, dep in enumerate(deps) if 'numpy' in dep] if numpy_dep: # Turns out this needs to be inserted before the rest # of the numpy spec. deps.insert(numpy_dep[0], 'numpy x.x') d[depends] = INDENT.join(deps) for package in package_dicts: d = package_dicts[package] name = d['packagename'] makedirs(join(output_dir, name)) print("Writing recipe for %s" % package.lower()) with open(join(output_dir, name, 'meta.yaml'), 'w') as f: f.write(PYPI_META.format(**d)) with open(join(output_dir, name, 'build.sh'), 'w') as f: f.write(PYPI_BUILD_SH.format(**d)) with open(join(output_dir, name, 'bld.bat'), 'w') as f: f.write(PYPI_BLD_BAT.format(**d))
def _get_items(self): from conda_build.pypi import get_xmlrpc_client args = self.parsed_args client = get_xmlrpc_client(getattr(args, 'pypi_url')) return [i.lower() for i in client.list_packages()]