X-Git-Url: http://git.veekun.com/zzz-pokedex.git/blobdiff_plain/193856e88e36b2108c14fadd83883048ce93954c..ffae1bf909a94a9710244a8057a1ec98f57f8cd1:/pokedex/__init__.py?ds=inline diff --git a/pokedex/__init__.py b/pokedex/__init__.py index 249eafb..2be0f80 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: @@ -30,12 +32,12 @@ def main(): def get_parser(verbose=True): """Returns an OptionParser prepopulated with the global options. - + `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,74 +48,60 @@ 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) - lookup = pokedex.lookup.PokedexLookup(index_dir, session=session, - recreate=recreate) + if recreate: + lookup.rebuild_index() 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} (from {got_from})" \ - .format(csvdir=csvdir, got_from=got_from) + print "Using CSV directory %(csvdir)s (from %(got_from)s)" \ + % dict(csvdir=csvdir, got_from=got_from) + + return csvdir ### Plumbing commands @@ -124,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, @@ -144,7 +132,7 @@ 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, @@ -168,7 +156,7 @@ 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) @@ -183,9 +171,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 @@ -247,16 +265,16 @@ Global options: the pokedex install directory. Use this option (or a POKEDEX_INDEX_DIR environment variable) to specify an alternate loction. + -q|--quiet Don't print system output. This is the default for + non-system commands and setup. + -v|--verbose Print system output. This is the default for system + commands, except setup. System options: - -d|--directory By default, load and dump will use the CSV files in the + -d|--directory=DIR By default, load and dump will use the CSV files in the pokedex install directory. Use this option to specify a different directory. -D|--drop-tables With load, drop all tables before loading data. - -q|--quiet Don't print system output. This is the default for - non-system commands and setup. - -v|--verbose Print system output. This is the default for system - commands, except setup. Additionally, load and dump accept a list of table names (possibly with wildcards) and/or csv fileames as an argument list.