def cli(ctx, env): """Print shell help text.""" env.out("Welcome to the SoftLayer shell.") env.out("") formatter = formatting.HelpFormatter() commands = [] shell_commands = [] for name in cli_core.cli.list_commands(ctx): command = cli_core.cli.get_command(ctx, name) if command.short_help is None: command.short_help = command.help details = (name, command.short_help) if name in dict(routes.ALL_ROUTES): shell_commands.append(details) else: commands.append(details) with formatter.section('Shell Commands'): formatter.write_dl(shell_commands) with formatter.section('Commands'): formatter.write_dl(commands) for line in formatter.buffer: env.out(line, newline=False)
def serve( files, host, port, debug, reload, cors, sqlite_extensions, inspect_file, metadata, template_dir, plugins_dir, static, config, version_note, help_config, ): """Serve up specified SQLite database files with a web UI""" if help_config: formatter = formatting.HelpFormatter() with formatter.section("Config options"): formatter.write_dl([ (option.name, '{} (default={})'.format(option.help, option.default)) for option in CONFIG_OPTIONS ]) click.echo(formatter.getvalue()) sys.exit(0) if reload: import hupper reloader = hupper.start_reloader("datasette.cli.serve") if metadata: reloader.watch_files([metadata.name]) inspect_data = None if inspect_file: inspect_data = json.load(open(inspect_file)) metadata_data = None if metadata: metadata_data = json.loads(metadata.read()) click.echo("Serve! files={} on port {}".format(files, port)) ds = Datasette( files, cache_headers=not debug and not reload, cors=cors, inspect_data=inspect_data, metadata=metadata_data, sqlite_extensions=sqlite_extensions, template_dir=template_dir, plugins_dir=plugins_dir, static_mounts=static, config=dict(config), version_note=version_note, ) # Force initial hashing/table counting ds.inspect() ds.app().run(host=host, port=port, debug=debug)
def __str__(self): lines = [] command = self.ctx.command formatter = formatting.HelpFormatter() pieces = command.collect_usage_pieces(self.ctx) formatter.write_usage(self.ctx.command_path, ' '.join(pieces), prefix="$ ") command_str = formatter.getvalue().rstrip('\n') lines.append("= {}\n".format(self.ctx.command_path)) lines.append("{}\n".format(self.ctx.command.get_short_help_str())) lines.append("[source,shell]") lines.append("----") lines.append(command_str) lines.append("----\n") if self.ctx.command.help: lines.append("{}\n".format(self.ctx.command.help)) options = [ x.get_help_record(self.ctx) for x in self.ctx.command.params if isinstance(x, click.Option) ] if options: lines.append("== Options\n") lines.append('[cols="2a*"]\n') lines.append('|===\n') for option in options: lines.append('2+| *{}*\n'.format(option[0].replace('|', '\|'))) lines.append('|Description | {}\n'.format(option[1].replace( '|', '\|'))) lines.append('|===\n') doc_page = '\n'.join(lines) if not doc_page.endswith('\n'): doc_page += '\n' return doc_page
def serve( files, immutable, host, port, debug, reload, cors, sqlite_extensions, inspect_file, metadata, template_dir, plugins_dir, static, memory, config, secret, root, version_note, help_config, return_instance=False, ): """Serve up specified SQLite database files with a web UI""" if help_config: formatter = formatting.HelpFormatter() with formatter.section("Config options"): formatter.write_dl([ (option.name, "{} (default={})".format(option.help, option.default)) for option in CONFIG_OPTIONS ]) click.echo(formatter.getvalue()) sys.exit(0) if reload: import hupper reloader = hupper.start_reloader("datasette.cli.serve") if immutable: reloader.watch_files(immutable) if metadata: reloader.watch_files([metadata.name]) inspect_data = None if inspect_file: inspect_data = json.load(open(inspect_file)) metadata_data = None if metadata: metadata_data = parse_metadata(metadata.read()) kwargs = dict( immutables=immutable, cache_headers=not debug and not reload, cors=cors, inspect_data=inspect_data, metadata=metadata_data, sqlite_extensions=sqlite_extensions, template_dir=template_dir, plugins_dir=plugins_dir, static_mounts=static, config=dict(config), memory=memory, secret=secret, version_note=version_note, ) # if files is a single directory, use that as config_dir= if 1 == len(files) and os.path.isdir(files[0]): kwargs["config_dir"] = pathlib.Path(files[0]) files = [] ds = Datasette(files, **kwargs) if return_instance: # Private utility mechanism for writing unit tests return ds # Run the "startup" plugin hooks asyncio.get_event_loop().run_until_complete(ds.invoke_startup()) # Run async sanity checks - but only if we're not under pytest asyncio.get_event_loop().run_until_complete(check_databases(ds)) # Start the server if root: print("http://{}:{}/-/auth-token?token={}".format( host, port, ds._root_token)) uvicorn.run(ds.app(), host=host, port=port, log_level="info", lifespan="on")
def serve( files, immutable, host, port, debug, reload, cors, sqlite_extensions, inspect_file, metadata, template_dir, plugins_dir, static, memory, config, version_note, help_config, ): """Serve up specified SQLite database files with a web UI""" if help_config: formatter = formatting.HelpFormatter() with formatter.section("Config options"): formatter.write_dl([ (option.name, "{} (default={})".format(option.help, option.default)) for option in CONFIG_OPTIONS ]) click.echo(formatter.getvalue()) sys.exit(0) if reload: import hupper reloader = hupper.start_reloader("datasette.cli.serve") reloader.watch_files(files) if metadata: reloader.watch_files([metadata.name]) inspect_data = None if inspect_file: inspect_data = json.load(open(inspect_file)) metadata_data = None if metadata: metadata_data = json.loads(metadata.read()) click.echo("Serve! files={} (immutables={}) on port {}".format( files, immutable, port)) ds = Datasette( files, immutables=immutable, cache_headers=not debug and not reload, cors=cors, inspect_data=inspect_data, metadata=metadata_data, sqlite_extensions=sqlite_extensions, template_dir=template_dir, plugins_dir=plugins_dir, static_mounts=static, config=dict(config), memory=memory, version_note=version_note, ) # Run async sanity checks - but only if we're not under pytest asyncio.get_event_loop().run_until_complete(ds.run_sanity_checks()) # Start the server uvicorn.run(ds.app(), host=host, port=port, log_level="info")
def serve( files, immutable, host, port, uds, reload, cors, sqlite_extensions, inspect_file, metadata, template_dir, plugins_dir, static, memory, config, settings, secret, root, get, version_note, help_settings, pdb, open_browser, create, crossdb, nolock, ssl_keyfile, ssl_certfile, return_instance=False, ): """Serve up specified SQLite database files with a web UI""" if help_settings: formatter = formatting.HelpFormatter() with formatter.section("Settings"): formatter.write_dl([(option.name, f"{option.help} (default={option.default})") for option in SETTINGS]) click.echo(formatter.getvalue()) sys.exit(0) if reload: import hupper reloader = hupper.start_reloader("datasette.cli.serve") if immutable: reloader.watch_files(immutable) if metadata: reloader.watch_files([metadata.name]) inspect_data = None if inspect_file: with open(inspect_file) as fp: inspect_data = json.load(fp) metadata_data = None if metadata: metadata_data = parse_metadata(metadata.read()) combined_settings = {} if config: click.echo( "--config name:value will be deprecated in Datasette 1.0, use --setting name value instead", err=True, ) combined_settings.update(config) combined_settings.update(settings) kwargs = dict( immutables=immutable, cache_headers=not reload, cors=cors, inspect_data=inspect_data, metadata=metadata_data, sqlite_extensions=sqlite_extensions, template_dir=template_dir, plugins_dir=plugins_dir, static_mounts=static, settings=combined_settings, memory=memory, secret=secret, version_note=version_note, pdb=pdb, crossdb=crossdb, nolock=nolock, ) # if files is a single directory, use that as config_dir= if 1 == len(files) and os.path.isdir(files[0]): kwargs["config_dir"] = pathlib.Path(files[0]) files = [] # Verify list of files, create if needed (and --create) for file in files: if not pathlib.Path(file).exists(): if create: sqlite3.connect(file).execute("vacuum") else: raise click.ClickException( "Invalid value for '[FILES]...': Path '{}' does not exist." .format(file)) # De-duplicate files so 'datasette db.db db.db' only attaches one /db files = list(dict.fromkeys(files)) try: ds = Datasette(files, **kwargs) except SpatialiteNotFound: raise click.ClickException("Could not find SpatiaLite extension") except StartupError as e: raise click.ClickException(e.args[0]) if return_instance: # Private utility mechanism for writing unit tests return ds # Run the "startup" plugin hooks asyncio.get_event_loop().run_until_complete(ds.invoke_startup()) # Run async soundness checks - but only if we're not under pytest asyncio.get_event_loop().run_until_complete(check_databases(ds)) if get: client = TestClient(ds) response = client.get(get) click.echo(response.text) exit_code = 0 if response.status == 200 else 1 sys.exit(exit_code) return # Start the server url = None if root: url = "http://{}:{}{}?token={}".format(host, port, ds.urls.path("-/auth-token"), ds._root_token) print(url) if open_browser: if url is None: # Figure out most convenient URL - to table, database or homepage path = asyncio.get_event_loop().run_until_complete( initial_path_for_datasette(ds)) url = f"http://{host}:{port}{path}" webbrowser.open(url) uvicorn_kwargs = dict(host=host, port=port, log_level="info", lifespan="on", workers=1) if uds: uvicorn_kwargs["uds"] = uds if ssl_keyfile: uvicorn_kwargs["ssl_keyfile"] = ssl_keyfile if ssl_certfile: uvicorn_kwargs["ssl_certfile"] = ssl_certfile uvicorn.run(ds.app(), **uvicorn_kwargs)
def serve( files, immutable, host, port, reload, cors, sqlite_extensions, inspect_file, metadata, template_dir, plugins_dir, static, memory, config, secret, root, get, version_note, help_config, pdb, open_browser, return_instance=False, ): """Serve up specified SQLite database files with a web UI""" if help_config: formatter = formatting.HelpFormatter() with formatter.section("Config options"): formatter.write_dl([ (option.name, "{} (default={})".format(option.help, option.default)) for option in CONFIG_OPTIONS ]) click.echo(formatter.getvalue()) sys.exit(0) if reload: import hupper reloader = hupper.start_reloader("datasette.cli.serve") if immutable: reloader.watch_files(immutable) if metadata: reloader.watch_files([metadata.name]) inspect_data = None if inspect_file: inspect_data = json.load(open(inspect_file)) metadata_data = None if metadata: metadata_data = parse_metadata(metadata.read()) kwargs = dict( immutables=immutable, cache_headers=not reload, cors=cors, inspect_data=inspect_data, metadata=metadata_data, sqlite_extensions=sqlite_extensions, template_dir=template_dir, plugins_dir=plugins_dir, static_mounts=static, config=dict(config), memory=memory, secret=secret, version_note=version_note, pdb=pdb, ) # if files is a single directory, use that as config_dir= if 1 == len(files) and os.path.isdir(files[0]): kwargs["config_dir"] = pathlib.Path(files[0]) files = [] try: ds = Datasette(files, **kwargs) except SpatialiteNotFound: raise click.ClickException("Could not find SpatiaLite extension") if return_instance: # Private utility mechanism for writing unit tests return ds # Run the "startup" plugin hooks asyncio.get_event_loop().run_until_complete(ds.invoke_startup()) # Run async sanity checks - but only if we're not under pytest asyncio.get_event_loop().run_until_complete(check_databases(ds)) if get: client = TestClient(ds) response = client.get(get) click.echo(response.text) exit_code = 0 if response.status == 200 else 1 sys.exit(exit_code) return # Start the server url = None if root: url = "http://{}:{}{}?token={}".format(host, port, ds.urls.path("-/auth-token"), ds._root_token) print(url) if open_browser: if url is None: # Figure out most convenient URL - to table, database or homepage path = asyncio.get_event_loop().run_until_complete( initial_path_for_datasette(ds)) url = "http://{}:{}{}".format(host, port, path) webbrowser.open(url) uvicorn.run(ds.app(), host=host, port=port, log_level="info", lifespan="on", workers=1)