xkumiyu/case-style-changer

View on GitHub
case_style_changer/cli.py

Summary

Maintainability
A
0 mins
Test Coverage
import argparse
import sys

import pkg_resources

from .case_changer import CaseChanger
from .case_guesser import CaseGuesser
from .case_style import Case
from .text_splitter import TextSplitter


def main():
    args = parse_args(sys.argv[1:])
    print(change_case_style(args.text, args.case_name))


def parse_args(args):
    parser = argparse.ArgumentParser(description="Change case style.")
    parser.add_argument(
        "case_name",
        choices=Case.available_list(),
        help="the name of the case to convert",
    )
    parser.add_argument("-t", "--text", help="the string to convert")
    parser.add_argument(
        "--version",
        action="version",
        version=f"Case Style Changer {get_version()}",
        help="show the version and exit",
    )
    return parser.parse_args(args)


def change_case_style(text, case_name):
    in_text = get_text(text)
    out_case = Case.from_string(case_name)

    guesser = CaseGuesser()
    result = []
    for in_string in in_text:
        in_case = guesser.guess(in_string)

        splitter = TextSplitter(in_case)
        words = splitter.split(in_string)

        changer = CaseChanger(out_case)
        out_string = changer.change(words)

        result.append(out_string)

    if len(result) == 1:
        out_text = result[0]
    else:
        out_text = "\n".join(result)

    return out_text


def get_text(text) -> list:
    if text is None:
        text = sys.stdin.readlines()
        text = [line.rstrip() for line in text]
    else:
        text = text.encode("utf-8").decode("unicode-escape")
        text = text.splitlines()
    return text


def get_version():
    return pkg_resources.get_distribution("case_style_changer").version