"""This file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license. """ import os from .settings.base import EXPORT_DIR from .utils.io import find_file def parse_input_args(input_args): """Combine args with json config :return: config dict """ import argparse def valid_filepath(filepath): path = os.path.abspath(os.path.expanduser(filepath)) if os.path.exists(path): return path raise FileNotFoundError(filepath) def project_name(raw_name): """Remove trailing / and leading ./ from project name""" return os.path.normpath(raw_name) root_parser = argparse.ArgumentParser(add_help=False) root_parser.add_argument('--version', dest='version', action='store_true', help='Show Label Studio version') root_parser.add_argument( '-b', '--no-browser', dest='no_browser', action='store_true', help='Do not open browser when starting Label Studio', ) root_parser.add_argument( '-db', '--database', dest='database', help='Database file path for storing tasks and annotations' ) root_parser.add_argument('--data-dir', dest='data_dir', help='Directory for storing all application related data') root_parser.add_argument('-d', '--debug', dest='debug', action='store_true', help='Debug mode', default=False) default_config_path = find_file('default_config.json') root_parser.add_argument( '-c', '--config', dest='config_path', type=valid_filepath, default=default_config_path, help='Server config' ) root_parser.add_argument( '-l', '--label-config', dest='label_config', type=valid_filepath, help='Label config file path' ) root_parser.add_argument( '--skip-long-migrations', dest='skip_long_migrations', action='store_true', help='Skip long migrations on start', ) root_parser.add_argument('--ml-backends', dest='ml_backends', nargs='+', help='Machine learning backends URLs') root_parser.add_argument( '--sampling', dest='sampling', choices=['sequential', 'uniform', 'prediction-score-min'], default='sequential', help='Sampling type that defines order for labeling tasks', ) root_parser.add_argument( '--log-level', dest='log_level', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'], default='WARNING', help='Logging level', ) root_parser.add_argument( '--internal-host', dest='internal_host', type=str, default='0.0.0.0', # nosec help='Web server internal host, e.g.: "localhost" or "0.0.0.0"', ) root_parser.add_argument('-p', '--port', dest='port', type=int, help='Web server port') root_parser.add_argument( '--host', dest='host', type=str, default='', help='Label Studio full hostname for generating imported task urls, sample task urls, static loading, etc.\n' "Leave it empty to make all paths relative to the domain root, it's preferable for work for most cases." 'Examples: "https://77.42.77.42:1234", "http://ls.domain.com/subdomain/"', ) root_parser.add_argument( '--cert', dest='cert_file', type=valid_filepath, help='Certificate file for HTTPS (in PEM format)' ) root_parser.add_argument( '--key', dest='key_file', type=valid_filepath, help='Private key file for HTTPS (in PEM format)' ) root_parser.add_argument( '--initial-project-description', dest='project_desc', help='Project description to identify project' ) root_parser.add_argument('--password', dest='password', default='', help='Password for default user') root_parser.add_argument('--username', dest='username', default='', help='Username for default user') root_parser.add_argument('--user-token', dest='user_token', default='', help='User token for API access') root_parser.add_argument( '--agree-fix-sqlite', dest='agree_fix_sqlite', action='store_true', help='Agree to fix SQLite issues on python 3.6-3.8 on Windows automatically', ) root_parser.add_argument( '--enable-legacy-api-token', dest='enable_legacy_api_token', action='store_true', help='Enable legacy API token authentication', ) parser = argparse.ArgumentParser(description='Label studio', parents=[root_parser]) subparsers = parser.add_subparsers(dest='command', help='Available commands') subparsers.required = False # init sub-command parser subparsers.add_parser('version', help='Print version info', parents=[root_parser]) subparsers.add_parser('user', help='Print user info', parents=[root_parser]) parser_init = subparsers.add_parser('init', help='Initialize Label Studio', parents=[root_parser]) parser_init.add_argument( 'project_name', help='Path to directory where project state will be initialized', type=project_name, nargs='?' ) parser_init.add_argument( '-q', '--quiet', dest='quiet_mode', action='store_true', help='Quiet (silence) mode for init when it does not ask about username and password', default=False, ) # start sub-command parser parser_start = subparsers.add_parser('start', help='Start Label Studio server', parents=[root_parser]) parser_start.add_argument('project_name', help='Project name', type=project_name, default='', nargs='?') parser_start.add_argument( '--init', dest='init', action='store_true', help='Initialize if project is not initialized yet' ) # reset_password sub-command parser subparsers.add_parser('reset_password', help='Reset password for a specific username', parents=[root_parser]) subparsers.add_parser('shell', help='Run django shell', parents=[root_parser]) calculate_stats_all_orgs = subparsers.add_parser( 'calculate_stats_all_orgs', help='Calculate task counters and statistics', parents=[root_parser] ) calculate_stats_all_orgs.add_argument( '--from-scratch', dest='from_scratch', default=False, action='store_true', help='Recalculate from scratch' ) # export_project sub-command parser export_project = subparsers.add_parser('export', help='Export project in a specific format', parents=[root_parser]) export_project.add_argument('project_id', help='Project ID') export_project.add_argument('export_format', help='Export format (JSON, JSON_MIN, CSV, etc)') export_project.add_argument('--export-path', help='Export file path or directory', default=EXPORT_DIR) default_params = '{"annotations__completed_by": {"only_id": null}, "interpolate_key_frames": true}' export_project.add_argument( '--export-serializer-context', help=f"Export serializer context, default value: '{default_params}'", default=default_params, ) subparsers.add_parser( 'annotations_fill_updated_by', help='Fill the updated_by field for Annotations', parents=[root_parser] ) args = parser.parse_args(input_args) if not hasattr(args, 'label_config'): args.label_config = None return args