remote_settings/subcommands/create.py (96 lines of code) (raw):

import argparse, os from packaging import version from remote_settings.client import RemoteSettingsClient from remote_settings.format import print_info, print_error, print_help def attach_create_subcommand(subparsers): """Adds the `create` subcommand and its associated arguments as a subparser. Args: subparsers (_SubParsersAction): The subparser action object to add this subcommand to. """ create_parser = subparsers.add_parser( "create", help="create and upload a new record to Remote Settings", formatter_class=argparse.MetavarTypeHelpFormatter, ) create_parser.add_argument( "-d", "--dry-run", action="store_true", help="verify the authentication and record data, but do not create", ) create_parser.add_argument( "-m", "--mock-connection", action="store_true", help="mock the connection to the server for testing", ) create_parser.add_argument( "-q", "--quiet", action="store_true", help="do not print informational non-error output to the terminal", ) create_parser.add_argument( "--server", type=str, choices=["dev", "stage", "prod"], help="the server where records will be created", required=True, ) create_parser.add_argument( "--version", metavar="VERSION", type=validate_version, help="the semantic version of the record", required=True, ) create_parser.add_argument( "--test", action="store_true", help=argparse.SUPPRESS, ) group = create_parser.add_mutually_exclusive_group(required=True) group.add_argument( "--path", metavar="PATH", type=validate_path, help="the path to the file attachment to upload", ) group.add_argument( "--lang-pair", metavar="PAIR", type=validate_lang_pair, help="the language pair for which to publish all associated files, e.g. 'enes'", ) def validate_path(value): if not os.path.exists(value): raise argparse.ArgumentTypeError(f"invalid value '{value}' (path does not exist)") return value def validate_lang_pair(value): if len(value) != 4: raise argparse.ArgumentTypeError( f"invalid language pair '{value}', expected only four letters, e.g. 'enes'" ) return value def validate_version(value): try: version.parse(value) except: raise argparse.ArgumentTypeError( f"invalid value '{value}' (use a valid semantic version number)" ) return value def do_create(args): """Creates a new record based on args, and uploads it to Remote Settings. Args: args (argparse.Namespace): The arguments passed to the create subcommand """ client = RemoteSettingsClient.init_for_create(args) print_info(args) print_info(args, f"User: {client.authenticated_user()}") print_info(args, f"Server: {client.server_url()}") if client.record_count() == 0: print_error("No records found.") print_help("You may need to unzip the archives in the desired directory.") exit(1) print_info(args) for i in range(client.record_count()): print_info(args, f"Record: {client.record_info_json(i)}") if not (args.dry_run or args.mock_connection): print_info(args, "Creating record...") client.create_new_record(i) print_info(args, f"{client.attachment_name(i)} created") print_info(args) print_info(args)