mharmor: add fuzzy skill search

main
Bryce Allen 11 years ago
parent d41c5380a9
commit 4824f96ce9

@ -2,7 +2,7 @@
import sys import sys
import argparse import argparse
import codecs import difflib
import _pathfix import _pathfix
@ -31,7 +31,8 @@ def parse_args(argv):
" defense", " defense",
type=str_lower) type=str_lower)
parser.add_argument("skills", nargs="+", parser.add_argument("skills", nargs="+",
help="One or more armor skills to search for") help="One or more armor skills to search for",
type=canonical_skill_name)
return parser.parse_args(argv) return parser.parse_args(argv)
@ -42,12 +43,24 @@ def find_armors(args):
skills = {} skills = {}
skill_ids = [] # preserve arg order skill_ids = [] # preserve arg order
decorations = {} decorations = {}
for skill_name in args.skills:
# TODO: handle common mispellings. Some skills like FreeElemnt skill_tree_names = []
# can't simply be title'd, but lower().title() could be a useful skill_tree_id_map = {}
# first pass. Another option would be to slirp in the full list skill_trees = db.get_skill_trees()
# and use difflib to search it. for tree in skill_trees:
sid = db.get_skill_tree_id(skill_name) skill_tree_names.append(tree.name)
skill_tree_id_map[tree.name] = tree.id
for i, skill_name in enumerate(args.skills):
sid = skill_tree_id_map.get(skill_name)
if sid is None:
matches = difflib.get_close_matches(skill_name, skill_tree_names,
1, 0.5)
if matches:
print "Fuzzy Match:", matches[0]
sid = skill_tree_id_map.get(matches[0])
skill_name = matches[0]
args.skills[i] = skill_name
if sid is None: if sid is None:
raise ValueError("Skill '%s' not found" % skill_name) raise ValueError("Skill '%s' not found" % skill_name)
skills[skill_name] = sid skills[skill_name] = sid
@ -116,6 +129,33 @@ def str_title(x):
return str(x).title() return str(x).title()
_SKILL_NAME_SPECIAL = dict(
steadyhand="SteadyHand",
freeelemnt="FreeElemnt",
punishdraw="PunishDraw",
fastcharge="FastCharge",
ko="KO",
lastingpwr="LastingPwr",
thunderatk="ThunderAtk",
thunderres="ThunderRes",
teamplayer="TeamPlayer",
teamleader="TeamLeader",
speedsetup="SpeedSetup",
critelemnt="CritElement",
critstatus="CritStatus",
lighteater="LightEater",
powereater="PowerEater"
)
def canonical_skill_name(skill_name):
skill_name_lc = skill_name.lower()
skill_name_lc_nospace = "".join(skill_name_lc.split(" "))
if skill_name_lc_nospace in _SKILL_NAME_SPECIAL:
return _SKILL_NAME_SPECIAL[skill_name_lc_nospace]
else:
return skill_name_lc.title()
if __name__ == '__main__': if __name__ == '__main__':
args = parse_args(None) args = parse_args(None)

Loading…
Cancel
Save