Beispiel #1
0
def set_project_data(args: Namespace) -> bool:
    assert isinstance(args, Namespace)
    assert has_cmd_of(args, CmdType.SET)

    logger.debug(msg.PROC_START.format(proc=PROC))

    if not _is_enable_setelm(args):
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"set element type in {PROC}"))
        return False

    elm = _setelm_from(args)
    is_succeeded = False

    if SetElmType.EDITOR is elm:
        is_succeeded = set_editor()
    else:
        logger.warning(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"set element type in {PROC}"))

    if not is_succeeded:
        logger.error(msg.ERR_FAIL_SUBPROCESS.format(proc=f"in {PROC}"))
        return False

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return True
Beispiel #2
0
def _reject_file(elm: ElmType, fname: str) -> bool:
    assert isinstance(elm, ElmType)
    assert isinstance(fname, str)

    updated = remove_item_order_data(orderitem_of(elm), fname)
    if not write_order_data(updated):
        logger.error(
            msg.ERR_FAIL_SUBPROCESS.format(proc=f"write order data in {PROC}"))
        return False
    return True
Beispiel #3
0
def _get_new_editorname(name: str) -> str:
    assert isinstance(name, str)

    _name = input(f"> Please Enter changing new editor name from '{name}': ")
    if not _name:
        logger.error(
            msg.ERR_FAIL_MISSING_DATA.format(
                data=f"new editor name in {PROC}"))
        return ""
    return _name
Beispiel #4
0
def write_order_data(orderdata: dict) -> bool:
    assert isinstance(orderdata, dict)
    assert str(OrderItem.BOOK) in orderdata

    if not write_file(filepath_of(ElmType.ORDER, ''),
                      yaml.safe_dump(orderdata)):
        logger.error(
            msg.ERR_FAIL_CANNOT_WRITE_DATA.format(
                data=f"order data in {PROC}"))
        return False
    return True
Beispiel #5
0
def _edit_file(elm: ElmType, fname: str) -> bool:
    assert isinstance(elm, ElmType)
    assert isinstance(fname, str)

    editor = _get_editor()
    path = filepath_of(elm, fname)
    proc = subprocess.run([editor, path])
    if proc.returncode != 0:
        logger.error(msg.ERR_FAIL_SUBPROCESS.format(proc=f"edit file in {PROC}"))

    return True
Beispiel #6
0
def check_and_create_directories() -> bool:
    _PROC = f"{PROC}: check and create dirs"
    logger.debug(msg.PROC_START.format(proc=_PROC))

    for elm, dirpath in DIRS_TABLE.items():
        if dirpath:
            if not _safe_create_directory(dirpath_of(elm)):
                logger.error(msg.ERR_FAIL_CANNOT_CREATE_DATA.format(data=f"{dirpath} in {_PROC}"))
                return False

    logger.debug(msg.PROC_SUCCESS.format(proc=_PROC))
    return True
Beispiel #7
0
def _is_valid_args(args: Namespace) -> bool:
    assert isinstance(args, Namespace)

    if not args.cmd:
        logger.error(msg.ERR_FAIL_MISSING_DATA.format(data=f"command in {PROC}"))
        return False

    if not args.elm:
        logger.error(msg.ERR_FAIL_MISSING_DATA.format(data=f"command args in {PROC}"))
        return False

    return True
Beispiel #8
0
def write_project_data(item: ProjectItem, val: str) -> bool:
    assert isinstance(item, ProjectItem)
    assert isinstance(val, str)

    data = _get_project_raw_data()

    if str(item) in data[PROJECT]:
        data[PROJECT][str(item)] = val

    if not write_file(filepath_of(ElmType.PROJECT, ''), yaml.safe_dump(data)):
        logger.error(msg.ERR_FAIL_CANNOT_WRITE_DATA.format(data=f"project data in {PROC}"))
        return False
    return True
Beispiel #9
0
def push_story_source(args: Namespace) -> bool:
    assert isinstance(args, Namespace)
    assert has_cmd_of(args, CmdType.PUSH)

    logger.debug(msg.PROC_START.format(proc=PROC))

    if not is_enable_elm_in(args, ENABLE_ELMS):
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"element type in {PROC}"))
        return False

    elm = elm_from(args)
    fname = _get_push_filename(elm, args.option)
    if not fname:
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"push filename in {PROC}"))
        return False

    parent = 'book'

    if ElmType.CHAPTER is not elm:
        parent = _get_push_parent_filename(elm)
        if not parent:
            logger.error(
                msg.ERR_FAIL_INVALID_DATA.format(
                    data=f"push parent filename in {PROC}"))
            return False

    if not _push_file(elm, fname, parent):
        logger.error(
            msg.ERR_FAIL_CANNOT_WRITE_DATA.format(data=f"push file in {PROC}"))
        return False

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return True
Beispiel #10
0
def rename_story_source(args: Namespace) -> bool:
    assert isinstance(args, Namespace)
    assert has_cmd_of(args, CmdType.RENAME)
    logger.debug(msg.PROC_START.format(proc=PROC))

    if not is_enable_elm_in(args, ENABLE_ELMS):
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"element type in {PROC}"))
        return False

    elm = elm_from(args)
    fname = _get_rename_filename(elm, args.option)
    if not fname:
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"delete filename in {PROC}"))
        return False

    newname = _get_renamed_name(elm)
    if not newname:
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"rename name in {PROC}"))
        return False

    if not _rename_file(elm, fname, newname):
        logger.error(
            msg.ERR_FAIL_CANNOT_REMOVE_DATA.format(
                data=f"rename file in {PROC}"))
        return False

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return True
Beispiel #11
0
def serialized_filenames_from_order(order_data: dict, ch_start: int,
                                    ch_end: int, ep_start: int, ep_end: int,
                                    sc_start: int, sc_end: int) -> list:
    assert isinstance(order_data, dict)
    assert isinstance(ch_start, int)
    assert isinstance(ch_end, int)
    assert isinstance(ep_start, int)
    assert isinstance(ep_end, int)
    assert isinstance(sc_start, int)
    assert isinstance(sc_end, int)

    logger.debug(msg.PROC_START.format(proc=PROC))

    if not _is_valid_order_data(order_data):
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(proc=f"order data: {PROC}"))
        return []

    tmp = []
    ch_idx, ep_idx, sc_idx = 0, 0, 0

    for ch_record in assertion.is_list(order_data[str(OrderItem.BOOK)]):
        # in Chapter
        if ch_idx >= ch_start and (ch_idx <= ch_end or ch_end < 0):
            assert isinstance(ch_record, dict)
            for key in ch_record.keys():
                tmp.append(key)
            # in Episode
            for ch_data in ch_record.values():
                assert isinstance(ch_data, list)
                for ep_record in ch_data:
                    if ep_idx >= ep_start and (ep_idx <= ep_end or ep_end < 0):
                        assert isinstance(ep_record, dict)
                        for key in ep_record.keys():
                            tmp.append(key)
                        # in Scene
                        for ep_data in ep_record.values():
                            assert isinstance(ep_data, list)
                            for sc_record in ep_data:
                                if sc_idx >= sc_start and (sc_idx <= sc_end
                                                           or sc_end < 0):
                                    assert isinstance(sc_record, str)
                                    tmp.append(sc_record)
                                sc_idx += 1
                    ep_idx += 1
        ch_idx += 1

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return tmp
Beispiel #12
0
def set_editor() -> bool:
    name = project_item_of(ProjectItem.EDITOR)

    newname = _get_new_editorname(name)
    if not newname:
        logger.error(msg.ERR_FAIL_INVALID_DATA.format(data=f"in {PROC}"))
        return False

    if not write_project_data(ProjectItem.EDITOR, newname):
        logger.error(
            msg.ERR_FAIL_CANNOT_WRITE_DATA.format(
                data=f"new editor name in {PROC}"))
        return False

    return True
Beispiel #13
0
def init_project(args: Namespace) -> bool:
    assert isinstance(args, Namespace)
    assert has_cmd_of(args, CmdType.INIT)

    logger.debug(msg.PROC_START.format(proc=PROC))

    if not check_and_create_directories():
        logger.error(msg.ERR_FAIL_SUBPROCESS.format(proc=f"check and create dirs in {PROC}"))
        return False

    if not check_and_create_default_files():
        logger.error(msg.ERR_FAIL_SUBPROCESS.format(proc=f"check and create files in {PROC}"))
        return False

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return True
Beispiel #14
0
def _rename_file(elm: ElmType, fname: str, newname: str) -> bool:
    assert isinstance(elm, ElmType)
    assert isinstance(fname, str)
    assert isinstance(newname, str)

    path = filepath_of(elm, fname)
    newpath = filepath_of(elm, newname)

    if newpath != path:
        os.rename(path, newpath)
        return True
    else:
        logger.error(
            msg.ERR_FAIL_INVALID_DATA_WITH_DATA.format(
                data=f"rename file in {PROC}"), newpath)
        return False
Beispiel #15
0
def outputs_data_from_plots_data(plots_data: PlotsData,
                                 tags: dict) -> OutputsData:
    assert isinstance(plots_data, PlotsData)
    assert isinstance(tags, dict)

    _PROC = f"{PROC}: convert outputs data"
    logger.debug(msg.PROC_START.format(proc=_PROC))

    formatted = format_plots_data(plots_data)
    if not formatted:
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"outputs data in {PROC}"))
        return None

    translated = translate_tags_text_list(formatted, tags)

    logger.debug(msg.PROC_SUCCESS.format(proc=_PROC))
    return OutputsData(translated)
Beispiel #16
0
    def run(self) -> int:
        logger.debug(msg.PROC_START.format(proc=PROC))

        args = get_commandline_arguments()

        if not args:
            logger.error(msg.ERR_FAIL_MISSING_DATA.format(data=f"commandline args in {PROC}"))
            return os.EX_NOINPUT

        if has_cmd_of(args, CmdType.INIT):
            if not init_project(args):
                logger.error(msg.ERR_FAIL_CANNOT_INITIALIZE.format(data='project'))
                return os.EX_SOFTWARE
            return os.EX_OK

        is_succeeded = False

        if has_cmd_of(args, CmdType.BUILD):
            is_succeeded = build_project(args)
        elif has_cmd_of(args, CmdType.NONE) or has_cmd_of(args, CmdType.INIT):
            is_succeeded = True
        else:
            if not _is_valid_args(args):
                return os.EX_NOINPUT

            if has_cmd_of(args, CmdType.ADD):
                is_succeeded = add_story_source(args)
            elif has_cmd_of(args, CmdType.COPY):
                is_succeeded = copy_story_source(args)
            elif has_cmd_of(args, CmdType.DELETE):
                is_succeeded = delete_story_source(args)
            elif has_cmd_of(args, CmdType.EDIT):
                is_succeeded = edit_story_source(args)
            elif has_cmd_of(args, CmdType.LIST):
                is_succeeded = show_list_of_story_sources(args)
            elif has_cmd_of(args, CmdType.PUSH):
                is_succeeded = push_story_source(args)
            elif has_cmd_of(args, CmdType.REJECT):
                is_succeeded = reject_story_source(args)
            elif has_cmd_of(args, CmdType.RENAME):
                is_succeeded = rename_story_source(args)
            elif has_cmd_of(args, CmdType.SET):
                is_succeeded = set_project_data(args)
            else:
                logger.error(msg.ERR_FAIL_INVALID_DATA.format(data=f"command type in {PROC}"))

        if not is_succeeded:
            logger.error(msg.ERR_FAILED_PROC.format(proc=PROC))
            return os.EX_SOFTWARE

        logger.debug(msg.PROC_DONE.format(proc=PROC))
        return os.EX_OK
Beispiel #17
0
def contents_data_from(story_data: StoryData, tags: dict) -> ContentsData:
    assert isinstance(story_data, StoryData)
    assert isinstance(tags, dict)

    logger.debug(msg.PROC_START.format(proc=PROC))

    contents = _contents_data_from(story_data)
    if not contents or not contents.has_data():
        logger.error(
            msg.ERR_FAIL_SUBPROCESS.format(proc=f"contents data in {PROC}"))
        return None

    translated = _translate_contents_data(contents, tags)
    if not translated or not translated.has_data():
        logger.error(
            msg.ERR_FAIL_SUBPROCESS.format(proc=f"translate data in {PROC}"))
        return None

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return translated
Beispiel #18
0
def add_story_source(args: Namespace) -> bool:
    assert isinstance(args, Namespace)
    assert has_cmd_of(args, CmdType.ADD)

    logger.debug(msg.PROC_START.format(proc=PROC))

    if not is_enable_elm_in(args, ENABLE_ELMS):
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"element type in {PROC}"))
        return False

    elm = elm_from(args)
    fname = _get_new_filename(elm, args.option)
    if not fname:
        logger.error(msg.ERR_FAIL_INVALID_DATA)
        return False

    path = filepath_of(elm, fname)
    data = get_template_data(elm)

    if not write_file(path, data):
        logger.error(
            msg.ERR_FAIL_CANNOT_CREATE_DATA.format(
                data=f"new {elm} file in {PROC}"))

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return True
Beispiel #19
0
def actions_data_from(story_data: StoryData, tags: dict) -> ActionsData:
    assert isinstance(story_data, StoryData)
    assert isinstance(tags, dict)

    logger.debug(msg.PROC_START.format(proc=PROC))

    actions = conv_base_action_data_from(story_data)
    if not actions:
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"base action data in {PROC}"))
        return None

    updated = update_actions_data_if_same(actions)
    if not updated or not updated.has_data():
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"update action data in {PROC}"))
        return None

    applied = actions_data_apply_instructions(updated, tags)
    if not applied or not isinstance(applied,
                                     ActionsData) or not applied.has_data():
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"apply action data in {PROC}"))
        return None

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return applied
Beispiel #20
0
def plots_data_from(story_data: StoryData) -> PlotsData:
    assert isinstance(story_data, StoryData)

    tmp = []

    for record in story_data.get_data():
        assert isinstance(record, StoryRecord)
        ret = _conv_plot_record(record)
        if ret:
            tmp.append(ret)

    if not tmp:
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"plots data in {PROC}"))
        return None

    reordered = _reorder_plots_data(PlotsData(tmp))
    if not reordered or not reordered.has_data():
        logger.error(
            msg.ERR_FAILED_PROC.format(proc=f"reorder data in {PROC}"))
        return None

    return reordered
Beispiel #21
0
def _conv_plot_char_counts(story_data: StoryData, tags: dict, columns: int,
                           rows: int) -> OutputsData:
    assert isinstance(story_data, StoryData)
    assert isinstance(tags, dict)
    assert isinstance(columns, int)
    assert isinstance(rows, int)

    plots = plots_data_from(story_data)
    formatted = outputs_data_from_plots_data(plots, tags)
    plot_counts = counts_data_from(BuildType.PLOT, formatted, columns, rows)
    if not plot_counts or not plot_counts.has_data():
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"plots count in {PROC}"))
        return None

    char_counts = OutputsData(format_plots_charcounts_data(plot_counts))
    if not char_counts or not char_counts.has_data():
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"plots char count in {PROC}"))
        return None

    return char_counts
Beispiel #22
0
def _conv_novel_char_counts(actions_data: ActionsData, tags: dict,
                            columns: int, rows: int) -> OutputsData:
    assert isinstance(actions_data, ActionsData)
    assert isinstance(tags, dict)
    assert isinstance(columns, int)
    assert isinstance(rows, int)

    novels = novels_data_from(actions_data, tags)
    formatted = outputs_data_from_novels_data(novels, tags)
    novel_counts = counts_data_from(BuildType.NOVEL, formatted, columns, rows)
    if not novel_counts or not novel_counts.has_data():
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"novels count in {PROC}"))
        return None

    char_counts = OutputsData(format_novels_charcounts_data(novel_counts))
    if not char_counts or not char_counts.has_data():
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"novels char count in {PROC}"))
        return None

    return char_counts
Beispiel #23
0
def story_data_from(args: Namespace) -> StoryData:
    assert isinstance(args, Namespace)

    logger.debug(msg.PROC_START.format(proc=PROC))

    order_data = read_yaml_data(read_file(filepath_of(ElmType.ORDER, '')))

    if not order_data:
        logger.error(
            msg.ERR_FAIL_MISSING_DATA.format(data=f"order data in {PROC}"))
        return None

    elmpart = assertion.is_instance(
        _get_elm_part(args.part if args.part else ""), ElmPart)

    serialized = assertion.is_list(
        serialized_filenames_from_order(
            order_data,
            elmpart.chapter[0],
            elmpart.chapter[1],
            elmpart.episode[0],
            elmpart.episode[1],
            elmpart.scene[0],
            elmpart.scene[1],
        ))

    if not serialized:
        logger.error(
            msg.ERR_FAIL_MISSING_DATA.format(
                data=f"serialized data in {PROC}"))
        return None

    story_data_base = _conv_story_data_from(serialized)
    if not story_data_base:
        logger.error(
            msg.ERR_FAIL_MISSING_DATA.format(
                data=f"story data base in {PROC}"))
        return None

    updated = update_story_data_if_same_or_next_tag(StoryData(story_data_base))

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return updated
Beispiel #24
0
def edit_story_source(args: Namespace) -> bool:
    assert isinstance(args, Namespace)
    assert has_cmd_of(args, CmdType.EDIT)

    logger.debug(msg.PROC_START.format(proc=PROC))
    if not is_enable_elm_in(args, ENABLE_ELMS):
        logger.error(msg.ERR_FAIL_INVALID_DATA.format(data=f"element type in {PROC}"))
        return False

    elm = elm_from(args)
    fname = _get_edit_filename(elm, args.option)
    if not fname:
        logger.error(msg.ERR_FAIL_INVALID_DATA.format(data=f"copy filename in {PROC}"))
        return False

    if not _edit_file(elm, fname):
        logger.error(msg.ERR_FAIL_SUBPROCESS.format(proc=f"edit {elm} file in {PROC}"))

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return True
Beispiel #25
0
def remove_item_order_data(item: OrderItem, fname: str) -> dict:
    assert isinstance(item, OrderItem)
    assert isinstance(fname, str)

    data = assertion.is_dict(_get_order_raw_data())
    _fname = ordername_of(item, fname)

    if OrderItem.CHAPTER is item:
        if not _reject_chapter_from_order(data, _fname):
            logger.error(
                msg.ERR_FAIL_CANNOT_REMOVE_DATA.format(data=f"in {PROC}"))
        return data
    elif OrderItem.EPISODE is item:
        if not _reject_episode_from_order(data, _fname):
            logger.error(
                msg.ERR_FAIL_CANNOT_REMOVE_DATA.format(data=f"in {PROC}"))
        return data
    elif OrderItem.SCENE is item:
        if not _reject_scene_from_order(data, _fname):
            logger.error(
                msg.ERR_FAIL_CANNOT_REMOVE_DATA.format(data=f"in {PROC}"))
        return data
    else:
        return data
Beispiel #26
0
def base_info_outputs_data_from(args: Namespace, story_data: StoryData,
                                actions_data: ActionsData,
                                tags: dict) -> OutputsData:
    assert isinstance(args, Namespace)
    assert isinstance(story_data, StoryData)
    assert isinstance(actions_data, ActionsData)

    logger.debug(msg.PROC_START.format(proc=PROC))

    tmp = _get_base_info_title()

    columns, rows = _get_columns_rows()

    if has_build_of(args, BuildType.OUTLINE):
        char_counts = _conv_outline_char_counts(story_data, tags, columns,
                                                rows)
        if not char_counts or not char_counts.has_data():
            logger.error(
                msg.ERR_FAIL_INVALID_DATA.format(
                    data=f"outlines char count in {PROC}"))
            return None

        tmp += char_counts

    if has_build_of(args, BuildType.PLOT):
        char_counts = _conv_plot_char_counts(story_data, tags, columns, rows)
        if not char_counts or not char_counts.has_data():
            logger.error(
                msg.ERR_FAIL_INVALID_DATA.format(
                    data=f"plots char count in {PROC}"))
            return None

        tmp += char_counts

    if has_build_of(args, BuildType.STRUCT):
        char_counts = _conv_struct_char_counts(actions_data, tags, columns,
                                               rows)
        if not char_counts or not char_counts.has_data():
            logger.error(
                msg.ERR_FAIL_INVALID_DATA.format(
                    data=f"structs char count in {PROC}"))
            return None

        tmp += char_counts

    if has_build_of(args, BuildType.SCRIPT):
        char_counts = _conv_script_char_counts(actions_data, tags, columns,
                                               rows)
        if not char_counts or not char_counts.has_data():
            logger.error(
                msg.ERR_FAIL_INVALID_DATA.format(
                    data=f"scripts char count in {PROC}"))
            return None

        tmp += char_counts

    if has_build_of(args, BuildType.NOVEL):
        char_counts = _conv_novel_char_counts(actions_data, tags, columns,
                                              rows)
        if not char_counts or not char_counts.has_data():
            logger.error(
                msg.ERR_FAIL_INVALID_DATA.format(
                    data=f"novels char count in {PROC}"))
            return None

        tmp += char_counts

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return tmp