# 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:
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
"""
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,
- recreate=recreate)
+ lookup = pokedex.lookup.PokedexLookup(index_dir, session=session)
+
+ 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)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
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,
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=False)
def command_reindex(*args):
parser = get_parser(verbose=True)
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)
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
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.