Source code for mitype.commandline

"""
Start of app.

Parses command line arguments and decides and fills text accordingly.
"""

import argparse
import os
import random
import sys

import mitype
import mitype.database
from mitype.history import show_history


[docs]def resolve_commandline_arguments(): """Parse CLI arguments and return practice text details. Returns: (str, Union[str, int]): Tuple of text content and text ID. """ opt = parse_arguments() if opt.version: display_version() sys.exit(0) elif opt.history is not None: show_history(opt.history) sys.exit(0) elif opt.file: text, text_id = load_text_from_file(opt.file) elif opt.id: text, text_id = load_from_database(opt.id) elif opt.difficulty is not None: text, text_id = load_based_on_difficulty(opt.difficulty) else: text, text_id = load_based_on_difficulty() return text, text_id
[docs]def parse_arguments(): """Parse command line arguments. Returns: str: Parsed command line arguments. """ parser = argparse.ArgumentParser( description="Process mitype command line arguments", ) parser.add_argument( "-V", "--version", default=False, action="store_true", help="Show mitype version", ) parser.add_argument( "-f", "--file", metavar="FILENAME", default=None, type=str, help="File to use text from as sample text", ) parser.add_argument( "-i", "--id", metavar="id", default=None, type=int, help="ID to retrieve text from database", ) parser.add_argument( "-d", "--difficulty", metavar="N", default=2, type=int, help="Choose difficulty within range 1-5", ) parser.add_argument( "-H", "--history", nargs="?", default=None, const=-1, type=int, help="Show mitype score history", ) return parser.parse_args()
[docs]def display_version(): """Display version.""" print(f"Mitype version {mitype.__version__}")
[docs]def load_text_from_file(file_path): """Load file contents. Args: file_path (str): Full path to text to load. Returns: (str, str): Tuple of text content followed by file path. """ if os.path.isfile(file_path): with open(file_path, encoding="utf-8") as file: text = file.read() filename = os.path.basename(file_path) return text, filename print("Cannot open file -", file_path) sys.exit(0)
[docs]def load_from_database(text_id): """Load given text from database with given id. Args: text_id (int): Row identifier of database text to load. Returns: (str, int): Tuple of text content followed by DB row identifier. """ row_count = 6000 if 1 <= text_id <= row_count: text = mitype.database.fetch_text_from_id(text_id) return text, text_id print("ID must be in range [1,6000]") sys.exit(1)
[docs]def load_based_on_difficulty(difficulty_level=random.randrange(1, 6)): """ Load text of given difficulty from database if parameter is passed. Defaults to random difficulty level when none is provided. Args: difficulty_level (int): difficulty level in a range of 1 - 5 Returns: (str, int): Tuple of text content followed by DB row identifier. """ max_level = 5 if 1 <= difficulty_level <= max_level: # Each difficulty section has 6000/5 = 1200 texts each upper_limit = difficulty_level * 1200 lower_limit = upper_limit - 1200 + 1 text_id = random.randrange(lower_limit, upper_limit + 1) text = mitype.database.fetch_text_from_id(text_id) return text, text_id print("Select a difficulty level in range [1,5]") sys.exit(1)