Factor out logic for finding the default db/index. #180
authora_magical_me <andrew@turnipmints.mooo.com>
Thu, 13 May 2010 17:33:07 +0000 (10:33 -0700)
committera_magical_me <andrew@turnipmints.mooo.com>
Fri, 14 May 2010 04:45:51 +0000 (21:45 -0700)
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
pokedex/db/__init__.py
pokedex/db/load.py
pokedex/defaults.py [new file with mode: 0644]
pokedex/lookup.py

index ad11043..393979c 100644 (file)
@@ -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)
index e8976c4..5230508 100644 (file)
@@ -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':
index d5502ea..b17438d 100644 (file)
@@ -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 (file)
index 0000000..7321291
--- /dev/null
@@ -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]
+
+
index a75136b..b00f5a7 100644 (file)
@@ -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: