def sync(self): """""" pypi = CheeseShop() for package in pypi.list_packages(): (pn, vers) = pypi.query_versions_pypi(package) for version in vers: # TODO: parse_* will not return anything for correct atoms atom = Enamer.construct_atom(Enamer.parse_pn(pn)[0], self.config.category, Enamer.parse_pv(version[0])) # we skip existing ebuilds if PortageUtils.ebuild_exists(atom): continue try: url = pypi.get_download_urls(pn, version)[0] # TODO: use setuptools way also except IndexError: log.warn('Skipping %s, no download url', atom) else: try: self.config.configs['argparse']['uri'] = url self.config.configs['argparse']['up_pn'] = pn self.config.configs['argparse']['up_pv'] = version gpypi = GPyPI(pn, version, self.config) gpypi.create_ebuilds() except KeyboardInterrupt: raise except: log.exception('Unexpected error occured during ebuild creation:')
def sync(self): """""" pypi = CheeseShop() for package in pypi.list_packages(): (pn, vers) = pypi.query_versions_pypi(package) for version in vers: # TODO: parse_* will not return anything for correct atoms atom = Enamer.construct_atom( Enamer.parse_pn(pn)[0], self.config.category, Enamer.parse_pv(version[0])) # we skip existing ebuilds if PortageUtils.ebuild_exists(atom): continue try: url = pypi.get_download_urls(pn, version)[0] # TODO: use setuptools way also except IndexError: log.warn('Skipping %s, no download url', atom) else: try: self.config.configs['argparse']['uri'] = url self.config.configs['argparse']['up_pn'] = pn self.config.configs['argparse']['up_pv'] = version gpypi = GPyPI(pn, version, self.config) gpypi.create_ebuilds() except KeyboardInterrupt: raise except: log.exception( 'Unexpected error occured during ebuild creation:')
class TestPyPi(BaseTestCase): """""" def setUp(self): self.pypi = CheeseShop() self.all_packages = [] for package in self.pypi.list_packages(): (pn, vers) = self.pypi.query_versions_pypi(package) for version in vers: try: url = self.pypi.get_download_urls(pn, version)[0] except IndexError: pass # TODO: log how many packages do not have URL else: self.all_packages.append((pn, version)) # TODO: cache entries with cPickle #def test_get_vars_against_pypi(self): #for package_name, version in self.all_packages: #try: #d = Enamer.get_vars(url, pn, version) #except: #pass ## TODO: maybe assert some of dictionary stuff? #self.fail('Fail!') def test_get_vars_against_pypi(self): for package_name, version in self.all_packages: #try: main(['create', package_name, version]) #except: #pass # TODO: maybe assert some of dictionary stuff? self.fail('Fail!')
class GPyPI(object): """ Main class for GPyPi interface :param package_name: case-insensitive package name :type package_name: string :param version: package version :type version: string :param options: command-line options :type options: ArgParse options """ def __init__(self, package_name, version, options): self.package_name = package_name self.version = version self.options = options self.tree = [(package_name, version)] self.pypi = CheeseShop() def create_ebuilds(self): """ Create ebuild for given package_name and any ebuilds for dependencies if needed. If no version is given we use the highest available. """ while len(self.tree): (project_name, version) = self.tree.pop(0) self.package_name = project_name self.version = version requires = self.do_ebuild() if requires: for req in requires: if self.options.no_deps: pass else: self.handle_dependencies(req.project_name) # TODO: disable some options after first ebuild is created #self.options.overwrite = False #self.options.category = None def handle_dependencies(self, project_name): """Add dependency if not already in self.tree""" pkgs = [] if len(self.tree): for deps in self.tree: pkgs.append(deps[0]) if project_name not in pkgs: # TODO: document that we can not query pypi with version spec or use distutils2 # for dependencies self.tree.append((project_name, None)) log.info("Dependency needed: %s" % project_name) def url_from_pypi(self): """ Query PyPI to find a package's URI :returns: source URL string """ try: return self.pypi.get_download_urls(self.package_name, self.version, pkg_type="source")[0] except IndexError: return None def url_from_setuptools(self): """ Use setuptools to find a package's URI :returns: source URL string or None """ #if self.options.subversion: # src_uri = get_download_uri(self.package_name, "dev", "source") #else: return get_download_uri(self.package_name, self.version, "source", self.options.index_url) def find_uri(self, method="all"): """ Returns download URI for package If no package version was given it returns highest available Setuptools should find anything xml-rpc can and more. :param method: download method can be 'xml-rpc', 'setuptools', or 'all' :type method: string :returns download_url string """ download_url = None if method == "all" or method == "xml-rpc": download_url = self.url_from_pypi() if (method == "all" or method == "setuptools") and not download_url: #Sometimes setuptools can find a package URI if PyPI doesn't have it download_url = self.url_from_setuptools() # TODO: configuratior log.debug("Package URI: %s " % download_url) return download_url def do_ebuild(self): """ Get SRC_URI using PyPI and attempt to create ebuild :returns: tuple with exit code and pkg_resources requirement """ #Get proper case for project name: (self.package_name, versions) = self.pypi.query_versions_pypi(self.package_name) if not versions: log.error("No package %s on PyPi." % self.package_name) return if self.version and (self.version not in versions): log.error("No package %s for version %s on PyPi." % (self.package_name, self.version)) return else: self.version = get_highest_version(versions) # TODO: self.options.uri only for first ebuild # TODO: make find_uri method configurable download_url = self.find_uri() log.info('Generating ebuild: %s %s', self.package_name, self.version) log.debug('URI from PyPi: %s', download_url) self.options.configs['argparse']['uri'] = download_url self.options.configs['argparse']['up_pn'] = self.package_name self.options.configs['argparse']['up_pv'] = self.version ebuild = Ebuild(self.options) ebuild.set_metadata(self.query_metadata()) if self.options.command == 'echo': ebuild.print_formatted() else: ebuild.create() return ebuild.requires def query_metadata(self): """ Get package metadata from PyPI :returns: metadata text """ if self.version: return self.pypi.release_data(self.package_name, self.version) else: (pn, vers) = self.pypi.query_versions_pypi(self.package_name) return self.pypi.release_data(self.package_name, get_highest_version(vers))