Esempio n. 1
0
    def from_target(cls, config, target, conn_timeout=None):
        from twitter.common.python.fetcher import PyPIFetcher, Fetcher
        from twitter.common.python.resolver import Resolver
        from twitter.common.python.http import Crawler
        from twitter.common.quantity import Amount, Time

        conn_timeout_amount = Amount(
            conn_timeout, Time.SECONDS) if conn_timeout is not None else None

        crawler = Crawler(cache=config.get('python-setup', 'download_cache'),
                          conn_timeout=conn_timeout_amount)

        fetchers = []
        fetchers.extend(
            Fetcher([url])
            for url in config.getlist('python-repos', 'repos', []))
        fetchers.extend(
            PyPIFetcher(url)
            for url in config.getlist('python-repos', 'indices', []))

        platforms = config.getlist('python-setup', 'platforms', ['current'])
        if isinstance(target, PythonBinary) and target.platforms:
            platforms = target.platforms

        return cls(platforms=get_platforms(platforms),
                   resolver=Resolver(cache=config.get('python-setup',
                                                      'install_cache'),
                                     crawler=crawler,
                                     fetchers=fetchers,
                                     install_cache=config.get(
                                         'python-setup', 'install_cache'),
                                     conn_timeout=conn_timeout_amount))
Esempio n. 2
0
    def main(cls):
        from itertools import chain
        from twitter.common.python.distiller import Distiller
        from twitter.common.python.fetcher import Fetcher, PyPIFetcher
        from twitter.common.python.http import Crawler
        from twitter.common.python.installer import Installer
        from twitter.common.python.obtainer import Obtainer
        from twitter.common.python.resolver import Resolver
        from twitter.common.python.translator import Translator

        parser = cls.configure_clp()
        options, args = parser.parse_args()
        cls.process_logging_options(options)
        cls.exit_on_erroneous_inputs(options, parser)

        pex_builder = PEXBuilder()

        fetchers = [Fetcher(options.repos)]
        if options.use_pypi:
            fetchers.append(PyPIFetcher())
        resolver = Resolver(cache=options.cache_dir,
                            fetchers=fetchers,
                            install_cache=options.cache_dir)
        reqs = cls.get_all_valid_reqs(options.requirements,
                                      options.requirements_txt)
        cls.logger.info("Requirements specified: " + str(reqs))
        resolveds = resolver.resolve(reqs)
        cls.logger.info("Resolved requirements: " + str(resolveds))
        for pkg in resolveds:
            cls.logger.info("Adding to PEX: Distribution: {0}".format(pkg))
            pex_builder.add_distribution(pkg)
            pex_builder.add_requirement(pkg.as_requirement())
        for source_dir in options.source_dirs:
            dist = Installer(source_dir).distribution()
            egg_path = Distiller(dist).distill()
            cls.logger.info(
                "Adding source dir to PEX: {0} distilled into egg {1}".format(
                    source_dir, egg_path))
            pex_builder.add_egg(egg_path)
        if options.entry_point is not None:
            if options.entry_point.endswith(".py"):
                cls.logger.info("Adding entry point to PEX: File: {0}".format(
                    options.entry_point))
                pex_builder.set_executable(options.entry_point)
            elif ":" in options.entry_point:
                cls.logger.info(
                    "Adding entry point to PEX: Function: {0}".format(
                        options.entry_point))
                pex_builder.info().entry_point = options.entry_point
            else:
                cls.logger.warn("Invalid entry point: {0}".format(
                    options.entry_point))
        if options.pex_name is not None:
            cls.logger.info("Saving PEX file at {0}.pex".format(
                options.pex_name))
            pex_builder.build(options.pex_name + '.pex')
        else:
            pex_builder.freeze()
            cls.logger.info("Running PEX file at {0} with args {1}".format(
                pex_builder.path(), args))
            from .pex import PEX
            pex = PEX(pex_builder.path())
            return pex.run(args=list(args))

        logging.shutdown()