From ffc30bff8fa9e11d44c577109835d9a90c9f7537 Mon Sep 17 00:00:00 2001 From: a_magical_me Date: Thu, 13 May 2010 10:33:07 -0700 Subject: [PATCH] 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. --- pokedex/__init__.py | 52 +++++++++++++----------------------------- pokedex/db/__init__.py | 16 ++++--------- pokedex/db/load.py | 8 +++---- pokedex/defaults.py | 45 ++++++++++++++++++++++++++++++++++++ pokedex/lookup.py | 11 ++++----- 5 files changed, 74 insertions(+), 58 deletions(-) create mode 100644 pokedex/defaults.py diff --git a/pokedex/__init__.py b/pokedex/__init__.py index ad11043..393979c 100644 --- a/pokedex/__init__.py +++ b/pokedex/__init__.py @@ -1,13 +1,13 @@ # encoding: utf8 from optparse import OptionParser import os -import pkg_resources import sys 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: @@ -35,8 +35,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,19 +46,11 @@ def get_session(options): 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 - 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) @@ -73,24 +65,14 @@ def get_lookup(options, session=None, recreate=False): 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: 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})" \ @@ -109,13 +91,11 @@ def get_csv_directory(options): 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) diff --git a/pokedex/db/__init__.py b/pokedex/db/__init__.py index e8976c4..5230508 100644 --- a/pokedex/db/__init__.py +++ b/pokedex/db/__init__.py @@ -1,10 +1,9 @@ -import os -import pkg_resources - from sqlalchemy import MetaData, Table, create_engine, orm +from ..defaults import get_default_db_uri from .tables import metadata + def connect(uri=None, session_args={}, engine_args={}): """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. """ - # Fall back to the environment, then a URI within the package - if not uri: - uri = os.environ.get('POKEDEX_DB_ENGINE', None) - - if not uri: - sqlite_path = pkg_resources.resource_filename('pokedex', - 'data/pokedex.sqlite') - uri = 'sqlite:///' + sqlite_path + # If we didn't get a uri, fall back to the default + if uri is None: + uri = get_default_db_uri() ### Do some fixery for MySQL if uri[0:5] == 'mysql': diff --git a/pokedex/db/load.py b/pokedex/db/load.py index d5502ea..b17438d 100644 --- a/pokedex/db/load.py +++ b/pokedex/db/load.py @@ -2,7 +2,6 @@ import csv import fnmatch import os.path -import pkg_resources import sys from sqlalchemy.orm.attributes import instrumentation_registry @@ -11,6 +10,7 @@ import sqlalchemy.types from pokedex.db import metadata import pokedex.db.tables as tables +from pokedex.defaults import get_default_csv_dir 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) - if not directory: - directory = pkg_resources.resource_filename('pokedex', 'data/csv') + if directory is None: + directory = get_default_csv_dir() table_names = _get_table_names(metadata, tables) 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: - directory = pkg_resources.resource_filename('pokedex', 'data/csv') + directory = get_default_csv_dir() table_names = _get_table_names(metadata, tables) table_names.sort() diff --git a/pokedex/defaults.py b/pokedex/defaults.py new file mode 100644 index 0000000..7321291 --- /dev/null +++ b/pokedex/defaults.py @@ -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] + + diff --git a/pokedex/lookup.py b/pokedex/lookup.py index a75136b..b00f5a7 100644 --- a/pokedex/lookup.py +++ b/pokedex/lookup.py @@ -1,7 +1,6 @@ # encoding: utf8 from collections import namedtuple import os, os.path -import pkg_resources import random import re import shutil @@ -19,6 +18,7 @@ import whoosh.spelling from pokedex.db import connect import pokedex.db.tables as tables from pokedex.roomaji import romanize +from pokedex.defaults import get_default_index_dir __all__ = ['PokedexLookup'] @@ -102,13 +102,10 @@ class PokedexLookup(object): # By the time this returns, self.index, self.speller, and self.session # must be set - # Defaults - if not directory: - directory = os.environ.get('POKEDEX_INDEX_DIR', None) + # If a directory was not given, use the default + if directory is None: + directory = get_default_index_dir() - if not directory: - directory = pkg_resources.resource_filename('pokedex', - 'data/whoosh-index') self.directory = directory if session: