core/commands/base.py (75 lines of code) (raw):

#!/usr/bin/env python3 """ Copyright (c) 2017-present, Facebook, Inc. All rights reserved. This source code is licensed under the BSD-style license found in the LICENSE file in the root directory of this source tree. """ import logging log = logging.getLogger(__name__) class CommandBase(object): DESCRIPTION = """ This is a default description. You should overwrite it in your sub-class. """ # args from ArgumentParser.parse_args() args = None # master ArgumentParser parser = None # subparser for this command subparser = None def __init__(self, get_conn_func=None): """ Initialize the command base object, and assign the infra-dependent stuffs if given @param get_mysql_connection: Override the function to get the MySQL connection. If not specified here, the default connection function will be used, which is 'osc.lib.db.default_get_mysql_connection'. If you want to customize the way OSC connect to a MySQL instance, you can write/import one in cli.py and pass it here @type: function """ self.get_conn_func = get_conn_func self.init() def init(self): """ Called upon init, override me. """ pass def name(self): """ Return the name of this subcommand. """ return self.NAME def description(self): """ Return a one-line description of this command Exceptions are ignored """ return self.DESCRIPTION.splitlines()[0] def help(self): """ Return a chunk of text explaining this command """ return self.DESCRIPTION def setup_parser( self, parser, optional_db=False, require_user=False, require_password=False ): """ Common parser shared across all the modes """ parser.add_argument( "--socket", help="Socket file for the mysql " "connection", required=True ) parser.add_argument( "--database", help="Database name(s) to run the schema change", nargs="+", required=(not optional_db), ) parser.add_argument( "--repl-status", help="Force script to run only on instances with " "the replication role. ", choices=["master", "slave"], ) parser.add_argument( "--mysql-user", help="MySQL username to connect to the instance", required=require_user, ) parser.add_argument( "--mysql-password", help="MySQL user password to connect to the " "instance", required=require_password, ) parser.add_argument( "--charset", default="ascii", help="Character set used for MySQL connection " "(defaults to '%(default)s').", ) parser.add_argument( "--force", help="Ignore non-critical errors and continue " "making schema changes for all the given " "databases ", ) def add_file_list_parser(self, parser): parser.add_argument( "--ddl-file-list", help="Files with CREATE statements. " "Multiple files are supported as list separated " "by space", required=True, nargs="+", ) def add_engine_parser(self, parser): parser.add_argument( "--mysql-engine", help="Make sure the table is created with only " "the specified engine", ) def usage(self, *args, **kwargs): self.parser.error(*args, **kwargs) def validate_args(self): pass