244 lines
6.5 KiB
Python
244 lines
6.5 KiB
Python
import argparse
|
|
|
|
from .random_word import RandomWord, NoWordsToChoseFrom
|
|
from .random_sentence import RandomSentence
|
|
from .cmdline import WonderwordsCommandLine
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
prog="wonderwords",
|
|
description="""Generate random words and sentences from the command line.
|
|
Here is a full list of available commands. To learn more about each
|
|
command, go to the documentation at https://wonderwords.readthedocs.io
|
|
""",
|
|
epilog="""Thanks to all contributors who made this possible.
|
|
To contribute, go to https://github.com/mrmaxguns/wonderwordsmodule
|
|
""",
|
|
)
|
|
|
|
#
|
|
# Base commands
|
|
#
|
|
parser.add_argument(
|
|
"-w",
|
|
"--word",
|
|
"--random-word",
|
|
action="store_true",
|
|
help="generate a random word",
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-f",
|
|
"--filter",
|
|
action="store_true",
|
|
help="filter a list of words matching the criteria specified",
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-l",
|
|
"--list",
|
|
action="store",
|
|
type=int,
|
|
help="return a list of words of a certain length",
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-s",
|
|
"--sentence",
|
|
action="store",
|
|
type=str,
|
|
choices=[
|
|
"bb",
|
|
"ss",
|
|
"bba",
|
|
"s",
|
|
],
|
|
help="return a sentence based on the structure chosen",
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-v",
|
|
"--version",
|
|
action="store_true",
|
|
help="Print the version number and exit"
|
|
)
|
|
|
|
#
|
|
# Settings and modifiers
|
|
#
|
|
parser.add_argument(
|
|
"-sw",
|
|
"--starts-with",
|
|
action="store",
|
|
default="",
|
|
type=str,
|
|
help="specify what string the random word(s) should start with",
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-ew",
|
|
"--ends-with",
|
|
action="store",
|
|
default="",
|
|
type=str,
|
|
help="specify what string the random word(s) should end with",
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-p",
|
|
"--parts-of-speech",
|
|
action="store",
|
|
type=str,
|
|
nargs="+",
|
|
# The plural forms will be removed in version 3
|
|
choices=["noun", "verb", "adjective", "nouns", "verbs", "adjectives"],
|
|
help=(
|
|
"specify to only include certain parts of speech (by default all"
|
|
" parts of speech are included)"
|
|
),
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-min",
|
|
"--word-min-length",
|
|
action="store",
|
|
type=int,
|
|
help="specify the minimum length of the word(s)",
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-max",
|
|
"--word-max-length",
|
|
action="store",
|
|
type=int,
|
|
help="specify the maximum length of the word(s)",
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-r",
|
|
"--regex",
|
|
"--re",
|
|
"--regular-expression",
|
|
action="store",
|
|
type=str,
|
|
help=(
|
|
"specify a python-style regular expression that every word must"
|
|
" match"
|
|
),
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-d",
|
|
"--delimiter",
|
|
default=", ",
|
|
type=str,
|
|
help=(
|
|
"Specify the delimiter to put between a list of words, default is"
|
|
" ', '"
|
|
),
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
mode = get_mode(args)
|
|
handle_mode(mode, args)
|
|
|
|
|
|
def get_mode(arguments):
|
|
if arguments.version:
|
|
MODE = "version"
|
|
elif arguments.word:
|
|
MODE = "word"
|
|
elif arguments.filter:
|
|
MODE = "filter"
|
|
elif arguments.list is not None:
|
|
MODE = "list"
|
|
elif arguments.sentence is not None:
|
|
MODE = "sentence"
|
|
else:
|
|
MODE = None
|
|
|
|
return MODE
|
|
|
|
|
|
def handle_mode(mode, arguments): # noqa: C901
|
|
command_line = WonderwordsCommandLine()
|
|
|
|
if mode == "version":
|
|
command_line.version()
|
|
quit()
|
|
|
|
if mode == "word" or mode == "filter" or mode == "list":
|
|
word_parser = RandomWord()
|
|
|
|
if mode == "sentence":
|
|
sent_parser = RandomSentence()
|
|
|
|
if mode == "word":
|
|
try:
|
|
word = word_parser.word(
|
|
starts_with=arguments.starts_with,
|
|
ends_with=arguments.ends_with,
|
|
include_categories=arguments.parts_of_speech,
|
|
word_min_length=arguments.word_min_length,
|
|
word_max_length=arguments.word_max_length,
|
|
regex=arguments.regex,
|
|
)
|
|
except NoWordsToChoseFrom:
|
|
command_line.no_word()
|
|
quit()
|
|
|
|
command_line.word(word)
|
|
elif mode == "filter":
|
|
words = word_parser.filter(
|
|
starts_with=arguments.starts_with,
|
|
ends_with=arguments.ends_with,
|
|
include_categories=arguments.parts_of_speech,
|
|
word_min_length=arguments.word_min_length,
|
|
word_max_length=arguments.word_max_length,
|
|
regex=arguments.regex,
|
|
)
|
|
|
|
command_line.words(words, delimiter=arguments.delimiter)
|
|
|
|
elif mode == "list":
|
|
try:
|
|
words = word_parser.random_words(
|
|
amount=arguments.list,
|
|
starts_with=arguments.starts_with,
|
|
ends_with=arguments.ends_with,
|
|
include_categories=arguments.parts_of_speech,
|
|
word_min_length=arguments.word_min_length,
|
|
word_max_length=arguments.word_max_length,
|
|
regex=arguments.regex,
|
|
)
|
|
except NoWordsToChoseFrom:
|
|
command_line.no_words()
|
|
words = word_parser.random_words(
|
|
amount=arguments.list,
|
|
starts_with=arguments.starts_with,
|
|
ends_with=arguments.ends_with,
|
|
include_categories=arguments.parts_of_speech,
|
|
word_min_length=arguments.word_min_length,
|
|
word_max_length=arguments.word_max_length,
|
|
return_less_if_necessary=True,
|
|
regex=arguments.regex,
|
|
)
|
|
|
|
command_line.words(words, delimiter=arguments.delimiter)
|
|
elif mode == "sentence":
|
|
if arguments.sentence == "bb":
|
|
command_line.sentence(sent_parser.bare_bone_sentence())
|
|
elif arguments.sentence == "ss":
|
|
command_line.sentence(sent_parser.simple_sentence())
|
|
elif arguments.sentence == "bba":
|
|
command_line.sentence(sent_parser.bare_bone_with_adjective())
|
|
else:
|
|
command_line.sentence(sent_parser.sentence())
|
|
else:
|
|
command_line.intro()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|