|
|
#!/usr/bin/python3from string import ascii_lowercaseimport argparseimport osimport re
import cmd2
from candidate_cache import CandidateCachefrom dictionary import DICTSfrom word_remove_dialog import RemoveWordsActivity
LOWERCASE = set(ascii_lowercase)
# argparsersdictionary_manage_parser = argparse.ArgumentParser()commands = dictionary_manage_parser.add_mutually_exclusive_group(required=True)commands.add_argument( "-l", "--list", action="store_true", help="List available dictionaries")commands.add_argument("-s", "--switch", help="Dictionary to swap to")
letter_set_manage = argparse.ArgumentParser()letter_set_manage.add_argument("letter", nargs="+")
guessing = argparse.ArgumentParser()guessing.add_argument("pattern", help="Pattern to match")
hide_exclude = argparse.ArgumentParser()commands = hide_exclude.add_mutually_exclusive_group(required=True)commands.add_argument( "-e", "--edit", help="Change which words will be hidden from view", action="store_true",)commands.add_argument( "-c", "--commit", help="Move excluded words to be hidden words", action="store_true")commands.add_argument( "-s", "--show", help="Show which words are in the current exclude list", action="store_true",)
class MainLoop(cmd2.Cmd): """Loop for wordscape commands
"""
prompt = "<{}> $ "
def __init__(self): self.dict = "default" self.excludes = set() self.hidden = set() self.init_letters(input("Enter letters: ")) self.cache = CandidateCache() super().__init__()
def init_letters(self, letters): if not isinstance(letters, str): letters = "".join(letters) letters = letters.lower() self.letters = [l for l in letters if l in LOWERCASE] self.prompt = MainLoop.prompt.format(", ".join(self.letters))
@property def candidates(self): return self.cache.get(self.dict, self.letters)
def filter(self, regex):
return set(filter(regex.match, self.candidates))
@cmd2.with_argparser(dictionary_manage_parser) def do_dict(self, args): """list/switch dict""" if args.list: print( "\n".join( ( "{} {}".format("*" if key == self.dict else " ", key) for key in DICTS.keys() ) ) ) else: DICTS[args.switch] self.dict = args.switch
@cmd2.with_argparser(letter_set_manage) def do_change_letters(self, args): """Change the letters on the board""" self.init_letters(args.letter)
@cmd2.with_argparser(guessing) def do_find(self, args): """Find words that match a pattern""" pattern = re.compile(args.pattern + "$") matching_words = self.filter(pattern) app = RemoveWordsActivity(matching_words - self.hidden, self.excludes) if os.name == "nt": app.run(fork=False) else: app.run() was_canceled, new_exludes = app.get_results() if not was_canceled: self.excludes.update(new_exludes)
@cmd2.with_argparser(hide_exclude) def do_hide(self, args): """Hide words that are in the exclude list""" if args.show: print("\n".join(sorted(self.excludes))) return if args.commit: self.hidden.update(self.excludes) self.excludes = set() return if args.edit: app = RemoveWordsActivity(self.excludes, self.hidden) if os.name == "nt": app.run(fork=False) else: app.run() was_canceled, results = app.get_results() if not was_canceled:
result_set = set(results) self.excludes = self.hidden - result_set self.hidden = result_set
return
if __name__ == "__main__": MainLoop().cmdloop()
|