Factor out logic for finding the default db/index. #180

Note: `if not x:` has changed to `if x is not None:`, changing the
semantics slightly.  Shouldn't be a big issue.
This commit is contained in:
a_magical_me 2010-05-13 10:33:07 -07:00
parent 5e52bef91a
commit ffc30bff8f
5 changed files with 74 additions and 58 deletions

View file

@ -1,13 +1,13 @@
# encoding: utf8 # encoding: utf8
from optparse import OptionParser from optparse import OptionParser
import os import os
import pkg_resources
import sys import sys
import pokedex.db import pokedex.db
import pokedex.db.load import pokedex.db.load
import pokedex.db.tables import pokedex.db.tables
import pokedex.lookup import pokedex.lookup
from pokedex import defaults
def main(): def main():
if len(sys.argv) <= 1: if len(sys.argv) <= 1:
@ -35,8 +35,8 @@ def get_parser(verbose=True):
`verbose` is whether or not the options should be verbose by default. `verbose` is whether or not the options should be verbose by default.
""" """
parser = OptionParser() parser = OptionParser()
parser.add_option('-e', '--engine', dest='engine_uri', default=os.environ.get('POKEDEX_DB_ENGINE', None)) parser.add_option('-e', '--engine', dest='engine_uri', default=None)
parser.add_option('-i', '--index', dest='index_dir', default=os.environ.get('POKEDEX_INDEX_DIR', 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('-q', '--quiet', dest='verbose', default=verbose, action='store_false')
parser.add_option('-v', '--verbose', dest='verbose', default=verbose, action='store_true') parser.add_option('-v', '--verbose', dest='verbose', default=verbose, action='store_true')
return parser return parser
@ -46,19 +46,11 @@ def get_session(options):
session. session.
""" """
# WARNING: This logic duplicates that in db.connect(), because there's no
# other reliable way to tell where the engine actually came from. Keep it
# up to date!
engine_uri = options.engine_uri engine_uri = options.engine_uri
got_from = None got_from = 'command line'
if engine_uri:
got_from = 'command line' if engine_uri is None:
else: engine_uri, got_from = defaults.get_default_db_uri_with_origin()
engine_uri = os.environ.get('POKEDEX_DB_ENGINE', None)
if engine_uri:
got_from = 'environment'
else:
got_from = 'default setting'
session = pokedex.db.connect(engine_uri) session = pokedex.db.connect(engine_uri)
@ -73,24 +65,14 @@ def get_lookup(options, session=None, recreate=False):
PokedexLookup object. PokedexLookup object.
""" """
# WARNING: This logic duplicates that in PokedexLookup, because there's no
# other reliable way to tell where the engine actually came from. Keep it
# up to date!
if recreate and not session: if recreate and not session:
raise ValueError("get_lookup() needs an explicit session to regen the index") raise ValueError("get_lookup() needs an explicit session to regen the index")
index_dir = options.index_dir index_dir = options.index_dir
got_from = None got_from = 'command line'
if index_dir:
got_from = 'command line' if index_dir is None:
else: index_dir, got_from = defaults.get_default_index_dir_with_origin()
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'
if options.verbose: if options.verbose:
print "Opened lookup index {index_dir} (from {got_from})" \ print "Opened lookup index {index_dir} (from {got_from})" \
@ -109,13 +91,11 @@ def get_csv_directory(options):
if not options.verbose: if not options.verbose:
return return
if options.directory: csvdir = options.directory
csvdir = options.directory got_from = 'command line'
got_from = 'command line'
else: if csvdir is None:
# This is the same as the db.load default csvdir, got_from = defaults.get_default_csv_dir_with_origin()
csvdir = pkg_resources.resource_filename('pokedex', 'data/csv')
got_from = 'default setting'
print "Using CSV directory {csvdir} (from {got_from})" \ print "Using CSV directory {csvdir} (from {got_from})" \
.format(csvdir=csvdir, got_from=got_from) .format(csvdir=csvdir, got_from=got_from)

View file

@ -1,10 +1,9 @@
import os
import pkg_resources
from sqlalchemy import MetaData, Table, create_engine, orm from sqlalchemy import MetaData, Table, create_engine, orm
from ..defaults import get_default_db_uri
from .tables import metadata from .tables import metadata
def connect(uri=None, session_args={}, engine_args={}): def connect(uri=None, session_args={}, engine_args={}):
"""Connects to the requested URI. Returns a session object. """Connects to the requested URI. Returns a session object.
@ -14,14 +13,9 @@ def connect(uri=None, session_args={}, engine_args={}):
Calling this function also binds the metadata object to the created engine. Calling this function also binds the metadata object to the created engine.
""" """
# Fall back to the environment, then a URI within the package # If we didn't get a uri, fall back to the default
if not uri: if uri is None:
uri = os.environ.get('POKEDEX_DB_ENGINE', None) uri = get_default_db_uri()
if not uri:
sqlite_path = pkg_resources.resource_filename('pokedex',
'data/pokedex.sqlite')
uri = 'sqlite:///' + sqlite_path
### Do some fixery for MySQL ### Do some fixery for MySQL
if uri[0:5] == 'mysql': if uri[0:5] == 'mysql':

View file

@ -2,7 +2,6 @@
import csv import csv
import fnmatch import fnmatch
import os.path import os.path
import pkg_resources
import sys import sys
from sqlalchemy.orm.attributes import instrumentation_registry from sqlalchemy.orm.attributes import instrumentation_registry
@ -11,6 +10,7 @@ import sqlalchemy.types
from pokedex.db import metadata from pokedex.db import metadata
import pokedex.db.tables as tables import pokedex.db.tables as tables
from pokedex.defaults import get_default_csv_dir
def _get_table_names(metadata, patterns): def _get_table_names(metadata, patterns):
@ -121,8 +121,8 @@ def load(session, tables=[], directory=None, drop_tables=False, verbose=False):
print_start, print_status, print_done = _get_verbose_prints(verbose) print_start, print_status, print_done = _get_verbose_prints(verbose)
if not directory: if directory is None:
directory = pkg_resources.resource_filename('pokedex', 'data/csv') directory = get_default_csv_dir()
table_names = _get_table_names(metadata, tables) table_names = _get_table_names(metadata, tables)
table_objs = [metadata.tables[name] for name in table_names] table_objs = [metadata.tables[name] for name in table_names]
@ -276,7 +276,7 @@ def dump(session, tables=[], directory=None, verbose=False):
if not directory: if not directory:
directory = pkg_resources.resource_filename('pokedex', 'data/csv') directory = get_default_csv_dir()
table_names = _get_table_names(metadata, tables) table_names = _get_table_names(metadata, tables)
table_names.sort() table_names.sort()

45
pokedex/defaults.py Normal file
View file

@ -0,0 +1,45 @@
""" pokedex.defaults - logic for finding default paths """
import os
import pkg_resources
def get_default_db_uri_with_origin():
uri = os.environ.get('POKEDEX_DB_ENGINE', None)
origin = 'environment'
if uri is None:
sqlite_path = pkg_resources.resource_filename('pokedex',
'data/pokedex.sqlite')
uri = 'sqlite:///' + sqlite_path
origin = 'default'
return uri, origin
def get_default_index_dir_with_origin():
index_dir = os.environ.get('POKEDEX_INDEX_DIR', None)
origin = 'environment'
if index_dir is None:
index_dir = pkg_resources.resource_filename('pokedex',
'data/whoosh-index')
origin = 'default'
return index_dir, origin
def get_default_csv_dir_with_origin():
csv_dir = pkg_resources.resource_filename('pokedex', 'data/csv')
origin = 'default'
return csv_dir, origin
def get_default_db_uri():
return get_default_db_uri_with_origin()[0]
def get_default_index_dir():
return get_default_index_dir_with_origin()[0]
def get_default_csv_dir():
return get_default_csv_dir_with_origin()[0]

View file

@ -1,7 +1,6 @@
# encoding: utf8 # encoding: utf8
from collections import namedtuple from collections import namedtuple
import os, os.path import os, os.path
import pkg_resources
import random import random
import re import re
import shutil import shutil
@ -19,6 +18,7 @@ import whoosh.spelling
from pokedex.db import connect from pokedex.db import connect
import pokedex.db.tables as tables import pokedex.db.tables as tables
from pokedex.roomaji import romanize from pokedex.roomaji import romanize
from pokedex.defaults import get_default_index_dir
__all__ = ['PokedexLookup'] __all__ = ['PokedexLookup']
@ -102,13 +102,10 @@ class PokedexLookup(object):
# By the time this returns, self.index, self.speller, and self.session # By the time this returns, self.index, self.speller, and self.session
# must be set # must be set
# Defaults # If a directory was not given, use the default
if not directory: if directory is None:
directory = os.environ.get('POKEDEX_INDEX_DIR', None) directory = get_default_index_dir()
if not directory:
directory = pkg_resources.resource_filename('pokedex',
'data/whoosh-index')
self.directory = directory self.directory = directory
if session: if session: