def test_fatal_if_no_storage_and_no_sqlite_file(tmpdir, use_option): from devpi_server.init import init from devpi_server.main import _main, get_pluginmanager class Plugin: @hookimpl def devpiserver_cmdline_run(self, xom): return 1 pm = get_pluginmanager() pm.register(Plugin()) if use_option: _main(argv=["devpi-server", "--init", "--serverdir", str(tmpdir)], pluginmanager=pm) else: init(argv=["devpi-init", "--serverdir", str(tmpdir)], pluginmanager=pm) _main(argv=["devpi-server", "--serverdir", str(tmpdir)], pluginmanager=pm) tmpdir.join('.sqlite').remove() with pytest.raises(Fatal) as excinfo: _main(argv=["devpi-server", "--serverdir", str(tmpdir)], pluginmanager=pm) assert "you first need to run devpi-init or devpi-import" in str( excinfo.value)
def new_import(self, options=(), plugin=None): if request.param: mapp2 = makemapp( options=("--import", str(self.exportdir)) + options) if plugin is not None: mapp2.xom.config.pluginmanager.register(plugin) mapp2.xom.config.init_nodeinfo() assert mapp2.xom.main() == 0 else: from devpi_server.config import get_pluginmanager from devpi_server.importexport import import_ serverdir = gentmp() argv = [ "devpi-import", "--no-events", "--serverdir", serverdir ] argv.extend(options) argv.extend(["--storage", storage_info["name"]]) argv.append(self.exportdir) pm = get_pluginmanager() pm.register(plugin) assert import_(pluginmanager=pm, argv=argv) == 0 mapp2 = makemapp(options=["--serverdir", serverdir]) if plugin is not None: mapp2.xom.config.pluginmanager.register(plugin) return mapp2
def test_run_commands_called(tmpdir, use_option): from devpi_server.init import init from devpi_server.main import _main, get_pluginmanager l = [] class Plugin: @hookimpl def devpiserver_cmdline_run(self, xom): l.append(xom) return 1 pm = get_pluginmanager() pm.register(Plugin()) if use_option: result = _main( argv=["devpi-server", "--init", "--serverdir", str(tmpdir)], pluginmanager=pm) else: result = init(argv=["devpi-init", "--serverdir", str(tmpdir)], pluginmanager=pm) result = _main(argv=["devpi-server", "--serverdir", str(tmpdir)], pluginmanager=pm) assert result == 1 assert len(l) == 1 assert isinstance(l[0], XOM)
def makexom(opts=(), httpget=httpget, proxy=None, mocking=True, plugins=()): from devpi_server import auth_basic from devpi_server import auth_devpi plugins = list(plugins) + [(auth_basic, None), (auth_devpi, None)] pm = get_pluginmanager() for plugin in plugins: pm.register(plugin) serverdir = gentmp() fullopts = ["devpi-server", "--serverdir", serverdir] + list(opts) fullopts = [str(x) for x in fullopts] config = parseoptions(pm, fullopts) config.init_nodeinfo() if mocking: if proxy is None: proxy = mock.create_autospec(XMLProxy) proxy.list_packages_with_serial.return_value = {} xom = XOM(config, proxy=proxy, httpget=httpget) add_pypistage_mocks(monkeypatch, httpget) else: xom = XOM(config) # initialize default indexes from devpi_server.main import set_default_indexes if not xom.config.args.master_url: with xom.keyfs.transaction(write=True): set_default_indexes(xom.model) if mocking: xom.pypimirror.init_pypi_mirror(proxy) if request.node.get_marker("start_threads"): xom.thread_pool.start() elif request.node.get_marker("with_notifier"): xom.thread_pool.start_one(xom.keyfs.notifier) request.addfinalizer(xom.thread_pool.shutdown) return xom
def clear_index(argv=None): if argv is None: argv = sys.argv else: # for tests argv = [str(x) for x in argv] pluginmanager = get_pluginmanager() try: parser = MyArgumentParser(description="Clear project search index.", add_help=False) add_help_option(parser, pluginmanager) add_configfile_option(parser, pluginmanager) add_storage_options(parser, pluginmanager) add_indexer_backend_option(parser, pluginmanager) config = parseoptions(pluginmanager, argv, parser=parser) configure_cli_logging(config.args) xom = xom_from_config(config) log = xom.log log.warn("You should stop devpi-server before running this command.") ix = get_indexer(xom) ix.delete_index() log.info( "Index deleted, start devpi-server again to let the index rebuild automatically." ) except Fatal as e: tw = py.io.TerminalWriter(sys.stderr) tw.line("fatal: %s" % e.args[0], red=True) return 1
def genconfig(config=None, argv=None): pluginmanager = get_pluginmanager() if argv is None: argv = sys.argv argv = [str(x) for x in argv] if config is None: parser = get_parser(pluginmanager) parser.description = ( "Write configuration files for various process managers and " "webservers. Takes same arguments as devpi-server.") config = parseoptions(pluginmanager, argv, parser=parser) tw = py.io.TerminalWriter() tw.cwd = py.path.local() if not config.args.configfile: tw.line( "It is highly recommended to use a configuration file for " "devpi-server, see --configfile option.", red=True) destdir = tw.cwd.ensure("gen-config", dir=1) new_argv = [] argv_iter = iter(argv[1:]) for arg in argv_iter: if arg == "--gen-config": continue if arg.startswith("--serverdir"): if '=' not in arg: next(argv_iter) # remove path # replace with absolute path new_argv.extend(["--serverdir", config.serverdir.strpath]) continue if arg == "-c" or arg.startswith(("--configfile", "-c=")): if '=' not in arg: next(argv_iter) # remove path # replace with absolute path new_argv.extend([ "--configfile", py.path.local(config.args.configfile).strpath ]) continue new_argv.append(arg) new_args = parseoptions(pluginmanager, ["devpi-server"] + new_argv) cfg_types = [ "cron", "launchd", "nginx", "supervisor", "systemd", "windows_service" ] for cfg_type in cfg_types: def writer(basename, content): p = destdir.join(basename) p.write(content) tw.line("wrote %s" % p.relto(tw.cwd), bold=True) name = "gen_" + cfg_type globals()[name](tw, new_args, new_argv, writer)
def test_indexer_relative_path(): from devpi_server.config import parseoptions, get_pluginmanager from devpi_server.main import Fatal from devpi_web.main import get_indexer_from_config options = ("--indexer-backend", "whoosh:path=ham") config = parseoptions(get_pluginmanager(), ("devpi-server", ) + options) with pytest.raises(Fatal, match="must be absolute"): get_indexer_from_config(config)
def makexom(opts=(), httpget=httpget, plugins=()): from devpi_server import auth_basic from devpi_server import auth_devpi plugins = [ plugin[0] if isinstance(plugin, tuple) else plugin for plugin in plugins ] for plugin in [auth_basic, auth_devpi, storage_info["_test_plugin"]]: if plugin not in plugins: plugins.append(plugin) pm = get_pluginmanager(load_entrypoints=False) for plugin in plugins: pm.register(plugin) serverdir = gentmp() fullopts = ["devpi-server", "--serverdir", serverdir] + list(opts) if request.node.get_marker("with_replica_thread"): fullopts.append("--master=http://localhost") if not request.node.get_marker("no_storage_option"): if storage_info["name"] != "sqlite": fullopts.append("--storage=%s" % storage_info["name"]) fullopts = [str(x) for x in fullopts] config = parseoptions(pm, fullopts) config.init_nodeinfo() for marker in ("storage_with_filesystem", ): if request.node.get_marker(marker): info = config._storage_info() markers = info.get("_test_markers", []) if marker not in markers: pytest.skip("The storage doesn't have marker '%s'." % marker) if not request.node.get_marker("no_storage_option"): assert storage_info["storage"] is config.storage if request.node.get_marker("nomocking"): xom = XOM(config) else: xom = XOM(config, httpget=httpget) if not request.node.get_marker("nomockprojectsremote"): monkeypatch.setattr(extpypi.PyPIStage, "_get_remote_projects", lambda self: set()) add_pypistage_mocks(monkeypatch, httpget) # initialize default indexes from devpi_server.main import set_default_indexes if not xom.config.args.master_url: with xom.keyfs.transaction(write=True): set_default_indexes(xom.model) if request.node.get_marker("with_replica_thread"): from devpi_server.replica import ReplicaThread rt = ReplicaThread(xom) xom.replica_thread = rt xom.thread_pool.register(rt) xom.thread_pool.start_one(rt) if request.node.get_marker("start_threads"): xom.thread_pool.start() elif request.node.get_marker("with_notifier"): xom.thread_pool.start_one(xom.keyfs.notifier) request.addfinalizer(xom.thread_pool.shutdown) return xom
def test_add_parser_options_called(self): l = [] class Plugin: def devpiserver_add_parser_options(self, parser): l.append(parser) pm = get_pluginmanager() pm.register(Plugin()) parseoptions(pm, ["devpi-server"]) assert len(l) == 1 assert isinstance(l[0], MyArgumentParser)
def genconfig(config, argv): tw = py.io.TerminalWriter() tw.cwd = py.path.local() destdir = tw.cwd.ensure("gen-config", dir=1) new_argv = [x for x in argv if x != "--gen-config"] new_args = parseoptions(get_pluginmanager(), ["devpi-server"] + new_argv) for cfg_type in ["supervisor", "nginx", "cron", "launchd", "systemd"]: def writer(basename, content): p = destdir.join(basename) p.write(content) tw.line("wrote %s" % p.relto(tw.cwd), bold=True) name = "gen_" + cfg_type globals()[name](tw, new_args, new_argv, writer)
def test_main_starts_server_if_run_commands_returns_none(tmpdir): from devpi_server.init import init from devpi_server.main import _main, get_pluginmanager l = [] class Plugin: @hookimpl def devpiserver_cmdline_run(self, xom): l.append(xom) pm = get_pluginmanager() pm.register(Plugin()) init(argv=["devpi-init", "--serverdir", str(tmpdir)], pluginmanager=pm) with pytest.raises(ZeroDivisionError): _main(argv=["devpi-server", "--serverdir", str(tmpdir)], pluginmanager=pm) assert len(l) == 1 assert isinstance(l[0], XOM)
def make_config(args): return parseoptions(get_pluginmanager(), args)
def config(gentmp): serverdir = gentmp() pluginmanager = get_pluginmanager() return parseoptions(pluginmanager, ["devpi-server", "--serverdir", serverdir.strpath])
def make_config(args): from devpi_server.config import parseoptions, get_pluginmanager return parseoptions(get_pluginmanager(), args)
def reparse_without_genconfig(config): new_args = [x for x in config.args._raw if x != "--gen-config"] return parseoptions(get_pluginmanager(), ["devpi-server"] + new_args)