X-Git-Url: http://git.veekun.com/zzz-pokedex.git/blobdiff_plain/d501123d6026f9f6fa770e4ed7b174f94df81727..517e947f5ab92e233677f95286af9feabeb68fbc:/pokedex/__init__.py diff --git a/pokedex/__init__.py b/pokedex/__init__.py index dde6b5f..e4397af 100644 --- a/pokedex/__init__.py +++ b/pokedex/__init__.py @@ -1,12 +1,14 @@ # encoding: utf8 from optparse import OptionParser import os -import pkg_resources import sys +# XXX importing pokedex.whatever should not import all these import pokedex.db import pokedex.db.load +import pokedex.db.tables import pokedex.lookup +from pokedex import defaults def main(): if len(sys.argv) <= 1: @@ -34,8 +36,8 @@ def get_parser(verbose=True): `verbose` is whether or not the options should be verbose by default. """ parser = OptionParser() - parser.add_option('-e', '--engine', dest='engine_uri', default=os.environ.get('POKEDEX_DB_ENGINE', None)) - parser.add_option('-i', '--index', dest='index_dir', default=os.environ.get('POKEDEX_INDEX_DIR', None)) + parser.add_option('-e', '--engine', dest='engine_uri', default=None) + parser.add_option('-i', '--index', dest='index_dir', default=None) parser.add_option('-q', '--quiet', dest='verbose', default=verbose, action='store_false') parser.add_option('-v', '--verbose', dest='verbose', default=verbose, action='store_true') return parser @@ -46,52 +48,36 @@ def get_session(options): """ engine_uri = options.engine_uri - got_from = None - if engine_uri: - got_from = 'command line' - else: - engine_uri = os.environ.get('POKEDEX_DB_ENGINE', None) - if engine_uri: - got_from = 'environment' - else: - got_from = 'default setting' + got_from = 'command line' + + if engine_uri is None: + engine_uri, got_from = defaults.get_default_db_uri_with_origin() session = pokedex.db.connect(engine_uri) if options.verbose: - print "Connected to database {engine} (from {got_from})" \ - .format(engine=session.bind.url, got_from=got_from) + print "Connected to database %(engine)s (from %(got_from)s)" \ + % dict(engine=session.bind.url, got_from=got_from) return session def get_lookup(options, session=None, recreate=False): """Given a parsed options object, opens the whoosh index and returns a PokedexLookup object. - - Unlike `get_session`, this function can actually do population as a side - effect! This is fallout from how PokedexLookup works. """ - # TODO fix the above if recreate and not session: raise ValueError("get_lookup() needs an explicit session to regen the index") index_dir = options.index_dir - got_from = None - if index_dir: - got_from = 'command line' - else: - index_dir = os.environ.get('POKEDEX_INDEX_DIR', None) - if index_dir: - got_from = 'environment' - else: - index_dir = pkg_resources.resource_filename('pokedex', - 'data/whoosh-index') - got_from = 'default setting' + got_from = 'command line' + + if index_dir is None: + index_dir, got_from = defaults.get_default_index_dir_with_origin() if options.verbose: - print "Opened lookup index {index_dir} (from {got_from})" \ - .format(index_dir=index_dir, got_from=got_from) + print "Opened lookup index %(index_dir)s (from %(got_from)s)" \ + % dict(index_dir=index_dir, got_from=got_from) lookup = pokedex.lookup.PokedexLookup(index_dir, session=session) @@ -100,22 +86,22 @@ def get_lookup(options, session=None, recreate=False): return lookup -def print_csv_directory(options): - """Just prints the csv directory we're about to use.""" +def get_csv_directory(options): + """Prints and returns the csv directory we're about to use.""" if not options.verbose: return - if options.directory: - csvdir = options.directory - got_from = 'command line' - else: - # This is the same as the db.load default - csvdir = pkg_resources.resource_filename('pokedex', 'data/csv') - got_from = 'default setting' + csvdir = options.directory + got_from = 'command line' + + if csvdir is None: + csvdir, got_from = defaults.get_default_csv_dir_with_origin() + + print "Using CSV directory %(csvdir)s (from %(got_from)s)" \ + % dict(csvdir=csvdir, got_from=got_from) - print "Using CSV directory {csvdir} (from {got_from})" \ - .format(csvdir=csvdir, got_from=got_from) + return csvdir ### Plumbing commands @@ -126,7 +112,7 @@ def command_dump(*args): options, tables = parser.parse_args(list(args)) session = get_session(options) - print_csv_directory(options) + get_csv_directory(options) pokedex.db.load.dump(session, directory=options.directory, tables=tables, @@ -136,6 +122,8 @@ def command_load(*args): parser = get_parser(verbose=True) parser.add_option('-d', '--directory', dest='directory', default=None) parser.add_option('-D', '--drop-tables', dest='drop_tables', default=False, action='store_true') + parser.add_option('-S', '--safe', dest='safe', default=False, action='store_true', + help="Do not use backend-specific optimalizations.") options, tables = parser.parse_args(list(args)) if not options.engine_uri: @@ -146,12 +134,13 @@ def command_load(*args): print session = get_session(options) - print_csv_directory(options) + get_csv_directory(options) pokedex.db.load.load(session, directory=options.directory, drop_tables=options.drop_tables, tables=tables, - verbose=options.verbose) + verbose=options.verbose, + safe=options.safe) def command_reindex(*args): parser = get_parser(verbose=True) @@ -170,9 +159,10 @@ def command_setup(*args): options.directory = None session = get_session(options) - print_csv_directory(options) + get_csv_directory(options) pokedex.db.load.load(session, directory=None, drop_tables=True, - verbose=options.verbose) + verbose=options.verbose, + safe=False) lookup = get_lookup(options, session=session, recreate=True) @@ -185,9 +175,39 @@ def command_status(*args): options.verbose = True options.directory = None + # Database, and a lame check for whether it's been inited at least once session = get_session(options) - print_csv_directory(options) + print " - OK! Connected successfully." + + if pokedex.db.tables.Pokemon.__table__.exists(session.bind): + print " - OK! Database seems to contain some data." + else: + print " - WARNING: Database appears to be empty." + + # CSV; simple checks that the dir exists + csvdir = get_csv_directory(options) + if not os.path.exists(csvdir): + print " - ERROR: No such directory!" + elif not os.path.isdir(csvdir): + print " - ERROR: Not a directory!" + else: + print " - OK! Directory exists." + + if os.access(csvdir, os.R_OK): + print " - OK! Can read from directory." + else: + print " - ERROR: Can't read from directory!" + + if os.access(csvdir, os.W_OK): + print " - OK! Can write to directory." + else: + print " - WARNING: Can't write to directory! " \ + "`dump` will not work. You may need to sudo." + + # Index; the PokedexLookup constructor covers most tests and will + # cheerfully bomb if they fail lookup = get_lookup(options, recreate=False) + print " - OK! Opened successfully." ### User-facing commands