Merge branch 'master' of git.veekun.com:pokedex
[zzz-pokedex.git] / pokedex / lookup.py
index 60c1b85..8c90950 100644 (file)
@@ -69,10 +69,11 @@ class LanguageWeighting(whoosh.scoring.Weighting):
         # Apply extra weight
         weight = weight * self.extra_weights.get(text, 1.0)
 
         # Apply extra weight
         weight = weight * self.extra_weights.get(text, 1.0)
 
-        if doc['language'] == None:
+        language = doc.get('language')
+        if language is None:
             # English (well, "default"); leave it at 1
             return weight
             # English (well, "default"); leave it at 1
             return weight
-        elif doc['language'] == u'Roomaji':
+        elif language == u'Roomaji':
             # Give Roomaji a little boost; it's most likely to be searched
             return weight * 0.9
         else:
             # Give Roomaji a little boost; it's most likely to be searched
             return weight * 0.9
         else:
@@ -103,6 +104,7 @@ class PokedexLookup(object):
             tables.Move,
             tables.Nature,
             tables.Pokemon,
             tables.Move,
             tables.Nature,
             tables.Pokemon,
+            tables.PokemonForm,
             tables.Type,
         )
     )
             tables.Type,
         )
     )
@@ -175,7 +177,13 @@ class PokedexLookup(object):
             display_name=whoosh.fields.STORED,  # non-lowercased name
         )
 
             display_name=whoosh.fields.STORED,  # non-lowercased name
         )
 
-        if not os.path.exists(self.directory):
+        if os.path.exists(self.directory):
+            # create_in() isn't totally reliable, so just nuke whatever's there
+            # manually.  Try to be careful about this...
+            for f in os.listdir(self.directory):
+                if re.match('^_?(MAIN|SPELL)_', f):
+                    os.remove(os.path.join(self.directory, f))
+        else:
             os.mkdir(self.directory)
 
         self.index = whoosh.index.create_in(self.directory, schema=schema,
             os.mkdir(self.directory)
 
         self.index = whoosh.index.create_in(self.directory, schema=schema,
@@ -205,16 +213,16 @@ class PokedexLookup(object):
 
                 # Add the basic English name to the index
                 if cls == tables.Pokemon:
 
                 # Add the basic English name to the index
                 if cls == tables.Pokemon:
-                    # Pokémon need their form name added
-                    # XXX kinda kludgy
-                    add(row.full_name, None, u'en', u'us')
-
-                    # If this is a default form, ALSO add the unadorned name,
-                    # so 'Deoxys' alone will still do the right thing
-                    if row.forme_name and not row.forme_base_pokemon_id:
-                        add(row.name, None, u'en', u'us')
-                else:
-                    add(row.name, None, u'en', u'us')
+                    # Don't re-add alternate forms of the same Pokémon; they'll
+                    # be added as Pokémon forms instead
+                    if not row.is_base_form:
+                        continue
+                elif cls == tables.PokemonForm:
+                    if row.name:
+                        add(row.pokemon_name, None, u'en', u'us')
+                    continue
+
+                add(row.name, None, u'en', u'us')
 
                 # Some things also have other languages' names
                 # XXX other language form names..?
 
                 # Some things also have other languages' names
                 # XXX other language form names..?
@@ -289,7 +297,11 @@ class PokedexLookup(object):
             name = name.strip()
 
             prefixes = prefix_chunk.split(',')
             name = name.strip()
 
             prefixes = prefix_chunk.split(',')
-            user_valid_types = [_.strip() for _ in prefixes]
+            user_valid_types = []
+            for prefix in prefixes:
+                prefix = prefix.strip()
+                if prefix:
+                    user_valid_types.append(prefix)
 
         # Merge the valid types together.  Only types that appear in BOTH lists
         # may be used.
 
         # Merge the valid types together.  Only types that appear in BOTH lists
         # may be used.
@@ -382,7 +394,7 @@ class PokedexLookup(object):
             results.append(LookupResult(object=obj,
                                         indexed_name=record['name'],
                                         name=record['display_name'],
             results.append(LookupResult(object=obj,
                                         indexed_name=record['name'],
                                         name=record['display_name'],
-                                        language=record['language'],
+                                        language=record.get('language'),
                                         iso639=record['iso639'],
                                         iso3166=record['iso3166'],
                                         exact=exact))
                                         iso639=record['iso639'],
                                         iso3166=record['iso3166'],
                                         exact=exact))
@@ -539,8 +551,10 @@ class PokedexLookup(object):
         table_names = []
         for valid_type in valid_types:
             table_name = self._parse_table_name(valid_type)
         table_names = []
         for valid_type in valid_types:
             table_name = self._parse_table_name(valid_type)
-            # Skip anything not recognized.  Could be, say, a language code
-            if table_name:
+            # Skip anything not recognized.  Could be, say, a language code.
+            # XXX The vast majority of Pokémon forms are unnamed and unindexed,
+            #     which can produce blank results.  So skip them too for now.
+            if table_name and table_name != 'pokemon_forms':
                 table_names.append(table_name)
 
         if not table_names:
                 table_names.append(table_name)
 
         if not table_names:
@@ -548,6 +562,7 @@ class PokedexLookup(object):
             # were valid, but this function is guaranteed to return
             # *something*, so it politely selects from the entire index instead
             table_names = self.indexed_tables.keys()
             # were valid, but this function is guaranteed to return
             # *something*, so it politely selects from the entire index instead
             table_names = self.indexed_tables.keys()
+            table_names.remove('pokemon_forms')
 
         # Rather than create an array of many hundred items and pick randomly
         # from it, just pick a number up to the total number of potential
 
         # Rather than create an array of many hundred items and pick randomly
         # from it, just pick a number up to the total number of potential